From 07667a4155f4e0fff19cc928d582997a743a2339 Mon Sep 17 00:00:00 2001
From: DamienGilliard <127743632+DamienGilliard@users.noreply.github.com>
Date: Fri, 29 Mar 2024 23:03:45 +0100
Subject: [PATCH 001/141] WIP-ADD: Fast Global Registration added
---
src/diffCheck.hh | 3 ++-
src/diffCheck/registration/registration.cc | 30 ++++++++++++++++++++++
src/diffCheck/registration/registration.hh | 14 ++++++++++
src/diffCheckApp.cc | 30 +++++++++++++++++-----
4 files changed, 69 insertions(+), 8 deletions(-)
create mode 100644 src/diffCheck/registration/registration.cc
create mode 100644 src/diffCheck/registration/registration.hh
diff --git a/src/diffCheck.hh b/src/diffCheck.hh
index 0c05498f..1904a0f7 100644
--- a/src/diffCheck.hh
+++ b/src/diffCheck.hh
@@ -7,4 +7,5 @@
#include "diffCheck/geometry/DFPointCloud.hh"
#include "diffCheck/geometry/DFMesh.hh"
#include "diffCheck/IOManager.hh"
-#include "diffCheck/visualizer.hh"
\ No newline at end of file
+#include "diffCheck/visualizer.hh"
+#include "diffCheck/registration/registration.hh"
\ No newline at end of file
diff --git a/src/diffCheck/registration/registration.cc b/src/diffCheck/registration/registration.cc
new file mode 100644
index 00000000..eb24e81a
--- /dev/null
+++ b/src/diffCheck/registration/registration.cc
@@ -0,0 +1,30 @@
+#include "registration.hh"
+
+namespace diffCheck::registration
+{
+ open3d::pipelines::registration::RegistrationResult Registration::o3dFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target)
+ {
+ auto sourceO3d = source->Cvt2O3DPointCloud();
+ auto targetO3d = target->Cvt2O3DPointCloud();
+
+ sourceO3d->RandomDownSample(0.1);
+ targetO3d->RandomDownSample(0.1);
+
+ std::shared_ptr sourceFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*sourceO3d,
+ open3d::geometry::KDTreeSearchParamHybrid(0.25, 30));
+ std::shared_ptr targetFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*targetO3d,
+ open3d::geometry::KDTreeSearchParamHybrid(0.25, 30));
+ std::shared_ptr option = std::make_shared();
+ option->maximum_correspondence_distance_ = 0.05;
+ option->iteration_number_ = 100;
+ option->maximum_tuple_count_ = 500;
+
+ auto result = open3d::pipelines::registration::FastGlobalRegistrationBasedOnFeatureMatching(*sourceO3d,
+ *targetO3d,
+ *sourceFPFHFeatures,
+ *targetFPFHFeatures,
+ *option);
+
+ return result;
+ }
+} // namespace diffCheck::registration
\ No newline at end of file
diff --git a/src/diffCheck/registration/registration.hh b/src/diffCheck/registration/registration.hh
new file mode 100644
index 00000000..b3b88dd0
--- /dev/null
+++ b/src/diffCheck/registration/registration.hh
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "diffCheck.hh"
+#include
+
+namespace diffCheck::registration{
+
+class Registration
+{
+ public:
+
+ open3d::pipelines::registration::RegistrationResult o3dFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target);
+};
+}
\ No newline at end of file
diff --git a/src/diffCheckApp.cc b/src/diffCheckApp.cc
index ec0023bc..722edb83 100644
--- a/src/diffCheckApp.cc
+++ b/src/diffCheckApp.cc
@@ -12,23 +12,39 @@
int main()
{
std::shared_ptr dfPointCloudPtr = std::make_shared();
+ std::shared_ptr dfPointCloudPtrAfterTrans = std::make_shared();
+ std::shared_ptr dfPointCloudPtrAfterReg = std::make_shared();
std::shared_ptr dfMeshPtr = std::make_shared();
- std::string pathCloud = R"(C:\Users\andre\Downloads\scan_data_normals.ply\scan_data_normals.ply)";
- std::string pathMesh = R"(F:\diffCheck\assets\dataset\mesh_fromRh_unfixedLength.ply)";
+ std::string pathCloud = R"(C:\Users\localuser\Downloads\00_pt.ply)";
+ std::string pathMesh = R"(C:\Users\localuser\Downloads\00_mesh.ply)";
// std::string pathMesh = R"(F:\diffCheck\temp\03_mesh.ply)";
- // create a sphere from o3d
- auto mesh = open3d::geometry::TriangleMesh::CreateSphere(1.0, 4);
dfMeshPtr->LoadFromPLY(pathMesh);
+ dfPointCloudPtr->LoadFromPLY(pathCloud);
+ // create a rigid rotation matrix
+ Eigen::Matrix4d T = Eigen::Matrix4d::Identity();
+ T.block<3, 3>(0, 0) = Eigen::AngleAxisd(3 , Eigen::Vector3d::UnitZ()).toRotationMatrix(); // Yes, Pi = 3 in this case
+ T(0, 3) = 1;
+ T(1, 3) = 4;
- dfMeshPtr->Cvt2DFMesh(mesh);
+ std::shared_ptr o3DPC = std::make_shared(dfPointCloudPtr->Cvt2O3DPointCloud()->Transform(T));
+ dfPointCloudPtrAfterTrans->Cvt2DFPointCloud(o3DPC);
+
+ std::shared_ptr reg = std::make_shared();
+ auto result = reg->o3dFastGlobalRegistrationFeatureMatching(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
+
+ // apply the transformation to the source point cloud
+ Eigen::Matrix
+ transformation = result.transformation_;
+ std::shared_ptr o3DPCReg = std::make_shared(dfPointCloudPtrAfterTrans->Cvt2O3DPointCloud()->Transform(transformation));
+ dfPointCloudPtrAfterReg->Cvt2DFPointCloud(o3DPCReg);
- // dfPointCloudPtr->LoadFromPLY(pathCloud);
std::shared_ptr vis = std::make_shared();
- // vis->AddPointCloud(dfPointCloudPtr);
+ //vis->AddPointCloud(dfPointCloudPtrAfterTrans);
+ vis->AddPointCloud(dfPointCloudPtrAfterReg);
vis->AddMesh(dfMeshPtr);
vis->Run();
From f35e0df8019bd95c22d8396c46cdaaa377c584b3 Mon Sep 17 00:00:00 2001
From: DamienGilliard <127743632+DamienGilliard@users.noreply.github.com>
Date: Fri, 29 Mar 2024 23:19:17 +0100
Subject: [PATCH 002/141] WIP: Correction for naming convention
---
src/diffCheck/registration/registration.cc | 18 +++++++++---------
src/diffCheck/registration/registration.hh | 2 +-
src/diffCheckApp.cc | 15 +++++++--------
3 files changed, 17 insertions(+), 18 deletions(-)
diff --git a/src/diffCheck/registration/registration.cc b/src/diffCheck/registration/registration.cc
index eb24e81a..b14be16e 100644
--- a/src/diffCheck/registration/registration.cc
+++ b/src/diffCheck/registration/registration.cc
@@ -2,25 +2,25 @@
namespace diffCheck::registration
{
- open3d::pipelines::registration::RegistrationResult Registration::o3dFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target)
+ open3d::pipelines::registration::RegistrationResult Registration::O3DFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target)
{
- auto sourceO3d = source->Cvt2O3DPointCloud();
- auto targetO3d = target->Cvt2O3DPointCloud();
+ auto sourceO3D = source->Cvt2O3DPointCloud();
+ auto targetO3D = target->Cvt2O3DPointCloud();
- sourceO3d->RandomDownSample(0.1);
- targetO3d->RandomDownSample(0.1);
+ sourceO3D->RandomDownSample(0.1);
+ targetO3D->RandomDownSample(0.1);
- std::shared_ptr sourceFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*sourceO3d,
+ std::shared_ptr sourceFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*sourceO3D,
open3d::geometry::KDTreeSearchParamHybrid(0.25, 30));
- std::shared_ptr targetFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*targetO3d,
+ std::shared_ptr targetFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*targetO3D,
open3d::geometry::KDTreeSearchParamHybrid(0.25, 30));
std::shared_ptr option = std::make_shared();
option->maximum_correspondence_distance_ = 0.05;
option->iteration_number_ = 100;
option->maximum_tuple_count_ = 500;
- auto result = open3d::pipelines::registration::FastGlobalRegistrationBasedOnFeatureMatching(*sourceO3d,
- *targetO3d,
+ auto result = open3d::pipelines::registration::FastGlobalRegistrationBasedOnFeatureMatching(*sourceO3D,
+ *targetO3D,
*sourceFPFHFeatures,
*targetFPFHFeatures,
*option);
diff --git a/src/diffCheck/registration/registration.hh b/src/diffCheck/registration/registration.hh
index b3b88dd0..95318e22 100644
--- a/src/diffCheck/registration/registration.hh
+++ b/src/diffCheck/registration/registration.hh
@@ -9,6 +9,6 @@ class Registration
{
public:
- open3d::pipelines::registration::RegistrationResult o3dFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target);
+ open3d::pipelines::registration::RegistrationResult O3DFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target);
};
}
\ No newline at end of file
diff --git a/src/diffCheckApp.cc b/src/diffCheckApp.cc
index 722edb83..b22b422c 100644
--- a/src/diffCheckApp.cc
+++ b/src/diffCheckApp.cc
@@ -29,21 +29,20 @@ int main()
T(0, 3) = 1;
T(1, 3) = 4;
- std::shared_ptr o3DPC = std::make_shared(dfPointCloudPtr->Cvt2O3DPointCloud()->Transform(T));
- dfPointCloudPtrAfterTrans->Cvt2DFPointCloud(o3DPC);
+ std::shared_ptr o3DPointCloudAfterTrans = std::make_shared(dfPointCloudPtr->Cvt2O3DPointCloud()->Transform(T));
+ dfPointCloudPtrAfterTrans->Cvt2DFPointCloud(o3DPointCloudAfterTrans);
std::shared_ptr reg = std::make_shared();
- auto result = reg->o3dFastGlobalRegistrationFeatureMatching(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
+ auto result = reg->O3DFastGlobalRegistrationFeatureMatching(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
// apply the transformation to the source point cloud
- Eigen::Matrix
- transformation = result.transformation_;
- std::shared_ptr o3DPCReg = std::make_shared(dfPointCloudPtrAfterTrans->Cvt2O3DPointCloud()->Transform(transformation));
- dfPointCloudPtrAfterReg->Cvt2DFPointCloud(o3DPCReg);
+ Eigen::Matrix transformation = result.transformation_;
+ std::shared_ptr o3DPointCloudPtrAfterReg = std::make_shared(dfPointCloudPtrAfterTrans->Cvt2O3DPointCloud()->Transform(transformation));
+ dfPointCloudPtrAfterReg->Cvt2DFPointCloud(o3DPointCloudPtrAfterReg);
std::shared_ptr vis = std::make_shared();
- //vis->AddPointCloud(dfPointCloudPtrAfterTrans);
+ vis->AddPointCloud(dfPointCloudPtrAfterTrans);
vis->AddPointCloud(dfPointCloudPtrAfterReg);
vis->AddMesh(dfMeshPtr);
vis->Run();
From bf1ccc6989021877c0c1791075350bb5642550e1 Mon Sep 17 00:00:00 2001
From: DamienGilliard <127743632+DamienGilliard@users.noreply.github.com>
Date: Tue, 2 Apr 2024 22:44:27 +0200
Subject: [PATCH 003/141] WIP-ADD:
FastGlobalRegistrationBasedOnFeatureCorrespondence method added to
registration class
---
src/diffCheck/registration/registration.cc | 55 ++++++++++++++++++++--
src/diffCheck/registration/registration.hh | 2 +
src/diffCheckApp.cc | 11 +++--
3 files changed, 59 insertions(+), 9 deletions(-)
diff --git a/src/diffCheck/registration/registration.cc b/src/diffCheck/registration/registration.cc
index b14be16e..693558cf 100644
--- a/src/diffCheck/registration/registration.cc
+++ b/src/diffCheck/registration/registration.cc
@@ -2,10 +2,24 @@
namespace diffCheck::registration
{
- open3d::pipelines::registration::RegistrationResult Registration::O3DFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target)
+ /*
+ Documentation on Fast Point Feature Historigrams: https://pcl.readthedocs.io/projects/tutorials/en/latest/fpfh_estimation.html
+
+ Very simply, point features are values computed on a point cloud (for example the normal of a point, the curvature, etc.).
+ point features historigrams generalize this concept by computing point features in a local neighborhood of a point, stored as higher-dimentional historigrams.
+
+ For example, for a given point, you take all the neighboring points within a given radius, and create a complete graph on those vertices.
+ then for each edge of the graph you compute features that are then stored in a historigram of the original center point from which the sphere and the graph where built.
+ https://pcl.readthedocs.io/projects/tutorials/en/latest/pfh_estimation.html#pfh-estimation proposes a simple example of such a historigram.
+
+ PCL's documentation refers to this 2009 TUM PhD thesis (but largely outside the scope of our work): https://mediatum.ub.tum.de/doc/800632/941254.pdf
+
+ Quite important for us: the resultant hyperspace is dependent on the quality of the surface normal estimations at each point (if pc noisy, historigram different).
+ */
+ open3d::pipelines::registration::RegistrationResult Registration::O3DFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target)
{
- auto sourceO3D = source->Cvt2O3DPointCloud();
- auto targetO3D = target->Cvt2O3DPointCloud();
+ std::shared_ptr sourceO3D = source->Cvt2O3DPointCloud();
+ std::shared_ptr targetO3D = target->Cvt2O3DPointCloud();
sourceO3D->RandomDownSample(0.1);
targetO3D->RandomDownSample(0.1);
@@ -27,4 +41,37 @@ namespace diffCheck::registration
return result;
}
-} // namespace diffCheck::registration
\ No newline at end of file
+ /*
+ Very little information on this registration method compared to the previous one.
+ If I understand correctly, this method finds keypoints in the FPFH hyperspaces of the source and target point clouds and then tries to match them.
+ https://pcl.readthedocs.io/projects/tutorials/en/latest/correspondence_grouping.html
+ */
+ open3d::pipelines::registration::RegistrationResult Registration::O3DFastGlobalRegistrationBasedOnCorrespondence(std::shared_ptr source, std::shared_ptr target)
+ {
+ std::shared_ptr sourceO3D = source->Cvt2O3DPointCloud();
+ std::shared_ptr targetO3D = target->Cvt2O3DPointCloud();
+
+ sourceO3D->RandomDownSample(0.1);
+ targetO3D->RandomDownSample(0.1);
+
+ std::shared_ptr option = std::make_shared();
+ option->maximum_correspondence_distance_ = 0.05;
+ option->iteration_number_ = 100;
+ option->maximum_tuple_count_ = 500;
+
+ std::shared_ptr sourceFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*sourceO3D,
+ open3d::geometry::KDTreeSearchParamHybrid(0.25, 30));
+ std::shared_ptr targetFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*targetO3D,
+ open3d::geometry::KDTreeSearchParamHybrid(0.25, 30));
+
+
+ open3d::pipelines::registration::CorrespondenceSet correspondanceset;
+ correspondanceset = open3d::pipelines::registration::CorrespondencesFromFeatures(*sourceFPFHFeatures, *targetFPFHFeatures);
+
+ auto result = open3d::pipelines::registration::FastGlobalRegistrationBasedOnCorrespondence(*sourceO3D,
+ *targetO3D,
+ correspondanceset,
+ *option);
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/src/diffCheck/registration/registration.hh b/src/diffCheck/registration/registration.hh
index 95318e22..e60ca1b8 100644
--- a/src/diffCheck/registration/registration.hh
+++ b/src/diffCheck/registration/registration.hh
@@ -10,5 +10,7 @@ class Registration
public:
open3d::pipelines::registration::RegistrationResult O3DFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target);
+
+ open3d::pipelines::registration::RegistrationResult O3DFastGlobalRegistrationBasedOnCorrespondence(std::shared_ptr source, std::shared_ptr target);
};
}
\ No newline at end of file
diff --git a/src/diffCheckApp.cc b/src/diffCheckApp.cc
index b22b422c..04d2e784 100644
--- a/src/diffCheckApp.cc
+++ b/src/diffCheckApp.cc
@@ -16,8 +16,8 @@ int main()
std::shared_ptr dfPointCloudPtrAfterReg = std::make_shared();
std::shared_ptr dfMeshPtr = std::make_shared();
- std::string pathCloud = R"(C:\Users\localuser\Downloads\00_pt.ply)";
- std::string pathMesh = R"(C:\Users\localuser\Downloads\00_mesh.ply)";
+ std::string pathCloud = R"(C:\Users\localuser\Downloads\04_pt.ply)";
+ std::string pathMesh = R"(C:\Users\localuser\Downloads\04_mesh.ply)";
// std::string pathMesh = R"(F:\diffCheck\temp\03_mesh.ply)";
dfMeshPtr->LoadFromPLY(pathMesh);
@@ -25,15 +25,16 @@ int main()
// create a rigid rotation matrix
Eigen::Matrix4d T = Eigen::Matrix4d::Identity();
- T.block<3, 3>(0, 0) = Eigen::AngleAxisd(3 , Eigen::Vector3d::UnitZ()).toRotationMatrix(); // Yes, Pi = 3 in this case
- T(0, 3) = 1;
- T(1, 3) = 4;
+ T.block<3, 3>(0, 0) = Eigen::AngleAxisd(3 , Eigen::Vector3d::UnitZ()).toRotationMatrix(); // Yes, Pi = 3 in this world
+ T(0, 3) = 10;
+ T(1, 3) = -40;
std::shared_ptr o3DPointCloudAfterTrans = std::make_shared(dfPointCloudPtr->Cvt2O3DPointCloud()->Transform(T));
dfPointCloudPtrAfterTrans->Cvt2DFPointCloud(o3DPointCloudAfterTrans);
std::shared_ptr reg = std::make_shared();
auto result = reg->O3DFastGlobalRegistrationFeatureMatching(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
+ //auto result = reg->O3DFastGlobalRegistrationBasedOnCorrespondence(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
// apply the transformation to the source point cloud
Eigen::Matrix transformation = result.transformation_;
From 7007eab0a1494e704a2d8d30418bdd93700c4fc4 Mon Sep 17 00:00:00 2001
From: DamienGilliard <127743632+DamienGilliard@users.noreply.github.com>
Date: Wed, 3 Apr 2024 21:46:23 +0200
Subject: [PATCH 004/141] ADD-WIP: Point to point error calculation method
added to Registration class
---
src/diffCheck/registration/registration.cc | 11 +++++++++++
src/diffCheck/registration/registration.hh | 2 ++
src/diffCheckApp.cc | 13 +++++++++----
3 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/src/diffCheck/registration/registration.cc b/src/diffCheck/registration/registration.cc
index 693558cf..64aab1a5 100644
--- a/src/diffCheck/registration/registration.cc
+++ b/src/diffCheck/registration/registration.cc
@@ -2,6 +2,17 @@
namespace diffCheck::registration
{
+ std::vector Registration::ComputeP2PDistance(std::shared_ptr source, std::shared_ptr target)
+ {
+ std::vector errors;
+ auto O3DSourcePointCloud = source->Cvt2O3DPointCloud();
+ auto O3DTargetPointCloud = target->Cvt2O3DPointCloud();
+
+ std::vector distances;
+
+ distances = O3DSourcePointCloud->ComputePointCloudDistance(*O3DTargetPointCloud);
+ return distances;
+ }
/*
Documentation on Fast Point Feature Historigrams: https://pcl.readthedocs.io/projects/tutorials/en/latest/fpfh_estimation.html
diff --git a/src/diffCheck/registration/registration.hh b/src/diffCheck/registration/registration.hh
index e60ca1b8..69779a72 100644
--- a/src/diffCheck/registration/registration.hh
+++ b/src/diffCheck/registration/registration.hh
@@ -12,5 +12,7 @@ class Registration
open3d::pipelines::registration::RegistrationResult O3DFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target);
open3d::pipelines::registration::RegistrationResult O3DFastGlobalRegistrationBasedOnCorrespondence(std::shared_ptr source, std::shared_ptr target);
+
+ std::vector ComputeP2PDistance(std::shared_ptr source, std::shared_ptr target);
};
}
\ No newline at end of file
diff --git a/src/diffCheckApp.cc b/src/diffCheckApp.cc
index 04d2e784..7273426c 100644
--- a/src/diffCheckApp.cc
+++ b/src/diffCheckApp.cc
@@ -14,6 +14,7 @@ int main()
std::shared_ptr dfPointCloudPtr = std::make_shared();
std::shared_ptr dfPointCloudPtrAfterTrans = std::make_shared();
std::shared_ptr dfPointCloudPtrAfterReg = std::make_shared();
+ std::shared_ptr dfPointCloudPtrGroundTruth = std::make_shared();
std::shared_ptr dfMeshPtr = std::make_shared();
std::string pathCloud = R"(C:\Users\localuser\Downloads\04_pt.ply)";
@@ -23,6 +24,9 @@ int main()
dfMeshPtr->LoadFromPLY(pathMesh);
dfPointCloudPtr->LoadFromPLY(pathCloud);
+ // populate the mesh with points and store it in dfPointCloudPtrGroundTruth
+ dfPointCloudPtrGroundTruth->Cvt2DFPointCloud(dfMeshPtr->Cvt2O3DTriangleMesh()->SamplePointsUniformly(100000));
+
// create a rigid rotation matrix
Eigen::Matrix4d T = Eigen::Matrix4d::Identity();
T.block<3, 3>(0, 0) = Eigen::AngleAxisd(3 , Eigen::Vector3d::UnitZ()).toRotationMatrix(); // Yes, Pi = 3 in this world
@@ -33,17 +37,18 @@ int main()
dfPointCloudPtrAfterTrans->Cvt2DFPointCloud(o3DPointCloudAfterTrans);
std::shared_ptr reg = std::make_shared();
- auto result = reg->O3DFastGlobalRegistrationFeatureMatching(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
- //auto result = reg->O3DFastGlobalRegistrationBasedOnCorrespondence(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
+ //auto result = reg->O3DFastGlobalRegistrationFeatureMatching(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
+ auto result = reg->O3DFastGlobalRegistrationBasedOnCorrespondence(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
// apply the transformation to the source point cloud
Eigen::Matrix transformation = result.transformation_;
std::shared_ptr o3DPointCloudPtrAfterReg = std::make_shared(dfPointCloudPtrAfterTrans->Cvt2O3DPointCloud()->Transform(transformation));
dfPointCloudPtrAfterReg->Cvt2DFPointCloud(o3DPointCloudPtrAfterReg);
-
+ std::vector errors = reg->ComputeP2PDistance(dfPointCloudPtrAfterReg, dfPointCloudPtrGroundTruth);
+ std::cout << "Mean distance: " << std::accumulate(errors.begin(), errors.end(), 0.0) / errors.size() << std::endl;
std::shared_ptr vis = std::make_shared();
- vis->AddPointCloud(dfPointCloudPtrAfterTrans);
+ vis->AddPointCloud(dfPointCloudPtrGroundTruth);
vis->AddPointCloud(dfPointCloudPtrAfterReg);
vis->AddMesh(dfMeshPtr);
vis->Run();
From d9f7014be4f0be8780f7496a10d72537e551c9eb Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Thu, 4 Apr 2024 16:01:13 +0200
Subject: [PATCH 005/141] FIRST commit
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index dbae83cc..f759f948 100644
--- a/README.md
+++ b/README.md
@@ -3,6 +3,7 @@
+
Temporary repository for diffCheck
## Roadmap
From 492c72d95ef79b3c95c3406df69839746891a8a8 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Thu, 4 Apr 2024 16:03:43 +0200
Subject: [PATCH 006/141] ADD: add dataflow diag
---
assets/diagram/rhdfexporter.drawio | 158 +++++++++++++++++++++++++++++
1 file changed, 158 insertions(+)
create mode 100644 assets/diagram/rhdfexporter.drawio
diff --git a/assets/diagram/rhdfexporter.drawio b/assets/diagram/rhdfexporter.drawio
new file mode 100644
index 00000000..a986f367
--- /dev/null
+++ b/assets/diagram/rhdfexporter.drawio
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 1a661c61d029e23ba72e03cf6744c3db588c51cd Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sat, 6 Apr 2024 23:23:04 +0200
Subject: [PATCH 007/141] ADD: gitignore for python
---
.gitignore | 166 +++++++++++++++++-
CMakeLists.txt | 1 -
deps/eigen | 2 +-
diffCheckEvery.log | 4 +-
src/gh/README.md | 1 +
src/gh/diffCheck/__init__.py | 0
.../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 132 bytes
.../__pycache__/geometries.cpython-38.pyc | Bin 0 -> 1420 bytes
src/gh/diffCheck/geometries.py | 62 +++++++
src/gh/diffCheck_app.py | 20 +++
10 files changed, 251 insertions(+), 5 deletions(-)
create mode 100644 src/gh/README.md
create mode 100644 src/gh/diffCheck/__init__.py
create mode 100644 src/gh/diffCheck/__pycache__/__init__.cpython-38.pyc
create mode 100644 src/gh/diffCheck/__pycache__/geometries.cpython-38.pyc
create mode 100644 src/gh/diffCheck/geometries.py
create mode 100644 src/gh/diffCheck_app.py
diff --git a/.gitignore b/.gitignore
index 8b07029b..81422a74 100644
--- a/.gitignore
+++ b/.gitignore
@@ -77,4 +77,168 @@ _deps
temp/
# temporary logging file
-*.log
\ No newline at end of file
+*.log
+
+#######################################
+## Python
+#######################################
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+# in version control.
+# https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3033fdb5..8969f917 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,7 +16,6 @@ if(NOT GIT_SUBMOD_RESULT EQUAL "0")
message(FATAL_ERROR "git submodule update --init --recursive failed with ${GIT_SUBMOD_RESULT}, please checkout submodules")
endif()
-
#--------------------------------------------------------------------------
# pre-compiled definitions
#--------------------------------------------------------------------------
diff --git a/deps/eigen b/deps/eigen
index e63d9f6c..b2c9ba2b 160000
--- a/deps/eigen
+++ b/deps/eigen
@@ -1 +1 @@
-Subproject commit e63d9f6ccb7f6f29f31241b87c542f3f0ab3112b
+Subproject commit b2c9ba2beef4b5fd61513d73911c678e93c8dd9d
diff --git a/diffCheckEvery.log b/diffCheckEvery.log
index 20fc75ab..65db11f5 100644
--- a/diffCheckEvery.log
+++ b/diffCheckEvery.log
@@ -2,5 +2,5 @@ arguments: loguru
Current dir: F:\diffCheck
File verbosity level: 9
date time ( uptime ) [ thread name/id ] file:line v|
-2024-03-30 12:53:29.971 ( 0.001s) [main thread ] loguru.cpp:841 INFO| Logging to 'diffCheckEvery.log', mode: 'w', verbosity: 9
-2024-03-30 12:53:29.971 ( 0.001s) [main thread ] loguru.cpp:841 INFO| Logging to 'diffCheckErrors.log', mode: 'w', verbosity: -2
+2024-03-30 14:03:39.030 ( 0.001s) [main thread ] loguru.cpp:841 INFO| Logging to 'diffCheckEvery.log', mode: 'w', verbosity: 9
+2024-03-30 14:03:39.031 ( 0.002s) [main thread ] loguru.cpp:841 INFO| Logging to 'diffCheckErrors.log', mode: 'w', verbosity: -2
diff --git a/src/gh/README.md b/src/gh/README.md
new file mode 100644
index 00000000..e94c5323
--- /dev/null
+++ b/src/gh/README.md
@@ -0,0 +1 @@
+This directory contains all the code for the grasshopper plugin of DiffCheck written in CPython.
\ No newline at end of file
diff --git a/src/gh/diffCheck/__init__.py b/src/gh/diffCheck/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/gh/diffCheck/__pycache__/__init__.cpython-38.pyc b/src/gh/diffCheck/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b13b9668f30d902921d6542f97d0f3a2062467b5
GIT binary patch
literal 132
zcmWIL<>g`kf|eb8X(0MBh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2BV%_=4(GcCOK%e~5VpOKY|@0Lr96rNMH~<-q@F4csHzG@a6#cvdRbMnwreNZu-RSg%^|BE
zkeZ*tp*{95?UfThfD0#PoF+{l!jV6Z$79du@s~YpwHgH4mmh1rKa7xHI9YBsO!lDb
z4*-G)nvf9=zn)HM#YEuHK>%xOX
z^~!!P!%_LN(Si1L5bKV~)=@H7Qp>c^ov?EZAts=*({LoK`XJPNn8j%kQOG@SXhVI-
zK6L#G;DiiG?g@HAINCJd5DaWuuruqN3~jI-L4bzUEt`iao-I1a=cDf`tg3PVDtkPR
zMc^QAR~BTgEFOysTG?7Ay$hmNAnNby-rFM)_j>yS8GSp_Dmv;9mK=SVjbx!>skib;
z)#5zQbiv~^E;zpj`?U)|XcK$7IN#Ncv*8%+=mxEAQ!ajQ{};2)e(@^44Pn7
zEEe}+)L0_I%9=?Mi>}|OJkIg*oL3FbN0}HWXg4|kJ`R)1l^W+Fi@
zVG(Dk2CsdbWr=EGA}?22E>$s6t1w-nVF)1?h1x;l8fOh=TORe8=P+tkB5+=77`_Kx
z?*iPE+R%~iCXqEGI1k1v!PTWJ+@Dm`gg3Q=hN#0^!)@PbEl0=6q}=|W?9vX%-o$mX
zp3$J5iO@kkY9o+a&$7_pQ(!vNUmwPW{!okXM*$wJTejz#n-lVx+Jt>G?cMQ)roPXy
z5U5U6OZjlV_qtx-ziT7S$hGdWO!7GG2lnR}G=8qTzNY){qN!~
OBhMzD%ouIA8T|*74J5e$
literal 0
HcmV?d00001
diff --git a/src/gh/diffCheck/geometries.py b/src/gh/diffCheck/geometries.py
new file mode 100644
index 00000000..0705e473
--- /dev/null
+++ b/src/gh/diffCheck/geometries.py
@@ -0,0 +1,62 @@
+#! python3
+from dataclasses import dataclass
+import typing
+import uuid
+
+@dataclass
+class Face:
+ """
+ This class represents a face
+ """
+ name : str
+ joint_id : int
+ def __post_init__(self):
+ self.name = self.name or "Unnamed Face"
+ self.joint_id = self.joint_id or None
+ self._is_joint = False
+ self._id = uuid.uuid4().int
+
+ @property
+ def is_joint(self):
+ if self.joint_id:
+ return True
+ return False
+
+ @property
+ def id(self):
+ return self._id
+
+@dataclass
+class Beam:
+ """
+ This class represents a beam, in diffCheck, a beam is a collection of faces
+ """
+ name : str
+ faces : typing.List[Face]
+
+ def __post_init__(self):
+ self.name = self.name or "Unnamed Beam"
+ self.faces = self.faces or []
+ self._has_joint = False
+ self._id = uuid.uuid4().int
+
+ @property
+ def id(self):
+ return self._id
+
+@dataclass
+class Assembly:
+ """
+ This class represents an assembly of beams
+ """
+ beams : typing.List[Beam]
+ name : str
+ def __post_init__(self):
+ self.beams = self.beams or []
+ self.name = self.name or "Unnamed Assembly"
+
+ def add_beam(self, beam: Beam):
+ self.beams.append(beam)
+
+ def remove_beam(self, beam_id: int):
+ self.beams = [beam for beam in self.beams if beam.id != beam_id]
\ No newline at end of file
diff --git a/src/gh/diffCheck_app.py b/src/gh/diffCheck_app.py
new file mode 100644
index 00000000..89b8c550
--- /dev/null
+++ b/src/gh/diffCheck_app.py
@@ -0,0 +1,20 @@
+#! python3
+"""
+ This module is used as entry point to test the package in Rh/Gh
+"""
+
+import os
+from diffCheck.geometries import Beam, Assembly
+
+def main():
+ beam1 = Beam("Beam1", True)
+ beam2 = Beam("Beam2", False)
+ print(beam1.id)
+ print(beam2.id)
+
+ assembly = Assembly([beam1, beam2], "Assembly1")
+ print(assembly.beams)
+ print(assembly.name)
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
From 0fe9c50890535889ad61d4c07dba497d9ded86f5 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sat, 6 Apr 2024 23:33:22 +0200
Subject: [PATCH 008/141] WIP-ADD: basic draft for python structure in gh
---
.../__pycache__/geometries.cpython-38.pyc | Bin 1420 -> 3939 bytes
src/gh/diffCheck/df_geometries.py | 121 +++++
src/gh/diffCheck/diffCheck_app.py | 48 ++
src/gh/diffCheck/geometries.py | 62 ---
src/gh/diffCheck_app.py | 20 -
src/gh/tester.ghx | 473 ++++++++++++++++++
6 files changed, 642 insertions(+), 82 deletions(-)
create mode 100644 src/gh/diffCheck/df_geometries.py
create mode 100644 src/gh/diffCheck/diffCheck_app.py
delete mode 100644 src/gh/diffCheck/geometries.py
delete mode 100644 src/gh/diffCheck_app.py
create mode 100644 src/gh/tester.ghx
diff --git a/src/gh/diffCheck/__pycache__/geometries.cpython-38.pyc b/src/gh/diffCheck/__pycache__/geometries.cpython-38.pyc
index 370f504e2eb3a9b1a3ca8fda7413fd3246e4bbb2..1c31d0609c6dafcc633119e9f7ec5a7a02faa410 100644
GIT binary patch
literal 3939
zcmb_fTa(;I74DWa8jWUVcWq3-5QuOBWRk^%vWrS>ZHyC#P({H&;S2U)myoA>b~T<`
zT3VA;nU~mAP`vRRsB(Do58%(}m8bj#p7_4jXm;(Lb$EzWeRTSI&gpZ$)2*A`ZYc2l
z`)_AP|7r>GA6AY(9x7K+vV9OGl$?mE97svtnK%Q-e%*nq1g@=ep>%zkoE+lVwXKc`}?NS=Jx2>G9bEDE(lIzT_RLW0Ed05I~
zD4}Bgkatk7p=57@JQ8EE2$XyzV)Alv&hn^_oke7MY%?@<`g<5|pJ%S2YfOX02YDt-
zFVmCJGhyh_|GquixvSFA=-R#>KDe8i;oZIcV-0(HKGnHNb#`%aSa#!hG0*Ziouzpk
zZ(@GNHHGZpEzVWjbMd)BCrsi5YtpM=sPtHTh8Uqi__{RaGx1L!W_bM~td`t~ZogM}
z+tD3M2k)6C=9++nMpUE?t_e5Y3IzWS->ZW*jH8**s73bUw=60
zW5!$jRFU^AZRGyb=I3G@prvJ@fEeoBoKYJU(dI9>%f%b-S9VMfvOL;P9_lE`qlr#X
zyR@>T7n-kQaOqC;%)CM_yp>E2^v{i%8}kh`3|euT#n!UYJ2*&H*&w}Ky0Eo$VePsY
zwNVpcdbR;V>}((|I!;IWvN%g6zXUiq(G=w!EF_*`r!DmvQ{5kODu
zL_ODk}K)?$7)=rxNvdE(TzGl{fV|7HY{(-S@
zuh*)S_9k>R&)l+g14Amve+zZShHdAGYqRi?l^J_K!>B9;w-iK%0SM=
z0P@y$W!?)2rxEMGV2`a|Qo$PGOQpUH;YVmQ5!e3SX#yDkzeZWX%?e0Wzt>%dH}g6d
zBHqj!B;O|?5RMRLe!%LfxcVV_-$k)oUgIig6IF(Nrz7eHdS67;xS@TVw76*EUKrqO
zPuv#}<*VQyQt@Ky4cfY++NklY^#)zF0fcRq!TVXJr}rm^#pRcwY!>0}YR54w@580b
zt6{_PHY`toh@P_`Vm2X&5c>Se#TJi+7&l$$;Pi{F`UtF*={aT_bE=bI%{|KQ`5lbN
zczYB$pNd!NxnEV_hV_C~@G?4HJf5tM>(t}%bdTySgZE6m7L=<37(WFbw{B=h&27iq??3DGp-vgo%U{GuD%^OU;07}mAL9B(moBr}bN=Tt^bG-Hr!ooNJNsuCGZudp
z4{+~)B>(PwjH`fE8Yl1t4DC6kbMc+ZmUmFE46?R_yUcpS`E+qbaZv)@$CibncyqPA
zMo;GtwKe(T?qohpCfOA*^+ZUa&+0Av$x4EiWyQ3QEit4VyCL{{SSO?3+gO_`jxq#+
zU1g2e$*oRf^J7+Rj=oH8-9h{|I(~<;N*KI|1zzB8xQ2bb02k`|$5Lm8npVllo&xk*
jm7%N>oUu+!8SGa77gspn9{M=!CDYQ@7RqZV=N2c$kZVe}i}5+oBeALca4R@5j9POunzY@@rewsz+cveBRvt!S-v*
z^!EORTb5vtNMP^3zDULOXGUCG07ANkdmS5b0`uGl~1-bLy*o
zrtYo6&^(L#iFTjGYGN&@$J|vf=zNn+NJLBa&UjCDIoPK9;LKgV6IhZ%7t#dLd^k)+
zXrf-xMw*q{h*EJtH7}Ch_5qQ;`a-YQYY&uk1w5A24g~YN$%{x9HC9~mip+gwHLv4NbEl+oVB?E5e1e4I*L{n)u+nUJwz5T
ziP_qU^E}A}Eb#}BODKPla$+H(F5p=M=OHgTZr&)0q~Gn0+P}P=z?Th7Z=xJSLBQH7
zM|qm
+
+
+
+
+
+ -
+ 0
+ 2
+ 2
+
+
+
+
+
+ -
+ 1
+ 0
+ 8
+
+
+
+
+
+ - 103ba181-3a3b-4b4e-b795-e493222bd4e6
+ - Shaded
+ - 1
+ -
+ 100;102;0;255
+
+ -
+ 100;0;150;0
+
+
+
+
+
+ - 638480369678877464
+
+ - false
+ - tester.ghx
+
+
+
+
+ - 0
+
+
+
+
+ -
+ -25
+ -200
+
+ - 2.0761244
+
+
+
+
+ - 0
+
+
+
+
+
+
+ - 0
+
+
+
+
+ - F:\diffCheck\src\gh\diffCheck_app.py
+
+
+
+
+ - 2
+
+
+
+
+ - Robert McNeel & Associates
+ - 00000000-0000-0000-0000-000000000000
+ - Grasshopper
+ - 8.4.24044.15001
+
+
+
+
+ - RhinoCodePluginGH, Version=8.4.24044.15001, Culture=neutral, PublicKeyToken=552281e97c755530
+ - 8.4.24044.15001
+
+ - 066d0a87-236f-4eae-a0f4-9e42f5327962
+ - RhinoCodePluginGH
+
+
+
+
+
+
+
+ - 4
+
+
+
+
+ - c9b2d725-6f87-4b07-af90-bd9aefef68eb
+ - 066d0a87-236f-4eae-a0f4-9e42f5327962
+ - script-sync cpython
+
+
+
+
+
+ - true
+ - 2
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABhmlDQ1BJQ0MgcHJvZmlsZQAAKM+VkTtIw1AUhv+mSkUqDhZ84JChCoIFURFHiWIRLJS2QqsOJjd9QZOGJMXFUXAtOPhYrDq4OOvq4CoIgg8QZwcnRRcp8dyk0CJU8MDlfvz3/j/nngsItRLTrI4JQNNtMxGVxHRmVQy8wodB9EPAmMwsI5ZcTKFtfd3Tbaq7CM/C/6pHzVoM8InEc8wwbeIN4plN2+C8TxxiBVklPiceN6lB4keuKx6/cc67LPDMkJlKzBOHiMV8CystzAqmRjxNHFY1nfKFtMcq5y3OWqnCGn3yFwaz+kqS67SGEcUSYohDhIIKiijBRoR2nRQLCTqX2viHXH+cXAq5imDkWEAZGmTXD/4Hv2dr5aYmvaSgBHS+OM7HCBDYBepVx/k+dpz6CeB/Bq70pr9cA2Y/Sa82tfAR0LsNXFw3NWUPuNwBBp4M2ZRdyU9LyOWA9zP6pgzQdwt0r3lza5zj9AFI0ayWb4CDQ2A0T9nrbd7d1Tq3P++484P0A3o2cqrMnZbPAAAACXBIWXMAAAsOAAALDgFAvuFBAAAAB3RJTUUH6AEZFwkM569AfQAABNpJREFUSEu9kntMU3cYhguoOOZ1ujmFXqQtBcEpIwoTxOGQolLwUp24OFS0sEqh0oIV0CIg1FLKsbTlNooFKhRF8TajziW6zYFxcckW9bhlm9uiLk6nAyuWy7tTc0iI4w9l2Z7k++/7nveX9xzGfw+LWMhgV4hd48Y2iN1ZBvEoFiH2ZOrFXkydeJzPvsn05ghhmxIZnCq4xo1TCXe2GaPZJniyKvAqi8AEps5Eb/4LOJVfDQZ4PAswYizLgHHMckxi6vqmeJfMpjdHCNscQgUMDAaMoQJeoQLGUwGTfXR43bvkM3pz5LhxzHXuVMAoqp4x7Ap4sfZT9ejxmk8ppnlrEDE142bCxA3k2vHryKSZYnJrcPxS+vTFcGMR09w55keuAFf/Xs/612OKjxZvepdAMF2NFROT8IHv+5CEroZskeiaJC7Cgz5/MTzYRsVg/64PPJFZhqlUwHTvYrBmFGBZsAybw9ZCGr0SyhXLoVobk0Gfvhju/CJPD2GnY7SwE57CDngJL2FCzBeYsuQC/OM/Rdiq45AsWQP5ygSoEpdi94fRDyslc6SWNH9pvVwgtWb7SQ/k8CfRumHY2ithpACD45YyAA9JP3ykPQiQdSNh4zlsS1gFZaIIuZuEKEx5DwZZKKyZAWhUCdC0i5o9fIK2Pcfm7gmMlIF7zwd4b3MiMMOBhdvvQLJ6C+TrV0CVvBz5qTEoTo+CThmBAzlBaNotgK3AD80av97mUt4s2joESX/ZULlr3pD2I1Deg/nKLiQmN0O2Xoys5HjsksaiUB6Nfcp3UZ67ANX5IThYRMn38dFSxoed4J+lrTRbngio1zuHyid9NABeei+CFQ5EZ91FcsZZyBTtUGUfRGFuLXRqAuaCEtQX51GvlqCllBLr+Wg18HDIzIO9xnc5baeQ9J0YKncNU9aPOYoeLNzZhXWZV5CiOI3MHW3Iy21AsboSRIEe1ZpCNGh3okUXjhaCkhspeRUPh2u5aLNwb1isM0a7Xi98Xj49rR8CuRPvqBxYtuNXbFKcR5rqBLLz7MjPt0BbZIRRo0WdLh82fRLs+/k4ZKLk1ZT4Yy6O1FPT6IujzTMzqT/HGUv1nzp0eOnO1JAsR+rinPuZiYrOPonqLOS57chRH8TevbUo01D16IrRSOSgwxCJK6ZgXK2ZjW/rZuGa1Q+kjYfvW7i40ep7ne5oeNbIL6mTsi9gW95pKNVtUBc1QKOpwn5dGarLC3GxYiN+Mkfgds183LcEo8sahB6bP3rtfAwc5qK3nbORVv0TUdpF1jplx+OtueeRvvskVIV2FJTUQ1tqgpHQotm4EzeMi3GrKhx36+bhgXUuum2B6LEL0NfGQ/8x38u0anhWbe/Yu0H1OZm66wyZuecomVfSRBZpa0h9OUGaK4rJL43rcbN6EX6xhOF3awge2mbjcWsAnrb5oe84F49PcUJp1ctz2SCM+64qGj/URuK3A6G4Z5uLR/YgONoEcB7jwXlqZiO9+vKcIaLHfG2KJa/VLMaPlnDcts3DHy1z8NfhQDxp96Pk3O77Z9gz6PWXp7MiTnG1MhbX66Lwc8MC3GkOwYNDb6GrPQA9J/lwnPbNo1dHRqdJFPVNbYyItEaKbjWFie62vi3680iQqPu4v+jpJzzRg3PssfTq/wGD8Tedsdp6457pjwAAAABJRU5ErkJggg==
+
+ - dcf18e47-99f2-42d5-9ca4-7e6aee82d9b6
+ - true
+ - true
+ - true
+ - script-sync cpython
+ - scsy-cpy
+
+ - false
+ - false
+ - false
+
+
+
+
+ -
+ 181
+ 133
+ 105
+ 44
+
+ -
+ 228
+ 155
+
+ - true
+
+
+
+
+ - 2
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 2
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+
+
+
+
+ - true
+ - Connect a button to open a file dialog to select a cpython file to run.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC
+
+ - 083c2fe3-a45a-43c1-8f85-ce20a4a69a99
+ - btn
+ - btn
+ - true
+ - 0
+ - true
+ - 5f8bfbf4-70d5-46ba-90fa-f3804e9a9032
+ - 1
+ - Connect a button to open a file dialog to select a cpython file to run.
+ - d60527f5-b5af-4ef6-8970-5f96fe412559
+
+
+
+
+ -
+ 183
+ 135
+ 30
+ 20
+
+ -
+ 199.5
+ 145
+
+ - true
+
+
+
+
+
+
+ - true
+ - Converts to collection of Breps (Boundary REPresentations)
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPkSURBVEhL1VVbKOV7FN7ITnK/RYNcNrkrx11SbokHuWQyb0ryRN5ocuLBKadELsktHuTywKBcXgiRUiYvJOVSknNw5LK3OWbO9J31/famOWfPGPN0OqtW+7/r9/vWWt/61vpp/ivTWVhY3MsvfsBfi7/MbGxstvr6+rC+vo7V1VUsLi5ifn4eExMTGBoaQnNzM8rLy5GXl4eUlBQEBQVBEjqTq1ojwjNmZWWVLxc/DQ4OIiEhQXl8fDxiY2MRExOD6OhoREREICQkRAH7+/sjLCwMdnZ2ektLy7cmmG+a1tHR8Y/R0VEUFRWp7OjJyclISkrC8PAwHh4ecHNzg4WFBeTm5iIwMFB5QEAAJIBBMF4Zob5i1tbWv5SVlf3V0NCA1NRUpKWlPTmpOjw8RHd3N3p7e7G0tITb21v138/PT1UiyT0IVe9McGam8/T0/LO9vR0ZGRkKND09HZmZmVhbW4Ner0dnZycmJydRUVGBqqoq1NfX4+joSPWHQby9vdkLVvGTEfILE+5XSUtpaamihQEIzkYT/PLyEgy+ubmJ2tpa1eiBgQG0trbi4OAAXV1d8PLygrOz82cJ8t4E+2R5bm5uH0pKSlRTyTkDPGZO8OPjY4yPj2Nubg4rKysKfHp6Wp3hN+li5b6+vhAV6gXzjRFaGivZ/5aYmAg61cKGkvMvwXd2dlT2LS0tODs7U98E39vbw/7+vurJ7OwshGZFl1RxJdh2Gun8z66urh8ITglSiiMjIzAYDGbgBBkbG0NHRwfOz89xcXGhztB6enpwfX0NFxcXpSp3d3cO6q8aiXQdGhqqtE1nEIJfXV2Zgc/MzIASZrMbGxsVVScnJ9jY2FDKYsXSA3h4eCAqKorTfc0ALSIvQ2RkJB4D3d/fq4tfA+/v70dbWxuamppQWVmJ6upq9X93d1cFcXJyUjjSC2MF5Il8UcecTjozOz09fRa8rq5OSZWS3draUvwLLUpJnHzpq7EHJnuj1Wr1wcHBavwLCgpwd3eH5eXlF4OTFmZPFco3Z+FJRcqkivc8xJFnk3iJFfwIuE6nQ1xc3GeBM5sDWjx3CSVGp6qoEMqVqnkOnI2lerKysuDg4EDuzSeZJlW8k4MPrIBjz3K5BqioqakpNcE1NTXY3t7+R+YCquQtyvkoMN/cRbRXrIK98PHxUUNDz87OVhNM+bI3XBlsqKgP9vb26gzfBunj89vUZG+lZEN4eDhkfTy5DKOigXQ8Zi1vAGxtbdVSlKoJ/t33gKYVqn7nI/K4kwhAfnNyclSm+fn5KCwsRHFxMbi/uBTlzsteNJPxff33m/s9f/mb/D8yjeZvU880QlAx2/0AAAAASUVORK5CYII=
+
+ - ae8c9c0d-8d6a-4a8c-812a-110846a2031c
+ - brep
+ - brep
+ - true
+ - 0
+ - true
+ - 0f309845-29e6-43ae-b255-cdb5c2d13da9
+ - 1
+
+ - 2ceb0405-fdfe-403d-a4d6-8786da45fb9d
+
+
+
+
+ -
+ 183
+ 155
+ 30
+ 20
+
+ -
+ 199.5
+ 165
+
+ - true
+
+
+
+
+
+
+ - false
+ - The redirected standard output of the component scriptsync.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 55cc2102-ec2b-4f6f-ba16-74e8aed9df42
+ - stdout
+ - stdout
+ - false
+ - 0
+ - true
+ - 0
+ - The redirected standard output of the component scriptsync.
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 243
+ 135
+ 41
+ 20
+
+ -
+ 263.5
+ 145
+
+ - true
+
+
+
+
+
+
+ - false
+ - Generic example output of the component
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - f5d7e77d-04d1-4395-b52b-651450a4b329
+ - a
+ - a
+ - false
+ - 0
+ - true
+ - 0
+ - Generic example output of the component
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 243
+ 155
+ 41
+ 20
+
+ -
+ 263.5
+ 165
+
+ - true
+
+
+
+
+
+
+
+
+ - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgoKICAgICAgICAgICAgICAgICMgcGFyc2UgdGhlIGNvZGUKICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCgogICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgcXVldWUgYW5kIGV2ZW50CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYucXVldWVfbXNnX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLmdldCgpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnRhc2tfZG9uZSgpCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgdGhlIGNvZGUKICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRvdXQob3V0cHV0KToKICAgICAgICAgICAgICAgICAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKICAgICAgICAgICAgICAgIGxvY2Fsc1sic3Rkb3V0Il0gPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgICAgICAgICAgICAgICMgc2VuZCB0aGUgbXNnIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogb3V0cHV0LmdldHZhbHVlKCl9KQogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBtc2dfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChtc2dfanNvbikKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKCiAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNjcmlwdCB2YXJpYWJsZXMgdG8gdGhlIEdIIGNvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgICAgICBvdXRwYXJhbSA9IGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0CiAgICAgICAgICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgICAgICAgICAgZm9yIG91dHAgaW4gb3V0cGFyYW1fbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0cCBpbiBsb2NhbHMua2V5cygpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChsb2NhbHNbb3V0cF0pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQoTm9uZSkKCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KICAgICAgICAgICAgcmV0dXJuIGxvY2FscwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgogICAgICAgICAgICAjIHNlbmQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgZXJyX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6ICJlcnI6IiArIHN0cihlKX0pCiAgICAgICAgICAgIGVycl9qc29uID0gZXJyX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChlcnJfanNvbikKICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQogICAgICAgICAgICAKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCgogICAgICAgICAgICBlcnJfbXNnID0gZiJzY3JpcHQtc3luYzo6RXJyb3IgaW4gdGhlIGNvZGU6IHtzdHIoZSl9IgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oZXJyX21zZykKCiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsIGJ0bjogYm9vbCwgYnJlcDogUmhpbm8uR2VvbWV0cnkuQnJlcCk6CiAgICAgICAgIiIiIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgY29tcG9uZW50IGhhcyB0byBiZSByZWNhbGN1bGF0ZWQgaXQncyB0aGUgc29sdmUgbWFpbiBpbnN0YW5jZS4gIiIiCgogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IEZhbHNlCgogICAgICAgICMgc2V0IHRoZSBwYXRoIGlmIGJ1dHRvbiBpcyBwcmVzc2VkCiAgICAgICAgc2VsZi5pbml0X3NjcmlwdF9wYXRoKGJ0bikKCiAgICAgICAgIyBmaWxlIGNoYW5nZSBsaXN0ZW5lciB0aHJlYWQKICAgICAgICBpZiBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIEZpbGVDaGFuZ2VkVGhyZWFkKHNlbGYucGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnN0YXJ0KCkKCiAgICAgICAgIyBzZXQgdXAgdGhlIHRjcCBjbGllbnQgdG8gY29ubmVjdCB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgIF8gPSBbcHJpbnQodC5uYW1lKSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldCiAgICAgICAgaWYgc2VsZi5jbGllbnRfdGhyZWFkX25hbWUgbm90IGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgQ2xpZW50VGhyZWFkKHNlbGYudnNjb2RlX3NlcnZlcl9pcCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZwogICAgICAgICAgICAgICAgICAgICAgICApLnN0YXJ0KCkKCiAgICAgICAgIyBhZGQgdG8gdGhlIGdsb2JhbHMgYWxsIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIG9mIHRoZSBjb21wb25lbnQgKHRoZSBsb2NhbHMpCiAgICAgICAgZ2xvYmFscygpLnVwZGF0ZShsb2NhbHMoKSkKCiAgICAgICAgcmVzID0gc2VsZi5zYWZlX2V4ZWMoc2VsZi5wYXRoLCBOb25lLCBnbG9iYWxzKCkpCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gVHJ1ZQogICAgICAgIHJldHVybgoKICAgIGRlZiBBZnRlclJ1blNjcmlwdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGNvbXBvbmVudCBoYXMgZmluaXNoZWQKICAgICAgICAgICAgaXRzIGNhbGN1bGF0aW9uLiBJdCBpcyB1c2VkIHRvIGxvYWQgdGhlIEdIQ29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgd2l0aCB0aGUgdmFsdWVzIGNyZWF0ZWQgaW4gdGhlIHNjcmlwdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5pc19zdWNjZXNzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBvdXRwYXJhbSA9IFtwIGZvciBwIGluIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0XQogICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgCiAgICAgICAgIyBUT0RPOiBhZGQgdGhlIGNvbnZlcnNpb24gdG8gZGF0YXRyZWUgZm9yIG5lc3RlZCBsaXN0cyBhbmQgdHVwbGVzCiAgICAgICAgZm9yIGlkeCwgb3V0cCBpbiBlbnVtZXJhdGUob3V0cGFyYW0pOgogICAgICAgICAgICAjIGRldGVjdCBpZiB0aGUgb3V0cHV0IGlzIGEgbGlzdAogICAgICAgICAgICBpZiB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gbGlzdCBvciB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gdHVwbGU6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YUxpc3QoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGEoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgMCwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuY2xlYXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICB0YWJsZV92YWx1ZSA9IGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuR2V0VmFsdWUoCiAgICAgICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsICJub3RfZm91bmQiCiAgICAgICAgKQogICAgICAgIGlmIHRhYmxlX3ZhbHVlICE9ICJub3RfZm91bmQiOgogICAgICAgICAgICByZXR1cm4gdGFibGVfdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwYXRoLnNldHRlcgogICAgZGVmIHBhdGgoc2VsZiwgcGF0aCA6IHN0cik6CiAgICAgICAgIiIiIFNldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5TZXRWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCBwYXRoKQoKICAgICAgICBzY3JpcHRfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9IGYie3NjcmlwdF9uYW1lfSIKCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIF8gPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdLnN0b3AoKQoKICAgIEBwYXRoLmRlbGV0ZXIKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBEZWxldGUgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyBpZiB0aGUgb2JqZWN0IGlzIGVyYXNlZC4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5EZWxldGVWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlKQo=
+ - S
+
+
+
+
+ - *.*.python
+ - 3.*
+
+
+
+
+
+
+
+
+
+
+ - a8b97322-2d53-47cd-905e-b932c3ccd74e
+ - Button
+
+
+
+
+ - Button object with two values
+ - False
+ - True
+ - 5f8bfbf4-70d5-46ba-90fa-f3804e9a9032
+ - Button
+
+ - false
+ - 0
+
+
+
+
+ -
+ 89
+ 134
+ 66
+ 22
+
+
+
+
+
+
+
+
+
+ - 919e146f-30ae-4aae-be34-4d72f555e7da
+ - Brep
+
+
+
+
+ - Contains a collection of Breps (Boundary REPresentations)
+ - 0f309845-29e6-43ae-b255-cdb5c2d13da9
+ - Brep
+ - Brep
+ - false
+ - 0
+
+
+
+
+ -
+ 99
+ 164
+ 50
+ 24
+
+ -
+ 124.82912
+ 176.29893
+
+
+
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
+
+
+
+
+ -
+ 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
+
+ - 00000000-0000-0000-0000-000000000000
+
+
+
+
+
+
+
+
+
+
+
+
+ - 59e0b89a-e487-49f8-bab8-b5bab16be14c
+ - Panel
+
+
+
+
+ - A panel for custom notes and text values
+ - 6ffd83cc-a073-46cd-8213-4c0663708aa7
+ - Panel
+
+ - false
+ - 0
+ - 55cc2102-ec2b-4f6f-ba16-74e8aed9df42
+ - 1
+ - Double click to edit panel content…
+
+
+
+
+ -
+ 308
+ 112
+ 343
+ 169
+
+ - 0
+ - 0
+ - 0
+ -
+ 308.54327
+ 112.449066
+
+
+
+
+
+ -
+ 255;213;217;232
+
+ - true
+ - true
+ - true
+ - false
+ - false
+ - true
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ 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
+
+
+
+
+
\ No newline at end of file
From 204173240e97f5e672a36e2f1ec528e05ed1b862 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 11:51:48 +0200
Subject: [PATCH 009/141] WIP-CAP: working xml dumper for diffcheck ghcomponent
- missing joint detect
---
src/gh/diffCheck/df_geometries.py | 96 ++++++++-
src/gh/diffCheck/diffCheck_app.py | 64 +++---
src/gh/diffCheck/joint_detector.py | 0
src/gh/tester.ghx | 327 +++++++++++++++++++++++------
4 files changed, 381 insertions(+), 106 deletions(-)
create mode 100644 src/gh/diffCheck/joint_detector.py
diff --git a/src/gh/diffCheck/df_geometries.py b/src/gh/diffCheck/df_geometries.py
index 05545ce3..72effcef 100644
--- a/src/gh/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/df_geometries.py
@@ -1,3 +1,5 @@
+import os
+from datetime import datetime
from dataclasses import dataclass
import typing
import uuid
@@ -5,6 +7,9 @@
import Rhino
import Rhino.Geometry as rg
+import xml.etree.ElementTree as ET
+from xml.dom.minidom import parseString
+
@dataclass
class DFVertex:
@@ -36,8 +41,8 @@ def __post_init__(self):
self.vertices = self.vertices or []
self.joint_id = self.joint_id or None
- self._is_joint = None
- self._id = uuid.uuid4().int
+ self.__is_joint = False
+ self.__id = uuid.uuid4().int
def __repr__(self):
return f"Face vertices: {len(self.vertices)}"
@@ -45,12 +50,14 @@ def __repr__(self):
@property
def is_joint(self):
if self.joint_id:
+ self.__is_joint = True
return True
+ self.__is_joint = False
return False
@property
def id(self):
- return self._id
+ return self.__id
@dataclass
@@ -69,7 +76,7 @@ def __post_init__(self):
raise ValueError("Faces must be of type List[Face]")
self.faces = self.faces or []
- self._id = uuid.uuid4().int
+ self.__id = uuid.uuid4().int
@classmethod
def from_brep(cls, brep):
@@ -97,7 +104,7 @@ def __repr__(self):
@property
def id(self):
- return self._id
+ return self.__id
@dataclass
@@ -118,4 +125,81 @@ def add_beam(self, beam: DFBeam):
self.beams.append(beam)
def remove_beam(self, beam_id: int):
- self.beams = [beam for beam in self.beams if beam.id != beam_id]
\ No newline at end of file
+ self.beams = [beam for beam in self.beams if beam.id != beam_id]
+
+ @classmethod
+ def from_xml(cls, file_path: str):
+ """
+ Create an assembly from an XML file
+
+ :param file_path: The path to the XML file
+ :return assembly: The assembly object
+ """
+ # parse the XML file
+ tree = ET.parse(file_path)
+ root = tree.getroot()
+ beams : typing.List[DFBeam] = []
+
+ name = root.get("name")
+ for beam_elem in root.findall("Beam"):
+ beam = DFBeam(beam_elem.get("name"), [])
+ beam._DFBeam__id = int(beam_elem.get("id"))
+ for face_elem in beam_elem.findall("Face"):
+ vertices = []
+ for vertex_elem in face_elem.findall("Vertex"):
+ vertex = DFVertex(
+ float(vertex_elem.get("x")),
+ float(vertex_elem.get("y")),
+ float(vertex_elem.get("z"))
+ )
+ vertices.append(vertex)
+ face = DFFace(vertices)
+ face._DFFace__id = int(face_elem.get("id"))
+ face._DFFace__is_joint = bool(face_elem.get("is_joint"))
+ face_joint : str = face_elem.get("joint_id")
+ if face_joint != "None":
+ face.joint_id = int(face_joint)
+ else:
+ face.joint_id = None
+ beam.faces.append(face)
+ beams.append(beam)
+ return cls(beams, name)
+
+ def dump_to_xml(self, dir: str):
+ """
+ Dump the assembly to an XML file
+
+ :param dir: The directory to save the XML file
+ :return xml_string: The pretty XML string
+ """
+ timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
+ timestamp = "0"
+ file_path = os.path.join(dir, f"{self.name}_{timestamp}.xml")
+
+ root = ET.Element("Assembly")
+ root.set("name", self.name)
+ # dfbeams
+ for beam in self.beams:
+ beam_elem = ET.SubElement(root, "Beam")
+ beam_elem.set("name", beam.name)
+ beam_elem.set("id", str(beam.id))
+ # dffaces
+ for face in beam.faces:
+ face_elem = ET.SubElement(beam_elem, "Face")
+ face_elem.set("id", str(face.id))
+ face_elem.set("is_joint", str(face.is_joint))
+ face_elem.set("joint_id", str(face.joint_id))
+ # dfvertices
+ for vertex in face.vertices:
+ vertex_elem = ET.SubElement(face_elem, "Vertex")
+ vertex_elem.set("x", str(vertex.x))
+ vertex_elem.set("y", str(vertex.y))
+ vertex_elem.set("z", str(vertex.z))
+ tree = ET.ElementTree(root)
+ xml_string = ET.tostring(root, encoding='unicode')
+ dom = parseString(xml_string)
+ pretty_xml = dom.toprettyxml()
+ with open(file_path, 'w') as f:
+ f.write(pretty_xml)
+
+ return pretty_xml
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck_app.py
index 8fb1a9a4..ada805cf 100644
--- a/src/gh/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck_app.py
@@ -7,42 +7,40 @@
import Rhino.Geometry as rg
import os
-from df_geometries import DFVertex, DFFace, DFBeam, DFAssembly # diffCheck.df_geometries
-
-def main():
- # vertices
- vertex1 = DFVertex(1, 2, 3)
- vertex2 = DFVertex(4, 5, 6)
- vertex3 = DFVertex(7, 8, 9)
- vertex4 = DFVertex(10, 11, 12)
- vertex5 = DFVertex(13, 14, 15)
- # print(vertex1.x)
- # print(vertex2.y)
- # print(vertex3.z)
-
- # faces
- face1 = DFFace([vertex1, vertex2, vertex3], 1)
- face2 = DFFace([vertex4, vertex5, vertex3, vertex4], 2)
- face3 = DFFace([vertex1, vertex2, vertex5], 3)
- face4 = DFFace([vertex1, vertex2, vertex3, vertex4])
- face5 = DFFace([vertex1, vertex2, vertex3, vertex4, vertex5])
- face6 = DFFace([vertex1, vertex2, vertex3, vertex4, vertex5, vertex1])
- # print(face1.id)
- # print(face2.is_joint)
- # print(face3.is_joint)
+import typing
+from df_geometries import DFBeam, DFAssembly # diffCheck.df_geometries
+
+
+def main(
+ i_breps : typing.List[rg.Brep],
+ i_export_dir : str
+ ):
+ """
+ Main function to test the package
+ :param i_breps: list of breps
+ :param i_export_dir: directory to export the xml
+ """
+
# beams
- beam1 = DFBeam("Beam1", [face1, face2, face3, face4])
- beam2 = DFBeam("Beam2", [face1, face2, face3, face4, face5, face6])
- beam3 = DFBeam.from_brep(brep)
- print(beam3)
- # print(beam1.id)
- # print(beam2.id)
+ beams : typing.List[DFBeam] = []
+ for brep in i_breps:
+ beam = DFBeam.from_brep(brep)
+ beams.append(beam)
# assembly
- assembly = DFAssembly([beam1, beam2], "Assembly1")
- print(assembly.beams)
- print(assembly)
+ assembly1 = DFAssembly(beams, "Assembly1")
+ print(assembly1.beams)
+ print(assembly1)
+
+ # dump the xml
+ xml : str = assembly1.dump_to_xml(i_export_dir)
+ o_xml = xml
+
+ # # (optional) you can also load the xml
+ # file_path = os.path.join(i_export_dir, "Assembly1_0.xml")
+ # assembly2 = DFAssembly.from_xml(file_path)
if __name__ == "__main__":
- main()
\ No newline at end of file
+ main(i_breps,
+ i_export_dir)
\ No newline at end of file
diff --git a/src/gh/diffCheck/joint_detector.py b/src/gh/diffCheck/joint_detector.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/gh/tester.ghx b/src/gh/tester.ghx
index 65594ff9..a4e26c31 100644
--- a/src/gh/tester.ghx
+++ b/src/gh/tester.ghx
@@ -49,10 +49,10 @@
-
- -25
- -200
+ 147
+ 73
- - 2.0761244
+ - 0.7558541
@@ -69,7 +69,7 @@
- - F:\diffCheck\src\gh\diffCheck_app.py
+ - F:\diffCheck\src\gh\diffCheck\diffCheck_app.py
@@ -99,9 +99,9 @@
- - 4
+ - 7
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
@@ -115,7 +115,7 @@
- true
- 2
-
- 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
+ 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
- dcf18e47-99f2-42d5-9ca4-7e6aee82d9b6
- true
@@ -130,30 +130,30 @@
-
+
-
- 181
- 133
- 105
- 44
+ 187
+ 123
+ 138
+ 64
-
- 228
+ 267
155
- - true
-
- - 2
+
+ - 3
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
- 2
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
@@ -174,34 +174,69 @@
-
+
-
- 183
- 135
- 30
+ 189
+ 125
+ 63
20
-
- 199.5
- 145
+ 222
+ 135
- - true
+ - true
+ - Converts to collection of text fragments
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAO8SURBVEhL1VVLLJxhFB3ERMT7zXgb71e8X/GId2IhQZTuJGwktjaNxqpYNAQbsWBHiDRsbNgIC4lWYiUs7LSVtLqY6UNNTu+58/9Caaurpie5md/85px7z733+yz/CnYPD4/P8om/iCcSj4OPj8/r+fl57O3tYWdnB9vb29jc3MTa2hoWFxcxMTGB/v5+tLW1oaqqCqmpqZCE3spPrW6G38DLy6tdfvh9YWEBZWVlGqWlpSguLkZhYSHy8/ORk5ODjIwMJU5KSkJWVhb8/Pwcnp6ezwyaX8IaGBj4YWlpCZ2dnZodo7KyEu3t7TBxcnKipGlpaUhJSdFITk6GCDiFw+amegDe3t4v+vr6rkdHR1FdXY3a2loNPs/NzcHlchkSQHNzM9LT05U8MTFRK5HkvolVrwy6e7BHRUV9nZ6eRkNDgxLX19dr8Pns7AwrKysGPTA5Oak22e12FYiLi0NsbCx7wSqK3JS3IN7vdHR0oLe3V225LTAwMIDj4+M7Nh0dHd0RIHl0dDSCg4NdIvLGoL1BW1hY2Jfu7m5tKj2/bdHy8jKmpqa02aenp4YEUFdXd2MRBcQBxMfHQ6bQIZxP3dTSWMn+XXl5ORicFlOElVDo4uICLS0t+m52dtagB8bGxlQgISEBNpsNkZGRKkJBqeKjcPtZpPPPQ0NDv5CcI8hRJBGzpdDQ0JDugjmmXV1dBj1wcHCgzaX/MTExiIiIQEhIiIrKMxf1pUWUPmVmZupsMyhSUFCAoqIijY2NDQwPD+t35g6cn58bEtBKTf/Dw8PZAxXKy8vjdn+iwEsZL2dubi5MIT6TjBU4HA6D6mGMjIxo9rRHnEBQUJDySFXuCugT/WKpnAoGlyg7O1szX11d1Wd+x3dcrp6eHoMe2N/fV9+ZPe1hJbRX+urugYGnVqvVwR9z/fnJJTo8PMTg4KA+m+/oL0fz8vJSBa6vr7VaM3tWLRZxF26mSMHZpXdceZKMj48rAQX4N4NVmku1u7ur74mZmRklp3BJSYlL6O7tAVHKs4QEXCITTqdTjwmOIonZo/X1dVxdXRn/4cbW1haampoQEBBA7+9vMiFVvBIfvzFbTsbt4JyzmfSYDaXnpi1CqiMsk3MlNL88iwgbq6DfzJbNM4OktNAkZkNl+uDv76/veTdIH39/mhp4JrPs5OTI8XETJinn3Mxa7gD4+vrqeSVVk/yP9wFhFavecywrKipQU1OjBPS3tbVVM+Whx4ORW83zq7Gx8fE3mgHerz/fuX+Kx9/J/xEslh9QdsIn89F0TQAAAABJRU5ErkJggg==
+
+ - 8f3ff1eb-ddb8-455d-81fb-cb1cf0c575a5
+ - i_export_dir
+ - i_export_dir
+ - true
+ - 0
+ - true
+ - 56e42677-eccb-444a-9bab-e6a34770f1dd
+ - 1
+
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+
+
+
+
+ -
+ 189
+ 145
+ 63
+ 20
+
+ -
+ 222
+ 155
+
+
+
+
+
+
+
+ - 1
- true
- Converts to collection of Breps (Boundary REPresentations)
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPkSURBVEhL1VVbKOV7FN7ITnK/RYNcNrkrx11SbokHuWQyb0ryRN5ocuLBKadELsktHuTywKBcXgiRUiYvJOVSknNw5LK3OWbO9J31/famOWfPGPN0OqtW+7/r9/vWWt/61vpp/ivTWVhY3MsvfsBfi7/MbGxstvr6+rC+vo7V1VUsLi5ifn4eExMTGBoaQnNzM8rLy5GXl4eUlBQEBQVBEjqTq1ojwjNmZWWVLxc/DQ4OIiEhQXl8fDxiY2MRExOD6OhoREREICQkRAH7+/sjLCwMdnZ2ektLy7cmmG+a1tHR8Y/R0VEUFRWp7OjJyclISkrC8PAwHh4ecHNzg4WFBeTm5iIwMFB5QEAAJIBBMF4Zob5i1tbWv5SVlf3V0NCA1NRUpKWlPTmpOjw8RHd3N3p7e7G0tITb21v138/PT1UiyT0IVe9McGam8/T0/LO9vR0ZGRkKND09HZmZmVhbW4Ner0dnZycmJydRUVGBqqoq1NfX4+joSPWHQby9vdkLVvGTEfILE+5XSUtpaamihQEIzkYT/PLyEgy+ubmJ2tpa1eiBgQG0trbi4OAAXV1d8PLygrOz82cJ8t4E+2R5bm5uH0pKSlRTyTkDPGZO8OPjY4yPj2Nubg4rKysKfHp6Wp3hN+li5b6+vhAV6gXzjRFaGivZ/5aYmAg61cKGkvMvwXd2dlT2LS0tODs7U98E39vbw/7+vurJ7OwshGZFl1RxJdh2Gun8z66urh8ITglSiiMjIzAYDGbgBBkbG0NHRwfOz89xcXGhztB6enpwfX0NFxcXpSp3d3cO6q8aiXQdGhqqtE1nEIJfXV2Zgc/MzIASZrMbGxsVVScnJ9jY2FDKYsXSA3h4eCAqKorTfc0ALSIvQ2RkJB4D3d/fq4tfA+/v70dbWxuamppQWVmJ6upq9X93d1cFcXJyUjjSC2MF5Il8UcecTjozOz09fRa8rq5OSZWS3draUvwLLUpJnHzpq7EHJnuj1Wr1wcHBavwLCgpwd3eH5eXlF4OTFmZPFco3Z+FJRcqkivc8xJFnk3iJFfwIuE6nQ1xc3GeBM5sDWjx3CSVGp6qoEMqVqnkOnI2lerKysuDg4EDuzSeZJlW8k4MPrIBjz3K5BqioqakpNcE1NTXY3t7+R+YCquQtyvkoMN/cRbRXrIK98PHxUUNDz87OVhNM+bI3XBlsqKgP9vb26gzfBunj89vUZG+lZEN4eDhkfTy5DKOigXQ8Zi1vAGxtbdVSlKoJ/t33gKYVqn7nI/K4kwhAfnNyclSm+fn5KCwsRHFxMbi/uBTlzsteNJPxff33m/s9f/mb/D8yjeZvU880QlAx2/0AAAAASUVORK5CYII=
- ae8c9c0d-8d6a-4a8c-812a-110846a2031c
- - brep
- - brep
+ - i_breps
+ - i_breps
- true
- - 0
+ - 1
- true
- 0f309845-29e6-43ae-b255-cdb5c2d13da9
- 1
@@ -210,18 +245,17 @@
-
+
-
- 183
- 155
- 30
+ 189
+ 165
+ 63
20
-
- 199.5
- 165
+ 222
+ 175
- - true
@@ -245,18 +279,17 @@
-
+
-
- 243
- 135
+ 282
+ 125
41
- 20
+ 30
-
- 263.5
- 145
+ 302.5
+ 140
- - true
@@ -266,32 +299,31 @@
- false
- Generic example output of the component
-
- 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
+ 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
- f5d7e77d-04d1-4395-b52b-651450a4b329
- - a
- - a
+ - o_xml
+ - o_xml
- false
- 0
- true
- 0
- Generic example output of the component
- - 6a184b65-baa3-42d1-a548-3915b401de53
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
+
-
- 243
+ 282
155
41
- 20
+ 30
-
- 263.5
- 165
+ 302.5
+ 170
- - true
@@ -300,7 +332,7 @@
- - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgoKICAgICAgICAgICAgICAgICMgcGFyc2UgdGhlIGNvZGUKICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCgogICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgcXVldWUgYW5kIGV2ZW50CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYucXVldWVfbXNnX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLmdldCgpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnRhc2tfZG9uZSgpCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgdGhlIGNvZGUKICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRvdXQob3V0cHV0KToKICAgICAgICAgICAgICAgICAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKICAgICAgICAgICAgICAgIGxvY2Fsc1sic3Rkb3V0Il0gPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgICAgICAgICAgICAgICMgc2VuZCB0aGUgbXNnIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogb3V0cHV0LmdldHZhbHVlKCl9KQogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBtc2dfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChtc2dfanNvbikKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKCiAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNjcmlwdCB2YXJpYWJsZXMgdG8gdGhlIEdIIGNvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgICAgICBvdXRwYXJhbSA9IGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0CiAgICAgICAgICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgICAgICAgICAgZm9yIG91dHAgaW4gb3V0cGFyYW1fbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0cCBpbiBsb2NhbHMua2V5cygpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChsb2NhbHNbb3V0cF0pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQoTm9uZSkKCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KICAgICAgICAgICAgcmV0dXJuIGxvY2FscwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgogICAgICAgICAgICAjIHNlbmQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgZXJyX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6ICJlcnI6IiArIHN0cihlKX0pCiAgICAgICAgICAgIGVycl9qc29uID0gZXJyX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChlcnJfanNvbikKICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQogICAgICAgICAgICAKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCgogICAgICAgICAgICBlcnJfbXNnID0gZiJzY3JpcHQtc3luYzo6RXJyb3IgaW4gdGhlIGNvZGU6IHtzdHIoZSl9IgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oZXJyX21zZykKCiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsIGJ0bjogYm9vbCwgYnJlcDogUmhpbm8uR2VvbWV0cnkuQnJlcCk6CiAgICAgICAgIiIiIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgY29tcG9uZW50IGhhcyB0byBiZSByZWNhbGN1bGF0ZWQgaXQncyB0aGUgc29sdmUgbWFpbiBpbnN0YW5jZS4gIiIiCgogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IEZhbHNlCgogICAgICAgICMgc2V0IHRoZSBwYXRoIGlmIGJ1dHRvbiBpcyBwcmVzc2VkCiAgICAgICAgc2VsZi5pbml0X3NjcmlwdF9wYXRoKGJ0bikKCiAgICAgICAgIyBmaWxlIGNoYW5nZSBsaXN0ZW5lciB0aHJlYWQKICAgICAgICBpZiBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIEZpbGVDaGFuZ2VkVGhyZWFkKHNlbGYucGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnN0YXJ0KCkKCiAgICAgICAgIyBzZXQgdXAgdGhlIHRjcCBjbGllbnQgdG8gY29ubmVjdCB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgIF8gPSBbcHJpbnQodC5uYW1lKSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldCiAgICAgICAgaWYgc2VsZi5jbGllbnRfdGhyZWFkX25hbWUgbm90IGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgQ2xpZW50VGhyZWFkKHNlbGYudnNjb2RlX3NlcnZlcl9pcCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZwogICAgICAgICAgICAgICAgICAgICAgICApLnN0YXJ0KCkKCiAgICAgICAgIyBhZGQgdG8gdGhlIGdsb2JhbHMgYWxsIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIG9mIHRoZSBjb21wb25lbnQgKHRoZSBsb2NhbHMpCiAgICAgICAgZ2xvYmFscygpLnVwZGF0ZShsb2NhbHMoKSkKCiAgICAgICAgcmVzID0gc2VsZi5zYWZlX2V4ZWMoc2VsZi5wYXRoLCBOb25lLCBnbG9iYWxzKCkpCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gVHJ1ZQogICAgICAgIHJldHVybgoKICAgIGRlZiBBZnRlclJ1blNjcmlwdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGNvbXBvbmVudCBoYXMgZmluaXNoZWQKICAgICAgICAgICAgaXRzIGNhbGN1bGF0aW9uLiBJdCBpcyB1c2VkIHRvIGxvYWQgdGhlIEdIQ29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgd2l0aCB0aGUgdmFsdWVzIGNyZWF0ZWQgaW4gdGhlIHNjcmlwdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5pc19zdWNjZXNzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBvdXRwYXJhbSA9IFtwIGZvciBwIGluIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0XQogICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgCiAgICAgICAgIyBUT0RPOiBhZGQgdGhlIGNvbnZlcnNpb24gdG8gZGF0YXRyZWUgZm9yIG5lc3RlZCBsaXN0cyBhbmQgdHVwbGVzCiAgICAgICAgZm9yIGlkeCwgb3V0cCBpbiBlbnVtZXJhdGUob3V0cGFyYW0pOgogICAgICAgICAgICAjIGRldGVjdCBpZiB0aGUgb3V0cHV0IGlzIGEgbGlzdAogICAgICAgICAgICBpZiB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gbGlzdCBvciB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gdHVwbGU6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YUxpc3QoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGEoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgMCwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuY2xlYXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICB0YWJsZV92YWx1ZSA9IGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuR2V0VmFsdWUoCiAgICAgICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsICJub3RfZm91bmQiCiAgICAgICAgKQogICAgICAgIGlmIHRhYmxlX3ZhbHVlICE9ICJub3RfZm91bmQiOgogICAgICAgICAgICByZXR1cm4gdGFibGVfdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwYXRoLnNldHRlcgogICAgZGVmIHBhdGgoc2VsZiwgcGF0aCA6IHN0cik6CiAgICAgICAgIiIiIFNldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5TZXRWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCBwYXRoKQoKICAgICAgICBzY3JpcHRfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9IGYie3NjcmlwdF9uYW1lfSIKCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIF8gPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdLnN0b3AoKQoKICAgIEBwYXRoLmRlbGV0ZXIKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBEZWxldGUgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyBpZiB0aGUgb2JqZWN0IGlzIGVyYXNlZC4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5EZWxldGVWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlKQo=
+ - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgoKICAgICAgICAgICAgICAgICMgcGFyc2UgdGhlIGNvZGUKICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCgogICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgcXVldWUgYW5kIGV2ZW50CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYucXVldWVfbXNnX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLmdldCgpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnRhc2tfZG9uZSgpCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgdGhlIGNvZGUKICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRvdXQob3V0cHV0KToKICAgICAgICAgICAgICAgICAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKICAgICAgICAgICAgICAgIGxvY2Fsc1sic3Rkb3V0Il0gPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgICAgICAgICAgICAgICMgc2VuZCB0aGUgbXNnIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogb3V0cHV0LmdldHZhbHVlKCl9KQogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBtc2dfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChtc2dfanNvbikKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKCiAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNjcmlwdCB2YXJpYWJsZXMgdG8gdGhlIEdIIGNvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgICAgICBvdXRwYXJhbSA9IGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0CiAgICAgICAgICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgICAgICAgICAgZm9yIG91dHAgaW4gb3V0cGFyYW1fbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0cCBpbiBsb2NhbHMua2V5cygpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChsb2NhbHNbb3V0cF0pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQoTm9uZSkKCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KICAgICAgICAgICAgcmV0dXJuIGxvY2FscwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgogICAgICAgICAgICAjIHNlbmQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgZXJyX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6ICJlcnI6IiArIHN0cihlKX0pCiAgICAgICAgICAgIGVycl9qc29uID0gZXJyX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChlcnJfanNvbikKICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQogICAgICAgICAgICAKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCgogICAgICAgICAgICBlcnJfbXNnID0gZiJzY3JpcHQtc3luYzo6RXJyb3IgaW4gdGhlIGNvZGU6IHtzdHIoZSl9IgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oZXJyX21zZykKCiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsCiAgICAgICAgICAgIGJ0bjogYm9vbCwKICAgICAgICAgICAgaV9leHBvcnRfZGlyOiBzdHIsCiAgICAgICAgICAgIGlfYnJlcHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0W1JoaW5vLkdlb21ldHJ5LkJyZXBdKToKICAgICAgICAiIiIgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb21wb25lbnQgaGFzIHRvIGJlIHJlY2FsY3VsYXRlZCBpdCdzIHRoZSBzb2x2ZSBtYWluIGluc3RhbmNlLiAiIiIKCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gRmFsc2UKCiAgICAgICAgIyBzZXQgdGhlIHBhdGggaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBzZWxmLmluaXRfc2NyaXB0X3BhdGgoYnRuKQoKICAgICAgICAjIGZpbGUgY2hhbmdlIGxpc3RlbmVyIHRocmVhZAogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgbm90IGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgRmlsZUNoYW5nZWRUaHJlYWQoc2VsZi5wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc3RhcnQoKQoKICAgICAgICAjIHNldCB1cCB0aGUgdGNwIGNsaWVudCB0byBjb25uZWN0IHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgXyA9IFtwcmludCh0Lm5hbWUpIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV0KICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBDbGllbnRUaHJlYWQoc2VsZi52c2NvZGVfc2VydmVyX2lwLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfdGhyZWFkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZ19sb2NrLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnCiAgICAgICAgICAgICAgICAgICAgICAgICkuc3RhcnQoKQoKICAgICAgICAjIGFkZCB0byB0aGUgZ2xvYmFscyBhbGwgdGhlIGlucHV0IHBhcmFtZXRlcnMgb2YgdGhlIGNvbXBvbmVudCAodGhlIGxvY2FscykKICAgICAgICBnbG9iYWxzKCkudXBkYXRlKGxvY2FscygpKQoKICAgICAgICByZXMgPSBzZWxmLnNhZmVfZXhlYyhzZWxmLnBhdGgsIE5vbmUsIGdsb2JhbHMoKSkKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBUcnVlCiAgICAgICAgcmV0dXJuCgogICAgZGVmIEFmdGVyUnVuU2NyaXB0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgY29tcG9uZW50IGhhcyBmaW5pc2hlZAogICAgICAgICAgICBpdHMgY2FsY3VsYXRpb24uIEl0IGlzIHVzZWQgdG8gbG9hZCB0aGUgR0hDb21wb25lbnQgb3V0cHV0cwogICAgICAgICAgICB3aXRoIHRoZSB2YWx1ZXMgY3JlYXRlZCBpbiB0aGUgc2NyaXB0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmlzX3N1Y2Nlc3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIG91dHBhcmFtID0gW3AgZm9yIHAgaW4gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRdCiAgICAgICAgb3V0cGFyYW1fbmFtZXMgPSBbcC5OaWNrTmFtZSBmb3IgcCBpbiBvdXRwYXJhbV0KICAgICAgICAKICAgICAgICAjIFRPRE86IGFkZCB0aGUgY29udmVyc2lvbiB0byBkYXRhdHJlZSBmb3IgbmVzdGVkIGxpc3RzIGFuZCB0dXBsZXMKICAgICAgICBmb3IgaWR4LCBvdXRwIGluIGVudW1lcmF0ZShvdXRwYXJhbSk6CiAgICAgICAgICAgICMgZGV0ZWN0IGlmIHRoZSBvdXRwdXQgaXMgYSBsaXN0CiAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSBsaXN0IG9yIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSB0dXBsZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhTGlzdChnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YShnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCAwLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgc2VsZi5fdmFyX291dHB1dC5jbGVhcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIHRhYmxlX3ZhbHVlID0gZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5HZXRWYWx1ZSgKICAgICAgICAgICAgc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgIm5vdF9mb3VuZCIKICAgICAgICApCiAgICAgICAgaWYgdGFibGVfdmFsdWUgIT0gIm5vdF9mb3VuZCI6CiAgICAgICAgICAgIHJldHVybiB0YWJsZV92YWx1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgQHBhdGguc2V0dGVyCiAgICBkZWYgcGF0aChzZWxmLCBwYXRoIDogc3RyKToKICAgICAgICAiIiIgU2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLlNldFZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsIHBhdGgpCgogICAgICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgIGdoZW52LkNvbXBvbmVudC5NZXNzYWdlID0gZiJ7c2NyaXB0X25hbWV9IgoKICAgICAgICBpZiBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lIGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgXyA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZV1bMF0uc3RvcCgpCgogICAgQHBhdGguZGVsZXRlcgogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIERlbGV0ZSB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IGlmIHRoZSBvYmplY3QgaXMgZXJhc2VkLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkRlbGV0ZVZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUpCg==
- S
@@ -337,8 +369,8 @@
-
- 89
- 134
+ 98
+ 124
66
22
@@ -367,14 +399,14 @@
-
- 99
- 164
+ 114
+ 176
50
24
-
- 124.82912
- 176.29893
+ 139.87042
+ 188.27032
@@ -385,14 +417,30 @@
- - 1
+ - 3
- {0}
-
+
-
- 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
+ 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
+
+ - 00000000-0000-0000-0000-000000000000
+
+
+
+
+ -
+ 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
+
+ - 00000000-0000-0000-0000-000000000000
+
+
+
+
+ -
+ 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2BJ5IT1PsT/bMgqM1urtS6MgvyhZMgx22SLhMOMw0uGmNivAf8+Ee23j7dm325T9YF7xyFJYtRMHfvDOMT7jdOG0YUKuMaTizXmLx5wzYjBd5OnWDp82fORIYyd+8MbynjEDox+TJbBJuE7aOGtZSbZJBlgnGRwcQCTG9x96XJGlDTLP6NOh/eFtFOQfLDtX+fxEslTn42FnFVkKdPMyNhhyOurKd9WNeWsnR0H6tn9FJV2ULKW3eG6pOWYSC+Jw47DSWMppXXpMD19rsmdZSvUN6188e3cHIrv/vTg/23yWvHreFxMq1DhgxP9mdooEIqKT3LZ77dm1x9R8bJ10QJ4naJdKuCzhOulwdO1AsxyhHeJlCmQHbRIvR6vOl/eXxt92Nn5Tq5tCjjWfQY4iDxyYpMgRnCHDPafK5Kjr93tGQRrukC5Kjra2r/65+R/WYUFM45DSoce0Ha+Teh9akl08crTnMTnaZEz1PP9g0+s/GLUCWfHFmEgmR/w6acXJ78xyNK3r7pIsR7I9UuTo1uczNyrrpE9l3lGOpsq8859RpqAMytHwLwNHgoxkyjKi7HNb8xnkKPP3ZaOZHO2LLJAfdk8KVuQK7kXJ0Rv9Yx6YY5WxIB1qTOOQY3kH+5Wjpn2CU56uHOEeeOyhMbnJw46b9+3aNJ19adnD08bgtiuH3Xy/daHAeDTqO5acjfyzZz1TG8634+0RyFHJXicpft32uOOOEi87vA3i7RQva0/k13WdeK+fsv8N+3Rxbx+PCrzlaoR79OETUZC/NVt5a8nMiJoc9b57db6EQ4xDSoca38/AdIuq6ztvPd/env260clfTSkee/Rsqc0jvDtnm8+SWke71V5pPG0mMu9hRvzxjLBCcvQPy+fXSGCPcI1UwmMbwCCBOJS7s2zSY3ELfGwDb4N42/REcjR87+Y60uufd1POkRS/jt0THzgYIT8h50aRcnT09vhDGl3FbSmRIS70/9rsT45CViyvwctR9/jQVGCD/92ER9iZtvkAVI7+aH9nvpb2cbaAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCb+DwAA//8AAAD//wMA
- 00000000-0000-0000-0000-000000000000
@@ -427,17 +475,127 @@
-
- 308
- 112
+ 366
+ 44
343
- 169
+ 73
+
+ - 0
+ - 0
+ - 0
+ -
+ 366.4111
+ 44.67153
+
+
+
+
+
+ -
+ 255;213;217;232
+
+ - true
+ - true
+ - true
+ - false
+ - false
+ - true
+
+
+
+
+
+
+
+
+ - 06953bda-1d37-4d58-9b38-4b3c74e54c8f
+ - File Path
+
+
+
+
+ - Contains a collection of file paths
+ - false
+ - All files|*.*
+ - 56e42677-eccb-444a-9bab-e6a34770f1dd
+ - File Path
+ - Path
+ - false
+ - 0
+
+
+
+
+ -
+ 115
+ 149
+ 50
+ 24
+
+ -
+ 140.13669
+ 161.41502
+
+
+
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
+
+
+
+
+ - false
+ - F:\__TEMP\test\
+
+
+
+
+
+
+
+
+
+
+
+
+ - 59e0b89a-e487-49f8-bab8-b5bab16be14c
+ - Panel
+
+
+
+
+ - A panel for custom notes and text values
+ - d5d04f93-3b13-4fa3-8644-243c03f9a7e8
+ - Panel
+
+ - false
+ - 0.10945549979805946
+ - bc61f3bc-d42e-4ab9-9cde-bfa5df8d625e
+ - 1
+ - Double click to edit panel content…
+
+
+
+
+ -
+ 426
+ 126
+ 604
+ 183
- 0
- 0
- 0
-
- 308.54327
- 112.449066
+ 426.19714
+ 126.91681
@@ -458,6 +616,41 @@
+
+
+ - 3ede854e-c753-40eb-84cb-b48008f14fd4
+ - Text
+
+
+
+
+ - Contains a collection of text fragments
+ - bc61f3bc-d42e-4ab9-9cde-bfa5df8d625e
+ - Text
+ - Txt
+ - false
+ - f5d7e77d-04d1-4395-b52b-651450a4b329
+ - 1
+
+
+
+
+ -
+ 345
+ 158
+ 50
+ 24
+
+ -
+ 370.98038
+ 170.96075
+
+
+
+
+
+
+
@@ -465,7 +658,7 @@
-
- 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
+ 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
From ac89bd5eca09c31beb1cf997cea49a8a6f24e992 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 11:54:08 +0200
Subject: [PATCH 010/141] FIX: timestamp for file working
---
src/gh/diffCheck/df_geometries.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/gh/diffCheck/df_geometries.py b/src/gh/diffCheck/df_geometries.py
index 72effcef..4f48ef71 100644
--- a/src/gh/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/df_geometries.py
@@ -173,7 +173,6 @@ def dump_to_xml(self, dir: str):
:return xml_string: The pretty XML string
"""
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
- timestamp = "0"
file_path = os.path.join(dir, f"{self.name}_{timestamp}.xml")
root = ET.Element("Assembly")
From 3cc8d04fd69cc41247c39b045aa251c096c8be61 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 12:04:28 +0200
Subject: [PATCH 011/141] FIX: minors and typos
---
src/gh/diffCheck/diffCheck_app.py | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/gh/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck_app.py
index ada805cf..0e7efd7b 100644
--- a/src/gh/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck_app.py
@@ -1,8 +1,4 @@
#! python3
-"""
- This module is used as entry point to test the package in Rh/Gh
-"""
-
import Rhino
import Rhino.Geometry as rg
@@ -21,7 +17,7 @@ def main(
:param i_breps: list of breps
:param i_export_dir: directory to export the xml
"""
-
+
# beams
beams : typing.List[DFBeam] = []
for brep in i_breps:
From 17364e1d782040c938cc9101dcab47802ac08b74 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 12:17:33 +0200
Subject: [PATCH 012/141] FIX: better button for output component
---
src/gh/diffCheck/df_geometries.py | 23 +++--
src/gh/diffCheck/diffCheck_app.py | 21 ++---
src/gh/tester.ghx | 140 ++++++++++++++++++++++--------
3 files changed, 125 insertions(+), 59 deletions(-)
diff --git a/src/gh/diffCheck/df_geometries.py b/src/gh/diffCheck/df_geometries.py
index 4f48ef71..631b27c8 100644
--- a/src/gh/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/df_geometries.py
@@ -165,16 +165,12 @@ def from_xml(cls, file_path: str):
beams.append(beam)
return cls(beams, name)
- def dump_to_xml(self, dir: str):
+ def to_xml(self):
"""
Dump the assembly to an XML file
- :param dir: The directory to save the XML file
:return xml_string: The pretty XML string
"""
- timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
- file_path = os.path.join(dir, f"{self.name}_{timestamp}.xml")
-
root = ET.Element("Assembly")
root.set("name", self.name)
# dfbeams
@@ -198,7 +194,18 @@ def dump_to_xml(self, dir: str):
xml_string = ET.tostring(root, encoding='unicode')
dom = parseString(xml_string)
pretty_xml = dom.toprettyxml()
- with open(file_path, 'w') as f:
- f.write(pretty_xml)
- return pretty_xml
\ No newline at end of file
+ return pretty_xml
+
+ def dump(self, pretty_xml : str, dir: str):
+ """
+ Dump the pretty XML to a file
+
+ :param pretty_xml: The pretty XML string
+ :param dir: The directory to save the XML
+ """
+ timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
+ file_path = os.path.join(dir, f"{self.name}_{timestamp}.xml")
+
+ with open(file_path, "w") as f:
+ f.write(pretty_xml)
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck_app.py
index 0e7efd7b..61cc5684 100644
--- a/src/gh/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck_app.py
@@ -8,16 +8,13 @@
from df_geometries import DFBeam, DFAssembly # diffCheck.df_geometries
-def main(
- i_breps : typing.List[rg.Brep],
- i_export_dir : str
- ):
+if __name__ == "__main__":
"""
Main function to test the package
:param i_breps: list of breps
:param i_export_dir: directory to export the xml
+ :param i_dump: whether to dump the xml
"""
-
# beams
beams : typing.List[DFBeam] = []
for brep in i_breps:
@@ -30,13 +27,7 @@ def main(
print(assembly1)
# dump the xml
- xml : str = assembly1.dump_to_xml(i_export_dir)
- o_xml = xml
-
- # # (optional) you can also load the xml
- # file_path = os.path.join(i_export_dir, "Assembly1_0.xml")
- # assembly2 = DFAssembly.from_xml(file_path)
-
-if __name__ == "__main__":
- main(i_breps,
- i_export_dir)
\ No newline at end of file
+ xml : str = assembly1.to_xml()
+ if i_dump:
+ assembly1.dump(xml, i_export_dir)
+ o_xml = xml
\ No newline at end of file
diff --git a/src/gh/tester.ghx b/src/gh/tester.ghx
index a4e26c31..f8cafec0 100644
--- a/src/gh/tester.ghx
+++ b/src/gh/tester.ghx
@@ -49,10 +49,10 @@
-
- 147
- 73
+ 178
+ -118
- - 0.7558541
+ - 1.5
@@ -99,9 +99,9 @@
- - 7
+ - 8
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
@@ -133,9 +133,9 @@
-
187
- 123
+ 113
138
- 64
+ 84
-
267
@@ -144,16 +144,17 @@
-
- - 3
+
+ - 4
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
- 2
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
@@ -177,19 +178,54 @@
-
189
- 125
+ 115
63
20
-
222
- 135
+ 125
+
+ - true
+ - Converts to collection of boolean values
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC
+
+ - 509e66b1-9c06-47bc-9e26-3bcd45a184ca
+ - i_dump
+ - i_dump
+ - true
+ - 0
+ - true
+ - 5de6f2a8-d2d0-49e6-92b4-ae1ed47ccbfd
+ - 1
+
+ - d60527f5-b5af-4ef6-8970-5f96fe412559
+
+
+
+
+ -
+ 189
+ 135
+ 63
+ 20
+
+ -
+ 222
+ 145
+
+
+
+
+
+
- true
- Converts to collection of text fragments
@@ -212,19 +248,19 @@
-
189
- 145
+ 155
63
20
-
222
- 155
+ 165
-
+
- 1
- true
@@ -248,13 +284,13 @@
-
189
- 165
+ 175
63
20
-
222
- 175
+ 185
@@ -282,13 +318,13 @@
-
282
- 125
+ 115
41
- 30
+ 40
-
302.5
- 140
+ 135
@@ -318,11 +354,11 @@
282
155
41
- 30
+ 40
-
302.5
- 170
+ 175
@@ -332,7 +368,7 @@
- - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgoKICAgICAgICAgICAgICAgICMgcGFyc2UgdGhlIGNvZGUKICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCgogICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgcXVldWUgYW5kIGV2ZW50CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYucXVldWVfbXNnX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLmdldCgpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnRhc2tfZG9uZSgpCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgdGhlIGNvZGUKICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRvdXQob3V0cHV0KToKICAgICAgICAgICAgICAgICAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKICAgICAgICAgICAgICAgIGxvY2Fsc1sic3Rkb3V0Il0gPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgICAgICAgICAgICAgICMgc2VuZCB0aGUgbXNnIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogb3V0cHV0LmdldHZhbHVlKCl9KQogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBtc2dfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChtc2dfanNvbikKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKCiAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNjcmlwdCB2YXJpYWJsZXMgdG8gdGhlIEdIIGNvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgICAgICBvdXRwYXJhbSA9IGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0CiAgICAgICAgICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgICAgICAgICAgZm9yIG91dHAgaW4gb3V0cGFyYW1fbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0cCBpbiBsb2NhbHMua2V5cygpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChsb2NhbHNbb3V0cF0pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQoTm9uZSkKCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KICAgICAgICAgICAgcmV0dXJuIGxvY2FscwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgogICAgICAgICAgICAjIHNlbmQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgZXJyX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6ICJlcnI6IiArIHN0cihlKX0pCiAgICAgICAgICAgIGVycl9qc29uID0gZXJyX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChlcnJfanNvbikKICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQogICAgICAgICAgICAKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCgogICAgICAgICAgICBlcnJfbXNnID0gZiJzY3JpcHQtc3luYzo6RXJyb3IgaW4gdGhlIGNvZGU6IHtzdHIoZSl9IgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oZXJyX21zZykKCiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsCiAgICAgICAgICAgIGJ0bjogYm9vbCwKICAgICAgICAgICAgaV9leHBvcnRfZGlyOiBzdHIsCiAgICAgICAgICAgIGlfYnJlcHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0W1JoaW5vLkdlb21ldHJ5LkJyZXBdKToKICAgICAgICAiIiIgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb21wb25lbnQgaGFzIHRvIGJlIHJlY2FsY3VsYXRlZCBpdCdzIHRoZSBzb2x2ZSBtYWluIGluc3RhbmNlLiAiIiIKCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gRmFsc2UKCiAgICAgICAgIyBzZXQgdGhlIHBhdGggaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBzZWxmLmluaXRfc2NyaXB0X3BhdGgoYnRuKQoKICAgICAgICAjIGZpbGUgY2hhbmdlIGxpc3RlbmVyIHRocmVhZAogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgbm90IGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgRmlsZUNoYW5nZWRUaHJlYWQoc2VsZi5wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc3RhcnQoKQoKICAgICAgICAjIHNldCB1cCB0aGUgdGNwIGNsaWVudCB0byBjb25uZWN0IHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgXyA9IFtwcmludCh0Lm5hbWUpIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV0KICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBDbGllbnRUaHJlYWQoc2VsZi52c2NvZGVfc2VydmVyX2lwLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfdGhyZWFkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZ19sb2NrLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnCiAgICAgICAgICAgICAgICAgICAgICAgICkuc3RhcnQoKQoKICAgICAgICAjIGFkZCB0byB0aGUgZ2xvYmFscyBhbGwgdGhlIGlucHV0IHBhcmFtZXRlcnMgb2YgdGhlIGNvbXBvbmVudCAodGhlIGxvY2FscykKICAgICAgICBnbG9iYWxzKCkudXBkYXRlKGxvY2FscygpKQoKICAgICAgICByZXMgPSBzZWxmLnNhZmVfZXhlYyhzZWxmLnBhdGgsIE5vbmUsIGdsb2JhbHMoKSkKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBUcnVlCiAgICAgICAgcmV0dXJuCgogICAgZGVmIEFmdGVyUnVuU2NyaXB0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgY29tcG9uZW50IGhhcyBmaW5pc2hlZAogICAgICAgICAgICBpdHMgY2FsY3VsYXRpb24uIEl0IGlzIHVzZWQgdG8gbG9hZCB0aGUgR0hDb21wb25lbnQgb3V0cHV0cwogICAgICAgICAgICB3aXRoIHRoZSB2YWx1ZXMgY3JlYXRlZCBpbiB0aGUgc2NyaXB0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmlzX3N1Y2Nlc3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIG91dHBhcmFtID0gW3AgZm9yIHAgaW4gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRdCiAgICAgICAgb3V0cGFyYW1fbmFtZXMgPSBbcC5OaWNrTmFtZSBmb3IgcCBpbiBvdXRwYXJhbV0KICAgICAgICAKICAgICAgICAjIFRPRE86IGFkZCB0aGUgY29udmVyc2lvbiB0byBkYXRhdHJlZSBmb3IgbmVzdGVkIGxpc3RzIGFuZCB0dXBsZXMKICAgICAgICBmb3IgaWR4LCBvdXRwIGluIGVudW1lcmF0ZShvdXRwYXJhbSk6CiAgICAgICAgICAgICMgZGV0ZWN0IGlmIHRoZSBvdXRwdXQgaXMgYSBsaXN0CiAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSBsaXN0IG9yIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSB0dXBsZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhTGlzdChnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YShnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCAwLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgc2VsZi5fdmFyX291dHB1dC5jbGVhcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIHRhYmxlX3ZhbHVlID0gZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5HZXRWYWx1ZSgKICAgICAgICAgICAgc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgIm5vdF9mb3VuZCIKICAgICAgICApCiAgICAgICAgaWYgdGFibGVfdmFsdWUgIT0gIm5vdF9mb3VuZCI6CiAgICAgICAgICAgIHJldHVybiB0YWJsZV92YWx1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgQHBhdGguc2V0dGVyCiAgICBkZWYgcGF0aChzZWxmLCBwYXRoIDogc3RyKToKICAgICAgICAiIiIgU2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLlNldFZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsIHBhdGgpCgogICAgICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgIGdoZW52LkNvbXBvbmVudC5NZXNzYWdlID0gZiJ7c2NyaXB0X25hbWV9IgoKICAgICAgICBpZiBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lIGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgXyA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZV1bMF0uc3RvcCgpCgogICAgQHBhdGguZGVsZXRlcgogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIERlbGV0ZSB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IGlmIHRoZSBvYmplY3QgaXMgZXJhc2VkLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkRlbGV0ZVZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUpCg==
+ - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgoKICAgICAgICAgICAgICAgICMgcGFyc2UgdGhlIGNvZGUKICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCgogICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgcXVldWUgYW5kIGV2ZW50CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYucXVldWVfbXNnX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLmdldCgpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnRhc2tfZG9uZSgpCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgdGhlIGNvZGUKICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRvdXQob3V0cHV0KToKICAgICAgICAgICAgICAgICAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKICAgICAgICAgICAgICAgIGxvY2Fsc1sic3Rkb3V0Il0gPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgICAgICAgICAgICAgICMgc2VuZCB0aGUgbXNnIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogb3V0cHV0LmdldHZhbHVlKCl9KQogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBtc2dfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChtc2dfanNvbikKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKCiAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNjcmlwdCB2YXJpYWJsZXMgdG8gdGhlIEdIIGNvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgICAgICBvdXRwYXJhbSA9IGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0CiAgICAgICAgICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgICAgICAgICAgZm9yIG91dHAgaW4gb3V0cGFyYW1fbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0cCBpbiBsb2NhbHMua2V5cygpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChsb2NhbHNbb3V0cF0pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQoTm9uZSkKCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KICAgICAgICAgICAgcmV0dXJuIGxvY2FscwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgogICAgICAgICAgICAjIHNlbmQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgZXJyX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6ICJlcnI6IiArIHN0cihlKX0pCiAgICAgICAgICAgIGVycl9qc29uID0gZXJyX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChlcnJfanNvbikKICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQogICAgICAgICAgICAKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCgogICAgICAgICAgICBlcnJfbXNnID0gZiJzY3JpcHQtc3luYzo6RXJyb3IgaW4gdGhlIGNvZGU6IHtzdHIoZSl9IgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oZXJyX21zZykKCiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsCiAgICAgICAgICAgIGJ0bjogYm9vbCwKICAgICAgICAgICAgaV9kdW1wOiBib29sLAogICAgICAgICAgICBpX2V4cG9ydF9kaXI6IHN0ciwKICAgICAgICAgICAgaV9icmVwczogU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3RbUmhpbm8uR2VvbWV0cnkuQnJlcF0pOgogICAgICAgICIiIiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIGl0J3MgdGhlIHNvbHZlIG1haW4gaW5zdGFuY2UuICIiIgoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICAjIHNldCB0aGUgcGF0aCBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIHNlbGYuaW5pdF9zY3JpcHRfcGF0aChidG4pCgogICAgICAgICMgZmlsZSBjaGFuZ2UgbGlzdGVuZXIgdGhyZWFkCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBGaWxlQ2hhbmdlZFRocmVhZChzZWxmLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgc2V0IHVwIHRoZSB0Y3AgY2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICBfID0gW3ByaW50KHQubmFtZSkgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXQogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIENsaWVudFRocmVhZChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cKICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgYWRkIHRvIHRoZSBnbG9iYWxzIGFsbCB0aGUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgY29tcG9uZW50ICh0aGUgbG9jYWxzKQogICAgICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgogICAgICAgIHJlcyA9IHNlbGYuc2FmZV9leGVjKHNlbGYucGF0aCwgTm9uZSwgZ2xvYmFscygpKQogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IFRydWUKICAgICAgICByZXR1cm4KCiAgICBkZWYgQWZ0ZXJSdW5TY3JpcHQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBjb21wb25lbnQgaGFzIGZpbmlzaGVkCiAgICAgICAgICAgIGl0cyBjYWxjdWxhdGlvbi4gSXQgaXMgdXNlZCB0byBsb2FkIHRoZSBHSENvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgIHdpdGggdGhlIHZhbHVlcyBjcmVhdGVkIGluIHRoZSBzY3JpcHQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuaXNfc3VjY2VzczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgb3V0cGFyYW0gPSBbcCBmb3IgcCBpbiBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dF0KICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgIAogICAgICAgICMgVE9ETzogYWRkIHRoZSBjb252ZXJzaW9uIHRvIGRhdGF0cmVlIGZvciBuZXN0ZWQgbGlzdHMgYW5kIHR1cGxlcwogICAgICAgIGZvciBpZHgsIG91dHAgaW4gZW51bWVyYXRlKG91dHBhcmFtKToKICAgICAgICAgICAgIyBkZXRlY3QgaWYgdGhlIG91dHB1dCBpcyBhIGxpc3QKICAgICAgICAgICAgaWYgdHlwZShzZWxmLl92YXJfb3V0cHV0W2lkeF0pID09IGxpc3Qgb3IgdHlwZShzZWxmLl92YXJfb3V0cHV0W2lkeF0pID09IHR1cGxlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGFMaXN0KGdoLktlcm5lbC5EYXRhLkdIX1BhdGgoMCksIHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhKGdoLktlcm5lbC5EYXRhLkdIX1BhdGgoMCksIDAsIHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkKICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmNsZWFyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgdGFibGVfdmFsdWUgPSBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkdldFZhbHVlKAogICAgICAgICAgICBzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCAibm90X2ZvdW5kIgogICAgICAgICkKICAgICAgICBpZiB0YWJsZV92YWx1ZSAhPSAibm90X2ZvdW5kIjoKICAgICAgICAgICAgcmV0dXJuIHRhYmxlX3ZhbHVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcGF0aC5zZXR0ZXIKICAgIGRlZiBwYXRoKHNlbGYsIHBhdGggOiBzdHIpOgogICAgICAgICIiIiBTZXQgdGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuU2V0VmFsdWUoc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgcGF0aCkKCiAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk1lc3NhZ2UgPSBmIntzY3JpcHRfbmFtZX0iCgogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBfID0gW3QgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpIGlmIHQubmFtZSA9PSBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lXVswXS5zdG9wKCkKCiAgICBAcGF0aC5kZWxldGVyCiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgRGVsZXRlIHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgaWYgdGhlIG9iamVjdCBpcyBlcmFzZWQuICIiIgogICAgICAgIGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuRGVsZXRlVmFsdWUoc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSkK
- S
@@ -369,8 +405,8 @@
-
- 98
- 124
+ 102
+ 97
66
22
@@ -399,14 +435,14 @@
-
- 114
- 176
+ 118
+ 181
50
24
-
- 139.87042
- 188.27032
+ 143.71587
+ 193.00317
@@ -432,7 +468,7 @@
-
- 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
+ 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
- 00000000-0000-0000-0000-000000000000
@@ -440,7 +476,7 @@
-
- 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
+ 7F0JVBRH859druVSUAEvPPA+4oUgHuwOg4jgp0FUFAQVCYoHoqgRlIhH/LyJSZSo0cREo8Yj3ihRgYjGOyrxjBd4xBgVTTwwXvyn166108wA+yn/N8vr33vDbM90z1Z1d1VXV9WwnIrjuEIR6Ixgpxb/hATHDBsV5xsXGxs3qnmdkOj4scPiRnl7tWjbok3bVm3btmjt0apV6+Z1fMePHDc+Ptp7VPT4cfGRI5vXCRo/eOSwqG7Rib3jRkSP8vbwaNPGq3V0+3ZR7Tw8PNxbWaAvqax/dgv/6LjY6HHxiS2E+OjR5uJ1qw9ff41NZHxUzLAPo90/iLWOGx09atT4+MFjzT+IHBeJKmk0GjWi0KERx7URz2HDHOyszcQPFdGfNTkcp36WrOa+FD8gPC9Uc1UwZ7774h40Xanpsvz8mpz9vzT1bPxqQ4cX4v0oXLcNN4Xjt7R/XXDoKv5B5KKn7eWKPq2a46YBPW1PO2a+4hymq9weBFZPdEFPm4HvOyAqEdAZPr/BA12RS6+vZ9JXyLYt0r0upbr244s+7809KI+PnrGrMFk9BcqKY6ZnsONi9zlN9czQxEMZ6hSsfhGlSGb2Te3y0dOgXjw5MpsvH5qU2MbdQDzN8Cj7eXsVyQxNqNQ1ul1B+6yPFMkMjMjO/Q8X31sTJjnN4B6U715ziVYkM1IjQxMPZahz4XF+vsmMDE08rQB8mw6apUhmitNmNDNQ90PvJWaKZAZG4aE2tcO+wcMkpxncg3KkVUyKIpmRGhmaeChDnWzPwpeKZMbxjw92eFaK+dfIJMaHrDQPiDAQT8vQN5du/q1IZorTZjQzULffqLnKnGYwIq8JHi45zeAelHd0fVlXkczIj8wb4qEMdRovW7rSZEaGJp5WAFcTX9ZWJDPFaTOaGagrbFy6XNHMlIv9TGkMTSgHhp+/uSO4Pr/54bMPTMYCoImH+lAe/zzJyWQUAE083a7CiZgDimQGsBHvLqVkBu5BuVf336YrkplyKTMTsT0mJTMjbM+eSk7qYyhf9++tTIdGuZIZ824Fx28Ncs3Cl6aga1/1y3t85GyQYdFcjsvfhDYbnLzNhZ+pPRdlMszEtI6qvj7gfR7f46EM7Q7+cLSHIplZgXubNGfywtYG5jr583AvF5ehTreKBTEmw0zh0YK81tej3sjKsddlNR4pqw899yiSGSwfWbj3s9A1WkbokcpbPXKOIpmBKQRCj66dOJo42OeVn0EV0zKTdiXhqCKZMRCEpxC6BmsOjAztEzj4kHMzGWauZWdEbH7Q2zASebgMdcZw/S+ZjGo+/ctf6XGBkYaRgDLITPfVT/5jMszEeG5J7OwdyRcG4nUGl6GdZucEZYY0cK9nYTnRazN6JGgZGufr4KpIZoBQYEBKZpwcj0x9Hhhk0G7qGnVCFckMFu4srH71I0NbyaC2oV3bnFWtTIYZWnvRttqfYyu9r0hmsOmShYU8i1xIoZ53blfVd63eTLOfe7n5mwwztC1Ga7ck9VFlRgEA/LSIJS1reEsGm+j9ze15tj8rkhkglHQC0gJP+wQGdU7/VJHMFLY7tanzlEh+UnCt7gEjo/XMBN3W9h3nGV3EAoDyCQf3LxTJDBAKDKglBH5eSMT8dlt4Q9l8T9xwRTIDahcWSvIa1KMX0WnWzw8yZsp8ZEDt4q0yeQ3q0dvo827vvTQZZmhbjN553vjxkUqRzGANlYUtZP2ieX7uJT/7fG+D9srBZbCak7bcDTIZZo6F1ejfQAg02GJQhnb5YfnLTcbVtAV7/WEk6Pyz8aGfFJoMMzHNR9Q6wL8ReCiDFd343g9HFMkMloesH173vn6a0TJCj9Sx2Y6DFckMZsIg5Ohas8ANox/N7GrQXkcpmVkUnB+iSGakXE1g2sBI0LbavIm/1TMZZq60bsDf//qNOXMVl2F/s7bZAGWmNVpKuJqcBk49+fv8IYaRgDKMVGbCpXCTYea7tMbfBd+ONGivVbgM7SJrj1umSGZwr2dhudBrM3okaBnq/VePREUyA4QCA+jaJUpmOtZN65Nxs7tBux36M1eZ5gwW9ixssuhHht6MXcBqG9rNiJnmZDLM0NqLttUenFh9VpHMYFMlCwu5nhk6I6Pg1eqgi6s9DSO1IS25wGSYoW0xWrtZLputzHcBklwOx3ZvEMB7pf40p/K3r8OAdHSZ3t8cyA+arUhmQLiBAfIa1Cvirl2fm6Ho3JkO+1I8cxoPkkxrpC2C1eZj7BXJTBVMKJk8Rws81Dc4ztM7KjPYBOY9GJfkthnq0Yan9x3rrYpk5ggmHFZ9kkGoR1sE6qAVmxXJDBiRoI7Ja1CP3kb39tuWZzLM0LYYvfN0Dtb862Wgjz+z/Bm9vOlaGxNYn+DwuBEcLgIOzd4hhwAyztHIroenc8+BfJDV3E4qs2A++PqX8z6824c/MOLX63d9+/ExL/MapdUT+IQdsSEb4rrzLiPuz5MaPsUwR7pw5Jj4+/lV371N+/Ide9bfX2uHlv80OfbEtBk9+VtmjjMUzRw41NC13svCUn9vN4D/s+bKC7FfBfENZ+W0qvdjP/7F9LW5q0+G80ev9cjetbE7zyccuKDp1pfX5h9ZYjIjJzct5Zgeev5bM0UyJ5VfLDctH288uzVVCOOHTegtrHrhzSfh675b9p1RJHNSIyfHhJv2eqWhTUL5M8e3p4UM9+I/wzKXV3l5F5MZOTnFIcdc8B9/cYpkTurtCrmRa7pmrTp3zSA+oWHL9u+PDuJ7Y1lsmfvdBEUyJzUt5Zjwuf9Dm641BvENElI2THDpwTfFCqXPiBSVIpmTyvGXm35rvwnJ98wP5V2Cvx+3NqgTz9UOfm9Fj2A+ZWPFTYpkTirnX27k5JaIJuu9dpoMc3LTT26dC3QaMl+RzEnlarpnxVYZ2S2UDzv305HCzM68T9wxp+pbe/Fbx4al2N8K5WeNcj+WFtiFd8t/5XWtfjD/Y+CYVEUyJxUe3LmyQsLUsf15V/f+fh5egXyEa9YL7sdevNeDuq+ungvjH39523fyxq580lfzL3j59+G5Q5YDFMmcVGa6HHNyI6dumj1akcxJBaka9fGNOT87jI+bMm+C8xAdn7f846CYn4JkteXp2XcyTEbmNp6yOb9uYn9+RWzSthwnge/Qo/JfGdd78c1nFPT8j3M4f8w8f/vsFb58zeN+VWaGBPMBnW7uUSRzUinGciMnx9x6zYVvFMmcVJau3PST06JBmnWdFcmcVKKrnFaUm66Vxnoo0/ySyhWVGyG53ULrZY0GK5I5qXRLuREKqb1tyqkDEfy2aws/ffq7P5+zd33G7o4h/N5qU9wUyZxU+qXceianaFzudvhAmcxJJP3JaUW5xX2vc/AGRTInlTfn6tB0+3GrcH5O2s9Ne23uxrvt//Lzox+F8MuznVvErQznt3X3am7TsTuv9v0l7XNxtKu2CWhgMrblpHaLwrqOjOALErP2x3m9z7sVFLw4ubePrGvv/KoLGxXJnFT2lhxzciN38nLLyopkTsq2PJPz9bP4yAH81UTLzzeNCeC3drqSN/2H3rLaskG9bjcVyZxUDlHbz1tvXJcygC+o4Np0wI0A/u8xZ8z/0fTlt3Wp1eg/TQfy9VanNHOK68bnPLBq/NOkPvwSj6pdFcmcVBqO3MjJMfdtX/V6RTInlckiN/3ktOgdqx69FMmcVDKInFaUm67DPb2vKpK58xL5FHIjJGdQj99ee6YimZNKSZAbITmv2Fw+VZmxgmMSKQpy65mcomnzURVrRTInFRiX04pyi7tHk5odSObuH0u2QIFyfwdMcAWC42qqohy7HBrkf53geH3jlAzEcZ4cx2X938HAXjP/H6KVxsale23MOic1NRTTUVKxMqmOMpZxY4OJ32jaJym6o6TiblIdZSzjxoa3Gg5/kqrojiruvz+RHWUs48aK6tW/Nm1SdEcVp6MMr8SKn+UYl+tAY5MUlpmn1yoXHSU3E+RmlLE5AZHznrubbEeRonfhgZubh2U//ocUG7+cvN78h03PfXdZG8JbTm05zeJeCN91lds17Ue9+MAT9oFz7EL5Y3+YTY6/E8Z/YKv5b8zkdvzZW/4pC86/z/+T4HBFyAnlT0bGPKt+tzWfuTjszqP0YL7qusr3yoUyX6pxj8iwjOAPeH68d8NBd14zZfQ3SQFB/MHFur0p9/rzg6ofjsoY3py/VH+NXxOXXvz3DsGqqXXD+P8uuR1c71Ev/rO0elylZSH82RUDIntqQvk6m1QPPvkkmB/SP2xVxrBQvmb9mBWK7qjSip7cjJLrELkZJdfhT8P5QpPtKHJGWdef9cTctTefsOleG9e8vvzmsMyMX91DeM/tC0POmInhkwMWJ2cnhfAfFz4ePEUVysdPmZlw+lokP7JBm3FPxnbkV/2UMsfpWi9+9qH5azuFRPLnJ332x9o8Dz5hyIEW+zaF8KcSBuWVC9F76nrlheaTwfzJzMEuu1914vcsOtS14tLefMUhN5qPUQ/mOzlnz40d2Y5f0KHw7u6hfflKAz0KY8f34R3Opvf/RVz9DrX4J+n4nRBed99noDa8N7/hzqmnHa6G8Mt+bVl3Ynoov6Dr34cV3VGlFT25GSXXIePwjIqhZpRchz+/9tXdctFRzDxQaEdNWrwsGLkUbpvjWVIV35CzfGEWobMNwQSakXLWrxlRx5yaQXIMmOH6luIBUxy+V66TzPAz0dmWaFPc3tAM37cQDyuiDSrLdaIZvo9osybaoLLczsAMP19D9Ru6Jje4Zrg+4qUu0UZTTPgctbHDfVaJaGNdTOAW2iB3kjPRBtEpF/dEbexxGxeiDaJVzs0KbSqLRx2iDfpuueCx/sfBxMORos2+mOQPaGNN9UGFYiLzqA1yqzlh+gAVi4kJQxtHqg8cinFBozZVMf+1iDaOxTg/oU118XAj2iDe5HyHqE013KYe0aZyMb5/aINkCL+LoweaS3IOWNSmBuKXos2pmAAKtHGi+sC5GO82alMTywFJm0sxflVo40r1wbApNYYipdfEhnjhSArk/y9Dygi0tkMxdVE9vDwXMa7gGehQUQqHriu1PMObLGZ4IKEOqSCl6prJfAf6TCpN+2LoMSeUN+25BMWOnmOOJzMnUxcpTotivsMCP8eCUuJ0XaRsLWW+A9rrY7J4osnRY0WMA20gm+P2aqx0SWVC10X3NcXQaoWfY42Vihxf1sSiQqetW+AxQs+xoRQiXdeGWGhovyD0mxorX1Lh0XVtiXGg71kR84deCOi66HvQwUnkYGowz2qs6JAS4mTq2hPzlE4DscG0qrHiQ0qGk6mL6EUHJ5HNa0PQAwqEk6lbUWI8IbnBjhivWpTious6EHqF5rkC/g41XjhIY4Cu60jIH50Oakc8x41SinTdSsR8pzMvEU8a/JwG4kHqT7puZWJ+0UmOaKwq4Oc0Eo+GxHPoulUIPUfnEwIt6GgsHk2I59B1nQh9QKfuVcD30HOaikcz4jl0XWdC/ugsOTR37PBzmovHe8Rz6LouhNzQCWlorGwgWiQeLcnnUHWR3IDxTud+gZGCntNKPFoTz6HrViPkj5aZSsS6g36+1Z14Dl0XyR86OImMpkoEPW3Fw4N4Dl23BiXHpMxUIcbLUzzaUfXIukiO0cFJ5Ok44zFAz/ESD/wrspJ1XQl9QKfEVCGe00E8OhLPoevWIowfOvsE8eSAn+MtHp2I59B1axN6hU70QGPljJ+D9vVa4jl03TqEUU7nVDgQehUZDT7Ec+i6dQn9RKcvOBProCAevsRz6LpuhEFJZwqguVMFP6ezePgRz6Hr1iP0HB2UR2NVCT+ni3j4E8+h675/s+Z4vdGIFB78xDAN+h/egiEIhlFxoNuWFrTBSRqbpNEKRlFxkPuZ2JKgLub3dNEkhN08GGRSoNsaSwNt6AIv5HWggTaI31U/gJFMG5nmlPcD5gO9UeAk2hpLA21gAy/oGhjYQIOFDA10W2NpAOOc5sWSMMzJ+VAW/UAa9iQv8L2kfMD8fNf9AJsCerOA6ILNBTkfivpji7Y1lgZyQ0HyguiCjQnQAGPzrvsBNiP076AiuuyJeQjzQYoGuq2xNJAbGZIXkBdzaj6URT/AJojeHNlQehHmg5SeotsaSwO5gaL1JAIZJ7AoQVf+r/0Amy+pzSZ4Ssn5UBb9QG/cSLmwIvQSzIey6Ady01ca+6E4G6K062aOq/tXe5/eLIQzbBhLs2aBnLytrqZpgM1mafSkpQwNxupJmgbYqJZGNiFq8LZzkqaB3OTSvxYJTj+gwVzGYUe3NZYG2CBLrd2kDQmfLcpgPsDmmnZqofUCnGBAA9gUNOi2xtIAG3MpHQWOL64E5+nbzgfY1NNOHrSGgNMMaJCzX+i2xtIADoHS0mBZBjSAM4F2MqA+B6cfSYMU6LbG0gCOiNLSYFUGNIATg/6Vvwp4HBAdZJBBCnRbY2kABwjtCEU0gOMU+oGTcIpzEm2NpYF0npBOHrSeg9MVaCD3wFKAtsbSQDpeSkODZRnQAE4bWr6QTQFO45L64W1lExw+paXBqgxoAGcR/XtxyK6B8SDlQqof6LbG0gCOJtqRjmiwo/pBTi7otsbSgBzx9SWc8Mi2Aqc9SYPUukm3NZYG5B9rUEoa5PxBb0sDCiQ0lAgiIPsJgg5kP5D7YwDd1lgaUECjUSlpUMvIxdvSgIIh6KB/eQycp5pS+OXotsbSgIIxTSQCMYgGCNyQNq3UnKTbGksDCuY0lfidL7B1K5TC/0C3NZYGFExqJhFIgu+HoBTQIDUn6bbG0oCCUc0lglDI1oagFdBA7rtI0G2NpQEFw94zggZNGdCAgmktJIJoyN6HoBtJg5Rs0m2NpQEF81qWkgZLuX54SxpQMLCVRBAQ7TkgaFiSXU23NZYGFIxsbQQNNmVAAwpmtpGwz9G+B4KeJfXD29r2KJjqbgQNtmVAAwrGtpX4NaTqeBwqlWJ/Qbc1lgYUDPaQCAQjGiBwDP3AEfqCBN3WWBpQMBkdtH2O9n8QdC7r/UU7KqBdEg02ZUADCoZ7SQTB0R4UguYl9QPd1lgaUDC+vRE02JYBDSiY30Hid3Vc8fdXKcX+gm5rLA0omaCjRCIBoqEK1Q9yckG3NZYGlIjQSSIJAe3FIWmBpEHKhqHbGksDSojwLiUNkCj3rmlAiRRaiSQK5A+ApAuyH6R8g3RbY2lACR26UtKglpGLt6UBTSBe4hda6uDvcyjF/oJuaywNKBnFR+KHVRANkLgC/aB/aUfimXRbY2lAySyCxO+h1MW2o3Mp9hd0W2NpQMk0vhKJNIgGSLzhCBqk5iTd1lgaUDJOZ4lfH0G+GUjaIcdCSjbptsbSgJKB/CR+NESOBik9Sbc1lgaUTNRFIokI+Ycg6YikQUo26bbG0oCSmfxLSYOlTD+8LQ1zUqpboaQpazXxH0s4/GWtsLHZhkrKUWGnBdoAoEUeGX48YXhDUBKcBZDEQCZ02GEDDm36kSJAg1+LcNRD4ELABk4HKtgLEwNecamI78M9c2JzAsY50AVB0vrY8eFEKACg1xw7yarhDXltwkkMQc8a2IFUF29WwXmqwfdd8Ua6Ht5Iqgi+zPFC7YMdYc3wfQgSmONFtDUW2HaEEWmL77vjBaY9nsxgXNnh+x5Y0DriiaYi+swcL5C+lIGE7k0oSNW/ftEeTwpHmBRSOysYVDrLjbQ4SW0KmTx0xJ6MZpOZV5B5YkFJAET/IZMJ6sNEg+wiuA6eNPo1AGui40mNC5EaiJjAc2yJjoY6HOHBtqO0hT3RsSVl95Un1PlidkV4dxDez4P3DeEdPHh3Ed6nQ5OuAtI6IlToPdrO5kXfo71x+lwP/9u/OmbefP0e7XvpNcLRe7R2uK6HHbVuTYiyb+m3KMPw3uyCXrXC+jrdNZRpnyXszeE6lP/sky48WvvYZ/BHI4Rts54JNlUXCNVPHRA11BTxWYYjkzj+da1QhAqxmIq/SL9BlHodCeE935p3rnlWL/K2r9SrTQgzO98KrNr3rO71OU3fTi93S5cg3NZx+u8Go5PUla/F0zLCdnMz9+Pz4K4tZ2NjJfajirO1tTVXqaxtNBpLK7WaU1tZmVmq1ZZmFhY2VhrNArHuosa3J+kf/zV+fMJvqgVcXOFWsZusxW7aEbVJ8Mz8Sxj18GOhmthlQ2vvEza7OgpRYlfeEbv1sditzs3nCe1m/C4cjI0V/Pv9KET2PyK8KmwgnFywXIj1OiGk9WkjODb6VLBbdlH4/qeegtXJ5YIq86zw1wg/4ef264RR2lxhybQIITx/mzCxxk2h5/lhwvKP1wi+g+8IydmJwqz8jULWDuHQ0vMeGxHNTc7P+UpPMySdJ/z2Zfa19MxVfr9M9ju8z36spaoG5xvC/+P/PGL7IPH+/lXPrnFN1j1CatkAVN69bpC+u+GcfL6NPpE7Prembu/wmd5wvu14Tn8dzieHz9Wi63CGdjAC+1bPSl8ducZvXf7Se5MfXXdG1r9XpMM6PdVDDFRHDcqqoJ5uPrTqhGHt/7i3fZd7d899qoYVrmffaHfJu2fEsA/sbp2Ym/D08ekdnFdyi4WZrYI7fj95267s7LVOAyp2vuzqzP9TcUXS4mc1Lk8IT7x6Yd8/X4ilV/ODng9K4u4+FRZV+t1HvxysIkiTIq9h7fi6xb+jTuPd10N0VVRXeyiefkty+/d/nkMKpaNZ6RWKGa7rAcvRdsspMbvic3X1tkVWiOx5Q3fY/5LNs7TDuhq9Z43deihHJ5dUAwoE3iMnFcq24Gy9QtlZJUfYIkqEiygF5VShqDi1GVLuT0bMf8HJaYA0sR9q37zvg6536HZY2C72D7qOGg7Vnj/BaR9ZZI690iTzUZ4mszSfkXGZPzv+Z04z1013cmd3bfYiM/0ZlRf6perL6GyYJxJTGw1ls486fl5kraDXCHrooWzw95qeHKVWbLG4iBzpkw9LKUcacmHWwIL8OEOH5m/hw/s6u/mC27WdN3ST2tc/NCf1D51coqDcwtxenCcgR2qdhe/EadPL88JswVlZWYumrYqzsLAQF2ZLK2uNrTVamK2t1WY2tmhxU9dqLUgtyHLipRK7LVHsNrRQC79xvnt2j9Yv1LvGnBCEGdd8VOM/E/b3OC1sbfXcR7D9r9D3zEVh0Q8OQoHr10LU1lyhu7mr4LX9M2F+i3xhfzudcOXyFmGJ7UMhaX43ofa474SQ8Y+EB27vC4f8dwmDg/8R1ib0F6yvrBd2x+umnev7+9eI5k+em9ctuiAPG5jjtjPZ77Awvf30KfbcEq8O/6T/NqIJWpAn+w/5RFyAC7wdMxvo0Dlke2cdtyJZh8rojMpHT0Ro4XzpU3fd1dRT+jI6o/LJK6319dAZlateCdSX0RmVyaGUWpCnDa+5XU/1cAPVFyffeDhv59GVNauuGNRxYe2q9b2yd3U7mrftctv1vgFLRidWrd1wYGiVtMUH3J1/2TTtb5cuwxudiXOesCs+//ovSZs67+o0L5NrWvtBTos9+5s7tah4PfvR3J/bDUg4+6XlFzP/ivybC98bcOZ0ZM9wE1QmtkOzf/r/WJTTdcEff5t3a8chnVyGp9yi7CGaqbvF2b9dlASkTMq5lQ+L8qtEq3ROTgvImfGoYUjF9+6hRVknLrg6ccHVleYzWpRHHUrcjBfl496vF+Xj3qis2+SnX5TR2TBPZBblc1PPxhiSeKEy/QPX9NBD2YQX5dy6e++9WzmiF+XUI/uqJvz5h27LtRMnKuXdkd0tg/zAdSgPEQ28WuJKA4sykqM0cf6UVzkyU+v9pdWDwgI4Ul5ImSKNXnIlRg2jbjw8w6V8/L02o+CsNrt3v8zSfEZyFFn90Vj9KvhTL3/9KpiqGahf/VAZnfVlAlJydPLERSkXt/QQ01PB8NvrpidHd/x+sSwiRzoj5MiKlCM0NSqsihjrPv2MLrXW0Jyp2uu6cx4NZnUM+FVXYYjuyWjPCzq5TDnoRMjigzJsEp1EKy1dtMYKRZfIKdElUm7lSKyhUquRSAxZmL2YI91A5EaRtF5JKxU1DD5jWYBkKUOUkwxRTnSl+Yxk6fbB+Ye5ZdU2aC8FLNVWfFRNB+dZ2w5r/xyu0p9LkqVPxszvakiIhIolyc4I27OnkpP6mLIseexvvPLdrklfF0w6PmdVnu7SV39Udc25hW27C7rPd7vMXFx4WSeXZYiz1fn0DW2FES09eCgPEueSjzhPfMQdzAFxN7NTdCmWa1l6vSZ9a/59b450oZIyRe7qaDnaWyFqDRc1IFYXbLupU5fRmdrSfEZyNPzzftO4kPr2yKbTovP+F/e1txdo9WV0RuWS5GjrrMPdDYmkUBHKMKT00EMZ7pugHEU3jIkvGzm6guXoaaM+vyeHX9Hlde/a+pPgPB1kqXLH/p2lqsadmIXliINOFd3uC8Xdfztxx/+BuPtfJ7rjD4ou+HIqR+J6pJejZMsVNhzp7SDDD2RYgvSOoIbzdKkzkBxlijKyR5SRjNJ8RnK0YlDoM70cFV7/Wy83Exfa6NAZldF1VC5Jjqp/27maIRHZUBMPNQwxPfRQX226clSl4uSh79a2gz1Sg6FeZ17cv2Ig6mJWzK4z23fqThxNHOzzyq+IUoJFvWC3WWjt676GRX6kqJO3iLoXrUcgRxpx/pRXOeLUarXKTO9vmNzrvVMcKTPkOkSuVaS8vZVt99/DCaP1+6QfVu/1vpVcoF9/9q1eqD9vyl6hRddLkiV1rOVeDoYZhpEebnrNcnI8MvV5YJAp23ZDAkL4spElT7fLpw7YX9JVNr+Vq56ap2tR89EXyyfc0EHGn3duV9V3rd4Y0tCJKRNXDvQd7vOmU/Ga9ETUuSmiF3qpGAqOEEPB5VSW1GifpFapkEjsbL5yHUeGv8n1h1yjSO/8W8lS4y9HX9fLkovGTtdyVK723p56uoIts7Wo/MSxpr5ckiwld+y0wpDYCRVhuGFY6YTPeSER89tt4U1ZlhZmj80pG9/dKe/wv5cXHjUEpjd98f3UGvVP6eBfrl2lsiXBSA4Mb7Sw0YQGBqM5VpxL2eI8qSVGbpaKUZxgMZWiHMsS7JPCOo8Zy5GpI6RMkdEsWo6sTn90lBNqNdHF/Mda5znRUuy5kj8jOfI+dWqWXo5QQBqdL9WZrX3wYqAWldEZlUuSo4zu9dYa/qseVIQyDCk99FA24X3SyvkHykiOjvxLjtJ1CbY3X6aPPKCTy7aFt3e8sRzBPslTTGe6L0Y9NWKkM0qMek4R05C6iqlN5VSOxPVIL0d7Mu3acmSUl0zBIlO8yKgwauh5c9ZtJEeZooxkijKSWZrPSI4yf//2QyxHx71fyw8+RzfTyxU6lyRHE4f6vjQkVENFeqihDEMO9VWmK0f3+2lnvFs5Ah9459MT8mJGXzT47QI8Ft7+9lWurlnghtGPZnYtkr0Pi/r+r6573xnYnA/A5URRJ08SdS9aj0COZotzqbzKEafW23U9e67w4EjZIdcgcp0iZe2t7LrQac+H6P3fyE/nP/2i1uWxlQ6dfc5e1qLrGUf1r1YZGJGSo8HP8hdzMMQwpPRQw0skUO5YN61Pxs3upmzXWaekf18261GTSrvH2vc5aogldfXRNNqgyzUQWfBqddDF1Z5F5Ogpvg5lWI8OivrWV4zvx4lx/HKc24AWJCQOfl9UCuXIvAUyt4Fcg8i16a3kaMyx3Y25kWvD9HEkvV2Hz5EvVTp0PfjSwxLl6MKTKadluopwKVFDXOSfypmeHC1/8TKSlKPwIPcExAb54w5vcDBx9ynUOLXzun/9SK58OJuBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBwbTxfwAAAP//AwA=
- 00000000-0000-0000-0000-000000000000
@@ -527,14 +563,14 @@
-
- 115
- 149
+ 118
+ 154
50
24
-
- 140.13669
- 161.41502
+ 143.98213
+ 166.14787
@@ -651,6 +687,38 @@
+
+
+ - a8b97322-2d53-47cd-905e-b932c3ccd74e
+ - Button
+
+
+
+
+ - Button object with two values
+ - False
+ - True
+ - 5de6f2a8-d2d0-49e6-92b4-ae1ed47ccbfd
+ - Button
+ - dump!
+ - false
+ - 0
+
+
+
+
+ -
+ 68
+ 127
+ 102
+ 22
+
+
+
+
+
+
+
@@ -658,7 +726,7 @@
-
- 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
+ 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
From 9db6763cab1b78d1721baafbf2b4a33d68b61b78 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 14:22:47 +0200
Subject: [PATCH 013/141] WIP: testing componentizer action
---
.github/actions/ghpython-components/README.md | 1 +
.../actions/ghpython-components/action.yml | 32 ++
.../ghpython-components/componentize.py | 396 ++++++++++++++++++
.github/workflows/gh_build.yml | 38 ++
README.md | 1 +
src/gh/components/xml_exporter/code.py | 49 +++
src/gh/components/xml_exporter/icon.png | Bin 0 -> 5660 bytes
src/gh/components/xml_exporter/metadata.json | 68 +++
src/gh/{ => diffCheck}/README.md | 0
.../__pycache__/__init__.cpython-38.pyc | Bin 132 -> 0 bytes
.../__pycache__/geometries.cpython-38.pyc | Bin 3939 -> 0 bytes
src/gh/diffCheck/{ => diffCheck}/__init__.py | 0
.../{ => diffCheck}/df_geometries.py | 0
.../{ => diffCheck}/diffCheck_app.py | 0
.../{ => diffCheck}/joint_detector.py | 0
src/gh/diffCheck/setup.py | 18 +
src/gh/tester.ghx | 78 ++--
17 files changed, 642 insertions(+), 39 deletions(-)
create mode 100644 .github/actions/ghpython-components/README.md
create mode 100644 .github/actions/ghpython-components/action.yml
create mode 100644 .github/actions/ghpython-components/componentize.py
create mode 100644 .github/workflows/gh_build.yml
create mode 100644 src/gh/components/xml_exporter/code.py
create mode 100644 src/gh/components/xml_exporter/icon.png
create mode 100644 src/gh/components/xml_exporter/metadata.json
rename src/gh/{ => diffCheck}/README.md (100%)
delete mode 100644 src/gh/diffCheck/__pycache__/__init__.cpython-38.pyc
delete mode 100644 src/gh/diffCheck/__pycache__/geometries.cpython-38.pyc
rename src/gh/diffCheck/{ => diffCheck}/__init__.py (100%)
rename src/gh/diffCheck/{ => diffCheck}/df_geometries.py (100%)
rename src/gh/diffCheck/{ => diffCheck}/diffCheck_app.py (100%)
rename src/gh/diffCheck/{ => diffCheck}/joint_detector.py (100%)
create mode 100644 src/gh/diffCheck/setup.py
diff --git a/.github/actions/ghpython-components/README.md b/.github/actions/ghpython-components/README.md
new file mode 100644
index 00000000..ae5089b1
--- /dev/null
+++ b/.github/actions/ghpython-components/README.md
@@ -0,0 +1 @@
+This action was implemented from the [compass componentizer](https://github.com/compas-dev/compas-actions.ghpython_components/tree/main). We retain no credit for the code, and only modified it to work with our own repository.
\ No newline at end of file
diff --git a/.github/actions/ghpython-components/action.yml b/.github/actions/ghpython-components/action.yml
new file mode 100644
index 00000000..2649c0a9
--- /dev/null
+++ b/.github/actions/ghpython-components/action.yml
@@ -0,0 +1,32 @@
+# This action was implemented from the [compass componentizer](https://github.com/compas-dev/compas-actions.ghpython_components/tree/main). We retain no credit for the code, and only modified it to work with our own repository.
+
+name: 'Grasshopper componentizer'
+description: 'Create GHUser components from Python source code'
+inputs:
+ source:
+ description: 'Source directory where code for all components is stored'
+ required: true
+ target:
+ description: 'Target directory for ghuser files'
+ required: true
+ prefix:
+ description: 'Add this prefix to the name of each generated component'
+ required: false
+runs:
+ using: 'composite'
+ steps:
+ - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json
+ shell: pwsh
+ - run: |
+ $command="ipy"
+ $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib"
+ $prefix="${{ inputs.prefix }}"
+ if( $prefix )
+ {
+ $params=$params + "--prefix", "$prefix"
+ }
+ & $command $params
+ shell: pwsh
+branding:
+ icon: 'box'
+ color: 'orange'
diff --git a/.github/actions/ghpython-components/componentize.py b/.github/actions/ghpython-components/componentize.py
new file mode 100644
index 00000000..d737904e
--- /dev/null
+++ b/.github/actions/ghpython-components/componentize.py
@@ -0,0 +1,396 @@
+from __future__ import print_function
+
+import argparse
+import base64
+import json
+import os
+import re
+import sys
+import tempfile
+import urllib
+import zipfile
+import StringIO
+
+import clr
+import System
+import System.IO
+
+GHPYTHON_SCRIPT_GUID = System.Guid("410755b1-224a-4c1e-a407-bf32fb45ea7e")
+TEMPLATE_VER = re.compile("{{version}}")
+TEMPLATE_NAME = re.compile("{{name}}")
+TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}")
+
+TYPES_MAP = dict(
+ none="35915213-5534-4277-81b8-1bdc9e7383d2",
+ ghdoc="87f87f55-5b71-41f4-8aea-21d494016f81",
+ float="39fbc626-7a01-46ab-a18e-ec1c0c41685b",
+ bool="d60527f5-b5af-4ef6-8970-5f96fe412559",
+ int="48d01794-d3d8-4aef-990e-127168822244",
+ complex="309690df-6229-4774-91bb-b1c9c0bfa54d",
+ str="37261734-eec7-4f50-b6a8-b8d1f3c4396b",
+ datetime="09bcf900-fe83-4efa-8d32-33d89f7a3e66",
+ guid="5325b8e1-51d7-4d36-837a-d98394626c35",
+ color="24b1d1a3-ab79-498c-9e44-c5b14607c4d3",
+ point="e1937b56-b1da-4c12-8bd8-e34ee81746ef",
+ vector="15a50725-e3d3-4075-9f7c-142ba5f40747",
+ plane="3897522d-58e9-4d60-b38c-978ddacfedd8",
+ interval="589748aa-e558-4dd9-976f-78e3ab91fc77",
+ uvinterval="74c906f3-db02-4cea-bd58-de375cb5ae73",
+ box="f29cb021-de79-4e63-9f04-fc8e0df5f8b6",
+ transform="c4b38e4c-21ff-415f-a0d1-406d282428dd",
+ line="f802a8cd-e699-4a94-97ea-83b5406271de",
+ circle="3c5409a1-3293-4181-a6fa-c24c37fc0c32",
+ arc="9c80ec18-b48c-41b0-bc6e-cd93d9c916aa",
+ polyline="66fa617b-e3e8-4480-9f1e-2c0688c1d21b",
+ rectangle="83da014b-a550-4bf5-89ff-16e54225bd5d",
+ curve="9ba89ec2-5315-435f-a621-b66c5fa2f301",
+ mesh="794a1f9d-21d5-4379-b987-9e8bbf433912",
+ surface="f4070a37-c822-410f-9057-100d2e22a22d",
+ subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08",
+ brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d",
+ geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26",
+)
+
+EXPOSURE = dict(valid=set([-1, 2, 4, 8, 16, 32, 64, 128]), default=2)
+ACCESS = dict(valid=set([0, 1, 2]), map=dict(item=0, list=1, tree=2), default=0)
+PARAM_TYPE = dict(
+ valid=set(TYPES_MAP.values()), map=TYPES_MAP, default=TYPES_MAP["ghdoc"]
+)
+WIRE_DISPLAY = dict(
+ valid=set([0, 1, 2]), map=dict(default=0, faint=1, hidden=2), default=0
+)
+
+
+def fetch_ghio_lib(target_folder="temp"):
+ """Fetch the GH_IO.dll library from the NuGet packaging system."""
+ ghio_dll = "GH_IO.dll"
+ filename = "lib/net48/" + ghio_dll
+
+ response = urllib.urlopen("https://www.nuget.org/api/v2/package/Grasshopper/")
+ dst_file = os.path.join(target_folder, ghio_dll)
+ zip_file = zipfile.ZipFile(StringIO.StringIO(response.read()))
+
+ with zip_file.open(filename, "r") as zipped_dll:
+ with open(dst_file, "wb") as fp:
+ fp.write(zipped_dll.read())
+
+ return dst_file
+
+
+def find_ghio_assembly(libdir):
+ for root, _dirs, files in os.walk(libdir):
+ for basename in files:
+ if basename.upper() == "GH_IO.DLL":
+ filename = os.path.join(root, basename)
+ return filename
+
+
+def bitmap_from_image_path(image_path):
+ with open(image_path, "rb") as imageFile:
+ img_string = base64.b64encode(imageFile.read())
+ return System.Convert.FromBase64String(img_string)
+
+
+def validate_source_bundle(source):
+ icon = os.path.join(source, "icon.png")
+ code = os.path.join(source, "code.py")
+ data = os.path.join(source, "metadata.json")
+
+ if not os.path.exists(icon):
+ raise ValueError(
+ "icon missing, make sure icon.png is present in the source bundle: {}".format(
+ source
+ )
+ )
+ if not os.path.exists(code):
+ raise ValueError(
+ "code missing, make sure code.py is present in the source bundle: {}".format(
+ source
+ )
+ )
+ if not os.path.exists(data):
+ raise ValueError(
+ "metadata missing, make sure metadata.json is present in the source bundle: {}".format(
+ source
+ )
+ )
+
+ icon = bitmap_from_image_path(icon)
+
+ with open(code, "r") as f:
+ python_code = f.read()
+
+ with open(data, "r") as f:
+ data = json.load(f)
+
+ if "exposure" not in data:
+ data["exposure"] = EXPOSURE["default"]
+
+ if data["exposure"] not in EXPOSURE["valid"]:
+ raise ValueError(
+ "Invalid exposure value. Accepted values are {}".format(
+ sorted(EXPOSURE["valid"])
+ )
+ )
+
+ ghpython = data.get("ghpython")
+ sdk_mode = ghpython and ghpython.get("isAdvancedMode", False)
+
+ if r'"""' not in python_code and sdk_mode is False:
+ python_code = r'"""{}"""{}{}'.format(
+ data.get("description", "Generated by Componentizer"),
+ os.linesep,
+ python_code,
+ )
+
+ return icon, python_code, data
+
+
+def parse_param_access(access):
+ try:
+ access = int(access)
+ except ValueError:
+ # Maybe string?
+ access = ACCESS["map"].get(access)
+
+ if access not in ACCESS["valid"]:
+ raise ValueError(
+ "Invalid param access value. Valid values are {}".format(
+ sorted(ACCESS["valid"])
+ )
+ )
+
+ return access
+
+
+def parse_wire_display(wire_display):
+ try:
+ wire_display = int(wire_display)
+ except ValueError:
+ wire_display = WIRE_DISPLAY["map"].get(wire_display)
+
+ if wire_display not in WIRE_DISPLAY["valid"]:
+ raise ValueError(
+ "Invalid wire display value. Valid values are {}".format(
+ sorted(WIRE_DISPLAY["valid"])
+ )
+ )
+
+ return wire_display
+
+
+def parse_param_type_hint(type_hint_id):
+ type_hint_id = type_hint_id or PARAM_TYPE["default"]
+
+ if type_hint_id in TYPES_MAP:
+ type_hint_id = TYPES_MAP[type_hint_id]
+
+ if type_hint_id not in PARAM_TYPE["valid"]:
+ raise ValueError(
+ 'Invalid param type hint ID ("{}"). Valid values are {}'.format(
+ type_hint_id, sorted(PARAM_TYPE["valid"])
+ )
+ )
+
+ try:
+ type_hint_id = System.Guid.Parse(type_hint_id)
+ except SystemError:
+ raise ValueError("Unable to parse type hint ID: {}".format(type_hint_id))
+
+ return type_hint_id
+
+
+def replace_templates(code, version, name, ghuser_name):
+ if version:
+ code = TEMPLATE_VER.sub(version, code)
+
+ code = TEMPLATE_NAME.sub(name, code)
+ code = TEMPLATE_GHUSER_NAME.sub(ghuser_name, code)
+
+ return code
+
+
+def create_ghuser_component(source, target, version=None, prefix=None):
+ from GH_IO.Serialization import GH_LooseChunk
+
+ icon, code, data = validate_source_bundle(source)
+
+ code = replace_templates(code, version, data["name"], os.path.basename(target))
+
+ instance_guid = data.get("instanceGuid")
+ if not instance_guid:
+ instance_guid = System.Guid.NewGuid()
+ else:
+ instance_guid = System.Guid.Parse(instance_guid)
+
+ prefix = prefix or ""
+
+ root = GH_LooseChunk("UserObject")
+
+ root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID)
+ root.SetString("Name", prefix + data["name"])
+ root.SetString("NickName", data["nickname"])
+ root.SetString("Description", data.get("description", ""))
+ root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"]))
+ root.SetString("Category", data["category"])
+ root.SetString("SubCategory", data["subcategory"])
+ root.SetGuid("InstanceGuid", instance_guid)
+ root.SetByteArray("Icon", icon)
+
+ ghpython_data = data["ghpython"]
+ ghpython_root = GH_LooseChunk("UserObject")
+ ghpython_root.SetString("Description", data.get("description", ""))
+ ghpython_root.SetBoolean("HideOutput", ghpython_data.get("hideOutput", True))
+ ghpython_root.SetBoolean("HideInput", ghpython_data.get("hideInput", True))
+ ghpython_root.SetBoolean(
+ "IsAdvancedMode", ghpython_data.get("isAdvancedMode", False)
+ )
+ ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0))
+ ghpython_root.SetString("Name", data["name"])
+ ghpython_root.SetString("NickName", data["nickname"])
+ ghpython_root.SetBoolean(
+ "MarshalOutGuids", ghpython_data.get("marshalOutGuids", True)
+ )
+ ghpython_root.SetString("CodeInput", code)
+
+ # ghpython_root.CreateChunk('Attributes')
+ # for mf in ('Bounds', 'Pivot', 'Selected'):
+ params = ghpython_root.CreateChunk("ParameterData")
+ inputParam = ghpython_data.get("inputParameters", [])
+ outputParam = ghpython_data.get("outputParameters", [])
+
+ params.SetInt32("InputCount", len(inputParam))
+ for i, _pi in enumerate(inputParam):
+ params.SetGuid(
+ "InputId", i, System.Guid.Parse("84fa917c-1ed8-4db3-8be1-7bdc4a6495a2")
+ )
+ params.SetInt32("OutputCount", len(outputParam))
+ for i, _po in enumerate(outputParam):
+ params.SetGuid(
+ "OutputId", i, System.Guid.Parse("8ec86459-bf01-4409-baee-174d0d2b13d0")
+ )
+
+ for i, pi in enumerate(inputParam):
+ input_instance_guid = System.Guid.NewGuid()
+ pi_chunk = params.CreateChunk("InputParam", i)
+ pi_chunk.SetString("Name", pi["name"])
+ pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"])
+ pi_chunk.SetString("Description", pi.get("description"))
+ pi_chunk.SetBoolean("Optional", pi.get("optional", True))
+ pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True))
+ pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True))
+ pi_chunk.SetInt32(
+ "ScriptParamAccess",
+ parse_param_access(pi.get("scriptParamAccess", ACCESS["default"])),
+ )
+ pi_chunk.SetInt32("SourceCount", 0)
+ pi_chunk.SetGuid("InstanceGuid", input_instance_guid)
+ pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID")))
+ pi_chunk.SetInt32(
+ "WireDisplay",
+ parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])),
+ )
+ pi_chunk.SetBoolean("ReverseData", pi.get("reverse", False))
+ pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False))
+ # Mutually exclusive options
+ if pi.get("flatten", False):
+ pi_chunk.SetInt32("Mapping", 1)
+ elif pi.get("graft", False):
+ pi_chunk.SetInt32("Mapping", 2)
+
+ for i, po in enumerate(outputParam):
+ output_instance_guid = System.Guid.NewGuid()
+ po_chunk = params.CreateChunk("OutputParam", i)
+ po_chunk.SetString("Name", po["name"])
+ po_chunk.SetString("NickName", po.get("nickname") or po["name"])
+ po_chunk.SetString("Description", po.get("description"))
+ po_chunk.SetBoolean("Optional", po.get("optional", False))
+ po_chunk.SetInt32("SourceCount", 0)
+ po_chunk.SetGuid("InstanceGuid", output_instance_guid)
+ po_chunk.SetBoolean("ReverseData", po.get("reverse", False))
+ po_chunk.SetBoolean("SimplifyData", po.get("simplify", False))
+ # Mutually exclusive options
+ if po.get("flatten", False):
+ po_chunk.SetInt32("Mapping", 1)
+ elif po.get("graft", False):
+ po_chunk.SetInt32("Mapping", 2)
+
+ # print(ghpython_root.Serialize_Xml())
+ root.SetByteArray("Object", ghpython_root.Serialize_Binary())
+
+ System.IO.File.WriteAllBytes(target, root.Serialize_Binary())
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(
+ description="Create GHUser components out of python code."
+ )
+ parser.add_argument(
+ "source",
+ type=str,
+ help="Source directory where code for all components is stored",
+ )
+ parser.add_argument("target", type=str, help="Target directory for ghuser files")
+ parser.add_argument(
+ "--ghio",
+ type=str,
+ required=False,
+ help="Folder where the GH_IO.dll assembly is located. Defaults to ./lib",
+ )
+ parser.add_argument(
+ "--version", type=str, required=False, help="Version to tag components"
+ )
+ parser.add_argument(
+ "--prefix",
+ type=str,
+ required=False,
+ help="Add this prefix to the name of each generated component",
+ )
+ args = parser.parse_args()
+
+ sourcedir = args.source
+ if not os.path.isabs(sourcedir):
+ sourcedir = os.path.abspath(sourcedir)
+
+ targetdir = args.target
+ if not os.path.isabs(targetdir):
+ targetdir = os.path.abspath(targetdir)
+
+ if args.ghio is None:
+ libdir = tempfile.mkdtemp("ghio")
+ fetch_ghio_lib(libdir)
+ else:
+ libdir = os.path.abspath(args.ghio)
+ gh_io = find_ghio_assembly(libdir)
+ source_bundles = [
+ d
+ for d in os.listdir(sourcedir)
+ if os.path.isdir(os.path.join(sourcedir, d))
+ and d not in ("__pycache__", ".git")
+ ]
+
+ print("GHPython componentizer")
+ print("======================")
+
+ print("[x] Source: {} ({} components)".format(sourcedir, len(source_bundles)))
+ print("[ ] Target: {}\r".format(targetdir), end="")
+ if not os.path.exists(targetdir):
+ os.mkdir(targetdir)
+ print("[x]")
+
+ print("[ ] GH_IO assembly: {}\r".format(gh_io or args.ghio), end="")
+ if not gh_io:
+ print("[-]")
+ print(" Cannot find GH_IO Assembly! Aborting.")
+ sys.exit(-1)
+ clr.AddReferenceToFileAndPath(gh_io)
+ print("[x]")
+ print()
+
+ print("Processing component bundles:")
+ for d in source_bundles:
+ source = os.path.join(sourcedir, d)
+ target = os.path.join(targetdir, d + ".ghuser")
+ print(" [ ] {}\r".format(d), end="")
+ create_ghuser_component(source, target, args.version, args.prefix)
+ print(" [x] {} => {}".format(d, target))
\ No newline at end of file
diff --git a/.github/workflows/gh_build.yml b/.github/workflows/gh_build.yml
new file mode 100644
index 00000000..968ddddf
--- /dev/null
+++ b/.github/workflows/gh_build.yml
@@ -0,0 +1,38 @@
+name: build-components
+
+on:
+ push:
+ branches: ["main"]
+ pull_request:
+ branches: ["main"]
+
+jobs:
+ build_ghuser_components:
+ runs-on: windows-latest
+ name: Build components
+ steps:
+ - uses: actions/checkout@v2
+ - uses: NuGet/setup-nuget@v1.0.5
+
+ - name: Install IronPython
+ run: |
+ choco install ironpython --version=2.7.8.1
+ - uses: ./.github/actions/ghpython-components
+ with:
+ source: ./src/gh/components
+ target: build
+ # upload them as artifacts:
+ - uses: actions/upload-artifact@v2
+ with:
+ name: ghuser-components
+ path: build
+
+ build_release_on_tag:
+ needs: build_ghuser_components
+ runs-on: windows-latest
+ name: Build release
+ if: startsWith(github.ref, 'refs/tags/v')
+ steps:
+ - uses: actions/checkout@v2
+ - uses: NuGet/setup-nuget@v1.0.5
+
diff --git a/README.md b/README.md
index f759f948..de5fb3b4 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
# diffCheck
+
diff --git a/src/gh/components/xml_exporter/code.py b/src/gh/components/xml_exporter/code.py
new file mode 100644
index 00000000..62c3567b
--- /dev/null
+++ b/src/gh/components/xml_exporter/code.py
@@ -0,0 +1,49 @@
+#! python3
+# requirements: diffcheck
+"""
+This read breps from Rhino, converts them to DFBeams and DFAssemblies, and exports them to XML.
+
+:param i_breps: list of breps
+:param i_export_dir: directory to export the xml
+:param i_dump: press to dump the xml
+"""
+import Rhino
+import Rhino.Geometry as rg
+
+import typing
+
+from ghpythonlib.componentbase import executingcomponent as component
+
+from diffCheck.df_geometries.df_geometries import DFBeam, DFAssembly
+
+
+class XMLExporter(component):
+ def RunScript(self,
+ i_dump : bool,
+ i_export_dir : str,
+ i_breps : typing.List[Rhino.Geometry.Brep]
+ ):
+ """
+ Main function to test the package
+ :param i_dump: whether to dump the xml
+ :param i_export_dir: directory to export the xml
+ :param i_breps: list of breps
+ """
+ # beams
+ beams : typing.List[DFBeam] = []
+ for brep in i_breps:
+ beam = DFBeam.from_brep(brep)
+ beams.append(beam)
+
+ # assembly
+ assembly1 = DFAssembly(beams, "Assembly1")
+ print(assembly1.beams)
+ print(assembly1)
+
+ # dump the xml
+ xml : str = assembly1.to_xml()
+ if i_dump:
+ assembly1.dump(xml, i_export_dir)
+ o_xml = xml
+
+ return o_xml
\ No newline at end of file
diff --git a/src/gh/components/xml_exporter/icon.png b/src/gh/components/xml_exporter/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9e0b54e8008a1a82afe3a6643e7b31733369308
GIT binary patch
literal 5660
zcmeHLc~}$I79W=fiXiv|wG?#>xKN#BX0lI{0)|MUMkz)Vwd!PM5=KcTBm)WfK(wE@
zprX~5y40!#o{B3Kty|Srr3zN9T9>+@;*<6X+RAgO+q($}*yUNj@AduhK9iYb=H7FE
z_xyhMoHO^E+3~~T0{lY#AP5T3>tYkYe>czB&IkNfxzzU|sP%(P<7hsCbisB9XJ%6v
zn9r~?Fym&;5ad2zTQKCk>VE#Y_m;2DpSWj%qN7h|O#b1uV}a>A`+w>faj|5!u5eJW0@7m*yPWq$a1J0oWAV+s<@1-KBHRg
zKYa8?r%2t+?4@VtWnXSv8r>l{pftMoTfIW)}N{@-7zDiB&pO~
zp`5a!z?7D1u&ubL-t7)(ACMQ;qf_rmR|KC)HdJ5jJvg%L3(Jh_bIyhMmDTO8*tn}m
zee3h`@psQ}&RQy)ydxtoaZK%nqH9lTc1+11pQ*0dmq^ra4)2+L;O+Uu=F_=_tG*o6
z<1N$Tx4B7OzvZs`o~l`WDDRZ9epzT?U0`R)rq0VMp}C9xI_qIam*KMvVm{quo&PZy6{T9d7-dvm+%)X$In%d|ID
zGsJ6`Rn?OT#*Rb3wDh_5u6)9_xMk!2GWC46e^!g{<755-k6K|*J3k6sMz0IFFsGV>
zpjIVj27Qcy_R;y1eNAISFK`ol!W
z_cMK_7R{59MR7#%-(+?oAac2i&flwa{>^Q{1eB3BDEG
zE05$3R_Vh=8t45qV|j(&4dm-dMTf@Rs}}ip-Fn^s4BN5SG;PGf>Fr*VrmSq;0UIMt
z7+T0i)m`byKZy@uKef0ZBegvu7ho|hj-VwcBI3%}Pm%Vi0mUg>8J|Vw8
z?aA1cQ%=`zD9b0m}=4l`1jlPM)Fhqg+mLIHg&}Jebc2FY(xKj&~dEQQlL@t+0=n@M#hed=bl}Ztci*OtP
z7Kk&$#*=Qu<_z~hG+@LsPRhaBd6u)m9!%22rSWQk0QAGp{Il8(h9-EMvrz@0hsaIZ
zMVJs3S*@a$Bb>Z89e^}C^qV7`Mo`>E35=6Vb5M*now4!ZEg|CchWI7~4RX^s@H4NZxd6vhfboxnfrIeU9D$8*kP&fYZaIR~4%y~J9IxpRm7g2q
z>G_p8@bkB4cqW<`8(0|(L@Y<8dA!xfK8ppKqga|~a)ywiCJHxGCPayf&4^egp%Dc}
zV~ELwkxDscRxnCg3qZZi$&)sU@c@D;ge(9fJi-(<}>j2xGu7I-9rJv^Gg44??mBu_TMNeC1iaw8@tq*6kR^+)lRaDWhN
z&UlfvC*@%km>$HNj&<^!Bg5O&PzOdZsSS4xw<)Z*0Kl*}l?jq+AWV5_(q2yiT01EdMX$(eZ<>0n|kKwq^W##3qG_-DBa;~)ObmkY#sASS+VL&}^EFk}hF)1Z!6G`C+F2kh=$w(B4Ng|^Wv%*X=m{evq$&}AK
z{bI&A+^;b|evdEa2{cq;#3Y17-WX;71F~|Z)GRdtief3FL_n5`K`8;n38Q2*O)@4*
zqM-h7$VyQ$E=4H{kTo%gL@rh$BxxoQQi@YjTuRAEvY`{o1f*VO7yENZZK%^Fb4tO&;~XMV9z0H+H^E#0`T?E{4`dNKXVEgel^KU
z>HA8qS8~0S0xxC!D!N|D^->DFl<}+R`mf35*ZkUov4Op<3%rz29+%GrFEo5iL*in+
zuQs3unq5=DReQTG$q7NiaL?JwT@;lL8hv@aLF-%7*0+Pa=kTv@bpcI%^|3KVU3u-%
zm{t(luI)NOMmi#?O*wZmdJ4xBjs
E-^)b$v;Y7A
literal 0
HcmV?d00001
diff --git a/src/gh/components/xml_exporter/metadata.json b/src/gh/components/xml_exporter/metadata.json
new file mode 100644
index 00000000..71af459d
--- /dev/null
+++ b/src/gh/components/xml_exporter/metadata.json
@@ -0,0 +1,68 @@
+{
+ "name": "Exporter to xml",
+ "nickname": "XMLout",
+ "category": "Utilities",
+ "subcategory": "ALL",
+ "description": "This component reads breps, convert them to DFBeams and DFAssemblies and export it to XML.",
+ "exposure": 4,
+ "instanceGuid": "cdae4bd5-d18e-4b06-9367-791b6b1f6837",
+ "ghpython": {
+ "hideOutput": true,
+ "hideInput": true,
+ "isAdvancedMode": true,
+ "marshalOutGuids": true,
+ "iconDisplay": 2,
+ "inputParameters": [
+ {
+ "name": "i_dump",
+ "nickname": "i_dump",
+ "description": "Press button to export xml",
+ "optional": true,
+ "allowTreeAccess": true,
+ "showTypeHints": true,
+ "scriptParamAccess": "item",
+ "wireDisplay": "default",
+ "sourceCount": 0,
+ "typeHintID": "bool",
+ "simplify": false
+ },
+ {
+ "name": "i_export_dir",
+ "nickname": "i_export_dir",
+ "description": "The directors where to export the xml file.",
+ "optional": true,
+ "allowTreeAccess": true,
+ "showTypeHints": true,
+ "scriptParamAccess": "item",
+ "wireDisplay": "default",
+ "sourceCount": 0,
+ "typeHintID": "str",
+ "flatten": true
+ },
+ {
+ "name": "i_breps",
+ "nickname": "i_breps",
+ "description": "The breps of the structure.",
+ "optional": true,
+ "allowTreeAccess": true,
+ "showTypeHints": true,
+ "scriptParamAccess": "list",
+ "wireDisplay": "default",
+ "sourceCount": 0,
+ "typeHintID": "brep",
+ "reverse": true,
+ "simplify": false
+ }
+ ],
+ "outputParameters": [
+ {
+ "name": "o_xml",
+ "nickname": "o_xml",
+ "description": "The string of xml to be exported.",
+ "optional": false,
+ "sourceCount": 0,
+ "graft": false
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/src/gh/README.md b/src/gh/diffCheck/README.md
similarity index 100%
rename from src/gh/README.md
rename to src/gh/diffCheck/README.md
diff --git a/src/gh/diffCheck/__pycache__/__init__.cpython-38.pyc b/src/gh/diffCheck/__pycache__/__init__.cpython-38.pyc
deleted file mode 100644
index b13b9668f30d902921d6542f97d0f3a2062467b5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 132
zcmWIL<>g`kf|eb8X(0MBh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2BV%_=4(GcCZHyC#P({H&;S2U)myoA>b~T<`
zT3VA;nU~mAP`vRRsB(Do58%(}m8bj#p7_4jXm;(Lb$EzWeRTSI&gpZ$)2*A`ZYc2l
z`)_AP|7r>GA6AY(9x7K+vV9OGl$?mE97svtnK%Q-e%*nq1g@=ep>%zkoE+lVwXKc`}?NS=Jx2>G9bEDE(lIzT_RLW0Ed05I~
zD4}Bgkatk7p=57@JQ8EE2$XyzV)Alv&hn^_oke7MY%?@<`g<5|pJ%S2YfOX02YDt-
zFVmCJGhyh_|GquixvSFA=-R#>KDe8i;oZIcV-0(HKGnHNb#`%aSa#!hG0*Ziouzpk
zZ(@GNHHGZpEzVWjbMd)BCrsi5YtpM=sPtHTh8Uqi__{RaGx1L!W_bM~td`t~ZogM}
z+tD3M2k)6C=9++nMpUE?t_e5Y3IzWS->ZW*jH8**s73bUw=60
zW5!$jRFU^AZRGyb=I3G@prvJ@fEeoBoKYJU(dI9>%f%b-S9VMfvOL;P9_lE`qlr#X
zyR@>T7n-kQaOqC;%)CM_yp>E2^v{i%8}kh`3|euT#n!UYJ2*&H*&w}Ky0Eo$VePsY
zwNVpcdbR;V>}((|I!;IWvN%g6zXUiq(G=w!EF_*`r!DmvQ{5kODu
zL_ODk}K)?$7)=rxNvdE(TzGl{fV|7HY{(-S@
zuh*)S_9k>R&)l+g14Amve+zZShHdAGYqRi?l^J_K!>B9;w-iK%0SM=
z0P@y$W!?)2rxEMGV2`a|Qo$PGOQpUH;YVmQ5!e3SX#yDkzeZWX%?e0Wzt>%dH}g6d
zBHqj!B;O|?5RMRLe!%LfxcVV_-$k)oUgIig6IF(Nrz7eHdS67;xS@TVw76*EUKrqO
zPuv#}<*VQyQt@Ky4cfY++NklY^#)zF0fcRq!TVXJr}rm^#pRcwY!>0}YR54w@580b
zt6{_PHY`toh@P_`Vm2X&5c>Se#TJi+7&l$$;Pi{F`UtF*={aT_bE=bI%{|KQ`5lbN
zczYB$pNd!NxnEV_hV_C~@G?4HJf5tM>(t}%bdTySgZE6m7L=<37(WFbw{B=h&27iq??3DGp-vgo%U{GuD%^OU;07}mAL9B(moBr}bN=Tt^bG-Hr!ooNJNsuCGZudp
z4{+~)B>(PwjH`fE8Yl1t4DC6kbMc+ZmUmFE46?R_yUcpS`E+qbaZv)@$CibncyqPA
zMo;GtwKe(T?qohpCfOA*^+ZUa&+0Av$x4EiWyQ3QEit4VyCL{{SSO?3+gO_`jxq#+
zU1g2e$*oRf^J7+Rj=oH8-9h{|I(~<;N*KI|1zzB8xQ2bb02k`|$5Lm8npVllo&xk*
jm7%N>oUu+!8SGa77gspn9{M=!CDYQ@7RqZV=N
-
- 178
- -118
+ 86
+ 0
- - 1.5
+ - 1.2750002
@@ -115,7 +115,7 @@
- true
- 2
-
- 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
+ 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
- dcf18e47-99f2-42d5-9ca4-7e6aee82d9b6
- true
@@ -612,7 +612,7 @@
- Panel
- false
- - 0.10945549979805946
+ - 0.42412034049630165
- bc61f3bc-d42e-4ab9-9cde-bfa5df8d625e
- 1
- Double click to edit panel content…
@@ -654,32 +654,29 @@
- - 3ede854e-c753-40eb-84cb-b48008f14fd4
- - Text
+ - a8b97322-2d53-47cd-905e-b932c3ccd74e
+ - Button
-
- - Contains a collection of text fragments
- - bc61f3bc-d42e-4ab9-9cde-bfa5df8d625e
- - Text
- - Txt
+
+ - Button object with two values
+ - False
+ - True
+ - 5de6f2a8-d2d0-49e6-92b4-ae1ed47ccbfd
+ - Button
+ - dump!
- false
- - f5d7e77d-04d1-4395-b52b-651450a4b329
- - 1
+ - 0
-
+
-
- 345
- 158
- 50
- 24
-
- -
- 370.98038
- 170.96075
+ 68
+ 127
+ 102
+ 22
@@ -689,29 +686,32 @@
- - a8b97322-2d53-47cd-905e-b932c3ccd74e
- - Button
+ - 3ede854e-c753-40eb-84cb-b48008f14fd4
+ - Text
-
- - Button object with two values
- - False
- - True
- - 5de6f2a8-d2d0-49e6-92b4-ae1ed47ccbfd
- - Button
- - dump!
+
+ - Contains a collection of text fragments
+ - bc61f3bc-d42e-4ab9-9cde-bfa5df8d625e
+ - Text
+ - Txt
- false
- - 0
+ - f5d7e77d-04d1-4395-b52b-651450a4b329
+ - 1
-
+
-
- 68
- 127
- 102
- 22
+ 348
+ 186
+ 50
+ 24
+
+ -
+ 373.8549
+ 198.45097
@@ -726,7 +726,7 @@
-
- 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
+ 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
From 44748b2f8afe1eb352bf16ac042c2a11a1778e26 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 14:23:41 +0200
Subject: [PATCH 014/141] WIP: testing componentizer action x2
---
.github/workflows/{gh_build.yml => gh-build.yml} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename .github/workflows/{gh_build.yml => gh-build.yml} (100%)
diff --git a/.github/workflows/gh_build.yml b/.github/workflows/gh-build.yml
similarity index 100%
rename from .github/workflows/gh_build.yml
rename to .github/workflows/gh-build.yml
From 4ccb8cc392d41c309e1faca0bcd5d2cca4840cb5 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 16:44:51 +0200
Subject: [PATCH 015/141] WIP: testing action componentizer
---
.../actions/ghpython-components/action.yml | 28 ++-
.github/workflows/gh-build.yml | 3 +-
deps/eigen | 2 +-
src/gh/tester.ghx | 210 +++++++++++++++++-
4 files changed, 227 insertions(+), 16 deletions(-)
diff --git a/.github/actions/ghpython-components/action.yml b/.github/actions/ghpython-components/action.yml
index 2649c0a9..2ca66836 100644
--- a/.github/actions/ghpython-components/action.yml
+++ b/.github/actions/ghpython-components/action.yml
@@ -1,5 +1,3 @@
-# This action was implemented from the [compass componentizer](https://github.com/compas-dev/compas-actions.ghpython_components/tree/main). We retain no credit for the code, and only modified it to work with our own repository.
-
name: 'Grasshopper componentizer'
description: 'Create GHUser components from Python source code'
inputs:
@@ -12,15 +10,29 @@ inputs:
prefix:
description: 'Add this prefix to the name of each generated component'
required: false
+ interpreter:
+ description: 'Python interpreter to use: ironpython, or cpython'
+ required: false
+ default: 'ironpython'
+
runs:
using: 'composite'
steps:
- - run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json
+ - name: Install Grasshopper
+ run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json
shell: pwsh
- - run: |
- $command="ipy"
- $params="${{ github.action_path }}/componentize.py", "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib"
- $prefix="${{ inputs.prefix }}"
+
+ - name: Launch componentizer
+ run: |
+ if ("${{ inputs.interpreter }}" -eq "cpython") {
+ $command="python"
+ $componentizer="${{ github.action_path }}/componentize_cpy.py"
+ } else {
+ $command="ipy"
+ $componentizer="${{ github.action_path }}/componentize_ipy.py"
+ }
+ $params=$componentizer, "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib"
+ $prefix="${{ inputs.prefix }}"
if( $prefix )
{
$params=$params + "--prefix", "$prefix"
@@ -29,4 +41,4 @@ runs:
shell: pwsh
branding:
icon: 'box'
- color: 'orange'
+ color: 'orange'
\ No newline at end of file
diff --git a/.github/workflows/gh-build.yml b/.github/workflows/gh-build.yml
index 968ddddf..a7bc1265 100644
--- a/.github/workflows/gh-build.yml
+++ b/.github/workflows/gh-build.yml
@@ -1,4 +1,4 @@
-name: build-components
+name: gh-build
on:
push:
@@ -21,6 +21,7 @@ jobs:
with:
source: ./src/gh/components
target: build
+ interpreter: cpython
# upload them as artifacts:
- uses: actions/upload-artifact@v2
with:
diff --git a/deps/eigen b/deps/eigen
index b2c9ba2b..2620cb93 160000
--- a/deps/eigen
+++ b/deps/eigen
@@ -1 +1 @@
-Subproject commit b2c9ba2beef4b5fd61513d73911c678e93c8dd9d
+Subproject commit 2620cb930b7ad87ed1d77a26319739f4b1c86d33
diff --git a/src/gh/tester.ghx b/src/gh/tester.ghx
index 67f0ee4f..ccd49548 100644
--- a/src/gh/tester.ghx
+++ b/src/gh/tester.ghx
@@ -49,10 +49,10 @@
-
- 86
- 0
+ 82
+ -295
- - 1.2750002
+ - 1.5
@@ -99,9 +99,9 @@
- - 8
+ - 9
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
@@ -719,6 +719,204 @@
+
+
+ - c9b2d725-6f87-4b07-af90-bd9aefef68eb
+ - 066d0a87-236f-4eae-a0f4-9e42f5327962
+ - Script
+
+
+
+
+ - Scripting component
+ - true
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQsSURBVEhL3ZRdTFtlHMbxwmTGxCjRVKOyOTZ0Ywx6TnvaDhBhE8VlrjF6a/TCJToKo7AxvsYKGC8WY/RmoR+0Y4WOQVkZ5WN8tuLYF+LGiFSdK8zdaRzzI8Toex7/7zmnEC5rTEx8kn/aJu/7e58+53lPyn8q4WBblt7mcusPOmN6m/vn7DL3Xzk27496uz8m2jucUmXXc9rS5CWUOvMJfC+n1N2aXeZZFg75IBw6BQJDrAzAcKQbhsozfwi1wae0Lckpx+Zq5u75d6HM5xHtfoL7YTh8VoXTGGtCMBwNNSobkpXe5nFSJCv6slNhfUXnSsK1sToI49FzNL2Qavsh1Yf92pbkJNh8VUL56YhQ2UkToDkbMVb3RMTDPX9y51IdwRuG6ICh5A4Q7a2PG+xtzxrsgfVTd04ZsSb0k1Q/ABPBTY0jkBzjfnnJms6WrG55cd8Reb44VUOtl77U9Ya+rO2KUNEOsSpAc4by7oKhukeNpKaP3A4qYKmBPgludkxAapr0y3etFtzeB3xbAszvWcZc3mMaVhV3LNg8vwkVp9WGcLDyIDmcZ31egw+rzo+PEXxSOcDUHPXI3+/NR+xV4OZuYLYA8uVdtRpaFVXQrTpONITA/GFy1zzr1UhGVedNEViao7C0TMHUMlUix4rfx40iYOZF4JIFLCpOa2hVYmXH9VXXSkt6YeSuE3Fw5wQ3Hx8n+GQCvGJpnnLdmX4zlc0W3sbVPGDaDEQMYBey7gEpD2h4iqiq63cVTFnX8qwHYGwYXDQ1Xjjw9qf+Qm9fy1veMJ+P1KHf8xffKWI393yM2fxlXMkFpiRgQgBGdgLh7YB34wYNT/+guvsHxbEWh6E2vFL0YZ+OmnGC5hfcsUKZpf3Arb1Q8p6jvL9UI8HnRmBcDwxnAf0vgAW3fKehVYnVoTGpLqxmTRmbjo14sGTNWwXzWXydWvIa8HUxcL0QuJavRhIl+Gg2MLQD6Hse6EkHAmk+Da3KVD9QnniIZmqIyTFWQs4/W4XHqYLfKBUEvnoJSt4XCT4pqpEMZgKhDKB7M9CZBrldt0NDqzJXdD1kPDZ8VznAMQ6LY2I3W9rvVOCJSKiC7FqBzC7lyiwiyWxMkNnQTpmd3y6zYIbMAptk1v7MguzRvath10tqHHzE5Jj4wNwUbc9tmspkcTqAw3kkVEF2Ne9Xbem/I7bwihPzL6uR8LwpEhYR42w0K87CmXHWtzXOutPjrCPtE21LcmJzRU5+K5UKfmFay7t/G1hvxn3WtdnFOp6+z3y6f/Y2lWcK3sPlXVRB6vc49XuIV3Ab0LsVLLDRydcw75MuuTW1XNmQrDBZsIFFDQsYy1mrYHALryCYj5y7dS52MvWGfEL3sLYleWFGfJBu5QEWyhhg3ZtuUSQrFEmMOZ8IyycfLYU3Ze22/k+VkvI34q8RvMUeXlAAAAAASUVORK5CYII=
+
+ - 68e93733-269e-4deb-85f9-f55554589eb9
+ - true
+ - true
+ - true
+ - Script
+ - S
+
+ - false
+ - false
+ - true
+
+
+
+
+ -
+ 142
+ 298
+ 72
+ 44
+
+ -
+ 171
+ 320
+
+
+
+
+
+ - 2
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 2
+ - 3ede854e-c753-40eb-84cb-b48008f14fd4
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+
+
+
+
+ - true
+ - No conversion
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 2b845980-88f2-4f63-a0f7-1574827539c1
+ - x
+ - x
+ - true
+ - 0
+ - true
+ - 0
+
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 144
+ 300
+ 12
+ 20
+
+ -
+ 151.5
+ 310
+
+
+
+
+
+
+
+ - true
+ - No conversion
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 5bcdf1ec-3568-4e90-b700-efefc0113dc5
+ - y
+ - y
+ - true
+ - 0
+ - true
+ - 0
+
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 144
+ 320
+ 12
+ 20
+
+ -
+ 151.5
+ 330
+
+
+
+
+
+
+
+ - The execution information, as output and error streams
+ - 9c06c502-948b-4734-bfa1-5b29e4707c6f
+ - out
+ - out
+ - false
+ - 0
+
+
+
+
+ -
+ 186
+ 300
+ 26
+ 20
+
+ -
+ 199
+ 310
+
+
+
+
+
+
+
+ - false
+ - No conversion
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 85f65616-883d-4997-93fa-54d4e44e80e2
+ - a
+ - a
+ - false
+ - 0
+ - true
+ - 0
+
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 186
+ 320
+ 26
+ 20
+
+ -
+ 199
+ 330
+
+
+
+
+
+
+
+
+
+ - IiIiR3Jhc3Nob3BwZXIgU2NyaXB0IiIiDQphID0gIkhlbGxvIFB5dGhvbiAzIGluIEdyYXNzaG9wcGVyISINCnByaW50KGEpDQo=
+ - S
+
+
+
+
+ - mcneel.pythonnet.python
+ - 3.9.10
+
+
+
+
+
+
+
+
@@ -726,7 +924,7 @@
-
- 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
+ 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y0caDuf2/ueZXe9Nvj45ahmfmGIwAlP8ovCXuGEewiX3vehFPLRarcePH+/r6yNnosuxCympW8uF0TFXzdgmKlt6nzig+fI7mi/vK/3GkcbHjrc94dX9Xf9hTUPT9dFfXzc9OmfRjozbHRPupImJiZ6eHlw16b8EVOou5cLoiKvsU+MZVZ1f31/4jcMVBzOMLV2pnb2R7Z0xA93B71l+d735m9erPjffnTI0PueYcCeBKbl/WVnZ8vKyY30pqTvJhdFhV9nGR/XNfY8dr/mxn2lqNOn6xV9cP/Psddu3rw98/XrTI9fLP/YfJY9O9tcPjU45JtxJZEvk+5JRqQ8lF0aHXDU8zMV6NLfrzVTLyqTP9Zmn3xv87Yr5xGrX3tXW3Rfq/mpvS7AOj4vBdyNcaUdHB2f9tWvXHOtLSd1JLoyS0ICRuJKSIxgdtlo7+kbPD3lctzzxftsza8bXVmtemzcGmIftA0OTg4NWMRIxi8SI6Y7HNwlX2t/f/9JLL2m12gsXLji2ICV1W7kwajabGxsbgampqWlgXYODA4ND4wv9kddbv3a94qHrBQ+tlv5xrt7fbB2l0zFoYAA0jUajXq93PN5MjGGJV1555f77709PT5eYSt2NXBjlOA4ICNBoNOHh4cSOlnWZLYMWc6+9I/q84fUV/Ssz9eED/b1K4wbhI3U63bZt27hunLtR0M89YLPZUlJSHn/8cfk+k9TdyIVR2CosLNy5c2d1dTXM4fPW1d9vHui1jPZaxvoGKCP9lgEaHZ1mMz6yvb39xIkTu3btSkpK4sR3dLgKRvG1k5OTkZGRTz755NrammRU6o5yYRTU8HN79uwBJgLHvhvV30ejKK6Cv56envj4+IiIiJqaGqY7OlyFK+3t7X3hhRc++tGPFhQUrK6uOnYhJXVr3choXFxcVlYWgSMwfSiBIKGC8L7w6mh1FV2tra3bt283GAwyGJW6S7kw2t3dzZGNB6XyPxN0OmqbCY6hs7a2Vr72JHX3cmEUP8dxzPUeCfdMJEDIKz9NInX3cmE0/x5Lq9WmpaXhp5eWlhzrS0ndSS6MkjDdUzU0NJBOyV8KlfpQcmFU/cWkeyvpQaU+rFwYdbRJSbmTJKNS7i7JqJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7pKMSrm7JKNS7i7JqJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7pKMSrm7JKNS7i7JqJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7pKMSrm7JKNS7i7JqJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7pKMSrm7JKNS7i7JqJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7pKMSrm7JKNS7i7JqJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7nJhVErKPeVgVErKffWRj/w3TW73l/6tcNcAAAAASUVORK5CYII=
From 27c2dd6e2721871f73a6746ac9156ee52a8dd73f Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 16:47:46 +0200
Subject: [PATCH 016/141] WIP: using default compas action
---
.github/actions/ghpython-components/README.md | 1 -
.../actions/ghpython-components/action.yml | 44 --
.../ghpython-components/componentize.py | 396 ------------------
.github/workflows/gh-build.yml | 24 +-
4 files changed, 8 insertions(+), 457 deletions(-)
delete mode 100644 .github/actions/ghpython-components/README.md
delete mode 100644 .github/actions/ghpython-components/action.yml
delete mode 100644 .github/actions/ghpython-components/componentize.py
diff --git a/.github/actions/ghpython-components/README.md b/.github/actions/ghpython-components/README.md
deleted file mode 100644
index ae5089b1..00000000
--- a/.github/actions/ghpython-components/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This action was implemented from the [compass componentizer](https://github.com/compas-dev/compas-actions.ghpython_components/tree/main). We retain no credit for the code, and only modified it to work with our own repository.
\ No newline at end of file
diff --git a/.github/actions/ghpython-components/action.yml b/.github/actions/ghpython-components/action.yml
deleted file mode 100644
index 2ca66836..00000000
--- a/.github/actions/ghpython-components/action.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-name: 'Grasshopper componentizer'
-description: 'Create GHUser components from Python source code'
-inputs:
- source:
- description: 'Source directory where code for all components is stored'
- required: true
- target:
- description: 'Target directory for ghuser files'
- required: true
- prefix:
- description: 'Add this prefix to the name of each generated component'
- required: false
- interpreter:
- description: 'Python interpreter to use: ironpython, or cpython'
- required: false
- default: 'ironpython'
-
-runs:
- using: 'composite'
- steps:
- - name: Install Grasshopper
- run: nuget install Grasshopper -OutputDirectory ./lib -source https://api.nuget.org/v3/index.json
- shell: pwsh
-
- - name: Launch componentizer
- run: |
- if ("${{ inputs.interpreter }}" -eq "cpython") {
- $command="python"
- $componentizer="${{ github.action_path }}/componentize_cpy.py"
- } else {
- $command="ipy"
- $componentizer="${{ github.action_path }}/componentize_ipy.py"
- }
- $params=$componentizer, "${{ inputs.source }}", "${{ inputs.target }}", "--ghio", "./lib"
- $prefix="${{ inputs.prefix }}"
- if( $prefix )
- {
- $params=$params + "--prefix", "$prefix"
- }
- & $command $params
- shell: pwsh
-branding:
- icon: 'box'
- color: 'orange'
\ No newline at end of file
diff --git a/.github/actions/ghpython-components/componentize.py b/.github/actions/ghpython-components/componentize.py
deleted file mode 100644
index d737904e..00000000
--- a/.github/actions/ghpython-components/componentize.py
+++ /dev/null
@@ -1,396 +0,0 @@
-from __future__ import print_function
-
-import argparse
-import base64
-import json
-import os
-import re
-import sys
-import tempfile
-import urllib
-import zipfile
-import StringIO
-
-import clr
-import System
-import System.IO
-
-GHPYTHON_SCRIPT_GUID = System.Guid("410755b1-224a-4c1e-a407-bf32fb45ea7e")
-TEMPLATE_VER = re.compile("{{version}}")
-TEMPLATE_NAME = re.compile("{{name}}")
-TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}")
-
-TYPES_MAP = dict(
- none="35915213-5534-4277-81b8-1bdc9e7383d2",
- ghdoc="87f87f55-5b71-41f4-8aea-21d494016f81",
- float="39fbc626-7a01-46ab-a18e-ec1c0c41685b",
- bool="d60527f5-b5af-4ef6-8970-5f96fe412559",
- int="48d01794-d3d8-4aef-990e-127168822244",
- complex="309690df-6229-4774-91bb-b1c9c0bfa54d",
- str="37261734-eec7-4f50-b6a8-b8d1f3c4396b",
- datetime="09bcf900-fe83-4efa-8d32-33d89f7a3e66",
- guid="5325b8e1-51d7-4d36-837a-d98394626c35",
- color="24b1d1a3-ab79-498c-9e44-c5b14607c4d3",
- point="e1937b56-b1da-4c12-8bd8-e34ee81746ef",
- vector="15a50725-e3d3-4075-9f7c-142ba5f40747",
- plane="3897522d-58e9-4d60-b38c-978ddacfedd8",
- interval="589748aa-e558-4dd9-976f-78e3ab91fc77",
- uvinterval="74c906f3-db02-4cea-bd58-de375cb5ae73",
- box="f29cb021-de79-4e63-9f04-fc8e0df5f8b6",
- transform="c4b38e4c-21ff-415f-a0d1-406d282428dd",
- line="f802a8cd-e699-4a94-97ea-83b5406271de",
- circle="3c5409a1-3293-4181-a6fa-c24c37fc0c32",
- arc="9c80ec18-b48c-41b0-bc6e-cd93d9c916aa",
- polyline="66fa617b-e3e8-4480-9f1e-2c0688c1d21b",
- rectangle="83da014b-a550-4bf5-89ff-16e54225bd5d",
- curve="9ba89ec2-5315-435f-a621-b66c5fa2f301",
- mesh="794a1f9d-21d5-4379-b987-9e8bbf433912",
- surface="f4070a37-c822-410f-9057-100d2e22a22d",
- subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08",
- brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d",
- geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26",
-)
-
-EXPOSURE = dict(valid=set([-1, 2, 4, 8, 16, 32, 64, 128]), default=2)
-ACCESS = dict(valid=set([0, 1, 2]), map=dict(item=0, list=1, tree=2), default=0)
-PARAM_TYPE = dict(
- valid=set(TYPES_MAP.values()), map=TYPES_MAP, default=TYPES_MAP["ghdoc"]
-)
-WIRE_DISPLAY = dict(
- valid=set([0, 1, 2]), map=dict(default=0, faint=1, hidden=2), default=0
-)
-
-
-def fetch_ghio_lib(target_folder="temp"):
- """Fetch the GH_IO.dll library from the NuGet packaging system."""
- ghio_dll = "GH_IO.dll"
- filename = "lib/net48/" + ghio_dll
-
- response = urllib.urlopen("https://www.nuget.org/api/v2/package/Grasshopper/")
- dst_file = os.path.join(target_folder, ghio_dll)
- zip_file = zipfile.ZipFile(StringIO.StringIO(response.read()))
-
- with zip_file.open(filename, "r") as zipped_dll:
- with open(dst_file, "wb") as fp:
- fp.write(zipped_dll.read())
-
- return dst_file
-
-
-def find_ghio_assembly(libdir):
- for root, _dirs, files in os.walk(libdir):
- for basename in files:
- if basename.upper() == "GH_IO.DLL":
- filename = os.path.join(root, basename)
- return filename
-
-
-def bitmap_from_image_path(image_path):
- with open(image_path, "rb") as imageFile:
- img_string = base64.b64encode(imageFile.read())
- return System.Convert.FromBase64String(img_string)
-
-
-def validate_source_bundle(source):
- icon = os.path.join(source, "icon.png")
- code = os.path.join(source, "code.py")
- data = os.path.join(source, "metadata.json")
-
- if not os.path.exists(icon):
- raise ValueError(
- "icon missing, make sure icon.png is present in the source bundle: {}".format(
- source
- )
- )
- if not os.path.exists(code):
- raise ValueError(
- "code missing, make sure code.py is present in the source bundle: {}".format(
- source
- )
- )
- if not os.path.exists(data):
- raise ValueError(
- "metadata missing, make sure metadata.json is present in the source bundle: {}".format(
- source
- )
- )
-
- icon = bitmap_from_image_path(icon)
-
- with open(code, "r") as f:
- python_code = f.read()
-
- with open(data, "r") as f:
- data = json.load(f)
-
- if "exposure" not in data:
- data["exposure"] = EXPOSURE["default"]
-
- if data["exposure"] not in EXPOSURE["valid"]:
- raise ValueError(
- "Invalid exposure value. Accepted values are {}".format(
- sorted(EXPOSURE["valid"])
- )
- )
-
- ghpython = data.get("ghpython")
- sdk_mode = ghpython and ghpython.get("isAdvancedMode", False)
-
- if r'"""' not in python_code and sdk_mode is False:
- python_code = r'"""{}"""{}{}'.format(
- data.get("description", "Generated by Componentizer"),
- os.linesep,
- python_code,
- )
-
- return icon, python_code, data
-
-
-def parse_param_access(access):
- try:
- access = int(access)
- except ValueError:
- # Maybe string?
- access = ACCESS["map"].get(access)
-
- if access not in ACCESS["valid"]:
- raise ValueError(
- "Invalid param access value. Valid values are {}".format(
- sorted(ACCESS["valid"])
- )
- )
-
- return access
-
-
-def parse_wire_display(wire_display):
- try:
- wire_display = int(wire_display)
- except ValueError:
- wire_display = WIRE_DISPLAY["map"].get(wire_display)
-
- if wire_display not in WIRE_DISPLAY["valid"]:
- raise ValueError(
- "Invalid wire display value. Valid values are {}".format(
- sorted(WIRE_DISPLAY["valid"])
- )
- )
-
- return wire_display
-
-
-def parse_param_type_hint(type_hint_id):
- type_hint_id = type_hint_id or PARAM_TYPE["default"]
-
- if type_hint_id in TYPES_MAP:
- type_hint_id = TYPES_MAP[type_hint_id]
-
- if type_hint_id not in PARAM_TYPE["valid"]:
- raise ValueError(
- 'Invalid param type hint ID ("{}"). Valid values are {}'.format(
- type_hint_id, sorted(PARAM_TYPE["valid"])
- )
- )
-
- try:
- type_hint_id = System.Guid.Parse(type_hint_id)
- except SystemError:
- raise ValueError("Unable to parse type hint ID: {}".format(type_hint_id))
-
- return type_hint_id
-
-
-def replace_templates(code, version, name, ghuser_name):
- if version:
- code = TEMPLATE_VER.sub(version, code)
-
- code = TEMPLATE_NAME.sub(name, code)
- code = TEMPLATE_GHUSER_NAME.sub(ghuser_name, code)
-
- return code
-
-
-def create_ghuser_component(source, target, version=None, prefix=None):
- from GH_IO.Serialization import GH_LooseChunk
-
- icon, code, data = validate_source_bundle(source)
-
- code = replace_templates(code, version, data["name"], os.path.basename(target))
-
- instance_guid = data.get("instanceGuid")
- if not instance_guid:
- instance_guid = System.Guid.NewGuid()
- else:
- instance_guid = System.Guid.Parse(instance_guid)
-
- prefix = prefix or ""
-
- root = GH_LooseChunk("UserObject")
-
- root.SetGuid("BaseID", GHPYTHON_SCRIPT_GUID)
- root.SetString("Name", prefix + data["name"])
- root.SetString("NickName", data["nickname"])
- root.SetString("Description", data.get("description", ""))
- root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"]))
- root.SetString("Category", data["category"])
- root.SetString("SubCategory", data["subcategory"])
- root.SetGuid("InstanceGuid", instance_guid)
- root.SetByteArray("Icon", icon)
-
- ghpython_data = data["ghpython"]
- ghpython_root = GH_LooseChunk("UserObject")
- ghpython_root.SetString("Description", data.get("description", ""))
- ghpython_root.SetBoolean("HideOutput", ghpython_data.get("hideOutput", True))
- ghpython_root.SetBoolean("HideInput", ghpython_data.get("hideInput", True))
- ghpython_root.SetBoolean(
- "IsAdvancedMode", ghpython_data.get("isAdvancedMode", False)
- )
- ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0))
- ghpython_root.SetString("Name", data["name"])
- ghpython_root.SetString("NickName", data["nickname"])
- ghpython_root.SetBoolean(
- "MarshalOutGuids", ghpython_data.get("marshalOutGuids", True)
- )
- ghpython_root.SetString("CodeInput", code)
-
- # ghpython_root.CreateChunk('Attributes')
- # for mf in ('Bounds', 'Pivot', 'Selected'):
- params = ghpython_root.CreateChunk("ParameterData")
- inputParam = ghpython_data.get("inputParameters", [])
- outputParam = ghpython_data.get("outputParameters", [])
-
- params.SetInt32("InputCount", len(inputParam))
- for i, _pi in enumerate(inputParam):
- params.SetGuid(
- "InputId", i, System.Guid.Parse("84fa917c-1ed8-4db3-8be1-7bdc4a6495a2")
- )
- params.SetInt32("OutputCount", len(outputParam))
- for i, _po in enumerate(outputParam):
- params.SetGuid(
- "OutputId", i, System.Guid.Parse("8ec86459-bf01-4409-baee-174d0d2b13d0")
- )
-
- for i, pi in enumerate(inputParam):
- input_instance_guid = System.Guid.NewGuid()
- pi_chunk = params.CreateChunk("InputParam", i)
- pi_chunk.SetString("Name", pi["name"])
- pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"])
- pi_chunk.SetString("Description", pi.get("description"))
- pi_chunk.SetBoolean("Optional", pi.get("optional", True))
- pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True))
- pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True))
- pi_chunk.SetInt32(
- "ScriptParamAccess",
- parse_param_access(pi.get("scriptParamAccess", ACCESS["default"])),
- )
- pi_chunk.SetInt32("SourceCount", 0)
- pi_chunk.SetGuid("InstanceGuid", input_instance_guid)
- pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID")))
- pi_chunk.SetInt32(
- "WireDisplay",
- parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])),
- )
- pi_chunk.SetBoolean("ReverseData", pi.get("reverse", False))
- pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False))
- # Mutually exclusive options
- if pi.get("flatten", False):
- pi_chunk.SetInt32("Mapping", 1)
- elif pi.get("graft", False):
- pi_chunk.SetInt32("Mapping", 2)
-
- for i, po in enumerate(outputParam):
- output_instance_guid = System.Guid.NewGuid()
- po_chunk = params.CreateChunk("OutputParam", i)
- po_chunk.SetString("Name", po["name"])
- po_chunk.SetString("NickName", po.get("nickname") or po["name"])
- po_chunk.SetString("Description", po.get("description"))
- po_chunk.SetBoolean("Optional", po.get("optional", False))
- po_chunk.SetInt32("SourceCount", 0)
- po_chunk.SetGuid("InstanceGuid", output_instance_guid)
- po_chunk.SetBoolean("ReverseData", po.get("reverse", False))
- po_chunk.SetBoolean("SimplifyData", po.get("simplify", False))
- # Mutually exclusive options
- if po.get("flatten", False):
- po_chunk.SetInt32("Mapping", 1)
- elif po.get("graft", False):
- po_chunk.SetInt32("Mapping", 2)
-
- # print(ghpython_root.Serialize_Xml())
- root.SetByteArray("Object", ghpython_root.Serialize_Binary())
-
- System.IO.File.WriteAllBytes(target, root.Serialize_Binary())
-
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser(
- description="Create GHUser components out of python code."
- )
- parser.add_argument(
- "source",
- type=str,
- help="Source directory where code for all components is stored",
- )
- parser.add_argument("target", type=str, help="Target directory for ghuser files")
- parser.add_argument(
- "--ghio",
- type=str,
- required=False,
- help="Folder where the GH_IO.dll assembly is located. Defaults to ./lib",
- )
- parser.add_argument(
- "--version", type=str, required=False, help="Version to tag components"
- )
- parser.add_argument(
- "--prefix",
- type=str,
- required=False,
- help="Add this prefix to the name of each generated component",
- )
- args = parser.parse_args()
-
- sourcedir = args.source
- if not os.path.isabs(sourcedir):
- sourcedir = os.path.abspath(sourcedir)
-
- targetdir = args.target
- if not os.path.isabs(targetdir):
- targetdir = os.path.abspath(targetdir)
-
- if args.ghio is None:
- libdir = tempfile.mkdtemp("ghio")
- fetch_ghio_lib(libdir)
- else:
- libdir = os.path.abspath(args.ghio)
- gh_io = find_ghio_assembly(libdir)
- source_bundles = [
- d
- for d in os.listdir(sourcedir)
- if os.path.isdir(os.path.join(sourcedir, d))
- and d not in ("__pycache__", ".git")
- ]
-
- print("GHPython componentizer")
- print("======================")
-
- print("[x] Source: {} ({} components)".format(sourcedir, len(source_bundles)))
- print("[ ] Target: {}\r".format(targetdir), end="")
- if not os.path.exists(targetdir):
- os.mkdir(targetdir)
- print("[x]")
-
- print("[ ] GH_IO assembly: {}\r".format(gh_io or args.ghio), end="")
- if not gh_io:
- print("[-]")
- print(" Cannot find GH_IO Assembly! Aborting.")
- sys.exit(-1)
- clr.AddReferenceToFileAndPath(gh_io)
- print("[x]")
- print()
-
- print("Processing component bundles:")
- for d in source_bundles:
- source = os.path.join(sourcedir, d)
- target = os.path.join(targetdir, d + ".ghuser")
- print(" [ ] {}\r".format(d), end="")
- create_ghuser_component(source, target, args.version, args.prefix)
- print(" [x] {} => {}".format(d, target))
\ No newline at end of file
diff --git a/.github/workflows/gh-build.yml b/.github/workflows/gh-build.yml
index a7bc1265..06259397 100644
--- a/.github/workflows/gh-build.yml
+++ b/.github/workflows/gh-build.yml
@@ -14,26 +14,18 @@ jobs:
- uses: actions/checkout@v2
- uses: NuGet/setup-nuget@v1.0.5
- - name: Install IronPython
+ - name: Install CPython and pythonnet package
run: |
- choco install ironpython --version=2.7.8.1
- - uses: ./.github/actions/ghpython-components
+ choco install python --version=3.9.10
+ python -m pip install pythonnet==3.0.3
+
+ - uses: compas-dev/compas-actions.ghpython_components@v5
with:
- source: ./src/gh/components
+ source: components
target: build
interpreter: cpython
- # upload them as artifacts:
+
- uses: actions/upload-artifact@v2
with:
name: ghuser-components
- path: build
-
- build_release_on_tag:
- needs: build_ghuser_components
- runs-on: windows-latest
- name: Build release
- if: startsWith(github.ref, 'refs/tags/v')
- steps:
- - uses: actions/checkout@v2
- - uses: NuGet/setup-nuget@v1.0.5
-
+ path: build
\ No newline at end of file
From f9535a2d8afd7014b69438752d7e6e1b0cb3f393 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 16:48:27 +0200
Subject: [PATCH 017/141] WIP: using default compas action x2
---
.github/workflows/gh-build.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/gh-build.yml b/.github/workflows/gh-build.yml
index 06259397..c26103ff 100644
--- a/.github/workflows/gh-build.yml
+++ b/.github/workflows/gh-build.yml
@@ -21,7 +21,7 @@ jobs:
- uses: compas-dev/compas-actions.ghpython_components@v5
with:
- source: components
+ source: src/gh/components
target: build
interpreter: cpython
From c3e7ee45d4d15d4ea2b885c96e6700edc518af36 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 20:53:02 +0200
Subject: [PATCH 018/141] FIX-CAP: component fixed + componentizer
---
CONTRIBUTING.md | 30 ++
src/gh/components/xml_exporter/code.py | 9 +-
src/gh/components/xml_exporter/metadata.json | 2 -
src/gh/diffCheck/README.md | 6 +-
src/gh/diffCheck/diffCheck/__init__.py | 1 +
src/gh/diffCheck/setup.py | 34 +-
src/gh/util/componentizer_cpy.py | 408 +++++++++++++++++++
7 files changed, 466 insertions(+), 24 deletions(-)
create mode 100644 src/gh/util/componentizer_cpy.py
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0e9e1d38..c24de844 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -48,6 +48,36 @@ git add .gitmodules
git commit -m "Remove a submodule name"
```
+---
+# PyPI
+To push the package to PyPI, you need to:
+1. Install the package `twine`:
+```bash
+pip install twine
+```
+2. Build the package:
+```bash
+python setup.py sdist bdist_wheel
+```
+3. Check the package:
+```bash
+twine check dist/*
+```
+4. Upload the package:
+```bash
+twine upload dist/*
+```
+Be sure to have the right to upload the package to the PyPI repository.
+To do so you need to set the `~/.pypirc` file with the following content:
+```bash
+[distutils]
+index-servers=pypi
+
+[pypi]
+ username = __token__
+ password = pypi-
+```
+
---
# C++
diff --git a/src/gh/components/xml_exporter/code.py b/src/gh/components/xml_exporter/code.py
index 62c3567b..69be3030 100644
--- a/src/gh/components/xml_exporter/code.py
+++ b/src/gh/components/xml_exporter/code.py
@@ -1,5 +1,5 @@
#! python3
-# requirements: diffcheck
+# requirements: diffCheck
"""
This read breps from Rhino, converts them to DFBeams and DFAssemblies, and exports them to XML.
@@ -7,14 +7,15 @@
:param i_export_dir: directory to export the xml
:param i_dump: press to dump the xml
"""
+import System
+import typing
+
import Rhino
import Rhino.Geometry as rg
-import typing
-
from ghpythonlib.componentbase import executingcomponent as component
-from diffCheck.df_geometries.df_geometries import DFBeam, DFAssembly
+from diffCheck.df_geometries import DFBeam, DFAssembly
class XMLExporter(component):
diff --git a/src/gh/components/xml_exporter/metadata.json b/src/gh/components/xml_exporter/metadata.json
index 71af459d..de14ce2e 100644
--- a/src/gh/components/xml_exporter/metadata.json
+++ b/src/gh/components/xml_exporter/metadata.json
@@ -37,7 +37,6 @@
"wireDisplay": "default",
"sourceCount": 0,
"typeHintID": "str",
- "flatten": true
},
{
"name": "i_breps",
@@ -50,7 +49,6 @@
"wireDisplay": "default",
"sourceCount": 0,
"typeHintID": "brep",
- "reverse": true,
"simplify": false
}
],
diff --git a/src/gh/diffCheck/README.md b/src/gh/diffCheck/README.md
index e94c5323..afa64734 100644
--- a/src/gh/diffCheck/README.md
+++ b/src/gh/diffCheck/README.md
@@ -1 +1,5 @@
-This directory contains all the code for the grasshopper plugin of DiffCheck written in CPython.
\ No newline at end of file
+# DiffCheck Grasshopper Plugin
+
+DiffCheck is a plugin for Rhino/Grasshopper that allows the user to compare a 3D model with its scan.
+
+More information to come
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/__init__.py b/src/gh/diffCheck/diffCheck/__init__.py
index e69de29b..210ebb3e 100644
--- a/src/gh/diffCheck/diffCheck/__init__.py
+++ b/src/gh/diffCheck/diffCheck/__init__.py
@@ -0,0 +1 @@
+__version__ = '0.0.2'
\ No newline at end of file
diff --git a/src/gh/diffCheck/setup.py b/src/gh/diffCheck/setup.py
index c7276fc7..3a3a225e 100644
--- a/src/gh/diffCheck/setup.py
+++ b/src/gh/diffCheck/setup.py
@@ -1,18 +1,18 @@
-# from setuptools import setup, find_packages
+from setuptools import setup, find_packages
-# setup(
-# name='mypackage',
-# version='0.1',
-# packages=find_packages(),
-# description='A sample Python package',
-# long_description=open('README.md').read(),
-# long_description_content_type='text/markdown',
-# author='Your Name',
-# author_email='your.email@example.com',
-# url='https://github.com/yourusername/mypackage',
-# classifiers=[
-# 'License :: OSI Approved :: MIT License',
-# 'Programming Language :: Python :: 3',
-# 'Programming Language :: Python :: 3.7',
-# ],
-# )
\ No newline at end of file
+setup(
+ name='diffCheck',
+ version='0.0.2',
+ packages=find_packages(),
+ description='DiffCheck is a package to check the differences between two timber structures',
+ long_description=open('README.md').read(),
+ long_description_content_type='text/markdown',
+ author='Andrea Settimi, Damien Gilliard, Eleni Skevaki, Marirena Kladeftira, Julien Gamerro, Stefana Parascho, and Yves Weinand',
+ author_email='andrea.settimi@epfl.ch',
+ url='https://github.com/diffCheckOrg/diffCheck',
+ classifiers=[
+ 'License :: OSI Approved :: MIT License',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ ],
+)
\ No newline at end of file
diff --git a/src/gh/util/componentizer_cpy.py b/src/gh/util/componentizer_cpy.py
new file mode 100644
index 00000000..cdffe828
--- /dev/null
+++ b/src/gh/util/componentizer_cpy.py
@@ -0,0 +1,408 @@
+import argparse
+import base64
+import json
+import os
+import re
+import sys
+import tempfile
+import urllib.request, urllib.parse, urllib.error
+import zipfile
+from io import BytesIO
+
+import clr
+import System
+import System.IO
+
+
+SCRIPT_COMPONENT_GUID = System.Guid("c9b2d725-6f87-4b07-af90-bd9aefef68eb")
+CPY_VER = "3.-1"
+TEMPLATE_VER = re.compile("{{version}}")
+TEMPLATE_NAME = re.compile("{{name}}")
+TEMPLATE_GHUSER_NAME = re.compile("{{ghuser_name}}")
+
+TYPES_MAP = dict(
+ none="6a184b65-baa3-42d1-a548-3915b401de53",
+ ghdoc="1c282eeb-dd16-439f-94e4-7d92b542fe8b",
+ float="9d51e32e-c038-4352-9554-f4137ca91b9a",
+ bool="d60527f5-b5af-4ef6-8970-5f96fe412559",
+ int="48d01794-d3d8-4aef-990e-127168822244",
+ complex="309690df-6229-4774-91bb-b1c9c0bfa54d",
+ str="3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88",
+ datetime="09bcf900-fe83-4efa-8d32-33d89f7a3e66",
+ guid="5325b8e1-51d7-4d36-837a-d98394626c35",
+ color="24b1d1a3-ab79-498c-9e44-c5b14607c4d3",
+ point="e1937b56-b1da-4c12-8bd8-e34ee81746ef",
+ vector="15a50725-e3d3-4075-9f7c-142ba5f40747",
+ plane="3897522d-58e9-4d60-b38c-978ddacfedd8",
+ interval="589748aa-e558-4dd9-976f-78e3ab91fc77",
+ uvinterval="74c906f3-db02-4cea-bd58-de375cb5ae73",
+ box="f29cb021-de79-4e63-9f04-fc8e0df5f8b6",
+ transform="c4b38e4c-21ff-415f-a0d1-406d282428dd",
+ line="f802a8cd-e699-4a94-97ea-83b5406271de",
+ circle="3c5409a1-3293-4181-a6fa-c24c37fc0c32",
+ arc="9c80ec18-b48c-41b0-bc6e-cd93d9c916aa",
+ polyline="66fa617b-e3e8-4480-9f1e-2c0688c1d21b",
+ rectangle="83da014b-a550-4bf5-89ff-16e54225bd5d",
+ curve="9ba89ec2-5315-435f-a621-b66c5fa2f301",
+ mesh="794a1f9d-21d5-4379-b987-9e8bbf433912",
+ surface="f4070a37-c822-410f-9057-100d2e22a22d",
+ subd="20f4ca9c-6c90-4fd6-ba8a-5bf9ca79db08",
+ brep="2ceb0405-fdfe-403d-a4d6-8786da45fb9d",
+ geometrybase="c37956f4-d39c-49c7-af71-1e87f8031b26"
+)
+
+EXPOSURE = dict(valid=set([-1, 2, 4, 8, 16, 32, 64, 128]), default=2)
+ACCESS = dict(valid=set([0, 1, 2]), map=dict(item=0, list=1, tree=2), default=0)
+PARAM_TYPE = dict(
+ valid=set(TYPES_MAP.values()), map=TYPES_MAP, default=TYPES_MAP["ghdoc"]
+)
+WIRE_DISPLAY = dict(
+ valid=set([0, 1, 2]), map=dict(default=0, faint=1, hidden=2), default=0
+)
+
+
+def fetch_ghio_lib(target_folder="temp"):
+ """Fetch the GH_IO.dll library from the NuGet packaging system."""
+ ghio_dll = "GH_IO.dll"
+ filename = "lib/net48/" + ghio_dll
+
+ response = urllib.request.urlopen("https://www.nuget.org/api/v2/package/Grasshopper/")
+ dst_file = os.path.join(target_folder, ghio_dll)
+ zip_file = zipfile.ZipFile(BytesIO(response.read()))
+
+ with zip_file.open(filename, "r") as zipped_dll:
+ with open(dst_file, "wb") as fp:
+ fp.write(zipped_dll.read())
+
+ return dst_file
+
+
+def find_ghio_assembly(libdir):
+ for root, _dirs, files in os.walk(libdir):
+ for basename in files:
+ if basename.upper() == "GH_IO.DLL":
+ filename = os.path.join(root, basename)
+ return filename
+
+
+def bitmap_from_image_path(image_path):
+ with open(image_path, "rb") as imageFile:
+ # Ensure img_string is a string, not a bytes object
+ img_string = base64.b64encode(imageFile.read())
+ if isinstance(img_string, bytes):
+ img_string = img_string.decode()
+
+ # Now you can pass img_string to the FromBase64String method
+ return System.Convert.FromBase64String(img_string)
+ # return System.Convert.FromBase64String(img_string)
+
+
+def validate_source_bundle(source):
+ icon = os.path.join(source, "icon.png")
+ code = os.path.join(source, "code.py")
+ data = os.path.join(source, "metadata.json")
+
+ if not os.path.exists(icon):
+ raise ValueError(
+ "icon missing, make sure icon.png is present in the source bundle: {}".format(
+ source
+ )
+ )
+ if not os.path.exists(code):
+ raise ValueError(
+ "code missing, make sure code.py is present in the source bundle: {}".format(
+ source
+ )
+ )
+ if not os.path.exists(data):
+ raise ValueError(
+ "metadata missing, make sure metadata.json is present in the source bundle: {}".format(
+ source
+ )
+ )
+
+ icon = bitmap_from_image_path(icon)
+
+ with open(code, "r") as f:
+ python_code = f.read()
+
+ with open(data, "r") as f:
+ data = json.load(f)
+
+ if "exposure" not in data:
+ data["exposure"] = EXPOSURE["default"]
+
+ if data["exposure"] not in EXPOSURE["valid"]:
+ raise ValueError(
+ "Invalid exposure value. Accepted values are {}".format(
+ sorted(EXPOSURE["valid"])
+ )
+ )
+
+ ghpython = data.get("ghpython")
+
+ if r'"""' not in python_code:
+ python_code = r'"""{}"""{}{}'.format(
+ data.get("description", "Generated by Componentizer"),
+ os.linesep,
+ python_code,
+ )
+
+ return icon, python_code, data
+
+
+def parse_param_access(access):
+ try:
+ access = int(access)
+ except ValueError:
+ # Maybe string?
+ access = ACCESS["map"].get(access)
+
+ if access not in ACCESS["valid"]:
+ raise ValueError(
+ "Invalid param access value. Valid values are {}".format(
+ sorted(ACCESS["valid"])
+ )
+ )
+
+ return access
+
+
+def parse_wire_display(wire_display):
+ try:
+ wire_display = int(wire_display)
+ except ValueError:
+ wire_display = WIRE_DISPLAY["map"].get(wire_display)
+
+ if wire_display not in WIRE_DISPLAY["valid"]:
+ raise ValueError(
+ "Invalid wire display value. Valid values are {}".format(
+ sorted(WIRE_DISPLAY["valid"])
+ )
+ )
+
+ return wire_display
+
+
+def parse_param_type_hint(type_hint_id):
+ type_hint_id = type_hint_id or PARAM_TYPE["default"]
+
+ if type_hint_id in TYPES_MAP:
+ type_hint_id = TYPES_MAP[type_hint_id]
+
+ if type_hint_id not in PARAM_TYPE["valid"]:
+ raise ValueError(
+ 'Invalid param type hint ID ("{}"). Valid values are {}'.format(
+ type_hint_id, sorted(PARAM_TYPE["valid"])
+ )
+ )
+
+ try:
+ type_hint_id = System.Guid.Parse(type_hint_id)
+ except SystemError:
+ raise ValueError("Unable to parse type hint ID: {}".format(type_hint_id))
+
+ return type_hint_id
+
+
+def replace_templates(code, version, name, ghuser_name):
+ if version:
+ code = TEMPLATE_VER.sub(version, code)
+
+ code = TEMPLATE_NAME.sub(name, code)
+ code = TEMPLATE_GHUSER_NAME.sub(ghuser_name, code)
+
+ return code
+
+
+def create_ghuser_component(source, target, version=None, prefix=None):
+ from GH_IO.Serialization import GH_LooseChunk
+
+ icon, code, data = validate_source_bundle(source)
+
+ code = replace_templates(code, version, data["name"], os.path.basename(target))
+
+ instance_guid = data.get("instanceGuid")
+ if not instance_guid:
+ instance_guid = System.Guid.NewGuid()
+ else:
+ instance_guid = System.Guid.Parse(instance_guid)
+
+ prefix = prefix or ""
+
+ root = GH_LooseChunk("UserObject")
+ root.SetGuid("BaseID", SCRIPT_COMPONENT_GUID)
+ root.SetString("Name", prefix + data["name"])
+ root.SetString("NickName", data["nickname"])
+ root.SetString("Description", data.get("description", ""))
+ root.SetString("ToolTip", data.get("description", ""))
+ root.SetInt32("Exposure", data.get("exposure", EXPOSURE["default"]))
+ root.SetString("Category", data["category"])
+ root.SetString("SubCategory", data["subcategory"])
+ root.SetGuid("InstanceGuid", instance_guid)
+ root.SetByteArray("Icon", icon)
+
+ ghpython_data = data["ghpython"]
+
+ ghpython_root = GH_LooseChunk("UserObject")
+ ghpython_root.SetString("Description", data.get("description", ""))
+ bitmap_icon = System.Drawing.Bitmap.FromStream(System.IO.MemoryStream(icon))
+ ghpython_root.SetDrawingBitmap("IconOverride", bitmap_icon)
+ ghpython_root.SetBoolean("UsingLibraryInputParam", False)
+ ghpython_root.SetBoolean("UsingScriptInputParam", False)
+ ghpython_root.SetBoolean("UsingStandardOutputParam", False)
+ ghpython_root.SetInt32("IconDisplay", ghpython_data.get("iconDisplay", 0))
+ ghpython_root.SetString("Name", data["name"])
+ ghpython_root.SetString("NickName", data["nickname"])
+ ghpython_root.SetBoolean("MarshalGuids", ghpython_data.get("marshalGuids", True))
+
+ # ghpython_root.CreateChunk('Attributes')
+ # for mf in ('Bounds', 'Pivot', 'Selected'):
+
+ params = ghpython_root.CreateChunk("ParameterData")
+ inputParam = ghpython_data.get("inputParameters", [])
+ outputParam = ghpython_data.get("outputParameters", [])
+
+ params.SetInt32("InputCount", len(inputParam))
+ for i, _pi in enumerate(inputParam):
+ params.SetGuid(
+ "InputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa")
+ )
+ params.SetInt32("OutputCount", len(outputParam))
+ for i, _po in enumerate(outputParam):
+ params.SetGuid(
+ "OutputId", i, System.Guid.Parse("08908df5-fa14-4982-9ab2-1aa0927566aa")
+ )
+
+ for i, pi in enumerate(inputParam):
+ input_instance_guid = System.Guid.NewGuid()
+ pi_chunk = params.CreateChunk("InputParam", i)
+ pi_chunk.SetString("Name", pi["name"])
+ pi_chunk.SetString("NickName", pi.get("nickname") or pi["name"])
+ pi_chunk.SetString("Description", pi.get("description"))
+ pi_chunk.SetBoolean("Optional", pi.get("optional", True))
+ pi_chunk.SetString("ToolTip", pi.get("description", ""))
+ pi_chunk.SetBoolean("AllowTreeAccess", pi.get("allowTreeAccess", True))
+ pi_chunk.SetBoolean("ShowTypeHints", pi.get("showTypeHints", True))
+ pi_chunk.SetInt32(
+ "ScriptParamAccess",
+ parse_param_access(pi.get("scriptParamAccess", ACCESS["default"])),
+ )
+ pi_chunk.SetInt32("SourceCount", pi.get("sourceCount", 0))
+ pi_chunk.SetGuid("InstanceGuid", input_instance_guid)
+ pi_chunk.SetGuid("TypeHintID", parse_param_type_hint(pi.get("typeHintID")))
+ pi_chunk.SetInt32(
+ "WireDisplay",
+ parse_wire_display(pi.get("wireDisplay", WIRE_DISPLAY["default"])),
+ )
+ pi_chunk.SetBoolean("ReverseData", pi.get("reverse", False))
+ pi_chunk.SetBoolean("SimplifyData", pi.get("simplify", False))
+ if pi.get("flatten", False):
+ pi_chunk.SetInt32("Mapping", 1)
+ elif pi.get("graft", False):
+ pi_chunk.SetInt32("Mapping", 2)
+
+ for i, po in enumerate(outputParam):
+ output_instance_guid = System.Guid.NewGuid()
+ po_chunk = params.CreateChunk("OutputParam", i)
+ po_chunk.SetString("Name", po["name"])
+ po_chunk.SetString("NickName", po.get("nickname") or po["name"])
+ po_chunk.SetString("Description", po.get("description"))
+ po_chunk.SetBoolean("Optional", po.get("optional", False))
+ po_chunk.SetString("ToolTip", po.get("description", ""))
+ po_chunk.SetInt32("SourceCount", po.get("sourceCount", 0))
+ po_chunk.SetGuid("InstanceGuid", output_instance_guid)
+ po_chunk.SetBoolean("ReverseData", po.get("reverse", False))
+ po_chunk.SetBoolean("SimplifyData", po.get("simplify", False))
+ if po.get("flatten", False):
+ po_chunk.SetInt32("Mapping", 1)
+ elif po.get("graft", False):
+ po_chunk.SetInt32("Mapping", 2)
+
+ script = ghpython_root.CreateChunk("Script")
+
+ code_base64 = base64.b64encode(code.encode("utf-8"))
+ code_base64 = str(code_base64)[2:-1]
+ script.SetString("Text", code_base64)
+ script.SetString("Title", "S")
+ language_spec = script.CreateChunk("LanguageSpec")
+ language_spec.SetString("Taxon", "*.*.python")
+ language_spec.SetString("Version", CPY_VER)
+
+ # xml_serialized = ghpython_root.Serialize_Xml()
+ root.SetByteArray("Object", ghpython_root.Serialize_Binary())
+ System.IO.File.WriteAllBytes(target, root.Serialize_Binary())
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(
+ description="Create GHUser components out of python code."
+ )
+ parser.add_argument(
+ "source",
+ type=str,
+ help="Source directory where code for all components is stored",
+ )
+ parser.add_argument("target", type=str, help="Target directory for ghuser files")
+ parser.add_argument(
+ "--ghio",
+ type=str,
+ required=False,
+ help="Folder where the GH_IO.dll assembly is located. Defaults to ./lib",
+ )
+ parser.add_argument(
+ "--version", type=str, required=False, help="Version to tag components"
+ )
+ parser.add_argument(
+ "--prefix",
+ type=str,
+ required=False,
+ help="Add this prefix to the name of each generated component",
+ )
+ args = parser.parse_args()
+
+ sourcedir = args.source
+ if not os.path.isabs(sourcedir):
+ sourcedir = os.path.abspath(sourcedir)
+
+ targetdir = args.target
+ if not os.path.isabs(targetdir):
+ targetdir = os.path.abspath(targetdir)
+
+ if args.ghio is None:
+ libdir = tempfile.mkdtemp("ghio")
+ fetch_ghio_lib(libdir)
+ else:
+ libdir = os.path.abspath(args.ghio)
+ gh_io = find_ghio_assembly(libdir)
+ source_bundles = [
+ d
+ for d in os.listdir(sourcedir)
+ if os.path.isdir(os.path.join(sourcedir, d))
+ and d not in ("__pycache__", ".git")
+ ]
+
+ print("GHPython componentizer")
+ print("======================")
+
+ print("[x] Source: {} ({} components)".format(sourcedir, len(source_bundles)))
+ print("[ ] Target: {}\r".format(targetdir), end="")
+ if not os.path.exists(targetdir):
+ os.mkdir(targetdir)
+ print("[x]")
+
+ if not gh_io:
+ print("[-] Cannot find GH_IO Assembly! Aborting.")
+ sys.exit(-1)
+
+ clr.AddReference(os.path.splitext(gh_io)[0])
+
+ print("[x] GH_IO assembly: {}".format(gh_io))
+
+ print("Processing component bundles:")
+ for d in source_bundles:
+ source = os.path.join(sourcedir, d)
+ target = os.path.join(targetdir, d + ".ghuser")
+ print(" [ ] {}\r".format(d), end="")
+ create_ghuser_component(source, target, args.version, args.prefix)
+ print(" [x] {} => {}".format(d, target))
\ No newline at end of file
From 05afa78ddad8bda65c58a64bfd4d407505198713 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 20:55:41 +0200
Subject: [PATCH 019/141] FIX: correct categories for metadata componentizer
---
src/gh/components/xml_exporter/metadata.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/gh/components/xml_exporter/metadata.json b/src/gh/components/xml_exporter/metadata.json
index de14ce2e..4d2ba635 100644
--- a/src/gh/components/xml_exporter/metadata.json
+++ b/src/gh/components/xml_exporter/metadata.json
@@ -1,8 +1,8 @@
{
"name": "Exporter to xml",
"nickname": "XMLout",
- "category": "Utilities",
- "subcategory": "ALL",
+ "category": "diffCheck",
+ "subcategory": "Utility",
"description": "This component reads breps, convert them to DFBeams and DFAssemblies and export it to XML.",
"exposure": 4,
"instanceGuid": "cdae4bd5-d18e-4b06-9367-791b6b1f6837",
From 6ef7bf1b96b310a17a892db660ccc1cb05ac14ff Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 20:58:06 +0200
Subject: [PATCH 020/141] FIX-WIP: solving problem with metadata componentizer
---
src/gh/components/xml_exporter/metadata.json | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/gh/components/xml_exporter/metadata.json b/src/gh/components/xml_exporter/metadata.json
index 4d2ba635..438b6f20 100644
--- a/src/gh/components/xml_exporter/metadata.json
+++ b/src/gh/components/xml_exporter/metadata.json
@@ -23,8 +23,7 @@
"scriptParamAccess": "item",
"wireDisplay": "default",
"sourceCount": 0,
- "typeHintID": "bool",
- "simplify": false
+ "typeHintID": "bool"
},
{
"name": "i_export_dir",
@@ -36,7 +35,7 @@
"scriptParamAccess": "item",
"wireDisplay": "default",
"sourceCount": 0,
- "typeHintID": "str",
+ "typeHintID": "str"
},
{
"name": "i_breps",
@@ -48,8 +47,7 @@
"scriptParamAccess": "list",
"wireDisplay": "default",
"sourceCount": 0,
- "typeHintID": "brep",
- "simplify": false
+ "typeHintID": "brep"
}
],
"outputParameters": [
From 8068233fca5b80920e3c1be90b5f43ffb064b591 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Sun, 7 Apr 2024 22:17:40 +0200
Subject: [PATCH 021/141] ADD: badge to readme for pypi
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index de5fb3b4..5927947b 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,7 @@
+
From 1d72a739d84887ec02efcee12b369872c5e398e9 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Mon, 8 Apr 2024 12:10:47 +0200
Subject: [PATCH 022/141] WIP-FLASH: basic reverse transform, working on
detection
---
src/gh/diffCheck/diffCheck/df_cut.py | 130 +++
src/gh/diffCheck/diffCheck/df_hole.py | 241 +++++
.../diffCheck/diffCheck/df_joint_detector.py | 252 +++++
.../diffCheck/diffCheck/df_transformations.py | 123 +++
src/gh/diffCheck/diffCheck/diffCheck_app.py | 191 +++-
src/gh/diffCheck/diffCheck/joint_detector.py | 0
src/gh/tester.ghx | 908 +++++++++++-------
7 files changed, 1494 insertions(+), 351 deletions(-)
create mode 100644 src/gh/diffCheck/diffCheck/df_cut.py
create mode 100644 src/gh/diffCheck/diffCheck/df_hole.py
create mode 100644 src/gh/diffCheck/diffCheck/df_joint_detector.py
create mode 100644 src/gh/diffCheck/diffCheck/df_transformations.py
delete mode 100644 src/gh/diffCheck/diffCheck/joint_detector.py
diff --git a/src/gh/diffCheck/diffCheck/df_cut.py b/src/gh/diffCheck/diffCheck/df_cut.py
new file mode 100644
index 00000000..a1793266
--- /dev/null
+++ b/src/gh/diffCheck/diffCheck/df_cut.py
@@ -0,0 +1,130 @@
+import Rhino as rc
+import Rhino.Geometry as rg
+import rhinoscriptsyntax as rs
+import scriptcontext as sc
+
+import log
+import util
+import acim
+import visual_debug as vd
+
+import random
+
+def parse_data_from_brep(ACIM,
+ p_GUID,
+ cut_b,
+ bbox_b):
+ """
+ Parse data from a brep defining a cut
+ :param ACIM: the ACIM object to export xml
+ :param p_GUID: the guid of the timber
+ :param box_b: the brep defining the cut
+ :param bbox_b: the brep of the bounding box
+ """
+ log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
+ log.info("Parsing cut data..")
+ bbox_faces_b = util.explode_brep(bbox_b)
+ cut_faces_b = util.explode_brep(cut_b)
+ log.info("Cut faces: " + str(len(cut_faces_b)))
+
+ acim_faces = []
+ acim_edges = []
+ # template dicts for faces and lines
+ acim_face_dict = {"face_id" : "1", # the id of the face
+ "exposed" : "True", # if the face is exposed
+ "edges" : "1 2 3", # the ids of the lines
+ "corners" : ["0 0 0", "1 1 1", "2 2 2"] # the coordinates of the corners
+ }
+ acim_edge_dict = {"line_id" : "1", # the id of the line
+ "start" : "0 0 0", # the start point of the line
+ "end" : "1 1 1", # the end point of the line
+ "exposed" : "true", # if the line is exposed
+ }
+
+ # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ log.info("Detecting cut centroid..")
+ cut_centroid = cut_b.GetBoundingBox(True).Center
+ cut_centroid_str = str(cut_centroid.X) + " " + str(cut_centroid.Y) + " " + str(cut_centroid.Z)
+
+ # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ log.info("Parsing lines..")
+ clr_edge = (0,0,0)
+ face_edges = cut_b.Edges
+ is_on_face = False
+ TEMP_line_ids = []
+ TEMP_line_midpoints = []
+ for i, face_edge in enumerate(face_edges):
+ acim_edge_dict["line_id"] = str(i)
+ acim_edge_dict["start"] = str(face_edge.PointAtStart.X) + " " + str(face_edge.PointAtStart.Y) + " " + str(face_edge.PointAtStart.Z)
+ acim_edge_dict["end"] = str(face_edge.PointAtEnd.X) + " " + str(face_edge.PointAtEnd.Y) + " " + str(face_edge.PointAtEnd.Z)
+
+ face_edge_center = face_edge.PointAtNormalizedLength(0.5)
+ if bbox_b.IsPointInside(face_edge_center, sc.doc.ModelAbsoluteTolerance, True):
+ is_on_face = False
+ clr_edge = (0,255,0)
+ else:
+ is_on_face = True
+ clr_edge = (255,0,0)
+ acim_edge_dict["exposed"] = str(is_on_face)
+
+ acim_edges.append(acim_edge_dict.copy())
+
+ vd.addPtName(face_edge.PointAtStart, str(i), clr_edge)
+ vd.addLine(rg.Line(face_edge.PointAtStart, face_edge.PointAtEnd), clr_edge)
+
+ TEMP_line_ids.append(i)
+ TEMP_line_midpoints.append(face_edge_center)
+
+ # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ log.info("Parsing faces..")
+ clr_face = (0,0,0)
+ for i, face in enumerate(cut_faces_b):
+ edges_candidate_ids = []
+ acim_face_dict["face_id"] = str(i)
+
+ face_edges = face.Edges
+ is_on_face = False
+
+ # corners
+ corners = util.compute_ordered_vertices(face)
+ corners_str = []
+ for corner in corners:
+ corners_str.append(str(corner.X) + " " + str(corner.Y) + " " + str(corner.Z))
+ acim_face_dict["corners"] = corners_str
+
+ # edges indices
+ for i, face_edge in enumerate(face_edges):
+ face_edge_center = face_edge.PointAtNormalizedLength(0.5)
+ idx = util.detect_idx_pt_in_list(face_edge_center, TEMP_line_midpoints)
+ if idx != -1:
+ edges_candidate_ids.append(TEMP_line_ids[idx])
+ vertex = face_edge.PointAtStart
+ acim_face_dict["edges"] = " ".join(str(x) for x in edges_candidate_ids)
+
+ # face exposed value
+ polyline_corners = corners
+ polyline_corners.append(corners[0])
+ polyline = rg.Polyline(corners)
+ # vd.addPolyline(polyline, (0,0,0))
+ face_center = polyline.CenterPoint()
+ # log.info("Face center: " + str(face_center))
+ # vd.addBrep(bbox_b, (0,0,0))
+ if bbox_b.IsPointInside(face_center, sc.doc.ModelAbsoluteTolerance, True):
+ is_on_face = False
+ clr_face = (0,255,0)
+ else:
+ is_on_face = True
+ clr_face = (255,0,0)
+ vd.addPtName(face_center, acim_face_dict["edges"], clr_face)
+ acim_face_dict["exposed"] = str(is_on_face)
+
+ acim_faces.append(acim_face_dict.copy())
+
+ # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ log.info("Dumping cut in acim..")
+ ACIM.add_cut(
+ p_GUID,
+ cut_centroid_str,
+ acim_edges,
+ acim_faces
+ )
diff --git a/src/gh/diffCheck/diffCheck/df_hole.py b/src/gh/diffCheck/diffCheck/df_hole.py
new file mode 100644
index 00000000..95f9adc5
--- /dev/null
+++ b/src/gh/diffCheck/diffCheck/df_hole.py
@@ -0,0 +1,241 @@
+import Rhino as rc
+import Rhino.Geometry as rg
+import rhinoscriptsyntax as rs
+import scriptcontext as sc
+import random
+
+import log
+import acim
+import visual_debug as vd
+import util
+
+
+def _get_radius_from_curved_brep_faces(cylinder_faces_b, start_pt, end_pt):
+ for face in cylinder_faces_b:
+ if not face.Faces[0].IsPlanar():
+ face_curves = face.DuplicateEdgeCurves(True)
+ face_crv = face_curves[0]
+ pt_base = face_crv.PointAtStart
+ axis_ln = rg.Line(start_pt, end_pt)
+ radius = axis_ln.DistanceTo(pt_base, False)
+ radius = round(radius, 3)
+ log.info("radius: " + str(radius))
+ return round(radius, 3)
+
+def _get_single_face_brep_center(brep):
+ bbox = brep.GetBoundingBox(True)
+ bbox_b = bbox.ToBrep()
+ center_point = bbox_b.GetBoundingBox(True).Center
+ return center_point
+
+def parse_data_from_brep(ACIM,
+ p_GUID,
+ cylinder_b,
+ bbox_b):
+ """
+ Parse data from a brep defining a hole
+ :param ACIM: the ACIM object to export xml
+ :param p_GUID: the guid of the timber
+ :param cylinder_b: the brep defining the hole
+ :param bbox_b: the brep of the bounding box
+ """
+ log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
+ bbox_faces_b = util.explode_brep(bbox_b)
+ cylinder_faces_b = util.explode_brep(cylinder_b)
+ log.info("cylinder faces: " + str(len(cylinder_faces_b)))
+ # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ # get the centers of the cylinder's bases and if they are exposed
+ acim_centers = {}
+ for face in cylinder_faces_b:
+ if face.Faces[0].IsPlanar():
+ continue
+ face_curves = face.DuplicateEdgeCurves(True)
+ for face_crv in face_curves:
+ face_crv_center = util.get_crv_circle_center(face_crv)
+ is_on_face = False
+ if bbox_b.IsPointInside(face_crv_center, sc.doc.ModelAbsoluteTolerance, True):
+ if util.is_pt_unique_in_dict(face_crv_center, acim_centers):
+ acim_centers[face_crv_center] = is_on_face
+ vd.addPt(face_crv_center, (0,255,0))
+ continue
+ if rs.IsPointOnSurface(face, face_crv_center):
+ is_on_face = True
+ if util.is_pt_unique_in_dict(face_crv_center, acim_centers):
+ acim_centers[face_crv_center] = is_on_face
+ vd.addPt(face_crv_center, (255,0,0))
+ log.info("length of acim_centers: " + str(len(acim_centers)))
+
+ # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ # parse simple holes or sub-holes
+ centers_len = len(acim_centers)
+ if centers_len == 0:
+ log.error("No center found for the hole. Exiting...")
+ return
+ if centers_len == 1:
+ log.info("Single center found for the hole. Exiting...")
+ return
+ if centers_len == 2:
+ log.info("Simple 2-points hole detected")
+ start_pt = rg.Point3d(0,0,0)
+ end_pt = rg.Point3d(0,0,0)
+ is_start_pt_accessible = False
+ is_end_pt_accessible = False
+ if acim_centers.values()[0]:
+ start_pt = acim_centers.keys()[0]
+ end_pt = acim_centers.keys()[1]
+ is_start_pt_accessible = acim_centers.values()[0]
+ is_end_pt_accessible = acim_centers.values()[1]
+ else:
+ start_pt = acim_centers.keys()[1]
+ end_pt = acim_centers.keys()[0]
+ is_start_pt_accessible = acim_centers.values()[1]
+ is_end_pt_accessible = acim_centers.values()[0]
+
+ radius = _get_radius_from_curved_brep_faces(cylinder_faces_b, start_pt, end_pt)
+ log.info("radius: " + str(radius))
+ vd.addLine(rg.Line(start_pt, end_pt), (255,165,0))
+ vd.addDotPt(ptA=start_pt, ptB=end_pt, clr=(0,255,0), txt=str(ACIM.peek_current_hole_id(p_GUID)))
+
+ for face in cylinder_faces_b:
+ if not face.Faces[0].IsPlanar():
+ face_curves = face.DuplicateEdgeCurves(True)
+ vd.addCurve(face_curves[0], (255,0,255))
+ vd.addCurve(face_curves[1], (255,0,255))
+
+ ACIM.add_hole(p_GUID,
+ start_pt,
+ end_pt,
+ is_start_pt_accessible,
+ is_end_pt_accessible,
+ radius)
+ if centers_len > 2:
+ log.info("Complex hole detected")
+ holes = []
+
+ # get longest line
+ dists = []
+ extreme_pts = []
+ for i in range(0, centers_len):
+ for j in range(i+1, centers_len):
+ pt1 = acim_centers.keys()[i]
+ pt2 = acim_centers.keys()[j]
+ dist = pt1.DistanceTo(pt2)
+ dists.append(dist)
+ if dist >= max(dists) or len(dists) == 0:
+ extreme_pts = [i, j]
+
+ extreme_pts = [acim_centers.keys()[extreme_pts[0]],
+ acim_centers.keys()[extreme_pts[1]]]
+ longest_ln = rg.Line(extreme_pts[0], extreme_pts[1])
+ longest_crv = longest_ln.ToNurbsCurve()
+
+ centers_lst_reorder = list(acim_centers.keys())
+ centers_lst_reorder.sort(key=lambda x: extreme_pts[0].DistanceTo(x))
+
+ #create segments
+ hole_axis_ln = []
+ for i in range(0, centers_len-1):
+ pt1 = centers_lst_reorder[i]
+ pt2 = centers_lst_reorder[i+1]
+ ln = rg.Line(pt1, pt2)
+ hole_axis_ln.append(ln)
+
+ # detect neighbours
+ neighbor_lst = []
+ for i in range(0, len(hole_axis_ln)):
+ for j in range(0, len(hole_axis_ln)):
+ if i == j:
+ continue
+ if hole_axis_ln[i].DistanceTo(hole_axis_ln[j].From, False) < 0.01:
+ neighbor_lst.append([i, j])
+ break
+ if hole_axis_ln[i].DistanceTo(hole_axis_ln[j].To, False) < 0.01:
+ neighbor_lst.append([i, j])
+ break
+ log.info("neighbor pattern for current hole set: " + str(neighbor_lst))
+ next_hole_ids = []
+ current_hole_id = ACIM.peek_current_hole_id(p_GUID)
+ for i in range(1, len(neighbor_lst)+1):
+ next_hole_ids.append(current_hole_id)
+ current_hole_id += 1
+ log.info("next hole ids: " + str(next_hole_ids))
+ neighbor_acim_str = []
+ for i in range(0, len(neighbor_lst)):
+ temp_str = ""
+ for j in range(1, len(neighbor_lst[i])):
+ temp_str += str(next_hole_ids[neighbor_lst[i][j]]) + " "
+ temp_str = temp_str[:-1]
+ neighbor_acim_str.append(temp_str)
+ log.info("neighbor acim str: " + str(neighbor_acim_str))
+
+ for i, axis_ln in enumerate(hole_axis_ln):
+ vd.addLine(axis_ln, (255,165,0))
+ vd.addDotLn(ln=axis_ln, clr=(30,255,230), txt=str(ACIM.peek_current_hole_id(p_GUID)))
+
+ start_pt = rg.Point3d(0,0,0)
+ end_pt = rg.Point3d(0,0,0)
+ is_start_pt_accessible = False
+ is_end_pt_accessible = False
+ pt_1 = axis_ln.PointAt(0)
+ pt_2 = axis_ln.PointAt(1)
+ if acim_centers[pt_1]:
+ start_pt = pt_1
+ end_pt = pt_2
+ is_start_pt_accessible = acim_centers[pt_1]
+ is_end_pt_accessible = acim_centers[pt_2]
+ else:
+ start_pt = pt_2
+ end_pt = pt_1
+ is_start_pt_accessible = acim_centers[pt_2]
+ is_end_pt_accessible = acim_centers[pt_1]
+
+ for face in cylinder_faces_b:
+ if not face.Faces[0].IsPlanar():
+ radius = 0
+ face_curves = face.DuplicateEdgeCurves(True)
+ face_center_A = util.get_crv_circle_center(face_curves[0])
+ face_center_B = util.get_crv_circle_center(face_curves[1])
+
+ vd.addCurve(face_curves[0], (255,0,255))
+ vd.addCurve(face_curves[1], (255,0,255))
+
+ f_0X = round(face_center_A.X, 3)
+ f_0Y = round(face_center_A.Y, 3)
+ f_0Z = round(face_center_A.Z, 3)
+
+ f_1X = round(face_center_B.X, 3)
+ f_1Y = round(face_center_B.Y, 3)
+ f_1Z = round(face_center_B.Z, 3)
+
+ sX = round(start_pt.X, 3)
+ sY = round(start_pt.Y, 3)
+ sZ = round(start_pt.Z, 3)
+
+ eX = round(end_pt.X, 3)
+ eY = round(end_pt.Y, 3)
+ eZ = round(end_pt.Z, 3)
+
+ if (f_0X == sX and f_0Y == sY and f_0Z == sZ) or (f_0X == eX and f_0Y == eY and f_0Z == eZ): # = start
+ if (f_1X == sX and f_1Y == sY and f_1Z == sZ) or (f_1X == eX and f_1Y == eY and f_1Z == eZ): # = end
+ ellipse_pt = face_curves[0].PointAtStart
+ radius = axis_ln.DistanceTo(ellipse_pt, False)
+ radius = round(radius, 3)
+ log.info("radius: " + str(radius))
+ break
+
+ ACIM.add_hole(p_GUID,
+ start_pt,
+ end_pt,
+ is_start_pt_accessible,
+ is_end_pt_accessible,
+ radius,
+ neighbours=neighbor_acim_str[i])
+
+
+
+
+
+
+
+
+
diff --git a/src/gh/diffCheck/diffCheck/df_joint_detector.py b/src/gh/diffCheck/diffCheck/df_joint_detector.py
new file mode 100644
index 00000000..40b25fee
--- /dev/null
+++ b/src/gh/diffCheck/diffCheck/df_joint_detector.py
@@ -0,0 +1,252 @@
+import rhinoscriptsyntax as rs
+import Rhino as rc
+import scriptcontext as sc
+import Rhino.Geometry as rg
+import datetime as dt
+import math
+
+import log
+import hole
+import cut
+import util
+
+# import visual_debug as vd
+
+def get_lowest_brep_vertex(brep):
+ """ Get the the vertex with the lowest y,x and z values """
+ biggest_vertices = brep.Vertices
+ lowest_x = 0
+ lowest_y = 0
+ lowest_z = 0
+ for vertex in biggest_vertices:
+ if vertex.Location.X < lowest_x:
+ lowest_x = vertex.Location.X
+ if vertex.Location.Y < lowest_y:
+ lowest_y = vertex.Location.Y
+ if vertex.Location.Z < lowest_z:
+ lowest_z = vertex.Location.Z
+ return rc.Geometry.Point3d(lowest_x, lowest_y, lowest_z)
+
+def pln_2_pln_world_transform(brep):
+ """ Transform a brep to the world plane """
+ print("Computing Oriented Bounding Boxes...")
+
+ # find the longest edge of the brep
+ edges = brep.Edges
+ longest_edge = None
+ longest_edge_length = 0
+ for edge in edges:
+ if edge.GetLength() > longest_edge_length:
+ longest_edge_length = edge.GetLength()
+ longest_edge = edge
+
+ # find biggest face
+ face_indices = longest_edge.AdjacentFaces()
+ faces = [brep.Faces[face_index] for face_index in face_indices]
+ biggest_face = None
+ biggest_face_area = 0
+ for face in faces:
+ if rg.AreaMassProperties.Compute(face).Area > biggest_face_area:
+ biggest_face_area = rg.AreaMassProperties.Compute(face).Area
+ biggest_face = face
+
+ # get the plane of the biggest face
+ if biggest_face.TryGetPlane()[0] is False:
+ print("Could not find plane for longest edge. Exiting...")
+ return
+ plane_src = biggest_face.TryGetPlane()[1]
+ plane_tgt = rc.Geometry.Plane.WorldXY
+ print("Found plane for longest edge: " + str(plane_src))
+
+ # plane to plane transformation
+ plane_to_world = rc.Geometry.Transform.PlaneToPlane(plane_src, plane_tgt)
+ brep.Transform(plane_to_world)
+
+ # adjust to x,y,z positive
+ lowest_vertex = get_lowest_brep_vertex(brep)
+ lowest_vertex_transform = rc.Geometry.Transform.Translation(rg.Vector3d(-lowest_vertex))
+ brep.Transform(lowest_vertex_transform)
+
+ bbox = brep.GetBoundingBox(True)
+ bbox_corners = bbox.GetCorners()
+ y_val_sum = 0
+ x_val_sum = 0
+ for corner in bbox_corners:
+ y_val_sum += corner.Y
+ x_val_sum += corner.X
+
+ if x_val_sum > y_val_sum:
+ print("Bounding box is alligned to x axis. No rotation needed.")
+ else:
+ print("Bounding box is not alligned to y axis. A 90 deg rotation is needed.")
+ rot_90_z = rc.Geometry.Transform.Rotation(math.radians(90), rg.Vector3d.ZAxis, rg.Point3d.Origin)
+ brep.Transform(rot_90_z)
+ lowest_vertex = get_lowest_brep_vertex(brep)
+
+ lowest_vertex_transform = rc.Geometry.Transform.Translation(rg.Vector3d(-lowest_vertex))
+ brep.Transform(lowest_vertex_transform)
+
+ # vd.addBrep(brep, clr=(255, 0, 0, 30))
+
+def distinguish_holes_cuts(breps):
+ """
+ Analyse the result breps from the boolean difference operation
+ and distinguish between holes and cuts
+ """
+ is_hole = False
+ is_cut = False
+ is_mix = False
+ holes_b = []
+ cuts_b = []
+ mix_b = []
+
+ # parse holes, cuts and mix
+ for b in breps:
+ is_cut = True
+ for f in b.Faces:
+ f_brep = f.ToBrep()
+ f = f_brep.Faces[0]
+ if not f.IsPlanar():
+ is_cut = False
+ is_hole = True
+ b_faces = util.explode_brep(b)
+ for b_face in b_faces:
+ if b_face.Faces[0].IsPlanar():
+ b_face_edges = b_face.Edges
+ for b_face_edge in b_face_edges:
+ if not b_face_edge.IsClosed:
+ is_mix = True
+ is_hole = False
+ break
+ if is_mix:
+ break
+ break
+
+ if is_hole:
+ holes_b.append(b)
+ elif is_cut:
+ cuts_b.append(b)
+ elif is_mix:
+ mix_b.append(b)
+
+ is_hole = False
+ is_cut = False
+ is_mix = False
+
+ # deal with mix
+ candidate_cuts = []
+ candidate_holes = []
+ for b in mix_b:
+ # -- algorithm draft --
+ # (1) explode
+ # (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
+ # (3) cap each object in both lists
+ # (4) boolunion every object in both lists
+ # (5) check if closed, if it is
+ # ----------------------
+ # (1) explode
+ faces_b = util.explode_brep(b)
+
+ # (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
+ flat_faces_b = []
+ non_flat_faces_b = []
+ for f_b in faces_b:
+ if f_b.Faces[0].IsPlanar():
+ flat_faces_b.append(f_b)
+ else:
+ non_flat_faces_b.append(f_b)
+
+ # (*) cap the cylinders
+ non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
+
+ # (4) boolunion every object in both lists
+ flat_faces_b = rc.Geometry.Brep.CreateBooleanUnion(flat_faces_b, sc.doc.ModelAbsoluteTolerance)
+ non_flat_faces_b = rc.Geometry.Brep.CreateBooleanUnion(non_flat_faces_b, sc.doc.ModelAbsoluteTolerance)
+
+ # (3) cap candidate cuts
+ flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in flat_faces_b]
+ # non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
+
+ # (*) merge all coplanar faces in breps cut candidates
+ for f_b in flat_faces_b:
+ if f_b is not None:
+ f_b.MergeCoplanarFaces(sc.doc.ModelAbsoluteTolerance)
+
+ # (5) check if closed, if it is add to cuts, if not add to holes
+ for f_b in flat_faces_b:
+ if f_b is not None:
+ if f_b.IsSolid:
+ cuts_b.append(f_b)
+ for f_b in non_flat_faces_b:
+ if f_b is not None:
+ if f_b.IsSolid:
+ holes_b.append(f_b)
+
+ return holes_b, cuts_b
+
+def main():
+
+ # vd.set_on()
+ # print(vd.__IS_VDEBUG__)
+
+ print(".acim exporter started")
+ rh_doc_path = rs.DocumentPath()
+ timestamp = dt.datetime.now().strftime("%Y%m%d_%H%M%S")
+ acim_path = rh_doc_path + timestamp
+ print("Creating ACIM file at: " + acim_path)
+ ACIM = acim.ACIM(acim_path)
+
+ pieces = rs.GetObjects("Select pieces to be exported", rs.filter.polysurface, preselect=True)
+ if not pieces:
+ print("No pieces selected. Exiting...")
+ return
+ print("Selected " + str(len(pieces)) + " pieces.")
+
+ for p_GUID in pieces:
+ print("Processing piece: " + str(p_GUID))
+ ACIM.add_timber(str(p_GUID))
+ ACIM.add_timber_state(str(p_GUID), 0)
+ brep = rs.coercebrep(p_GUID)
+
+ # transform to world plane
+ pln_2_pln_world_transform(brep)
+
+ # compute the bounding box
+ bbox = brep.GetBoundingBox(True)
+ bbox_b = bbox.ToBrep()
+ ACIM.add_bbox(str(p_GUID), bbox.GetCorners())
+
+ # boolean difference between the bounding box and the brep transformed
+ brep_result = rc.Geometry.Brep.CreateBooleanDifference(bbox_b, brep, sc.doc.ModelAbsoluteTolerance)
+ if brep_result is None or len(brep_result) == 0:
+ log.error("No breps found after boolean difference. Exiting...")
+ return
+
+ # get holes and cuts breps
+ holes_b, cuts_b = distinguish_holes_cuts(brep_result)
+ print("Found:\n" \
+ + "\t --holes: " + str(len(holes_b)) + "\n" \
+ + "\t --cuts: " + str(len(cuts_b)) + "\n")
+
+ # analyse and loading holes and cuts into .acim
+ if holes_b.__len__() != 0:
+ for hole_b in holes_b:
+ # vd.addBrep(hole_b, clr=(255, 255, 0, 30))
+ print("Processing hole: " + str(hole_b))
+ hole.parse_data_from_brep(ACIM, str(p_GUID), hole_b, bbox_b)
+
+ if cuts_b.__len__() != 0:
+ cut_counter = 1
+ for cut_b in cuts_b:
+ # vd.addBrep(cut_b, clr=(255, 0, 255, 30))
+ print("Processing cut: " + str(cut_b))
+ cut.parse_data_from_brep(ACIM, str(p_GUID), cut_b, bbox_b)
+
+ # vd.addSingleDot(cut_b.GetBoundingBox(True).Center, str(cut_counter), (0,0,255))
+ cut_counter += 1
+
+ sc.doc.Views.Redraw()
+ ACIM.dump_data()
+
+if __name__ == '__main__':
+ main()
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/df_transformations.py b/src/gh/diffCheck/diffCheck/df_transformations.py
new file mode 100644
index 00000000..7e3b434c
--- /dev/null
+++ b/src/gh/diffCheck/diffCheck/df_transformations.py
@@ -0,0 +1,123 @@
+import Rhino
+import Rhino.Geometry as rg
+import scriptcontext as sc
+
+import numpy as np
+
+def get_inverse_transformation(x_form : Rhino.Geometry.Transform) -> Rhino.Geometry.Transform:
+ """
+ Get the inverse of a transformation
+
+ :param x_form: the transformation to get the inverse from
+ :return: the inverse transformation
+ """
+ transformation_matrix = np.array([
+ [x_form.M00, x_form.M01, x_form.M02, x_form.M03],
+ [x_form.M10, x_form.M11, x_form.M12, x_form.M13],
+ [x_form.M20, x_form.M21, x_form.M22, x_form.M23],
+ [x_form.M30, x_form.M31, x_form.M32, x_form.M33]
+ ])
+ inverse_transformation_matrix = np.linalg.inv(transformation_matrix)
+
+ x_form_back = Rhino.Geometry.Transform()
+ for i in range(4):
+ for j in range(4):
+ x_form_back[i, j] = inverse_transformation_matrix[i, j]
+
+ return x_form_back
+
+def pln_2_pln_world_transform(brep : Rhino.Geometry.Brep) -> Rhino.Geometry.Transform:
+ """
+ Transform a brep (beam) to the world plane
+
+ :param brep: the brep to transform
+ :return: the transformation
+ """
+ def _get_lowest_brep_vertex(brep) -> Rhino.Geometry.Point3d:
+ """
+ Get the the vertex with the lowest y,x and z values
+
+ :param brep: the brep to get the lowest vertex from
+ :return: the lowest vertex
+ """
+ biggest_vertices = brep.Vertices
+ lowest_x = 0
+ lowest_y = 0
+ lowest_z = 0
+ for vertex in biggest_vertices:
+ if vertex.Location.X < lowest_x:
+ lowest_x = vertex.Location.X
+ if vertex.Location.Y < lowest_y:
+ lowest_y = vertex.Location.Y
+ if vertex.Location.Z < lowest_z:
+ lowest_z = vertex.Location.Z
+ return Rhino.Geometry.Point3d(lowest_x, lowest_y, lowest_z)
+
+ # find the longest edge of the brep
+ edges = brep.Edges
+ longest_edge = None
+ longest_edge_length = 0
+ for edge in edges:
+ if edge.GetLength() > longest_edge_length:
+ longest_edge_length = edge.GetLength()
+ longest_edge = edge
+
+ # find biggest face
+ face_indices = longest_edge.AdjacentFaces()
+ faces = [brep.Faces[face_index] for face_index in face_indices]
+ biggest_face = None
+ biggest_face_area = 0
+ for face in faces:
+ if rg.AreaMassProperties.Compute(face).Area > biggest_face_area:
+ biggest_face_area = rg.AreaMassProperties.Compute(face).Area
+ biggest_face = face
+
+ # get the plane of the biggest face
+ if biggest_face.TryGetPlane()[0] is False:
+ log.error("Could not find plane for longest edge. Exiting...")
+ return
+ plane_src = biggest_face.TryGetPlane()[1]
+ plane_tgt = Rhino.Geometry.Plane.WorldXY
+ print("Found plane for longest edge: " + str(plane_src))
+
+ # plane to plane transformation
+ x_form_pln2pln = Rhino.Geometry.Transform.PlaneToPlane(plane_src, plane_tgt)
+ brep.Transform(x_form_pln2pln)
+
+ # adjust to x,y,z positive
+ lowest_vertex = _get_lowest_brep_vertex(brep)
+ x_form_transl_A = Rhino.Geometry.Transform.Translation(rg.Vector3d(-lowest_vertex))
+ brep.Transform(x_form_transl_A)
+
+ # aabb
+ bbox = brep.GetBoundingBox(True)
+ bbox_corners = bbox.GetCorners()
+ y_val_sum = 0
+ x_val_sum = 0
+ for corner in bbox_corners:
+ y_val_sum += corner.Y
+ x_val_sum += corner.X
+
+ # check if a 90 deg rotation is needed (for the joint detector)
+ x_form_transl_B = None
+ x_form_rot90z = None
+ if x_val_sum > y_val_sum:
+ print("Bounding box is alligned to x axis. No rotation needed.")
+ else:
+ print("Bounding box is not alligned to y axis. A 90 deg rotation is needed.")
+ x_form_rot90z = Rhino.Geometry.Transform.Rotation(math.radians(90), rg.Vector3d.ZAxis, rg.Point3d.Origin)
+ brep.Transform(x_form_rot90z)
+ lowest_vertex = _get_lowest_brep_vertex(brep)
+
+ x_form_transl_B = Rhino.Geometry.Transform.Translation(rg.Vector3d(-lowest_vertex))
+ brep.Transform(x_form_transl_B)
+
+ # resume the transformations in one
+ x_form = Rhino.Geometry.Transform.Identity
+ if x_form_transl_B:
+ Rhino.Geometry.Transform.TryGetInverse(x_form_transl_B)
+ Rhino.Geometry.Transform.TryGetInverse(x_form_rot90z)
+ x_form = x_form_transl_B * x_form_rot90z
+ x_form = x_form * x_form_transl_A * x_form_pln2pln
+
+ return x_form
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck/diffCheck_app.py
index 61cc5684..f9d5d644 100644
--- a/src/gh/diffCheck/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck/diffCheck_app.py
@@ -1,33 +1,178 @@
#! python3
import Rhino
import Rhino.Geometry as rg
+import scriptcontext as sc
import os
import typing
-from df_geometries import DFBeam, DFAssembly # diffCheck.df_geometries
+from df_geometries import DFBeam, DFAssembly # diffCheck.
+import df_transformations # diffCheck.
-if __name__ == "__main__":
- """
- Main function to test the package
- :param i_breps: list of breps
- :param i_export_dir: directory to export the xml
- :param i_dump: whether to dump the xml
+
+
+ # vd.addBrep(brep, clr=(255, 0, 0, 30))
+
+
+def distinguish_holes_cuts(breps) -> typing.Tuple[typing.List[Rhino.Geometry.Brep], typing.List[Rhino.Geometry.Brep]]:
+ """
+ Analyse the result breps from the boolean difference operation
+ and distinguish between holes and cuts
+
+ :param breps: list of breps
+ :return: holes and cuts breps
"""
- # beams
- beams : typing.List[DFBeam] = []
- for brep in i_breps:
- beam = DFBeam.from_brep(brep)
- beams.append(beam)
-
- # assembly
- assembly1 = DFAssembly(beams, "Assembly1")
- print(assembly1.beams)
- print(assembly1)
-
- # dump the xml
- xml : str = assembly1.to_xml()
- if i_dump:
- assembly1.dump(xml, i_export_dir)
- o_xml = xml
\ No newline at end of file
+ is_hole = False
+ is_cut = False
+ is_mix = False
+ holes_b = []
+ cuts_b = []
+ mix_b = []
+
+ # parse holes, cuts and mix
+ for b in breps:
+ is_cut = True
+ for f in b.Faces:
+ f_brep = f.ToBrep()
+ f = f_brep.Faces[0]
+ if not f.IsPlanar():
+ is_cut = False
+ is_hole = True
+ b_faces = util.explode_brep(b)
+ for b_face in b_faces:
+ if b_face.Faces[0].IsPlanar():
+ b_face_edges = b_face.Edges
+ for b_face_edge in b_face_edges:
+ if not b_face_edge.IsClosed:
+ is_mix = True
+ is_hole = False
+ break
+ if is_mix:
+ break
+ break
+
+ if is_hole:
+ holes_b.append(b)
+ elif is_cut:
+ cuts_b.append(b)
+ elif is_mix:
+ mix_b.append(b)
+
+ is_hole = False
+ is_cut = False
+ is_mix = False
+
+ # deal with mix
+ candidate_cuts = []
+ candidate_holes = []
+ for b in mix_b:
+ # -- algorithm draft --
+ # (1) explode
+ # (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
+ # (3) cap each object in both lists
+ # (4) boolunion every object in both lists
+ # (5) check if closed, if it is
+ # ----------------------
+ # (1) explode
+ faces_b = util.explode_brep(b)
+
+ # (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
+ flat_faces_b = []
+ non_flat_faces_b = []
+ for f_b in faces_b:
+ if f_b.Faces[0].IsPlanar():
+ flat_faces_b.append(f_b)
+ else:
+ non_flat_faces_b.append(f_b)
+
+ # (*) cap the cylinders
+ non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
+
+ # (4) boolunion every object in both lists
+ flat_faces_b = Rhino.Geometry.Brep.CreateBooleanUnion(flat_faces_b, sc.doc.ModelAbsoluteTolerance)
+ non_flat_faces_b = Rhino.Geometry.Brep.CreateBooleanUnion(non_flat_faces_b, sc.doc.ModelAbsoluteTolerance)
+
+ # (3) cap candidate cuts
+ flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in flat_faces_b]
+ # non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
+
+ # (*) merge all coplanar faces in breps cut candidates
+ for f_b in flat_faces_b:
+ if f_b is not None:
+ f_b.MergeCoplanarFaces(sc.doc.ModelAbsoluteTolerance)
+
+ # (5) check if closed, if it is add to cuts, if not add to holes
+ for f_b in flat_faces_b:
+ if f_b is not None:
+ if f_b.IsSolid:
+ cuts_b.append(f_b)
+ for f_b in non_flat_faces_b:
+ if f_b is not None:
+ if f_b.IsSolid:
+ holes_b.append(f_b)
+
+ return holes_b, cuts_b
+
+
+if __name__ == "__main__":
+
+ print("Running diffCheck...")
+ x_form = df_transformations.pln_2_pln_world_transform(i_brep)
+
+ # transformation to matrix
+ i_brep_copy.Transform(x_form)
+
+ # reverse the transformation
+ x_form_back = df_transformations.get_inverse_transformation(x_form)
+
+ # i_brep.Transform(x_form_back)
+
+
+ o_brep = i_brep
+
+
+ # compute the bounding box
+ bbox = i_brep.GetBoundingBox(True)
+ bbox_b = bbox.ToBrep()
+
+ print("Bounding box computed...")
+ # boolean difference between the bounding box and the brep transformed
+ brep_result = Rhino.Geometry.Brep.CreateBooleanDifference(bbox_b, i_brep, sc.doc.ModelAbsoluteTolerance)
+ if brep_result is None or len(brep_result) == 0:
+ print("No breps found after boolean difference. Exiting...")
+ # return
+
+ # distinguish holes and cuts
+ holes_b, cuts_b = distinguish_holes_cuts(brep_result)
+
+ for b in holes_b:
+ b.Transform(x_form_back)
+ for b in cuts_b:
+ b.Transform(x_form_back)
+
+ o_brep = cuts_b
+ ##################################################################
+
+ # """
+ # Main function to test the package
+ # :param i_breps: list of breps
+ # :param i_export_dir: directory to export the xml
+ # :param i_dump: whether to dump the xml
+ # """
+ # # beams
+ # beams : typing.List[DFBeam] = []
+ # for brep in i_breps:
+ # beam = DFBeam.from_brep(brep)
+ # beams.append(beam)
+
+ # # assembly
+ # assembly1 = DFAssembly(beams, "Assembly1")
+ # print(assembly1.beams)
+ # print(assembly1)
+
+ # # dump the xml
+ # xml : str = assembly1.to_xml()
+ # if i_dump:
+ # assembly1.dump(xml, i_export_dir)
+ # o_xml = xml
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/joint_detector.py b/src/gh/diffCheck/diffCheck/joint_detector.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/gh/tester.ghx b/src/gh/tester.ghx
index ccd49548..0de0df29 100644
--- a/src/gh/tester.ghx
+++ b/src/gh/tester.ghx
@@ -49,10 +49,10 @@
-
- 82
- -295
+ -192
+ -8
- - 1.5
+ - 1.7647058
@@ -69,7 +69,7 @@
- - F:\diffCheck\src\gh\diffCheck\diffCheck_app.py
+ - F:\diffCheck\src\gh\diffCheck\diffCheck\diffCheck_app.py
@@ -99,9 +99,9 @@
- - 9
+ - 12
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
@@ -132,10 +132,10 @@
-
- 187
- 113
- 138
- 84
+ 213
+ 133
+ 115
+ 44
-
267
@@ -144,17 +144,15 @@
-
- - 4
+
+ - 2
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- 2
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
@@ -177,102 +175,31 @@
-
- 189
- 115
- 63
- 20
-
- -
- 222
- 125
-
-
-
-
-
-
-
- - true
- - Converts to collection of boolean values
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC
-
- - 509e66b1-9c06-47bc-9e26-3bcd45a184ca
- - i_dump
- - i_dump
- - true
- - 0
- - true
- - 5de6f2a8-d2d0-49e6-92b4-ae1ed47ccbfd
- - 1
-
- - d60527f5-b5af-4ef6-8970-5f96fe412559
-
-
-
-
- -
- 189
+ 215
135
- 63
+ 37
20
-
- 222
+ 235
145
-
+
- - true
- - Converts to collection of text fragments
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAO8SURBVEhL1VVLLJxhFB3ERMT7zXgb71e8X/GId2IhQZTuJGwktjaNxqpYNAQbsWBHiDRsbNgIC4lWYiUs7LSVtLqY6UNNTu+58/9Caaurpie5md/85px7z733+yz/CnYPD4/P8om/iCcSj4OPj8/r+fl57O3tYWdnB9vb29jc3MTa2hoWFxcxMTGB/v5+tLW1oaqqCqmpqZCE3spPrW6G38DLy6tdfvh9YWEBZWVlGqWlpSguLkZhYSHy8/ORk5ODjIwMJU5KSkJWVhb8/Pwcnp6ezwyaX8IaGBj4YWlpCZ2dnZodo7KyEu3t7TBxcnKipGlpaUhJSdFITk6GCDiFw+amegDe3t4v+vr6rkdHR1FdXY3a2loNPs/NzcHlchkSQHNzM9LT05U8MTFRK5HkvolVrwy6e7BHRUV9nZ6eRkNDgxLX19dr8Pns7AwrKysGPTA5Oak22e12FYiLi0NsbCx7wSqK3JS3IN7vdHR0oLe3V225LTAwMIDj4+M7Nh0dHd0RIHl0dDSCg4NdIvLGoL1BW1hY2Jfu7m5tKj2/bdHy8jKmpqa02aenp4YEUFdXd2MRBcQBxMfHQ6bQIZxP3dTSWMn+XXl5ORicFlOElVDo4uICLS0t+m52dtagB8bGxlQgISEBNpsNkZGRKkJBqeKjcPtZpPPPQ0NDv5CcI8hRJBGzpdDQ0JDugjmmXV1dBj1wcHCgzaX/MTExiIiIQEhIiIrKMxf1pUWUPmVmZupsMyhSUFCAoqIijY2NDQwPD+t35g6cn58bEtBKTf/Dw8PZAxXKy8vjdn+iwEsZL2dubi5MIT6TjBU4HA6D6mGMjIxo9rRHnEBQUJDySFXuCugT/WKpnAoGlyg7O1szX11d1Wd+x3dcrp6eHoMe2N/fV9+ZPe1hJbRX+urugYGnVqvVwR9z/fnJJTo8PMTg4KA+m+/oL0fz8vJSBa6vr7VaM3tWLRZxF26mSMHZpXdceZKMj48rAQX4N4NVmku1u7ur74mZmRklp3BJSYlL6O7tAVHKs4QEXCITTqdTjwmOIonZo/X1dVxdXRn/4cbW1haampoQEBBA7+9vMiFVvBIfvzFbTsbt4JyzmfSYDaXnpi1CqiMsk3MlNL88iwgbq6DfzJbNM4OktNAkZkNl+uDv76/veTdIH39/mhp4JrPs5OTI8XETJinn3Mxa7gD4+vrqeSVVk/yP9wFhFavecywrKipQU1OjBPS3tbVVM+Whx4ORW83zq7Gx8fE3mgHerz/fuX+Kx9/J/xEslh9QdsIn89F0TQAAAABJRU5ErkJggg==
-
- - 8f3ff1eb-ddb8-455d-81fb-cb1cf0c575a5
- - i_export_dir
- - i_export_dir
- - true
- - 0
- - true
- - 56e42677-eccb-444a-9bab-e6a34770f1dd
- - 1
-
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
-
-
-
- -
- 189
- 155
- 63
- 20
-
- -
- 222
- 165
-
-
-
-
-
-
-
- - 1
- true
- Converts to collection of Breps (Boundary REPresentations)
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPkSURBVEhL1VVbKOV7FN7ITnK/RYNcNrkrx11SbokHuWQyb0ryRN5ocuLBKadELsktHuTywKBcXgiRUiYvJOVSknNw5LK3OWbO9J31/famOWfPGPN0OqtW+7/r9/vWWt/61vpp/ivTWVhY3MsvfsBfi7/MbGxstvr6+rC+vo7V1VUsLi5ifn4eExMTGBoaQnNzM8rLy5GXl4eUlBQEBQVBEjqTq1ojwjNmZWWVLxc/DQ4OIiEhQXl8fDxiY2MRExOD6OhoREREICQkRAH7+/sjLCwMdnZ2ektLy7cmmG+a1tHR8Y/R0VEUFRWp7OjJyclISkrC8PAwHh4ecHNzg4WFBeTm5iIwMFB5QEAAJIBBMF4Zob5i1tbWv5SVlf3V0NCA1NRUpKWlPTmpOjw8RHd3N3p7e7G0tITb21v138/PT1UiyT0IVe9McGam8/T0/LO9vR0ZGRkKND09HZmZmVhbW4Ner0dnZycmJydRUVGBqqoq1NfX4+joSPWHQby9vdkLVvGTEfILE+5XSUtpaamihQEIzkYT/PLyEgy+ubmJ2tpa1eiBgQG0trbi4OAAXV1d8PLygrOz82cJ8t4E+2R5bm5uH0pKSlRTyTkDPGZO8OPjY4yPj2Nubg4rKysKfHp6Wp3hN+li5b6+vhAV6gXzjRFaGivZ/5aYmAg61cKGkvMvwXd2dlT2LS0tODs7U98E39vbw/7+vurJ7OwshGZFl1RxJdh2Gun8z66urh8ITglSiiMjIzAYDGbgBBkbG0NHRwfOz89xcXGhztB6enpwfX0NFxcXpSp3d3cO6q8aiXQdGhqqtE1nEIJfXV2Zgc/MzIASZrMbGxsVVScnJ9jY2FDKYsXSA3h4eCAqKorTfc0ALSIvQ2RkJB4D3d/fq4tfA+/v70dbWxuamppQWVmJ6upq9X93d1cFcXJyUjjSC2MF5Il8UcecTjozOz09fRa8rq5OSZWS3draUvwLLUpJnHzpq7EHJnuj1Wr1wcHBavwLCgpwd3eH5eXlF4OTFmZPFco3Z+FJRcqkivc8xJFnk3iJFfwIuE6nQ1xc3GeBM5sDWjx3CSVGp6qoEMqVqnkOnI2lerKysuDg4EDuzSeZJlW8k4MPrIBjz3K5BqioqakpNcE1NTXY3t7+R+YCquQtyvkoMN/cRbRXrIK98PHxUUNDz87OVhNM+bI3XBlsqKgP9vb26gzfBunj89vUZG+lZEN4eDhkfTy5DKOigXQ8Zi1vAGxtbdVSlKoJ/t33gKYVqn7nI/K4kwhAfnNyclSm+fn5KCwsRHFxMbi/uBTlzsteNJPxff33m/s9f/mb/D8yjeZvU880QlAx2/0AAAAASUVORK5CYII=
- ae8c9c0d-8d6a-4a8c-812a-110846a2031c
- - i_breps
- - i_breps
+ - i_brep
+ - i_brep
- true
- - 1
+ - 0
- true
- 0f309845-29e6-43ae-b255-cdb5c2d13da9
- 1
@@ -283,14 +210,14 @@
-
- 189
- 175
- 63
+ 215
+ 155
+ 37
20
-
- 222
- 185
+ 235
+ 165
@@ -318,13 +245,13 @@
-
282
- 115
- 41
- 40
+ 135
+ 44
+ 20
-
- 302.5
- 135
+ 304
+ 145
@@ -333,19 +260,19 @@
- false
- - Generic example output of the component
+ - No conversion
-
- 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
+ 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
- - f5d7e77d-04d1-4395-b52b-651450a4b329
- - o_xml
- - o_xml
+ - a849584f-8d8a-4547-a1a4-36be0bf3ac37
+ - o_brep
+ - o_brep
- false
- 0
- true
- 0
- - Generic example output of the component
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+
+ - 6a184b65-baa3-42d1-a548-3915b401de53
@@ -353,12 +280,12 @@
-
282
155
- 41
- 40
+ 44
+ 20
-
- 302.5
- 175
+ 304
+ 165
@@ -368,7 +295,7 @@
- - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgoKICAgICAgICAgICAgICAgICMgcGFyc2UgdGhlIGNvZGUKICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCgogICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgcXVldWUgYW5kIGV2ZW50CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYucXVldWVfbXNnX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLmdldCgpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnRhc2tfZG9uZSgpCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgdGhlIGNvZGUKICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRvdXQob3V0cHV0KToKICAgICAgICAgICAgICAgICAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKICAgICAgICAgICAgICAgIGxvY2Fsc1sic3Rkb3V0Il0gPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgICAgICAgICAgICAgICMgc2VuZCB0aGUgbXNnIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogb3V0cHV0LmdldHZhbHVlKCl9KQogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBtc2dfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChtc2dfanNvbikKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKCiAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNjcmlwdCB2YXJpYWJsZXMgdG8gdGhlIEdIIGNvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgICAgICBvdXRwYXJhbSA9IGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0CiAgICAgICAgICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgICAgICAgICAgZm9yIG91dHAgaW4gb3V0cGFyYW1fbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0cCBpbiBsb2NhbHMua2V5cygpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChsb2NhbHNbb3V0cF0pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQoTm9uZSkKCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KICAgICAgICAgICAgcmV0dXJuIGxvY2FscwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgogICAgICAgICAgICAjIHNlbmQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgZXJyX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6ICJlcnI6IiArIHN0cihlKX0pCiAgICAgICAgICAgIGVycl9qc29uID0gZXJyX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChlcnJfanNvbikKICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQogICAgICAgICAgICAKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCgogICAgICAgICAgICBlcnJfbXNnID0gZiJzY3JpcHQtc3luYzo6RXJyb3IgaW4gdGhlIGNvZGU6IHtzdHIoZSl9IgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oZXJyX21zZykKCiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsCiAgICAgICAgICAgIGJ0bjogYm9vbCwKICAgICAgICAgICAgaV9kdW1wOiBib29sLAogICAgICAgICAgICBpX2V4cG9ydF9kaXI6IHN0ciwKICAgICAgICAgICAgaV9icmVwczogU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3RbUmhpbm8uR2VvbWV0cnkuQnJlcF0pOgogICAgICAgICIiIiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIGl0J3MgdGhlIHNvbHZlIG1haW4gaW5zdGFuY2UuICIiIgoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICAjIHNldCB0aGUgcGF0aCBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIHNlbGYuaW5pdF9zY3JpcHRfcGF0aChidG4pCgogICAgICAgICMgZmlsZSBjaGFuZ2UgbGlzdGVuZXIgdGhyZWFkCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBGaWxlQ2hhbmdlZFRocmVhZChzZWxmLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgc2V0IHVwIHRoZSB0Y3AgY2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICBfID0gW3ByaW50KHQubmFtZSkgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXQogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIENsaWVudFRocmVhZChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cKICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgYWRkIHRvIHRoZSBnbG9iYWxzIGFsbCB0aGUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgY29tcG9uZW50ICh0aGUgbG9jYWxzKQogICAgICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgogICAgICAgIHJlcyA9IHNlbGYuc2FmZV9leGVjKHNlbGYucGF0aCwgTm9uZSwgZ2xvYmFscygpKQogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IFRydWUKICAgICAgICByZXR1cm4KCiAgICBkZWYgQWZ0ZXJSdW5TY3JpcHQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBjb21wb25lbnQgaGFzIGZpbmlzaGVkCiAgICAgICAgICAgIGl0cyBjYWxjdWxhdGlvbi4gSXQgaXMgdXNlZCB0byBsb2FkIHRoZSBHSENvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgIHdpdGggdGhlIHZhbHVlcyBjcmVhdGVkIGluIHRoZSBzY3JpcHQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuaXNfc3VjY2VzczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgb3V0cGFyYW0gPSBbcCBmb3IgcCBpbiBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dF0KICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgIAogICAgICAgICMgVE9ETzogYWRkIHRoZSBjb252ZXJzaW9uIHRvIGRhdGF0cmVlIGZvciBuZXN0ZWQgbGlzdHMgYW5kIHR1cGxlcwogICAgICAgIGZvciBpZHgsIG91dHAgaW4gZW51bWVyYXRlKG91dHBhcmFtKToKICAgICAgICAgICAgIyBkZXRlY3QgaWYgdGhlIG91dHB1dCBpcyBhIGxpc3QKICAgICAgICAgICAgaWYgdHlwZShzZWxmLl92YXJfb3V0cHV0W2lkeF0pID09IGxpc3Qgb3IgdHlwZShzZWxmLl92YXJfb3V0cHV0W2lkeF0pID09IHR1cGxlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGFMaXN0KGdoLktlcm5lbC5EYXRhLkdIX1BhdGgoMCksIHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhKGdoLktlcm5lbC5EYXRhLkdIX1BhdGgoMCksIDAsIHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkKICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmNsZWFyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgdGFibGVfdmFsdWUgPSBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkdldFZhbHVlKAogICAgICAgICAgICBzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCAibm90X2ZvdW5kIgogICAgICAgICkKICAgICAgICBpZiB0YWJsZV92YWx1ZSAhPSAibm90X2ZvdW5kIjoKICAgICAgICAgICAgcmV0dXJuIHRhYmxlX3ZhbHVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcGF0aC5zZXR0ZXIKICAgIGRlZiBwYXRoKHNlbGYsIHBhdGggOiBzdHIpOgogICAgICAgICIiIiBTZXQgdGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuU2V0VmFsdWUoc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgcGF0aCkKCiAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk1lc3NhZ2UgPSBmIntzY3JpcHRfbmFtZX0iCgogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBfID0gW3QgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpIGlmIHQubmFtZSA9PSBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lXVswXS5zdG9wKCkKCiAgICBAcGF0aC5kZWxldGVyCiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgRGVsZXRlIHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgaWYgdGhlIG9iamVjdCBpcyBlcmFzZWQuICIiIgogICAgICAgIGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuRGVsZXRlVmFsdWUoc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSkK
+ - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgogICAgICAgICAgICAgICAgIyBwYXJzZSB0aGUgY29kZQogICAgICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKICAgICAgICAgICAgICAgIG91dHB1dCA9IGlvLlN0cmluZ0lPKCkKCiAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBxdWV1ZSBhbmQgZXZlbnQKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5xdWV1ZV9tc2dfbG9jazoKICAgICAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWV1ZV9tc2cuZW1wdHkoKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuZ2V0KCkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAgICAgICAgICMgZXhlY3V0ZSB0aGUgY29kZQogICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnJlZGlyZWN0X3N0ZG91dChvdXRwdXQpOgogICAgICAgICAgICAgICAgICAgIGV4ZWMoY29kZSwgZ2xvYmFscywgbG9jYWxzKQogICAgICAgICAgICAgICAgbG9jYWxzWyJzdGRvdXQiXSA9IG91dHB1dC5nZXR2YWx1ZSgpCgogICAgICAgICAgICAgICAgIyBzZW5kIHRoZSBtc2cgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgICAgIG1zZ19qc29uID0ganNvbi5kdW1wcyh7InNjcmlwdF9wYXRoIjogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWQiOiBzdHIoZ2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2ciOiBvdXRwdXQuZ2V0dmFsdWUoKX0pCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IG1zZ19qc29uLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KG1zZ19qc29uKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQoKICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2NyaXB0IHZhcmlhYmxlcyB0byB0aGUgR0ggY29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgICAgIG91dHBhcmFtID0gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXQKICAgICAgICAgICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgICAgICAgICBmb3Igb3V0cCBpbiBvdXRwYXJhbV9uYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBvdXRwIGluIGxvY2Fscy5rZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuYXBwZW5kKGxvY2Fsc1tvdXRwXSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChOb25lKQoKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXwogICAgICAgICAgICByZXR1cm4gbG9jYWxzCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCiAgICAgICAgICAgICMgc2VuZCB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgICAgICBlcnJfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogImVycjoiICsgc3RyKGUpfSkKICAgICAgICAgICAgZXJyX2pzb24gPSBlcnJfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KGVycl9qc29uKQogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLnNldCgpCiAgICAgICAgICAgIAogICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KCiAgICAgICAgICAgIGVycl9tc2cgPSBmInNjcmlwdC1zeW5jOjpFcnJvciBpbiB0aGUgY29kZToge3N0cihlKX0iCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihlcnJfbXNnKQoKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgYnRuOiBib29sLCBpX2JyZXA6IFJoaW5vLkdlb21ldHJ5LkJyZXApOgogICAgICAgICIiIiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIGl0J3MgdGhlIHNvbHZlIG1haW4gaW5zdGFuY2UuICIiIgoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICAjIHNldCB0aGUgcGF0aCBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIHNlbGYuaW5pdF9zY3JpcHRfcGF0aChidG4pCgogICAgICAgICMgZmlsZSBjaGFuZ2UgbGlzdGVuZXIgdGhyZWFkCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBGaWxlQ2hhbmdlZFRocmVhZChzZWxmLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgc2V0IHVwIHRoZSB0Y3AgY2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICBfID0gW3ByaW50KHQubmFtZSkgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXQogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIENsaWVudFRocmVhZChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cKICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgYWRkIHRvIHRoZSBnbG9iYWxzIGFsbCB0aGUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgY29tcG9uZW50ICh0aGUgbG9jYWxzKQogICAgICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgogICAgICAgIHBhdGhfZGlyID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICBzdWJfZGlycyA9IFtdCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aF9kaXIpOgogICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICAgICAgc3ViX2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihyb290LCBkKSkKICAgICAgICAgICAgICAgIHByaW50KGQpCiAgICAgICAgc3lzLnBhdGguZXh0ZW5kKFtwYXRoX2Rpcl0gKyBzdWJfZGlycykKCiAgICAgICAgIyByZWxvYWQgYWxsIHRoZSBtb2R1bGVzIGFsc28gb2YgdGhlIHN1YiBkaXJlY3RvcmllcwogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGhfZGlyKToKICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgIHNlbGYucmVsb2FkX2FsbF9tb2R1bGVzKG9zLnBhdGguam9pbihyb290LCBkKSkKICAgICAgICBzZWxmLnJlbG9hZF9hbGxfbW9kdWxlcyhwYXRoX2RpcikKCiAgICAgICAgcmVzID0gc2VsZi5zYWZlX2V4ZWMoc2VsZi5wYXRoLCBOb25lLCBnbG9iYWxzKCkpCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gVHJ1ZQogICAgICAgIHJldHVybgoKICAgIGRlZiBBZnRlclJ1blNjcmlwdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGNvbXBvbmVudCBoYXMgZmluaXNoZWQKICAgICAgICAgICAgaXRzIGNhbGN1bGF0aW9uLiBJdCBpcyB1c2VkIHRvIGxvYWQgdGhlIEdIQ29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgd2l0aCB0aGUgdmFsdWVzIGNyZWF0ZWQgaW4gdGhlIHNjcmlwdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5pc19zdWNjZXNzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBvdXRwYXJhbSA9IFtwIGZvciBwIGluIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0XQogICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgCiAgICAgICAgIyBUT0RPOiBhZGQgdGhlIGNvbnZlcnNpb24gdG8gZGF0YXRyZWUgZm9yIG5lc3RlZCBsaXN0cyBhbmQgdHVwbGVzCiAgICAgICAgZm9yIGlkeCwgb3V0cCBpbiBlbnVtZXJhdGUob3V0cGFyYW0pOgogICAgICAgICAgICAjIGRldGVjdCBpZiB0aGUgb3V0cHV0IGlzIGEgbGlzdAogICAgICAgICAgICBpZiB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gbGlzdCBvciB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gdHVwbGU6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YUxpc3QoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGEoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgMCwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuY2xlYXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICB0YWJsZV92YWx1ZSA9IGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuR2V0VmFsdWUoCiAgICAgICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsICJub3RfZm91bmQiCiAgICAgICAgKQogICAgICAgIGlmIHRhYmxlX3ZhbHVlICE9ICJub3RfZm91bmQiOgogICAgICAgICAgICByZXR1cm4gdGFibGVfdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwYXRoLnNldHRlcgogICAgZGVmIHBhdGgoc2VsZiwgcGF0aCA6IHN0cik6CiAgICAgICAgIiIiIFNldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5TZXRWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCBwYXRoKQoKICAgICAgICBzY3JpcHRfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9IGYie3NjcmlwdF9uYW1lfSIKCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIF8gPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdLnN0b3AoKQoKICAgIEBwYXRoLmRlbGV0ZXIKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBEZWxldGUgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyBpZiB0aGUgb2JqZWN0IGlzIGVyYXNlZC4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5EZWxldGVWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlKQo=
- S
@@ -405,8 +332,8 @@
-
- 102
- 97
+ 116
+ 125
66
22
@@ -423,8 +350,9 @@
-
+
- Contains a collection of Breps (Boundary REPresentations)
+ - true
- 0f309845-29e6-43ae-b255-cdb5c2d13da9
- Brep
- Brep
@@ -435,14 +363,14 @@
-
- 118
- 181
+ 131
+ 153
50
24
-
- 143.71587
- 193.00317
+ 156.24402
+ 165.29077
@@ -453,32 +381,16 @@
- - 3
+ - 1
- {0}
-
+
-
- 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
-
- - 00000000-0000-0000-0000-000000000000
-
-
-
-
- -
- 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
-
- - 00000000-0000-0000-0000-000000000000
-
-
-
-
- -
- 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
+ 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
- - 00000000-0000-0000-0000-000000000000
+ - 491fb852-545c-48e6-b8e5-8848ae2eb894
@@ -509,20 +421,21 @@
-
+
-
- 366
- 44
+ 355
+ 0
343
- 73
+ 166
- 0
- 0
- 0
-
- 366.4111
- 44.67153
+ 355.2232
+ 0.3242798
+ - true
@@ -543,63 +456,6 @@
-
- - 06953bda-1d37-4d58-9b38-4b3c74e54c8f
- - File Path
-
-
-
-
- - Contains a collection of file paths
- - false
- - All files|*.*
- - 56e42677-eccb-444a-9bab-e6a34770f1dd
- - File Path
- - Path
- - false
- - 0
-
-
-
-
- -
- 118
- 154
- 50
- 24
-
- -
- 143.98213
- 166.14787
-
-
-
-
-
- - 1
-
-
-
-
- - 1
- - {0}
-
-
-
-
- - false
- - F:\__TEMP\test\
-
-
-
-
-
-
-
-
-
-
-
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -612,7 +468,7 @@
- Panel
- false
- - 0.42412034049630165
+ - 0.2985713966190815
- bc61f3bc-d42e-4ab9-9cde-bfa5df8d625e
- 1
- Double click to edit panel content…
@@ -621,17 +477,17 @@
-
- 426
- 126
- 604
+ 445
+ 295
+ 118
183
- 0
- 0
- 0
-
- 426.19714
- 126.91681
+ 445.13605
+ 295.23444
@@ -652,39 +508,7 @@
-
-
- - a8b97322-2d53-47cd-905e-b932c3ccd74e
- - Button
-
-
-
-
- - Button object with two values
- - False
- - True
- - 5de6f2a8-d2d0-49e6-92b4-ae1ed47ccbfd
- - Button
- - dump!
- - false
- - 0
-
-
-
-
- -
- 68
- 127
- 102
- 22
-
-
-
-
-
-
-
-
+
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- Text
@@ -697,21 +521,21 @@
- Text
- Txt
- false
- - f5d7e77d-04d1-4395-b52b-651450a4b329
+ - a7582614-58af-4e8e-ac5d-40e739284db1
- 1
-
- 348
- 186
+ 375
+ 373
50
24
-
- 373.8549
- 198.45097
+ 400.89478
+ 385.76862
@@ -719,146 +543,521 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- 066d0a87-236f-4eae-a0f4-9e42f5327962
- - Script
+ - Exporter to xml
-
- - Scripting component
+
+
- true
+ - true
+ - 2
-
- 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
+ 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
- - 68e93733-269e-4deb-85f9-f55554589eb9
+ - 37244b65-1555-4735-bf3f-ab0481941fea
- true
- true
- true
- - Script
- - S
+ - Exporter to xml
+ - XMLout
- false
- false
- - true
+ - false
-
- 142
- 298
- 72
- 44
+ 227
+ 353
+ 135
+ 64
-
- 171
- 320
+ 307
+ 385
- - 2
+ - 3
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 2
- - 3ede854e-c753-40eb-84cb-b48008f14fd4
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 1
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
- - No conversion
+ - Press button to export xml
-
- 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
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC
- - 2b845980-88f2-4f63-a0f7-1574827539c1
- - x
- - x
+ - 5c36c839-5c70-4ab8-a9fc-6cacff1c6955
+ - i_dump
+ - i_dump
- true
- 0
- true
- - 0
-
- - 6a184b65-baa3-42d1-a548-3915b401de53
+ - 83363e37-e611-4b77-bcde-c28b03d7ee96
+ - 1
+ - Press button to export xml
+ - d60527f5-b5af-4ef6-8970-5f96fe412559
-
- 144
- 300
- 12
+ 229
+ 355
+ 63
20
-
- 151.5
- 310
+ 262
+ 365
-
+
- true
- - No conversion
+ - The directors where to export the xml file.
-
- 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
+ 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
- - 5bcdf1ec-3568-4e90-b700-efefc0113dc5
- - y
- - y
+ - eec8c89f-334e-4696-b34e-61b913c98340
+ - i_export_dir
+ - i_export_dir
- true
- 0
- true
- - 0
-
- - 6a184b65-baa3-42d1-a548-3915b401de53
+ - 2bba20ed-c34b-45cd-b237-6fb28c1269ad
+ - 1
+ - The directors where to export the xml file.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
- 144
- 320
- 12
+ 229
+ 375
+ 63
20
-
- 151.5
- 330
+ 262
+ 385
-
-
- - The execution information, as output and error streams
- - 9c06c502-948b-4734-bfa1-5b29e4707c6f
- - out
- - out
- - false
- - 0
-
-
-
-
- -
- 186
- 300
- 26
- 20
-
- -
- 199
- 310
-
+
+
+ - 1
+ - true
+ - The breps of the structure.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPkSURBVEhL1VVbKOV7FN7ITnK/RYNcNrkrx11SbokHuWQyb0ryRN5ocuLBKadELsktHuTywKBcXgiRUiYvJOVSknNw5LK3OWbO9J31/famOWfPGPN0OqtW+7/r9/vWWt/61vpp/ivTWVhY3MsvfsBfi7/MbGxstvr6+rC+vo7V1VUsLi5ifn4eExMTGBoaQnNzM8rLy5GXl4eUlBQEBQVBEjqTq1ojwjNmZWWVLxc/DQ4OIiEhQXl8fDxiY2MRExOD6OhoREREICQkRAH7+/sjLCwMdnZ2ektLy7cmmG+a1tHR8Y/R0VEUFRWp7OjJyclISkrC8PAwHh4ecHNzg4WFBeTm5iIwMFB5QEAAJIBBMF4Zob5i1tbWv5SVlf3V0NCA1NRUpKWlPTmpOjw8RHd3N3p7e7G0tITb21v138/PT1UiyT0IVe9McGam8/T0/LO9vR0ZGRkKND09HZmZmVhbW4Ner0dnZycmJydRUVGBqqoq1NfX4+joSPWHQby9vdkLVvGTEfILE+5XSUtpaamihQEIzkYT/PLyEgy+ubmJ2tpa1eiBgQG0trbi4OAAXV1d8PLygrOz82cJ8t4E+2R5bm5uH0pKSlRTyTkDPGZO8OPjY4yPj2Nubg4rKysKfHp6Wp3hN+li5b6+vhAV6gXzjRFaGivZ/5aYmAg61cKGkvMvwXd2dlT2LS0tODs7U98E39vbw/7+vurJ7OwshGZFl1RxJdh2Gun8z66urh8ITglSiiMjIzAYDGbgBBkbG0NHRwfOz89xcXGhztB6enpwfX0NFxcXpSp3d3cO6q8aiXQdGhqqtE1nEIJfXV2Zgc/MzIASZrMbGxsVVScnJ9jY2FDKYsXSA3h4eCAqKorTfc0ALSIvQ2RkJB4D3d/fq4tfA+/v70dbWxuamppQWVmJ6upq9X93d1cFcXJyUjjSC2MF5Il8UcecTjozOz09fRa8rq5OSZWS3draUvwLLUpJnHzpq7EHJnuj1Wr1wcHBavwLCgpwd3eH5eXlF4OTFmZPFco3Z+FJRcqkivc8xJFnk3iJFfwIuE6nQ1xc3GeBM5sDWjx3CSVGp6qoEMqVqnkOnI2lerKysuDg4EDuzSeZJlW8k4MPrIBjz3K5BqioqakpNcE1NTXY3t7+R+YCquQtyvkoMN/cRbRXrIK98PHxUUNDz87OVhNM+bI3XBlsqKgP9vb26gzfBunj89vUZG+lZEN4eDhkfTy5DKOigXQ8Zi1vAGxtbdVSlKoJ/t33gKYVqn7nI/K4kwhAfnNyclSm+fn5KCwsRHFxMbi/uBTlzsteNJPxff33m/s9f/mb/D8yjeZvU880QlAx2/0AAAAASUVORK5CYII=
+
+ - 1fbd84e2-0cb6-4f71-a6ce-ef8bd20d11f0
+ - i_breps
+ - i_breps
+ - true
+ - 1
+ - true
+ - 35b72f16-8924-45e9-9eff-a5eea8982d94
+ - 1
+ - The breps of the structure.
+ - 2ceb0405-fdfe-403d-a4d6-8786da45fb9d
+
+
+
+
+ -
+ 229
+ 395
+ 63
+ 20
+
+ -
+ 262
+ 405
+
+
+
+
+
+
+
+ - false
+ - The string of xml to be exported.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - a7582614-58af-4e8e-ac5d-40e739284db1
+ - o_xml
+ - o_xml
+ - false
+ - 0
+ - true
+ - 0
+ - The string of xml to be exported.
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 322
+ 355
+ 38
+ 60
+
+ -
+ 341
+ 385
+
+
+
+
+
+
+
+
+
+ - IyEgcHl0aG9uMwojIHJlcXVpcmVtZW50czogZGlmZkNoZWNrCiIiIgpUaGlzIHJlYWQgYnJlcHMgZnJvbSBSaGlubywgY29udmVydHMgdGhlbSB0byBERkJlYW1zIGFuZCBERkFzc2VtYmxpZXMsIGFuZCBleHBvcnRzIHRoZW0gdG8gWE1MLgoKOnBhcmFtIGlfYnJlcHM6IGxpc3Qgb2YgYnJlcHMKOnBhcmFtIGlfZXhwb3J0X2RpcjogZGlyZWN0b3J5IHRvIGV4cG9ydCB0aGUgeG1sCjpwYXJhbSBpX2R1bXA6IHByZXNzIHRvIGR1bXAgdGhlIHhtbAoiIiIKaW1wb3J0IFN5c3RlbQppbXBvcnQgdHlwaW5nCgppbXBvcnQgUmhpbm8KaW1wb3J0IFJoaW5vLkdlb21ldHJ5IGFzIHJnCgpmcm9tIGdocHl0aG9ubGliLmNvbXBvbmVudGJhc2UgaW1wb3J0IGV4ZWN1dGluZ2NvbXBvbmVudCBhcyBjb21wb25lbnQKCmZyb20gZGlmZkNoZWNrLmRmX2dlb21ldHJpZXMgaW1wb3J0IERGQmVhbSwgREZBc3NlbWJseQoKCmNsYXNzIFhNTEV4cG9ydGVyKGNvbXBvbmVudCk6CiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsCiAgICAgICAgICAgIGlfZHVtcDogYm9vbCwKICAgICAgICAgICAgaV9leHBvcnRfZGlyOiBzdHIsCiAgICAgICAgICAgIGlfYnJlcHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0W1JoaW5vLkdlb21ldHJ5LkJyZXBdKToKICAgICAgICAiIiIKICAgICAgICBNYWluIGZ1bmN0aW9uIHRvIHRlc3QgdGhlIHBhY2thZ2UKICAgICAgICA6cGFyYW0gaV9kdW1wOiB3aGV0aGVyIHRvIGR1bXAgdGhlIHhtbAogICAgICAgIDpwYXJhbSBpX2V4cG9ydF9kaXI6IGRpcmVjdG9yeSB0byBleHBvcnQgdGhlIHhtbAogICAgICAgIDpwYXJhbSBpX2JyZXBzOiBsaXN0IG9mIGJyZXBzCiAgICAgICAgIiIiCiAgICAgICAgIyBiZWFtcwogICAgICAgIGJlYW1zIDogdHlwaW5nLkxpc3RbREZCZWFtXSA9IFtdCiAgICAgICAgZm9yIGJyZXAgaW4gaV9icmVwczoKICAgICAgICAgICAgYmVhbSA9IERGQmVhbS5mcm9tX2JyZXAoYnJlcCkKICAgICAgICAgICAgYmVhbXMuYXBwZW5kKGJlYW0pCgogICAgICAgICMgYXNzZW1ibHkKICAgICAgICBhc3NlbWJseTEgPSBERkFzc2VtYmx5KGJlYW1zLCAiQXNzZW1ibHkxIikKICAgICAgICBwcmludChhc3NlbWJseTEuYmVhbXMpCiAgICAgICAgcHJpbnQoYXNzZW1ibHkxKQoKICAgICAgICAjIGR1bXAgdGhlIHhtbAogICAgICAgIHhtbCA6IHN0ciA9IGFzc2VtYmx5MS50b194bWwoKQogICAgICAgIGlmIGlfZHVtcDoKICAgICAgICAgICAgYXNzZW1ibHkxLmR1bXAoeG1sLCBpX2V4cG9ydF9kaXIpCiAgICAgICAgb194bWwgPSB4bWwKCiAgICAgICAgcmV0dXJuIG9feG1s
+ - S
+
+
+
+
+ - *.*.python
+ - 3.*
+
+
+
+
+
+
+
+
+
+
+ - 919e146f-30ae-4aae-be34-4d72f555e7da
+ - Brep
+
+
+
+
+ - Contains a collection of Breps (Boundary REPresentations)
+ - true
+ - 35b72f16-8924-45e9-9eff-a5eea8982d94
+ - Brep
+ - Brep
+ - false
+ - 0
+
+
+
+
+ -
+ 156
+ 398
+ 50
+ 24
+
+ -
+ 181.23218
+ 410.9286
+
+
+
+
+
+ - 1
+
+
+
+
+ - 3
+ - {0}
+
+
+
+
+ -
+ 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
+
+ - 00000000-0000-0000-0000-000000000000
+
+
+
+
+ -
+ 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
+
+ - 00000000-0000-0000-0000-000000000000
+
+
+
+
+ -
+ 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
+
+ - 00000000-0000-0000-0000-000000000000
+
+
+
+
+
+
+
+
+
+
+
+
+ - 06953bda-1d37-4d58-9b38-4b3c74e54c8f
+ - File Path
+
+
+
+
+ - Contains a collection of file paths
+ - false
+ - All files|*.*
+ - 2bba20ed-c34b-45cd-b237-6fb28c1269ad
+ - File Path
+ - Path
+ - false
+ - 0
+
+
+
+
+ -
+ 156
+ 372
+ 50
+ 24
+
+ -
+ 181.49844
+ 384.07333
+
+
+
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
+
+
+
+
+ - false
+ - F:\__TEMP\test\
+
+
+
+
+
+
+
+
+
+
+
+
+ - a8b97322-2d53-47cd-905e-b932c3ccd74e
+ - Button
+
+
+
+
+ - Button object with two values
+ - False
+ - True
+ - 83363e37-e611-4b77-bcde-c28b03d7ee96
+ - Button
+ - dump!
+ - false
+ - 0
+
+
+
+
+ -
+ 104
+ 344
+ 102
+ 22
+
+
+
+
+
+
+
+
+
+ - 719467e6-7cf5-4848-99b0-c5dd57e5442c
+ - 066d0a87-236f-4eae-a0f4-9e42f5327962
+ - Python 3 Script
+
+
+
+
+
+ - true
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAWJQAAFiUBSVIk8AAABCxJREFUSEvdlF1MW2UcxvHCZMbEKNFUo7I5NnRjDHpOe9oOEGETxWWuMXpr9MIlOgqjsDG+xgoYLxZj9GahH7RjhY5BWRnlY3y24tgX4saIVJ0rzN1pHPMjxOh7Hv/vOacQLmtMTHySf9om7/t7nz7neU/KfyrhYFuW3uZy6w86Y3qb++fsMvdfOTbvj3q7PybaO5xSZddz2tLkJZQ68wl8L6fU3Zpd5lkWDvkgHDoFAkOsDMBwpBuGyjN/CLXBp7QtySnH5mrm7vl3ocznEe1+gvthOHxWhdMYa0IwHA01KhuSld7mcVIkK/qyU2F9RedKwrWxOgjj0XM0vZBq+yHVh/3aluQk2HxVQvnpiFDZSROgORsxVvdExMM9f3LnUh3BG4bogKHkDhDtrY8b7G3PGuyB9VN3ThmxJvSTVD8AE8FNjSOQHON+ecmazpasbnlx3xF5vjhVQ62XvtT1hr6s7YpQ0Q6xKkBzhvLugqG6R42kpo/cDipgqYE+CW52TEBqmvTLd60W3N4HfFsCzO9ZxlzeYxpWFXcs2Dy/CRWn1YZwsPIgOZxnfV6DD6vOj48RfFI5wNQc9cjf781H7FXg5m5gtgDy5V21GloVVdCtOk40hMD8YXLXPOvVSEZV500RWJqjsLRMwdQyVSLHit/HjSJg5kXgkgUsKk5raFViZcf1VddKS3ph5K4TcXDnBDcfHyf4ZAK8Ymmect2ZfjOVzRbextU8YNoMRAxgF7LuASkPaHiKqKrrdxVMWdfyrAdgbBhcNDVeOPD2p/5Cb1/LW94wn4/Uod/zF98pYjf3fIzZ/GVcyQWmJGBCAEZ2AuHtgHfjBg1P/6C6+wfFsRaHoTa8UvRhn46acYLmF9yxQpml/cCtvVDynqO8v1QjwedGYFwPDGcB/S+ABbd8p6FVidWhMakurGZNGZuOjXiwZM1bBfNZfJ1a8hrwdTFwvRC4lq9GEiX4aDYwtAPoex7oSQcCaT4NrcpUP1CeeIhmaojJMVZCzj9bhcepgt8oFQS+eglK3hcJPimqkQxmAqEMoHsz0JkGuV23Q0OrMld0PWQ8NnxXOcAxDotjYjdb2u9U4IlIqILsWoHMLuXKLCLJbEyQ2dBOmZ3fLrNghswCm2TW/syC7NG9q2HXS2ocfMTkmPjA3BRtz22aymRxOoDDeSRUQXY171dt6b8jtvCKE/Mvq5HwvCkSFhHjbDQrzsKZcda3Nc660+OsI+0TbUtyYnNFTn4rlQp+YVrLu38bWG/Gfda12cU6nr7PfLp/9jaVZwrew+VdVEHq9zj1e4hXcBvQuxUssNHJ1zDvky65NbVc2ZCsMFmwgUUNCxjLWatgcAuvIJiPnLt1LnYy9YZ8QvewtiV5YUZ8kG7lARbKGGDdm25RJCsUSYw5nwjLJx8thTdl7bb+T5WS8jfirxG8xR5eUAAAAABJRU5ErkJggg==
+
+ - 692eaddb-c313-4649-8d06-bb4758e34447
+ - true
+ - true
+ - true
+ - Python 3 Script
+ - Py3
+
+ - false
+ - false
+ - true
+
+
+
+
+ -
+ 257
+ 224
+ 72
+ 44
+
+ -
+ 286
+ 246
+
+
+
+
+
+ - 2
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 2
+ - 3ede854e-c753-40eb-84cb-b48008f14fd4
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+
+
+
+
+ - true
+ - No conversion
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 47ff6ae7-24ce-4f29-823d-93afd6bb4c78
+ - x
+ - x
+ - true
+ - 0
+ - true
+ - 0
+
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 259
+ 226
+ 12
+ 20
+
+ -
+ 266.5
+ 236
+
+
+
+
+
+
+
+ - true
+ - No conversion
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - abe1ba7e-2994-43d0-9af7-cb2aaaa3f7c0
+ - y
+ - y
+ - true
+ - 0
+ - true
+ - 0
+
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 259
+ 246
+ 12
+ 20
+
+ -
+ 266.5
+ 256
+
+
+
+
+
+
+
+ - The execution information, as output and error streams
+ - 155841e4-9095-4931-9b41-7d9131e024c3
+ - out
+ - out
+ - false
+ - 0
+
+
+
+
+ -
+ 301
+ 226
+ 26
+ 20
+
+ -
+ 314
+ 236
+
@@ -870,7 +1069,7 @@
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
- - 85f65616-883d-4997-93fa-54d4e44e80e2
+ - 127d1297-1eba-4798-aaa2-01a05a1b95d6
- a
- a
- false
@@ -884,14 +1083,14 @@
-
- 186
- 320
+ 301
+ 246
26
20
-
- 199
- 330
+ 314
+ 256
@@ -901,14 +1100,14 @@
- - IiIiR3Jhc3Nob3BwZXIgU2NyaXB0IiIiDQphID0gIkhlbGxvIFB5dGhvbiAzIGluIEdyYXNzaG9wcGVyISINCnByaW50KGEpDQo=
- - S
+ - aW1wb3J0IG9zDQoNCnBhdGggPSByIkY6XGRpZmZDaGVja1xzcmNcZ2hcZGlmZkNoZWNrXGRpZmZDaGVja19hcHAucHkiDQpwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQ0Kc3ViX2RpcnMgPSBbXQ0KZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aF9kaXIpOg0KICAgIGZvciBkIGluIGRpcnM6DQogICAgICAgIHN1Yl9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4ocm9vdCwgZCkpDQogICAgICAgIHByaW50KG9zLnBhdGguam9pbihyb290LCBkKSk=
+ - Py3
- - mcneel.pythonnet.python
- - 3.9.10
+ - *.*.python
+ - 3.*
@@ -917,6 +1116,59 @@
+
+
+ - 59e0b89a-e487-49f8-bab8-b5bab16be14c
+ - Panel
+
+
+
+
+ - A panel for custom notes and text values
+ - 63a2f4e1-c253-4fc3-9148-719323b802e1
+ - Panel
+
+ - false
+ - 0
+ - 155841e4-9095-4931-9b41-7d9131e024c3
+ - 1
+ - Double click to edit panel content…
+
+
+
+
+ -
+ 386
+ 175
+ 411
+ 166
+
+ - 0
+ - 0
+ - 0
+ -
+ 386.9042
+ 175.51825
+
+
+
+
+
+ -
+ 255;213;217;232
+
+ - true
+ - true
+ - true
+ - false
+ - false
+ - true
+
+
+
+
+
+
@@ -924,7 +1176,7 @@
-
- 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qJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7pKMSrm7JKNS7i7JqJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7pKMSrm7JKNS7i7JqJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7pKMSrm7JKNS7i7JqJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7pKMSrm7JKNS7i7JqJS7SzIq5e6SjEq5uySjUu4uyaiUu0syKuXukoxKubsko1LuLsmolLtLMirl7nJhVErKPeVgVErKffWRj/w3TW73l/6tcNcAAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAAOEAAACWCAIAAACn9nhUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAADVWSURBVHhe7Z13kGTHedhJy5YoF6ss/wlaKv1DQ6qySZks03ZZZlGWWJZLsCyKAkiKAOEDeCQBHC7f3uYcZnY255xzzjnvzuYcZsPMbJjdmdm8d3sBgQHr33s9OzuzdwAO5OGwd3hdH6b6dfy6+/d93b0z7/AFJSjhKQhHSlDCWQ0njG581uH27dvh6rDwmuirYx4XtDfe1roIudh/883uaz9vv0zEnqjI50QURhU563LmGA1Th4XVRCmMKmKXs8XoocKoIg/IWWRUUxOpMKqIXRRGFTnrchYZDa2JUBhVxC5njdFDTYgmsjUuYCfccy3Yy6Ty2Qjl09ukcjMGuiz4eZvUXmuqTyamB1IUeark7DEaHBrVEa+6F+u/G+6/E35T7xewG4F4W9Qea8FESEQC9iJtEVuKVEaISDxOdyxji4jcgL2TAoqcZTmLjEa2x4XcifHfjfhZ76V/rj73xsDVoIMorw2V+0qQ/7ZEmN9WmJsxwHdTg+Bu/bbDfKyhFIBjH0uor1XDp6cphGIUeHvUxX01SCQifpth3mYJd1qTkN0Op5giZ1nOIqMR7XGqu7GuxoCXyl4JPoh+seRlUAMsidGdcFej/5UZj5sGf4C7POV+dcbjxoLPdZ03QL85dO3ShOvNJb9f9F+5pvNyWfT13lCf73772pwnhUm/POlOO28OX+OTAtfmvLzWVQqmZ1zOJqOxqntx7PL/VPzjkNsxfOIFJUZXJUbxi1em3AN2IoAYF+tqCJAwXfSBOUgVaAKx6k6cQPDSpKu0s+9I3pf0q7OeLku+gXtRXushbw1fd1nyE1mKnFk5i4yGt8dIe/1O+Gvtb77ScP5898Wgg+iTvX4nwm05ABahFubgUnqc87o44Xpl2uPypNv1ee8LIzeAjzKUvzIt+Vr8buB+lKvB/3zPRQ6v7PUk0oIC6NmXs8uo306YtJtPusEZVNkZRWkJrO0w4hxDARTU8JeepmA+vTdUOOCLYzc9OINuagAdH+y2HCidRLfD2fRBM3AvUs5SDqNPh5xFRsPao2HUd0sDQzg/gaMjoydCloyaJNwBpRtVJLcoHCpoknJSZiec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
From 0e11970c5ac499c7db78462de73010f3cc7823d9 Mon Sep 17 00:00:00 2001
From: DamienGilliard <127743632+DamienGilliard@users.noreply.github.com>
Date: Mon, 8 Apr 2024 15:34:01 +0200
Subject: [PATCH 023/141] WIP-ADD: Registrations tested and produce csv for
error and computation time. python plotter added
---
plotter.py | 26 ++++
src/diffCheck/registration/registration.cc | 86 +++++++----
src/diffCheck/registration/registration.hh | 40 ++++-
src/diffCheckApp.cc | 171 +++++++++++++++++----
4 files changed, 268 insertions(+), 55 deletions(-)
create mode 100644 plotter.py
diff --git a/plotter.py b/plotter.py
new file mode 100644
index 00000000..105f5328
--- /dev/null
+++ b/plotter.py
@@ -0,0 +1,26 @@
+import numpy as np
+import matplotlib.pyplot as plt
+
+def main():
+ # open csv file
+ time_data = np.genfromtxt('times.csv', delimiter=',', skip_header=1)
+ error_data = np.genfromtxt('errors.csv', delimiter=',', skip_header=1)
+ x = np.linspace(1, len(time_data), len(time_data))
+ plt.plot(x, time_data)
+ plt.xlabel('Iteration')
+ plt.ylabel('Time [s]')
+ plt.title('Time vs Iteration: additive 00')
+ plt.legend(["FGR Feature Matching","FGR Correspondance","Ransac Correspondance","Ransac Feature Matching"])
+ plt.show()
+
+
+ plt.plot(x, error_data)
+ plt.xlabel('Iteration')
+ plt.ylabel('Mean error [mm]')
+ plt.title('Error vs Iteration: additive 00')
+ plt.legend(["FGR Feature Matching","FGR Correspondance","Ransac Correspondance","Ransac Feature Matching"])
+ plt.show()
+
+
+if __name__ == '__main__':
+ main()
\ No newline at end of file
diff --git a/src/diffCheck/registration/registration.cc b/src/diffCheck/registration/registration.cc
index 64aab1a5..b2a65700 100644
--- a/src/diffCheck/registration/registration.cc
+++ b/src/diffCheck/registration/registration.cc
@@ -13,32 +13,18 @@ namespace diffCheck::registration
distances = O3DSourcePointCloud->ComputePointCloudDistance(*O3DTargetPointCloud);
return distances;
}
- /*
- Documentation on Fast Point Feature Historigrams: https://pcl.readthedocs.io/projects/tutorials/en/latest/fpfh_estimation.html
-
- Very simply, point features are values computed on a point cloud (for example the normal of a point, the curvature, etc.).
- point features historigrams generalize this concept by computing point features in a local neighborhood of a point, stored as higher-dimentional historigrams.
-
- For example, for a given point, you take all the neighboring points within a given radius, and create a complete graph on those vertices.
- then for each edge of the graph you compute features that are then stored in a historigram of the original center point from which the sphere and the graph where built.
- https://pcl.readthedocs.io/projects/tutorials/en/latest/pfh_estimation.html#pfh-estimation proposes a simple example of such a historigram.
-
- PCL's documentation refers to this 2009 TUM PhD thesis (but largely outside the scope of our work): https://mediatum.ub.tum.de/doc/800632/941254.pdf
-
- Quite important for us: the resultant hyperspace is dependent on the quality of the surface normal estimations at each point (if pc noisy, historigram different).
- */
open3d::pipelines::registration::RegistrationResult Registration::O3DFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target)
{
std::shared_ptr sourceO3D = source->Cvt2O3DPointCloud();
std::shared_ptr targetO3D = target->Cvt2O3DPointCloud();
- sourceO3D->RandomDownSample(0.1);
- targetO3D->RandomDownSample(0.1);
+ sourceO3D->VoxelDownSample(0.01);
+ targetO3D->VoxelDownSample(0.01);
std::shared_ptr sourceFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*sourceO3D,
- open3d::geometry::KDTreeSearchParamHybrid(0.25, 30));
+ open3d::geometry::KDTreeSearchParamHybrid(3, 50));
std::shared_ptr targetFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*targetO3D,
- open3d::geometry::KDTreeSearchParamHybrid(0.25, 30));
+ open3d::geometry::KDTreeSearchParamHybrid(0.25, 50));
std::shared_ptr option = std::make_shared();
option->maximum_correspondence_distance_ = 0.05;
option->iteration_number_ = 100;
@@ -52,18 +38,14 @@ namespace diffCheck::registration
return result;
}
- /*
- Very little information on this registration method compared to the previous one.
- If I understand correctly, this method finds keypoints in the FPFH hyperspaces of the source and target point clouds and then tries to match them.
- https://pcl.readthedocs.io/projects/tutorials/en/latest/correspondence_grouping.html
- */
+
open3d::pipelines::registration::RegistrationResult Registration::O3DFastGlobalRegistrationBasedOnCorrespondence(std::shared_ptr source, std::shared_ptr target)
{
std::shared_ptr sourceO3D = source->Cvt2O3DPointCloud();
std::shared_ptr targetO3D = target->Cvt2O3DPointCloud();
- sourceO3D->RandomDownSample(0.1);
- targetO3D->RandomDownSample(0.1);
+ sourceO3D->VoxelDownSample(0.01);
+ targetO3D->VoxelDownSample(0.01);
std::shared_ptr option = std::make_shared();
option->maximum_correspondence_distance_ = 0.05;
@@ -71,9 +53,9 @@ namespace diffCheck::registration
option->maximum_tuple_count_ = 500;
std::shared_ptr sourceFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*sourceO3D,
- open3d::geometry::KDTreeSearchParamHybrid(0.25, 30));
+ open3d::geometry::KDTreeSearchParamHybrid(3, 50));
std::shared_ptr targetFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*targetO3D,
- open3d::geometry::KDTreeSearchParamHybrid(0.25, 30));
+ open3d::geometry::KDTreeSearchParamHybrid(3, 50));
open3d::pipelines::registration::CorrespondenceSet correspondanceset;
@@ -85,4 +67,52 @@ namespace diffCheck::registration
*option);
return result;
}
-}
\ No newline at end of file
+
+ open3d::pipelines::registration::RegistrationResult Registration::O3DRansacOnCorrespondence(std::shared_ptr source, std::shared_ptr target)
+ {
+ std::shared_ptr sourceO3D = source->Cvt2O3DPointCloud();
+ std::shared_ptr targetO3D = target->Cvt2O3DPointCloud();
+
+ sourceO3D->VoxelDownSample(0.01);
+ targetO3D->VoxelDownSample(0.01);
+
+ std::shared_ptr sourceFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*sourceO3D,
+ open3d::geometry::KDTreeSearchParamHybrid(3, 50));
+ std::shared_ptr targetFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*targetO3D,
+ open3d::geometry::KDTreeSearchParamHybrid(3, 50));
+
+
+ open3d::pipelines::registration::CorrespondenceSet correspondanceset;
+ correspondanceset = open3d::pipelines::registration::CorrespondencesFromFeatures(*sourceFPFHFeatures, *targetFPFHFeatures);
+
+ auto result = open3d::pipelines::registration::RegistrationRANSACBasedOnCorrespondence(*sourceO3D,
+ *targetO3D,
+ correspondanceset,
+ 0.05,
+ open3d::pipelines::registration::TransformationEstimationPointToPoint(),
+ 200);
+ return result;
+ }
+
+ open3d::pipelines::registration::RegistrationResult Registration::O3DRansacOnFeatureMatching(std::shared_ptr source, std::shared_ptr target)
+ {
+ std::shared_ptr sourceO3D = source->Cvt2O3DPointCloud();
+ std::shared_ptr targetO3D = target->Cvt2O3DPointCloud();
+
+ sourceO3D->VoxelDownSample(0.01);
+ targetO3D->VoxelDownSample(0.01);
+
+ std::shared_ptr sourceFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*sourceO3D,
+ open3d::geometry::KDTreeSearchParamHybrid(3, 50));
+ std::shared_ptr targetFPFHFeatures = open3d::pipelines::registration::ComputeFPFHFeature(*targetO3D,
+ open3d::geometry::KDTreeSearchParamHybrid(3, 50));
+ auto result = open3d::pipelines::registration::RegistrationRANSACBasedOnFeatureMatching(*sourceO3D,
+ *targetO3D,
+ *sourceFPFHFeatures,
+ *targetFPFHFeatures,
+ false,
+ 0.05);
+
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/src/diffCheck/registration/registration.hh b/src/diffCheck/registration/registration.hh
index 69779a72..df1e5d53 100644
--- a/src/diffCheck/registration/registration.hh
+++ b/src/diffCheck/registration/registration.hh
@@ -8,11 +8,49 @@ namespace diffCheck::registration{
class Registration
{
public:
+
+ std::vector ComputeP2PDistance(std::shared_ptr source, std::shared_ptr target);
+
+ /*
+ Documentation on Fast Point Feature Historigrams: https://pcl.readthedocs.io/projects/tutorials/en/latest/fpfh_estimation.html
+
+ Very simply, point features are values computed on a point cloud (for example the normal of a point, the curvature, etc.).
+ point features historigrams generalize this concept by computing point features in a local neighborhood of a point, stored as higher-dimentional historigrams.
+
+ For example, for a given point, you take all the neighboring points within a given radius, and create a complete graph on those vertices.
+ then for each edge of the graph you compute features that are then stored in a historigram of the original center point from which the sphere and the graph where built.
+ https://pcl.readthedocs.io/projects/tutorials/en/latest/pfh_estimation.html#pfh-estimation proposes a simple example of such a historigram.
+ PCL's documentation refers to this 2009 TUM PhD thesis (but largely outside the scope of our work): https://mediatum.ub.tum.de/doc/800632/941254.pdf
+
+ Quite important for us: the resultant hyperspace is dependent on the quality of the surface normal estimations at each point (if pc noisy, historigram different).
+ */
open3d::pipelines::registration::RegistrationResult O3DFastGlobalRegistrationFeatureMatching(std::shared_ptr source, std::shared_ptr target);
+ /*
+ Very little information on this registration method compared to the previous one.
+ If I understand correctly, this method finds keypoints in the FPFH hyperspaces of the source and target point clouds and then tries to match them.
+ https://pcl.readthedocs.io/projects/tutorials/en/latest/correspondence_grouping.html
+ */
open3d::pipelines::registration::RegistrationResult O3DFastGlobalRegistrationBasedOnCorrespondence(std::shared_ptr source, std::shared_ptr target);
+ /*
+ Ransac registration based on correspondence:
+ Correspondances are computed between the source and target point clouds.
+ Then, a transformation is computed that minimizes the error between the correspondances.
+ If the error is above a certain threshold, the transformation is discarded and a new one is computed.
- std::vector ComputeP2PDistance(std::shared_ptr source, std::shared_ptr target);
+ In practice, Open3D gives little information about the feature correspondence
+
+ */
+ open3d::pipelines::registration::RegistrationResult Registration::O3DRansacOnCorrespondence(std::shared_ptr source, std::shared_ptr target);
+ /*
+ Ransac registration based on Feature Matching
+ https://www.open3d.org/docs/release/tutorial/pipelines/global_registration.html#RANSAC
+ */
+ open3d::pipelines::registration::RegistrationResult Registration::O3DRansacOnFeatureMatching(std::shared_ptr source, std::shared_ptr target);
+
+
+
+
};
}
\ No newline at end of file
diff --git a/src/diffCheckApp.cc b/src/diffCheckApp.cc
index 7273426c..503c2ed2 100644
--- a/src/diffCheckApp.cc
+++ b/src/diffCheckApp.cc
@@ -7,51 +7,170 @@
#include
#include
+#include
+#include
int main()
{
std::shared_ptr dfPointCloudPtr = std::make_shared();
- std::shared_ptr dfPointCloudPtrAfterTrans = std::make_shared();
- std::shared_ptr dfPointCloudPtrAfterReg = std::make_shared();
+ std::shared_ptr dfPointCloudPtrAfterTrans_1 = std::make_shared();
+ std::shared_ptr dfPointCloudPtrAfterTrans_2 = std::make_shared();
+ std::shared_ptr dfPointCloudPtrAfterTrans_3 = std::make_shared();
+ std::shared_ptr dfPointCloudPtrAfterTrans_4 = std::make_shared();
std::shared_ptr dfPointCloudPtrGroundTruth = std::make_shared();
std::shared_ptr dfMeshPtr = std::make_shared();
- std::string pathCloud = R"(C:\Users\localuser\Downloads\04_pt.ply)";
- std::string pathMesh = R"(C:\Users\localuser\Downloads\04_mesh.ply)";
+ std::string pathCloud = R"(C:\Users\localuser\Downloads\00_pt.ply)";
+ std::string pathMesh = R"(C:\Users\localuser\Downloads\00_mesh.ply)";
// std::string pathMesh = R"(F:\diffCheck\temp\03_mesh.ply)";
dfMeshPtr->LoadFromPLY(pathMesh);
dfPointCloudPtr->LoadFromPLY(pathCloud);
+ // add noise to dfPointCloudPtr
+ for (int i = 0; i < dfPointCloudPtr->Points.size(); i++)
+ {
+ dfPointCloudPtr->Points[i] += Eigen::Vector3d::Random() * 0.01;
+ }
+
+ std::vector timesFGRFeatureMatching;
+ std::vector timesFGRCorrespondance;
+ std::vector timesRansacCorrespondance;
+ std::vector timesRansacFeatureMatching;
+
+ std::vector errorsFGRFeatureMatching;
+ std::vector errorsFGRCorrespondance;
+ std::vector errorsRansacCorrespondance;
+ std::vector errorsRansacFeatureMatching;
+int iterations = 50;
+
// populate the mesh with points and store it in dfPointCloudPtrGroundTruth
dfPointCloudPtrGroundTruth->Cvt2DFPointCloud(dfMeshPtr->Cvt2O3DTriangleMesh()->SamplePointsUniformly(100000));
- // create a rigid rotation matrix
- Eigen::Matrix4d T = Eigen::Matrix4d::Identity();
- T.block<3, 3>(0, 0) = Eigen::AngleAxisd(3 , Eigen::Vector3d::UnitZ()).toRotationMatrix(); // Yes, Pi = 3 in this world
- T(0, 3) = 10;
- T(1, 3) = -40;
+ std::vector transformations;
+ for (int i = 0; i < iterations; i++)
+ {
+ // create a rigid rotation matrix
+ Eigen::Matrix4d T = Eigen::Matrix4d::Identity();
+ T.block<3, 3>(0, 0) = Eigen::AngleAxisd(0.3*i, Eigen::Vector3d::UnitX()).toRotationMatrix();
+ T(0, 3) = 30 * i;
+ T(1, 3) = -40 * i;
+ T(2, 3) = 60 * i;
+ transformations.push_back(T);
+ }
+
+
+ for (int i = 0; i < iterations; i++)
+ {
+ std::shared_ptr o3DPointCloud = dfPointCloudPtr->Cvt2O3DPointCloud();
+
+ std::shared_ptr o3DPointCloudAfterTrans = std::make_shared(o3DPointCloud->Transform(transformations[i]));
+ dfPointCloudPtrAfterTrans_1 = std::make_shared();
+ dfPointCloudPtrAfterTrans_2 = std::make_shared();
+ dfPointCloudPtrAfterTrans_3 = std::make_shared();
+ dfPointCloudPtrAfterTrans_4 = std::make_shared();
+
+ dfPointCloudPtrAfterTrans_1->Cvt2DFPointCloud(o3DPointCloudAfterTrans);
+ dfPointCloudPtrAfterTrans_2->Cvt2DFPointCloud(o3DPointCloudAfterTrans);
+ dfPointCloudPtrAfterTrans_3->Cvt2DFPointCloud(o3DPointCloudAfterTrans);
+ dfPointCloudPtrAfterTrans_4->Cvt2DFPointCloud(o3DPointCloudAfterTrans);
- std::shared_ptr o3DPointCloudAfterTrans = std::make_shared(dfPointCloudPtr->Cvt2O3DPointCloud()->Transform(T));
- dfPointCloudPtrAfterTrans->Cvt2DFPointCloud(o3DPointCloudAfterTrans);
std::shared_ptr reg = std::make_shared();
- //auto result = reg->O3DFastGlobalRegistrationFeatureMatching(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
- auto result = reg->O3DFastGlobalRegistrationBasedOnCorrespondence(dfPointCloudPtrAfterTrans, dfPointCloudPtr);
-
- // apply the transformation to the source point cloud
- Eigen::Matrix transformation = result.transformation_;
- std::shared_ptr o3DPointCloudPtrAfterReg = std::make_shared(dfPointCloudPtrAfterTrans->Cvt2O3DPointCloud()->Transform(transformation));
- dfPointCloudPtrAfterReg->Cvt2DFPointCloud(o3DPointCloudPtrAfterReg);
- std::vector errors = reg->ComputeP2PDistance(dfPointCloudPtrAfterReg, dfPointCloudPtrGroundTruth);
- std::cout << "Mean distance: " << std::accumulate(errors.begin(), errors.end(), 0.0) / errors.size() << std::endl;
-
- std::shared_ptr vis = std::make_shared();
- vis->AddPointCloud(dfPointCloudPtrGroundTruth);
- vis->AddPointCloud(dfPointCloudPtrAfterReg);
- vis->AddMesh(dfMeshPtr);
- vis->Run();
+
+ // Testing the Fast Global Registration on Feature Matching method
+ std::shared_ptr dfPointCloudPtrAfterReg_1 = std::make_shared();
+ clock_t start_1 = clock();
+ auto result_1 = reg->O3DFastGlobalRegistrationFeatureMatching(dfPointCloudPtrAfterTrans_1, dfPointCloudPtr);
+ double _intermediate_time_1 = (clock() - start_1) / (double) CLOCKS_PER_SEC;
+ timesFGRFeatureMatching.push_back(_intermediate_time_1);
+ Eigen::Matrix transformation = result_1.transformation_;
+ std::shared_ptr o3DPointCloudPtrAfterReg_1 = std::make_shared(dfPointCloudPtrAfterTrans_1->Cvt2O3DPointCloud()->Transform(transformation));
+ dfPointCloudPtrAfterReg_1->Cvt2DFPointCloud(o3DPointCloudPtrAfterReg_1);
+ std::vector errors_1 = reg->ComputeP2PDistance(dfPointCloudPtrAfterReg_1, dfPointCloudPtrGroundTruth);
+ errorsFGRFeatureMatching.push_back(std::accumulate(errors_1.begin(), errors_1.end(), 0.0) / errors_1.size());
+
+ // Testing the Fast Global Registration on Correspondance method
+ std::shared_ptr dfPointCloudPtrAfterReg_2 = std::make_shared();
+ clock_t start_2 = clock();
+ auto result_2 = reg->O3DFastGlobalRegistrationBasedOnCorrespondence(dfPointCloudPtrAfterTrans_2, dfPointCloudPtr);
+ double _intermediate_time_2 = (clock() - start_2) / (double) CLOCKS_PER_SEC;
+ timesFGRCorrespondance.push_back(_intermediate_time_2);
+ Eigen::Matrix transformation_2 = result_2.transformation_;
+ std::shared_ptr o3DPointCloudPtrAfterReg_2 = std::make_shared(dfPointCloudPtrAfterTrans_2->Cvt2O3DPointCloud()->Transform(transformation_2));
+ dfPointCloudPtrAfterReg_2->Cvt2DFPointCloud(o3DPointCloudPtrAfterReg_2);
+ std::vector errors_2 = reg->ComputeP2PDistance(dfPointCloudPtrAfterReg_2, dfPointCloudPtrGroundTruth);
+ errorsFGRCorrespondance.push_back(std::accumulate(errors_2.begin(), errors_2.end(), 0.0) / errors_2.size());
+
+ // Testing the Ransac registration based on correspondance method
+ std::shared_ptr dfPointCloudPtrAfterReg_3 = std::make_shared();
+ clock_t start_3 = clock();
+ auto result_3 = reg->O3DRansacOnCorrespondence(dfPointCloudPtrAfterTrans_3, dfPointCloudPtr);
+ double _intermediate_time_3 = (clock() - start_3) / (double) CLOCKS_PER_SEC;
+ timesRansacCorrespondance.push_back(_intermediate_time_3);
+ Eigen::Matrix transformation_3 = result_3.transformation_;
+ std::shared_ptr o3DPointCloudPtrAfterReg_3 = std::make_shared(dfPointCloudPtrAfterTrans_3->Cvt2O3DPointCloud()->Transform(transformation_3));
+ dfPointCloudPtrAfterReg_3->Cvt2DFPointCloud(o3DPointCloudPtrAfterReg_3);
+ std::vector errors_3 = reg->ComputeP2PDistance(dfPointCloudPtrAfterReg_3, dfPointCloudPtrGroundTruth);
+ errorsRansacCorrespondance.push_back(std::accumulate(errors_3.begin(), errors_3.end(), 0.0) / errors_3.size());
+
+ // Testing the Ransac registration based on Feature Matching method
+ std::shared_ptr dfPointCloudPtrAfterReg_4 = std::make_shared();
+ clock_t start_4 = clock();
+ auto result_4 = reg->O3DRansacOnFeatureMatching(dfPointCloudPtrAfterTrans_4, dfPointCloudPtr);
+ double _intermediate_time_4 = (clock() - start_4) / (double) CLOCKS_PER_SEC;
+ timesRansacFeatureMatching.push_back(_intermediate_time_4);
+ Eigen::Matrix transformation_4 = result_4.transformation_;
+ std::shared_ptr o3DPointCloudPtrAfterReg_4 = std::make_shared(dfPointCloudPtrAfterTrans_4->Cvt2O3DPointCloud()->Transform(transformation_4));
+ dfPointCloudPtrAfterReg_4->Cvt2DFPointCloud(o3DPointCloudPtrAfterReg_4);
+ std::vector errors_4 = reg->ComputeP2PDistance(dfPointCloudPtrAfterReg_4, dfPointCloudPtrGroundTruth);
+ errorsRansacFeatureMatching.push_back(std::accumulate(errors_4.begin(), errors_4.end(), 0.0) / errors_4.size());
+
+ std::cout<<"Iteration: "<
Date: Mon, 8 Apr 2024 18:04:34 +0200
Subject: [PATCH 024/141] WIP-FLASH: need to clean and add loop but joint
detector in place
---
.../{xml_exporter => DF_xml_exporter}/code.py | 4 +-
.../icon.png | Bin
.../metadata.json | 2 +-
src/gh/diffCheck/diffCheck/df_geometries.py | 16 ++
.../diffCheck/diffCheck/df_joint_detector.py | 170 ++--------------
src/gh/diffCheck/diffCheck/df_util.py | 134 +++++++++++++
src/gh/diffCheck/diffCheck/diffCheck_app.py | 182 +++++++-----------
7 files changed, 234 insertions(+), 274 deletions(-)
rename src/gh/components/{xml_exporter => DF_xml_exporter}/code.py (92%)
rename src/gh/components/{xml_exporter => DF_xml_exporter}/icon.png (100%)
rename src/gh/components/{xml_exporter => DF_xml_exporter}/metadata.json (98%)
create mode 100644 src/gh/diffCheck/diffCheck/df_util.py
diff --git a/src/gh/components/xml_exporter/code.py b/src/gh/components/DF_xml_exporter/code.py
similarity index 92%
rename from src/gh/components/xml_exporter/code.py
rename to src/gh/components/DF_xml_exporter/code.py
index 69be3030..a9acc888 100644
--- a/src/gh/components/xml_exporter/code.py
+++ b/src/gh/components/DF_xml_exporter/code.py
@@ -15,10 +15,10 @@
from ghpythonlib.componentbase import executingcomponent as component
-from diffCheck.df_geometries import DFBeam, DFAssembly
+from diffCheck.df_geometries import DFVertex, DFFace, DFBeam, DFAssembly
-class XMLExporter(component):
+class DFXMLExporter(component):
def RunScript(self,
i_dump : bool,
i_export_dir : str,
diff --git a/src/gh/components/xml_exporter/icon.png b/src/gh/components/DF_xml_exporter/icon.png
similarity index 100%
rename from src/gh/components/xml_exporter/icon.png
rename to src/gh/components/DF_xml_exporter/icon.png
diff --git a/src/gh/components/xml_exporter/metadata.json b/src/gh/components/DF_xml_exporter/metadata.json
similarity index 98%
rename from src/gh/components/xml_exporter/metadata.json
rename to src/gh/components/DF_xml_exporter/metadata.json
index 438b6f20..d805390c 100644
--- a/src/gh/components/xml_exporter/metadata.json
+++ b/src/gh/components/DF_xml_exporter/metadata.json
@@ -1,5 +1,5 @@
{
- "name": "Exporter to xml",
+ "name": "DFXMLExporter",
"nickname": "XMLout",
"category": "diffCheck",
"subcategory": "Utility",
diff --git a/src/gh/diffCheck/diffCheck/df_geometries.py b/src/gh/diffCheck/diffCheck/df_geometries.py
index 631b27c8..17889de5 100644
--- a/src/gh/diffCheck/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/diffCheck/df_geometries.py
@@ -27,6 +27,9 @@ def __post_init__(self):
def __repr__(self):
return f"Vertex: X={self.x}, Y={self.y}, Z={self.z}"
+ def from_rg_point3d(point: rg.Point3d):
+ return DFVertex(point.X, point.Y, point.Z)
+
@dataclass
class DFFace:
@@ -47,6 +50,19 @@ def __post_init__(self):
def __repr__(self):
return f"Face vertices: {len(self.vertices)}"
+ @staticmethod
+ def compute_mass_center(face: rg.BrepFace) -> rg.Point3d:
+ """
+ Compute the mass center of a face
+
+ :param face: The face to compute the mass center from
+ :return mass_center: The mass center of the face
+ """
+ amp = rg.AreaMassProperties.Compute(face)
+ if amp:
+ return amp.Centroid
+ return None
+
@property
def is_joint(self):
if self.joint_id:
diff --git a/src/gh/diffCheck/diffCheck/df_joint_detector.py b/src/gh/diffCheck/diffCheck/df_joint_detector.py
index 40b25fee..64c2c0a0 100644
--- a/src/gh/diffCheck/diffCheck/df_joint_detector.py
+++ b/src/gh/diffCheck/diffCheck/df_joint_detector.py
@@ -1,100 +1,22 @@
-import rhinoscriptsyntax as rs
-import Rhino as rc
+import Rhino
import scriptcontext as sc
import Rhino.Geometry as rg
-import datetime as dt
-import math
-import log
-import hole
-import cut
-import util
+import typing
-# import visual_debug as vd
+import df_util
-def get_lowest_brep_vertex(brep):
- """ Get the the vertex with the lowest y,x and z values """
- biggest_vertices = brep.Vertices
- lowest_x = 0
- lowest_y = 0
- lowest_z = 0
- for vertex in biggest_vertices:
- if vertex.Location.X < lowest_x:
- lowest_x = vertex.Location.X
- if vertex.Location.Y < lowest_y:
- lowest_y = vertex.Location.Y
- if vertex.Location.Z < lowest_z:
- lowest_z = vertex.Location.Z
- return rc.Geometry.Point3d(lowest_x, lowest_y, lowest_z)
-
-def pln_2_pln_world_transform(brep):
- """ Transform a brep to the world plane """
- print("Computing Oriented Bounding Boxes...")
-
- # find the longest edge of the brep
- edges = brep.Edges
- longest_edge = None
- longest_edge_length = 0
- for edge in edges:
- if edge.GetLength() > longest_edge_length:
- longest_edge_length = edge.GetLength()
- longest_edge = edge
-
- # find biggest face
- face_indices = longest_edge.AdjacentFaces()
- faces = [brep.Faces[face_index] for face_index in face_indices]
- biggest_face = None
- biggest_face_area = 0
- for face in faces:
- if rg.AreaMassProperties.Compute(face).Area > biggest_face_area:
- biggest_face_area = rg.AreaMassProperties.Compute(face).Area
- biggest_face = face
-
- # get the plane of the biggest face
- if biggest_face.TryGetPlane()[0] is False:
- print("Could not find plane for longest edge. Exiting...")
- return
- plane_src = biggest_face.TryGetPlane()[1]
- plane_tgt = rc.Geometry.Plane.WorldXY
- print("Found plane for longest edge: " + str(plane_src))
-
- # plane to plane transformation
- plane_to_world = rc.Geometry.Transform.PlaneToPlane(plane_src, plane_tgt)
- brep.Transform(plane_to_world)
-
- # adjust to x,y,z positive
- lowest_vertex = get_lowest_brep_vertex(brep)
- lowest_vertex_transform = rc.Geometry.Transform.Translation(rg.Vector3d(-lowest_vertex))
- brep.Transform(lowest_vertex_transform)
-
- bbox = brep.GetBoundingBox(True)
- bbox_corners = bbox.GetCorners()
- y_val_sum = 0
- x_val_sum = 0
- for corner in bbox_corners:
- y_val_sum += corner.Y
- x_val_sum += corner.X
-
- if x_val_sum > y_val_sum:
- print("Bounding box is alligned to x axis. No rotation needed.")
- else:
- print("Bounding box is not alligned to y axis. A 90 deg rotation is needed.")
- rot_90_z = rc.Geometry.Transform.Rotation(math.radians(90), rg.Vector3d.ZAxis, rg.Point3d.Origin)
- brep.Transform(rot_90_z)
- lowest_vertex = get_lowest_brep_vertex(brep)
-
- lowest_vertex_transform = rc.Geometry.Transform.Translation(rg.Vector3d(-lowest_vertex))
- brep.Transform(lowest_vertex_transform)
-
- # vd.addBrep(brep, clr=(255, 0, 0, 30))
-
-def distinguish_holes_cuts(breps):
+def distinguish_holes_cuts(breps) -> typing.Tuple[typing.List[Rhino.Geometry.Brep], typing.List[Rhino.Geometry.Brep]]:
"""
Analyse the result breps from the boolean difference operation
and distinguish between holes and cuts
+
+ :param breps: list of breps
+ :return: holes and cuts breps
"""
is_hole = False
is_cut = False
+ is_tenon_mortise = False
is_mix = False
holes_b = []
cuts_b = []
@@ -109,7 +31,8 @@ def distinguish_holes_cuts(breps):
if not f.IsPlanar():
is_cut = False
is_hole = True
- b_faces = util.explode_brep(b)
+
+ b_faces = df_util.explode_brep(b)
for b_face in b_faces:
if b_face.Faces[0].IsPlanar():
b_face_edges = b_face.Edges
@@ -145,7 +68,7 @@ def distinguish_holes_cuts(breps):
# (5) check if closed, if it is
# ----------------------
# (1) explode
- faces_b = util.explode_brep(b)
+ faces_b = df_util.explode_brep(b)
# (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
flat_faces_b = []
@@ -160,8 +83,8 @@ def distinguish_holes_cuts(breps):
non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
# (4) boolunion every object in both lists
- flat_faces_b = rc.Geometry.Brep.CreateBooleanUnion(flat_faces_b, sc.doc.ModelAbsoluteTolerance)
- non_flat_faces_b = rc.Geometry.Brep.CreateBooleanUnion(non_flat_faces_b, sc.doc.ModelAbsoluteTolerance)
+ flat_faces_b = Rhino.Geometry.Brep.CreateBooleanUnion(flat_faces_b, sc.doc.ModelAbsoluteTolerance)
+ non_flat_faces_b = Rhino.Geometry.Brep.CreateBooleanUnion(non_flat_faces_b, sc.doc.ModelAbsoluteTolerance)
# (3) cap candidate cuts
flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in flat_faces_b]
@@ -183,70 +106,3 @@ def distinguish_holes_cuts(breps):
holes_b.append(f_b)
return holes_b, cuts_b
-
-def main():
-
- # vd.set_on()
- # print(vd.__IS_VDEBUG__)
-
- print(".acim exporter started")
- rh_doc_path = rs.DocumentPath()
- timestamp = dt.datetime.now().strftime("%Y%m%d_%H%M%S")
- acim_path = rh_doc_path + timestamp
- print("Creating ACIM file at: " + acim_path)
- ACIM = acim.ACIM(acim_path)
-
- pieces = rs.GetObjects("Select pieces to be exported", rs.filter.polysurface, preselect=True)
- if not pieces:
- print("No pieces selected. Exiting...")
- return
- print("Selected " + str(len(pieces)) + " pieces.")
-
- for p_GUID in pieces:
- print("Processing piece: " + str(p_GUID))
- ACIM.add_timber(str(p_GUID))
- ACIM.add_timber_state(str(p_GUID), 0)
- brep = rs.coercebrep(p_GUID)
-
- # transform to world plane
- pln_2_pln_world_transform(brep)
-
- # compute the bounding box
- bbox = brep.GetBoundingBox(True)
- bbox_b = bbox.ToBrep()
- ACIM.add_bbox(str(p_GUID), bbox.GetCorners())
-
- # boolean difference between the bounding box and the brep transformed
- brep_result = rc.Geometry.Brep.CreateBooleanDifference(bbox_b, brep, sc.doc.ModelAbsoluteTolerance)
- if brep_result is None or len(brep_result) == 0:
- log.error("No breps found after boolean difference. Exiting...")
- return
-
- # get holes and cuts breps
- holes_b, cuts_b = distinguish_holes_cuts(brep_result)
- print("Found:\n" \
- + "\t --holes: " + str(len(holes_b)) + "\n" \
- + "\t --cuts: " + str(len(cuts_b)) + "\n")
-
- # analyse and loading holes and cuts into .acim
- if holes_b.__len__() != 0:
- for hole_b in holes_b:
- # vd.addBrep(hole_b, clr=(255, 255, 0, 30))
- print("Processing hole: " + str(hole_b))
- hole.parse_data_from_brep(ACIM, str(p_GUID), hole_b, bbox_b)
-
- if cuts_b.__len__() != 0:
- cut_counter = 1
- for cut_b in cuts_b:
- # vd.addBrep(cut_b, clr=(255, 0, 255, 30))
- print("Processing cut: " + str(cut_b))
- cut.parse_data_from_brep(ACIM, str(p_GUID), cut_b, bbox_b)
-
- # vd.addSingleDot(cut_b.GetBoundingBox(True).Center, str(cut_counter), (0,0,255))
- cut_counter += 1
-
- sc.doc.Views.Redraw()
- ACIM.dump_data()
-
-if __name__ == '__main__':
- main()
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/df_util.py b/src/gh/diffCheck/diffCheck/df_util.py
new file mode 100644
index 00000000..bae262c9
--- /dev/null
+++ b/src/gh/diffCheck/diffCheck/df_util.py
@@ -0,0 +1,134 @@
+import Rhino
+import Rhino.Geometry as rg
+import rhinoscriptsyntax as rs
+import scriptcontext as sc
+
+import typing
+
+
+def explode_brep(brep) -> typing.List[Rhino.Geometry.Brep]:
+ """ Explode a brep into its faces """
+ exploded_objects = []
+ if brep.IsSolid:
+ for face in brep.Faces:
+ face_brep = face.DuplicateFace(False)
+ if face_brep:
+ exploded_objects.append(face_brep)
+ else:
+ for face in brep.Faces:
+ face_brep = face.DuplicateFace(False)
+ if face_brep:
+ exploded_objects.append(face_brep)
+ return exploded_objects
+
+def get_crv_circle_center(crv) -> rg.Point3d:
+ """ Get the center of a circle """
+ bbox = crv.GetBoundingBox(True)
+ bbox_b = bbox.ToBrep()
+ center_point = bbox_b.GetBoundingBox(True).Center
+ return center_point
+
+def is_pt_unique_in_dict(pt, pt_dict) -> bool:
+ """
+ Detect if the point exists in the dictionary, and if so, return the index
+
+ :param pt: the point to check
+ :param pt_dict: the dictionary to check
+ :return: True if the point is unique, False otherwise
+ """
+ is_unique = True
+ for pt_dict in pt_dict.keys():
+ X_a = round(pt.X, 3)
+ Y_a = round(pt.Y, 3)
+ Z_a = round(pt.Z, 3)
+
+ X_b = round(pt_dict.X, 3)
+ Y_b = round(pt_dict.Y, 3)
+ Z_b = round(pt_dict.Z, 3)
+
+ if X_a == X_b and Y_a == Y_b and Z_a == Z_b:
+ is_unique = False
+ break
+ return is_unique
+
+def is_pt_unique_in_list(pt, list) -> bool:
+ """
+ Detect if the point exists in the list, and if so, return the index
+
+ :param pt: the point to check
+ :param list: the list to check
+ :return: True if the point is unique, False otherwise
+ """
+ is_unique = True
+ for pt_list in list:
+ X_a = round(pt.X, 3)
+ Y_a = round(pt.Y, 3)
+ Z_a = round(pt.Z, 3)
+
+ X_b = round(pt_list.X, 3)
+ Y_b = round(pt_list.Y, 3)
+ Z_b = round(pt_list.Z, 3)
+
+ if X_a == X_b and Y_a == Y_b and Z_a == Z_b:
+ is_unique = False
+ break
+ return is_unique
+
+def detect_idx_pt_in_list(pt, list) -> int:
+ """
+ Detect the index of a point in a list
+
+ :param pt: the point to check
+ :param list: the list to check
+ :return: the index of the point in the list
+ """
+ idx = -1
+ for pt_list in list:
+ idx += 1
+ X_a = round(pt.X, 3)
+ Y_a = round(pt.Y, 3)
+ Z_a = round(pt.Z, 3)
+
+ X_b = round(pt_list.X, 3)
+ Y_b = round(pt_list.Y, 3)
+ Z_b = round(pt_list.Z, 3)
+
+ if X_a == X_b and Y_a == Y_b and Z_a == Z_b:
+ return idx
+ return idx
+
+def compute_ordered_vertices(brep_face) -> typing.List[Rhino.Geometry.Point3d]:
+ """ Retrieve the ordered vertices of a brep face """
+ sorted_vertices = []
+
+ edges = brep_face.DuplicateEdgeCurves()
+ edges = list(set(edges))
+
+ edges_sorted = []
+ while len(edges) > 0:
+ if len(edges_sorted) == 0:
+ edges_sorted.append(edges[0])
+ edges.pop(0)
+ else:
+ for edge in edges:
+ if edges_sorted[-1].PointAtStart == edge.PointAtStart:
+ edges_sorted.append(edge)
+ edges.pop(edges.index(edge))
+ break
+ elif edges_sorted[-1].PointAtStart == edge.PointAtEnd:
+ edges_sorted.append(edge)
+ edges.pop(edges.index(edge))
+ break
+ elif edges_sorted[-1].PointAtEnd == edge.PointAtStart:
+ edges_sorted.append(edge)
+ edges.pop(edges.index(edge))
+ break
+ elif edges_sorted[-1].PointAtEnd == edge.PointAtEnd:
+ edges_sorted.append(edge)
+ edges.pop(edges.index(edge))
+ break
+
+ for edge in edges_sorted:
+ sorted_vertices.append(edge.PointAtStart)
+
+ return sorted_vertices
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck/diffCheck_app.py
index f9d5d644..ba728213 100644
--- a/src/gh/diffCheck/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck/diffCheck_app.py
@@ -6,113 +6,10 @@
import os
import typing
-from df_geometries import DFBeam, DFAssembly # diffCheck.
+from df_geometries import DFVertex, DFFace, DFBeam, DFAssembly # diffCheck.
import df_transformations # diffCheck.
-
-
-
-
- # vd.addBrep(brep, clr=(255, 0, 0, 30))
-
-
-def distinguish_holes_cuts(breps) -> typing.Tuple[typing.List[Rhino.Geometry.Brep], typing.List[Rhino.Geometry.Brep]]:
- """
- Analyse the result breps from the boolean difference operation
- and distinguish between holes and cuts
-
- :param breps: list of breps
- :return: holes and cuts breps
- """
- is_hole = False
- is_cut = False
- is_mix = False
- holes_b = []
- cuts_b = []
- mix_b = []
-
- # parse holes, cuts and mix
- for b in breps:
- is_cut = True
- for f in b.Faces:
- f_brep = f.ToBrep()
- f = f_brep.Faces[0]
- if not f.IsPlanar():
- is_cut = False
- is_hole = True
- b_faces = util.explode_brep(b)
- for b_face in b_faces:
- if b_face.Faces[0].IsPlanar():
- b_face_edges = b_face.Edges
- for b_face_edge in b_face_edges:
- if not b_face_edge.IsClosed:
- is_mix = True
- is_hole = False
- break
- if is_mix:
- break
- break
-
- if is_hole:
- holes_b.append(b)
- elif is_cut:
- cuts_b.append(b)
- elif is_mix:
- mix_b.append(b)
-
- is_hole = False
- is_cut = False
- is_mix = False
-
- # deal with mix
- candidate_cuts = []
- candidate_holes = []
- for b in mix_b:
- # -- algorithm draft --
- # (1) explode
- # (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
- # (3) cap each object in both lists
- # (4) boolunion every object in both lists
- # (5) check if closed, if it is
- # ----------------------
- # (1) explode
- faces_b = util.explode_brep(b)
-
- # (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
- flat_faces_b = []
- non_flat_faces_b = []
- for f_b in faces_b:
- if f_b.Faces[0].IsPlanar():
- flat_faces_b.append(f_b)
- else:
- non_flat_faces_b.append(f_b)
-
- # (*) cap the cylinders
- non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
-
- # (4) boolunion every object in both lists
- flat_faces_b = Rhino.Geometry.Brep.CreateBooleanUnion(flat_faces_b, sc.doc.ModelAbsoluteTolerance)
- non_flat_faces_b = Rhino.Geometry.Brep.CreateBooleanUnion(non_flat_faces_b, sc.doc.ModelAbsoluteTolerance)
-
- # (3) cap candidate cuts
- flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in flat_faces_b]
- # non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
-
- # (*) merge all coplanar faces in breps cut candidates
- for f_b in flat_faces_b:
- if f_b is not None:
- f_b.MergeCoplanarFaces(sc.doc.ModelAbsoluteTolerance)
-
- # (5) check if closed, if it is add to cuts, if not add to holes
- for f_b in flat_faces_b:
- if f_b is not None:
- if f_b.IsSolid:
- cuts_b.append(f_b)
- for f_b in non_flat_faces_b:
- if f_b is not None:
- if f_b.IsSolid:
- holes_b.append(f_b)
-
- return holes_b, cuts_b
+import df_joint_detector # diffCheck.
+import df_util # diffCheck.
if __name__ == "__main__":
@@ -120,20 +17,20 @@ def distinguish_holes_cuts(breps) -> typing.Tuple[typing.List[Rhino.Geometry.Bre
print("Running diffCheck...")
x_form = df_transformations.pln_2_pln_world_transform(i_brep)
- # transformation to matrix
- i_brep_copy.Transform(x_form)
-
# reverse the transformation
x_form_back = df_transformations.get_inverse_transformation(x_form)
# i_brep.Transform(x_form_back)
-
-
- o_brep = i_brep
+ # o_brep = i_brep
- # compute the bounding box
+ # compute the bounding box and inflate to include butt joints typo
bbox = i_brep.GetBoundingBox(True)
+ diagonal = bbox.Diagonal
+ scaling_factor = diagonal.Length / 10
+ bbox.Inflate(
+ scaling_factor, 0, 0
+ )
bbox_b = bbox.ToBrep()
print("Bounding box computed...")
@@ -143,15 +40,72 @@ def distinguish_holes_cuts(breps) -> typing.Tuple[typing.List[Rhino.Geometry.Bre
print("No breps found after boolean difference. Exiting...")
# return
+ ##################################################################
+ ##################################################################
# distinguish holes and cuts
- holes_b, cuts_b = distinguish_holes_cuts(brep_result)
+ holes_b, cuts_b = df_joint_detector.distinguish_holes_cuts(brep_result)
+ # retransform back everything
for b in holes_b:
b.Transform(x_form_back)
for b in cuts_b:
b.Transform(x_form_back)
+ i_brep.Transform(x_form_back)
+
+ # parse into DFFaces with detection of
+ # - wether it is a joint (bool)
+ # - if it is a hole, which one is (id)
+
+ df_faces = []
+ all_faces_centroids : typing.List[rg.Point3d] = []
+ cuts_faces_centroids : typing.Dict[int, typing.List[rg.Point3d]] = {}
+ detected_facesjoint_centroids : typing.List[rg.Point3d] = []
+ side_faces_centroids : typing.List[rg.Point3d] = []
+
+ # get all the medians of the faces of cuts_b
+ for idx, b in enumerate(cuts_b):
+ temp_face_centroids = []
+ for f in b.Faces:
+ centroid = DFFace.compute_mass_center(f)
+ temp_face_centroids.append(centroid)
+ cuts_faces_centroids[idx] = temp_face_centroids
+
+ print(f"Detected faces: {list(cuts_faces_centroids.values()).__len__()}")
+ tol = sc.doc.ModelAbsoluteTolerance
+
+ breps = [i_brep]
+ for b in breps:
+ for f in b.Faces:
+ centroid_2test = DFFace.compute_mass_center(f)
+ all_faces_centroids.append(centroid_2test)
+
+ for idx, centroids in cuts_faces_centroids.items():
+ for centroid in centroids:
+ if centroid_2test.DistanceTo(centroid) < tol:
+ df_vertices = []
+ face_loop = f.OuterLoop
+ face_loop_trims = face_loop.Trims
+ for face_loop_trim in face_loop_trims:
+ df_vertices.append(DFVertex.from_rg_point3d(face_loop_trim.PointAtStart))
+ df_faces.append(DFFace(df_vertices, idx))
+ detected_facesjoint_centroids.append(centroid_2test)
+ break
+ else:
+ df_vertices = []
+ face_loop = f.OuterLoop
+ face_loop_trims = face_loop.Trims
+ for face_loop_trim in face_loop_trims:
+ df_vertices.append(DFVertex.from_rg_point3d(face_loop_trim.PointAtStart))
+ df_faces.append(DFFace(df_vertices))
+ side_faces_centroids.append(centroid_2test)
o_brep = cuts_b
+
+ o_centroids1 = side_faces_centroids
+ o_centroids2 = detected_facesjoint_centroids
+
+ # beams
+ beam = DFBeam("Beam1", df_faces)
##################################################################
# """
From 096cadf512dd5ba485e65cb3bec3a1fa2bd26443 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Mon, 8 Apr 2024 23:15:21 +0200
Subject: [PATCH 025/141] CAP: proper first draft of joint detector
---
src/gh/diffCheck/diffCheck/df_cut.py | 130 ----
src/gh/diffCheck/diffCheck/df_geometries.py | 23 +-
src/gh/diffCheck/diffCheck/df_hole.py | 241 -------
.../diffCheck/diffCheck/df_joint_detector.py | 265 +++++---
src/gh/diffCheck/diffCheck/diffCheck_app.py | 138 +---
src/gh/tester.ghx | 635 ++++++++++++++++--
6 files changed, 767 insertions(+), 665 deletions(-)
delete mode 100644 src/gh/diffCheck/diffCheck/df_cut.py
delete mode 100644 src/gh/diffCheck/diffCheck/df_hole.py
diff --git a/src/gh/diffCheck/diffCheck/df_cut.py b/src/gh/diffCheck/diffCheck/df_cut.py
deleted file mode 100644
index a1793266..00000000
--- a/src/gh/diffCheck/diffCheck/df_cut.py
+++ /dev/null
@@ -1,130 +0,0 @@
-import Rhino as rc
-import Rhino.Geometry as rg
-import rhinoscriptsyntax as rs
-import scriptcontext as sc
-
-import log
-import util
-import acim
-import visual_debug as vd
-
-import random
-
-def parse_data_from_brep(ACIM,
- p_GUID,
- cut_b,
- bbox_b):
- """
- Parse data from a brep defining a cut
- :param ACIM: the ACIM object to export xml
- :param p_GUID: the guid of the timber
- :param box_b: the brep defining the cut
- :param bbox_b: the brep of the bounding box
- """
- log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
- log.info("Parsing cut data..")
- bbox_faces_b = util.explode_brep(bbox_b)
- cut_faces_b = util.explode_brep(cut_b)
- log.info("Cut faces: " + str(len(cut_faces_b)))
-
- acim_faces = []
- acim_edges = []
- # template dicts for faces and lines
- acim_face_dict = {"face_id" : "1", # the id of the face
- "exposed" : "True", # if the face is exposed
- "edges" : "1 2 3", # the ids of the lines
- "corners" : ["0 0 0", "1 1 1", "2 2 2"] # the coordinates of the corners
- }
- acim_edge_dict = {"line_id" : "1", # the id of the line
- "start" : "0 0 0", # the start point of the line
- "end" : "1 1 1", # the end point of the line
- "exposed" : "true", # if the line is exposed
- }
-
- # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- log.info("Detecting cut centroid..")
- cut_centroid = cut_b.GetBoundingBox(True).Center
- cut_centroid_str = str(cut_centroid.X) + " " + str(cut_centroid.Y) + " " + str(cut_centroid.Z)
-
- # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- log.info("Parsing lines..")
- clr_edge = (0,0,0)
- face_edges = cut_b.Edges
- is_on_face = False
- TEMP_line_ids = []
- TEMP_line_midpoints = []
- for i, face_edge in enumerate(face_edges):
- acim_edge_dict["line_id"] = str(i)
- acim_edge_dict["start"] = str(face_edge.PointAtStart.X) + " " + str(face_edge.PointAtStart.Y) + " " + str(face_edge.PointAtStart.Z)
- acim_edge_dict["end"] = str(face_edge.PointAtEnd.X) + " " + str(face_edge.PointAtEnd.Y) + " " + str(face_edge.PointAtEnd.Z)
-
- face_edge_center = face_edge.PointAtNormalizedLength(0.5)
- if bbox_b.IsPointInside(face_edge_center, sc.doc.ModelAbsoluteTolerance, True):
- is_on_face = False
- clr_edge = (0,255,0)
- else:
- is_on_face = True
- clr_edge = (255,0,0)
- acim_edge_dict["exposed"] = str(is_on_face)
-
- acim_edges.append(acim_edge_dict.copy())
-
- vd.addPtName(face_edge.PointAtStart, str(i), clr_edge)
- vd.addLine(rg.Line(face_edge.PointAtStart, face_edge.PointAtEnd), clr_edge)
-
- TEMP_line_ids.append(i)
- TEMP_line_midpoints.append(face_edge_center)
-
- # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- log.info("Parsing faces..")
- clr_face = (0,0,0)
- for i, face in enumerate(cut_faces_b):
- edges_candidate_ids = []
- acim_face_dict["face_id"] = str(i)
-
- face_edges = face.Edges
- is_on_face = False
-
- # corners
- corners = util.compute_ordered_vertices(face)
- corners_str = []
- for corner in corners:
- corners_str.append(str(corner.X) + " " + str(corner.Y) + " " + str(corner.Z))
- acim_face_dict["corners"] = corners_str
-
- # edges indices
- for i, face_edge in enumerate(face_edges):
- face_edge_center = face_edge.PointAtNormalizedLength(0.5)
- idx = util.detect_idx_pt_in_list(face_edge_center, TEMP_line_midpoints)
- if idx != -1:
- edges_candidate_ids.append(TEMP_line_ids[idx])
- vertex = face_edge.PointAtStart
- acim_face_dict["edges"] = " ".join(str(x) for x in edges_candidate_ids)
-
- # face exposed value
- polyline_corners = corners
- polyline_corners.append(corners[0])
- polyline = rg.Polyline(corners)
- # vd.addPolyline(polyline, (0,0,0))
- face_center = polyline.CenterPoint()
- # log.info("Face center: " + str(face_center))
- # vd.addBrep(bbox_b, (0,0,0))
- if bbox_b.IsPointInside(face_center, sc.doc.ModelAbsoluteTolerance, True):
- is_on_face = False
- clr_face = (0,255,0)
- else:
- is_on_face = True
- clr_face = (255,0,0)
- vd.addPtName(face_center, acim_face_dict["edges"], clr_face)
- acim_face_dict["exposed"] = str(is_on_face)
-
- acim_faces.append(acim_face_dict.copy())
-
- # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- log.info("Dumping cut in acim..")
- ACIM.add_cut(
- p_GUID,
- cut_centroid_str,
- acim_edges,
- acim_faces
- )
diff --git a/src/gh/diffCheck/diffCheck/df_geometries.py b/src/gh/diffCheck/diffCheck/df_geometries.py
index 17889de5..911733ad 100644
--- a/src/gh/diffCheck/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/diffCheck/df_geometries.py
@@ -10,6 +10,8 @@
import xml.etree.ElementTree as ET
from xml.dom.minidom import parseString
+from df_joint_detector import JointDetector
+
@dataclass
class DFVertex:
@@ -85,11 +87,6 @@ class DFBeam:
faces : typing.List[DFFace]
def __post_init__(self):
self.name = self.name or "Unnamed Beam"
-
- try:
- self.faces = list(self.faces)
- except TypeError:
- raise ValueError("Faces must be of type List[Face]")
self.faces = self.faces or []
self.__id = uuid.uuid4().int
@@ -97,21 +94,9 @@ def __post_init__(self):
@classmethod
def from_brep(cls, brep):
"""
- Create a Beam from a RhinoBrep object
+ Create a DFBeam from a RhinoBrep object
"""
- faces : typing.List[DFFace] = []
- brep_faces = brep.Faces
- for brep_face in brep_faces:
- vertices = []
- face_loop = brep_face.OuterLoop
- face_loop_trims = face_loop.Trims
- vertices : typing.List[DFVertex] = []
- for face_loop_trim in face_loop_trims:
- vertices.append(DFVertex(
- face_loop_trim.Edge.PointAtStart.X,
- face_loop_trim.Edge.PointAtStart.Y,
- face_loop_trim.Edge.PointAtStart.Z))
- faces.append(DFFace(vertices))
+ faces = JointDetector(brep).run()
beam = cls("Beam", faces)
return beam
diff --git a/src/gh/diffCheck/diffCheck/df_hole.py b/src/gh/diffCheck/diffCheck/df_hole.py
deleted file mode 100644
index 95f9adc5..00000000
--- a/src/gh/diffCheck/diffCheck/df_hole.py
+++ /dev/null
@@ -1,241 +0,0 @@
-import Rhino as rc
-import Rhino.Geometry as rg
-import rhinoscriptsyntax as rs
-import scriptcontext as sc
-import random
-
-import log
-import acim
-import visual_debug as vd
-import util
-
-
-def _get_radius_from_curved_brep_faces(cylinder_faces_b, start_pt, end_pt):
- for face in cylinder_faces_b:
- if not face.Faces[0].IsPlanar():
- face_curves = face.DuplicateEdgeCurves(True)
- face_crv = face_curves[0]
- pt_base = face_crv.PointAtStart
- axis_ln = rg.Line(start_pt, end_pt)
- radius = axis_ln.DistanceTo(pt_base, False)
- radius = round(radius, 3)
- log.info("radius: " + str(radius))
- return round(radius, 3)
-
-def _get_single_face_brep_center(brep):
- bbox = brep.GetBoundingBox(True)
- bbox_b = bbox.ToBrep()
- center_point = bbox_b.GetBoundingBox(True).Center
- return center_point
-
-def parse_data_from_brep(ACIM,
- p_GUID,
- cylinder_b,
- bbox_b):
- """
- Parse data from a brep defining a hole
- :param ACIM: the ACIM object to export xml
- :param p_GUID: the guid of the timber
- :param cylinder_b: the brep defining the hole
- :param bbox_b: the brep of the bounding box
- """
- log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
- bbox_faces_b = util.explode_brep(bbox_b)
- cylinder_faces_b = util.explode_brep(cylinder_b)
- log.info("cylinder faces: " + str(len(cylinder_faces_b)))
- # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- # get the centers of the cylinder's bases and if they are exposed
- acim_centers = {}
- for face in cylinder_faces_b:
- if face.Faces[0].IsPlanar():
- continue
- face_curves = face.DuplicateEdgeCurves(True)
- for face_crv in face_curves:
- face_crv_center = util.get_crv_circle_center(face_crv)
- is_on_face = False
- if bbox_b.IsPointInside(face_crv_center, sc.doc.ModelAbsoluteTolerance, True):
- if util.is_pt_unique_in_dict(face_crv_center, acim_centers):
- acim_centers[face_crv_center] = is_on_face
- vd.addPt(face_crv_center, (0,255,0))
- continue
- if rs.IsPointOnSurface(face, face_crv_center):
- is_on_face = True
- if util.is_pt_unique_in_dict(face_crv_center, acim_centers):
- acim_centers[face_crv_center] = is_on_face
- vd.addPt(face_crv_center, (255,0,0))
- log.info("length of acim_centers: " + str(len(acim_centers)))
-
- # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- # parse simple holes or sub-holes
- centers_len = len(acim_centers)
- if centers_len == 0:
- log.error("No center found for the hole. Exiting...")
- return
- if centers_len == 1:
- log.info("Single center found for the hole. Exiting...")
- return
- if centers_len == 2:
- log.info("Simple 2-points hole detected")
- start_pt = rg.Point3d(0,0,0)
- end_pt = rg.Point3d(0,0,0)
- is_start_pt_accessible = False
- is_end_pt_accessible = False
- if acim_centers.values()[0]:
- start_pt = acim_centers.keys()[0]
- end_pt = acim_centers.keys()[1]
- is_start_pt_accessible = acim_centers.values()[0]
- is_end_pt_accessible = acim_centers.values()[1]
- else:
- start_pt = acim_centers.keys()[1]
- end_pt = acim_centers.keys()[0]
- is_start_pt_accessible = acim_centers.values()[1]
- is_end_pt_accessible = acim_centers.values()[0]
-
- radius = _get_radius_from_curved_brep_faces(cylinder_faces_b, start_pt, end_pt)
- log.info("radius: " + str(radius))
- vd.addLine(rg.Line(start_pt, end_pt), (255,165,0))
- vd.addDotPt(ptA=start_pt, ptB=end_pt, clr=(0,255,0), txt=str(ACIM.peek_current_hole_id(p_GUID)))
-
- for face in cylinder_faces_b:
- if not face.Faces[0].IsPlanar():
- face_curves = face.DuplicateEdgeCurves(True)
- vd.addCurve(face_curves[0], (255,0,255))
- vd.addCurve(face_curves[1], (255,0,255))
-
- ACIM.add_hole(p_GUID,
- start_pt,
- end_pt,
- is_start_pt_accessible,
- is_end_pt_accessible,
- radius)
- if centers_len > 2:
- log.info("Complex hole detected")
- holes = []
-
- # get longest line
- dists = []
- extreme_pts = []
- for i in range(0, centers_len):
- for j in range(i+1, centers_len):
- pt1 = acim_centers.keys()[i]
- pt2 = acim_centers.keys()[j]
- dist = pt1.DistanceTo(pt2)
- dists.append(dist)
- if dist >= max(dists) or len(dists) == 0:
- extreme_pts = [i, j]
-
- extreme_pts = [acim_centers.keys()[extreme_pts[0]],
- acim_centers.keys()[extreme_pts[1]]]
- longest_ln = rg.Line(extreme_pts[0], extreme_pts[1])
- longest_crv = longest_ln.ToNurbsCurve()
-
- centers_lst_reorder = list(acim_centers.keys())
- centers_lst_reorder.sort(key=lambda x: extreme_pts[0].DistanceTo(x))
-
- #create segments
- hole_axis_ln = []
- for i in range(0, centers_len-1):
- pt1 = centers_lst_reorder[i]
- pt2 = centers_lst_reorder[i+1]
- ln = rg.Line(pt1, pt2)
- hole_axis_ln.append(ln)
-
- # detect neighbours
- neighbor_lst = []
- for i in range(0, len(hole_axis_ln)):
- for j in range(0, len(hole_axis_ln)):
- if i == j:
- continue
- if hole_axis_ln[i].DistanceTo(hole_axis_ln[j].From, False) < 0.01:
- neighbor_lst.append([i, j])
- break
- if hole_axis_ln[i].DistanceTo(hole_axis_ln[j].To, False) < 0.01:
- neighbor_lst.append([i, j])
- break
- log.info("neighbor pattern for current hole set: " + str(neighbor_lst))
- next_hole_ids = []
- current_hole_id = ACIM.peek_current_hole_id(p_GUID)
- for i in range(1, len(neighbor_lst)+1):
- next_hole_ids.append(current_hole_id)
- current_hole_id += 1
- log.info("next hole ids: " + str(next_hole_ids))
- neighbor_acim_str = []
- for i in range(0, len(neighbor_lst)):
- temp_str = ""
- for j in range(1, len(neighbor_lst[i])):
- temp_str += str(next_hole_ids[neighbor_lst[i][j]]) + " "
- temp_str = temp_str[:-1]
- neighbor_acim_str.append(temp_str)
- log.info("neighbor acim str: " + str(neighbor_acim_str))
-
- for i, axis_ln in enumerate(hole_axis_ln):
- vd.addLine(axis_ln, (255,165,0))
- vd.addDotLn(ln=axis_ln, clr=(30,255,230), txt=str(ACIM.peek_current_hole_id(p_GUID)))
-
- start_pt = rg.Point3d(0,0,0)
- end_pt = rg.Point3d(0,0,0)
- is_start_pt_accessible = False
- is_end_pt_accessible = False
- pt_1 = axis_ln.PointAt(0)
- pt_2 = axis_ln.PointAt(1)
- if acim_centers[pt_1]:
- start_pt = pt_1
- end_pt = pt_2
- is_start_pt_accessible = acim_centers[pt_1]
- is_end_pt_accessible = acim_centers[pt_2]
- else:
- start_pt = pt_2
- end_pt = pt_1
- is_start_pt_accessible = acim_centers[pt_2]
- is_end_pt_accessible = acim_centers[pt_1]
-
- for face in cylinder_faces_b:
- if not face.Faces[0].IsPlanar():
- radius = 0
- face_curves = face.DuplicateEdgeCurves(True)
- face_center_A = util.get_crv_circle_center(face_curves[0])
- face_center_B = util.get_crv_circle_center(face_curves[1])
-
- vd.addCurve(face_curves[0], (255,0,255))
- vd.addCurve(face_curves[1], (255,0,255))
-
- f_0X = round(face_center_A.X, 3)
- f_0Y = round(face_center_A.Y, 3)
- f_0Z = round(face_center_A.Z, 3)
-
- f_1X = round(face_center_B.X, 3)
- f_1Y = round(face_center_B.Y, 3)
- f_1Z = round(face_center_B.Z, 3)
-
- sX = round(start_pt.X, 3)
- sY = round(start_pt.Y, 3)
- sZ = round(start_pt.Z, 3)
-
- eX = round(end_pt.X, 3)
- eY = round(end_pt.Y, 3)
- eZ = round(end_pt.Z, 3)
-
- if (f_0X == sX and f_0Y == sY and f_0Z == sZ) or (f_0X == eX and f_0Y == eY and f_0Z == eZ): # = start
- if (f_1X == sX and f_1Y == sY and f_1Z == sZ) or (f_1X == eX and f_1Y == eY and f_1Z == eZ): # = end
- ellipse_pt = face_curves[0].PointAtStart
- radius = axis_ln.DistanceTo(ellipse_pt, False)
- radius = round(radius, 3)
- log.info("radius: " + str(radius))
- break
-
- ACIM.add_hole(p_GUID,
- start_pt,
- end_pt,
- is_start_pt_accessible,
- is_end_pt_accessible,
- radius,
- neighbours=neighbor_acim_str[i])
-
-
-
-
-
-
-
-
-
diff --git a/src/gh/diffCheck/diffCheck/df_joint_detector.py b/src/gh/diffCheck/diffCheck/df_joint_detector.py
index 64c2c0a0..6c9db99c 100644
--- a/src/gh/diffCheck/diffCheck/df_joint_detector.py
+++ b/src/gh/diffCheck/diffCheck/df_joint_detector.py
@@ -3,106 +3,189 @@
import Rhino.Geometry as rg
import typing
+from dataclasses import dataclass
import df_util
+import df_transformations
+from df_geometries import DFVertex, DFFace
-def distinguish_holes_cuts(breps) -> typing.Tuple[typing.List[Rhino.Geometry.Brep], typing.List[Rhino.Geometry.Brep]]:
- """
- Analyse the result breps from the boolean difference operation
- and distinguish between holes and cuts
- :param breps: list of breps
- :return: holes and cuts breps
+@dataclass
+class JointDetector():
"""
- is_hole = False
- is_cut = False
- is_tenon_mortise = False
- is_mix = False
- holes_b = []
- cuts_b = []
- mix_b = []
-
- # parse holes, cuts and mix
- for b in breps:
- is_cut = True
- for f in b.Faces:
- f_brep = f.ToBrep()
- f = f_brep.Faces[0]
- if not f.IsPlanar():
- is_cut = False
- is_hole = True
-
- b_faces = df_util.explode_brep(b)
- for b_face in b_faces:
- if b_face.Faces[0].IsPlanar():
- b_face_edges = b_face.Edges
- for b_face_edge in b_face_edges:
- if not b_face_edge.IsClosed:
- is_mix = True
- is_hole = False
- break
- if is_mix:
- break
- break
+ This class is responsible for detecting joints in a brep
+ """
+ brep : Rhino.Geometry.Brep
+ def __post_init__(self):
+ self.brep = self.brep or None
+ # list of straight cuts
+ self._cuts : typing.List[rg.Brep] = []
+ # list of holes
+ self._holes : typing.List[rg.Brep] = []
+ # list of mixed joints (cuts+holes)
+ self._mix : typing.List[rg.Brep]= []
+
+ # list of DFFaces from joints and sides
+ self._faces : typing.List[DFFace] = []
+
+ def run(self) -> typing.List[DFFace]:
+ """
+ Run the joint detector
+
+ :return: a list of faces from joins and faces
+ """
+ ############################################################################
+ # 1. Bring to XY, mamke AABB and get negative boolean difference
+ ############################################################################
+ # bring to plane xy
+ x_form = df_transformations.pln_2_pln_world_transform(self.brep)
+
+ # reverse the transformation
+ x_form_back = df_transformations.get_inverse_transformation(x_form)
- if is_hole:
- holes_b.append(b)
- elif is_cut:
- cuts_b.append(b)
- elif is_mix:
- mix_b.append(b)
+ # compute the bounding box and inflate to include butt joints typo
+ bbox = self.brep.GetBoundingBox(True)
+ diagonal = bbox.Diagonal
+ scaling_factor = diagonal.Length / 10
+ bbox.Inflate(scaling_factor, 0, 0)
+ bbox_b = bbox.ToBrep()
+ # boolean difference between the bounding box and the brep transformed
+ breps_from_booldiff = Rhino.Geometry.Brep.CreateBooleanDifference(
+ bbox_b, self.brep, sc.doc.ModelAbsoluteTolerance)
+ if breps_from_booldiff is None or len(breps_from_booldiff) == 0:
+ ghenv.Component.AddRuntimeMessage(RML.Error, "No breps found after boolean difference.")
+
+ ############################################################################
+ # 2. Distinguish holes, cuts, and mix boolean difference results
+ ############################################################################
is_hole = False
is_cut = False
+ is_tenon_mortise = False
is_mix = False
+
+ # parse holes, cuts and mix
+ for b in breps_from_booldiff:
+ is_cut = True
+ for f in b.Faces:
+ f_brep = f.ToBrep()
+ f = f_brep.Faces[0]
+ if not f.IsPlanar():
+ is_cut = False
+ is_hole = True
+
+ b_faces = df_util.explode_brep(b)
+ for b_face in b_faces:
+ if b_face.Faces[0].IsPlanar():
+ b_face_edges = b_face.Edges
+ for b_face_edge in b_face_edges:
+ if not b_face_edge.IsClosed:
+ is_mix = True
+ is_hole = False
+ break
+ if is_mix:
+ break
+ break
+
+ if is_hole:
+ self._holes.append(b)
+ elif is_cut:
+ self._cuts.append(b)
+ elif is_mix:
+ self._mix.append(b)
+
+ is_hole = False
+ is_cut = False
+ is_mix = False
+
+ # deal with mix
+ candidate_cuts = []
+ candidate_holes = []
+ for b in self._mix:
+ # -- algorithm draft --
+ # (1) explode
+ # (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
+ # (3) cap each object in both lists
+ # (4) boolunion every object in both lists
+ # (5) check if closed, if it is
+ # ----------------------
+ # (1) explode
+ faces_b = df_util.explode_brep(b)
+
+ # (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
+ flat_faces_b = []
+ non_flat_faces_b = []
+ for f_b in faces_b:
+ if f_b.Faces[0].IsPlanar():
+ flat_faces_b.append(f_b)
+ else:
+ non_flat_faces_b.append(f_b)
- # deal with mix
- candidate_cuts = []
- candidate_holes = []
- for b in mix_b:
- # -- algorithm draft --
- # (1) explode
- # (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
- # (3) cap each object in both lists
- # (4) boolunion every object in both lists
- # (5) check if closed, if it is
- # ----------------------
- # (1) explode
- faces_b = df_util.explode_brep(b)
-
- # (2) seperate in tow list flat surfaces (cuts + cylinder's bases) and non flat surfaces (cylinders)
- flat_faces_b = []
- non_flat_faces_b = []
- for f_b in faces_b:
- if f_b.Faces[0].IsPlanar():
- flat_faces_b.append(f_b)
+ # (*) cap the cylinders
+ non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
+
+ # (4) boolunion every object in both lists
+ flat_faces_b = Rhino.Geometry.Brep.CreateBooleanUnion(flat_faces_b, sc.doc.ModelAbsoluteTolerance)
+ non_flat_faces_b = Rhino.Geometry.Brep.CreateBooleanUnion(non_flat_faces_b, sc.doc.ModelAbsoluteTolerance)
+
+ # (3) cap candidate cuts
+ flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in flat_faces_b]
+ # non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
+
+ # (*) merge all coplanar faces in breps cut candidates
+ for f_b in flat_faces_b:
+ if f_b is not None:
+ f_b.MergeCoplanarFaces(sc.doc.ModelAbsoluteTolerance)
+
+ # (5) check if closed, if it is add to cuts, if not add to holes
+ for f_b in flat_faces_b:
+ if f_b is not None:
+ if f_b.IsSolid:
+ self._cuts.append(f_b)
+ for f_b in non_flat_faces_b:
+ if f_b is not None:
+ if f_b.IsSolid:
+ self._holes.append(f_b)
+
+ ############################################################################
+ # 3. Sort faces from joints and faces from sides
+ ############################################################################
+ # retransform back everything
+ for b in self._holes:
+ b.Transform(x_form_back)
+ for b in self._cuts:
+ b.Transform(x_form_back)
+ self.brep.Transform(x_form_back)
+
+ cuts_faces_centroids : typing.Dict[int, typing.List[rg.Point3d]] = {}
+
+ # get all the medians of the faces of cuts
+ for idx, b in enumerate(self._cuts):
+ temp_face_centroids = []
+ for f in b.Faces:
+ centroid = DFFace.compute_mass_center(f)
+ temp_face_centroids.append(centroid)
+ cuts_faces_centroids[idx] = temp_face_centroids
+
+ # compare with the brep medians faces to get the joint/sides's faces
+ for f in self.brep.Faces:
+ centroid_2test = DFFace.compute_mass_center(f)
+ for idx, centroids in cuts_faces_centroids.items():
+ for centroid in centroids:
+ if centroid_2test.DistanceTo(centroid) < sc.doc.ModelAbsoluteTolerance:
+ df_vertices = []
+ face_loop = f.OuterLoop
+ face_loop_trims = face_loop.Trims
+ for face_loop_trim in face_loop_trims:
+ df_vertices.append(DFVertex.from_rg_point3d(face_loop_trim.PointAtStart))
+ self._faces.append(DFFace(df_vertices, idx))
+ break
else:
- non_flat_faces_b.append(f_b)
-
- # (*) cap the cylinders
- non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
-
- # (4) boolunion every object in both lists
- flat_faces_b = Rhino.Geometry.Brep.CreateBooleanUnion(flat_faces_b, sc.doc.ModelAbsoluteTolerance)
- non_flat_faces_b = Rhino.Geometry.Brep.CreateBooleanUnion(non_flat_faces_b, sc.doc.ModelAbsoluteTolerance)
-
- # (3) cap candidate cuts
- flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in flat_faces_b]
- # non_flat_faces_b = [f_b.CapPlanarHoles(sc.doc.ModelAbsoluteTolerance) for f_b in non_flat_faces_b]
-
- # (*) merge all coplanar faces in breps cut candidates
- for f_b in flat_faces_b:
- if f_b is not None:
- f_b.MergeCoplanarFaces(sc.doc.ModelAbsoluteTolerance)
-
- # (5) check if closed, if it is add to cuts, if not add to holes
- for f_b in flat_faces_b:
- if f_b is not None:
- if f_b.IsSolid:
- cuts_b.append(f_b)
- for f_b in non_flat_faces_b:
- if f_b is not None:
- if f_b.IsSolid:
- holes_b.append(f_b)
-
- return holes_b, cuts_b
+ df_vertices = []
+ face_loop = f.OuterLoop
+ face_loop_trims = face_loop.Trims
+ for face_loop_trim in face_loop_trims:
+ df_vertices.append(DFVertex.from_rg_point3d(face_loop_trim.PointAtStart))
+ self._faces.append(DFFace(df_vertices))
+
+ return self._faces
diff --git a/src/gh/diffCheck/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck/diffCheck_app.py
index ba728213..59fc8a0e 100644
--- a/src/gh/diffCheck/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck/diffCheck_app.py
@@ -11,122 +11,28 @@
import df_joint_detector # diffCheck.
import df_util # diffCheck.
+from Grasshopper.Kernel import GH_RuntimeMessageLevel as RML
if __name__ == "__main__":
-
- print("Running diffCheck...")
- x_form = df_transformations.pln_2_pln_world_transform(i_brep)
-
- # reverse the transformation
- x_form_back = df_transformations.get_inverse_transformation(x_form)
-
- # i_brep.Transform(x_form_back)
- # o_brep = i_brep
-
-
- # compute the bounding box and inflate to include butt joints typo
- bbox = i_brep.GetBoundingBox(True)
- diagonal = bbox.Diagonal
- scaling_factor = diagonal.Length / 10
- bbox.Inflate(
- scaling_factor, 0, 0
- )
- bbox_b = bbox.ToBrep()
-
- print("Bounding box computed...")
- # boolean difference between the bounding box and the brep transformed
- brep_result = Rhino.Geometry.Brep.CreateBooleanDifference(bbox_b, i_brep, sc.doc.ModelAbsoluteTolerance)
- if brep_result is None or len(brep_result) == 0:
- print("No breps found after boolean difference. Exiting...")
- # return
-
- ##################################################################
- ##################################################################
- # distinguish holes and cuts
- holes_b, cuts_b = df_joint_detector.distinguish_holes_cuts(brep_result)
-
- # retransform back everything
- for b in holes_b:
- b.Transform(x_form_back)
- for b in cuts_b:
- b.Transform(x_form_back)
- i_brep.Transform(x_form_back)
-
- # parse into DFFaces with detection of
- # - wether it is a joint (bool)
- # - if it is a hole, which one is (id)
-
- df_faces = []
- all_faces_centroids : typing.List[rg.Point3d] = []
- cuts_faces_centroids : typing.Dict[int, typing.List[rg.Point3d]] = {}
- detected_facesjoint_centroids : typing.List[rg.Point3d] = []
- side_faces_centroids : typing.List[rg.Point3d] = []
-
- # get all the medians of the faces of cuts_b
- for idx, b in enumerate(cuts_b):
- temp_face_centroids = []
- for f in b.Faces:
- centroid = DFFace.compute_mass_center(f)
- temp_face_centroids.append(centroid)
- cuts_faces_centroids[idx] = temp_face_centroids
-
- print(f"Detected faces: {list(cuts_faces_centroids.values()).__len__()}")
- tol = sc.doc.ModelAbsoluteTolerance
-
- breps = [i_brep]
- for b in breps:
- for f in b.Faces:
- centroid_2test = DFFace.compute_mass_center(f)
- all_faces_centroids.append(centroid_2test)
-
- for idx, centroids in cuts_faces_centroids.items():
- for centroid in centroids:
- if centroid_2test.DistanceTo(centroid) < tol:
- df_vertices = []
- face_loop = f.OuterLoop
- face_loop_trims = face_loop.Trims
- for face_loop_trim in face_loop_trims:
- df_vertices.append(DFVertex.from_rg_point3d(face_loop_trim.PointAtStart))
- df_faces.append(DFFace(df_vertices, idx))
- detected_facesjoint_centroids.append(centroid_2test)
- break
- else:
- df_vertices = []
- face_loop = f.OuterLoop
- face_loop_trims = face_loop.Trims
- for face_loop_trim in face_loop_trims:
- df_vertices.append(DFVertex.from_rg_point3d(face_loop_trim.PointAtStart))
- df_faces.append(DFFace(df_vertices))
- side_faces_centroids.append(centroid_2test)
-
- o_brep = cuts_b
-
- o_centroids1 = side_faces_centroids
- o_centroids2 = detected_facesjoint_centroids
-
+ """
+ Main function to test the package
+ :param i_breps: list of breps
+ :param i_export_dir: directory to export the xml
+ :param i_dump: whether to dump the xml
+ """
# beams
- beam = DFBeam("Beam1", df_faces)
- ##################################################################
-
- # """
- # Main function to test the package
- # :param i_breps: list of breps
- # :param i_export_dir: directory to export the xml
- # :param i_dump: whether to dump the xml
- # """
- # # beams
- # beams : typing.List[DFBeam] = []
- # for brep in i_breps:
- # beam = DFBeam.from_brep(brep)
- # beams.append(beam)
-
- # # assembly
- # assembly1 = DFAssembly(beams, "Assembly1")
- # print(assembly1.beams)
- # print(assembly1)
-
- # # dump the xml
- # xml : str = assembly1.to_xml()
- # if i_dump:
- # assembly1.dump(xml, i_export_dir)
- # o_xml = xml
\ No newline at end of file
+ beams : typing.List[DFBeam] = []
+ for brep in i_breps:
+ beam = DFBeam.from_brep(brep)
+ beams.append(beam)
+
+ # assembly
+ assembly1 = DFAssembly(beams, "Assembly1")
+ print(assembly1.beams)
+ print(assembly1)
+
+ # dump the xml
+ xml : str = assembly1.to_xml()
+ if i_dump:
+ assembly1.dump(xml, i_export_dir)
+ o_xml = xml
\ No newline at end of file
diff --git a/src/gh/tester.ghx b/src/gh/tester.ghx
index 0de0df29..a5ca3f80 100644
--- a/src/gh/tester.ghx
+++ b/src/gh/tester.ghx
@@ -49,10 +49,10 @@
-
- -192
- -8
+ 198
+ 30
- - 1.7647058
+ - 0.7830095
@@ -99,9 +99,9 @@
- - 12
+ - 18
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
@@ -132,27 +132,29 @@
-
- 213
- 133
- 115
- 44
+ 178
+ 109
+ 138
+ 84
-
- 267
- 155
+ 258
+ 151
-
- - 2
+
+ - 4
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
- 2
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
@@ -175,14 +177,14 @@
-
- 215
- 135
- 37
+ 180
+ 111
+ 63
20
-
- 235
- 145
+ 213
+ 121
@@ -190,16 +192,52 @@
+ - true
+ - Converts to collection of text fragments
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAO8SURBVEhL1VVLLJxhFB3ERMT7zXgb71e8X/GId2IhQZTuJGwktjaNxqpYNAQbsWBHiDRsbNgIC4lWYiUs7LSVtLqY6UNNTu+58/9Caaurpie5md/85px7z733+yz/CnYPD4/P8om/iCcSj4OPj8/r+fl57O3tYWdnB9vb29jc3MTa2hoWFxcxMTGB/v5+tLW1oaqqCqmpqZCE3spPrW6G38DLy6tdfvh9YWEBZWVlGqWlpSguLkZhYSHy8/ORk5ODjIwMJU5KSkJWVhb8/Pwcnp6ezwyaX8IaGBj4YWlpCZ2dnZodo7KyEu3t7TBxcnKipGlpaUhJSdFITk6GCDiFw+amegDe3t4v+vr6rkdHR1FdXY3a2loNPs/NzcHlchkSQHNzM9LT05U8MTFRK5HkvolVrwy6e7BHRUV9nZ6eRkNDgxLX19dr8Pns7AwrKysGPTA5Oak22e12FYiLi0NsbCx7wSqK3JS3IN7vdHR0oLe3V225LTAwMIDj4+M7Nh0dHd0RIHl0dDSCg4NdIvLGoL1BW1hY2Jfu7m5tKj2/bdHy8jKmpqa02aenp4YEUFdXd2MRBcQBxMfHQ6bQIZxP3dTSWMn+XXl5ORicFlOElVDo4uICLS0t+m52dtagB8bGxlQgISEBNpsNkZGRKkJBqeKjcPtZpPPPQ0NDv5CcI8hRJBGzpdDQ0JDugjmmXV1dBj1wcHCgzaX/MTExiIiIQEhIiIrKMxf1pUWUPmVmZupsMyhSUFCAoqIijY2NDQwPD+t35g6cn58bEtBKTf/Dw8PZAxXKy8vjdn+iwEsZL2dubi5MIT6TjBU4HA6D6mGMjIxo9rRHnEBQUJDySFXuCugT/WKpnAoGlyg7O1szX11d1Wd+x3dcrp6eHoMe2N/fV9+ZPe1hJbRX+urugYGnVqvVwR9z/fnJJTo8PMTg4KA+m+/oL0fz8vJSBa6vr7VaM3tWLRZxF26mSMHZpXdceZKMj48rAQX4N4NVmku1u7ur74mZmRklp3BJSYlL6O7tAVHKs4QEXCITTqdTjwmOIonZo/X1dVxdXRn/4cbW1haampoQEBBA7+9vMiFVvBIfvzFbTsbt4JyzmfSYDaXnpi1CqiMsk3MlNL88iwgbq6DfzJbNM4OktNAkZkNl+uDv76/veTdIH39/mhp4JrPs5OTI8XETJinn3Mxa7gD4+vrqeSVVk/yP9wFhFavecywrKipQU1OjBPS3tbVVM+Whx4ORW83zq7Gx8fE3mgHerz/fuX+Kx9/J/xEslh9QdsIn89F0TQAAAABJRU5ErkJggg==
+
+ - e0ef2066-70a4-441f-906b-8a4afddb0692
+ - i_export_dir
+ - i_export_dir
+ - true
+ - 0
+ - true
+ - 77c76654-6be3-4843-b564-afe44705740d
+ - 1
+
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+
+
+
+
+ -
+ 180
+ 131
+ 63
+ 20
+
+ -
+ 213
+ 141
+
+
+
+
+
+
+
+ - 1
- true
- Converts to collection of Breps (Boundary REPresentations)
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPkSURBVEhL1VVbKOV7FN7ITnK/RYNcNrkrx11SbokHuWQyb0ryRN5ocuLBKadELsktHuTywKBcXgiRUiYvJOVSknNw5LK3OWbO9J31/famOWfPGPN0OqtW+7/r9/vWWt/61vpp/ivTWVhY3MsvfsBfi7/MbGxstvr6+rC+vo7V1VUsLi5ifn4eExMTGBoaQnNzM8rLy5GXl4eUlBQEBQVBEjqTq1ojwjNmZWWVLxc/DQ4OIiEhQXl8fDxiY2MRExOD6OhoREREICQkRAH7+/sjLCwMdnZ2ektLy7cmmG+a1tHR8Y/R0VEUFRWp7OjJyclISkrC8PAwHh4ecHNzg4WFBeTm5iIwMFB5QEAAJIBBMF4Zob5i1tbWv5SVlf3V0NCA1NRUpKWlPTmpOjw8RHd3N3p7e7G0tITb21v138/PT1UiyT0IVe9McGam8/T0/LO9vR0ZGRkKND09HZmZmVhbW4Ner0dnZycmJydRUVGBqqoq1NfX4+joSPWHQby9vdkLVvGTEfILE+5XSUtpaamihQEIzkYT/PLyEgy+ubmJ2tpa1eiBgQG0trbi4OAAXV1d8PLygrOz82cJ8t4E+2R5bm5uH0pKSlRTyTkDPGZO8OPjY4yPj2Nubg4rKysKfHp6Wp3hN+li5b6+vhAV6gXzjRFaGivZ/5aYmAg61cKGkvMvwXd2dlT2LS0tODs7U98E39vbw/7+vurJ7OwshGZFl1RxJdh2Gun8z66urh8ITglSiiMjIzAYDGbgBBkbG0NHRwfOz89xcXGhztB6enpwfX0NFxcXpSp3d3cO6q8aiXQdGhqqtE1nEIJfXV2Zgc/MzIASZrMbGxsVVScnJ9jY2FDKYsXSA3h4eCAqKorTfc0ALSIvQ2RkJB4D3d/fq4tfA+/v70dbWxuamppQWVmJ6upq9X93d1cFcXJyUjjSC2MF5Il8UcecTjozOz09fRa8rq5OSZWS3draUvwLLUpJnHzpq7EHJnuj1Wr1wcHBavwLCgpwd3eH5eXlF4OTFmZPFco3Z+FJRcqkivc8xJFnk3iJFfwIuE6nQ1xc3GeBM5sDWjx3CSVGp6qoEMqVqnkOnI2lerKysuDg4EDuzSeZJlW8k4MPrIBjz3K5BqioqakpNcE1NTXY3t7+R+YCquQtyvkoMN/cRbRXrIK98PHxUUNDz87OVhNM+bI3XBlsqKgP9vb26gzfBunj89vUZG+lZEN4eDhkfTy5DKOigXQ8Zi1vAGxtbdVSlKoJ/t33gKYVqn7nI/K4kwhAfnNyclSm+fn5KCwsRHFxMbi/uBTlzsteNJPxff33m/s9f/mb/D8yjeZvU880QlAx2/0AAAAASUVORK5CYII=
- ae8c9c0d-8d6a-4a8c-812a-110846a2031c
- - i_brep
- - i_brep
+ - i_breps
+ - i_breps
- true
- - 0
+ - 1
- true
- 0f309845-29e6-43ae-b255-cdb5c2d13da9
- 1
@@ -210,14 +248,49 @@
-
- 215
- 155
- 37
+ 180
+ 151
+ 63
+ 20
+
+ -
+ 213
+ 161
+
+
+
+
+
+
+
+ - true
+ - Converts to collection of boolean values
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC
+
+ - 1e3c2c63-ede9-4faf-9790-a3d1b9350ba3
+ - i_dump
+ - i_dump
+ - true
+ - 0
+ - true
+ - 254a4a2f-d415-488e-9851-4a763f1ba58f
+ - 1
+
+ - d60527f5-b5af-4ef6-8970-5f96fe412559
+
+
+
+
+ -
+ 180
+ 171
+ 63
20
-
- 235
- 165
+ 213
+ 181
@@ -244,14 +317,14 @@
-
- 282
- 135
- 44
- 20
+ 273
+ 111
+ 41
+ 40
-
- 304
- 145
+ 293.5
+ 131
@@ -265,8 +338,8 @@
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
- a849584f-8d8a-4547-a1a4-36be0bf3ac37
- - o_brep
- - o_brep
+ - o_xml
+ - o_xml
- false
- 0
- true
@@ -278,14 +351,14 @@
-
- 282
- 155
- 44
- 20
+ 273
+ 151
+ 41
+ 40
-
- 304
- 165
+ 293.5
+ 171
@@ -295,7 +368,7 @@
- - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgogICAgICAgICAgICAgICAgIyBwYXJzZSB0aGUgY29kZQogICAgICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKICAgICAgICAgICAgICAgIG91dHB1dCA9IGlvLlN0cmluZ0lPKCkKCiAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBxdWV1ZSBhbmQgZXZlbnQKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5xdWV1ZV9tc2dfbG9jazoKICAgICAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWV1ZV9tc2cuZW1wdHkoKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuZ2V0KCkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAgICAgICAgICMgZXhlY3V0ZSB0aGUgY29kZQogICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnJlZGlyZWN0X3N0ZG91dChvdXRwdXQpOgogICAgICAgICAgICAgICAgICAgIGV4ZWMoY29kZSwgZ2xvYmFscywgbG9jYWxzKQogICAgICAgICAgICAgICAgbG9jYWxzWyJzdGRvdXQiXSA9IG91dHB1dC5nZXR2YWx1ZSgpCgogICAgICAgICAgICAgICAgIyBzZW5kIHRoZSBtc2cgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgICAgIG1zZ19qc29uID0ganNvbi5kdW1wcyh7InNjcmlwdF9wYXRoIjogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWQiOiBzdHIoZ2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2ciOiBvdXRwdXQuZ2V0dmFsdWUoKX0pCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IG1zZ19qc29uLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KG1zZ19qc29uKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQoKICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2NyaXB0IHZhcmlhYmxlcyB0byB0aGUgR0ggY29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgICAgIG91dHBhcmFtID0gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXQKICAgICAgICAgICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgICAgICAgICBmb3Igb3V0cCBpbiBvdXRwYXJhbV9uYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBvdXRwIGluIGxvY2Fscy5rZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuYXBwZW5kKGxvY2Fsc1tvdXRwXSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChOb25lKQoKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXwogICAgICAgICAgICByZXR1cm4gbG9jYWxzCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCiAgICAgICAgICAgICMgc2VuZCB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgICAgICBlcnJfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogImVycjoiICsgc3RyKGUpfSkKICAgICAgICAgICAgZXJyX2pzb24gPSBlcnJfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KGVycl9qc29uKQogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLnNldCgpCiAgICAgICAgICAgIAogICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KCiAgICAgICAgICAgIGVycl9tc2cgPSBmInNjcmlwdC1zeW5jOjpFcnJvciBpbiB0aGUgY29kZToge3N0cihlKX0iCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihlcnJfbXNnKQoKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgYnRuOiBib29sLCBpX2JyZXA6IFJoaW5vLkdlb21ldHJ5LkJyZXApOgogICAgICAgICIiIiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIGl0J3MgdGhlIHNvbHZlIG1haW4gaW5zdGFuY2UuICIiIgoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICAjIHNldCB0aGUgcGF0aCBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIHNlbGYuaW5pdF9zY3JpcHRfcGF0aChidG4pCgogICAgICAgICMgZmlsZSBjaGFuZ2UgbGlzdGVuZXIgdGhyZWFkCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBGaWxlQ2hhbmdlZFRocmVhZChzZWxmLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgc2V0IHVwIHRoZSB0Y3AgY2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICBfID0gW3ByaW50KHQubmFtZSkgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXQogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIENsaWVudFRocmVhZChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cKICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgYWRkIHRvIHRoZSBnbG9iYWxzIGFsbCB0aGUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgY29tcG9uZW50ICh0aGUgbG9jYWxzKQogICAgICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgogICAgICAgIHBhdGhfZGlyID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICBzdWJfZGlycyA9IFtdCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aF9kaXIpOgogICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICAgICAgc3ViX2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihyb290LCBkKSkKICAgICAgICAgICAgICAgIHByaW50KGQpCiAgICAgICAgc3lzLnBhdGguZXh0ZW5kKFtwYXRoX2Rpcl0gKyBzdWJfZGlycykKCiAgICAgICAgIyByZWxvYWQgYWxsIHRoZSBtb2R1bGVzIGFsc28gb2YgdGhlIHN1YiBkaXJlY3RvcmllcwogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGhfZGlyKToKICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgIHNlbGYucmVsb2FkX2FsbF9tb2R1bGVzKG9zLnBhdGguam9pbihyb290LCBkKSkKICAgICAgICBzZWxmLnJlbG9hZF9hbGxfbW9kdWxlcyhwYXRoX2RpcikKCiAgICAgICAgcmVzID0gc2VsZi5zYWZlX2V4ZWMoc2VsZi5wYXRoLCBOb25lLCBnbG9iYWxzKCkpCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gVHJ1ZQogICAgICAgIHJldHVybgoKICAgIGRlZiBBZnRlclJ1blNjcmlwdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGNvbXBvbmVudCBoYXMgZmluaXNoZWQKICAgICAgICAgICAgaXRzIGNhbGN1bGF0aW9uLiBJdCBpcyB1c2VkIHRvIGxvYWQgdGhlIEdIQ29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgd2l0aCB0aGUgdmFsdWVzIGNyZWF0ZWQgaW4gdGhlIHNjcmlwdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5pc19zdWNjZXNzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBvdXRwYXJhbSA9IFtwIGZvciBwIGluIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0XQogICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgCiAgICAgICAgIyBUT0RPOiBhZGQgdGhlIGNvbnZlcnNpb24gdG8gZGF0YXRyZWUgZm9yIG5lc3RlZCBsaXN0cyBhbmQgdHVwbGVzCiAgICAgICAgZm9yIGlkeCwgb3V0cCBpbiBlbnVtZXJhdGUob3V0cGFyYW0pOgogICAgICAgICAgICAjIGRldGVjdCBpZiB0aGUgb3V0cHV0IGlzIGEgbGlzdAogICAgICAgICAgICBpZiB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gbGlzdCBvciB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gdHVwbGU6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YUxpc3QoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGEoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgMCwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuY2xlYXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICB0YWJsZV92YWx1ZSA9IGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuR2V0VmFsdWUoCiAgICAgICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsICJub3RfZm91bmQiCiAgICAgICAgKQogICAgICAgIGlmIHRhYmxlX3ZhbHVlICE9ICJub3RfZm91bmQiOgogICAgICAgICAgICByZXR1cm4gdGFibGVfdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwYXRoLnNldHRlcgogICAgZGVmIHBhdGgoc2VsZiwgcGF0aCA6IHN0cik6CiAgICAgICAgIiIiIFNldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5TZXRWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCBwYXRoKQoKICAgICAgICBzY3JpcHRfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9IGYie3NjcmlwdF9uYW1lfSIKCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIF8gPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdLnN0b3AoKQoKICAgIEBwYXRoLmRlbGV0ZXIKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBEZWxldGUgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyBpZiB0aGUgb2JqZWN0IGlzIGVyYXNlZC4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5EZWxldGVWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlKQo=
+ - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgogICAgICAgICAgICAgICAgIyBwYXJzZSB0aGUgY29kZQogICAgICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKICAgICAgICAgICAgICAgIG91dHB1dCA9IGlvLlN0cmluZ0lPKCkKCiAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBxdWV1ZSBhbmQgZXZlbnQKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5xdWV1ZV9tc2dfbG9jazoKICAgICAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWV1ZV9tc2cuZW1wdHkoKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuZ2V0KCkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAgICAgICAgICMgZXhlY3V0ZSB0aGUgY29kZQogICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnJlZGlyZWN0X3N0ZG91dChvdXRwdXQpOgogICAgICAgICAgICAgICAgICAgIGV4ZWMoY29kZSwgZ2xvYmFscywgbG9jYWxzKQogICAgICAgICAgICAgICAgbG9jYWxzWyJzdGRvdXQiXSA9IG91dHB1dC5nZXR2YWx1ZSgpCgogICAgICAgICAgICAgICAgIyBzZW5kIHRoZSBtc2cgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgICAgIG1zZ19qc29uID0ganNvbi5kdW1wcyh7InNjcmlwdF9wYXRoIjogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWQiOiBzdHIoZ2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2ciOiBvdXRwdXQuZ2V0dmFsdWUoKX0pCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IG1zZ19qc29uLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KG1zZ19qc29uKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQoKICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2NyaXB0IHZhcmlhYmxlcyB0byB0aGUgR0ggY29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgICAgIG91dHBhcmFtID0gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXQKICAgICAgICAgICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgICAgICAgICBmb3Igb3V0cCBpbiBvdXRwYXJhbV9uYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBvdXRwIGluIGxvY2Fscy5rZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuYXBwZW5kKGxvY2Fsc1tvdXRwXSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChOb25lKQoKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXwogICAgICAgICAgICByZXR1cm4gbG9jYWxzCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCiAgICAgICAgICAgICMgc2VuZCB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgICAgICBlcnJfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogImVycjoiICsgc3RyKGUpfSkKICAgICAgICAgICAgZXJyX2pzb24gPSBlcnJfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KGVycl9qc29uKQogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLnNldCgpCiAgICAgICAgICAgIAogICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KCiAgICAgICAgICAgIGVycl9tc2cgPSBmInNjcmlwdC1zeW5jOjpFcnJvciBpbiB0aGUgY29kZToge3N0cihlKX0iCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihlcnJfbXNnKQoKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgYnRuOiBib29sLAogICAgICAgICAgICBpX2V4cG9ydF9kaXI6IHN0ciwKICAgICAgICAgICAgaV9icmVwczogU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3RbUmhpbm8uR2VvbWV0cnkuQnJlcF0sCiAgICAgICAgICAgIGlfZHVtcDogYm9vbCk6CiAgICAgICAgIiIiIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgY29tcG9uZW50IGhhcyB0byBiZSByZWNhbGN1bGF0ZWQgaXQncyB0aGUgc29sdmUgbWFpbiBpbnN0YW5jZS4gIiIiCgogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IEZhbHNlCgogICAgICAgICMgc2V0IHRoZSBwYXRoIGlmIGJ1dHRvbiBpcyBwcmVzc2VkCiAgICAgICAgc2VsZi5pbml0X3NjcmlwdF9wYXRoKGJ0bikKCiAgICAgICAgIyBmaWxlIGNoYW5nZSBsaXN0ZW5lciB0aHJlYWQKICAgICAgICBpZiBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIEZpbGVDaGFuZ2VkVGhyZWFkKHNlbGYucGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnN0YXJ0KCkKCiAgICAgICAgIyBzZXQgdXAgdGhlIHRjcCBjbGllbnQgdG8gY29ubmVjdCB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgIF8gPSBbcHJpbnQodC5uYW1lKSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldCiAgICAgICAgaWYgc2VsZi5jbGllbnRfdGhyZWFkX25hbWUgbm90IGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgQ2xpZW50VGhyZWFkKHNlbGYudnNjb2RlX3NlcnZlcl9pcCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZwogICAgICAgICAgICAgICAgICAgICAgICApLnN0YXJ0KCkKCiAgICAgICAgIyBhZGQgdG8gdGhlIGdsb2JhbHMgYWxsIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIG9mIHRoZSBjb21wb25lbnQgKHRoZSBsb2NhbHMpCiAgICAgICAgZ2xvYmFscygpLnVwZGF0ZShsb2NhbHMoKSkKCiAgICAgICAgcGF0aF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQogICAgICAgIHN1Yl9kaXJzID0gW10KICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgIGZvciBkIGluIGRpcnM6CiAgICAgICAgICAgICAgICBzdWJfZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgcHJpbnQoZCkKICAgICAgICBzeXMucGF0aC5leHRlbmQoW3BhdGhfZGlyXSArIHN1Yl9kaXJzKQoKICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aF9kaXIpOgogICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgIHNlbGYucmVsb2FkX2FsbF9tb2R1bGVzKHBhdGhfZGlyKQoKICAgICAgICByZXMgPSBzZWxmLnNhZmVfZXhlYyhzZWxmLnBhdGgsIE5vbmUsIGdsb2JhbHMoKSkKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBUcnVlCiAgICAgICAgcmV0dXJuCgogICAgZGVmIEFmdGVyUnVuU2NyaXB0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgY29tcG9uZW50IGhhcyBmaW5pc2hlZAogICAgICAgICAgICBpdHMgY2FsY3VsYXRpb24uIEl0IGlzIHVzZWQgdG8gbG9hZCB0aGUgR0hDb21wb25lbnQgb3V0cHV0cwogICAgICAgICAgICB3aXRoIHRoZSB2YWx1ZXMgY3JlYXRlZCBpbiB0aGUgc2NyaXB0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmlzX3N1Y2Nlc3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIG91dHBhcmFtID0gW3AgZm9yIHAgaW4gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRdCiAgICAgICAgb3V0cGFyYW1fbmFtZXMgPSBbcC5OaWNrTmFtZSBmb3IgcCBpbiBvdXRwYXJhbV0KICAgICAgICAKICAgICAgICAjIFRPRE86IGFkZCB0aGUgY29udmVyc2lvbiB0byBkYXRhdHJlZSBmb3IgbmVzdGVkIGxpc3RzIGFuZCB0dXBsZXMKICAgICAgICBmb3IgaWR4LCBvdXRwIGluIGVudW1lcmF0ZShvdXRwYXJhbSk6CiAgICAgICAgICAgICMgZGV0ZWN0IGlmIHRoZSBvdXRwdXQgaXMgYSBsaXN0CiAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSBsaXN0IG9yIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSB0dXBsZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhTGlzdChnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YShnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCAwLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgc2VsZi5fdmFyX291dHB1dC5jbGVhcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIHRhYmxlX3ZhbHVlID0gZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5HZXRWYWx1ZSgKICAgICAgICAgICAgc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgIm5vdF9mb3VuZCIKICAgICAgICApCiAgICAgICAgaWYgdGFibGVfdmFsdWUgIT0gIm5vdF9mb3VuZCI6CiAgICAgICAgICAgIHJldHVybiB0YWJsZV92YWx1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgQHBhdGguc2V0dGVyCiAgICBkZWYgcGF0aChzZWxmLCBwYXRoIDogc3RyKToKICAgICAgICAiIiIgU2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLlNldFZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsIHBhdGgpCgogICAgICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgIGdoZW52LkNvbXBvbmVudC5NZXNzYWdlID0gZiJ7c2NyaXB0X25hbWV9IgoKICAgICAgICBpZiBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lIGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgXyA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZV1bMF0uc3RvcCgpCgogICAgQHBhdGguZGVsZXRlcgogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIERlbGV0ZSB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IGlmIHRoZSBvYmplY3QgaXMgZXJhc2VkLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkRlbGV0ZVZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUpCg==
- S
@@ -332,8 +405,8 @@
-
- 116
- 125
+ 81
+ 101
66
22
@@ -363,14 +436,14 @@
-
- 131
- 153
+ 93
+ 154
50
24
-
- 156.24402
- 165.29077
+ 118.14979
+ 166.4741
@@ -381,16 +454,28 @@
- - 1
+ - 4
- {0}
-
+
-
- -
- 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
-
- - 491fb852-545c-48e6-b8e5-8848ae2eb894
+
+ - aa56315b-2905-4049-8c41-0cc8b39d864b
+
+
+
+
+ - ba3151fb-3a8e-46c1-bdba-27ad41a4d1a2
+
+
+
+
+ - 322f4e22-d195-435e-b290-052cb2318277
+
+
+
+
+ - 7fc04154-255a-413f-a8a1-6ea034e1e779
@@ -414,28 +499,27 @@
- Panel
- false
- - 0
+ - 0.409473717212677
- 55cc2102-ec2b-4f6f-ba16-74e8aed9df42
- 1
- Double click to edit panel content…
-
+
-
- 355
- 0
- 343
- 166
+ 340
+ -150
+ 494
+ 162
- 0
- 0
- 0
-
- 355.2232
- 0.3242798
+ 340.46298
+ -149.99644
- - true
@@ -800,7 +884,7 @@
-
- 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
+ 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
- 00000000-0000-0000-0000-000000000000
@@ -808,7 +892,7 @@
-
- 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
+ 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
- 00000000-0000-0000-0000-000000000000
@@ -816,7 +900,7 @@
-
- 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
+ 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
- 00000000-0000-0000-0000-000000000000
@@ -1169,6 +1253,421 @@
+
+
+ - 59e0b89a-e487-49f8-bab8-b5bab16be14c
+ - Panel
+
+
+
+
+ - A panel for custom notes and text values
+ - 5262b483-9441-440a-a74d-8b235aad399d
+ - true
+ - Panel
+
+ - false
+ - 0.027397260069847107
+ - a849584f-8d8a-4547-a1a4-36be0bf3ac37
+ - 1
+ - Double click to edit panel content…
+
+
+
+
+ -
+ 413
+ 19
+ 343
+ 162
+
+ - 0
+ - 0
+ - 0
+ -
+ 413.26245
+ 19.415314
+
+
+
+
+
+ -
+ 255;213;217;232
+
+ - true
+ - true
+ - true
+ - false
+ - false
+ - true
+
+
+
+
+
+
+
+
+ - 537b0419-bbc2-4ff4-bf08-afe526367b2c
+ - Custom Preview
+
+
+
+
+ - Allows for customized geometry previews
+ - true
+ - 6f2c8a4b-d787-4606-9170-900f972641c6
+ - Custom Preview
+ - Preview
+
+
+
+
+
+ -
+ 935
+ 81
+ 48
+ 44
+
+ -
+ 969
+ 103
+
+
+
+
+
+ - Geometry to preview
+ - true
+ - 43f69636-7c49-4472-9329-bd25ec713d12
+ - Geometry
+ - G
+ - false
+ - 0
+
+
+
+
+ -
+ 937
+ 83
+ 17
+ 20
+
+ -
+ 947
+ 93
+
+
+
+
+
+
+
+ - The material override
+ - e22d7711-ceb9-48df-9270-b376fcd13ae6
+ - Material
+ - M
+ - false
+ - b14c32be-c541-4fae-93c2-449d7543457e
+ - 1
+
+
+
+
+ -
+ 937
+ 103
+ 17
+ 20
+
+ -
+ 947
+ 113
+
+
+
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
+
+
+
+
+ -
+ 255;221;160;221
+
+ -
+ 255;66;48;66
+
+ - 0.5
+ -
+ 255;255;255;255
+
+ - 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 537b0419-bbc2-4ff4-bf08-afe526367b2c
+ - Custom Preview
+
+
+
+
+ - Allows for customized geometry previews
+ - true
+ - 53c99f0b-499f-4471-9227-acc96558bfea
+ - Custom Preview
+ - Preview
+
+
+
+
+
+ -
+ 956
+ 153
+ 48
+ 44
+
+ -
+ 990
+ 175
+
+
+
+
+
+ - Geometry to preview
+ - true
+ - 525f46ad-33c4-44dc-8862-35b0ddce4d1d
+ - Geometry
+ - G
+ - false
+ - 0
+
+
+
+
+ -
+ 958
+ 155
+ 17
+ 20
+
+ -
+ 968
+ 165
+
+
+
+
+
+
+
+ - The material override
+ - 2e7559ef-c4d5-4ffe-a304-c34c078e5af0
+ - Material
+ - M
+ - false
+ - 0
+
+
+
+
+ -
+ 958
+ 175
+ 17
+ 20
+
+ -
+ 968
+ 185
+
+
+
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
+
+
+
+
+ -
+ 255;221;160;221
+
+ -
+ 255;66;48;66
+
+ - 0.5
+ -
+ 255;255;255;255
+
+ - 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 9c53bac0-ba66-40bd-8154-ce9829b9db1a
+ - Colour Swatch
+
+
+
+
+ - Colour (palette) swatch
+ - b14c32be-c541-4fae-93c2-449d7543457e
+ - Colour Swatch
+ - Swatch
+ - false
+ - 0
+ -
+ 255;255;255;255
+
+
+
+
+
+ -
+ 834
+ 103
+ 88
+ 20
+
+ -
+ 834.6667
+ 103.333336
+
+
+
+
+
+
+
+
+
+ - a8b97322-2d53-47cd-905e-b932c3ccd74e
+ - Button
+
+
+
+
+ - Button object with two values
+ - False
+ - True
+ - 254a4a2f-d415-488e-9851-4a763f1ba58f
+ - Button
+ - dump!
+ - false
+ - 0
+
+
+
+
+ -
+ 41
+ 187
+ 102
+ 22
+
+
+
+
+
+
+
+
+
+ - 06953bda-1d37-4d58-9b38-4b3c74e54c8f
+ - File Path
+
+
+
+
+ - Contains a collection of file paths
+ - false
+ - All files|*.*
+ - 77c76654-6be3-4843-b564-afe44705740d
+ - File Path
+ - Path
+ - false
+ - 0
+
+
+
+
+ -
+ 94
+ 126
+ 50
+ 24
+
+ -
+ 119.621796
+ 138.73785
+
+
+
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
+
+
+
+
+ - false
+ - F:\__TEMP\test\
+
+
+
+
+
+
+
+
+
+
@@ -1176,7 +1675,7 @@
-
- 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
+ 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
From 50b2786fe84d5dad295e01543d8d389cdc2b4027 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Mon, 8 Apr 2024 23:24:16 +0200
Subject: [PATCH 026/141] FIX: updated component code
---
src/gh/components/DF_xml_exporter/code.py | 3 +-
.../components/DF_xml_exporter/metadata.json | 12 ++
src/gh/diffCheck/diffCheck/diffCheck_app.py | 2 +-
src/gh/tester.ghx | 198 +++++++++++++-----
4 files changed, 158 insertions(+), 57 deletions(-)
diff --git a/src/gh/components/DF_xml_exporter/code.py b/src/gh/components/DF_xml_exporter/code.py
index a9acc888..ef83315e 100644
--- a/src/gh/components/DF_xml_exporter/code.py
+++ b/src/gh/components/DF_xml_exporter/code.py
@@ -21,6 +21,7 @@
class DFXMLExporter(component):
def RunScript(self,
i_dump : bool,
+ i_name : str,
i_export_dir : str,
i_breps : typing.List[Rhino.Geometry.Brep]
):
@@ -37,7 +38,7 @@ def RunScript(self,
beams.append(beam)
# assembly
- assembly1 = DFAssembly(beams, "Assembly1")
+ assembly1 = DFAssembly(beams, i_name)
print(assembly1.beams)
print(assembly1)
diff --git a/src/gh/components/DF_xml_exporter/metadata.json b/src/gh/components/DF_xml_exporter/metadata.json
index d805390c..cb3b2027 100644
--- a/src/gh/components/DF_xml_exporter/metadata.json
+++ b/src/gh/components/DF_xml_exporter/metadata.json
@@ -25,6 +25,18 @@
"sourceCount": 0,
"typeHintID": "bool"
},
+ {
+ "name": "i_assembly_name",
+ "nickname": "i_assembly_name",
+ "description": "The name of the assembly to export.",
+ "optional": false,
+ "allowTreeAccess": true,
+ "showTypeHints": true,
+ "scriptParamAccess": "item",
+ "wireDisplay": "default",
+ "sourceCount": 0,
+ "typeHintID": "str"
+ },
{
"name": "i_export_dir",
"nickname": "i_export_dir",
diff --git a/src/gh/diffCheck/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck/diffCheck_app.py
index 59fc8a0e..bcd65444 100644
--- a/src/gh/diffCheck/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck/diffCheck_app.py
@@ -27,7 +27,7 @@
beams.append(beam)
# assembly
- assembly1 = DFAssembly(beams, "Assembly1")
+ assembly1 = DFAssembly(beams, i_assembly_name)
print(assembly1.beams)
print(assembly1)
diff --git a/src/gh/tester.ghx b/src/gh/tester.ghx
index a5ca3f80..e4684b08 100644
--- a/src/gh/tester.ghx
+++ b/src/gh/tester.ghx
@@ -49,10 +49,10 @@
-
- 198
- 30
+ 87
+ -98
- - 0.7830095
+ - 2.0789368
@@ -99,9 +99,9 @@
- - 18
+ - 19
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
@@ -132,29 +132,30 @@
-
- 178
- 109
- 138
- 84
+ 175
+ 92
+ 165
+ 104
-
- 258
- 151
+ 282
+ 144
-
- - 4
+
+ - 5
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
- 2
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
@@ -177,14 +178,14 @@
-
- 180
- 111
- 63
+ 177
+ 94
+ 90
20
-
- 213
- 121
+ 223.5
+ 104
@@ -212,14 +213,14 @@
-
- 180
- 131
- 63
+ 177
+ 114
+ 90
20
-
- 213
- 141
+ 223.5
+ 124
@@ -248,20 +249,55 @@
-
- 180
- 151
- 63
+ 177
+ 134
+ 90
20
-
- 213
- 161
+ 223.5
+ 144
+
+ - true
+ - Converts to collection of text fragments
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAO8SURBVEhL1VVLLJxhFB3ERMT7zXgb71e8X/GId2IhQZTuJGwktjaNxqpYNAQbsWBHiDRsbNgIC4lWYiUs7LSVtLqY6UNNTu+58/9Caaurpie5md/85px7z733+yz/CnYPD4/P8om/iCcSj4OPj8/r+fl57O3tYWdnB9vb29jc3MTa2hoWFxcxMTGB/v5+tLW1oaqqCqmpqZCE3spPrW6G38DLy6tdfvh9YWEBZWVlGqWlpSguLkZhYSHy8/ORk5ODjIwMJU5KSkJWVhb8/Pwcnp6ezwyaX8IaGBj4YWlpCZ2dnZodo7KyEu3t7TBxcnKipGlpaUhJSdFITk6GCDiFw+amegDe3t4v+vr6rkdHR1FdXY3a2loNPs/NzcHlchkSQHNzM9LT05U8MTFRK5HkvolVrwy6e7BHRUV9nZ6eRkNDgxLX19dr8Pns7AwrKysGPTA5Oak22e12FYiLi0NsbCx7wSqK3JS3IN7vdHR0oLe3V225LTAwMIDj4+M7Nh0dHd0RIHl0dDSCg4NdIvLGoL1BW1hY2Jfu7m5tKj2/bdHy8jKmpqa02aenp4YEUFdXd2MRBcQBxMfHQ6bQIZxP3dTSWMn+XXl5ORicFlOElVDo4uICLS0t+m52dtagB8bGxlQgISEBNpsNkZGRKkJBqeKjcPtZpPPPQ0NDv5CcI8hRJBGzpdDQ0JDugjmmXV1dBj1wcHCgzaX/MTExiIiIQEhIiIrKMxf1pUWUPmVmZupsMyhSUFCAoqIijY2NDQwPD+t35g6cn58bEtBKTf/Dw8PZAxXKy8vjdn+iwEsZL2dubi5MIT6TjBU4HA6D6mGMjIxo9rRHnEBQUJDySFXuCugT/WKpnAoGlyg7O1szX11d1Wd+x3dcrp6eHoMe2N/fV9+ZPe1hJbRX+urugYGnVqvVwR9z/fnJJTo8PMTg4KA+m+/oL0fz8vJSBa6vr7VaM3tWLRZxF26mSMHZpXdceZKMj48rAQX4N4NVmku1u7ur74mZmRklp3BJSYlL6O7tAVHKs4QEXCITTqdTjwmOIonZo/X1dVxdXRn/4cbW1haampoQEBBA7+9vMiFVvBIfvzFbTsbt4JyzmfSYDaXnpi1CqiMsk3MlNL88iwgbq6DfzJbNM4OktNAkZkNl+uDv76/veTdIH39/mhp4JrPs5OTI8XETJinn3Mxa7gD4+vrqeSVVk/yP9wFhFavecywrKipQU1OjBPS3tbVVM+Whx4ORW83zq7Gx8fE3mgHerz/fuX+Kx9/J/xEslh9QdsIn89F0TQAAAABJRU5ErkJggg==
+
+ - d9632669-508e-4a03-b9bc-a5d740ef546f
+ - i_assembly_name
+ - i_assembly_name
+ - true
+ - 0
+ - true
+ - 86bc59e0-752b-48c2-b3e8-8f0c8b9737a3
+ - 1
+
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+
+
+
+
+ -
+ 177
+ 154
+ 90
+ 20
+
+ -
+ 223.5
+ 164
+
+
+
+
+
+
- true
- Converts to collection of boolean values
@@ -283,14 +319,14 @@
-
- 180
- 171
- 63
+ 177
+ 174
+ 90
20
-
- 213
- 181
+ 223.5
+ 184
@@ -317,14 +353,14 @@
-
- 273
- 111
+ 297
+ 94
41
- 40
+ 50
-
- 293.5
- 131
+ 317.5
+ 119
@@ -351,14 +387,14 @@
-
- 273
- 151
+ 297
+ 144
41
- 40
+ 50
-
- 293.5
- 171
+ 317.5
+ 169
@@ -368,7 +404,7 @@
- - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgogICAgICAgICAgICAgICAgIyBwYXJzZSB0aGUgY29kZQogICAgICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKICAgICAgICAgICAgICAgIG91dHB1dCA9IGlvLlN0cmluZ0lPKCkKCiAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBxdWV1ZSBhbmQgZXZlbnQKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5xdWV1ZV9tc2dfbG9jazoKICAgICAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWV1ZV9tc2cuZW1wdHkoKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuZ2V0KCkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAgICAgICAgICMgZXhlY3V0ZSB0aGUgY29kZQogICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnJlZGlyZWN0X3N0ZG91dChvdXRwdXQpOgogICAgICAgICAgICAgICAgICAgIGV4ZWMoY29kZSwgZ2xvYmFscywgbG9jYWxzKQogICAgICAgICAgICAgICAgbG9jYWxzWyJzdGRvdXQiXSA9IG91dHB1dC5nZXR2YWx1ZSgpCgogICAgICAgICAgICAgICAgIyBzZW5kIHRoZSBtc2cgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgICAgIG1zZ19qc29uID0ganNvbi5kdW1wcyh7InNjcmlwdF9wYXRoIjogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWQiOiBzdHIoZ2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2ciOiBvdXRwdXQuZ2V0dmFsdWUoKX0pCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IG1zZ19qc29uLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KG1zZ19qc29uKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQoKICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2NyaXB0IHZhcmlhYmxlcyB0byB0aGUgR0ggY29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgICAgIG91dHBhcmFtID0gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXQKICAgICAgICAgICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgICAgICAgICBmb3Igb3V0cCBpbiBvdXRwYXJhbV9uYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBvdXRwIGluIGxvY2Fscy5rZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuYXBwZW5kKGxvY2Fsc1tvdXRwXSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChOb25lKQoKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXwogICAgICAgICAgICByZXR1cm4gbG9jYWxzCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCiAgICAgICAgICAgICMgc2VuZCB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgICAgICBlcnJfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogImVycjoiICsgc3RyKGUpfSkKICAgICAgICAgICAgZXJyX2pzb24gPSBlcnJfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KGVycl9qc29uKQogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLnNldCgpCiAgICAgICAgICAgIAogICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KCiAgICAgICAgICAgIGVycl9tc2cgPSBmInNjcmlwdC1zeW5jOjpFcnJvciBpbiB0aGUgY29kZToge3N0cihlKX0iCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihlcnJfbXNnKQoKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgYnRuOiBib29sLAogICAgICAgICAgICBpX2V4cG9ydF9kaXI6IHN0ciwKICAgICAgICAgICAgaV9icmVwczogU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3RbUmhpbm8uR2VvbWV0cnkuQnJlcF0sCiAgICAgICAgICAgIGlfZHVtcDogYm9vbCk6CiAgICAgICAgIiIiIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgY29tcG9uZW50IGhhcyB0byBiZSByZWNhbGN1bGF0ZWQgaXQncyB0aGUgc29sdmUgbWFpbiBpbnN0YW5jZS4gIiIiCgogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IEZhbHNlCgogICAgICAgICMgc2V0IHRoZSBwYXRoIGlmIGJ1dHRvbiBpcyBwcmVzc2VkCiAgICAgICAgc2VsZi5pbml0X3NjcmlwdF9wYXRoKGJ0bikKCiAgICAgICAgIyBmaWxlIGNoYW5nZSBsaXN0ZW5lciB0aHJlYWQKICAgICAgICBpZiBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIEZpbGVDaGFuZ2VkVGhyZWFkKHNlbGYucGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnN0YXJ0KCkKCiAgICAgICAgIyBzZXQgdXAgdGhlIHRjcCBjbGllbnQgdG8gY29ubmVjdCB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgIF8gPSBbcHJpbnQodC5uYW1lKSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldCiAgICAgICAgaWYgc2VsZi5jbGllbnRfdGhyZWFkX25hbWUgbm90IGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgQ2xpZW50VGhyZWFkKHNlbGYudnNjb2RlX3NlcnZlcl9pcCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZwogICAgICAgICAgICAgICAgICAgICAgICApLnN0YXJ0KCkKCiAgICAgICAgIyBhZGQgdG8gdGhlIGdsb2JhbHMgYWxsIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIG9mIHRoZSBjb21wb25lbnQgKHRoZSBsb2NhbHMpCiAgICAgICAgZ2xvYmFscygpLnVwZGF0ZShsb2NhbHMoKSkKCiAgICAgICAgcGF0aF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQogICAgICAgIHN1Yl9kaXJzID0gW10KICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgIGZvciBkIGluIGRpcnM6CiAgICAgICAgICAgICAgICBzdWJfZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgcHJpbnQoZCkKICAgICAgICBzeXMucGF0aC5leHRlbmQoW3BhdGhfZGlyXSArIHN1Yl9kaXJzKQoKICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aF9kaXIpOgogICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgIHNlbGYucmVsb2FkX2FsbF9tb2R1bGVzKHBhdGhfZGlyKQoKICAgICAgICByZXMgPSBzZWxmLnNhZmVfZXhlYyhzZWxmLnBhdGgsIE5vbmUsIGdsb2JhbHMoKSkKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBUcnVlCiAgICAgICAgcmV0dXJuCgogICAgZGVmIEFmdGVyUnVuU2NyaXB0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgY29tcG9uZW50IGhhcyBmaW5pc2hlZAogICAgICAgICAgICBpdHMgY2FsY3VsYXRpb24uIEl0IGlzIHVzZWQgdG8gbG9hZCB0aGUgR0hDb21wb25lbnQgb3V0cHV0cwogICAgICAgICAgICB3aXRoIHRoZSB2YWx1ZXMgY3JlYXRlZCBpbiB0aGUgc2NyaXB0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmlzX3N1Y2Nlc3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIG91dHBhcmFtID0gW3AgZm9yIHAgaW4gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRdCiAgICAgICAgb3V0cGFyYW1fbmFtZXMgPSBbcC5OaWNrTmFtZSBmb3IgcCBpbiBvdXRwYXJhbV0KICAgICAgICAKICAgICAgICAjIFRPRE86IGFkZCB0aGUgY29udmVyc2lvbiB0byBkYXRhdHJlZSBmb3IgbmVzdGVkIGxpc3RzIGFuZCB0dXBsZXMKICAgICAgICBmb3IgaWR4LCBvdXRwIGluIGVudW1lcmF0ZShvdXRwYXJhbSk6CiAgICAgICAgICAgICMgZGV0ZWN0IGlmIHRoZSBvdXRwdXQgaXMgYSBsaXN0CiAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSBsaXN0IG9yIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSB0dXBsZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhTGlzdChnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YShnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCAwLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgc2VsZi5fdmFyX291dHB1dC5jbGVhcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIHRhYmxlX3ZhbHVlID0gZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5HZXRWYWx1ZSgKICAgICAgICAgICAgc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgIm5vdF9mb3VuZCIKICAgICAgICApCiAgICAgICAgaWYgdGFibGVfdmFsdWUgIT0gIm5vdF9mb3VuZCI6CiAgICAgICAgICAgIHJldHVybiB0YWJsZV92YWx1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgQHBhdGguc2V0dGVyCiAgICBkZWYgcGF0aChzZWxmLCBwYXRoIDogc3RyKToKICAgICAgICAiIiIgU2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLlNldFZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsIHBhdGgpCgogICAgICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgIGdoZW52LkNvbXBvbmVudC5NZXNzYWdlID0gZiJ7c2NyaXB0X25hbWV9IgoKICAgICAgICBpZiBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lIGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgXyA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZV1bMF0uc3RvcCgpCgogICAgQHBhdGguZGVsZXRlcgogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIERlbGV0ZSB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IGlmIHRoZSBvYmplY3QgaXMgZXJhc2VkLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkRlbGV0ZVZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUpCg==
+ - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgogICAgICAgICAgICAgICAgIyBwYXJzZSB0aGUgY29kZQogICAgICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKICAgICAgICAgICAgICAgIG91dHB1dCA9IGlvLlN0cmluZ0lPKCkKCiAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBxdWV1ZSBhbmQgZXZlbnQKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5xdWV1ZV9tc2dfbG9jazoKICAgICAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWV1ZV9tc2cuZW1wdHkoKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuZ2V0KCkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAgICAgICAgICMgZXhlY3V0ZSB0aGUgY29kZQogICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnJlZGlyZWN0X3N0ZG91dChvdXRwdXQpOgogICAgICAgICAgICAgICAgICAgIGV4ZWMoY29kZSwgZ2xvYmFscywgbG9jYWxzKQogICAgICAgICAgICAgICAgbG9jYWxzWyJzdGRvdXQiXSA9IG91dHB1dC5nZXR2YWx1ZSgpCgogICAgICAgICAgICAgICAgIyBzZW5kIHRoZSBtc2cgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgICAgIG1zZ19qc29uID0ganNvbi5kdW1wcyh7InNjcmlwdF9wYXRoIjogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWQiOiBzdHIoZ2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2ciOiBvdXRwdXQuZ2V0dmFsdWUoKX0pCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IG1zZ19qc29uLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KG1zZ19qc29uKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQoKICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2NyaXB0IHZhcmlhYmxlcyB0byB0aGUgR0ggY29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgICAgIG91dHBhcmFtID0gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXQKICAgICAgICAgICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgICAgICAgICBmb3Igb3V0cCBpbiBvdXRwYXJhbV9uYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBvdXRwIGluIGxvY2Fscy5rZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuYXBwZW5kKGxvY2Fsc1tvdXRwXSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChOb25lKQoKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXwogICAgICAgICAgICByZXR1cm4gbG9jYWxzCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCiAgICAgICAgICAgICMgc2VuZCB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgICAgICBlcnJfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogImVycjoiICsgc3RyKGUpfSkKICAgICAgICAgICAgZXJyX2pzb24gPSBlcnJfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KGVycl9qc29uKQogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLnNldCgpCiAgICAgICAgICAgIAogICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KCiAgICAgICAgICAgIGVycl9tc2cgPSBmInNjcmlwdC1zeW5jOjpFcnJvciBpbiB0aGUgY29kZToge3N0cihlKX0iCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihlcnJfbXNnKQoKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgYnRuOiBib29sLAogICAgICAgICAgICBpX2V4cG9ydF9kaXI6IHN0ciwKICAgICAgICAgICAgaV9icmVwczogU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3RbUmhpbm8uR2VvbWV0cnkuQnJlcF0sCiAgICAgICAgICAgIGlfYXNzZW1ibHlfbmFtZTogc3RyLAogICAgICAgICAgICBpX2R1bXA6IGJvb2wpOgogICAgICAgICIiIiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIGl0J3MgdGhlIHNvbHZlIG1haW4gaW5zdGFuY2UuICIiIgoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICAjIHNldCB0aGUgcGF0aCBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIHNlbGYuaW5pdF9zY3JpcHRfcGF0aChidG4pCgogICAgICAgICMgZmlsZSBjaGFuZ2UgbGlzdGVuZXIgdGhyZWFkCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBGaWxlQ2hhbmdlZFRocmVhZChzZWxmLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgc2V0IHVwIHRoZSB0Y3AgY2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICBfID0gW3ByaW50KHQubmFtZSkgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXQogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIENsaWVudFRocmVhZChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cKICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgYWRkIHRvIHRoZSBnbG9iYWxzIGFsbCB0aGUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgY29tcG9uZW50ICh0aGUgbG9jYWxzKQogICAgICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgogICAgICAgIHBhdGhfZGlyID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICBzdWJfZGlycyA9IFtdCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aF9kaXIpOgogICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICAgICAgc3ViX2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihyb290LCBkKSkKICAgICAgICAgICAgICAgIHByaW50KGQpCiAgICAgICAgc3lzLnBhdGguZXh0ZW5kKFtwYXRoX2Rpcl0gKyBzdWJfZGlycykKCiAgICAgICAgIyByZWxvYWQgYWxsIHRoZSBtb2R1bGVzIGFsc28gb2YgdGhlIHN1YiBkaXJlY3RvcmllcwogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGhfZGlyKToKICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgIHNlbGYucmVsb2FkX2FsbF9tb2R1bGVzKG9zLnBhdGguam9pbihyb290LCBkKSkKICAgICAgICBzZWxmLnJlbG9hZF9hbGxfbW9kdWxlcyhwYXRoX2RpcikKCiAgICAgICAgcmVzID0gc2VsZi5zYWZlX2V4ZWMoc2VsZi5wYXRoLCBOb25lLCBnbG9iYWxzKCkpCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gVHJ1ZQogICAgICAgIHJldHVybgoKICAgIGRlZiBBZnRlclJ1blNjcmlwdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGNvbXBvbmVudCBoYXMgZmluaXNoZWQKICAgICAgICAgICAgaXRzIGNhbGN1bGF0aW9uLiBJdCBpcyB1c2VkIHRvIGxvYWQgdGhlIEdIQ29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgd2l0aCB0aGUgdmFsdWVzIGNyZWF0ZWQgaW4gdGhlIHNjcmlwdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5pc19zdWNjZXNzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBvdXRwYXJhbSA9IFtwIGZvciBwIGluIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0XQogICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgCiAgICAgICAgIyBUT0RPOiBhZGQgdGhlIGNvbnZlcnNpb24gdG8gZGF0YXRyZWUgZm9yIG5lc3RlZCBsaXN0cyBhbmQgdHVwbGVzCiAgICAgICAgZm9yIGlkeCwgb3V0cCBpbiBlbnVtZXJhdGUob3V0cGFyYW0pOgogICAgICAgICAgICAjIGRldGVjdCBpZiB0aGUgb3V0cHV0IGlzIGEgbGlzdAogICAgICAgICAgICBpZiB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gbGlzdCBvciB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gdHVwbGU6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YUxpc3QoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGEoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgMCwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuY2xlYXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICB0YWJsZV92YWx1ZSA9IGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuR2V0VmFsdWUoCiAgICAgICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsICJub3RfZm91bmQiCiAgICAgICAgKQogICAgICAgIGlmIHRhYmxlX3ZhbHVlICE9ICJub3RfZm91bmQiOgogICAgICAgICAgICByZXR1cm4gdGFibGVfdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwYXRoLnNldHRlcgogICAgZGVmIHBhdGgoc2VsZiwgcGF0aCA6IHN0cik6CiAgICAgICAgIiIiIFNldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5TZXRWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCBwYXRoKQoKICAgICAgICBzY3JpcHRfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9IGYie3NjcmlwdF9uYW1lfSIKCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIF8gPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdLnN0b3AoKQoKICAgIEBwYXRoLmRlbGV0ZXIKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBEZWxldGUgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyBpZiB0aGUgb2JqZWN0IGlzIGVyYXNlZC4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5EZWxldGVWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlKQo=
- S
@@ -405,8 +441,8 @@
-
- 81
- 101
+ 80
+ 79
66
22
@@ -436,14 +472,14 @@
-
- 93
- 154
+ 92
+ 132
50
24
-
- 118.14979
- 166.4741
+ 117.58312
+ 144.94077
@@ -1633,13 +1669,13 @@
-
94
- 126
+ 105
50
24
-
- 119.621796
- 138.73785
+ 119.05513
+ 117.20451
@@ -1668,6 +1704,58 @@
+
+
+ - 59e0b89a-e487-49f8-bab8-b5bab16be14c
+ - Panel
+
+
+
+
+ - A panel for custom notes and text values
+ - 86bc59e0-752b-48c2-b3e8-8f0c8b9737a3
+ - Panel
+
+ - false
+ - 0
+ - 0
+ - AssemblyTest
+
+
+
+
+ -
+ 44
+ 161
+ 102
+ 20
+
+ - 0
+ - 0
+ - 0
+ -
+ 44.200005
+ 161.50002
+
+
+
+
+
+ -
+ 255;213;217;232
+
+ - true
+ - true
+ - true
+ - false
+ - false
+ - true
+
+
+
+
+
+
@@ -1675,7 +1763,7 @@
-
- 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
+ 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
From d8eefa6860c01abf99bcdb507490e39258d622a0 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Tue, 9 Apr 2024 15:49:59 +0200
Subject: [PATCH 027/141] WIP: working on solving tenon-mortise
---
src/gh/diffCheck/diffCheck/__init__.py | 2 +-
src/gh/diffCheck/diffCheck/df_geometries.py | 80 +++-
.../diffCheck/diffCheck/df_joint_detector.py | 32 +-
src/gh/diffCheck/diffCheck/diffCheck_app.py | 13 +-
src/gh/diffCheck/setup.py | 2 +-
src/gh/tester.ghx | 440 +++++++-----------
6 files changed, 282 insertions(+), 287 deletions(-)
diff --git a/src/gh/diffCheck/diffCheck/__init__.py b/src/gh/diffCheck/diffCheck/__init__.py
index 210ebb3e..8dbfdadd 100644
--- a/src/gh/diffCheck/diffCheck/__init__.py
+++ b/src/gh/diffCheck/diffCheck/__init__.py
@@ -1 +1 @@
-__version__ = '0.0.2'
\ No newline at end of file
+__version__ = '0.0.3'
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/df_geometries.py b/src/gh/diffCheck/diffCheck/df_geometries.py
index 911733ad..6e0f813d 100644
--- a/src/gh/diffCheck/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/diffCheck/df_geometries.py
@@ -29,8 +29,23 @@ def __post_init__(self):
def __repr__(self):
return f"Vertex: X={self.x}, Y={self.y}, Z={self.z}"
- def from_rg_point3d(point: rg.Point3d):
- return DFVertex(point.X, point.Y, point.Z)
+ def __hash__(self):
+ return hash((self.x, self.y, self.z))
+
+ def __eq__(self, other):
+ if isinstance(other, DFVertex):
+ return self.x == other.x and self.y == other.y and self.z == other.z
+ return False
+
+ @classmethod
+ def from_rg_point3d(cls, point: rg.Point3d):
+ """
+ Create a DFVertex from a Rhino Point3d object
+
+ :param point: The Rhino Point3d object
+ :return vertex: The DFVertex object
+ """
+ return cls(point.X, point.Y, point.Z)
@dataclass
@@ -45,13 +60,21 @@ def __post_init__(self):
raise ValueError("A face must have at least 3 vertices")
self.vertices = self.vertices or []
- self.joint_id = self.joint_id or None
+ self.joint_id = self.joint_id
self.__is_joint = False
self.__id = uuid.uuid4().int
def __repr__(self):
return f"Face vertices: {len(self.vertices)}"
+ def __hash__(self):
+ return hash((tuple(self.vertices), self.joint_id))
+
+ def __eq__(self, other):
+ if isinstance(other, DFFace):
+ return self.vertices == other.vertices and self.joint_id == other.joint_id
+ return False
+
@staticmethod
def compute_mass_center(face: rg.BrepFace) -> rg.Point3d:
"""
@@ -65,9 +88,44 @@ def compute_mass_center(face: rg.BrepFace) -> rg.Point3d:
return amp.Centroid
return None
+ @classmethod
+ def from_brep(cls, brep_face: rg.BrepFace, joint_id: int=None):
+ """
+ Create a DFFace from a Rhino Brep face
+
+ :param brep_face: The Rhino Brep face
+ :param joint_id: The joint id
+ :return face: The DFFace object
+ """
+ vertices = []
+ face_loop = brep_face.OuterLoop
+ face_loop_trims = face_loop.Trims
+
+ face_curve_loop = brep_face.OuterLoop.To3dCurve()
+ face_curve_loop = face_curve_loop.ToNurbsCurve()
+ face_vertices = face_curve_loop.Points
+
+ for f_v in face_vertices:
+ vertex = DFVertex(f_v.X, f_v.Y, f_v.Z)
+ vertices.append(vertex)
+
+ return cls(vertices, joint_id)
+
+ def to_brep(self):
+ """
+ Convert the face to a Rhino Brep planar face
+
+ :return brep_face: The Rhino Brep planar face
+ """
+ vertices : rg.Point3d = [rg.Point3d(vertex.x, vertex.y, vertex.z) for vertex in self.vertices]
+ polyline = rg.Polyline(vertices)
+ face_brep = rg.Brep.CreatePlanarBreps([polyline.ToNurbsCurve()])[0]
+
+ return face_brep
+
@property
def is_joint(self):
- if self.joint_id:
+ if self.joint_id is not None:
self.__is_joint = True
return True
self.__is_joint = False
@@ -88,15 +146,19 @@ class DFBeam:
def __post_init__(self):
self.name = self.name or "Unnamed Beam"
self.faces = self.faces or []
+ self._joint_faces = []
+ self._side_faces = []
self.__id = uuid.uuid4().int
@classmethod
def from_brep(cls, brep):
"""
- Create a DFBeam from a RhinoBrep object
+ Create a DFBeam from a RhinoBrep object.
+ It also removes duplicates and creates a list of unique faces.
"""
faces = JointDetector(brep).run()
+ faces = list(set(faces))
beam = cls("Beam", faces)
return beam
@@ -107,6 +169,14 @@ def __repr__(self):
def id(self):
return self.__id
+ @property
+ def joint_faces(self):
+ return [face for face in self.faces if face.is_joint]
+
+ @property
+ def side_faces(self):
+ return [face for face in self.faces if not face.is_joint]
+
@dataclass
class DFAssembly:
diff --git a/src/gh/diffCheck/diffCheck/df_joint_detector.py b/src/gh/diffCheck/diffCheck/df_joint_detector.py
index 6c9db99c..7713f2a6 100644
--- a/src/gh/diffCheck/diffCheck/df_joint_detector.py
+++ b/src/gh/diffCheck/diffCheck/df_joint_detector.py
@@ -155,12 +155,14 @@ def run(self) -> typing.List[DFFace]:
b.Transform(x_form_back)
for b in self._cuts:
b.Transform(x_form_back)
+ for b in self._mix:
+ b.Transform(x_form_back)
self.brep.Transform(x_form_back)
+ # get all the medians of the faces of cuts only
cuts_faces_centroids : typing.Dict[int, typing.List[rg.Point3d]] = {}
-
- # get all the medians of the faces of cuts
for idx, b in enumerate(self._cuts):
+ idx = idx + 1
temp_face_centroids = []
for f in b.Faces:
centroid = DFFace.compute_mass_center(f)
@@ -170,22 +172,16 @@ def run(self) -> typing.List[DFFace]:
# compare with the brep medians faces to get the joint/sides's faces
for f in self.brep.Faces:
centroid_2test = DFFace.compute_mass_center(f)
- for idx, centroids in cuts_faces_centroids.items():
+ for key, centroids in cuts_faces_centroids.items():
+ is_joint = False
for centroid in centroids:
if centroid_2test.DistanceTo(centroid) < sc.doc.ModelAbsoluteTolerance:
- df_vertices = []
- face_loop = f.OuterLoop
- face_loop_trims = face_loop.Trims
- for face_loop_trim in face_loop_trims:
- df_vertices.append(DFVertex.from_rg_point3d(face_loop_trim.PointAtStart))
- self._faces.append(DFFace(df_vertices, idx))
+ self._faces.append(DFFace.from_brep(f, key))
+ is_joint = True
break
- else:
- df_vertices = []
- face_loop = f.OuterLoop
- face_loop_trims = face_loop.Trims
- for face_loop_trim in face_loop_trims:
- df_vertices.append(DFVertex.from_rg_point3d(face_loop_trim.PointAtStart))
- self._faces.append(DFFace(df_vertices))
-
- return self._faces
+ if is_joint:
+ break
+ if not is_joint:
+ self._faces.append(DFFace.from_brep(f, None))
+
+ return self._faces
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck/diffCheck_app.py
index bcd65444..1850d9b6 100644
--- a/src/gh/diffCheck/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck/diffCheck_app.py
@@ -1,4 +1,5 @@
#! python3
+
import Rhino
import Rhino.Geometry as rg
import scriptcontext as sc
@@ -35,4 +36,14 @@
xml : str = assembly1.to_xml()
if i_dump:
assembly1.dump(xml, i_export_dir)
- o_xml = xml
\ No newline at end of file
+ o_xml = xml
+
+ # show the joint/side faces
+ joints_faces_breps = []
+ sides_faces_breps = []
+ for beam in beams:
+ joints_faces_breps.extend([face.to_brep() for face in beam.joint_faces])
+ sides_faces_breps.extend([face.to_brep() for face in beam.side_faces])
+
+ o_joints = joints_faces_breps
+ o_sides = sides_faces_breps
\ No newline at end of file
diff --git a/src/gh/diffCheck/setup.py b/src/gh/diffCheck/setup.py
index 3a3a225e..3520ee6a 100644
--- a/src/gh/diffCheck/setup.py
+++ b/src/gh/diffCheck/setup.py
@@ -2,7 +2,7 @@
setup(
name='diffCheck',
- version='0.0.2',
+ version='0.0.3',
packages=find_packages(),
description='DiffCheck is a package to check the differences between two timber structures',
long_description=open('README.md').read(),
diff --git a/src/gh/tester.ghx b/src/gh/tester.ghx
index e4684b08..f128de26 100644
--- a/src/gh/tester.ghx
+++ b/src/gh/tester.ghx
@@ -49,10 +49,10 @@
-
- 87
- -98
+ -12
+ -118
- - 2.0789368
+ - 1.2750002
@@ -110,9 +110,10 @@
-
+
- true
+ - true
- 2
-
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
@@ -134,7 +135,7 @@
-
175
92
- 165
+ 171
104
-
@@ -144,18 +145,20 @@
-
+
- 5
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 2
+ - 4
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
@@ -355,12 +358,12 @@
-
297
94
- 41
- 50
+ 47
+ 25
-
- 317.5
- 119
+ 320.5
+ 106.5
@@ -383,18 +386,86 @@
- 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+ -
+ 297
+ 119
+ 47
+ 25
+
+ -
+ 320.5
+ 131.5
+
+
+
+
+
+
+
+ - false
+ - No conversion
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 178951a0-3c74-4810-aef0-87cc45b0502c
+ - o_joints
+ - o_joints
+ - false
+ - 0
+ - true
+ - 0
+
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
-
297
144
- 41
- 50
+ 47
+ 25
-
- 317.5
+ 320.5
+ 156.5
+
+
+
+
+
+
+
+ - false
+ - No conversion
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 76758d37-2a1d-412d-b85b-149ecda8a020
+ - o_sides
+ - o_sides
+ - false
+ - 0
+ - true
+ - 0
+
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 297
169
+ 47
+ 25
+
+ -
+ 320.5
+ 181.5
@@ -490,28 +561,33 @@
- - 4
+ - 5
- {0}
-
+
- - aa56315b-2905-4049-8c41-0cc8b39d864b
+ - ba3151fb-3a8e-46c1-bdba-27ad41a4d1a2
- - ba3151fb-3a8e-46c1-bdba-27ad41a4d1a2
+ - 7fc04154-255a-413f-a8a1-6ea034e1e779
- - 322f4e22-d195-435e-b290-052cb2318277
+ - aa56315b-2905-4049-8c41-0cc8b39d864b
- - 7fc04154-255a-413f-a8a1-6ea034e1e779
+ - 322f4e22-d195-435e-b290-052cb2318277
+
+
+
+
+ - 5981a85d-0063-489b-8bd7-7a1ebe1453a7
@@ -535,7 +611,7 @@
- Panel
- false
- - 0.409473717212677
+ - 0
- 55cc2102-ec2b-4f6f-ba16-74e8aed9df42
- 1
- Double click to edit panel content…
@@ -544,17 +620,17 @@
-
- 340
- -150
+ 329
+ -243
494
- 162
+ 292
- 0
- 0
- 0
-
- 340.46298
- -149.99644
+ 329.48257
+ -242.18234
@@ -1039,204 +1115,6 @@
-
- - 719467e6-7cf5-4848-99b0-c5dd57e5442c
- - 066d0a87-236f-4eae-a0f4-9e42f5327962
- - Python 3 Script
-
-
-
-
-
- - true
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAWJQAAFiUBSVIk8AAABCxJREFUSEvdlF1MW2UcxvHCZMbEKNFUo7I5NnRjDHpOe9oOEGETxWWuMXpr9MIlOgqjsDG+xgoYLxZj9GahH7RjhY5BWRnlY3y24tgX4saIVJ0rzN1pHPMjxOh7Hv/vOacQLmtMTHySf9om7/t7nz7neU/KfyrhYFuW3uZy6w86Y3qb++fsMvdfOTbvj3q7PybaO5xSZddz2tLkJZQ68wl8L6fU3Zpd5lkWDvkgHDoFAkOsDMBwpBuGyjN/CLXBp7QtySnH5mrm7vl3ocznEe1+gvthOHxWhdMYa0IwHA01KhuSld7mcVIkK/qyU2F9RedKwrWxOgjj0XM0vZBq+yHVh/3aluQk2HxVQvnpiFDZSROgORsxVvdExMM9f3LnUh3BG4bogKHkDhDtrY8b7G3PGuyB9VN3ThmxJvSTVD8AE8FNjSOQHON+ecmazpasbnlx3xF5vjhVQ62XvtT1hr6s7YpQ0Q6xKkBzhvLugqG6R42kpo/cDipgqYE+CW52TEBqmvTLd60W3N4HfFsCzO9ZxlzeYxpWFXcs2Dy/CRWn1YZwsPIgOZxnfV6DD6vOj48RfFI5wNQc9cjf781H7FXg5m5gtgDy5V21GloVVdCtOk40hMD8YXLXPOvVSEZV500RWJqjsLRMwdQyVSLHit/HjSJg5kXgkgUsKk5raFViZcf1VddKS3ph5K4TcXDnBDcfHyf4ZAK8Ymmect2ZfjOVzRbextU8YNoMRAxgF7LuASkPaHiKqKrrdxVMWdfyrAdgbBhcNDVeOPD2p/5Cb1/LW94wn4/Uod/zF98pYjf3fIzZ/GVcyQWmJGBCAEZ2AuHtgHfjBg1P/6C6+wfFsRaHoTa8UvRhn46acYLmF9yxQpml/cCtvVDynqO8v1QjwedGYFwPDGcB/S+ABbd8p6FVidWhMakurGZNGZuOjXiwZM1bBfNZfJ1a8hrwdTFwvRC4lq9GEiX4aDYwtAPoex7oSQcCaT4NrcpUP1CeeIhmaojJMVZCzj9bhcepgt8oFQS+eglK3hcJPimqkQxmAqEMoHsz0JkGuV23Q0OrMld0PWQ8NnxXOcAxDotjYjdb2u9U4IlIqILsWoHMLuXKLCLJbEyQ2dBOmZ3fLrNghswCm2TW/syC7NG9q2HXS2ocfMTkmPjA3BRtz22aymRxOoDDeSRUQXY171dt6b8jtvCKE/Mvq5HwvCkSFhHjbDQrzsKZcda3Nc660+OsI+0TbUtyYnNFTn4rlQp+YVrLu38bWG/Gfda12cU6nr7PfLp/9jaVZwrew+VdVEHq9zj1e4hXcBvQuxUssNHJ1zDvky65NbVc2ZCsMFmwgUUNCxjLWatgcAuvIJiPnLt1LnYy9YZ8QvewtiV5YUZ8kG7lARbKGGDdm25RJCsUSYw5nwjLJx8thTdl7bb+T5WS8jfirxG8xR5eUAAAAABJRU5ErkJggg==
-
- - 692eaddb-c313-4649-8d06-bb4758e34447
- - true
- - true
- - true
- - Python 3 Script
- - Py3
-
- - false
- - false
- - true
-
-
-
-
- -
- 257
- 224
- 72
- 44
-
- -
- 286
- 246
-
-
-
-
-
- - 2
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 2
- - 3ede854e-c753-40eb-84cb-b48008f14fd4
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
-
-
-
- - true
- - No conversion
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
-
- - 47ff6ae7-24ce-4f29-823d-93afd6bb4c78
- - x
- - x
- - true
- - 0
- - true
- - 0
-
- - 6a184b65-baa3-42d1-a548-3915b401de53
-
-
-
-
- -
- 259
- 226
- 12
- 20
-
- -
- 266.5
- 236
-
-
-
-
-
-
-
- - true
- - No conversion
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
-
- - abe1ba7e-2994-43d0-9af7-cb2aaaa3f7c0
- - y
- - y
- - true
- - 0
- - true
- - 0
-
- - 6a184b65-baa3-42d1-a548-3915b401de53
-
-
-
-
- -
- 259
- 246
- 12
- 20
-
- -
- 266.5
- 256
-
-
-
-
-
-
-
- - The execution information, as output and error streams
- - 155841e4-9095-4931-9b41-7d9131e024c3
- - out
- - out
- - false
- - 0
-
-
-
-
- -
- 301
- 226
- 26
- 20
-
- -
- 314
- 236
-
-
-
-
-
-
-
- - false
- - No conversion
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
-
- - 127d1297-1eba-4798-aaa2-01a05a1b95d6
- - a
- - a
- - false
- - 0
- - true
- - 0
-
- - 6a184b65-baa3-42d1-a548-3915b401de53
-
-
-
-
- -
- 301
- 246
- 26
- 20
-
- -
- 314
- 256
-
-
-
-
-
-
-
-
-
- - aW1wb3J0IG9zDQoNCnBhdGggPSByIkY6XGRpZmZDaGVja1xzcmNcZ2hcZGlmZkNoZWNrXGRpZmZDaGVja19hcHAucHkiDQpwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQ0Kc3ViX2RpcnMgPSBbXQ0KZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aF9kaXIpOg0KICAgIGZvciBkIGluIGRpcnM6DQogICAgICAgIHN1Yl9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4ocm9vdCwgZCkpDQogICAgICAgIHByaW50KG9zLnBhdGguam9pbihyb290LCBkKSk=
- - Py3
-
-
-
-
- - *.*.python
- - 3.*
-
-
-
-
-
-
-
-
-
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -1250,7 +1128,7 @@
- false
- 0
- - 155841e4-9095-4931-9b41-7d9131e024c3
+ - 178951a0-3c74-4810-aef0-87cc45b0502c
- 1
- Double click to edit panel content…
@@ -1258,8 +1136,8 @@
-
- 386
- 175
+ 627
+ 289
411
166
@@ -1267,8 +1145,8 @@
- 0
- 0
-
- 386.9042
- 175.51825
+ 627.30396
+ 289.70813
@@ -1289,22 +1167,21 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
-
+
- A panel for custom notes and text values
- 5262b483-9441-440a-a74d-8b235aad399d
- - true
- Panel
- false
- - 0.027397260069847107
- - a849584f-8d8a-4547-a1a4-36be0bf3ac37
+ - 1
+ - 76758d37-2a1d-412d-b85b-149ecda8a020
- 1
- Double click to edit panel content…
@@ -1312,17 +1189,17 @@
-
- 413
- 19
+ 414
+ 32
343
- 162
+ 118
- 0
- 0
- 0
-
- 413.26245
- 19.415314
+ 414.04675
+ 32.380676
@@ -1343,15 +1220,16 @@
-
+
- 537b0419-bbc2-4ff4-bf08-afe526367b2c
- Custom Preview
-
+
- Allows for customized geometry previews
+ - true
- true
- 6f2c8a4b-d787-4606-9170-900f972641c6
- Custom Preview
@@ -1374,14 +1252,15 @@
-
+
- Geometry to preview
- true
- 43f69636-7c49-4472-9329-bd25ec713d12
- Geometry
- G
- false
- - 0
+ - 178951a0-3c74-4810-aef0-87cc45b0502c
+ - 1
@@ -1461,7 +1340,7 @@
-
+
- 537b0419-bbc2-4ff4-bf08-afe526367b2c
- Custom Preview
@@ -1480,38 +1359,39 @@
-
- 956
+ 953
153
48
44
-
- 990
+ 987
175
-
+
- Geometry to preview
- true
- 525f46ad-33c4-44dc-8862-35b0ddce4d1d
- Geometry
- G
- false
- - 0
+ - 76758d37-2a1d-412d-b85b-149ecda8a020
+ - 1
-
- 958
+ 955
155
17
20
-
- 968
+ 965
165
@@ -1519,25 +1399,26 @@
-
+
- The material override
- 2e7559ef-c4d5-4ffe-a304-c34c078e5af0
- Material
- M
- false
- - 0
+ - fc5dba97-2c1a-4749-9c61-3f88abff00ff
+ - 1
-
- 958
+ 955
175
17
20
-
- 968
+ 965
185
@@ -1578,7 +1459,7 @@
-
+
- 9c53bac0-ba66-40bd-8154-ce9829b9db1a
- Colour Swatch
@@ -1593,7 +1474,7 @@
- false
- 0
-
- 255;255;255;255
+ 255;128;0;255
@@ -1615,7 +1496,7 @@
-
+
- a8b97322-2d53-47cd-905e-b932c3ccd74e
- Button
@@ -1647,7 +1528,7 @@
-
+
- 06953bda-1d37-4d58-9b38-4b3c74e54c8f
- File Path
@@ -1704,7 +1585,7 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -1756,6 +1637,43 @@
+
+
+ - 9c53bac0-ba66-40bd-8154-ce9829b9db1a
+ - Colour Swatch
+
+
+
+
+ - Colour (palette) swatch
+ - fc5dba97-2c1a-4749-9c61-3f88abff00ff
+ - Colour Swatch
+ - Swatch
+ - false
+ - 0
+ -
+ 255;102;255;0
+
+
+
+
+
+ -
+ 856
+ 181
+ 88
+ 20
+
+ -
+ 856.6275
+ 181.76471
+
+
+
+
+
+
+
@@ -1763,7 +1681,7 @@
-
- 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
+ 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
From 9b4b8a9f41e30311337f7c59d8bb09f9d037828f Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Wed, 10 Apr 2024 10:04:35 +0200
Subject: [PATCH 028/141] WIP: almost working conversion dface to brep rhino
---
src/gh/diffCheck/diffCheck/df_geometries.py | 108 ++++++++++++++++----
src/gh/diffCheck/diffCheck/diffCheck_app.py | 7 +-
2 files changed, 89 insertions(+), 26 deletions(-)
diff --git a/src/gh/diffCheck/diffCheck/df_geometries.py b/src/gh/diffCheck/diffCheck/df_geometries.py
index 6e0f813d..6a021500 100644
--- a/src/gh/diffCheck/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/diffCheck/df_geometries.py
@@ -47,32 +47,50 @@ def from_rg_point3d(cls, point: rg.Point3d):
"""
return cls(point.X, point.Y, point.Z)
+ def to_rg_point3d(self):
+ """
+ Convert the vertex to a Rhino Point3d object
+
+ :return point: The Rhino Point3d object
+ """
+ return rg.Point3d(self.x, self.y, self.z)
+
@dataclass
class DFFace:
"""
This class represents a face, in diffCheck, a face is a collection of vertices
"""
- vertices : typing.List[DFVertex]
- joint_id : int=None
+ outer_loop : typing.List[DFVertex]
+ inner_loops : typing.List[typing.List[DFVertex]]
+ joint_id : int
def __post_init__(self):
- if len(self.vertices) < 3:
+ if len(self.outer_loop) < 3:
raise ValueError("A face must have at least 3 vertices")
- self.vertices = self.vertices or []
+ self.outer_loop = self.outer_loop
+ self.inner_loops = self.inner_loops or []
- self.joint_id = self.joint_id
+ self.joint_id = self.joint_id or None
self.__is_joint = False
self.__id = uuid.uuid4().int
+ self._hastenonmortise = len(self.inner_loops) > 0
+
+ self._brepface : rg.BrepFace = None
+
def __repr__(self):
- return f"Face vertices: {len(self.vertices)}"
+ return f"Face vertices: {len(self.outer_loop)}, Joint: {self.joint_id}, Inner loops: {len(self.inner_loops)}"
def __hash__(self):
- return hash((tuple(self.vertices), self.joint_id))
+ outer_loop = tuple(tuple(vertex.__dict__.values()) for vertex in self.outer_loop)
+ inner_loops = tuple(tuple(tuple(vertex.__dict__.values()) for vertex in loop) for loop in self.inner_loops)
+ return hash((outer_loop, inner_loops))
def __eq__(self, other):
if isinstance(other, DFFace):
- return self.vertices == other.vertices and self.joint_id == other.joint_id
+ is_outer_loop_equal = self.outer_loop == other.outer_loop
+ is_inner_loops_equal = self.inner_loops == other.inner_loops
+ return is_outer_loop_equal and is_inner_loops_equal
return False
@staticmethod
@@ -97,7 +115,8 @@ def from_brep(cls, brep_face: rg.BrepFace, joint_id: int=None):
:param joint_id: The joint id
:return face: The DFFace object
"""
- vertices = []
+ outer_loop = []
+
face_loop = brep_face.OuterLoop
face_loop_trims = face_loop.Trims
@@ -107,9 +126,27 @@ def from_brep(cls, brep_face: rg.BrepFace, joint_id: int=None):
for f_v in face_vertices:
vertex = DFVertex(f_v.X, f_v.Y, f_v.Z)
- vertices.append(vertex)
-
- return cls(vertices, joint_id)
+ outer_loop.append(vertex)
+
+ inner_loops = []
+
+ if brep_face.Loops.Count > 1:
+ face_loops = brep_face.Loops
+ for idx, loop in enumerate(face_loops):
+ loop_trims = loop.Trims
+ loop_curve = loop.To3dCurve()
+ loop_curve = loop_curve.ToNurbsCurve()
+ loop_vertices = loop_curve.Points
+ inner_loop = []
+ for l_v in loop_vertices:
+ vertex = DFVertex(l_v.X, l_v.Y, l_v.Z)
+ inner_loop.append(vertex)
+ inner_loops.append(inner_loop)
+
+ df_face = cls(outer_loop, inner_loops, joint_id)
+ df_face._brepface = brep_face
+
+ return df_face
def to_brep(self):
"""
@@ -117,11 +154,19 @@ def to_brep(self):
:return brep_face: The Rhino Brep planar face
"""
- vertices : rg.Point3d = [rg.Point3d(vertex.x, vertex.y, vertex.z) for vertex in self.vertices]
- polyline = rg.Polyline(vertices)
- face_brep = rg.Brep.CreatePlanarBreps([polyline.ToNurbsCurve()])[0]
+ # if the DFace was created from a brep face, return the brep face
+ if self._brepface is not None:
+ return self._brepface
+
+ # FIXME: the rebuilding of breps with multiple loops is not working yet
+ outer_vertices : rg.Point3d = [rg.Point3d(vertex.x, vertex.y, vertex.z) for vertex in self.outer_loop]
+ outer_polyline = rg.Polyline(outer_vertices)
+ outer_curve = outer_polyline.ToNurbsCurve()
+ outer_curve = rg.Curve.CreateControlPointCurve(outer_vertices, 1)
+ trim_loops.append(outer_curve)
+ outer_brep = rg.Brep.CreatePlanarBreps(outer_curve, Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance)[0]
- return face_brep
+ return outer_brep
@property
def is_joint(self):
@@ -135,6 +180,11 @@ def is_joint(self):
def id(self):
return self.__id
+ @property
+ def has_tenonmortise(self):
+ self._hastenonmortise = len(self.inner_loops) > 0
+ return self._hastenonmortise
+
@dataclass
class DFBeam:
@@ -189,6 +239,9 @@ def __post_init__(self):
self.beams = self.beams
self.name = self.name or "Unnamed Assembly"
+ self._all_jointfaces = []
+ self._all_sidefaces = []
+
def __repr__(self):
return f"Assembly: {self.name}, Beams: {len(self.beams)}"
@@ -216,15 +269,15 @@ def from_xml(cls, file_path: str):
beam = DFBeam(beam_elem.get("name"), [])
beam._DFBeam__id = int(beam_elem.get("id"))
for face_elem in beam_elem.findall("Face"):
- vertices = []
+ outer_loop = []
for vertex_elem in face_elem.findall("Vertex"):
vertex = DFVertex(
float(vertex_elem.get("x")),
float(vertex_elem.get("y")),
float(vertex_elem.get("z"))
)
- vertices.append(vertex)
- face = DFFace(vertices)
+ outer_loop.append(vertex)
+ face = DFFace(outer_loop)
face._DFFace__id = int(face_elem.get("id"))
face._DFFace__is_joint = bool(face_elem.get("is_joint"))
face_joint : str = face_elem.get("joint_id")
@@ -236,6 +289,7 @@ def from_xml(cls, file_path: str):
beams.append(beam)
return cls(beams, name)
+ # FIXME: to be reworked
def to_xml(self):
"""
Dump the assembly to an XML file
@@ -256,7 +310,7 @@ def to_xml(self):
face_elem.set("is_joint", str(face.is_joint))
face_elem.set("joint_id", str(face.joint_id))
# dfvertices
- for vertex in face.vertices:
+ for vertex in face.outer_loop:
vertex_elem = ET.SubElement(face_elem, "Vertex")
vertex_elem.set("x", str(vertex.x))
vertex_elem.set("y", str(vertex.y))
@@ -279,4 +333,16 @@ def dump(self, pretty_xml : str, dir: str):
file_path = os.path.join(dir, f"{self.name}_{timestamp}.xml")
with open(file_path, "w") as f:
- f.write(pretty_xml)
\ No newline at end of file
+ f.write(pretty_xml)
+
+ @property
+ def all_joint_faces(self):
+ for beam in self.beams:
+ self._all_jointfaces.extend(beam.joint_faces)
+ return self._all_jointfaces
+
+ @property
+ def all_side_faces(self):
+ for beam in self.beams:
+ self._all_sidefaces.extend(beam.side_faces)
+ return self._all_sidefaces
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck/diffCheck_app.py
index 1850d9b6..f9935646 100644
--- a/src/gh/diffCheck/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck/diffCheck_app.py
@@ -39,11 +39,8 @@
o_xml = xml
# show the joint/side faces
- joints_faces_breps = []
- sides_faces_breps = []
- for beam in beams:
- joints_faces_breps.extend([face.to_brep() for face in beam.joint_faces])
- sides_faces_breps.extend([face.to_brep() for face in beam.side_faces])
+ joints_faces_breps = [jf.to_brep() for jf in assembly1.all_joint_faces]
+ sides_faces_breps = [sf.to_brep() for sf in assembly1.all_side_faces]
o_joints = joints_faces_breps
o_sides = sides_faces_breps
\ No newline at end of file
From 69262c853945c6c6b5f21cd7448ee659ed7aa57e Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Wed, 10 Apr 2024 15:19:32 +0200
Subject: [PATCH 029/141] WIP-CAP: solved DFace-brep convertion, adapting
exporting new structure now
---
src/gh/diffCheck/diffCheck/df_geometries.py | 190 +++++++++-----------
src/gh/diffCheck/diffCheck/diffCheck_app.py | 8 +-
src/gh/diffCheck/diffCheck/test.py | 9 +
3 files changed, 98 insertions(+), 109 deletions(-)
create mode 100644 src/gh/diffCheck/diffCheck/test.py
diff --git a/src/gh/diffCheck/diffCheck/df_geometries.py b/src/gh/diffCheck/diffCheck/df_geometries.py
index 6a021500..15dc2e28 100644
--- a/src/gh/diffCheck/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/diffCheck/df_geometries.py
@@ -59,38 +59,31 @@ def to_rg_point3d(self):
@dataclass
class DFFace:
"""
- This class represents a face, in diffCheck, a face is a collection of vertices
+ This class represents a face, in diffCheck, a face is a collection of vertices.
"""
- outer_loop : typing.List[DFVertex]
- inner_loops : typing.List[typing.List[DFVertex]]
+ # just as breps a first outer loop and then inner loops of DFVertices
+ all_loops : typing.List[typing.List[DFVertex]]
joint_id : int
def __post_init__(self):
- if len(self.outer_loop) < 3:
+ if len(self.all_loops[0]) < 3:
raise ValueError("A face must have at least 3 vertices")
- self.outer_loop = self.outer_loop
- self.inner_loops = self.inner_loops or []
+ self.all_loops = self.all_loops or []
self.joint_id = self.joint_id or None
self.__is_joint = False
self.__id = uuid.uuid4().int
- self._hastenonmortise = len(self.inner_loops) > 0
-
- self._brepface : rg.BrepFace = None
-
def __repr__(self):
- return f"Face vertices: {len(self.outer_loop)}, Joint: {self.joint_id}, Inner loops: {len(self.inner_loops)}"
+ return f"Face id: {len(self.id)}, IsJoint: {self.is_joint} Loops: {len(self.all_loops)}"
def __hash__(self):
- outer_loop = tuple(tuple(vertex.__dict__.values()) for vertex in self.outer_loop)
- inner_loops = tuple(tuple(tuple(vertex.__dict__.values()) for vertex in loop) for loop in self.inner_loops)
+ outer_loop = tuple(tuple(vertex.__dict__.values()) for vertex in self.all_loops[0])
+ inner_loops = tuple(tuple(vertex.__dict__.values()) for loop in self.all_loops[1:] for vertex in loop)
return hash((outer_loop, inner_loops))
def __eq__(self, other):
if isinstance(other, DFFace):
- is_outer_loop_equal = self.outer_loop == other.outer_loop
- is_inner_loops_equal = self.inner_loops == other.inner_loops
- return is_outer_loop_equal and is_inner_loops_equal
+ return self.all_loops == other.all_loops
return False
@staticmethod
@@ -115,35 +108,20 @@ def from_brep(cls, brep_face: rg.BrepFace, joint_id: int=None):
:param joint_id: The joint id
:return face: The DFFace object
"""
- outer_loop = []
-
- face_loop = brep_face.OuterLoop
- face_loop_trims = face_loop.Trims
-
- face_curve_loop = brep_face.OuterLoop.To3dCurve()
- face_curve_loop = face_curve_loop.ToNurbsCurve()
- face_vertices = face_curve_loop.Points
-
- for f_v in face_vertices:
- vertex = DFVertex(f_v.X, f_v.Y, f_v.Z)
- outer_loop.append(vertex)
-
- inner_loops = []
-
- if brep_face.Loops.Count > 1:
- face_loops = brep_face.Loops
- for idx, loop in enumerate(face_loops):
- loop_trims = loop.Trims
- loop_curve = loop.To3dCurve()
- loop_curve = loop_curve.ToNurbsCurve()
- loop_vertices = loop_curve.Points
- inner_loop = []
- for l_v in loop_vertices:
- vertex = DFVertex(l_v.X, l_v.Y, l_v.Z)
- inner_loop.append(vertex)
- inner_loops.append(inner_loop)
-
- df_face = cls(outer_loop, inner_loops, joint_id)
+ all_loops = []
+
+ for idx, loop in enumerate(brep_face.Loops):
+ loop_trims = loop.Trims
+ loop_curve = loop.To3dCurve()
+ loop_curve = loop_curve.ToNurbsCurve()
+ loop_vertices = loop_curve.Points
+ loop = []
+ for l_v in loop_vertices:
+ vertex = DFVertex(l_v.X, l_v.Y, l_v.Z)
+ loop.append(vertex)
+ all_loops.append(loop)
+
+ df_face = cls(all_loops, joint_id)
df_face._brepface = brep_face
return df_face
@@ -154,19 +132,26 @@ def to_brep(self):
:return brep_face: The Rhino Brep planar face
"""
- # if the DFace was created from a brep face, return the brep face
- if self._brepface is not None:
- return self._brepface
+ brep_curves = []
+
+ for loop in self.all_loops:
+ inner_vertices = [rg.Point3d(vertex.x, vertex.y, vertex.z) for vertex in loop]
+ inner_polyline = rg.Polyline(inner_vertices)
+ inner_curve = inner_polyline.ToNurbsCurve()
+ brep_curves.append(inner_curve)
+
+ brep = rg.Brep.CreatePlanarBreps(brep_curves, Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance)[0]
+
+ return brep
- # FIXME: the rebuilding of breps with multiple loops is not working yet
- outer_vertices : rg.Point3d = [rg.Point3d(vertex.x, vertex.y, vertex.z) for vertex in self.outer_loop]
- outer_polyline = rg.Polyline(outer_vertices)
- outer_curve = outer_polyline.ToNurbsCurve()
- outer_curve = rg.Curve.CreateControlPointCurve(outer_vertices, 1)
- trim_loops.append(outer_curve)
- outer_brep = rg.Brep.CreatePlanarBreps(outer_curve, Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance)[0]
+ def to_mesh(self):
+ """
+ Convert the face to a Rhino Mesh
- return outer_brep
+ :return mesh: The Rhino Mesh object
+ """
+ mesh = self.to_brep().GetMesh(rg.MeshType.Default)
+ return mesh
@property
def is_joint(self):
@@ -180,11 +165,6 @@ def is_joint(self):
def id(self):
return self.__id
- @property
- def has_tenonmortise(self):
- self._hastenonmortise = len(self.inner_loops) > 0
- return self._hastenonmortise
-
@dataclass
class DFBeam:
@@ -251,43 +231,43 @@ def add_beam(self, beam: DFBeam):
def remove_beam(self, beam_id: int):
self.beams = [beam for beam in self.beams if beam.id != beam_id]
- @classmethod
- def from_xml(cls, file_path: str):
- """
- Create an assembly from an XML file
-
- :param file_path: The path to the XML file
- :return assembly: The assembly object
- """
- # parse the XML file
- tree = ET.parse(file_path)
- root = tree.getroot()
- beams : typing.List[DFBeam] = []
+ # @classmethod
+ # def from_xml(cls, file_path: str):
+ # """
+ # Create an assembly from an XML file
+
+ # :param file_path: The path to the XML file
+ # :return assembly: The assembly object
+ # """
+ # # parse the XML file
+ # tree = ET.parse(file_path)
+ # root = tree.getroot()
+ # beams : typing.List[DFBeam] = []
- name = root.get("name")
- for beam_elem in root.findall("Beam"):
- beam = DFBeam(beam_elem.get("name"), [])
- beam._DFBeam__id = int(beam_elem.get("id"))
- for face_elem in beam_elem.findall("Face"):
- outer_loop = []
- for vertex_elem in face_elem.findall("Vertex"):
- vertex = DFVertex(
- float(vertex_elem.get("x")),
- float(vertex_elem.get("y")),
- float(vertex_elem.get("z"))
- )
- outer_loop.append(vertex)
- face = DFFace(outer_loop)
- face._DFFace__id = int(face_elem.get("id"))
- face._DFFace__is_joint = bool(face_elem.get("is_joint"))
- face_joint : str = face_elem.get("joint_id")
- if face_joint != "None":
- face.joint_id = int(face_joint)
- else:
- face.joint_id = None
- beam.faces.append(face)
- beams.append(beam)
- return cls(beams, name)
+ # name = root.get("name")
+ # for beam_elem in root.findall("Beam"):
+ # beam = DFBeam(beam_elem.get("name"), [])
+ # beam._DFBeam__id = int(beam_elem.get("id"))
+ # for face_elem in beam_elem.findall("Face"):
+ # outer_loop = []
+ # for vertex_elem in face_elem.findall("Vertex"):
+ # vertex = DFVertex(
+ # float(vertex_elem.get("x")),
+ # float(vertex_elem.get("y")),
+ # float(vertex_elem.get("z"))
+ # )
+ # outer_loop.append(vertex)
+ # face = DFFace(outer_loop)
+ # face._DFFace__id = int(face_elem.get("id"))
+ # face._DFFace__is_joint = bool(face_elem.get("is_joint"))
+ # face_joint : str = face_elem.get("joint_id")
+ # if face_joint != "None":
+ # face.joint_id = int(face_joint)
+ # else:
+ # face.joint_id = None
+ # beam.faces.append(face)
+ # beams.append(beam)
+ # return cls(beams, name)
# FIXME: to be reworked
def to_xml(self):
@@ -296,11 +276,11 @@ def to_xml(self):
:return xml_string: The pretty XML string
"""
- root = ET.Element("Assembly")
+ root = ET.Element("DFAssembly")
root.set("name", self.name)
# dfbeams
for beam in self.beams:
- beam_elem = ET.SubElement(root, "Beam")
+ beam_elem = ET.SubElement(root, "DFBeam")
beam_elem.set("name", beam.name)
beam_elem.set("id", str(beam.id))
# dffaces
@@ -310,11 +290,13 @@ def to_xml(self):
face_elem.set("is_joint", str(face.is_joint))
face_elem.set("joint_id", str(face.joint_id))
# dfvertices
- for vertex in face.outer_loop:
- vertex_elem = ET.SubElement(face_elem, "Vertex")
- vertex_elem.set("x", str(vertex.x))
- vertex_elem.set("y", str(vertex.y))
- vertex_elem.set("z", str(vertex.z))
+ for loop in face.all_loops:
+ for vertex in loop:
+ vertex_elem = ET.SubElement(face_elem, "DFVertex")
+ vertex_elem.set("x", str(vertex.x))
+ vertex_elem.set("y", str(vertex.y))
+ vertex_elem.set("z", str(vertex.z))
+
tree = ET.ElementTree(root)
xml_string = ET.tostring(root, encoding='unicode')
dom = parseString(xml_string)
diff --git a/src/gh/diffCheck/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck/diffCheck_app.py
index f9935646..055284e3 100644
--- a/src/gh/diffCheck/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck/diffCheck_app.py
@@ -2,7 +2,6 @@
import Rhino
import Rhino.Geometry as rg
-import scriptcontext as sc
import os
import typing
@@ -39,8 +38,7 @@
o_xml = xml
# show the joint/side faces
- joints_faces_breps = [jf.to_brep() for jf in assembly1.all_joint_faces]
- sides_faces_breps = [sf.to_brep() for sf in assembly1.all_side_faces]
+ o_joints = [jf.to_brep() for jf in assembly1.all_joint_faces]
+ o_sides = [sf.to_brep() for sf in assembly1.all_side_faces]
- o_joints = joints_faces_breps
- o_sides = sides_faces_breps
\ No newline at end of file
+ o_test1 = beams[0].faces[7].to_brep()
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/test.py b/src/gh/diffCheck/diffCheck/test.py
new file mode 100644
index 00000000..690fcb0d
--- /dev/null
+++ b/src/gh/diffCheck/diffCheck/test.py
@@ -0,0 +1,9 @@
+#! python3
+
+import rhinoscriptsyntax as rs
+import scriptcontext as sc
+import Rhino
+
+tol=sc.doc.ModelAbsoluteTolerance
+breps = Rhino.Geometry.Brep.CreatePlanarBreps(i_crvs, tol)
+o_brep = breps[0]
\ No newline at end of file
From 93a5a0a2243d61b0341c691a7cb23fb36572e6cb Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Wed, 10 Apr 2024 15:26:01 +0200
Subject: [PATCH 030/141] ADD: meshing DFace convertion
---
src/gh/diffCheck/diffCheck/df_geometries.py | 2 +-
src/gh/diffCheck/diffCheck/diffCheck_app.py | 4 +---
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/gh/diffCheck/diffCheck/df_geometries.py b/src/gh/diffCheck/diffCheck/df_geometries.py
index 15dc2e28..eaf9c386 100644
--- a/src/gh/diffCheck/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/diffCheck/df_geometries.py
@@ -150,7 +150,7 @@ def to_mesh(self):
:return mesh: The Rhino Mesh object
"""
- mesh = self.to_brep().GetMesh(rg.MeshType.Default)
+ mesh = rg.Mesh.CreateFromBrep(self.to_brep())[0]
return mesh
@property
diff --git a/src/gh/diffCheck/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck/diffCheck_app.py
index 055284e3..b665917f 100644
--- a/src/gh/diffCheck/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck/diffCheck_app.py
@@ -39,6 +39,4 @@
# show the joint/side faces
o_joints = [jf.to_brep() for jf in assembly1.all_joint_faces]
- o_sides = [sf.to_brep() for sf in assembly1.all_side_faces]
-
- o_test1 = beams[0].faces[7].to_brep()
\ No newline at end of file
+ o_sides = [sf.to_brep() for sf in assembly1.all_side_faces]
\ No newline at end of file
From a39080b7640981c1d1e88d798c58ef9bb070f6f3 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Wed, 10 Apr 2024 17:07:28 +0200
Subject: [PATCH 031/141] CAP: exporter source code in decent state
---
src/gh/diffCheck/diffCheck/df_geometries.py | 69 +-
src/gh/diffCheck/diffCheck/diffCheck_app.py | 2 +-
src/gh/tester.ghx | 847 ++++++++++++++++++--
3 files changed, 811 insertions(+), 107 deletions(-)
diff --git a/src/gh/diffCheck/diffCheck/df_geometries.py b/src/gh/diffCheck/diffCheck/df_geometries.py
index eaf9c386..2097d932 100644
--- a/src/gh/diffCheck/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/diffCheck/df_geometries.py
@@ -231,48 +231,10 @@ def add_beam(self, beam: DFBeam):
def remove_beam(self, beam_id: int):
self.beams = [beam for beam in self.beams if beam.id != beam_id]
- # @classmethod
- # def from_xml(cls, file_path: str):
- # """
- # Create an assembly from an XML file
-
- # :param file_path: The path to the XML file
- # :return assembly: The assembly object
- # """
- # # parse the XML file
- # tree = ET.parse(file_path)
- # root = tree.getroot()
- # beams : typing.List[DFBeam] = []
-
- # name = root.get("name")
- # for beam_elem in root.findall("Beam"):
- # beam = DFBeam(beam_elem.get("name"), [])
- # beam._DFBeam__id = int(beam_elem.get("id"))
- # for face_elem in beam_elem.findall("Face"):
- # outer_loop = []
- # for vertex_elem in face_elem.findall("Vertex"):
- # vertex = DFVertex(
- # float(vertex_elem.get("x")),
- # float(vertex_elem.get("y")),
- # float(vertex_elem.get("z"))
- # )
- # outer_loop.append(vertex)
- # face = DFFace(outer_loop)
- # face._DFFace__id = int(face_elem.get("id"))
- # face._DFFace__is_joint = bool(face_elem.get("is_joint"))
- # face_joint : str = face_elem.get("joint_id")
- # if face_joint != "None":
- # face.joint_id = int(face_joint)
- # else:
- # face.joint_id = None
- # beam.faces.append(face)
- # beams.append(beam)
- # return cls(beams, name)
-
- # FIXME: to be reworked
def to_xml(self):
"""
- Dump the assembly to an XML file
+ Dump the assembly's meshes to an XML file. On top of the DiffCheck datatypes and structure,
+ we export the underlaying beams's meshes from Rhino as vertices and faces.
:return xml_string: The pretty XML string
"""
@@ -285,17 +247,26 @@ def to_xml(self):
beam_elem.set("id", str(beam.id))
# dffaces
for face in beam.faces:
- face_elem = ET.SubElement(beam_elem, "Face")
+ face_elem = ET.SubElement(beam_elem, "DFFace")
face_elem.set("id", str(face.id))
face_elem.set("is_joint", str(face.is_joint))
face_elem.set("joint_id", str(face.joint_id))
- # dfvertices
- for loop in face.all_loops:
- for vertex in loop:
- vertex_elem = ET.SubElement(face_elem, "DFVertex")
- vertex_elem.set("x", str(vertex.x))
- vertex_elem.set("y", str(vertex.y))
- vertex_elem.set("z", str(vertex.z))
+ # export linked mesh
+ facerhmesh_elem = ET.SubElement(face_elem, "RhMesh")
+ mesh = face.to_mesh()
+ mesh_vertices = mesh.Vertices
+ for idx, vertex in enumerate(mesh_vertices):
+ facerhmesh_vertex_elem = ET.SubElement(facerhmesh_elem, "RhMeshVertex")
+ facerhmesh_vertex_elem.set("x", str(vertex.X))
+ facerhmesh_vertex_elem.set("y", str(vertex.Y))
+ facerhmesh_vertex_elem.set("z", str(vertex.Z))
+ mesh_faces = mesh.Faces
+ for idx, face in enumerate(mesh_faces):
+ facerhmesh_face_elem = ET.SubElement(facerhmesh_elem, "RhMeshFace")
+ facerhmesh_face_elem.set("v1", str(face.A))
+ facerhmesh_face_elem.set("v2", str(face.B))
+ facerhmesh_face_elem.set("v3", str(face.C))
+ facerhmesh_face_elem.set("v4", str(face.D))
tree = ET.ElementTree(root)
xml_string = ET.tostring(root, encoding='unicode')
@@ -304,7 +275,7 @@ def to_xml(self):
return pretty_xml
- def dump(self, pretty_xml : str, dir: str):
+ def dump_xml(self, pretty_xml : str, dir: str):
"""
Dump the pretty XML to a file
diff --git a/src/gh/diffCheck/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck/diffCheck_app.py
index b665917f..6ceffd75 100644
--- a/src/gh/diffCheck/diffCheck/diffCheck_app.py
+++ b/src/gh/diffCheck/diffCheck/diffCheck_app.py
@@ -34,7 +34,7 @@
# dump the xml
xml : str = assembly1.to_xml()
if i_dump:
- assembly1.dump(xml, i_export_dir)
+ assembly1.dump_xml(xml, i_export_dir)
o_xml = xml
# show the joint/side faces
diff --git a/src/gh/tester.ghx b/src/gh/tester.ghx
index f128de26..d414d451 100644
--- a/src/gh/tester.ghx
+++ b/src/gh/tester.ghx
@@ -49,10 +49,10 @@
-
- -12
- -118
+ 219
+ 14
- - 1.2750002
+ - 1.0837501
@@ -68,15 +68,16 @@
-
+
- F:\diffCheck\src\gh\diffCheck\diffCheck\diffCheck_app.py
+ - F:\diffCheck\src\gh\diffCheck\diffCheck\test.py
- - 2
+ - 3
-
+
- Robert McNeel & Associates
@@ -86,6 +87,14 @@
+
+ - Robert McNeel & Associates
+ - 00000000-0000-0000-0000-000000000000
+ - Grasshopper
+ - 8.4.24044.15001
+
+
+
- RhinoCodePluginGH, Version=8.4.24044.15001, Culture=neutral, PublicKeyToken=552281e97c755530
- 8.4.24044.15001
@@ -99,9 +108,9 @@
- - 19
+ - 27
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
@@ -561,10 +570,10 @@
- - 5
+ - 6
- {0}
-
+
- ba3151fb-3a8e-46c1-bdba-27ad41a4d1a2
@@ -572,17 +581,17 @@
- - 7fc04154-255a-413f-a8a1-6ea034e1e779
+ - aa56315b-2905-4049-8c41-0cc8b39d864b
- - aa56315b-2905-4049-8c41-0cc8b39d864b
+ - 322f4e22-d195-435e-b290-052cb2318277
- - 322f4e22-d195-435e-b290-052cb2318277
+ - 7fc04154-255a-413f-a8a1-6ea034e1e779
@@ -590,6 +599,11 @@
- 5981a85d-0063-489b-8bd7-7a1ebe1453a7
+
+
+ - aeae5255-2a74-4040-9e44-e3aedf934485
+
+
@@ -611,7 +625,7 @@
- Panel
- false
- - 0
+ - 0.8518518507480621
- 55cc2102-ec2b-4f6f-ba16-74e8aed9df42
- 1
- Double click to edit panel content…
@@ -1174,23 +1188,22 @@
-
+
- A panel for custom notes and text values
- 5262b483-9441-440a-a74d-8b235aad399d
- Panel
- false
- 1
- - 76758d37-2a1d-412d-b85b-149ecda8a020
- - 1
+ - 0
- Double click to edit panel content…
-
- 414
- 32
+ 494
+ 71
343
118
@@ -1198,8 +1211,8 @@
- 0
- 0
-
- 414.04675
- 32.380676
+ 494.05792
+ 71.25596
@@ -1227,9 +1240,8 @@
-
+
- Allows for customized geometry previews
- - true
- true
- 6f2c8a4b-d787-4606-9170-900f972641c6
- Custom Preview
@@ -1240,14 +1252,14 @@
-
- 935
- 81
+ 397
+ 180
48
44
-
- 969
- 103
+ 431
+ 202
@@ -1266,14 +1278,14 @@
-
- 937
- 83
+ 399
+ 182
17
20
-
- 947
- 93
+ 409
+ 192
@@ -1293,14 +1305,14 @@
-
- 937
- 103
+ 399
+ 202
17
20
-
- 947
- 113
+ 409
+ 212
@@ -1359,14 +1371,14 @@
-
- 953
- 153
+ 398
+ 227
48
44
-
- 987
- 175
+ 432
+ 249
@@ -1385,14 +1397,14 @@
-
- 955
- 155
+ 400
+ 229
17
20
-
- 965
- 165
+ 410
+ 239
@@ -1412,14 +1424,14 @@
-
- 955
- 175
+ 400
+ 249
17
20
-
- 965
- 185
+ 410
+ 259
@@ -1481,14 +1493,14 @@
-
- 834
- 103
+ 271
+ 202
88
20
-
- 834.6667
- 103.333336
+ 271.80634
+ 202.06458
@@ -1574,7 +1586,7 @@
- false
- - F:\__TEMP\test\
+ - F:\diffCheck\temp\
@@ -1659,17 +1671,738 @@
-
- 856
- 181
+ 273
+ 249
+ 88
+ 20
+
+ -
+ 273.53714
+ 249.41264
+
+
+
+
+
+
+
+
+
+ - 537b0419-bbc2-4ff4-bf08-afe526367b2c
+ - Custom Preview
+
+
+
+
+ - Allows for customized geometry previews
+ - true
+ - f2ae36bd-8b62-496c-ac97-17ab79c53f42
+ - Custom Preview
+ - Preview
+
+
+
+
+
+ -
+ 590
+ 220
+ 48
+ 44
+
+ -
+ 624
+ 242
+
+
+
+
+
+ - Geometry to preview
+ - true
+ - 85ca540e-0ffd-46e5-b014-a0ddacc0562b
+ - Geometry
+ - G
+ - false
+ - 0
+
+
+
+
+ -
+ 592
+ 222
+ 17
+ 20
+
+ -
+ 602
+ 232
+
+
+
+
+
+
+
+ - The material override
+ - 6d95716c-757a-4c8f-8bb0-1685e7e04a52
+ - Material
+ - M
+ - false
+ - 83adf7c8-580d-4af6-a713-84bf5f8bd2d3
+ - 1
+
+
+
+
+ -
+ 592
+ 242
+ 17
+ 20
+
+ -
+ 602
+ 252
+
+
+
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
+
+
+
+
+ -
+ 255;221;160;221
+
+ -
+ 255;66;48;66
+
+ - 0.5
+ -
+ 255;255;255;255
+
+ - 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 9c53bac0-ba66-40bd-8154-ce9829b9db1a
+ - Colour Swatch
+
+
+
+
+ - Colour (palette) swatch
+ - 83adf7c8-580d-4af6-a713-84bf5f8bd2d3
+ - Colour Swatch
+ - Swatch
+ - false
+ - 0
+ -
+ 255;255;0;0
+
+
+
+
+
+ -
+ 465
+ 242
88
20
-
- 856.6275
- 181.76471
+ 465.53714
+ 242.746
+
+
+
+
+
+
+
+
+
+ - a8b97322-2d53-47cd-905e-b932c3ccd74e
+ - Button
+
+
+
+
+ - Button object with two values
+ - False
+ - True
+ - 748edcb1-58e5-403f-83e3-9b75ee2319c3
+ - Button
+
+ - false
+ - 0
+
+
+
+
+ -
+ -320
+ 119
+ 66
+ 22
+
+
+
+
+
+
+
+
+
+ - c9b2d725-6f87-4b07-af90-bd9aefef68eb
+ - 066d0a87-236f-4eae-a0f4-9e42f5327962
+ - script-sync cpython
+
+
+
+
+ - This allows to run the current active cpython file from vscode to grasshopper.
+ - true
+ - 2
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABhmlDQ1BJQ0MgcHJvZmlsZQAAKM+VkTtIw1AUhv+mSkUqDhZ84JChCoIFURFHiWIRLJS2QqsOJjd9QZOGJMXFUXAtOPhYrDq4OOvq4CoIgg8QZwcnRRcp8dyk0CJU8MDlfvz3/j/nngsItRLTrI4JQNNtMxGVxHRmVQy8wodB9EPAmMwsI5ZcTKFtfd3Tbaq7CM/C/6pHzVoM8InEc8wwbeIN4plN2+C8TxxiBVklPiceN6lB4keuKx6/cc67LPDMkJlKzBOHiMV8CystzAqmRjxNHFY1nfKFtMcq5y3OWqnCGn3yFwaz+kqS67SGEcUSYohDhIIKiijBRoR2nRQLCTqX2viHXH+cXAq5imDkWEAZGmTXD/4Hv2dr5aYmvaSgBHS+OM7HCBDYBepVx/k+dpz6CeB/Bq70pr9cA2Y/Sa82tfAR0LsNXFw3NWUPuNwBBp4M2ZRdyU9LyOWA9zP6pgzQdwt0r3lza5zj9AFI0ayWb4CDQ2A0T9nrbd7d1Tq3P++484P0A3o2cqrMnZbPAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAB3RJTUUH6AEZFwkM569AfQAABNpJREFUSEu9kntMU3cYhguoOOZ1ujmFXqQtBcEpIwoTxOGQolLwUp24OFS0sEqh0oIV0CIg1FLKsbTlNooFKhRF8TajziW6zYFxcckW9bhlm9uiLk6nAyuWy7tTc0iI4w9l2Z7k++/7nveX9xzGfw+LWMhgV4hd48Y2iN1ZBvEoFiH2ZOrFXkydeJzPvsn05ghhmxIZnCq4xo1TCXe2GaPZJniyKvAqi8AEps5Eb/4LOJVfDQZ4PAswYizLgHHMckxi6vqmeJfMpjdHCNscQgUMDAaMoQJeoQLGUwGTfXR43bvkM3pz5LhxzHXuVMAoqp4x7Ap4sfZT9ejxmk8ppnlrEDE142bCxA3k2vHryKSZYnJrcPxS+vTFcGMR09w55keuAFf/Xs/612OKjxZvepdAMF2NFROT8IHv+5CEroZskeiaJC7Cgz5/MTzYRsVg/64PPJFZhqlUwHTvYrBmFGBZsAybw9ZCGr0SyhXLoVobk0Gfvhju/CJPD2GnY7SwE57CDngJL2FCzBeYsuQC/OM/Rdiq45AsWQP5ygSoEpdi94fRDyslc6SWNH9pvVwgtWb7SQ/k8CfRumHY2ithpACD45YyAA9JP3ykPQiQdSNh4zlsS1gFZaIIuZuEKEx5DwZZKKyZAWhUCdC0i5o9fIK2Pcfm7gmMlIF7zwd4b3MiMMOBhdvvQLJ6C+TrV0CVvBz5qTEoTo+CThmBAzlBaNotgK3AD80av97mUt4s2joESX/ZULlr3pD2I1Deg/nKLiQmN0O2Xoys5HjsksaiUB6Nfcp3UZ67ANX5IThYRMn38dFSxoed4J+lrTRbngio1zuHyid9NABeei+CFQ5EZ91FcsZZyBTtUGUfRGFuLXRqAuaCEtQX51GvlqCllBLr+Wg18HDIzIO9xnc5baeQ9J0YKncNU9aPOYoeLNzZhXWZV5CiOI3MHW3Iy21AsboSRIEe1ZpCNGh3okUXjhaCkhspeRUPh2u5aLNwb1isM0a7Xi98Xj49rR8CuRPvqBxYtuNXbFKcR5rqBLLz7MjPt0BbZIRRo0WdLh82fRLs+/k4ZKLk1ZT4Yy6O1FPT6IujzTMzqT/HGUv1nzp0eOnO1JAsR+rinPuZiYrOPonqLOS57chRH8TevbUo01D16IrRSOSgwxCJK6ZgXK2ZjW/rZuGa1Q+kjYfvW7i40ep7ne5oeNbIL6mTsi9gW95pKNVtUBc1QKOpwn5dGarLC3GxYiN+Mkfgds183LcEo8sahB6bP3rtfAwc5qK3nbORVv0TUdpF1jplx+OtueeRvvskVIV2FJTUQ1tqgpHQotm4EzeMi3GrKhx36+bhgXUuum2B6LEL0NfGQ/8x38u0anhWbe/Yu0H1OZm66wyZuecomVfSRBZpa0h9OUGaK4rJL43rcbN6EX6xhOF3awge2mbjcWsAnrb5oe84F49PcUJp1ctz2SCM+64qGj/URuK3A6G4Z5uLR/YgONoEcB7jwXlqZiO9+vKcIaLHfG2KJa/VLMaPlnDcts3DHy1z8NfhQDxp96Pk3O77Z9gz6PWXp7MiTnG1MhbX66Lwc8MC3GkOwYNDb6GrPQA9J/lwnPbNo1dHRqdJFPVNbYyItEaKbjWFie62vi3680iQqPu4v+jpJzzRg3PssfTq/wGD8Tedsdp6457pjwAAAABJRU5ErkJggg==
+
+ - e0bfe966-26b9-4831-8ac9-46df1627f515
+ - true
+ - true
+ - true
+ - script-sync cpython
+ - scsy-cpy
+
+ - false
+ - false
+ - false
+
+
+
+
+ -
+ -232
+ 118
+ 111
+ 44
+
+ -
+ -182
+ 140
+
+
+ - 2
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 2
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+
+
+
+
+ - true
+ - Connect a button to open a file dialog to select a cpython file to run.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC
+
+ - 723aff78-609c-4ce8-bc1c-cac8178e9846
+ - btn
+ - btn
+ - true
+ - 0
+ - true
+ - 748edcb1-58e5-403f-83e3-9b75ee2319c3
+ - 1
+ - Connect a button to open a file dialog to select a cpython file to run.
+ - d60527f5-b5af-4ef6-8970-5f96fe412559
+
+
+
+
+ -
+ -230
+ 120
+ 33
+ 20
+
+ -
+ -212
+ 130
+
+
+
+
+
+
+
+ - 1
+ - true
+ - A generic x input.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5Hz+Xw+5HwsF3LIZIuIG0lusUuulMmWHC6c4sYhkVxIkkJcaQ8p4VYxeyvTKmuN2cbume95raVpm723uZrmrTe/9f//877v8zzv92v+qwgyMzP7Xf3Fv8ifVL4urKysPkxOTuLg4AB7e3vY3t7GxsYGVlZWMDs7i/7+frS0tKCsrAyZmZkIDg6GauhX9ar2CeE7YWFhUa5e/HNmZgapqamSKSkpSEpKQkJCAmJjYxEVFYWwsDAB9vf3R15eHtzd3Q3m5ubvjDDfDK29vf3twsICqqqqpDtmRkaGFGKR+Ph4REdHIyIiAiEhIQgMDERlZSWmpqagChgUxpsnqH8IS0vLvqampsfe3l5kZWUhJydHktcsUlJSgpGRESwvL2NgYAChoaFSwM/PD+fn51DNfVZUrRrhXkSQh4fHH8PDwygoKBDg/Px8SV4PDQ2JBh0dHaitrcXp6alcBwUFIS4uDgxvb29qwSkSnyD/For7PY7Kl0mLqQCF5Pj8nTQlJiYK4ObmJnp6eqRAV1cX9Ho9PD094ejo+EUV+cUI+xxlLi4u9zU1NQJCOkhLRUUFxsbGpFB7ezsWFxfl9+zsbBgMBikeGRmJq6srHB0dQTEAX19fKBfqFebbJ2glrOr+Y1paGpgUkkWKi4sxMTEh4Kurq2hra0Nubq48Q6p2dnZE5OnpaaFncHCQTpIi1ERN8ZvCttEo5XucnZ3v+SItSCuyyNzcnABubW0JPSab0gA6nU6s2djYiMfHRzw8PCA5ORlubm5wcnIS4dU1F/W9RlXShYeHi7eZLNLd3S0CEowdknfac3x8HPf396irq5PJbm9vpfvR0VHh39XVlRpIoZiYGG63jgXeK3sZ6G0W4o39/X0pxA1uaGgQe66vr+P6+hqtra1IT0/HxcWFgJ+dnSEgIEDoUUzAwcFBcHx8fDjBzyo1NuSLG8ntrK+vl+OA4nECBinhJKSItNExDBbkdOSd3ZMeTsLNV7o+aWCMt1qtVk/R+vr6npeIBZm85r3m5mbc3NwI+N3dnbiJgKTE1D0Nov7nLjy7SILe5YOdnZ3Y3d0VoehxZlFREdbW1gSYwYOPBb8G57NK7C8K7sUeMFJ4lnCJKN7h4SHm5+dxfHxshAUuLy9FAy8vL6HFBE5hSQ8bsbOzI/cvN5mhplhVD36mQ5aWlnByciLJa3VGUTjpmoKSc1PnClT0UQZ5UDDfPIsYbzgFxycYuzQlQdmxCZgdK/fB1tZW7nOrlY7fP02N8U6NbKCL1PHxnCZQ0mHq2sbGBtbW1rITSjOC//B7wNAqqj7xvKff6RQCkN/S0lLptLy8XL4B1dXV4PlVWFj4+i+aMfh9/fqb+6N8/Tf5fxQazV+PmcVeVawFwQAAAABJRU5ErkJggg==
+
+ - 23c7ad3d-125c-4b83-82c2-8433f5ddf85f
+ - i_crvs
+ - i_crvs
+ - true
+ - 1
+ - true
+ - 84780236-6585-42d5-b303-6e93a13af1b5
+ - 1
+ - A generic x input.
+ - 9ba89ec2-5315-435f-a621-b66c5fa2f301
+
+
+
+
+ -
+ -230
+ 140
+ 33
+ 20
+
+ -
+ -212
+ 150
+
+
+
+
+
+
+
+ - false
+ - The redirected standard output of the component scriptsync.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - bc0b23c8-8d5e-4b50-a901-58cc919b8362
+ - stdout
+ - stdout
+ - false
+ - 0
+ - true
+ - 0
+ - The redirected standard output of the component scriptsync.
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ -167
+ 120
+ 44
+ 20
+
+ -
+ -145
+ 130
+
+
+
+
+
+
+
+ - false
+ - Generic example output of the component
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 9bfd0091-47fb-4749-8c63-cc0b3f284701
+ - o_brep
+ - o_brep
+ - false
+ - 0
+ - true
+ - 0
+ - Generic example output of the component
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ -167
+ 140
+ 44
+ 20
+
+ -
+ -145
+ 150
+
+
+
+
+
+
+
+
+
+ - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHVzZSB0aGUgbW9kdWxlcwogICAgICAgICAgICAgICAgcGF0aF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwYXRoX2RpcikKICAgICAgICAgICAgICAgIHNlbGYucmVsb2FkX2FsbF9tb2R1bGVzKHBhdGhfZGlyKQoKICAgICAgICAgICAgICAgICMgcGFyc2UgdGhlIGNvZGUKICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCgogICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgcXVldWUgYW5kIGV2ZW50CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYucXVldWVfbXNnX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLmdldCgpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnRhc2tfZG9uZSgpCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgdGhlIGNvZGUKICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRvdXQob3V0cHV0KToKICAgICAgICAgICAgICAgICAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKICAgICAgICAgICAgICAgIGxvY2Fsc1sic3Rkb3V0Il0gPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgICAgICAgICAgICAgICMgc2VuZCB0aGUgbXNnIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogb3V0cHV0LmdldHZhbHVlKCl9KQogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBtc2dfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChtc2dfanNvbikKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKCiAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNjcmlwdCB2YXJpYWJsZXMgdG8gdGhlIEdIIGNvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgICAgICBvdXRwYXJhbSA9IGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0CiAgICAgICAgICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgICAgICAgICAgZm9yIG91dHAgaW4gb3V0cGFyYW1fbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0cCBpbiBsb2NhbHMua2V5cygpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChsb2NhbHNbb3V0cF0pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQoTm9uZSkKCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KICAgICAgICAgICAgcmV0dXJuIGxvY2FscwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgogICAgICAgICAgICAjIHNlbmQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgZXJyX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6ICJlcnI6IiArIHN0cihlKX0pCiAgICAgICAgICAgIGVycl9qc29uID0gZXJyX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChlcnJfanNvbikKICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQogICAgICAgICAgICAKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCgogICAgICAgICAgICBlcnJfbXNnID0gZiJzY3JpcHQtc3luYzo6RXJyb3IgaW4gdGhlIGNvZGU6IHtzdHIoZSl9IgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oZXJyX21zZykKCiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsCiAgICAgICAgICAgIGJ0bjogYm9vbCwKICAgICAgICAgICAgaV9jcnZzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JTGlzdFtSaGluby5HZW9tZXRyeS5DdXJ2ZV0pOgogICAgICAgICIiIiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIGl0J3MgdGhlIHNvbHZlIG1haW4gaW5zdGFuY2UuICIiIgoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICAjIHNldCB0aGUgcGF0aCBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIHNlbGYuaW5pdF9zY3JpcHRfcGF0aChidG4pCgogICAgICAgICMgZmlsZSBjaGFuZ2UgbGlzdGVuZXIgdGhyZWFkCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBGaWxlQ2hhbmdlZFRocmVhZChzZWxmLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgc2V0IHVwIHRoZSB0Y3AgY2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICBfID0gW3ByaW50KHQubmFtZSkgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXQogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIENsaWVudFRocmVhZChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cKICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgYWRkIHRvIHRoZSBnbG9iYWxzIGFsbCB0aGUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgY29tcG9uZW50ICh0aGUgbG9jYWxzKQogICAgICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgogICAgICAgIHJlcyA9IHNlbGYuc2FmZV9leGVjKHNlbGYucGF0aCwgTm9uZSwgZ2xvYmFscygpKQogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IFRydWUKICAgICAgICByZXR1cm4KCiAgICBkZWYgQWZ0ZXJSdW5TY3JpcHQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBjb21wb25lbnQgaGFzIGZpbmlzaGVkCiAgICAgICAgICAgIGl0cyBjYWxjdWxhdGlvbi4gSXQgaXMgdXNlZCB0byBsb2FkIHRoZSBHSENvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgIHdpdGggdGhlIHZhbHVlcyBjcmVhdGVkIGluIHRoZSBzY3JpcHQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuaXNfc3VjY2VzczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgb3V0cGFyYW0gPSBbcCBmb3IgcCBpbiBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dF0KICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgIAogICAgICAgICMgVE9ETzogYWRkIHRoZSBjb252ZXJzaW9uIHRvIGRhdGF0cmVlIGZvciBuZXN0ZWQgbGlzdHMgYW5kIHR1cGxlcwogICAgICAgIGZvciBpZHgsIG91dHAgaW4gZW51bWVyYXRlKG91dHBhcmFtKToKICAgICAgICAgICAgIyBkZXRlY3QgaWYgdGhlIG91dHB1dCBpcyBhIGxpc3QKICAgICAgICAgICAgaWYgdHlwZShzZWxmLl92YXJfb3V0cHV0W2lkeF0pID09IGxpc3Qgb3IgdHlwZShzZWxmLl92YXJfb3V0cHV0W2lkeF0pID09IHR1cGxlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGFMaXN0KGdoLktlcm5lbC5EYXRhLkdIX1BhdGgoMCksIHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhKGdoLktlcm5lbC5EYXRhLkdIX1BhdGgoMCksIDAsIHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkKICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmNsZWFyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgdGFibGVfdmFsdWUgPSBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkdldFZhbHVlKAogICAgICAgICAgICBzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCAibm90X2ZvdW5kIgogICAgICAgICkKICAgICAgICBpZiB0YWJsZV92YWx1ZSAhPSAibm90X2ZvdW5kIjoKICAgICAgICAgICAgcmV0dXJuIHRhYmxlX3ZhbHVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcGF0aC5zZXR0ZXIKICAgIGRlZiBwYXRoKHNlbGYsIHBhdGggOiBzdHIpOgogICAgICAgICIiIiBTZXQgdGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuU2V0VmFsdWUoc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgcGF0aCkKCiAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk1lc3NhZ2UgPSBmIntzY3JpcHRfbmFtZX0iCgogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBfID0gW3QgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpIGlmIHQubmFtZSA9PSBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lXVswXS5zdG9wKCkKCiAgICBAcGF0aC5kZWxldGVyCiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgRGVsZXRlIHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgaWYgdGhlIG9iamVjdCBpcyBlcmFzZWQuICIiIgogICAgICAgIGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuRGVsZXRlVmFsdWUoc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSkK
+ - S
+
+
+
+
+ - *.*.python
+ - 3.*
+
+
+
+
+
+
+
+
+
+
+ - ac2bc2cb-70fb-4dd5-9c78-7e1ea97fe278
+ - Geometry
+
+
+
+
+ - Contains a collection of generic geometry
+ - 84780236-6585-42d5-b303-6e93a13af1b5
+ - Geometry
+ - Geo
+ - false
+ - 0
+
+
+
+
+ -
+ -333
+ 170
+ 50
+ 24
+
+ -
+ -307.33334
+ 182.66667
+
+
+
+
+
+ - 1
+
+
+
+
+ - 2
+ - {0}
+
+
+
+
+ - -1
+ - 9c64993e-eaa5-4262-82d7-af09e513cb01
+ - Grasshopper.Kernel.Types.GH_Curve
+
+
+
+
+ - -1
+ - 0ea4f4cd-08ba-4f88-96a5-de7e41140054
+ - Grasshopper.Kernel.Types.GH_Curve
+
+
+
+
+
+
+
+
+
+
+
+
+ - 59e0b89a-e487-49f8-bab8-b5bab16be14c
+ - Panel
+
+
+
+
+ - A panel for custom notes and text values
+ - 18fba923-3fa1-490c-b8ee-734fcc57d7fe
+ - Panel
+
+ - false
+ - 0
+ - 84780236-6585-42d5-b303-6e93a13af1b5
+ - 1
+ - Double click to edit panel content…
+
+
+
+
+ -
+ -338
+ 216
+ 160
+ 100
+
+ - 0
+ - 0
+ - 0
+
+
+
+
+ -
+ 255;213;217;232
+
+ - true
+ - true
+ - true
+ - false
+ - false
+ - true
+
+
+
+
+
+
+
+
+ - afb96615-c59a-45c9-9cac-e27acb1c7ca0
+ - Explode
+
+
+
+
+ - Explode a curve into smaller segments.
+ - 6126e53b-589a-4de2-aaff-78a92605cf7a
+ - Explode
+ - Explode
+
+
+
+
+ -
+ -254
+ 334
+ 65
+ 44
+
+ -
+ -223
+ 356
+
+
+
+
+
+ - Curve to explode
+ - 6cc5d862-4360-41da-ac8d-152ac750e8d1
+ - Curve
+ - C
+ - false
+ - 84780236-6585-42d5-b303-6e93a13af1b5
+ - 1
+
+
+
+
+ -
+ -252
+ 336
+ 14
+ 20
+
+ -
+ -243.5
+ 346
+
+
+
+
+
+
+
+ - Recursive decomposition until all segments are atomic
+ - 1d0d1653-ec2e-4d70-b716-1eda486a429b
+ - Recursive
+ - R
+ - false
+ - 0
+
+
+
+
+ -
+ -252
+ 356
+ 14
+ 20
+
+ -
+ -243.5
+ 366
+
+
+
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
+
+
+
+
+ - true
+
+
+
+
+
+
+
+
+
+
+ - 1
+ - Exploded segments that make up the base curve
+ - c3d12732-08cc-44c5-9bb6-fdce5aea549b
+ - Segments
+ - S
+ - false
+ - 0
+
+
+
+
+ -
+ -208
+ 336
+ 17
+ 20
+
+ -
+ -199.5
+ 346
+
+
+
+
+
+
+
+ - 1
+ - Vertices of the exploded segments
+ - 1dcb9d9c-7b1b-4479-9384-2c23132a9733
+ - Vertices
+ - V
+ - false
+ - 0
+
+
+
+
+ -
+ -208
+ 356
+ 17
+ 20
+
+ -
+ -199.5
+ 366
+
+
+
+
+
+
+
+
+
+
+
+ - 59e0b89a-e487-49f8-bab8-b5bab16be14c
+ - Panel
+
+
+
+
+ - A panel for custom notes and text values
+ - 420d48fe-ba90-4d69-8c31-c1e6827b9a89
+ - Panel
+
+ - false
+ - 0
+ - c3d12732-08cc-44c5-9bb6-fdce5aea549b
+ - 1
+ - Double click to edit panel content…
+
+
+
+
+ -
+ -122
+ 280
+ 160
+ 100
+
+ - 0
+ - 0
+ - 0
+ -
+ -121.33334
+ 280.6667
+
+
+
+
+
+ -
+ 255;213;217;232
+
+ - true
+ - true
+ - true
+ - false
+ - false
+ - true
+
+
@@ -1681,7 +2414,7 @@
-
- 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
+ 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
From 52aff604e4b51ee0342d0a185c3d1e3b340e910d Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Fri, 12 Apr 2024 09:27:17 +0200
Subject: [PATCH 032/141] WIP: working basic imports on script-sync
---
deps/eigen | 2 +-
src/gh/components/DF_xml_exporter/code.py | 30 +-
.../components/DF_xml_exporter/metadata.json | 16 +
src/gh/diffCheck/diffCheck/df_geometries.py | 4 +-
.../diffCheck/diffCheck/df_joint_detector.py | 3 +-
src/gh/diffCheck/diffCheck/diffCheck_app.py | 42 -
src/gh/diffCheck/diffCheck/test.py | 9 -
src/gh/diffCheck/diffCheck_app.py | 46 +
src/gh/tester.ghx | 1615 ++++++++---------
9 files changed, 831 insertions(+), 936 deletions(-)
delete mode 100644 src/gh/diffCheck/diffCheck/diffCheck_app.py
delete mode 100644 src/gh/diffCheck/diffCheck/test.py
create mode 100644 src/gh/diffCheck/diffCheck_app.py
diff --git a/deps/eigen b/deps/eigen
index 2620cb93..5226566a 160000
--- a/deps/eigen
+++ b/deps/eigen
@@ -1 +1 @@
-Subproject commit 2620cb930b7ad87ed1d77a26319739f4b1c86d33
+Subproject commit 5226566a14ddb4d84214c40809531038f087d187
diff --git a/src/gh/components/DF_xml_exporter/code.py b/src/gh/components/DF_xml_exporter/code.py
index ef83315e..7a3905d9 100644
--- a/src/gh/components/DF_xml_exporter/code.py
+++ b/src/gh/components/DF_xml_exporter/code.py
@@ -1,12 +1,6 @@
#! python3
# requirements: diffCheck
-"""
-This read breps from Rhino, converts them to DFBeams and DFAssemblies, and exports them to XML.
-:param i_breps: list of breps
-:param i_export_dir: directory to export the xml
-:param i_dump: press to dump the xml
-"""
import System
import typing
@@ -16,20 +10,24 @@
from ghpythonlib.componentbase import executingcomponent as component
from diffCheck.df_geometries import DFVertex, DFFace, DFBeam, DFAssembly
+import diffCheck.df_transformations
+import diffCheck.df_joint_detector
+import diffCheck.df_util
class DFXMLExporter(component):
def RunScript(self,
i_dump : bool,
- i_name : str,
+ i_assembly_name : str,
i_export_dir : str,
i_breps : typing.List[Rhino.Geometry.Brep]
):
"""
- Main function to test the package
- :param i_dump: whether to dump the xml
- :param i_export_dir: directory to export the xml
- :param i_breps: list of breps
+ This read breps from Rhino, converts them to DFBeams and DFAssemblies, and exports them to XML.
+
+ :param i_dump: whether to dump the xml
+ :param i_export_dir: directory to export the xml
+ :param i_breps: list of breps
"""
# beams
beams : typing.List[DFBeam] = []
@@ -38,9 +36,7 @@ def RunScript(self,
beams.append(beam)
# assembly
- assembly1 = DFAssembly(beams, i_name)
- print(assembly1.beams)
- print(assembly1)
+ assembly1 = DFAssembly(beams, i_assembly_name)
# dump the xml
xml : str = assembly1.to_xml()
@@ -48,4 +44,8 @@ def RunScript(self,
assembly1.dump(xml, i_export_dir)
o_xml = xml
- return o_xml
\ No newline at end of file
+ # show the joint/side faces
+ o_joints = [jf.to_brep() for jf in assembly1.all_joint_faces]
+ o_sides = [sf.to_brep() for sf in assembly1.all_side_faces]
+
+ return o_xml, o_joints, o_sides
\ No newline at end of file
diff --git a/src/gh/components/DF_xml_exporter/metadata.json b/src/gh/components/DF_xml_exporter/metadata.json
index cb3b2027..a9d8cda0 100644
--- a/src/gh/components/DF_xml_exporter/metadata.json
+++ b/src/gh/components/DF_xml_exporter/metadata.json
@@ -70,6 +70,22 @@
"optional": false,
"sourceCount": 0,
"graft": false
+ },
+ {
+ "name": "o_joints",
+ "nickname": "o_joints",
+ "description": "The breps of the faces belonging to joints.",
+ "optional": false,
+ "sourceCount": 0,
+ "graft": false
+ },
+ {
+ "name": "o_sides",
+ "nickname": "o_sides",
+ "description": "The breps of the faces belonging to sides.",
+ "optional": false,
+ "sourceCount": 0,
+ "graft": false
}
]
}
diff --git a/src/gh/diffCheck/diffCheck/df_geometries.py b/src/gh/diffCheck/diffCheck/df_geometries.py
index 2097d932..a869149d 100644
--- a/src/gh/diffCheck/diffCheck/df_geometries.py
+++ b/src/gh/diffCheck/diffCheck/df_geometries.py
@@ -10,7 +10,7 @@
import xml.etree.ElementTree as ET
from xml.dom.minidom import parseString
-from df_joint_detector import JointDetector
+import diffCheck.df_joint_detector
@dataclass
@@ -187,7 +187,7 @@ def from_brep(cls, brep):
Create a DFBeam from a RhinoBrep object.
It also removes duplicates and creates a list of unique faces.
"""
- faces = JointDetector(brep).run()
+ faces = diffCheck.df_joint_detector.JointDetector(brep).run()
faces = list(set(faces))
beam = cls("Beam", faces)
return beam
diff --git a/src/gh/diffCheck/diffCheck/df_joint_detector.py b/src/gh/diffCheck/diffCheck/df_joint_detector.py
index 7713f2a6..44661b6a 100644
--- a/src/gh/diffCheck/diffCheck/df_joint_detector.py
+++ b/src/gh/diffCheck/diffCheck/df_joint_detector.py
@@ -7,8 +7,7 @@
import df_util
import df_transformations
-from df_geometries import DFVertex, DFFace
-
+from df_geometries import DFFace
@dataclass
class JointDetector():
diff --git a/src/gh/diffCheck/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck/diffCheck_app.py
deleted file mode 100644
index 6ceffd75..00000000
--- a/src/gh/diffCheck/diffCheck/diffCheck_app.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#! python3
-
-import Rhino
-import Rhino.Geometry as rg
-
-import os
-import typing
-
-from df_geometries import DFVertex, DFFace, DFBeam, DFAssembly # diffCheck.
-import df_transformations # diffCheck.
-import df_joint_detector # diffCheck.
-import df_util # diffCheck.
-
-from Grasshopper.Kernel import GH_RuntimeMessageLevel as RML
-
-if __name__ == "__main__":
- """
- Main function to test the package
- :param i_breps: list of breps
- :param i_export_dir: directory to export the xml
- :param i_dump: whether to dump the xml
- """
- # beams
- beams : typing.List[DFBeam] = []
- for brep in i_breps:
- beam = DFBeam.from_brep(brep)
- beams.append(beam)
-
- # assembly
- assembly1 = DFAssembly(beams, i_assembly_name)
- print(assembly1.beams)
- print(assembly1)
-
- # dump the xml
- xml : str = assembly1.to_xml()
- if i_dump:
- assembly1.dump_xml(xml, i_export_dir)
- o_xml = xml
-
- # show the joint/side faces
- o_joints = [jf.to_brep() for jf in assembly1.all_joint_faces]
- o_sides = [sf.to_brep() for sf in assembly1.all_side_faces]
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck/test.py b/src/gh/diffCheck/diffCheck/test.py
deleted file mode 100644
index 690fcb0d..00000000
--- a/src/gh/diffCheck/diffCheck/test.py
+++ /dev/null
@@ -1,9 +0,0 @@
-#! python3
-
-import rhinoscriptsyntax as rs
-import scriptcontext as sc
-import Rhino
-
-tol=sc.doc.ModelAbsoluteTolerance
-breps = Rhino.Geometry.Brep.CreatePlanarBreps(i_crvs, tol)
-o_brep = breps[0]
\ No newline at end of file
diff --git a/src/gh/diffCheck/diffCheck_app.py b/src/gh/diffCheck/diffCheck_app.py
new file mode 100644
index 00000000..9b33557f
--- /dev/null
+++ b/src/gh/diffCheck/diffCheck_app.py
@@ -0,0 +1,46 @@
+#! python3
+
+import Rhino
+import Rhino.Geometry as rg
+
+import os
+import typing
+
+import diffCheck
+
+# import diffCheck.df_joint_detector # diffCheck.
+import diffCheck.df_geometries # diffCheck.
+# # from diffCheck.df_geometries import DFVertex, DFFace, DFBeam, DFAssembly # diffCheck.
+# # import diffCheck.df_transformations # diffCheck.
+# # import diffCheck.df_util # diffCheck.
+
+
+if __name__ == "__main__":
+ joint_detector = diffCheck.df_joint_detector.JointDetector(brep=i_breps[0]).run()
+ print(type(joint_detector))
+ # print(joint_detector.run())
+ beam = diffCheck.df_geometries.DFBeam.from_brep(i_breps[0])
+ """
+ Main function to test the package
+ :param i_breps: list of breps
+ :param i_export_dir: directory to export the xml
+ :param i_dump: whether to dump the xml
+ """
+ # beams
+ beams : typing.List[diffCheck.df_geometries.DFBeam] = []
+ for brep in i_breps:
+ beam = diffCheck.df_geometries.DFBeam.from_brep(brep)
+ beams.append(beam)
+
+ # assembly
+ assembly1 = diffCheck.df_geometries.DFAssembly(beams, i_assembly_name)
+
+ # dump the xml
+ xml : str = assembly1.to_xml()
+ if i_dump:
+ assembly1.dump_xml(xml, i_export_dir)
+ o_xml = xml
+
+ # show the joint/side faces
+ o_joints = [jf.to_brep() for jf in assembly1.all_joint_faces]
+ o_sides = [sf.to_brep() for sf in assembly1.all_side_faces]
\ No newline at end of file
diff --git a/src/gh/tester.ghx b/src/gh/tester.ghx
index d414d451..97129e02 100644
--- a/src/gh/tester.ghx
+++ b/src/gh/tester.ghx
@@ -49,10 +49,10 @@
-
- 219
- 14
+ 30
+ -86
- - 1.0837501
+ - 1.5
@@ -69,35 +69,27 @@
- - F:\diffCheck\src\gh\diffCheck\diffCheck\diffCheck_app.py
+ - F:\diffCheck\src\gh\diffCheck\diffCheck_app.py
- F:\diffCheck\src\gh\diffCheck\diffCheck\test.py
- - 3
+ - 2
-
+
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.4.24044.15001
+ - 8.5.24072.13001
-
- - Robert McNeel & Associates
- - 00000000-0000-0000-0000-000000000000
- - Grasshopper
- - 8.4.24044.15001
-
-
-
- - RhinoCodePluginGH, Version=8.4.24044.15001, Culture=neutral, PublicKeyToken=552281e97c755530
- - 8.4.24044.15001
+ - RhinoCodePluginGH, Version=8.5.24072.13001, Culture=neutral, PublicKeyToken=552281e97c755530
+ - 8.5.24072.13001
- 066d0a87-236f-4eae-a0f4-9e42f5327962
- RhinoCodePluginGH
@@ -108,9 +100,9 @@
- - 27
+ - 25
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
@@ -206,9 +198,9 @@
- true
- - Converts to collection of text fragments
+ - No conversion
-
- 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
+ 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
- e0ef2066-70a4-441f-906b-8a4afddb0692
- i_export_dir
@@ -219,7 +211,7 @@
- 77c76654-6be3-4843-b564-afe44705740d
- 1
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+ - 6a184b65-baa3-42d1-a548-3915b401de53
@@ -277,9 +269,9 @@
- true
- - Converts to collection of text fragments
+ - No conversion
-
- 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
+ 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
- d9632669-508e-4a03-b9bc-a5d740ef546f
- i_assembly_name
@@ -290,7 +282,7 @@
- 86bc59e0-752b-48c2-b3e8-8f0c8b9737a3
- 1
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+ - 6a184b65-baa3-42d1-a548-3915b401de53
@@ -484,7 +476,7 @@
- - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHBhdGhfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoX2RpciwgZCkpXQogICAgICAgICAgICAgICAgZm9yIHN1Yl9kaXIgaW4gc3ViX2RpcnM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3ViX2RpcikKICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGhfZGlyLCBzdWJfZGlyKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgogICAgICAgICAgICAgICAgIyBwYXJzZSB0aGUgY29kZQogICAgICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKICAgICAgICAgICAgICAgIG91dHB1dCA9IGlvLlN0cmluZ0lPKCkKCiAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBxdWV1ZSBhbmQgZXZlbnQKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5xdWV1ZV9tc2dfbG9jazoKICAgICAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWV1ZV9tc2cuZW1wdHkoKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuZ2V0KCkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAgICAgICAgICMgZXhlY3V0ZSB0aGUgY29kZQogICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnJlZGlyZWN0X3N0ZG91dChvdXRwdXQpOgogICAgICAgICAgICAgICAgICAgIGV4ZWMoY29kZSwgZ2xvYmFscywgbG9jYWxzKQogICAgICAgICAgICAgICAgbG9jYWxzWyJzdGRvdXQiXSA9IG91dHB1dC5nZXR2YWx1ZSgpCgogICAgICAgICAgICAgICAgIyBzZW5kIHRoZSBtc2cgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgICAgIG1zZ19qc29uID0ganNvbi5kdW1wcyh7InNjcmlwdF9wYXRoIjogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWQiOiBzdHIoZ2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2ciOiBvdXRwdXQuZ2V0dmFsdWUoKX0pCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IG1zZ19qc29uLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KG1zZ19qc29uKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQoKICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2NyaXB0IHZhcmlhYmxlcyB0byB0aGUgR0ggY29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgICAgIG91dHBhcmFtID0gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXQKICAgICAgICAgICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgICAgICAgICBmb3Igb3V0cCBpbiBvdXRwYXJhbV9uYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBvdXRwIGluIGxvY2Fscy5rZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuYXBwZW5kKGxvY2Fsc1tvdXRwXSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChOb25lKQoKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXwogICAgICAgICAgICByZXR1cm4gbG9jYWxzCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCiAgICAgICAgICAgICMgc2VuZCB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgICAgICBlcnJfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogImVycjoiICsgc3RyKGUpfSkKICAgICAgICAgICAgZXJyX2pzb24gPSBlcnJfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KGVycl9qc29uKQogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLnNldCgpCiAgICAgICAgICAgIAogICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KCiAgICAgICAgICAgIGVycl9tc2cgPSBmInNjcmlwdC1zeW5jOjpFcnJvciBpbiB0aGUgY29kZToge3N0cihlKX0iCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihlcnJfbXNnKQoKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgYnRuOiBib29sLAogICAgICAgICAgICBpX2V4cG9ydF9kaXI6IHN0ciwKICAgICAgICAgICAgaV9icmVwczogU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3RbUmhpbm8uR2VvbWV0cnkuQnJlcF0sCiAgICAgICAgICAgIGlfYXNzZW1ibHlfbmFtZTogc3RyLAogICAgICAgICAgICBpX2R1bXA6IGJvb2wpOgogICAgICAgICIiIiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIGl0J3MgdGhlIHNvbHZlIG1haW4gaW5zdGFuY2UuICIiIgoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICAjIHNldCB0aGUgcGF0aCBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIHNlbGYuaW5pdF9zY3JpcHRfcGF0aChidG4pCgogICAgICAgICMgZmlsZSBjaGFuZ2UgbGlzdGVuZXIgdGhyZWFkCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBGaWxlQ2hhbmdlZFRocmVhZChzZWxmLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgc2V0IHVwIHRoZSB0Y3AgY2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICBfID0gW3ByaW50KHQubmFtZSkgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXQogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIENsaWVudFRocmVhZChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cKICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgYWRkIHRvIHRoZSBnbG9iYWxzIGFsbCB0aGUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgY29tcG9uZW50ICh0aGUgbG9jYWxzKQogICAgICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgogICAgICAgIHBhdGhfZGlyID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICBzdWJfZGlycyA9IFtdCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aF9kaXIpOgogICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICAgICAgc3ViX2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihyb290LCBkKSkKICAgICAgICAgICAgICAgIHByaW50KGQpCiAgICAgICAgc3lzLnBhdGguZXh0ZW5kKFtwYXRoX2Rpcl0gKyBzdWJfZGlycykKCiAgICAgICAgIyByZWxvYWQgYWxsIHRoZSBtb2R1bGVzIGFsc28gb2YgdGhlIHN1YiBkaXJlY3RvcmllcwogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGhfZGlyKToKICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgIHNlbGYucmVsb2FkX2FsbF9tb2R1bGVzKG9zLnBhdGguam9pbihyb290LCBkKSkKICAgICAgICBzZWxmLnJlbG9hZF9hbGxfbW9kdWxlcyhwYXRoX2RpcikKCiAgICAgICAgcmVzID0gc2VsZi5zYWZlX2V4ZWMoc2VsZi5wYXRoLCBOb25lLCBnbG9iYWxzKCkpCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gVHJ1ZQogICAgICAgIHJldHVybgoKICAgIGRlZiBBZnRlclJ1blNjcmlwdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGNvbXBvbmVudCBoYXMgZmluaXNoZWQKICAgICAgICAgICAgaXRzIGNhbGN1bGF0aW9uLiBJdCBpcyB1c2VkIHRvIGxvYWQgdGhlIEdIQ29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgd2l0aCB0aGUgdmFsdWVzIGNyZWF0ZWQgaW4gdGhlIHNjcmlwdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5pc19zdWNjZXNzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBvdXRwYXJhbSA9IFtwIGZvciBwIGluIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0XQogICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgCiAgICAgICAgIyBUT0RPOiBhZGQgdGhlIGNvbnZlcnNpb24gdG8gZGF0YXRyZWUgZm9yIG5lc3RlZCBsaXN0cyBhbmQgdHVwbGVzCiAgICAgICAgZm9yIGlkeCwgb3V0cCBpbiBlbnVtZXJhdGUob3V0cGFyYW0pOgogICAgICAgICAgICAjIGRldGVjdCBpZiB0aGUgb3V0cHV0IGlzIGEgbGlzdAogICAgICAgICAgICBpZiB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gbGlzdCBvciB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gdHVwbGU6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YUxpc3QoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGEoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgMCwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuY2xlYXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICB0YWJsZV92YWx1ZSA9IGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuR2V0VmFsdWUoCiAgICAgICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsICJub3RfZm91bmQiCiAgICAgICAgKQogICAgICAgIGlmIHRhYmxlX3ZhbHVlICE9ICJub3RfZm91bmQiOgogICAgICAgICAgICByZXR1cm4gdGFibGVfdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwYXRoLnNldHRlcgogICAgZGVmIHBhdGgoc2VsZiwgcGF0aCA6IHN0cik6CiAgICAgICAgIiIiIFNldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5TZXRWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCBwYXRoKQoKICAgICAgICBzY3JpcHRfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9IGYie3NjcmlwdF9uYW1lfSIKCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIF8gPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdLnN0b3AoKQoKICAgIEBwYXRoLmRlbGV0ZXIKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBEZWxldGUgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyBpZiB0aGUgb2JqZWN0IGlzIGVyYXNlZC4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5EZWxldGVWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlKQo=
+ - IyEgcHl0aG9uMwojIHI6IG51bXB5Cgpmcm9tIGdocHl0aG9ubGliLmNvbXBvbmVudGJhc2UgaW1wb3J0IGV4ZWN1dGluZ2NvbXBvbmVudCBhcyBjb21wb25lbnQKCmltcG9ydCBTeXN0ZW0KaW1wb3J0IFN5c3RlbS5EcmF3aW5nCmltcG9ydCBTeXN0ZW0uV2luZG93cy5Gb3JtcwppbXBvcnQgUmhpbm8KaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBHcmFzc2hvcHBlciBhcyBnaApmcm9tIEdyYXNzaG9wcGVyLktlcm5lbCBpbXBvcnQgR0hfUnVudGltZU1lc3NhZ2VMZXZlbCBhcyBSTUwKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHRpbWUKCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBpbwoKaW1wb3J0IGFiYwppbXBvcnQgc29ja2V0CmltcG9ydCB0aHJlYWRpbmcKaW1wb3J0IHF1ZXVlCmltcG9ydCBqc29uCgppbXBvcnQgaW1wb3J0bGliCmltcG9ydCBzeXMKCgpjbGFzcyBHSFRocmVhZCh0aHJlYWRpbmcuVGhyZWFkLCBtZXRhY2xhc3M9YWJjLkFCQ01ldGEpOgogICAgIiIiCiAgICAgICAgQSBiYXNlIGNsYXNzIGZvciBHcmFzc2hvcHBlciB0aHJlYWRzLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSA6IHN0cik6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUsIGRhZW1vbj1GYWxzZSkKICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgIHNlbGYuX2NvbXBvbmVudF9lbmFibGVkID0gVHJ1ZQoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiAiIiIKICAgICAgICBwYXNzCgogICAgZGVmIF9jaGVja19pZl9jb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIG9uIGNhbnZhcyBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcygpOgogICAgICAgICAgICBpZiBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IEZhbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBUcnVlCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19jaGVja19pZl9jb21wb25lbnRfb25fY2FudmFzKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQoc2VsZik6CiAgICAgICAgIiIiIENoZWNrIGlmIHRoZSBjb21wb25lbnQgaXMgZW5hYmxlZCBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50LkxvY2tlZDoKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9lbmFibGVkID0gRmFsc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9lbmFibGVkID0gVHJ1ZQogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19jaGVja19pZl9jb21wb25lbnRfZW5hYmxlZCkKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbihzZWxmKToKICAgICAgICAiIiIgRmlyZSB0aGUgcmVjYWxjdWxhdGlvbiBvZiB0aGUgY29tcG9uZW50IHNvbHV0aW9uIGZyb20gdGhyZWFkLiAiIiIKICAgICAgICBkZWYgX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCk6CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0WzBdLkNsZWFyRGF0YSgpICAjIGNsZWFyIHRoZSBvdXRwdXQKICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LkV4cGlyZVNvbHV0aW9uKFRydWUpICAjIGV4cGlyZSB0aGUgY29tcG9uZW50CiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbihfX2V4cGlyZV9jb21wb25lbnRfc29sdXRpb24pCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGNsZWFyX2NvbXBvbmVudChzZWxmKToKICAgICAgICAiIiIgQ2xlYXIgdGhlIGNvbXBvbmVudCBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fY2xlYXJfY29tcG9uZW50KCk6CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5DbGVhckRhdGEoKQogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19jbGVhcl9jb21wb25lbnQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3dhcm5pbmcoc2VsZiwgZXhjZXB0aW9uIDogc3RyKToKICAgICAgICAiIiIgQWRkIGEgd2FybmluZyB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuV2FybmluZywgZXhjZXB0aW9uKQogICAgICAgICkKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgYWRkX3J1bnRpbWVfZXJyb3Ioc2VsZiwgZXhjZXB0aW9uIDogc3RyKToKICAgICAgICAiIiIgQWRkIGFuIGVycm9yIHRhYiB0byB0aGUgY29tcG9uZW50IGZyb20gbWFpbiB0aHJlYWQuICIiIgogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oCiAgICAgICAgICAgIGxhbWJkYTogZ2hlbnYuQ29tcG9uZW50LkFkZFJ1bnRpbWVNZXNzYWdlKFJNTC5FcnJvciwgZXhjZXB0aW9uKQogICAgICAgICkKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgYWRkX3J1bnRpbWVfcmVtYXJrKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIGJsYW5rIHRhYiB0byB0aGUgY29tcG9uZW50IGZyb20gbWFpbiB0aHJlYWQuICIiIgogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oCiAgICAgICAgICAgIGxhbWJkYTogZ2hlbnYuQ29tcG9uZW50LkFkZFJ1bnRpbWVNZXNzYWdlKFJNTC5SZW1hcmssIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgQHByb3BlcnR5CiAgICBkZWYgY29tcG9uZW50X2VuYWJsZWQoc2VsZik6CiAgICAgICAgc2VsZi5fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfZW5hYmxlZAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9vbl9jYW52YXMoc2VsZik6CiAgICAgICAgc2VsZi5fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcygpCiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMKCmNsYXNzIENsaWVudFRocmVhZChHSFRocmVhZCk6CiAgICAiIiIKICAgIEEgdGhyZWFkIHRvIGNvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2c2NvZGVfc2VydmVyX2lwOiBzdHIsIHZzY29kZV9zZXJ2ZXJfcG9ydDogaW50LCBuYW1lOiBzdHIsCiAgICAgICAgICAgICAgICAgcXVldWVfbXNnOiBxdWV1ZS5RdWV1ZSA9IE5vbmUsIGxvY2tfcXVldWVfbXNnOiB0aHJlYWRpbmcuTG9jayA9IE5vbmUsCiAgICAgICAgICAgICAgICAgZXZlbnRfZmlyZV9tc2c6IHRocmVhZGluZy5FdmVudCA9IE5vbmUpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lKQogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9IHZzY29kZV9zZXJ2ZXJfaXAKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCA9IHZzY29kZV9zZXJ2ZXJfcG9ydAogICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICBzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlID0gMSAgIyBzZWNvbmRzCiAgICAgICAgc2VsZi5xdWV1ZV9tc2cgPSBxdWV1ZV9tc2cKICAgICAgICBzZWxmLmxvY2tfcXVldWVfbXNnID0gbG9ja19xdWV1ZV9tc2cKICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnID0gZXZlbnRfZmlyZV9tc2cKICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAiIiIgUnVuIHRoZSB0aHJlYWQuIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHZzY29kZSBzZXJ2ZXIuIiIiCiAgICAgICAgd2hpbGUgc2VsZi5jb21wb25lbnRfb25fY2FudmFzIGFuZCBzZWxmLmNvbXBvbmVudF9lbmFibGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pc19jb25uZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoKQogICAgICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJfY29tcG9uZW50KCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy53YWl0KCkKICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoKQoKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgc2VsZi5hZGRfcnVudGltZV93YXJuaW5nKGYic2NyaXB0LXN5bmM6OlVua293biBlcnJvciBmcm9tIHJ1bjoge3N0cihlKX0iKQogICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY2xvc2UoKQoKICAgIGRlZiBzZW5kX21lc3NhZ2VfZnJvbV9xdWV1ZShzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9ja19xdWV1ZV9tc2c6CiAgICAgICAgICAgIGlmIHNlbGYucXVldWVfbXNnIGFuZCBub3Qgc2VsZi5xdWV1ZV9tc2cuZW1wdHkoKToKICAgICAgICAgICAgICAgIG1zZyA9IHNlbGYucXVldWVfbXNnLmdldCgpCiAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy50YXNrX2RvbmUoKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5jbGVhcigpCiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChtc2cpCgogICAgZGVmIGNvbm5lY3RfdG9fdnNjb2RlX3NlcnZlcihzZWxmKToKICAgICAgICAiIiIgQ29ubmVjdCB0byB0aGUgVlNDb2RlIHNlcnZlci4gIiIiCiAgICAgICAgd2hpbGUgc2VsZi5jb21wb25lbnRfb25fY2FudmFzIGFuZCBub3Qgc2VsZi5pc19jb25uZWN0ZWQ6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldC5zZW5kKGIiIikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gVHJ1ZQogICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldC5jb25uZWN0KChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0KSkKICAgICAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgICAgIGV4Y2VwdCAoQ29ubmVjdGlvblJlZnVzZWRFcnJvciwgQ29ubmVjdGlvblJlc2V0RXJyb3IsIHNvY2tldC5lcnJvcikgYXMgZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9jb25uZWN0aW9uX2Vycm9yKGUpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNlbGYuY29ubmVjdF9yZWZyZXNoX3JhdGUpCgogICAgZGVmIGhhbmRsZV9jb25uZWN0aW9uX2Vycm9yKHNlbGYsIGUpOgogICAgICAgIGVycm9yX21lc3NhZ2VzID0gewogICAgICAgICAgICBDb25uZWN0aW9uUmVmdXNlZEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gcmVmdXNlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgQ29ubmVjdGlvblJlc2V0RXJyb3I6ICJzY3JpcHQtc3luYzo6Q29ubmVjdGlvbiB3YXMgZm9yY2libHkgY2xvc2VkIGJ5IHRoZSB2c2NvZGUiLAogICAgICAgICAgICBzb2NrZXQuZXJyb3I6IGYic2NyaXB0LXN5bmM6OkVycm9yIGNvbm5lY3RpbmcgdG8gdGhlIHZzY29kZToge3N0cihlKX0iCiAgICAgICAgfQogICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhlcnJvcl9tZXNzYWdlc1t0eXBlKGUpXSkKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlIGlmIHR5cGUoZSkgIT0gc29ja2V0LmVycm9yIG9yIGUud2luZXJyb3IgIT0gMTAwNTYgZWxzZSBUcnVlCgoKY2xhc3MgRmlsZUNoYW5nZWRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICAgICAgQSB0aHJlYWQgdG8gY2hlY2sgaWYgdGhlIGZpbGUgaGFzIGNoYW5nZWQgb24gZGlzay4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICBwYXRoIDogc3RyLAogICAgICAgICAgICAgICAgbmFtZSA6IHN0cgogICAgICAgICAgICAgICAgKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCiAgICAgICAgc2VsZi5yZWZyZXNoX3JhdGUgPSAxMDAwICAjIG1pbGxpc2Vjb25kcwogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZCA9IHRocmVhZGluZy5FdmVudCgpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGZpbGUgaGFzIGNoYW5nZWQgb24gZGlzay4KICAgICAgICAiIiIKICAgICAgICBsYXN0X21vZGlmaWVkID0gb3MucGF0aC5nZXRtdGltZShzZWxmLnBhdGgpCiAgICAgICAgd2hpbGUgc2VsZi5jb21wb25lbnRfb25fY2FudmFzIGFuZCBub3Qgc2VsZi5fb25fZmlsZV9jaGFuZ2VkLmlzX3NldCgpOgogICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChzZWxmLnJlZnJlc2hfcmF0ZSkKICAgICAgICAgICAgbGFzdF9tb2RpZmllZCA9IHNlbGYuaXNfZmlsZV9tb2RpZmllZChsYXN0X21vZGlmaWVkKQogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5jbGVhcigpCiAgICAgICAgcmV0dXJuCgogICAgZGVmIHN0b3Aoc2VsZik6CiAgICAgICAgIiIiIFN0b3AgdGhlIHRocmVhZC4gIiIiCiAgICAgICAgc2VsZi5fb25fZmlsZV9jaGFuZ2VkLnNldCgpCgogICAgZGVmIGlzX2ZpbGVfbW9kaWZpZWQoc2VsZiwgbGFzdF9tb2RpZmllZCk6CiAgICAgICAgY3VycmVudF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIGlmIGN1cnJlbnRfbW9kaWZpZWQgIT0gbGFzdF9tb2RpZmllZDoKICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRfbW9kaWZpZWQKICAgICAgICByZXR1cm4gbGFzdF9tb2RpZmllZAoKCmNsYXNzIFNjcmlwdFN5bmNDUHkoY29tcG9uZW50KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihTY3JpcHRTeW5jQ1B5LCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fdmFyX291dHB1dCA9IFtdCgogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IEZhbHNlCgogICAgICAgIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIDogc3RyID0gZiJzY3JpcHQtc3luYy1jbGllbnQtdGhyZWFkOjp7Z2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZH0iCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX2lwID0gIjEyNy4wLjAuMSIKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCA9IDU4MjYwCiAgICAgICAgc2VsZi5zdGRvdXQgPSBOb25lCiAgICAgICAgc2VsZi5xdWV1ZV9tc2cgPSBxdWV1ZS5RdWV1ZSgpCiAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnID0gdGhyZWFkaW5nLkV2ZW50KCkKCiAgICAgICAgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtZmlsZUNoYW5nZWQtdGhyZWFkOjp7Z2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZH0iCiAgICAgICAgc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSA9ICJzY3JpcHQtc3luYzo6IiArICJwYXRoOjoiICsgc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpCiAgICAgICAgaWYgc2VsZi5wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5NZXNzYWdlID0gInNlbGVjdC1zY3JpcHQiCgogICAgZGVmIFJlbW92ZWRGcm9tRG9jdW1lbnQoc2VsZiwgZG9jKToKICAgICAgICAiIiIgUmVtb3ZlIHRoZSBjb21wb25lbnQgZnJvbSB0aGUgZG9jdW1lbnQuICIiIgogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgY2xpZW50X3RocmVhZCA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5jbGllbnRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGNsaWVudF90aHJlYWQuam9pbigpCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZCA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZV1bMF0KICAgICAgICAgICAgZmlsZWNoYW5nZWRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYucXVldWVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZ19sb2NrIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnF1ZXVlX21zZ19sb2NrLnJlbGVhc2UoKQogICAgICAgIGlmIHNlbGYuZXZlbnRfZmlyZV9tc2cgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAjIGNsZWFyIHRoZSBwYXRoIGZyb20gdGhlIHRhYmxlIHZpZXcKICAgICAgICBkZWwgc2VsZi5wYXRoCgogICAgZGVmIGluaXRfc2NyaXB0X3BhdGgoc2VsZiwgYnRuIDogYm9vbCA9IEZhbHNlKToKICAgICAgICAiIiIKICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGJ1dHRvbiBpcyBwcmVzc2VkIGFuZCBsb2FkL2NoYW5nZSBwYXRoIHNjcmlwdC4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBidG46IEEgYm9vbGVhbiBvZiB0aGUgYnV0dG9uCiAgICAgICAgIiIiCiAgICAgICAgIyBjaGVjayBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIGlmIGJ0biBpcyBUcnVlOgogICAgICAgICAgICBkaWFsb2cgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5PcGVuRmlsZURpYWxvZygpCiAgICAgICAgICAgIGRpYWxvZy5GaWx0ZXIgPSAiUHl0aG9uIGZpbGVzICgqLnB5KXwqLnB5IgogICAgICAgICAgICBkaWFsb2cuVGl0bGUgPSAiU2VsZWN0IGEgUHl0aG9uIGZpbGUiCiAgICAgICAgICAgIGRpYWxvZy5Jbml0aWFsRGlyZWN0b3J5ID0gb3MucGF0aC5kaXJuYW1lKCIiKQogICAgICAgICAgICBkaWFsb2cuRmlsZU5hbWUgPSAiIgogICAgICAgICAgICBkaWFsb2cuTXVsdGlzZWxlY3QgPSBGYWxzZQogICAgICAgICAgICBkaWFsb2cuQ2hlY2tGaWxlRXhpc3RzID0gVHJ1ZQogICAgICAgICAgICBkaWFsb2cuQ2hlY2tQYXRoRXhpc3RzID0gVHJ1ZQogICAgICAgICAgICBkaWFsb2cuUmVzdG9yZURpcmVjdG9yeSA9IFRydWUKICAgICAgICAgICAgaWYgZGlhbG9nLlNob3dEaWFsb2coKSA9PSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EaWFsb2dSZXN1bHQuT0s6CiAgICAgICAgICAgICAgICBzZWxmLnBhdGggPSBkaWFsb2cuRmlsZU5hbWUKCiAgICAgICAgIyBkZWZhdWx0IGluaXQgc3RhdXRzCiAgICAgICAgaWYgc2VsZi5wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic2NyaXB0LXN5bmM6OkZpbGUgbm90IHNlbGVjdGVkIikKCiAgICAgICAgIyBmaSBmaWxlIGlzIGluIHRhYmxlIHZpZXcgYmVmb3JlCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYucGF0aCk6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic2NyaXB0LXN5bmM6OkZpbGUgZG9lcyBub3QgZXhpc3QiKQogICAgCiAgICBkZWYgcmVsb2FkX2FsbF9tb2R1bGVzKHNlbGYsIGRpcmVjdG9yeSk6CiAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5KToKICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5weScpIGFuZCBmaWxlbmFtZSAhPSAnX19pbml0X18ucHknOgogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgPSBmaWxlbmFtZVs6LTNdICAjIHJlbW92ZSAnLnB5JyBmcm9tIGZpbGVuYW1lCiAgICAgICAgICAgICAgICBpZiBtb2R1bGVfbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBpbXBvcnRsaWIucmVsb2FkKHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXSkKCiAgICBkZWYgc2FmZV9leGVjKHNlbGYsIHBhdGgsIGdsb2JhbHMsIGxvY2Fscyk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIEV4ZWN1dGUgUHl0aG9uMyBjb2RlIHNhZmVseS4gSXQgcmVkaXJlY3RzIHRoZSBvdXRwdXQgb2YgdGhlIGNvZGUKICAgICAgICAgICAgdG8gYSBzdHJpbmcgYnVmZmVyICdzdGRvdXQnIHRvIG91dHB1dCB0byB0aGUgR0ggY29tcG9uZW50IHBhcmFtLgogICAgICAgICAgICBJdCBpcyBzZW5kIHRvIHRoZSB2c2NvZGUgc2VydmVyLgogICAgICAgICAgICAKICAgICAgICAgICAgOnBhcmFtIHBhdGg6IFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGV4ZWN1dGUuCiAgICAgICAgICAgIDpwYXJhbSBnbG9iYWxzOiBUaGUgZ2xvYmFscyBkaWN0aW9uYXJ5LgogICAgICAgICAgICA6cGFyYW0gbG9jYWxzOiBUaGUgbG9jYWxzIGRpY3Rpb25hcnkuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3InKSBhcyBmOgogICAgICAgICAgICAgICAgIyBhZGQgdGhlIHBhdGggYW5kIHN1YiBkaXJlY3RvcmllcyB0byB0aGUgc3lzIHBhdGgKICAgICAgICAgICAgICAgIHBhdGhfZGlyID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICAgICAgICAgICAgICBzdWJfZGlycyA9IFtkIGZvciBkIGluIG9zLmxpc3RkaXIocGF0aF9kaXIpIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHBhdGhfZGlyLCBkKSldCiAgICAgICAgICAgICAgICBmb3Igc3ViX2RpciBpbiBzdWJfZGlyczoKICAgICAgICAgICAgICAgICAgICBwcmludChzdWJfZGlyKQogICAgICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChvcy5wYXRoLmpvaW4ocGF0aF9kaXIsIHN1Yl9kaXIpKQogICAgICAgICAgICAgICAgc3lzLnBhdGguYXBwZW5kKHBhdGhfZGlyKQoKICAgICAgICAgICAgICAgICMgcmVsb2FkIGFsbCB0aGUgbW9kdWxlcyBhbHNvIG9mIHRoZSBzdWIgZGlyZWN0b3JpZXMKICAgICAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGhfZGlyKToKICAgICAgICAgICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbG9hZF9hbGxfbW9kdWxlcyhvcy5wYXRoLmpvaW4ocm9vdCwgZCkpCiAgICAgICAgICAgICAgICBzZWxmLnJlbG9hZF9hbGxfbW9kdWxlcyhwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHBhcnNlIHRoZSBjb2RlCiAgICAgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmLnJlYWQoKSwgcGF0aCwgJ2V4ZWMnKQogICAgICAgICAgICAgICAgb3V0cHV0ID0gaW8uU3RyaW5nSU8oKQoKICAgICAgICAgICAgICAgICMgZW1wdHkgdGhlIHF1ZXVlIGFuZCBldmVudAogICAgICAgICAgICAgICAgd2l0aCBzZWxmLnF1ZXVlX21zZ19sb2NrOgogICAgICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1ZXVlX21zZy5lbXB0eSgpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy50YXNrX2RvbmUoKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5jbGVhcigpCgogICAgICAgICAgICAgICAgIyBleGVjdXRlIHRoZSBjb2RlCiAgICAgICAgICAgICAgICB3aXRoIGNvbnRleHRsaWIucmVkaXJlY3Rfc3Rkb3V0KG91dHB1dCk6CiAgICAgICAgICAgICAgICAgICAgZXhlYyhjb2RlLCBnbG9iYWxzLCBsb2NhbHMpCiAgICAgICAgICAgICAgICBsb2NhbHNbInN0ZG91dCJdID0gb3V0cHV0LmdldHZhbHVlKCkKCiAgICAgICAgICAgICAgICAjIHNlbmQgdGhlIG1zZyB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6IG91dHB1dC5nZXR2YWx1ZSgpfSkKICAgICAgICAgICAgICAgIG1zZ19qc29uID0gbXNnX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy5wdXQobXNnX2pzb24pCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLnNldCgpCgogICAgICAgICAgICAgICAgIyBwYXNzIHRoZSBzY3JpcHQgdmFyaWFibGVzIHRvIHRoZSBHSCBjb21wb25lbnQgb3V0cHV0cwogICAgICAgICAgICAgICAgb3V0cGFyYW0gPSBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dAogICAgICAgICAgICAgICAgb3V0cGFyYW1fbmFtZXMgPSBbcC5OaWNrTmFtZSBmb3IgcCBpbiBvdXRwYXJhbV0KICAgICAgICAgICAgICAgIGZvciBvdXRwIGluIG91dHBhcmFtX25hbWVzOgogICAgICAgICAgICAgICAgICAgIGlmIG91dHAgaW4gbG9jYWxzLmtleXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQobG9jYWxzW291dHBdKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuYXBwZW5kKE5vbmUpCgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCiAgICAgICAgICAgIHJldHVybiBsb2NhbHMKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoKICAgICAgICAgICAgIyBzZW5kIHRoZSBlcnJvciBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgIGVycl9qc29uID0ganNvbi5kdW1wcyh7InNjcmlwdF9wYXRoIjogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWQiOiBzdHIoZ2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2ciOiAiZXJyOiIgKyBzdHIoZSl9KQogICAgICAgICAgICBlcnJfanNvbiA9IGVycl9qc29uLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy5wdXQoZXJyX2pzb24pCiAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgCiAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXwoKICAgICAgICAgICAgZXJyX21zZyA9IGYic2NyaXB0LXN5bmM6OkVycm9yIGluIHRoZSBjb2RlOiB7c3RyKGUpfSIKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKGVycl9tc2cpCgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICBidG46IGJvb2wsCiAgICAgICAgICAgIGlfZXhwb3J0X2RpciwKICAgICAgICAgICAgaV9icmVwczogU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3RbUmhpbm8uR2VvbWV0cnkuQnJlcF0sCiAgICAgICAgICAgIGlfYXNzZW1ibHlfbmFtZSwKICAgICAgICAgICAgaV9kdW1wOiBib29sKToKICAgICAgICAiIiIgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb21wb25lbnQgaGFzIHRvIGJlIHJlY2FsY3VsYXRlZCBpdCdzIHRoZSBzb2x2ZSBtYWluIGluc3RhbmNlLiAiIiIKCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gRmFsc2UKCiAgICAgICAgIyBzZXQgdGhlIHBhdGggaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBzZWxmLmluaXRfc2NyaXB0X3BhdGgoYnRuKQoKICAgICAgICAjIGZpbGUgY2hhbmdlIGxpc3RlbmVyIHRocmVhZAogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgbm90IGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgRmlsZUNoYW5nZWRUaHJlYWQoc2VsZi5wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc3RhcnQoKQoKICAgICAgICAjIHNldCB1cCB0aGUgdGNwIGNsaWVudCB0byBjb25uZWN0IHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgXyA9IFtwcmludCh0Lm5hbWUpIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV0KICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBDbGllbnRUaHJlYWQoc2VsZi52c2NvZGVfc2VydmVyX2lwLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfdGhyZWFkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZ19sb2NrLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnCiAgICAgICAgICAgICAgICAgICAgICAgICkuc3RhcnQoKQoKICAgICAgICAjIGFkZCB0byB0aGUgZ2xvYmFscyBhbGwgdGhlIGlucHV0IHBhcmFtZXRlcnMgb2YgdGhlIGNvbXBvbmVudCAodGhlIGxvY2FscykKICAgICAgICBnbG9iYWxzKCkudXBkYXRlKGxvY2FscygpKQoKICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpCiAgICAgICAgc3ViX2RpcnMgPSBbXQogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGhfZGlyKToKICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgIHN1Yl9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4ocm9vdCwgZCkpCiAgICAgICAgICAgICAgICBwcmludChkKQogICAgICAgIHN5cy5wYXRoLmV4dGVuZChbcGF0aF9kaXJdICsgc3ViX2RpcnMpCgogICAgICAgICMgcmVsb2FkIGFsbCB0aGUgbW9kdWxlcyBhbHNvIG9mIHRoZSBzdWIgZGlyZWN0b3JpZXMKICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgIGZvciBkIGluIGRpcnM6CiAgICAgICAgICAgICAgICBzZWxmLnJlbG9hZF9hbGxfbW9kdWxlcyhvcy5wYXRoLmpvaW4ocm9vdCwgZCkpCiAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgogICAgICAgIHJlcyA9IHNlbGYuc2FmZV9leGVjKHNlbGYucGF0aCwgTm9uZSwgZ2xvYmFscygpKQogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IFRydWUKICAgICAgICByZXR1cm4KCiAgICBkZWYgQWZ0ZXJSdW5TY3JpcHQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBjb21wb25lbnQgaGFzIGZpbmlzaGVkCiAgICAgICAgICAgIGl0cyBjYWxjdWxhdGlvbi4gSXQgaXMgdXNlZCB0byBsb2FkIHRoZSBHSENvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgIHdpdGggdGhlIHZhbHVlcyBjcmVhdGVkIGluIHRoZSBzY3JpcHQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuaXNfc3VjY2VzczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgb3V0cGFyYW0gPSBbcCBmb3IgcCBpbiBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dF0KICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgIAogICAgICAgICMgVE9ETzogYWRkIHRoZSBjb252ZXJzaW9uIHRvIGRhdGF0cmVlIGZvciBuZXN0ZWQgbGlzdHMgYW5kIHR1cGxlcwogICAgICAgIGZvciBpZHgsIG91dHAgaW4gZW51bWVyYXRlKG91dHBhcmFtKToKICAgICAgICAgICAgIyBkZXRlY3QgaWYgdGhlIG91dHB1dCBpcyBhIGxpc3QKICAgICAgICAgICAgaWYgdHlwZShzZWxmLl92YXJfb3V0cHV0W2lkeF0pID09IGxpc3Qgb3IgdHlwZShzZWxmLl92YXJfb3V0cHV0W2lkeF0pID09IHR1cGxlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGFMaXN0KGdoLktlcm5lbC5EYXRhLkdIX1BhdGgoMCksIHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhKGdoLktlcm5lbC5EYXRhLkdIX1BhdGgoMCksIDAsIHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkKICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmNsZWFyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgdGFibGVfdmFsdWUgPSBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkdldFZhbHVlKAogICAgICAgICAgICBzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCAibm90X2ZvdW5kIgogICAgICAgICkKICAgICAgICBpZiB0YWJsZV92YWx1ZSAhPSAibm90X2ZvdW5kIjoKICAgICAgICAgICAgcmV0dXJuIHRhYmxlX3ZhbHVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcGF0aC5zZXR0ZXIKICAgIGRlZiBwYXRoKHNlbGYsIHBhdGggOiBzdHIpOgogICAgICAgICIiIiBTZXQgdGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuU2V0VmFsdWUoc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgcGF0aCkKCiAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk1lc3NhZ2UgPSBmIntzY3JpcHRfbmFtZX0iCgogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBfID0gW3QgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpIGlmIHQubmFtZSA9PSBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lXVswXS5zdG9wKCkKCiAgICBAcGF0aC5kZWxldGVyCiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgRGVsZXRlIHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgaWYgdGhlIG9iamVjdCBpcyBlcmFzZWQuICIiIgogICAgICAgIGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuRGVsZXRlVmFsdWUoc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSkK
- S
@@ -634,8 +626,8 @@
-
- 329
- -243
+ 445
+ -256
494
292
@@ -643,8 +635,8 @@
- 0
- 0
-
- 329.48257
- -242.18234
+ 445.17487
+ -255.70482
@@ -672,15 +664,14 @@
-
+
- A panel for custom notes and text values
- d5d04f93-3b13-4fa3-8644-243c03f9a7e8
- Panel
- false
- 0.2985713966190815
- - bc61f3bc-d42e-4ab9-9cde-bfa5df8d625e
- - 1
+ - 0
- Double click to edit panel content…
@@ -720,33 +711,51 @@
- - 3ede854e-c753-40eb-84cb-b48008f14fd4
- - Text
+ - 59e0b89a-e487-49f8-bab8-b5bab16be14c
+ - Panel
-
- - Contains a collection of text fragments
- - bc61f3bc-d42e-4ab9-9cde-bfa5df8d625e
- - Text
- - Txt
+
+ - A panel for custom notes and text values
+ - 63a2f4e1-c253-4fc3-9148-719323b802e1
+ - Panel
+
- false
- - a7582614-58af-4e8e-ac5d-40e739284db1
+ - 0
+ - 178951a0-3c74-4810-aef0-87cc45b0502c
- 1
+ - Double click to edit panel content…
-
+
-
+
-
- 375
- 373
- 50
- 24
+ 627
+ 289
+ 411
+ 166
+ - 0
+ - 0
+ - 0
-
- 400.89478
- 385.76862
+ 627.30396
+ 289.70813
+
+
+
+
+
+ -
+ 255;213;217;232
+ - true
+ - true
+ - true
+ - false
+ - false
+ - true
@@ -754,212 +763,52 @@
-
- - c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - 066d0a87-236f-4eae-a0f4-9e42f5327962
- - Exporter to xml
+
+ - 59e0b89a-e487-49f8-bab8-b5bab16be14c
+ - Panel
-
-
- - true
- - true
- - 2
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABg2lDQ1BJQ0MgcHJvZmlsZQAAKM+VkTlIA0EYhT8TJcEDC1OIWGyhVgqiopYSxSAoSIzgVbi7MVHIbsJugo2lYCtYeDRehY21tha2giB4gFhbWCnaiKz/bIQEIYIDw3y8mfeYeQOBg4xpudXdYNl5Jx6LajOzc1romWpC1DFAWDfd3MTUaIKK4+OWKrXedKks/jcakkuuCVWa8JCZc/LCi8L9q/mc4h3hiLmsJ4VPhTsduaDwvdKNIr8oTvscUJkRJxEfFo4Ia+kyNsrYXHYs4T7htqRlS35gpshJxWuKrUzB/LmnemH9kj09pXSZrcQYY4JJNAwKrJAhT5estigucdmPVvC3+P5JcRniWsEUxwhZLHTfj/qD3926qd6eYlJ9FGqePO+tHUJb8LXpeZ+Hnvd1BMFHuLBL/uwBDL6LvlnS2vahcR3OLkuasQ3nG9D8kNMd3ZeCMgOpFLyeyDfNQtM11M4Xe/vZ5/gOEtLV+BXs7kFHWrIXKrw7XN7bn2f8/oh+A2ixcqM29OAgAAAACXBIWXMAAC4iAAAuIgGq4t2SAAAAB3RJTUUH6AQHCzcfT87vFgAAAEZJREFUSEu1yKEBADAIwDCO5n/2QGQnYjJze18xS8wSs8QsMUvMErPELDFLzBKzxCwxS8wSs8QsMUvMErPELDFLzBIzs/cABgWAzBU/nmQAAAAASUVORK5CYII=
-
- - 37244b65-1555-4735-bf3f-ab0481941fea
- - true
- - true
- - true
- - Exporter to xml
- - XMLout
-
- - false
- - false
- - false
+
+ - A panel for custom notes and text values
+ - 5262b483-9441-440a-a74d-8b235aad399d
+ - Panel
+
+ - false
+ - 1
+ - 0
+ - Double click to edit panel content…
-
+
-
+
-
- 227
- 353
- 135
- 64
+ 494
+ 71
+ 343
+ 118
+ - 0
+ - 0
+ - 0
-
- 307
- 385
+ 494.05792
+ 71.25596
-
-
- - 3
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 1
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
-
-
-
- - true
- - Press button to export xml
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC
-
- - 5c36c839-5c70-4ab8-a9fc-6cacff1c6955
- - i_dump
- - i_dump
- - true
- - 0
- - true
- - 83363e37-e611-4b77-bcde-c28b03d7ee96
- - 1
- - Press button to export xml
- - d60527f5-b5af-4ef6-8970-5f96fe412559
-
-
-
-
- -
- 229
- 355
- 63
- 20
-
- -
- 262
- 365
-
-
-
-
-
-
-
- - true
- - The directors where to export the xml file.
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAO8SURBVEhL1VVLLJxhFB3ERMT7zXgb71e8X/GId2IhQZTuJGwktjaNxqpYNAQbsWBHiDRsbNgIC4lWYiUs7LSVtLqY6UNNTu+58/9Caaurpie5md/85px7z733+yz/CnYPD4/P8om/iCcSj4OPj8/r+fl57O3tYWdnB9vb29jc3MTa2hoWFxcxMTGB/v5+tLW1oaqqCqmpqZCE3spPrW6G38DLy6tdfvh9YWEBZWVlGqWlpSguLkZhYSHy8/ORk5ODjIwMJU5KSkJWVhb8/Pwcnp6ezwyaX8IaGBj4YWlpCZ2dnZodo7KyEu3t7TBxcnKipGlpaUhJSdFITk6GCDiFw+amegDe3t4v+vr6rkdHR1FdXY3a2loNPs/NzcHlchkSQHNzM9LT05U8MTFRK5HkvolVrwy6e7BHRUV9nZ6eRkNDgxLX19dr8Pns7AwrKysGPTA5Oak22e12FYiLi0NsbCx7wSqK3JS3IN7vdHR0oLe3V225LTAwMIDj4+M7Nh0dHd0RIHl0dDSCg4NdIvLGoL1BW1hY2Jfu7m5tKj2/bdHy8jKmpqa02aenp4YEUFdXd2MRBcQBxMfHQ6bQIZxP3dTSWMn+XXl5ORicFlOElVDo4uICLS0t+m52dtagB8bGxlQgISEBNpsNkZGRKkJBqeKjcPtZpPPPQ0NDv5CcI8hRJBGzpdDQ0JDugjmmXV1dBj1wcHCgzaX/MTExiIiIQEhIiIrKMxf1pUWUPmVmZupsMyhSUFCAoqIijY2NDQwPD+t35g6cn58bEtBKTf/Dw8PZAxXKy8vjdn+iwEsZL2dubi5MIT6TjBU4HA6D6mGMjIxo9rRHnEBQUJDySFXuCugT/WKpnAoGlyg7O1szX11d1Wd+x3dcrp6eHoMe2N/fV9+ZPe1hJbRX+urugYGnVqvVwR9z/fnJJTo8PMTg4KA+m+/oL0fz8vJSBa6vr7VaM3tWLRZxF26mSMHZpXdceZKMj48rAQX4N4NVmku1u7ur74mZmRklp3BJSYlL6O7tAVHKs4QEXCITTqdTjwmOIonZo/X1dVxdXRn/4cbW1haampoQEBBA7+9vMiFVvBIfvzFbTsbt4JyzmfSYDaXnpi1CqiMsk3MlNL88iwgbq6DfzJbNM4OktNAkZkNl+uDv76/veTdIH39/mhp4JrPs5OTI8XETJinn3Mxa7gD4+vrqeSVVk/yP9wFhFavecywrKipQU1OjBPS3tbVVM+Whx4ORW83zq7Gx8fE3mgHerz/fuX+Kx9/J/xEslh9QdsIn89F0TQAAAABJRU5ErkJggg==
-
- - eec8c89f-334e-4696-b34e-61b913c98340
- - i_export_dir
- - i_export_dir
- - true
- - 0
- - true
- - 2bba20ed-c34b-45cd-b237-6fb28c1269ad
- - 1
- - The directors where to export the xml file.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
-
-
-
- -
- 229
- 375
- 63
- 20
-
- -
- 262
- 385
-
-
-
-
-
-
-
- - 1
- - true
- - The breps of the structure.
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPkSURBVEhL1VVbKOV7FN7ITnK/RYNcNrkrx11SbokHuWQyb0ryRN5ocuLBKadELsktHuTywKBcXgiRUiYvJOVSknNw5LK3OWbO9J31/famOWfPGPN0OqtW+7/r9/vWWt/61vpp/ivTWVhY3MsvfsBfi7/MbGxstvr6+rC+vo7V1VUsLi5ifn4eExMTGBoaQnNzM8rLy5GXl4eUlBQEBQVBEjqTq1ojwjNmZWWVLxc/DQ4OIiEhQXl8fDxiY2MRExOD6OhoREREICQkRAH7+/sjLCwMdnZ2ektLy7cmmG+a1tHR8Y/R0VEUFRWp7OjJyclISkrC8PAwHh4ecHNzg4WFBeTm5iIwMFB5QEAAJIBBMF4Zob5i1tbWv5SVlf3V0NCA1NRUpKWlPTmpOjw8RHd3N3p7e7G0tITb21v138/PT1UiyT0IVe9McGam8/T0/LO9vR0ZGRkKND09HZmZmVhbW4Ner0dnZycmJydRUVGBqqoq1NfX4+joSPWHQby9vdkLVvGTEfILE+5XSUtpaamihQEIzkYT/PLyEgy+ubmJ2tpa1eiBgQG0trbi4OAAXV1d8PLygrOz82cJ8t4E+2R5bm5uH0pKSlRTyTkDPGZO8OPjY4yPj2Nubg4rKysKfHp6Wp3hN+li5b6+vhAV6gXzjRFaGivZ/5aYmAg61cKGkvMvwXd2dlT2LS0tODs7U98E39vbw/7+vurJ7OwshGZFl1RxJdh2Gun8z66urh8ITglSiiMjIzAYDGbgBBkbG0NHRwfOz89xcXGhztB6enpwfX0NFxcXpSp3d3cO6q8aiXQdGhqqtE1nEIJfXV2Zgc/MzIASZrMbGxsVVScnJ9jY2FDKYsXSA3h4eCAqKorTfc0ALSIvQ2RkJB4D3d/fq4tfA+/v70dbWxuamppQWVmJ6upq9X93d1cFcXJyUjjSC2MF5Il8UcecTjozOz09fRa8rq5OSZWS3draUvwLLUpJnHzpq7EHJnuj1Wr1wcHBavwLCgpwd3eH5eXlF4OTFmZPFco3Z+FJRcqkivc8xJFnk3iJFfwIuE6nQ1xc3GeBM5sDWjx3CSVGp6qoEMqVqnkOnI2lerKysuDg4EDuzSeZJlW8k4MPrIBjz3K5BqioqakpNcE1NTXY3t7+R+YCquQtyvkoMN/cRbRXrIK98PHxUUNDz87OVhNM+bI3XBlsqKgP9vb26gzfBunj89vUZG+lZEN4eDhkfTy5DKOigXQ8Zi1vAGxtbdVSlKoJ/t33gKYVqn7nI/K4kwhAfnNyclSm+fn5KCwsRHFxMbi/uBTlzsteNJPxff33m/s9f/mb/D8yjeZvU880QlAx2/0AAAAASUVORK5CYII=
-
- - 1fbd84e2-0cb6-4f71-a6ce-ef8bd20d11f0
- - i_breps
- - i_breps
- - true
- - 1
- - true
- - 35b72f16-8924-45e9-9eff-a5eea8982d94
- - 1
- - The breps of the structure.
- - 2ceb0405-fdfe-403d-a4d6-8786da45fb9d
-
-
-
-
- -
- 229
- 395
- 63
- 20
-
- -
- 262
- 405
-
-
-
-
-
-
-
- - false
- - The string of xml to be exported.
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
-
- - a7582614-58af-4e8e-ac5d-40e739284db1
- - o_xml
- - o_xml
- - false
- - 0
- - true
- - 0
- - The string of xml to be exported.
- - 6a184b65-baa3-42d1-a548-3915b401de53
-
-
-
-
- -
- 322
- 355
- 38
- 60
-
- -
- 341
- 385
-
-
-
-
-
-
-
-
-
- - IyEgcHl0aG9uMwojIHJlcXVpcmVtZW50czogZGlmZkNoZWNrCiIiIgpUaGlzIHJlYWQgYnJlcHMgZnJvbSBSaGlubywgY29udmVydHMgdGhlbSB0byBERkJlYW1zIGFuZCBERkFzc2VtYmxpZXMsIGFuZCBleHBvcnRzIHRoZW0gdG8gWE1MLgoKOnBhcmFtIGlfYnJlcHM6IGxpc3Qgb2YgYnJlcHMKOnBhcmFtIGlfZXhwb3J0X2RpcjogZGlyZWN0b3J5IHRvIGV4cG9ydCB0aGUgeG1sCjpwYXJhbSBpX2R1bXA6IHByZXNzIHRvIGR1bXAgdGhlIHhtbAoiIiIKaW1wb3J0IFN5c3RlbQppbXBvcnQgdHlwaW5nCgppbXBvcnQgUmhpbm8KaW1wb3J0IFJoaW5vLkdlb21ldHJ5IGFzIHJnCgpmcm9tIGdocHl0aG9ubGliLmNvbXBvbmVudGJhc2UgaW1wb3J0IGV4ZWN1dGluZ2NvbXBvbmVudCBhcyBjb21wb25lbnQKCmZyb20gZGlmZkNoZWNrLmRmX2dlb21ldHJpZXMgaW1wb3J0IERGQmVhbSwgREZBc3NlbWJseQoKCmNsYXNzIFhNTEV4cG9ydGVyKGNvbXBvbmVudCk6CiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsCiAgICAgICAgICAgIGlfZHVtcDogYm9vbCwKICAgICAgICAgICAgaV9leHBvcnRfZGlyOiBzdHIsCiAgICAgICAgICAgIGlfYnJlcHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0W1JoaW5vLkdlb21ldHJ5LkJyZXBdKToKICAgICAgICAiIiIKICAgICAgICBNYWluIGZ1bmN0aW9uIHRvIHRlc3QgdGhlIHBhY2thZ2UKICAgICAgICA6cGFyYW0gaV9kdW1wOiB3aGV0aGVyIHRvIGR1bXAgdGhlIHhtbAogICAgICAgIDpwYXJhbSBpX2V4cG9ydF9kaXI6IGRpcmVjdG9yeSB0byBleHBvcnQgdGhlIHhtbAogICAgICAgIDpwYXJhbSBpX2JyZXBzOiBsaXN0IG9mIGJyZXBzCiAgICAgICAgIiIiCiAgICAgICAgIyBiZWFtcwogICAgICAgIGJlYW1zIDogdHlwaW5nLkxpc3RbREZCZWFtXSA9IFtdCiAgICAgICAgZm9yIGJyZXAgaW4gaV9icmVwczoKICAgICAgICAgICAgYmVhbSA9IERGQmVhbS5mcm9tX2JyZXAoYnJlcCkKICAgICAgICAgICAgYmVhbXMuYXBwZW5kKGJlYW0pCgogICAgICAgICMgYXNzZW1ibHkKICAgICAgICBhc3NlbWJseTEgPSBERkFzc2VtYmx5KGJlYW1zLCAiQXNzZW1ibHkxIikKICAgICAgICBwcmludChhc3NlbWJseTEuYmVhbXMpCiAgICAgICAgcHJpbnQoYXNzZW1ibHkxKQoKICAgICAgICAjIGR1bXAgdGhlIHhtbAogICAgICAgIHhtbCA6IHN0ciA9IGFzc2VtYmx5MS50b194bWwoKQogICAgICAgIGlmIGlfZHVtcDoKICAgICAgICAgICAgYXNzZW1ibHkxLmR1bXAoeG1sLCBpX2V4cG9ydF9kaXIpCiAgICAgICAgb194bWwgPSB4bWwKCiAgICAgICAgcmV0dXJuIG9feG1s
- - S
+
+
+ -
+ 255;213;217;232
+
+ - true
+ - true
+ - true
+ - false
+ - false
+ - true
-
-
-
- - *.*.python
- - 3.*
-
-
-
@@ -967,276 +816,8 @@
- - 919e146f-30ae-4aae-be34-4d72f555e7da
- - Brep
-
-
-
-
- - Contains a collection of Breps (Boundary REPresentations)
- - true
- - 35b72f16-8924-45e9-9eff-a5eea8982d94
- - Brep
- - Brep
- - false
- - 0
-
-
-
-
- -
- 156
- 398
- 50
- 24
-
- -
- 181.23218
- 410.9286
-
-
-
-
-
- - 1
-
-
-
-
- - 3
- - {0}
-
-
-
-
- -
- 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
-
- - 00000000-0000-0000-0000-000000000000
-
-
-
-
- -
- 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
-
- - 00000000-0000-0000-0000-000000000000
-
-
-
-
- -
- 7F0JVBTH059druUQQQW88MAbjReCKMKOgwhiNIiKgqggQfFAPCMoCR4x3miioiaamGjUeN9KlCOiiYpGJZ7xxNuoaKIGo0a+6bVr7TQzuPtXvjfL6997w2zPdM9WdXdVV1fVsJyK47giEeiMYKcW/4SFxg0enuCfEB+fMLxJrbDYUaMHJwz39W7aqmnLVs1btWrawrN58xZNavmPHTZm7KhY3+GxY8eMih7WpFbI2AHDBsd0jk3qkTA0drivp2fLlt4tYtu0jmnt6enp0dwCfUlF3bObBsYmxMeOGZXUVBgVO8JcvG710auvsYkeFRM3+KNYjw/jrRNGxA4fPnbUgNHmH0aPiUaVNBqNGlHo0IDjWorniMEOdtZm4ofy6M/qPI5TP0tRc1+JHxCeF6m5Spgz/30JD91XaDouO7s6b/+v7l4NX65v+0K8H4PrtuQmcvyWNq8KDkHiH0QueloGV/xpVRw39etme9Ix6yXnMEXl9jC4apILetpUfN8BUYmAzvD5NR5qi116dT2LvkK2bZrufSHNtTdf/Hmv70F5bOzU3UUp6olQVhwz3UIdF3vMdNcxQxMPZahTuOpFjCKZ2Tep48dPQ7rz5MhsvnhwQlJLDz3xNMPDy83OUCQzNKFS1+h2hW2yP1YkMzAiu/Y/Wnx/dYTkNIN7UL531SVWkcxIjQxNPJShzrknBQUmMzI08bQC8HePmq5IZkrSZjQzUPcj3yVmimQGRuGRX1rbfQMGS04zuAflaKu4VEUyIzUyNPFQhjo5XkX/KpIZx9sf7vCqEPefkUkaFbbCvFNfPfG0DH174cZfimSmJG1GMwN1ew+fpcxpBiPyiuAhktMM7kF5R9C/tRXJjPzIvCYeylCn4dIvV5jMyNDE0wrgctK/NRXJTEnajGYG6gobvlymaGbKxH7GEEMTysGRZ2/sCK3Lb3707EOTsQBo4qE+lMc+T3YyGQVAE0+3sz8Wd0CRzAA24N2llMzAPSh37/L7FEUyUyZlZjy2x6RkZqjt6RMpyT315WuBPZTp0ChTMmPeufDorSjXbHxpIrr2de/8J4dPh+gXzWW4/G144wEp21z4aX5nYkyGmbgWMVXXdfqAx/d4KEO7XzbmdlUkM8txb5PmTH7EmuArToE83LuCy1Cnc/nCOJNhpii3ML/FtZjXsnLkVVmNR8rqI6+9imQGy0c27v1sdI2WEXqk8lcNm6lIZmAKgdCja8dykwa0fxmgV8W0zOy8lJirSGb0BOEphK7BmgMjQ/sEfnnEuZkMM1dzMvtufthDPxL5uAx1RnJ9LpiMaj7565/pCcHR+pGAMshMl1V/v28yzMR5bUnq4BvNFwXjdQaXoZ1m1zhlhjRwr2djOdFpM3okaBka4+/gqkhmgFBgQEpmnBwPT3oeHKLXbupqtcIVyQwW7mysfnUjQ1vJoLahXau8lc1Nhhlae9G22h+jK3ygSGaw6ZKNhTybXEihnu+VINX3zV9Ps5+7uwWaDDO0LUZrt2R1rjKjAAB+ct8lzar5Sgab6P3Nndm2PyuSGSCUdALSAk/7BKI6pH+uSGaKWp/Y1GFiND8htEaXTsNidcyE3PHrNcYrtpgFAOVjDh6LFMkMEAoMqCUEfnZY3zmtt/D6svnehCGKZAbULiyU5DWoRy+ik62f/8KYKfWRAbWLt8rkNahHb6PPur33r8kwQ9ti9M7z+o+PVYpkBmuobGwh6xbNs7MuBJQr8NVrrzxcBqs5ecu9EJNh5khEtT71hGC9LQZlaFcQUbDMZFxNW7DXH0aCzj8bGz63yGSYiWsytMYB/rXAQxms6Ib3Nx5WJDNYHrI3vup93TSjZYQeqSMzHAcokhnMhF7I0bXGwetHPJ4WpNdeuZTMLAwtCFMkM1KuJjBtYCRoW232+N/rmAwzl1rU4x9889qcuYzLsL9Z07ifMtMaLSVcTU79Jx2/OWegfiSgDCOVlXgh0mSY+X5nw+9D70TrtddKXIZ20TXHLFUkM7jXs7Fc6LQZPRK0DPX4s2uSIpkBQoEBdO0CJTM+tXf2zLzRRa/dDv5xRZnmDBb2bGyy6EaG3oydw2ob2k2Nm+xkMszQ2ou21R4eW3VakcxgUyUbC7mOGTojo/DlqpDzq7z0I7V+Z0qhyTBD22K0drNcOkOZ7wIkuxyK71KvE++d9tPMit+9CgPS0WV6f3OgIGSGIpkB4QYGyGtQr5i7dt2VTEXnzrTdl+qV1zBKMq2RtghWmY8sp0hmKmFCyeQ5WuChvt5xnu6jzGATmPdgXJLbZqhHG56+d623KpKZw5hwWPVJBqEebRGoQ5ZvViQzYESCOiavQT16G90jYFu+yTBD22L0ztM5VPOfl4E+/cLyZ/TypmtNTGBdgsOjRnC4EDg0e4ccAsg4RwO7rl7O3frzIVaz2qnMQvnQa1/N/uheT/7A0N+u3fPvzcf9m99gZx2BT9wRH7Y+oQvvMvTBbKnhUwxzpAtHjom/nl/2z3Dvxft0q7u/xg4//vOU+GOTp3bjb5k5TlU0c+BQQ9d6LI1Iu9m6H/9H9RXn4r8O4etPz2te58fe/Ispa66sOh7J517tmrN7QxeeTzxwTtO5F+9XcHiJyYyc3LSUY3rQ2e/MFMmcVH6x3LR8suH01jQhgh88roew8oUvn4yv+2/Zd0qRzEmNnBwTbn7XKgxqFM6fOrp9Z9gQb/4LLHP5FZd1NJmRk1MccsyF3v6TUyRzUm9XyI2c++o16iuro/jE+s3afDAihO+BZbHZle/HKZI5qWkpx0T7BxtbBlWL4uslpq4f59KVd8cKpefQVJUimZPK8Zebfmu+DSvwKgjnXUJ/GLMmpB3P1Qx9b3nXUD51Q/lNimROKudfbuTklohG67x3mQxzctNPbp0Ldho4R5HMSeVqemTHVxrWOZyPOPPT4aKsDnz7hCNOVbd257eOjkgtdyucnz7c48jO4I68W8FL76t1Q/kfg0emKZI5qfDgrhX2iZNG9+FdPfoEeHoH831ds19wP3bnvR/Wfnn5TAT/5Ks7/p9sCOKTv55zzjuwJ88dtOynSOakMtPlmJMbObV7zghFMicVpGrQ0z/u7IwIPmHi7HHOA7V8/rJPQ+J+CpHVlidn3M00GZnbcMLm7Nrxffjl8cnb8pwEvm3Xin9mXuvON5la2O1950j+iHnB9hnL/fnqRwMqTQsL5Tu1u7FXkcxJpRjLjZwcc+s0575VJHNSWbpy009Oi4Zo1nZQJHNSia5yWlFuulYY7alM80sqV1RuhOR2Cy2WNhigSOak0i3lRiis5raJJw705bddXfD505uBfF7Gusw9PmF8RpWJbopkTir9Um49k1M0LvfafqhM5iSS/uS0otzinuEcul6RzEnlzbk6uG8/ahXJz9z5s3v3zZ15t/1fzc/9OIxfluPcNGFFJL+ti3cTG58uvNr/153zxdGu3LJTPZOxLSe0XhgRNKwvX5iUvT/B+wPerbDwxfGMnrKuvbMrz21QJHNS2VtyzMmN3PGLzSoqkjkp2/JU3jfPRkX34y8nWc7fNLITv7XdpfwpG3vIast6dTrfUCRzUjlErea32LA2tR9faO/q3u96J/6vkafM/9H04rd1rNHgfff+fJ1VqY2dEjrzeQ+tGv40oSe/xLNykCKZk0rDkRs5Oea+66Vep0jmpDJZ5KafnBa9a9W1uyKZk0oGkdOKctN1iJfvZUUyd1Yin0JuhOQM6rHba05TJHNSKQlyIyTnFZvFpykzVnBEIkVBbj2TUzQtP65krUjmpALjclpRbnH3bFS9LcncgyMpFihQHuiACbYnOK6iKs6xy8GowGsEx+sapmYijvPlOC7t/w4G9pr5/xCtNDYu3X1D9hmpqaGYjpKKlUl1lLGMGxtM/FbTJlnRHSUVd5PqKGMZNza8VX/I32mK7qiS/vsT2VHGMm6sqF7+c9MmRXdUSTpK/0qs+FmOcbkONDZJYal5eo0y0VFyM0FuRhmbExA9+7mHyXYUKXrnHrq5eVr25jem2gTk5ffgP3I/8/1FvzDeclKzyRb3w/iglW5X/T7uzgcfKxc80y6cP3Lb7JNRdyP4D201n8V90po/fSswdd7ZD/h/Eh0uCXnh/PHouGdV77XgsxZH3H2cHspXXlvxfplQ5l9qPPpmWvblD3h9mrH+Fw9eM3HEt8mdQvhfFmszUu/34aOqHorJHNKEv1B3dUAjl+78Dw6hqkm1I/jPltwJrfO4O//FzjpchaVh/Onl/aK7acL5WptUD+fODeUH9olYmTk4nK9eN265ojvKUNGTm1FyHSI3o+Q6/GkkX2SyHUXOKOu60/82d+3BJ26639I1vxe/OSIr8zePMN5r+4KwU2Zi+OSAxfEZyWH8p0VPBkxUhfOjJk5LPHk1mh9Wr+WYv0f78Ct/Sp3pdLU7P+PgnDXtwqL5sxO+uL0m35NPHHig6b5NYfyJxKj8MiF6T10vvdDMHcAfzxrgsudlO37vwoNB5b/swZcfeL3JSPUAvp1zzqz4Ya35eW2L7u0Z1Iuv0N+zKH5sT97hdHqfX8XV72DTf5KP3g3jtQ/a9/eL7MGvv3viadvLYfzS35rVHp8ezs8L+uuQojvKUNGTm1FyHTIGz6g4akbJdfjzq1/fKxMdxcwDhXbUhMVLQ5FL4Y45niWV8Q05yxdmETrbEEygGSln/ZoRdcypGSTHgBmubykeMMXhe+U6yQw/E51tiTYl7Q3N8H0L8bAi2qCyXCea4fuINmuiDSrL7QzM8PM1VL+ha3KDa4brI15qE200JYTPURs73GcViDbWJQRuoQ1yJzkTbRCdcnFP1KYcbuNCtEG0yrlZoU1F8ahFtEHfLRc81v04mHg4UrSVKyH5A9pYU31gX0JkHrVBbjUnTB+gfAkxYWjjSPWBQwkuaNSmMua/BtHGsQTnJ7SpKh5uRBvEm5zvELWpgtvUIdpULMH3D22QDOF3cXRAc0nOAYvaVEP8UrQ5lRBAgTZOVB84l+DdRm2qYzkgaXMpwa8KbVypPhg8sdogpPQa2RAvHEmB/P9lSBmB1nYooS6qh5fnYsYVPAMdKkrh0HWllmd4k8UMDyTUIRWkVF0zme9An0mlWa4EeswJ5U17LkGxo+eY48nMydRFitOihO+wwM+xoJQ4XRcpW0uZ74D2upgsnmhy9FgR40AbyOa4vRorXVKZ0HXRfU0JtFrh51hjpSLHlzWxqNBp6xZ4jNBzbCiFSNe1IRYa2i8I/abGypdUeHRdW2Ic6HtWxPyhFwK6LvoedHASOZgazLMaKzqkhDiZuuWIeUqngdhgWtVY8SElw8nURfSig5PI5rUh6AEFwsnULS8xnpDcYEeMVw1KcdF1HQi9QvNsj79DjRcO0hig6zoS8keng9oRz3GjlCJdtwIx3+nMS8STBj+nnniQ+pOuW5GYX3SSIxore/ycBuJRn3gOXbcSoefofEKgBR0NxaMR8Ry6rhOhD+jUPXt8Dz3HXTwaE8+h6zoT8kdnyaG5Y4ef00Q83iOeQ9d1IeSGTkhDY2UD0SLxaEY+h6qL5AaMdzr3C4wU9Jzm4tGCeA5dtwohf7TMVCDWHfTzrR7Ec+i6SP7QwUlkNFUg6GklHp7Ec+i61Sg5JmWmEjFeXuLRmqpH1kVyjA5OIk/HGY8Beo63eOBfkZWs60roAzolphLxnLbi4UM8h65bgzB+6OwTxJMDfo6veLQjnkPXrUnoFTrRA42VM34O2tf7Ec+h69YijHI6p8KB0KvIaGhPPIeuW5vQT3T6gjOxDgri4U88h67rRhiUdKYAmjuV8HM6iEcA8Ry6bh1Cz9FBeTRWFfBzOopHIPEcuu4HN6qP1RmNSOHBTwzToP/hLRiCYBiVBLqtoaANTtLYJI1WMIpKgtzPxL4J6hJ+TxdNQtjNg0EmBbqtsTTQhi7wQl4HGmiD+F31AxjJtJFpTnk/YD7QGwVOoq2xNNAGNvCCroGBDTRYyNBAtzWWBjDOaV4sCcOcnA+l0Q+kYU/yAt9LygfMz3fdD7ApoDcLiC7YXJDzobg/tnhbY2kgNxQkL4gu2JgADTA277ofYDNC/w4qoqscMQ9hPkjRQLc1lgZyI0PyAvJiTs2H0ugH2ATRmyMbSi/CfJDSU3RbY2kgN1C0nkQg4wQWb9CV/2s/wOZLarMJnlJyPpRGP9AbN1IurAi9BPOhNPqB3PQZYj+UZEMYum7muXp8nfH0RhGcYcNoyJoFcvK2upqmATabhuhJSxkajNWTNA2wUTVENiFq8LZzkqaB3OTSvxYJTj+gwVzGYUe3NZYG2CBLrd2kDQmfLUphPsDmmnZqofUCnGBAA9gUNOi2xtIAG3MpHQWOL+4NztO3nQ+wqaedPGgNAacZ0CBnv9BtjaUBHAKG0mBZCjSAM4F2MqA+B6cfSYMU6LbG0gCOCENpsCoFGsCJQf/Knz0eB0QHGWSQAt3WWBrAAUI7QhEN4DiFfuAknOKcRFtjaSCdJ6STB63n4HQFGsg9sBSgrbE0kI4XQ2iwLAUawGlDyxeyKcBp/KZ+eFvZBIePoTRYlQIN4Cyify8O2TUwHqRcSPUD3dZYGsDRRDvSEQ12VD/IyQXd1lgakCO+roQTHtlW4LQnaZBaN+m2xtKA/GP1DKRBzh/0tjSgQEJ9iSACsp8g6ED2A7k/BtBtjaUBBTQaGEiDWkYu3pYGFAxBB/3LY+A81Rjgl6PbGksDCsY0kgjEIBogcEPatFJzkm5rLA0omOMu8TtfYOvaG+B/oNsaSwMKJjWWCCTB90NQCmiQmpN0W2NpQMGoJhJBKGRrQ9AKaCD3XSTotsbSgIJh7xlBg6YUaEDBtKYSQTRk70PQjaRBSjbptsbSgIJ5zQykwVKuH96SBhQMbC4RBER7DggavsmuptsaSwMKRrYwggabUqABBTNbStjnaN8DQc839cPb2vYomOphBA22pUADCsa2kvg1pKp4HCoYsL+g2xpLAwoGe0oEghENEDiGfuAIfUGCbmssDSiYjA7aPkf7Pwg6l/b+ojUV0H4TDTalQAMKhntLBMHRHhSC5m/qB7qtsTSgYHwbI2iwLQUaUDC/rcTv6rji769kwP6CbmssDSiZwEcikQDRUInqBzm5oNsaSwNKRGgnkYSA9uKQtEDSIGXD0G2NpQElRPgaSAMkyr1rGlAihZ9EEgXyB0DSBdkPUr5Buq2xNKCEDq2BNKhl5OJtaUATiJf4hZZa+PscDNhf0G2NpQElo7SX+GEVRAMkrkA/6F7akXgm3dZYGlAyiyDxeyi1se3obMD+gm5rLA0omcZfIpEG0QCJNxxBg9ScpNsaSwNKxukg8esjyDcDSTvkWEjJJt3WWBpQMlCAxI+GyNEgpSfptsbSgJKJOkokESH/ECQdkTRIySbd1lgaUDJToIE0WMr0w9vSMDO1qhVKmrJWE/+xhMNf1hwbmy2ppBwVdlqgDQBa5JHhxxOGNwQlwVkASQxkQocdNuDQph8pAjT4NQhHPQQuBGzgtKWCvTAx4BWX8vg+3DMnNidgnANdECStix0fToQCAHrNsZOsCt6Q1yScxBD0rIYdSLXxZhWcpxp83xVvpOvgjaSK4MscL9TtsSOsMb4PQQJzvIi2wALbmjAibfF9D7zAtMGTGYwrO3zfEwuaD55oKqLPzPEC6U8ZSOjeuMI03esXbfCkcIRJIbWzgkGls9xIi5PUppDJQ0fsyWg2mXkFmScWlARA9B8ymaA+TDTILoLr4EmjXwOwJjqe1LgQqYGICTzHluhoqMMRHmw7SluUIzr2Tdl9ZQm1Fs0oD+8Owvt58L4hvIMH7y7C+3Ro0tkjrSNChd6j7WBe/D3a6yfPdA2885tj1o1X79G+l14tEr1Ha4fretpR69a4mHLNAhZm6t+bnde9RkQvp3v6Mu2zhL05XIfy9Z7pQsGaJ+0jPx4qpE9/JjhUnifUOnFA1FATxWfpjyzi+M+1IhEqxGIa/iLdBlHqdSSE9/yr373qVbXY275SrzYhTOtwK7hyr9PaV+edunY6uftyCcIdLaf7bjA6SV35Sjwt+9pubuxxdDbcteVsbKzEflRxtra25iqVtY1GY2mlVnNqKyszS7Xa0szCwsZKo5kn1l3Y8M4E3eO/wY9P/F01j0so2ip2k7XYTTtiNgleWX8Kwx99KlQRu2xQzX3CZldHIUbsyrtitz4Ru9W5yWyh9dSbwi/x8UJg7x+F6D6HhZdF9YTj85YJ8d7HhJ09WwqODT4X7JaeF374qZtgdXyZoMo6Lfw5NED4uc1aYbjfFWHJ5L5CZME2YXy1G0K3s4OFZZ+uFvwH3BVScpKE6QUbhOwdwsEvz3puQDQ3Ojvzax3NkHSe+PtXOVfTs1YG/PpJwKF95UZbqqpx/mH8P4HP+26PEu/vX/nsKtdo7WOklvVA5T1ro3TdDeeUsy11idyjrlTXZgyZ5gvnO45ndNfhfHzILD90Hc7QDkaABrL+vaMd1uqoHqinOiYq2149xXxQ5XGD29y+v323Rxevfar69tdyrre+4Nut7+AP7W4dm5X49MnJHZx3StMFWc1DfX74ZNvunJw1Tv3Kd7jo6sz/U3558uJn1S6Oi0y6fG7fP4vE0ss5Ic+jkrl7T4WFFW621y0HKwnSpMirX3NU7ZLfUafx7ushuhZ8EHRBPK13/bXWf97NRwrFx8xwhWKG63rCcrTdcmLc7lFXtHW2RdtHd7uuPRR4webZzkPaaj2mj956ME8rl1QDCgTeIycVyobQHJ1CyaiUJ+wSJcJVlIIyqlBUnNoMKfe/h855wclpgJ1iP9S88aA9ut628yFhu9g/6DpqOMjv7DHO77FF1uhLjbIe52uyDPmMjMuCGaN+5jSz3LTHd3Xxy1lopjuj8oKANF0ZnfXzRKIv0FA2/thnfrG1gl4j6KGHst7fa3pyNN9poUUxOdIlHxooRxpyYdbAgvwkU4vmb9GjB1q7OYLb1V3XtRPa1D04M+22Vi5RUG5h9hDnCciRRmvhP3HylLK8MFtwVlbWommr4iwsLMSF2dLKWmNrjRZma2u1mY0tWtzUNVoIUguynHipxG5LErsNLdTC75z/3j0jdAv17pHHBGHq1faqsV8I+7ueFLY2f95esP1M6HXqvLBwo4NQ6PqNELP1itDF3FXw3v6FMKdpgbC/tVa4dHGLsMT2kZA8p7NQc8z3QtjYx8JDtw+Eg4G7hQGh/whrEvsI1pfWCXtGaSef6XXzG0Tz3OfmtYsvyIP757ntSgk4JExpM2ViOW6Jd9t/0n8f2ggtyJ8EDpwrLsCFvo5Z9bToHLa9g5ZbnqJFZXRG5dxjff3gfOFzD+3ltBO6Mjqj8vFLLXT10BmVK18K1pXRGZVlRlW/IE8eUn27juoheqrPf3L90exduSuqV14e5bOgZuW63jm7O+fmb7vYap1/pyUjkirXrN8/vNLOxQc8nH/dNPkvl45DGpxKcB63e1TBtV+TN3XY3W52Fude82Fe0737mzg1LX8t5/Gsn1v3Szz9leWiaX9G/8VFZnQ6dTK6W6QJKpNh+xvE/H8syuna0E+/y7+146BWLsNTblFuJpqpO8TZv1GUBKRMyriVD4vyyySrdE5OC8iZ8ahhWPn37qNFWSsuuFpxwdUa8hktysMPJm3Gi/JR31eL8lFfVNZuCtAtyuisnycSfYGG8syk03H6JF64Qf/ANT30UDbhRXlxx3SHdytH9KKcdnhf5cQ/bmu3XD12rEL+XdndMsgPXIdylGjgVRZXGliUkRztFedPWZUjM7XOX1o1JKITR8oLKVOk0UuuxKhhzPVHp7jUT3/wyyw87ZfTo3eWIZ+RHEVXfTxatwr+1D1QtwqmafrrVj9URmdduQSgoTx+7LyUi1t6iOE6PeQmKEe5sefrF5MjrRFyZEXKEZoa9iv7jvaYckqbVmNQ3iS/a9oznvWm+3T6TWs/UPv3CK9zWrlMOehEyOKDMmwSy4tWWpZojVlw9YUzokukzMqRWEOlViORGLggZzFHuoHIjSJpvZJWKmoYesqyEMlSpignmaKcaA35jGTpzi9zDnFLq6z3u9DpS7/yj6to4Tx92yG/P4aodGeZrtABDefckXOC9AmRcONNsjPU9vSJlOSepixLUbebaN/tmvRN4YSjM1fmay98fbuya94tbNud087f4zJtcdFFrVyWIc5W59PXtxKGNvPkoRwhziUfcZ74iDuYXHE3kyG6FMu0LL1ak74z/6EHR7pQSZkid3W0HGXYx6zmYvrFa0NtN7XrOCLLz5DPSI6GzO89mQurWw7ZdH7ovP/FA7878/x0ZXRGZZlu0AEN5dbph7roE0nhBpRhSOmhhzLcN0E5SnLvcat05OgSlqOnDXreTIm8pM3vEtRibmi+FrJUuSP/zVJV407MxnLE4fKzzNNCqrj7byHu+IeIu//Nojv+qOiCL6NyJK5HOjlKsVxuw5HeDjL8QIYlSO8IajhbmzYVyVGWKCN7RRnJNOQzkqPlUeHPdHJUdO0vndyMX2CjRWdURtdRWaYbdEBDWfW7DlX0icj6O3ioYYjpoYf6atOVo0UD5699t7Yd7JHqDfI+9eLBJT1R57Pjdp/avkt7LDdpQPuXAcWUEizqhXvMwmte89cv8gNFnbxO1L1oPQI5shfnT1mVI06tVqvMdP6GT7q/d4IjZYZch8i1ipS3t7LtPjuUOEK3T9q4KsP3Vkqhbv3Zt2qB7rwpZ7kfui7TFTqg4VTHW2ZwMMwwjPRw02uWk+PhSc+DQ0zZtov0se9cOrLk5XbxxIFyF7QVzW9dUU/K1zat/njRsnHXtZDx53slSPV989eGNHRi6vgV/f2HtNd3KqxJD0Wdu0D0Qi8XQ8ExYii4jMqSGu2T1CoVEoldTVas5cjwN7n+kGsU6Z1/K1lq+NWIazpZctHYaZsNv+J3f28dbeGWGX6o/LdjdV1Zpit0QMOZ4tNuuT6xE27AcMOw0gmfs8P6zmm9hTdlWVp8avWp0vHdnfCN/GtZUa4+ML1p0Q+TqtU9oYV/uXaZypYEIzk4ssGCBuPq6Y3mQeJcyhDnSWUxcrNcjOL0FlMpyrAswT4posPI0RyZOkLKFBnNouXI6uTHuZxQo5E27n1rrdd4S60hn5Ec+Z44MV0nRyggjc4Xas3we/iivx8qozMqy3SDDmgoM7vUWaP/r3pwA8owpPTQQ9mE90mP149ZVDpydPg/cpSuTbS98W/6sANauWxbeHvHF8sR7JOai+lMd8Sop1qMdA4Wo56fiWlIXcXUpjIqR+J6pJOjvVl2rTgyykumYJEpXmRUGDX0ujH9DpKjLFFGskQZyTLkM5KjrJvffYTl6KjvK/nB59jGOrlCZ5lu0AEN5fhB/v/qE6rhBj3UUIYhh/oq05WjZzNver9bOQIfeIeT4/LjRpzX++06eS64893LK9rGwetHPJ4WVCx7Hxb1/V9f873bvwnfCZdHizp5rKh70XoEcjRXnEtlVY44tc6u69ZtuSdHyg65BpHrFClrb2XXhU9+PlDn/0Z+usAp5/1cnlhp0bn96Yt+6Hpmru7VKj0jNNBQDnhWsJiDIYYhpYcaXiKBsk/tnT0zb3QxZbvu0bKW8aWzHjWqsGd0uZ65+lhSUHtNg/XaK3oiC1+uCjm/yquYHD3F16EM69FPor7tJMb3x4px/DKc24AWJCQOAYsqhHNk3gKZ20CuQeTa9FZyNPLInobcsDURujiSzq7D5+h/VVp0PfTCozfK0bm/J56U6SrCpUQNcbF/Kmd6cvSzJvB9Uo4iQzwSERvkjzu8xi9Je06gxmkd1v7nR3Llw9kMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDKaN/wMAAP//AwA=
-
- - 00000000-0000-0000-0000-000000000000
-
-
-
-
-
-
-
-
-
-
-
-
- - 06953bda-1d37-4d58-9b38-4b3c74e54c8f
- - File Path
-
-
-
-
- - Contains a collection of file paths
- - false
- - All files|*.*
- - 2bba20ed-c34b-45cd-b237-6fb28c1269ad
- - File Path
- - Path
- - false
- - 0
-
-
-
-
- -
- 156
- 372
- 50
- 24
-
- -
- 181.49844
- 384.07333
-
-
-
-
-
- - 1
-
-
-
-
- - 1
- - {0}
-
-
-
-
- - false
- - F:\__TEMP\test\
-
-
-
-
-
-
-
-
-
-
-
-
- - a8b97322-2d53-47cd-905e-b932c3ccd74e
- - Button
-
-
-
-
- - Button object with two values
- - False
- - True
- - 83363e37-e611-4b77-bcde-c28b03d7ee96
- - Button
- - dump!
- - false
- - 0
-
-
-
-
- -
- 104
- 344
- 102
- 22
-
-
-
-
-
-
-
-
-
- - 59e0b89a-e487-49f8-bab8-b5bab16be14c
- - Panel
-
-
-
-
- - A panel for custom notes and text values
- - 63a2f4e1-c253-4fc3-9148-719323b802e1
- - Panel
-
- - false
- - 0
- - 178951a0-3c74-4810-aef0-87cc45b0502c
- - 1
- - Double click to edit panel content…
-
-
-
-
- -
- 627
- 289
- 411
- 166
-
- - 0
- - 0
- - 0
- -
- 627.30396
- 289.70813
-
-
-
-
-
- -
- 255;213;217;232
-
- - true
- - true
- - true
- - false
- - false
- - true
-
-
-
-
-
-
-
-
- - 59e0b89a-e487-49f8-bab8-b5bab16be14c
- - Panel
-
-
-
-
- - A panel for custom notes and text values
- - 5262b483-9441-440a-a74d-8b235aad399d
- - Panel
-
- - false
- - 1
- - 0
- - Double click to edit panel content…
-
-
-
-
- -
- 494
- 71
- 343
- 118
-
- - 0
- - 0
- - 0
- -
- 494.05792
- 71.25596
-
-
-
-
-
- -
- 255;213;217;232
-
- - true
- - true
- - true
- - false
- - false
- - true
-
-
-
-
-
-
-
-
- - 537b0419-bbc2-4ff4-bf08-afe526367b2c
- - Custom Preview
+ - 537b0419-bbc2-4ff4-bf08-afe526367b2c
+ - Custom Preview
@@ -1352,7 +933,7 @@
-
+
- 537b0419-bbc2-4ff4-bf08-afe526367b2c
- Custom Preview
@@ -1471,7 +1052,7 @@
-
+
- 9c53bac0-ba66-40bd-8154-ce9829b9db1a
- Colour Swatch
@@ -1493,14 +1074,14 @@
-
- 271
- 202
+ 276
+ 220
88
20
-
- 271.80634
- 202.06458
+ 276.14133
+ 220.3679
@@ -1508,7 +1089,7 @@
-
+
- a8b97322-2d53-47cd-905e-b932c3ccd74e
- Button
@@ -1540,7 +1121,7 @@
-
+
- 06953bda-1d37-4d58-9b38-4b3c74e54c8f
- File Path
@@ -1597,7 +1178,7 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -1649,7 +1230,7 @@
-
+
- 9c53bac0-ba66-40bd-8154-ce9829b9db1a
- Colour Swatch
@@ -1686,7 +1267,7 @@
-
+
- 537b0419-bbc2-4ff4-bf08-afe526367b2c
- Custom Preview
@@ -1804,7 +1385,7 @@
-
+
- 9c53bac0-ba66-40bd-8154-ce9829b9db1a
- Colour Swatch
@@ -1841,260 +1422,102 @@
-
+
- - a8b97322-2d53-47cd-905e-b932c3ccd74e
- - Button
+ - 919e146f-30ae-4aae-be34-4d72f555e7da
+ - Brep
- - Button object with two values
- - False
- - True
- - 748edcb1-58e5-403f-83e3-9b75ee2319c3
- - Button
-
+ - Contains a collection of Breps (Boundary REPresentations)
+ - true
+ - 39d914fb-05fc-4c33-93a8-98326df3e596
+ - true
+ - Brep
+ - Brep
- false
- 0
-
-
-
- -
- -320
- 119
- 66
- 22
-
-
-
-
-
-
-
-
-
- - c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - 066d0a87-236f-4eae-a0f4-9e42f5327962
- - script-sync cpython
-
-
-
-
- - This allows to run the current active cpython file from vscode to grasshopper.
- - true
- - 2
- -
- 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
-
- - e0bfe966-26b9-4831-8ac9-46df1627f515
- - true
- - true
- - true
- - script-sync cpython
- - scsy-cpy
-
- - false
- - false
- - false
-
-
+
-
- -232
- 118
- 111
- 44
+ 159
+ 656
+ 50
+ 24
-
- -182
- 140
+ 184.61072
+ 668.0817
-
-
- - 2
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 2
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
+
+
+ - 1
-
-
-
- - true
- - Connect a button to open a file dialog to select a cpython file to run.
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC
-
- - 723aff78-609c-4ce8-bc1c-cac8178e9846
- - btn
- - btn
- - true
- - 0
- - true
- - 748edcb1-58e5-403f-83e3-9b75ee2319c3
- - 1
- - Connect a button to open a file dialog to select a cpython file to run.
- - d60527f5-b5af-4ef6-8970-5f96fe412559
+
+
+
+ - 6
+ - {0}
-
-
-
- -
- -230
- 120
- 33
- 20
-
- -
- -212
- 130
-
+
+
+
+ - ba3151fb-3a8e-46c1-bdba-27ad41a4d1a2
-
-
-
-
- - 1
- - true
- - A generic x input.
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5Hz+Xw+5HwsF3LIZIuIG0lusUuulMmWHC6c4sYhkVxIkkJcaQ8p4VYxeyvTKmuN2cbume95raVpm723uZrmrTe/9f//877v8zzv92v+qwgyMzP7Xf3Fv8ifVL4urKysPkxOTuLg4AB7e3vY3t7GxsYGVlZWMDs7i/7+frS0tKCsrAyZmZkIDg6GauhX9ar2CeE7YWFhUa5e/HNmZgapqamSKSkpSEpKQkJCAmJjYxEVFYWwsDAB9vf3R15eHtzd3Q3m5ubvjDDfDK29vf3twsICqqqqpDtmRkaGFGKR+Ph4REdHIyIiAiEhIQgMDERlZSWmpqagChgUxpsnqH8IS0vLvqampsfe3l5kZWUhJydHktcsUlJSgpGRESwvL2NgYAChoaFSwM/PD+fn51DNfVZUrRrhXkSQh4fHH8PDwygoKBDg/Px8SV4PDQ2JBh0dHaitrcXp6alcBwUFIS4uDgxvb29qwSkSnyD/For7PY7Kl0mLqQCF5Pj8nTQlJiYK4ObmJnp6eqRAV1cX9Ho9PD094ejo+EUV+cUI+xxlLi4u9zU1NQJCOkhLRUUFxsbGpFB7ezsWFxfl9+zsbBgMBikeGRmJq6srHB0dQTEAX19fKBfqFebbJ2glrOr+Y1paGpgUkkWKi4sxMTEh4Kurq2hra0Nubq48Q6p2dnZE5OnpaaFncHCQTpIi1ERN8ZvCttEo5XucnZ3v+SItSCuyyNzcnABubW0JPSab0gA6nU6s2djYiMfHRzw8PCA5ORlubm5wcnIS4dU1F/W9RlXShYeHi7eZLNLd3S0CEowdknfac3x8HPf396irq5PJbm9vpfvR0VHh39XVlRpIoZiYGG63jgXeK3sZ6G0W4o39/X0pxA1uaGgQe66vr+P6+hqtra1IT0/HxcWFgJ+dnSEgIEDoUUzAwcFBcHx8fDjBzyo1NuSLG8ntrK+vl+OA4nECBinhJKSItNExDBbkdOSd3ZMeTsLNV7o+aWCMt1qtVk/R+vr6npeIBZm85r3m5mbc3NwI+N3dnbiJgKTE1D0Nov7nLjy7SILe5YOdnZ3Y3d0VoehxZlFREdbW1gSYwYOPBb8G57NK7C8K7sUeMFJ4lnCJKN7h4SHm5+dxfHxshAUuLy9FAy8vL6HFBE5hSQ8bsbOzI/cvN5mhplhVD36mQ5aWlnByciLJa3VGUTjpmoKSc1PnClT0UQZ5UDDfPIsYbzgFxycYuzQlQdmxCZgdK/fB1tZW7nOrlY7fP02N8U6NbKCL1PHxnCZQ0mHq2sbGBtbW1rITSjOC//B7wNAqqj7xvKff6RQCkN/S0lLptLy8XL4B1dXV4PlVWFj4+i+aMfh9/fqb+6N8/Tf5fxQazV+PmcVeVawFwQAAAABJRU5ErkJggg==
-
- - 23c7ad3d-125c-4b83-82c2-8433f5ddf85f
- - i_crvs
- - i_crvs
- - true
- - 1
- - true
- - 84780236-6585-42d5-b303-6e93a13af1b5
- - 1
- - A generic x input.
- - 9ba89ec2-5315-435f-a621-b66c5fa2f301
-
-
-
-
- -
- -230
- 140
- 33
- 20
-
- -
- -212
- 150
-
+
+
+ - 322f4e22-d195-435e-b290-052cb2318277
-
-
-
-
- - false
- - The redirected standard output of the component scriptsync.
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
-
- - bc0b23c8-8d5e-4b50-a901-58cc919b8362
- - stdout
- - stdout
- - false
- - 0
- - true
- - 0
- - The redirected standard output of the component scriptsync.
- - 6a184b65-baa3-42d1-a548-3915b401de53
-
-
-
-
- -
- -167
- 120
- 44
- 20
-
- -
- -145
- 130
-
+
+
+ - aa56315b-2905-4049-8c41-0cc8b39d864b
-
-
-
-
- - false
- - Generic example output of the component
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
-
- - 9bfd0091-47fb-4749-8c63-cc0b3f284701
- - o_brep
- - o_brep
- - false
- - 0
- - true
- - 0
- - Generic example output of the component
- - 6a184b65-baa3-42d1-a548-3915b401de53
-
-
-
-
- -
- -167
- 140
- 44
- 20
-
- -
- -145
- 150
-
+
+
+ - 7fc04154-255a-413f-a8a1-6ea034e1e779
+
+
+
+
+ - 5981a85d-0063-489b-8bd7-7a1ebe1453a7
+
+
+
+
+ - aeae5255-2a74-4040-9e44-e3aedf934485
-
-
- - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKCmNsYXNzIEZpbGVDaGFuZ2VkVGhyZWFkKEdIVGhyZWFkKToKICAgICIiIgogICAgICAgIEEgdGhyZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgcGF0aCA6IHN0ciwKICAgICAgICAgICAgICAgIG5hbWUgOiBzdHIKICAgICAgICAgICAgICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lPW5hbWUpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYucmVmcmVzaF9yYXRlID0gMTAwMCAgIyBtaWxsaXNlY29uZHMKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suCiAgICAgICAgIiIiCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5pc19zZXQoKToKICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoc2VsZi5yZWZyZXNoX3JhdGUpCiAgICAgICAgICAgIGxhc3RfbW9kaWZpZWQgPSBzZWxmLmlzX2ZpbGVfbW9kaWZpZWQobGFzdF9tb2RpZmllZCkKICAgICAgICBzZWxmLl9vbl9maWxlX2NoYW5nZWQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICIiIiBTdG9wIHRoZSB0aHJlYWQuICIiIgogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5zZXQoKQoKICAgIGRlZiBpc19maWxlX21vZGlmaWVkKHNlbGYsIGxhc3RfbW9kaWZpZWQpOgogICAgICAgIGN1cnJlbnRfbW9kaWZpZWQgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYucGF0aCkKICAgICAgICBpZiBjdXJyZW50X21vZGlmaWVkICE9IGxhc3RfbW9kaWZpZWQ6CiAgICAgICAgICAgIHNlbGYuZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X21vZGlmaWVkCiAgICAgICAgcmV0dXJuIGxhc3RfbW9kaWZpZWQKCgpjbGFzcyBTY3JpcHRTeW5jQ1B5KGNvbXBvbmVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU2NyaXB0U3luY0NQeSwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQgPSBbXQoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtY2xpZW50LXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9pcCA9ICIxMjcuMC4wLjEiCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSA1ODI2MAogICAgICAgIHNlbGYuc3Rkb3V0ID0gTm9uZQogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IHRocmVhZGluZy5FdmVudCgpCgogICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgOiBzdHIgPSBmInNjcmlwdC1zeW5jLWZpbGVDaGFuZ2VkLXRocmVhZDo6e2doZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWR9IgogICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUgPSAic2NyaXB0LXN5bmM6OiIgKyAicGF0aDo6IiArIHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKQogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9ICJzZWxlY3Qtc2NyaXB0IgoKICAgIGRlZiBSZW1vdmVkRnJvbURvY3VtZW50KHNlbGYsIGRvYyk6CiAgICAgICAgIiIiIFJlbW92ZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIGRvY3VtZW50LiAiIiIKICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGNsaWVudF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuY2xpZW50X3RocmVhZF9uYW1lXVswXQogICAgICAgICAgICBjbGllbnRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBmaWxlY2hhbmdlZF90aHJlYWQgPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZC5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuam9pbigpCiAgICAgICAgaWYgc2VsZi5xdWV1ZV9tc2dfbG9jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jay5yZWxlYXNlKCkKICAgICAgICBpZiBzZWxmLmV2ZW50X2ZpcmVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgIyBjbGVhciB0aGUgcGF0aCBmcm9tIHRoZSB0YWJsZSB2aWV3CiAgICAgICAgZGVsIHNlbGYucGF0aAoKICAgIGRlZiBpbml0X3NjcmlwdF9wYXRoKHNlbGYsIGJ0biA6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIENoZWNrIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgbG9hZC9jaGFuZ2UgcGF0aCBzY3JpcHQuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gYnRuOiBBIGJvb2xlYW4gb2YgdGhlIGJ1dHRvbgogICAgICAgICIiIgogICAgICAgICMgY2hlY2sgaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBpZiBidG4gaXMgVHJ1ZToKICAgICAgICAgICAgZGlhbG9nID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuT3BlbkZpbGVEaWFsb2coKQogICAgICAgICAgICBkaWFsb2cuRmlsdGVyID0gIlB5dGhvbiBmaWxlcyAoKi5weSl8Ki5weSIKICAgICAgICAgICAgZGlhbG9nLlRpdGxlID0gIlNlbGVjdCBhIFB5dGhvbiBmaWxlIgogICAgICAgICAgICBkaWFsb2cuSW5pdGlhbERpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZSgiIikKICAgICAgICAgICAgZGlhbG9nLkZpbGVOYW1lID0gIiIKICAgICAgICAgICAgZGlhbG9nLk11bHRpc2VsZWN0ID0gRmFsc2UKICAgICAgICAgICAgZGlhbG9nLkNoZWNrRmlsZUV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLkNoZWNrUGF0aEV4aXN0cyA9IFRydWUKICAgICAgICAgICAgZGlhbG9nLlJlc3RvcmVEaXJlY3RvcnkgPSBUcnVlCiAgICAgICAgICAgIGlmIGRpYWxvZy5TaG93RGlhbG9nKCkgPT0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGlhbG9nUmVzdWx0Lk9LOgogICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gZGlhbG9nLkZpbGVOYW1lCgogICAgICAgICMgZGVmYXVsdCBpbml0IHN0YXV0cwogICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIG5vdCBzZWxlY3RlZCIpCgogICAgICAgICMgZmkgZmlsZSBpcyBpbiB0YWJsZSB2aWV3IGJlZm9yZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdC1zeW5jOjpGaWxlIGRvZXMgbm90IGV4aXN0IikKICAgIAogICAgZGVmIHJlbG9hZF9hbGxfbW9kdWxlcyhzZWxmLCBkaXJlY3RvcnkpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZW5hbWUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gZmlsZW5hbWVbOi0zXSAgIyByZW1vdmUgJy5weScgZnJvbSBmaWxlbmFtZQogICAgICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0pCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHVzZSB0aGUgbW9kdWxlcwogICAgICAgICAgICAgICAgcGF0aF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwYXRoX2RpcikKICAgICAgICAgICAgICAgIHNlbGYucmVsb2FkX2FsbF9tb2R1bGVzKHBhdGhfZGlyKQoKICAgICAgICAgICAgICAgICMgcGFyc2UgdGhlIGNvZGUKICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCgogICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgcXVldWUgYW5kIGV2ZW50CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYucXVldWVfbXNnX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLmdldCgpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnRhc2tfZG9uZSgpCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgdGhlIGNvZGUKICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRvdXQob3V0cHV0KToKICAgICAgICAgICAgICAgICAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKICAgICAgICAgICAgICAgIGxvY2Fsc1sic3Rkb3V0Il0gPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgICAgICAgICAgICAgICMgc2VuZCB0aGUgbXNnIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogb3V0cHV0LmdldHZhbHVlKCl9KQogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBtc2dfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChtc2dfanNvbikKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKCiAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNjcmlwdCB2YXJpYWJsZXMgdG8gdGhlIEdIIGNvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgICAgICBvdXRwYXJhbSA9IGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0CiAgICAgICAgICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgICAgICAgICAgZm9yIG91dHAgaW4gb3V0cGFyYW1fbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0cCBpbiBsb2NhbHMua2V5cygpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChsb2NhbHNbb3V0cF0pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQoTm9uZSkKCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KICAgICAgICAgICAgcmV0dXJuIGxvY2FscwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgogICAgICAgICAgICAjIHNlbmQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgZXJyX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6ICJlcnI6IiArIHN0cihlKX0pCiAgICAgICAgICAgIGVycl9qc29uID0gZXJyX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChlcnJfanNvbikKICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQogICAgICAgICAgICAKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCgogICAgICAgICAgICBlcnJfbXNnID0gZiJzY3JpcHQtc3luYzo6RXJyb3IgaW4gdGhlIGNvZGU6IHtzdHIoZSl9IgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oZXJyX21zZykKCiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsCiAgICAgICAgICAgIGJ0bjogYm9vbCwKICAgICAgICAgICAgaV9jcnZzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JTGlzdFtSaGluby5HZW9tZXRyeS5DdXJ2ZV0pOgogICAgICAgICIiIiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIGl0J3MgdGhlIHNvbHZlIG1haW4gaW5zdGFuY2UuICIiIgoKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICAjIHNldCB0aGUgcGF0aCBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIHNlbGYuaW5pdF9zY3JpcHRfcGF0aChidG4pCgogICAgICAgICMgZmlsZSBjaGFuZ2UgbGlzdGVuZXIgdGhyZWFkCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBGaWxlQ2hhbmdlZFRocmVhZChzZWxmLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgc2V0IHVwIHRoZSB0Y3AgY2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICBfID0gW3ByaW50KHQubmFtZSkgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXQogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIENsaWVudFRocmVhZChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cKICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgYWRkIHRvIHRoZSBnbG9iYWxzIGFsbCB0aGUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgY29tcG9uZW50ICh0aGUgbG9jYWxzKQogICAgICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgogICAgICAgIHJlcyA9IHNlbGYuc2FmZV9leGVjKHNlbGYucGF0aCwgTm9uZSwgZ2xvYmFscygpKQogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IFRydWUKICAgICAgICByZXR1cm4KCiAgICBkZWYgQWZ0ZXJSdW5TY3JpcHQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBjb21wb25lbnQgaGFzIGZpbmlzaGVkCiAgICAgICAgICAgIGl0cyBjYWxjdWxhdGlvbi4gSXQgaXMgdXNlZCB0byBsb2FkIHRoZSBHSENvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgIHdpdGggdGhlIHZhbHVlcyBjcmVhdGVkIGluIHRoZSBzY3JpcHQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuaXNfc3VjY2VzczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgb3V0cGFyYW0gPSBbcCBmb3IgcCBpbiBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dF0KICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgIAogICAgICAgICMgVE9ETzogYWRkIHRoZSBjb252ZXJzaW9uIHRvIGRhdGF0cmVlIGZvciBuZXN0ZWQgbGlzdHMgYW5kIHR1cGxlcwogICAgICAgIGZvciBpZHgsIG91dHAgaW4gZW51bWVyYXRlKG91dHBhcmFtKToKICAgICAgICAgICAgIyBkZXRlY3QgaWYgdGhlIG91dHB1dCBpcyBhIGxpc3QKICAgICAgICAgICAgaWYgdHlwZShzZWxmLl92YXJfb3V0cHV0W2lkeF0pID09IGxpc3Qgb3IgdHlwZShzZWxmLl92YXJfb3V0cHV0W2lkeF0pID09IHR1cGxlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGFMaXN0KGdoLktlcm5lbC5EYXRhLkdIX1BhdGgoMCksIHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhKGdoLktlcm5lbC5EYXRhLkdIX1BhdGgoMCksIDAsIHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkKICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmNsZWFyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgdGFibGVfdmFsdWUgPSBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkdldFZhbHVlKAogICAgICAgICAgICBzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCAibm90X2ZvdW5kIgogICAgICAgICkKICAgICAgICBpZiB0YWJsZV92YWx1ZSAhPSAibm90X2ZvdW5kIjoKICAgICAgICAgICAgcmV0dXJuIHRhYmxlX3ZhbHVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcGF0aC5zZXR0ZXIKICAgIGRlZiBwYXRoKHNlbGYsIHBhdGggOiBzdHIpOgogICAgICAgICIiIiBTZXQgdGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuU2V0VmFsdWUoc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgcGF0aCkKCiAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk1lc3NhZ2UgPSBmIntzY3JpcHRfbmFtZX0iCgogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBfID0gW3QgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpIGlmIHQubmFtZSA9PSBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lXVswXS5zdG9wKCkKCiAgICBAcGF0aC5kZWxldGVyCiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgRGVsZXRlIHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgaWYgdGhlIG9iamVjdCBpcyBlcmFzZWQuICIiIgogICAgICAgIGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuRGVsZXRlVmFsdWUoc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSkK
- - S
-
-
-
-
- - *.*.python
- - 3.*
-
-
-
-
-
+
- - ac2bc2cb-70fb-4dd5-9c78-7e1ea97fe278
- - Geometry
+ - 06953bda-1d37-4d58-9b38-4b3c74e54c8f
+ - File Path
-
- - Contains a collection of generic geometry
- - 84780236-6585-42d5-b303-6e93a13af1b5
- - Geometry
- - Geo
+
+ - Contains a collection of file paths
+ - false
+ - All files|*.*
+ - 5238ab80-c5e8-4c25-b453-6fecfe57f6f1
+ - true
+ - File Path
+ - Path
- false
- 0
@@ -2102,14 +1525,14 @@
-
- -333
- 170
+ 159
+ 629
50
24
-
- -307.33334
- 182.66667
+ 184.87698
+ 641.2265
@@ -2120,22 +1543,14 @@
- - 2
+ - 1
- {0}
-
+
-
- - -1
- - 9c64993e-eaa5-4262-82d7-af09e513cb01
- - Grasshopper.Kernel.Types.GH_Curve
-
-
-
-
- - -1
- - 0ea4f4cd-08ba-4f88-96a5-de7e41140054
- - Grasshopper.Kernel.Types.GH_Curve
+
+ - false
+ - F:\__TEMP\test\
@@ -2146,7 +1561,40 @@
-
+
+
+ - a8b97322-2d53-47cd-905e-b932c3ccd74e
+ - Button
+
+
+
+
+ - Button object with two values
+ - False
+ - True
+ - 66637ff1-037c-4e4c-ba3a-0930de00a3ea
+ - true
+ - Button
+ - dump!
+ - false
+ - 0
+
+
+
+
+ -
+ 106
+ 569
+ 102
+ 22
+
+
+
+
+
+
+
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -2155,27 +1603,31 @@
- A panel for custom notes and text values
- - 18fba923-3fa1-490c-b8ee-734fcc57d7fe
+ - 66ce41af-42cf-48a0-871c-5d06b68b6ae7
+ - true
- Panel
- false
- 0
- - 84780236-6585-42d5-b303-6e93a13af1b5
- - 1
- - Double click to edit panel content…
+ - 0
+ - AssemblyTest
-
+
-
- -338
- 216
- 160
- 100
+ 111
+ 602
+ 102
+ 20
- 0
- 0
- 0
+ -
+ 111.36775
+ 602.9323
+
@@ -2195,82 +1647,89 @@
-
+
- - afb96615-c59a-45c9-9cac-e27acb1c7ca0
- - Explode
+ - 537b0419-bbc2-4ff4-bf08-afe526367b2c
+ - Custom Preview
-
- - Explode a curve into smaller segments.
- - 6126e53b-589a-4de2-aaff-78a92605cf7a
- - Explode
- - Explode
+
+ - Allows for customized geometry previews
+ - true
+ - 649b3c81-ba59-413f-ad42-15bca79f15e2
+ - true
+ - Custom Preview
+ - Preview
+
-
+
-
- -254
- 334
- 65
+ 602
+ 647
+ 48
44
-
- -223
- 356
+ 636
+ 669
-
- - Curve to explode
- - 6cc5d862-4360-41da-ac8d-152ac750e8d1
- - Curve
- - C
+
+ - Geometry to preview
+ - true
+ - 799c43bc-4b78-4d8f-a2ed-f604ed2b1ddb
+ - true
+ - Geometry
+ - G
- false
- - 84780236-6585-42d5-b303-6e93a13af1b5
+ - 5769b0e3-b5fa-46e5-8b49-25088b83a917
- 1
-
- -252
- 336
- 14
+ 604
+ 649
+ 17
20
-
- -243.5
- 346
+ 614
+ 659
-
- - Recursive decomposition until all segments are atomic
- - 1d0d1653-ec2e-4d70-b716-1eda486a429b
- - Recursive
- - R
+
+ - The material override
+ - 07e88719-b77c-4ac3-a12c-cc329aefe255
+ - true
+ - Material
+ - M
- false
- - 0
+ - c0aa2559-2d8c-481d-a41d-c02943a5f981
+ - 1
-
- -252
- 356
- 14
+ 604
+ 669
+ 17
20
-
- -243.5
- 366
+ 614
+ 679
@@ -2286,8 +1745,18 @@
-
- - true
+
+ -
+ 255;221;160;221
+
+ -
+ 255;66;48;66
+
+ - 0.5
+ -
+ 255;255;255;255
+
+ - 0
@@ -2296,113 +1765,529 @@
-
-
- - 1
- - Exploded segments that make up the base curve
- - c3d12732-08cc-44c5-9bb6-fdce5aea549b
- - Segments
- - S
+
+
+
+
+
+
+ - 537b0419-bbc2-4ff4-bf08-afe526367b2c
+ - Custom Preview
+
+
+
+
+ - Allows for customized geometry previews
+ - true
+ - 4d39988a-2c7d-4bb0-9261-f460ec916be1
+ - true
+ - Custom Preview
+ - Preview
+
+
+
+
+
+ -
+ 603
+ 694
+ 48
+ 44
+
+ -
+ 637
+ 716
+
+
+
+
+
+ - Geometry to preview
+ - true
+ - 8d9e002d-b2f2-4476-8f21-adea36efcb4a
+ - true
+ - Geometry
+ - G
- false
- - 0
+ - 0cd168ad-f650-4b68-87a8-b45f32a6dbfc
+ - 1
-
- -208
- 336
+ 605
+ 696
17
20
-
- -199.5
- 346
+ 615
+ 706
-
-
- - 1
- - Vertices of the exploded segments
- - 1dcb9d9c-7b1b-4479-9384-2c23132a9733
- - Vertices
- - V
+
+
+ - The material override
+ - 58e8f37f-40e5-4060-83b0-c395fb2daf6d
+ - true
+ - Material
+ - M
- false
- - 0
+ - 28b353a5-44f7-436e-8a36-957623e89dde
+ - 1
-
+
-
- -208
- 356
+ 605
+ 716
17
20
-
- -199.5
- 366
+ 615
+ 726
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
+
+
+
+
+ -
+ 255;221;160;221
+
+ -
+ 255;66;48;66
+
+ - 0.5
+ -
+ 255;255;255;255
+
+ - 0
+
+
+
+
+
+
-
+
- - 59e0b89a-e487-49f8-bab8-b5bab16be14c
- - Panel
+ - 9c53bac0-ba66-40bd-8154-ce9829b9db1a
+ - Colour Swatch
-
- - A panel for custom notes and text values
- - 420d48fe-ba90-4d69-8c31-c1e6827b9a89
- - Panel
-
+
+ - Colour (palette) swatch
+ - c0aa2559-2d8c-481d-a41d-c02943a5f981
+ - true
+ - Colour Swatch
+ - Swatch
- false
- - 0
- - c3d12732-08cc-44c5-9bb6-fdce5aea549b
- - 1
- - Double click to edit panel content…
+ - 0
+ -
+ 255;128;0;255
+
-
+
-
+
-
- -122
- 280
- 160
- 100
+ 478
+ 670
+ 88
+ 20
- - 0
- - 0
- - 0
-
- -121.33334
- 280.6667
+ 478.32407
+ 670.98126
-
-
- -
- 255;213;217;232
+
+
+
+
+
+
+ - 9c53bac0-ba66-40bd-8154-ce9829b9db1a
+ - Colour Swatch
+
+
+
+
+ - Colour (palette) swatch
+ - 28b353a5-44f7-436e-8a36-957623e89dde
+ - true
+ - Colour Swatch
+ - Swatch
+ - false
+ - 0
+ -
+ 255;102;255;0
+
+
+
+
+
+ -
+ 480
+ 718
+ 88
+ 20
+
+ -
+ 480.05487
+ 718.3294
+
+
+
+
+
+
+
+
+
+ - c9b2d725-6f87-4b07-af90-bd9aefef68eb
+ - 066d0a87-236f-4eae-a0f4-9e42f5327962
+ - DFXMLExporter
+
+
+
+
+
+ - true
+ - 2
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABg2lDQ1BJQ0MgcHJvZmlsZQAAKM+VkTlIA0EYhT8TJcEDC1OIWGyhVgqiopYSxSAoSIzgVbi7MVHIbsJugo2lYCtYeDRehY21tha2giB4gFhbWCnaiKz/bIQEIYIDw3y8mfeYeQOBg4xpudXdYNl5Jx6LajOzc1romWpC1DFAWDfd3MTUaIKK4+OWKrXedKks/jcakkuuCVWa8JCZc/LCi8L9q/mc4h3hiLmsJ4VPhTsduaDwvdKNIr8oTvscUJkRJxEfFo4Ia+kyNsrYXHYs4T7htqRlS35gpshJxWuKrUzB/LmnemH9kj09pXSZrcQYY4JJNAwKrJAhT5estigucdmPVvC3+P5JcRniWsEUxwhZLHTfj/qD3926qd6eYlJ9FGqePO+tHUJb8LXpeZ+Hnvd1BMFHuLBL/uwBDL6LvlnS2vahcR3OLkuasQ3nG9D8kNMd3ZeCMgOpFLyeyDfNQtM11M4Xe/vZ5/gOEtLV+BXs7kFHWrIXKrw7XN7bn2f8/oh+A2ixcqM29OAgAAAACXBIWXMAAC4iAAAuIgGq4t2SAAAAB3RJTUUH6AQHCzcfT87vFgAAAEZJREFUSEu1yKEBADAIwDCO5n/2QGQnYjJze18xS8wSs8QsMUvMErPELDFLzBKzxCwxS8wSs8QsMUvMErPELDFLzBIzs/cABgWAzBU/nmQAAAAASUVORK5CYII=
+
+ - 65e17a0f-52e4-4f2c-938f-4153c4d95177
+ - true
+ - true
+ - true
+ - true
+ - DFXMLExporter
+ - XMLout
+
+ - false
+ - false
+ - false
+
+
+
+
+ -
+ 260
+ 588
+ 171
+ 84
+
+ -
+ 367
+ 630
- - true
- - true
- - true
- - false
- - false
- - true
+
+
+ - 4
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 3
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+
+
+
+
+ - true
+ - Press button to export xml
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC
+
+ - 9a169d71-5230-4a49-bd7a-e2f72347ebf0
+ - true
+ - i_dump
+ - i_dump
+ - true
+ - 0
+ - true
+ - 66637ff1-037c-4e4c-ba3a-0930de00a3ea
+ - 1
+ - Press button to export xml
+ - d60527f5-b5af-4ef6-8970-5f96fe412559
+
+
+
+
+ -
+ 262
+ 590
+ 90
+ 20
+
+ -
+ 308.5
+ 600
+
+
+
+
+
+
+
+ - true
+ - The name of the assembly to export.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - e20c6b9b-9964-45e2-8b3a-f3526ce7d7a5
+ - true
+ - i_assembly_name
+ - i_assembly_name
+ - true
+ - 0
+ - true
+ - 66ce41af-42cf-48a0-871c-5d06b68b6ae7
+ - 1
+ - The name of the assembly to export.
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 262
+ 610
+ 90
+ 20
+
+ -
+ 308.5
+ 620
+
+
+
+
+
+
+
+ - true
+ - The directors where to export the xml file.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 74ce08ea-85ea-42f1-9b6f-e415953f6a3d
+ - true
+ - i_export_dir
+ - i_export_dir
+ - true
+ - 0
+ - true
+ - 5238ab80-c5e8-4c25-b453-6fecfe57f6f1
+ - 1
+ - The directors where to export the xml file.
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 262
+ 630
+ 90
+ 20
+
+ -
+ 308.5
+ 640
+
+
+
+
+
+
+
+ - 1
+ - true
+ - The breps of the structure.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPkSURBVEhL1VVbKOV7FN7ITnK/RYNcNrkrx11SbokHuWQyb0ryRN5ocuLBKadELsktHuTywKBcXgiRUiYvJOVSknNw5LK3OWbO9J31/famOWfPGPN0OqtW+7/r9/vWWt/61vpp/ivTWVhY3MsvfsBfi7/MbGxstvr6+rC+vo7V1VUsLi5ifn4eExMTGBoaQnNzM8rLy5GXl4eUlBQEBQVBEjqTq1ojwjNmZWWVLxc/DQ4OIiEhQXl8fDxiY2MRExOD6OhoREREICQkRAH7+/sjLCwMdnZ2ektLy7cmmG+a1tHR8Y/R0VEUFRWp7OjJyclISkrC8PAwHh4ecHNzg4WFBeTm5iIwMFB5QEAAJIBBMF4Zob5i1tbWv5SVlf3V0NCA1NRUpKWlPTmpOjw8RHd3N3p7e7G0tITb21v138/PT1UiyT0IVe9McGam8/T0/LO9vR0ZGRkKND09HZmZmVhbW4Ner0dnZycmJydRUVGBqqoq1NfX4+joSPWHQby9vdkLVvGTEfILE+5XSUtpaamihQEIzkYT/PLyEgy+ubmJ2tpa1eiBgQG0trbi4OAAXV1d8PLygrOz82cJ8t4E+2R5bm5uH0pKSlRTyTkDPGZO8OPjY4yPj2Nubg4rKysKfHp6Wp3hN+li5b6+vhAV6gXzjRFaGivZ/5aYmAg61cKGkvMvwXd2dlT2LS0tODs7U98E39vbw/7+vurJ7OwshGZFl1RxJdh2Gun8z66urh8ITglSiiMjIzAYDGbgBBkbG0NHRwfOz89xcXGhztB6enpwfX0NFxcXpSp3d3cO6q8aiXQdGhqqtE1nEIJfXV2Zgc/MzIASZrMbGxsVVScnJ9jY2FDKYsXSA3h4eCAqKorTfc0ALSIvQ2RkJB4D3d/fq4tfA+/v70dbWxuamppQWVmJ6upq9X93d1cFcXJyUjjSC2MF5Il8UcecTjozOz09fRa8rq5OSZWS3draUvwLLUpJnHzpq7EHJnuj1Wr1wcHBavwLCgpwd3eH5eXlF4OTFmZPFco3Z+FJRcqkivc8xJFnk3iJFfwIuE6nQ1xc3GeBM5sDWjx3CSVGp6qoEMqVqnkOnI2lerKysuDg4EDuzSeZJlW8k4MPrIBjz3K5BqioqakpNcE1NTXY3t7+R+YCquQtyvkoMN/cRbRXrIK98PHxUUNDz87OVhNM+bI3XBlsqKgP9vb26gzfBunj89vUZG+lZEN4eDhkfTy5DKOigXQ8Zi1vAGxtbdVSlKoJ/t33gKYVqn7nI/K4kwhAfnNyclSm+fn5KCwsRHFxMbi/uBTlzsteNJPxff33m/s9f/mb/D8yjeZvU880QlAx2/0AAAAASUVORK5CYII=
+
+ - d700b88b-9d37-47c0-a242-80e85b5d4e00
+ - true
+ - i_breps
+ - i_breps
+ - true
+ - 1
+ - true
+ - 39d914fb-05fc-4c33-93a8-98326df3e596
+ - 1
+ - The breps of the structure.
+ - 2ceb0405-fdfe-403d-a4d6-8786da45fb9d
+
+
+
+
+ -
+ 262
+ 650
+ 90
+ 20
+
+ -
+ 308.5
+ 660
+
+
+
+
+
+
+
+ - false
+ - The string of xml to be exported.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - d4570a62-ba44-499e-a550-0cf9fa169720
+ - true
+ - o_xml
+ - o_xml
+ - false
+ - 0
+ - true
+ - 0
+ - The string of xml to be exported.
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 382
+ 590
+ 47
+ 26
+
+ -
+ 405.5
+ 603.3333
+
+
+
+
+
+
+
+ - false
+ - The breps of the faces belonging to joints.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 5769b0e3-b5fa-46e5-8b49-25088b83a917
+ - true
+ - o_joints
+ - o_joints
+ - false
+ - 0
+ - true
+ - 0
+ - The breps of the faces belonging to joints.
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 382
+ 616
+ 47
+ 27
+
+ -
+ 405.5
+ 630
+
+
+
+
+
+
+
+ - false
+ - The breps of the faces belonging to sides.
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg==
+
+ - 0cd168ad-f650-4b68-87a8-b45f32a6dbfc
+ - true
+ - o_sides
+ - o_sides
+ - false
+ - 0
+ - true
+ - 0
+ - The breps of the faces belonging to sides.
+ - 6a184b65-baa3-42d1-a548-3915b401de53
+
+
+
+
+ -
+ 382
+ 643
+ 47
+ 27
+
+ -
+ 405.5
+ 656.6666
+
+
+
+
+
+
+
+
+
+ - IyEgcHl0aG9uMwojIHI6IGRpZmZDaGVjaz09MC4wLjMKCmltcG9ydCBTeXN0ZW0KaW1wb3J0IHR5cGluZwoKaW1wb3J0IFJoaW5vCmltcG9ydCBSaGluby5HZW9tZXRyeSBhcyByZwoKZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgZGlmZkNoZWNrCiMgZnJvbSBkaWZmQ2hlY2suZGZfZ2VvbWV0cmllcyBpbXBvcnQgREZWZXJ0ZXgsIERGRmFjZSwgREZCZWFtLCBERkFzc2VtYmx5CiMgaW1wb3J0IGRpZmZDaGVjay5kZl90cmFuc2Zvcm1hdGlvbnMKIyBpbXBvcnQgZGlmZkNoZWNrLmRmX2pvaW50X2RldGVjdG9yCiMgaW1wb3J0IGRpZmZDaGVjay5kZl91dGlsCgpnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9IHN0cihkaWZmQ2hlY2suX192ZXJzaW9uX18pCgpjbGFzcyBERlhNTEV4cG9ydGVyKGNvbXBvbmVudCk6CiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsCiAgICAgICAgICAgIGlfZHVtcDogYm9vbCwKICAgICAgICAgICAgaV9hc3NlbWJseV9uYW1lLAogICAgICAgICAgICBpX2V4cG9ydF9kaXIsCiAgICAgICAgICAgIGlfYnJlcHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0W1JoaW5vLkdlb21ldHJ5LkJyZXBdKToKICAgICAgICAiIiIKICAgICAgICAgICAgVGhpcyByZWFkIGJyZXBzIGZyb20gUmhpbm8sIGNvbnZlcnRzIHRoZW0gdG8gREZCZWFtcyBhbmQgREZBc3NlbWJsaWVzLCBhbmQgZXhwb3J0cyB0aGVtIHRvIFhNTC4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBpX2R1bXA6IHdoZXRoZXIgdG8gZHVtcCB0aGUgeG1sCiAgICAgICAgICAgIDpwYXJhbSBpX2V4cG9ydF9kaXI6IGRpcmVjdG9yeSB0byBleHBvcnQgdGhlIHhtbAogICAgICAgICAgICA6cGFyYW0gaV9icmVwczogbGlzdCBvZiBicmVwcwogICAgICAgICIiIgogICAgICAgICMgZ2hlbnYuQ29tcG9uZW50Lk1lc3NhZ2UgPSB2ZXJzCiAgICAgICAgIyBiZWFtcwogICAgICAgICMgYmVhbXMgOiB0eXBpbmcuTGlzdFtERkJlYW1dID0gW10KICAgICAgICAjIGZvciBicmVwIGluIGlfYnJlcHM6CiAgICAgICAgIyAgICAgYmVhbSA9IERGQmVhbS5mcm9tX2JyZXAoYnJlcCkKICAgICAgICAjICAgICBiZWFtcy5hcHBlbmQoYmVhbSkKCiAgICAgICAgIyAjICMgYXNzZW1ibHkKICAgICAgICAjIGFzc2VtYmx5MSA9IERGQXNzZW1ibHkoYmVhbXMsIGlfYXNzZW1ibHlfbmFtZSkKICAgICAgICAjIHByaW50KGFzc2VtYmx5MS5iZWFtcykKICAgICAgICAjIHByaW50KGFzc2VtYmx5MSkKCiAgICAgICAgIyAjIGR1bXAgdGhlIHhtbAogICAgICAgICMgeG1sIDogc3RyID0gYXNzZW1ibHkxLnRvX3htbCgpCiAgICAgICAgIyBpZiBpX2R1bXA6CiAgICAgICAgIyAgICAgYXNzZW1ibHkxLmR1bXAoeG1sLCBpX2V4cG9ydF9kaXIpCiAgICAgICAgIyBvX3htbCA9IHhtbAoKICAgICAgICAjICMgc2hvdyB0aGUgam9pbnQvc2lkZSBmYWNlcwogICAgICAgICMgb19qb2ludHMgPSBbamYudG9fYnJlcCgpIGZvciBqZiBpbiBhc3NlbWJseTEuYWxsX2pvaW50X2ZhY2VzXQogICAgICAgICMgb19zaWRlcyA9IFtzZi50b19icmVwKCkgZm9yIHNmIGluIGFzc2VtYmx5MS5hbGxfc2lkZV9mYWNlc10KCiAgICAgICAgIyByZXR1cm4gb194bWwsIG9fam9pbnRzLCBvX3NpZGVz
+ - S
+
+
+
+
+ - *.*.python
+ - 3.*
+
+
+
+
@@ -2414,7 +2299,7 @@
-
- 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
+ iVBORw0KGgoAAAANSUhEUgAAAOEAAACWCAIAAACn9nhUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAADybSURBVHhe7Z0HeBTX1fdJ8ib58uV1YoMbxtjYYDp2jHGP4/YmdrBppgqBUJcQQh313nuvu6uyK2nVe0WooC4hQKAurbTqvdFMTL7Xme8/M8taWiSsBt4Ve57zzHPnzp27K81v/uec2dnZFVKTmgQYITWpiav9xGiv1JbU+vp6W9sHmtqGegQdUluISRl9hEYxOtjcNihYl9qCTMroIzQpo0tiUkYfrTXzBlt4UkYXZVJGH6H19PQ2tg4hJYWgioMNDQ0NDw8PDAwMSpRLGX1UBiy7uvsaWoba+WLBKAC9dOlSXFxcfHyCZJmU0Udl4JLf2d/QMtzZ1f+LMzo4OFhbWxsXn9TY0tXQ1F3f1CVBLmX0URm4bOsYQKxHxP/FbWx0NDs7q7S8prPvTlPbiGQ5IWX00VlT2xAKJnHIRcFoTk52aVlNe9cNnDaS5VJGH4lBRBHi61uGOzp/+UAPoxktkTIqNaGBy9b2Qfx/EejFQkfHSEaLSy9JGZUaaQAUFT1ElNchLledBIyWSRmVGmXAsoUS0e4eMUFUwGiJlFGpwUAlv7O/vnm4gy8WmSht0lgvNYHRUb6hhSznBV3iYfcZrZZ4RoefSOtbIrnDNAjujW3kv5WM8mIjojCa0Yslks9o/BNmcXGxeXl5/f0IyosFChN0dvfhH9rQOgQpFStAYcuH0a6unifHu7t7e3r6CguLcnJyoKaCgzl/A44AsoP62BP/UDEEFLZ8GOXz+x6Z9z7Q+MWdfCc9PQNcLndoaEhwMOdjQBE4Iqy3tg/WN5M5KKAXQ0Bhy4fRxsb2R+etrV0tLZ10u6mpQ9j/y3pLS0dsbOx8GSW1k6KzrWMAFRJ1c1M/2U9vFj9bPoyWl9c+Iq+uro+NTcvMLLhypaWy8vqlSw1VVXXoRKOi4prI4AU7ZhPpebiXlV2tqalLTU29e/fuzwogrZrwnh7yc05oJ9CsbyFvD+0Wy/g+1WhGi4oln9GYmOxH5CkpRcbGdvr6lkFB0RERyfLy6mgEBUV5eIRwuZmxsTki4+ficXG52DEpKT8+/jw9g78/W9h/37Ph9BjhjkKPisosLq5RU1NjMBjj4+NTr2cKiRT2AUR+Z39bO3krUz2VekJE6exTvPkkbfkwyuVmPSJPTi48d85aQ8NAU/OciYnd4cMnHRx8TpxQPnvWyNTUAVtFxv+sgzkOJzUqKt3OziswMAoUBgREHjkil5CQFxGREhmZHh+fx+WSIIJUe3tvnBKxsbkik0RGZhQXXz5z5szKlc9YWFjcuHEDhxMyCQd8nV0klDz+QCtvsKmNLNghnPiXQTjRT34QP4VgMTcpoz/v0FEtLWMrKzcQqadnrq1t7OYWDEAhpVpaJsnJBSLjH+4JCRc8PBjHjyv6+IR9882Bc+esTEzsFRXPHDgggx41NR0NDX0LCxcot59fBCDes+cQ2omJF0TmAaNpaflVVVXl5WXPPfdCbR2/jT/WRP1f6CyThhKAIrIj4wS19D0ikoKm0GhGC5cBo9HRmY/IIW8uLgGnT+vp6JhC5IyMbMEQehiMWCcnP4iiyPiHe1zceV/fCAUFDYCO/MHZOUBFRQt6efy4EhpMZpy1tfuhQyd0dc1dXYPMzZ0BKDoxQGQeDic9NfVCdXV1a0vLypXPXq5t6+geQwTndQyASH5nH9QUhRGOMc2lxKEptLGxMZLRokopo7N6VFQGQi0yRTovBGR0FIaYYYmtIuMf7tgFsVtRUcPQ0MbIyMbAwOrMmXMqKtoyMgogHphi1dOTqaqqhXQCgd7Y2N7U1P7BMwGM5udXmpmZvfbaOmSlk5OTNIjTXHCUJdtIRrOzC5YBo2BFIhx4Ien09+dQ8TodGoklVtnsVJwGyB9CQxOg3CxWfEhIDMViGgQbDZF52Oy0wsLqI0eOmpqaDg0NDQwMCA7psjMy1oPRi1VSRh+fAzgoMZZwkEqvooFNwgaWaKN4p8cI9xU6GEWsT0pKvnfvXn8/yqBl+8wbAaNFUkYlzSlG86OjoxfzWahE2PKJ9YiYD3EcVAiSSOfCnNa/pZptwR4RkZqSciEq6olgNDs7O79wWTMKQMPDk4KDo9EQ2fSzHhNDVkXCVbRZrAQkiHSOKOx//E4xmidlVMx9GqOoLWZzZHUope3svKKjs7CKJSWrgkQQbS6XXv6UAmIr2qhj3N1DwsOTwQR2RA+KejU1XUtLFze34ISEC8KXePyOwisp6XxUVJSUUXH2eTCKwtne3pvmMjAw6uxZYwMDK3NzZ2trd1tbT2Nj+zNnDPX0LAICIs+eNdLSMsZ4TU1DU1OHzz77h7OzP/2pj4tLADq/+eY7CwsXsIthlpaugFvk5R6PU4zmRkZGjYwsc0bHx8fPnz9/obDicTLazBtt5o3cb4+08ceFmx7iLe2jrR1jaDS0DKKB1WmMQvNm8+jobGfngDNnzsXG5kL8lJXPHj+uqKKi5eTk//77n3h4MOXlT0NoT5/WO3DgmKcnE+wqK2uhk/p0/jR0FEwAbjk5NQYjTkFBQ0PjHBCnVyGxIi+3hI4TQKRH6HhX8fHZCQkJd+9+LziYy9H6+/t/+OFeRkZGXkH50jIK8gBiS/sYGk1tIzRb6GlqGwaRl66219Z3t/EnsBXtopJr6McAmjzhJLRTaI5jWV7dVFbViF2wWlxeV1rZOHdGs1xdg3R0TOPi8sCosbGdrKySi0sgRPToUXksFRU1tLRMEMT19S01NPQ1NAyAqY6OWWxszokTKtgXDfCNfnRSHwKZGRra6uqai7zQPD3tgZ5pDqWE5It0Ch2MpqcX6ujopqenUxfwl8cF+2mGP2p0dNTAwOCVV14pKbvS0X1TBI4Fe3vXZHzSeRs7dwYrpq6p/1pDDygEZDW1HbX1PaATW0NYMVWX2zAS2JlZOF6+1snrnCirakIn2IVS0lOBWkBccPEqIM7KLbdz8GxpB/0jCcl5xWV10xjFEZ3NcUTDwpIQvs+dswZkAQEcN7cQ6KWfHxtHGgoKZTU3d0IDKSkU18uLBeHEKjQSS1tbD+AIsukPP729w0JCYuHBwVyRF5qjczhkdouXhkxiSXfiRMKSKoZSkJzgPaMBzRYOEHH8RTk5pUePHvvTn/7k5eVF31OyzOzmzZuenp4vr1mDP7C47MoS6ihoy8wpS0otyC+6wgyNjY7NCGFxs/MqghjR+UWXXdwDsNXCyjkgODIxNb9/+IeIyJSrdd0Xii6bmNnZ2HuASGCKeQBoxaVmv8AIH//wnAuVnX23meFxja0kvm4ewdnnK6YximP5EKe1B8BBmUJDE+mSHKCgMzIyA+UUDjkaGAluaFBojNDGEnthX3TSO9ISiAHooecnx7NxMpAu7JzRsSPgRl4L2UbhhRcFkWZmjsiJId7IcdXUdNTV9dTVdXG2KCpq4o2JzEA79VeklZSUZmZmrl69uqOjY3BwuT3P9vbt25999pmHhwfOwNwLZZA0IWSLdEyVnFYYzkkCRiAsLjEX6sjhpkVy0+OTz4PCMHaio4tvSUVDECMKAuniHlha2YBhxqZ21rZuaPB7bpHzdN9ISS/CYAhwxaWW6is87FV9pQ3nADsqNYyTNA9GaQc9MwJEgfgwsCIiSFUT6ZzqoaEgKSkiIikiPInDwXjRAUKPicmBKkPRkQcjJ8YqMPX0ZL333sdIKiCcyD2OHZNHWYb8GLw+hNHIyJTS0jIExFWrVjU0NCzsSyPibGAUuT8wraqqLCiqXkJGwVBq5kVXj8ComAyE5uS0Av8g9tW6Loiij3+Yb0A4YA0KifIPZF++xkcEB3nMsDjAGpOQExqRcPV6F6I55kEPgj4nOtXHL7SypjUmPtvR2TcprQCwAms3j6BpjOJY/lIeHZVsbB279YvwnV+Hvf0l85h8OJudzI5MDacisojjfHB09EMpBimlLwtAR01NHZD4Ip3Q07Nwdg5UVdXBGG1tE9R5YFFkBtpZrMSkpPMODk5vv/2XI0eOTExMLL+UFGcdj8d7/733XnzxxdLy2iXMRwEWgnVn721wD86ALCYHdkhJIZBU/43O3lsdPTfR09Ix1tV3Bz0YiSU6MVKYj5Kd3Tf41EjMiZEoudCJSeDiwiiHk+TuHf/UttAVzwaveN7vqTVeRkbscEYcMyQhDIIXNg0yMIckwccnDNqJ/EFPz9zAwBL5MXIAZMxIA5jMePQzmXHBwTFYnbrvVGexEjIyinbv/kZJSbG7u3v5iSisp6dnZGRkeHjY3d3jfP4S1/WPx6cximO/SAcldAMEILgL++fiMdFJStrRv1rt9/vVrk8977RtjcWpDUqGe88wQ2LD2JmhYaKzIXPAy4Ez4AinsBMEcbSFSzqmz+hMZgJifWRk1L1795CJLuN7SpCMFhUVnb8g+YzieC/YqUMeb2bmBPUCFj4+4ba2nii0KVCQwpKXBSB+NDcomGiC6aKKniE8PDGcFbtjd+yvt8Y/tYPzwraIb3YZ6P7j7x6m58IDg0KDmKxQwcipjkkwJxwNkU0/6wxGPIeD98YZHR0VHMxlavTnTOfzH+s1/KXyJWMUDkZtbb2wBH8oqOXl1e3tfUJCYr28Qp2c/NGws/NG8EU4Br6ursEAy87Oy9s7FA3sHhEWG8BIfUV/YoXy//5O9d7GM3dOyFiYHP/ISeNjjslfYu3fCw32Y4amTX3FRTrNaHg4G9FQcDCXqdGM5i4DHQVeC3YccgRcVVVdsAjhdHEJPHxYTkfHTEPDQEZGwdDQVklJ88ABGSzhKGUUFTVRgB88eNzbO4xklBkfFRa916ZhhSrxa3XiFR3in9qNekpa1tqnPE2OhNt8lOj6IjfgAIOZzGSSgr0kHhISx2ZD1yOkjIqzLyWjgYFRp06po4EqGzoqK6vs4cGQk1NDp69vxL59R7S0TCClJ0+qgmAwamBgdfKkGjgmr5WGcq19c36t8eMKFeIZTeJDw7vyBqVGJgkuNiymi3O0xxcxAS8nhL4eHmrJYKaKvPSCHYxGRCBPiBgdlTIqvj6NUQYjbsGOQ44K2tTUEfwhxDs4+Kqq6igra7m4BCFJDQri2th4qKhogVolpbMnTqgYGFhjpJqarrW1B3Q0nBVj6XN+t3Xjd7Z1qi7X5C1rNYxzLG3Ynq6+Kd7qNYHba0M382JeKud+G8xICmHEi7z6wjw4ODYsLEHKqJj7kjGKEI8laLOyctPVNXd09ONw0kNDUcqQ1Qy1ibxKj2L8zBlDLy8WtBOKSw/AvpA0JiOWzYqKDI309Y9XMy/WtUm3dw0L8XGqD/jnROjOf0dvJVLXX2BbBISkCF9U6JjhvjSSbwNLKt3EJnJ1NgejLFZcVBT3zp3bgoO5TE3AaJ7kM0qxslgHkchHgYhIv9ADAiJROYl00s4AaowYL78kR89UL984nwBudpB2f9i7k9E7iLS1vKQDASGJwSEkgiKO6sfHJ9zPjw3yqNU4FGoQb6BPD2CxEunGVMfbQM1kaGhcVVU5OTkpOJ7L0WhGc/LKJJ5R6or3I3caI5HOqc4IiWExuAjo4cGsWtaR3uhPb6TsupH1blyYt39Qcgg9hhFHX2xiMhOwCjG2sHBBsktfMcVJoqdn6efHCQtLwSYMRsqBJWQeS+ELAeL4+Jyvv979zDNPs9nsqZj+9N1lyiXdpIw+Eg8KjmUGR0SGBEQx/WNZPpGsoMAgAV5AHGKsoXFOXv60q2swQjx4tbR0dXLy19e3PHFCFbDa2HhaWropKJxByov8+PPPvzI2tkd+jIwZEAteIoiLHBoxMDw8bO0rrza29PP4o63tg63tA/D7T4Lo7+zuo6/ug1UBtdSBlyCjGc0+L/mM4pjN3SlW4ug2rYvCTUvnMQFB8f7wwAT/wHhhf3h4sra2Kdze3hsU0p8RAFlZWWUQ6eMTcfSo/OnT+ioqOlpaJhoaBsiPsQTBBw4cRwGHxICeJzAwGqzn5xdOTIw/s3JVeXVzawd1t1j7IABto0htoX7cm3YSXP4Av6tf8PASyZHY5cYojpxIY8bVgIAoKucjBcnLK8zfP1K4CSMfnGS22ejB83IIobm5C/RSXV3PwMAaxVl0dNbZs8ZYPXlSDQ2UZZqahlhCSqGsBgZWp06pow0dPXToJMI9/br4E1iseG9v36+//urzL75q777Z1DbS3DbYTD2EjOSS1FTS24As7e0/IQuOwSv5XFyKV3G25cYoZAYCCYGh9QbHkj6oWFINMheEe3qyEGrRQAqopHTWwcGXSg1j75NEjsdemAqrdIPuQWimVlG1CKYFK/f3mqtjX0RzKys3Dw+mqqqupqbR0aMK1tbu7u4MIyN7DMDbg0NTcSL5+kY4Owfa2nqZmTlTt6HE0JPgdbnczL/+9ZPdu3c3N7f0D4y2tA+ATlJEqZ+jbecPdHb1YwlNFaJJI0sJLbkKoNHTwYe4iq+yLh9GHRz8Tp06Td12qX/unI2JiYOCggYSPmiVnJw6MjkVFW3gCCawRJK3Z89h9JiYOGI8epycArAL+oEdlFVRURMQgyTMQMsYhA2hGWKmoKBJD6bupnOgMZ2vYy+cFSiMwCWmUlPTg5bTneAPIFIukG2cPDgrqIu4McIZMD4ggMNgsO7evUt9NZSUxM6uvmbyQXlIRgegqV3dff39VGgn7yEiH/gIHIXICrKCDmQFgxiMvZC/YqS4kbp8GAWXhw/LgRsAd/asCULksWPkx5j/+MceJSUtdB4/roxOpH3I85DtHTsmD0QOHpQFjoiw4BUN0AkagKCMjCK4lJNTs7BwxbTYCycACpfvvjuOJej/+ut98vIaqqo6oErIzQKcQjAG/NHSOHf394dzmMxQHELBwbyPF5gDgsAUsgouhcyhQTp47SWfUYoBJJ2AlQr9cFJZ28gHQdIPKBUToxnNWgaMHjx44rvvZCF1kMZvvjkItg4dOgE0ZWWVNDWNrazcQSHKZyiWsbGdhobhvn3H1NX1ARl4dXUNQqWCwiU0NBmBGNoJcXVxCcJsx48rYVoAioiMgEuJqwc0VVZWRU1N39HRf6q2PU6nGGWHhDDHxkTvewJdNHA0pjM+TRwdNK/Y2sGn6OQNQmKxC00qZhCTH2oSMJor+YwCKYRmT89Qa2syQLu5hUAIkVki50M5jH4qwwv38GB5e4chz0OSh8QAUgrtROYH4UQPRioraxsZ2WGMry8be2Ee8C1MEBGaMQkcA0xNMS2LwiXy8bufXyRS1RkZhYEtBHHQBtQQ/QW9MxkNKwzKCkYFqYIgARhCzy9OqoDRnNLlUDMhTCNi0heS0MAqAJramLqk8zy0IZx2dt6ooDEMvIJCb+9wwE0PQ0NYSwl3pxv0tCLoPDanGA0PDp6ZURjAQmmP2gicAbif5YyGFWkrj8plsct9UsnoTw74hUilGM3KXAaMUoeNszAHagAODUxCYzd1q9g6zqXgYMasjFJ5J7SQrJ+ouD9HyChSe8El6ATldPSH06nt4weV1tHMnBKJZ1Tk+EmoC0+PuZwnSEVCQ8Nv3bopOJgPGJBCuomUFBknVT/N49eU6ZEk34j4HSSp9IWqxx/67zMq+TqK9FGiHcwh30W6TK9CI4WbZnOkxZaW1jxe28TExGzfZwJP/M7+JjJek5jO98fsMBhQIkOlIv4AYMUk/CnXCh6DLZ9YL3L85usI8aBkag8y0amrS+h4IWTDcNTm4BIeEECm0dBFXV0L9DOZCXJy6g4OfshA6Mw4KCgGyioyT2howocffvziiy9mZGRMTk7Mxg36p9RPP/OciP7+/pGRkdEpNkb54NB4Z+9kd99kX/8Ev/tGT//ktEEz2VJ9VXX5MEof7IU5Dv+5c7ao62kxwyr8zBlDcIAeVCdYAiPKyYIJ/VjSEE+dZy6OXaCR9BVZ+hVBqoWFq7q6vrW1p6mpk52dj7q63mef/cPGxlNPz1JLy9Te3ldNTdfKyh3vaupUbm4h8fFJbm6uG97Y2M5HFIZMkkQ+yCp6wCh1uf5h9dPAwACPx8vJyUlLSwP3Uy0zk1wmJGUnJmenpmXGJ+YkpWRRW2a21NTUqqqqJXnuJM1oRrbk56NTD958HaCYmTm5uoZQUEa6ugbr6Jh99dVeGxsvBF8npwBsMjd3NjNztrR0gwMyLIE1lG++mEIRAaiqqo6hod2pU6exCgVVVtY+dOiEhYWLrKyyjIwi6MTqsWMK+/cfO3LklLKy1p49h62tPUQYdXQMyMrKvXPn9jMrV1XVNHR0j0MmAeKDF0SxCnwRpunrpqj0H8QU+/D5/PT09MbGxs5ZrKuLL9KYzbq6usrLyysqKhavpsuHUXCzYMexl5fXgFwBVi+vsGPHFDU1jYDFwYOyYBGIQFMPHz4Jl5FROnlSVUvL5ODBE1A7QAY1FZnt4R4YGI2ALiurgpfQ0DCk7yuwtfXeu/cI3oOCwpkTJ1Qx4Ouv96OBN0B/Qgte4QB66lRubozAwJBTp+R2vfsRv3u8nT/Eoz6dB4uoykUgBJR0/YRNNKZkJ72NMsAEqmD4Z95btP373//+z3/+U11djQkX+SCq5cMo2Fqwg9Hjx5Xs7HyDg2MhosDF0dH/228PQcN0dMyxRCCG+J0+baCpSd6XpKCgiXzR3Nzl0KGTYFRktp91Hx+2oaGtgYG1k1Pg2bMmeAmAeO6cDVYR6JEAaGubGhjYQKQh1SYmjg4OvtQ3WAKgnVPnCQ7mvvvuB+++u6um5srQ0BiZblIXiWgKEdMFB/m+AdOubtRPFKbU56Woh8AySEXJNT4+fu3atcrKSuB1677dvHnz+++//+GHH27fvo22oHduhnmgo5hw8YyS2UN2aQd5b9ewZPmSMYpjDyYQyo2NHUAJcDx+XBnxFwkiWFRUPIt8EUQCFzMzF3NzV21tM3CsqKiJZACxXmS2uTgyCqSh7u5MS0t3OHqQ7FIRnMwcqM85o6CUOHkg7ehB+oslqJ06CZh2c/O8efMGChT6nhJYx/0qvpXEdOBBNe0i1VRw9xNyA0hvd3fv6OhIZyff1NQ0Ly/vX//6F7CgDWgiQ0VmiX0nJibQgyVecarPaGC0tLQUOrr4lBQzYCpOdGprx4TwZyYlxacxiuO3GKcLFw2Nc1A4tEEGMAIWdIOKrWQKiCW2orJBmA4OjgNS1MekorPN0cEZ5oSjIbJpDh5mb++HWI+KXnAwKZsS02e+dI9V5KYQUXor+XlS51h9Y+fOne+sX7/+woULENRuyhD9s7KyfHx8UABBDulfgeLzec3NNS0tP/nVq5enWk1NTUNDA7QTtdf169eXpGxCMZeZlc0KjYxgx0iWLyWj1Of4IBJc/jx20D/kgiKdj91JRv38AsbHf7rvibb7mJIa2dw2hIAu2HDfsA7voLYi6I+O3zU2sdq1axc2QbEABF33oIQyMzNrbm7Ozs6+ePEito6ODrDZmV98kbRvf9HefUXf7i3EMjIq+/x5FP4CgxIbGhpCeqHuIL62tnbxv8GHeg4nTCe/o6OjXbJ8GqPCCPgYnC5ZRDofs+OMsrX19fLyfZBRGDDtuF8btc1ysYkUVCo3GB77QVFZ49Chgz/++GNhYSH0EnTCIKXGxsaQRg6HA+wQ6Ccn+jw8sn/16/H/+98E/Pd/IP77KaLo4vDkJHkpgbbJyUlzc/P8/HxEfBCPCZfqQikm7++nX0RibBqjqHWeEHdzC0FJZ27upqNjlp6eTiWjMxsYJaWUR92eJ+gTNWwA5QWFhStXrlRSUgJSkL12yrC1oKDA3d3dzc2NzWajf2Cgj8tN8fapjObyOZFtbE4bh9Nac7mxtaWpsaEO3tTUCLgNDY3KysoAN9R3+T1del42jdE333xrnv6X7dvf3LJl69at27dv37F585Zt27ZjuWPHm1jdsmUbllu3bsOwWXbc9tZbD256HI43/OGHHzk5OeflXQABOFkF/4/phm5+J3k1FJUTyqNZISWtB+KXlJT0wQcfJCcnY07USbC2tjYkoFg2NjZCU6nV3qSkhIsXM5qaquvqyuvry1tbL5cWXvByczmtoaukpGNtaV2Yn2toeK60rAznT2tr61KJqITaNEbXrXt1Xv7yyy+/8caGv/71YxyYLVs2f/LJJ2+//Zcvvvhiw4YNmzZt+vDDD7dv3/b++++/9NJLr776yquvYvwauoGezZs3YwC9iZ7tlVdeoQagsRYzY5XqeXnt2pfvD6D718LpYVjSm+brK1c+Y2Njc+/ePQRfwX9iFqPue6I+AuX9vJihhL927Vpubi5wBFtCA5o0r2gD2bi4uMTExJKSEihuWVl5LDvi70dktstrfWrk+5UB8xNZi//5VuWrr76uqKhARouSC3sheRC8xpNn0xhFTTp3W7duHZZ79+61sLB47733Pv/8c0tLy4MHD6JE+PLLL8+cOXPkyBFsVVdXf+utt1577TWMf+edd9AAWDt37vzqq6/U1NTWrl27ZcuW1ynbtm0bPQB8v/vuu2+88QY63377beyOXcD9xo0b0Y+tMMyGHdFDv5n52rPPPstkMoGU4N8wu0E7yXyU+mypa/ZwTxsED2ChGO/q6mqZxYAvl8uNiow6f/48aqP4yMj3Dh/8Jjwyq6+f1RplVK2mm2e628Zl+4d7S4uLRkZGiouLMXJJSnsJtQUyCpKAyNmzZ7W1tYHmnj17Dh06ZGVlJSsra2JignwftIGDN99808HBAcMOHDhw+PBhDFBVVUUDSRt6UEMoKCggUcBskMzPPvsMO6JfV1dXmTLMpqOjg9WPP/4YCoriA50aGhoqKiofffQR2oAVHAve03wM7y0oKOjWrVuCf8PsRoV7wfX89s6fuX8UjJaXl6OEh/6hlp/RgG9UVBSDwUhNTU1PTpFRkn8nyL2P+H//S4yX32U69r1n0/o3tUKZj2X3VhSXXb9+PTUjj98FGX342bGcbYGMQv8gllpaWhA5gAVcIJlACjAdPXrUwMAAwCGOIwcAUlBZcGZtbY0BMjIyYBrA7dq1KzMzU1FR8fnnn4coAjWAa2pqijkxGKugE/Mgc8AuQBlSihfCS+vr60OhcSZgiZeg3898be6Mwrp7+hDoIaXkZ/SCvpkNjFZVVSE6d3R0NM1iwBc1vq+vb0J8AtPH91WFI6qtRf8ixuvu5bDv7Pec3OLY+5Z6zQcfKXxQcbEyPiGpqbmb1zlOSviTSunCdRQaBv6go1ju27cPyO7fvx9Qfvvtt4jIQO3UqVPffPMN2IWmIgfAVgR3bALEaGDTsWPHADeVtm6H4mpqamIvkIdsgZ5TXl4e1EI1MTmmBaPoP3HiBBB3dnYG5QBX8IbmaWA0MDBwjozCyG+MUOFesD6Lff/999DRtLQ0ZJ8NlKFCh3bW19ejxkdaiQZ6IiIiXF1dIyMjnczMV+mrfNrNDhq39p/c435jo9fEBuuuTbLl29+V31lWWIHsNj0ju5XX18J7csumaYxCveZuVL2yDqSiAWSFhk1gCBwgvxR0UQbpRVhHP7YiT0ADPWgjkT158uTu3bsxhk46T58+jZErV66Uk5NDFrFmzRpkAtgFqS1ofvHFFz/99FM6l8Uu9JuZr/35z38OCAiYI6NkSnr/iQ8PSUlR13t6emLymJgYgAgcQSfOJSSU0E5wiVIJmEJiw8LCEFVCQkKsDQxW6att6AiR7dht1Pu2zcBWy+4NGrXrv8zc/NbJnUW5RYjxeXkXMjLPd/aMP+SGwOVt0xgFMXM3mjAARK9ONWxC/4ObEJrpxtRN6Fy9ejWW6MQS++7YsQNtdIJyUEvvRfejgX4oKFBGg5pg3vbCCy9Azqurq+f4iHGQgZSU+ux+sKNz5u+KTE5OJCcnPfPMM4AS+ShYRCoJRhFGvL29kYMiC/fw8ACgkFgWi4VC09/Pz8XKerOi7H9fYX/aoS3b9oVi6zvHrm79Im/z9uQPt576a2nexbq6OqjytYau9s6h5rZZX3152zRGE38hS0hIELSodmxsLN1GIz4+nm6L9NOXbxZgmAf71tbWAtDZvhwiYqAC8gkRpQv8BylBz83b38srKJ88eQL/RlCFvBNhGgYWvby88KIoHP38/BDxgSmSUWQ+SsrKqopKu95/d4W+wm+j9VcH/O0Vr80vOb+2yuaNP9h89sLXHxfn5WNHfkd7/8AIdY8Leb/VE5iYTmMU0eoJsfleyqHvIKHvbhZ0UUbjgv6ewR9s7b3eeGPD5cuXoaONjY04Da5evWpjYxMdHY0KDyWai4sLRBT4AmIjIyPgi/LRwszcxMTUxNrGxMrKxNLCFG5laWRuYefgeOXy5cLCwvz8/KHBgY5O8saA9g7qC1XT7lld/jaNUUGf1B4wsIhAT1/J774vvugkS/62wfrmofbO4d6+QUT25557jsvltrS0AFBYbm4uKv0LFy6Ulpbm5eUhAbhy5QpSVcCKfADW1tbW3trW3tLKa2njtaKXdPS0tbaCcsyTnp6O3UdGhvEG6K+pzHbzwHI1MWV0aGhobClsnDS6OTpPHxsdHRV+ugMm6HvwkJXyqa8vwzu7+hpbhxpah6jnkPUMDQ1iL+SaUVFRqOjBIgxQglQsARyWUFm6fy6GXTAe+QmYpu97om8XxBKvuGww7evvHxodGxkfHx6fmNHFkdHBwcHKykqUIMnJySmLsuT4uITEpMTU9KSUtPl5cmpCZlZme0c7fT8HgEAiSF4lpVLS/v6ezu4+0AlGIaVCXMAoiEQODRxrFm0AFHkCCi9kJkidqbNC8BUAMuIvi5DfPzDQ1dlVnJZ8PjomL4Y7o4sdo0ND5B3jqalpDQ3N9fVNi3FeOz+SE5XNrajN7qvJ6J2XX87oKUlqiItM6erqFDIoTEnBCugEKFMBhUH+L126FBkZiaQTmC7SIJ8ZGRkQVOH1B7wW/QZwnpBfEJB0SPHP6+sviA5rLUoeri8eriuc0cWOURwPLjempQX1bx+P19Pe3tvVNcTn9/N43Vh9uHd1DQrbbW3dA4PjuefPl0b0XfEmLs3Tqz2IVg6RyCxo4TVBHWkZAx8I90CkoQWAkompCCXk/7yvDzoaEREBCVykIa+NiYmxtbUtLi6eWuRBzunMWNIvRUFEG65dK+WGELeqiO40oidjZhc3RkdHR3B0cnNL0tIKMzMvpqcXBgdzOJyknJxSrGZlFWMJxyra2dmlubllGRlFOTll6AwICEdPZmYxerBjYVE1NyaeLdcTvIMIenN+HrCD4H5CuKkl6xpotbe3Izft6+tBuKcTUDLEd4sCShv5yXpfHyJ10aINRX1JSQnSHmS3UzNjvA1hYopzh+6XOMNpPzQ83NXeURXHIHqTiAYG0cgSeHMowQsnWkIFq+LH6GhkJKqOVCYzgcNJV1HR1tIycXYOCCQfeU7/1gL5pHAXlyAmM97ExFFT04jDSXN2DvTwYMnIKDk6+gYHx4SFJWH3mLgsBiPC491esxXEfN1kBeH6W8LxSPa2tzbv3Pk2j9fe0zcM6apvJpeo5ac+OHeqobe7uxuVeFZW1vnFWW5uLn0ZixZywQsIIr7gCwLQdQmVUuRFA4ODjrb2qZ4mRKsfUWFKVFoQFRbEZcubBSb1sdpjecZEtSXZKYaMcjiRHA75M+CAz8DASk5OLSAg6uxZI319i+PHldDj5OSvoWGAfjU13RMnVKkHjeu6uAQeOYIuXSUlTeyI3cFoYGCo+zu91iuI+brlCsL594SPXNmtH0Z2vv22qYVTz+A98utNVDoo1LAH8UBQBp1Qvnv37v1r0Xb37l0EetRhD96KL3ia3+xnizgbwgIY3bN37+oX12Q6qxP5e4goRK6dRMI7PJ/t7NPrSmxeb3HfQsS9Q8TsFDtGx8ZGIyLYLJbg5+pCQxPNzZ0PHJDR0THfs+cwKJSTUzcyslNQOLN372EDA2t9ffI3Q9zcQiCrINjfP/LkSTW0sW8UN83HK8R5W5/NAwj+rFutIJz+i3A7XEIQ//v555/rGZhM3ryLt9dPfXZPXqTsIBNT9IjwAZiSkpLo79TfWbSB0R9//DEtLa11+m3OeFGgCUBR42Mp6JUcu3HjBhLul9eu7ezorYuyJlI+IiI2EJwtROzWoFMv9Hhv4Hm9cc3+NSIKmG4SQ0bHwsMjgoLIR0EBNUNDW+B47pyNg4Mv4j5WAaWFheuJEypYpX85FxDLyiqbm7vo61v6+ETo6ZHPJAsKio7gJLu5BDhsWCCjrr8jbL/KPySzf82aNVeuXB4dmVa1UHeZkIUL/eEkRWrPwMAAqEpPT0flB0ypb8nfmJycBK/Uk0fu0atYzuVhEBiG2VDgIyt9UCrRQcV6+oSRsBoff52fn9/2HTuIH4naCDMiGYxuJDhbibjtDIXVV2xf7/F6w3D3KiJqK5GwURwZDQ0N8/UlvwMNUYT7+rKRYiIHpZ8uTTuiPxJTuoF+LDESq1gCbiz9/Dih4fGOdj42L/cvjFG33xOaO+K//vbL4pLiqU9+BA1ogk7wQUdbUMLv6hsYIL8XpaSkdOTIEUgggj7CGQxQgjMU6cnJyYAY+A4Pw3uGhnjDtA/z+vroT/IFhhU+n48d6+vrMzMz8T+hX1rE8IbuR3zqc3xBtwQY/i0tLS3rN2zYv++7Up8zRNpfibANRMRmInLLSMAbbJWXYjXWJJ9dQ+potPgxOj4+FhLC9PBgAs37Pu15kfd9xs6f3MeHHcKKsTH3sHp20PYBBH/WwajjCsJ4Z2HHQMONmzemliwwSjR7wSj9GTpkrKV9qHfg9nHZU9u2bfXy8gKLgKyzsxMDL126ZGNjg7QSBvgwFY/XpKfHkZPLUlTKhp+Uyza3AIo/fWCRkZERHBwcEhKCY4niqbm5+cF8FAYqye8I3M+SJYhR/BPGx8erqqv//vevYwy+JTI+IULXE+GbiLBNBGczwd70L8ZGInIz2RP5htgxipopKyvb2NjW0dHfwcFvMe7uFayhbHz2142mK24Yr5iclxutmDRYMWRzJKlrYObvuwEIASK8QVDC7x6treM9//wLLa0ttbW1bW1tABQG1YxAfs1mo9h3cXG5cuUKZuPzr775ViH+5b/9HfFfv8MBIA58d+/2rS7B1NQ/oaCgAGRDQYE7qAXcM78NMj8e6ugcam0f7uzGWIx63Lawko3EdGKiq7O/wkeNrI2YrxGhbwg8bCPlVJu9XuwYxR+M/3RGRmZQUAiDwVqMM1mh/n5BAQ7cEOf4+XqQYwzDPa6u4TqUTPDOZjL66KB84XcPN7X2rV37anx8PIQTJQ50FIatFy9eNDc3R6WvoaGRm5sLRWxoqLW2SfHyHvTw5Ht4djq7dEVHg+qG1paWttaW1tYW7Ig6yd7eng739BdNH0QBfAwODjQ2tVRfaau9Ti4bG8mvo8zXGhsbee3k3SyNzc2NLS3z8+ZmXkfH0IK+Etg/MFBf31ruqUjEvk0wXiNYG2bwiNfFjlEYDgaEBCngxATOtIU7bBIlyp2RidvD83Zyr5HBocHpQX5mAzxwlEOBgYFPPfWUvLw8klEoH20QjAsXLjAYjNjYWLDb1dV19WptXBy7vf1yQ0N5Y2NFS0tVc/OV3Iw0VycnA10jc1PLlKS4hPhYF1dXjEcSAKyBo+DF7ht6MBUklrwpNhHLZCyTyHsckrGcl6elpXu4u7N8fdMS4lNjYublyTExiWz2xYKCGbORh5uAUXc5gvsmwVhHMNfP4OGviSOjkmuQPaSSxsbGkD3efYNCYpXOaIEsSqKrV6+yWKzy8vKioqKLxcVlJaVujg7vHTi2U8nwk9N+n8o7f7bvzJ49h+ztbZEtgFHsjthCv4TQkEVgU0lJ+fj4rZGRyeHhiZGRieFhskEtH+IYeYNu0D13vv93SnJaK5dL5GQTaWnz89RUIjc3m8m8Vlc3OM9nVYDRpqb2CjdZImo7EfIqwXh9Bg9bJ3aMQkQRXnEAFm8Q45FhVNHzdNjwyED/Ap8Bdvv27fT0dARQSOCMBkyRlQYFBUFcs3OyC/ILHK2tXj9xQjevjNt22aLaTq/A6FSo5+ufyxsYGI+NjWIqxH3AKhLrIdXx8QkVFZdrahqqq69fudIEp9p1D3pNTf3ly+QwerWyslbYhtc38qOiYhqtLAlNzf+cPj0/V1cn9PXLnZwKS0u/v3v3wYTkIXbz1q36+rZi+4Mo54mgtUTwOiIUEf81ImgduUSbbLwiXoxSEa2ntLQ0Pz8fRcMiDZMUFhQV5s/PC7AsKGppWuATbLAXUlKART7vYSaDsl6+fNnHxwfkwTghjE0yB42uVRPE/xsjWsNGFGw6PjC9vv8Lh6OGJpbDQ0Mo6hHQkaGKHH6cSnFx8VxuamRkenR0pq9vuK6umaWla1zceazGxORgCedys2Jjc8PCEpFrcLnZsbE5XG6mrq45m50SF5fL4aSx2akJyYV+PkHNf/uE+M1vFuJ/+lPeN9+sXbfOwckJKRad+TzccZSRhcXExr72+oYYtV1E7JtE4MsEa12GxvMNli8RnNeuma3O1HieCEUCsFaMGMUxQEDE8cjLu1BWVoEotmCvrKxOSkxx8rYuvpaRdzVxfl6bmFeVFJPKqbtet4AcC4zGxcWhQiKLkZkMUlpTU+Pu7o70NCE2Tktba5XLuUvE+M3/dJf8K8D/5ntuIzssO97/0u8tY0uzjrYOJA/IOx+M9QgSsbFx4eEJYWFJAFFe/rSGxrnw8GRg6u4eYmbm5OYWDDcysrOycj971mj//mNBQdGamoa2tp4YrKpK/vQrm50WGpoYHXfe082nedc7YGEh/pvf1Bw86BUYuHLVqsgo7tj4za7uvof74NBoVVXNc88/b2FhV+NymAjfQPivIUJfdd73tOuBp4moddbf/Nlh75+J8HUE42UxYhRHFylaenrm5OT3PeTvewz39Y3094+i8XM+hGEotOi94IOD47VXGtmZ/k1EUiXBqiLC5uVXicjC/uiMrPSbN+b6BXyh3bhxA6fZ9evXUSzDACWEkG7TDUgpGHVycgoPD48KC9936sSfk9ytxsNib5p73/jI6+Z6t5GNhrztH/q8bmJlVn+NvIUUYf3BGApGY2JiWawYFisBnAUGRqup6ejomGloGADBffuOqKho2dh4nD1rjLaBgdW5c9anT+tbWLhgvKyskqWl2+HDckxmApMZz4nJdnPybHnzzWnkzd1//euqf/4T/Kioqhw+Jt83/O+pT2Ge0XsHf7Bz9N317i7sdcX1IMF8lfB7iQhem67+LFtuZa3xC14Hn0aDYCFJFSdGcSRKSkri4lLKyq5duFBRVFSTm1uanJybn19ZUFAFFzZoLym5QjcuXqxJTc3LzCwsKrqEMXA0slKLXFP0QonDHsSXXsTf5+lfho6etnGwbKpvnvoJ08MNw1AzgT9HR0ewWF9fDzUFrFjC0EPftgxq6av6AQEBTP+Af8oc/WO6z/906mr1fGA1uMN+cJMZf/2p6o1bHF/VNz031E+etzk5OZhcBFNk21xuTGAgJyQkDpw5OwdAO7/77riZmfPu3QfU1HSPHpU/d87m0KEThw+fNDa2U1XVAaPod3UNVlHR9vWNOHFChf70Ljwyw9HWpWXTpmnkzd1/9asrX31VXVe3cdNGeweXsYk7HZ39D/fB4RspaVmrnn22oLC8zv0QwVhL+K4mgl9OUl5Va/y898E/l+o+x5B5hmCtJYLEjFFkoiEhEUibEIM8PJgKCmd0dS0CAiKxGh6eEhGRgrhG32sCMUAUw7FBP9r6+lYmJvZIreAYExGRGsFINUr+Tof4gzyxQnGerkCssLvzwTsfv/XSiy+jsqFyLPIep4c5mWBNJCQkPP300/v370f6WFdXh4o+OhrypoaKp7i4WFZWFhU91LS6utrS0tLLy8vf20dO/tTvgmy2dvscad2jyntfpWn74cpNf8vescZ+h76pUU9nN5iOiYlBpSVy+QmMRkdzfX3Dgqif77e399XSMgF/AQFRdnbenp4sR0d/X1+2sbG9jY0nGubmzt7eYaAWWzHMz4/j5OSPwcCUFZFqa+HQ8tq6aeTN3X/724K//GXVCy/s3bevv79vcFDwfa+HeH9fL/6r+gYGTz+9KkFpCxGxnvBZDSkdcnjxnudqLL/3WN1n9wLh/xLh+5J4MVpWVhoYGIZMH1BCGA4ePI7/Pv7FyJwQubDEP9re3kdGRsHU1PHLL//p6Oirrq6LKIbDc+yYAmIcgAbKYDQsKMkgaY8e8ZQysUJ1no5dDAY2l14uNDE027Xr/f7ByY5O8vPGhzi/a7i9c3DDGxtRDAFHqClUE6knctODBw9WVFSEhYXt27cP/WAOjKqqqmpoaJw9e1b+yNE/7P5sRZLzcwnH17PfWc/YuMZ3/SrvnSs0PtbUN+Dz2lFXYZcHM2MwyuFEeXgw/Mhfj2YDNQhqQEA04KPuWCDh8/ePDA6OBcQYE0T9zB/9A9hAkxoWTX+kHMxKtDS2bn1p9TTy5u6/+tXFLVtCOJyxiQkkbHMMOzjlbty8mZyak6u1kwhZQ3i/SHgD09WkoPrfX6IH7Ioboz4+ISAMYgmB9PEJ/+47GZq/o0dPUYHMCZL57bcH0amvbwkpRdhKTS1GTWBt7a6urmdu7gJGWazEEN847cSvdIk/LoBRFWKFVu+r13k1lyquvLx2XX3LYDNvtJG6/X42b+WPV17mPfvcC4jIVVVVlZWV165dQ+rJ5XKRegJcf39/LS0tBG7E/draWmtrazCqra2to62tqqKioK+naKinpK+prKdBuv7ZUxqnOZGRpSUlmZlI0CcF/6MpNj4+hnzU1tY7KIj8ffXFOCM8xUzfvPtPT00jbz5+cevWWh5vZPbHYc9oA4PkmV9l+hHh/xzh9Tzh9cLMLmaMlnl4BKICwOnu5hairW0KaUTMQnaPmIXKFOIqI6MIh46CTnTKyakZGtoAXPoXmKytPZAAkIriwT2T+JkO8X8Wxqje2GteDOd3d74nJ3dq8sYtZIPdD3XowujYxO7du7/88ksGgwEKYdA/snhPSKAfVWJvbw9Bhb7S+FJXS0njtbW1N7e0N7Xwmtt4zTx4ezP5pXuksAAaySiEWSTQw6CsmN/R0c3U1M7c3EHEzcwczLB8oH9Gt7R1U5VX4W7YcHHTpvl64caNeevXZzg49JBfpxEt7B5u/QMDzW09F/XfJ3z/RPivIvyendnFjVEXFx+kmzi5EYwcHf28vEIBHB2YsETAQg9SVaxCZX2o3w51cQlCFKPvx8MS+2KYjwtHNf5DLeJ3AE4Ewbm4wa112z9YL3NYtqene2hoTlegRoaH29pa/0kZkk4wiuyT/kI9jSxKJfTMy0AzyqyIiAgejyeCKUIqAisS30uXqi9frhHxqurLxWW15ZVXS8rwHkS3inoN+cYqGxvL5+9lDQ2Vzc09IyML+/rfwMh4CTeo8swrV3XWXpvFxYtR1Ez29h7IQUEeUiXQBubQRjoF/ujEi8YRW4Wd938LSuDUmCgP+3DF+J2axK+ho8B0vq48/EdWou+9Oz9CruZe1+NPuHPnDofDgV4CTZEnPoADLNE5R6N3SU5ORhY725VagIsXBawihj5+91hnz2hH13hvH04fQf/SGzX1fBVUaGQJNTR65dK1yuKq6tKZXYwYxWFAcLO0dPDwYHl4kL/2tGD39gq3Mwk8FLlO/T8rlObvyj+ukL3+x/TslPGRGRLBh9vIyEhUVBTyTkAGthZjENH09PSsrKwbN24IZp+z4dh3d/fdvwN6TnfG/II2CNBHRmdzMWIUBkkoKCh0dfV0c/N2d1+4e3j42tu46bqfskk7ZZ0iPy+3SpE3T5ANS/fu6xpYgDyA0cTERBTjYBT1++KNvtlvNh19iOG9oyJppZ7/g8ZCle6XN/FiFDYyMjwwQH5qT0aBxXh/72DPyEDH2IJ8fHRgcmGPoEfwbW9vRzkfHh6OPHKRhrSByWT6+/t3dZHPxBe8xpwN8kl9L4/8FuuDT6yQFBM7RmFQr1/cBG9lQTZAGaqZJbHOzk7hrX3zNfwdgp/qk+Rn74gjo8vDBLAvkQkmXZA10z/V1zbYKZnP15UyuswNUPK7yO/gIyWVrO/lCU3K6PI3YEp/Bx+MSuKDS6WMLn8DlNR1KLJ4wlLQKzkmZfSJMGBKl00QVOSmkiWlUkafFOuhHt1PPwNasq5DSRl9UgxQdvAl8hnQUkafLAOjdFbaSf3yhESYlNEnyADl/SdCDjRLzg+QShkVdxsYGKBvMFoSGx4e6uwe6+we7ege6+4dfRT3Qw0Oks8PFLz7pTApo2JtOOTXr18rLy+vqIAvgVVWVJSVV1worL5YXHWh8BLaS2t4q9VVVTM+WGXBJmVUfA2SdOFCfkJiSnZufnbOUnpWdn4WvcwW3bRoL8jIzE1ISHrwS4ILNimjYmo4wE1NjbGxCcNjP3T23noU3vVAz5L40Ni/S8trsrOzRub2s9Y/a1JGxdSQ1V29ejU1Laur92Z9M/mLUJLirR3jVZfqMjIypIwucwOjtbW1KamZYBQHXuRrqOLsbfyJyurrmZmZUkaXuUkZFZqUUTE1IaOdksfoeGX1NSmjy98kmdGJClJHpfnocjeJZlQa658Ik3wdlTK63E3KqNCkjIqp0YwmSyijVVJGnwCTMio0KaNiagJGUySUUem1pyfA7jOaIZGMVkoZfQJMohktr7yWIb0+uuxNsnWUjPVSRpe7/cRoj2TqqPS+p2VvNKNJyZLKaKaU0WVvks6oVEeXv0k8o9J8dNmbkFG+BDJaJtXRJ8GkjApNyqiYmpRRoU1jVGpSE08TMCo1qYmvrVjx/wE3k06SEXGrRQAAAABJRU5ErkJggg==
From ad575da2bcd8132ccdba2588ec7787297b9b8d52 Mon Sep 17 00:00:00 2001
From: Andrea Settimi
Date: Fri, 12 Apr 2024 09:35:18 +0200
Subject: [PATCH 033/141] ADD: logo proposal
---
README.md | 12 +++++++++---
assets/logo/logo_400_400.png | Bin 0 -> 13147 bytes
assets/logo/logo_text_600_643.png | Bin 0 -> 32605 bytes
assets/logo/logomaker.xcf | Bin 0 -> 125150 bytes
assets/logo/logomaker_justlogo.xcf | Bin 0 -> 74299 bytes
assets/logo/logotests.3dm | Bin 0 -> 798682 bytes
assets/logo/raw2.png | Bin 0 -> 12709 bytes
deps/eigen | 2 +-
src/gh/diffCheck/diffCheck.egg-info/PKG-INFO | 18 ++++++++++++++++++
.../diffCheck/diffCheck.egg-info/SOURCES.txt | 13 +++++++++++++
.../diffCheck.egg-info/dependency_links.txt | 1 +
.../diffCheck.egg-info/top_level.txt | 1 +
.../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 132 bytes
.../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 163 bytes
.../__pycache__/df_geometries.cpython-39.pyc | Bin 0 -> 11092 bytes
.../df_joint_detector.cpython-39.pyc | Bin 0 -> 3472 bytes
.../df_transformations.cpython-39.pyc | Bin 0 -> 3433 bytes
.../__pycache__/df_util.cpython-39.pyc | Bin 0 -> 3239 bytes
.../__pycache__/geometries.cpython-38.pyc | Bin 0 -> 3939 bytes
.../__pycache__/geometries.cpython-39.pyc | Bin 0 -> 4125 bytes
.../diffCheck/__pycache__/test.cpython-39.pyc | Bin 0 -> 259 bytes
.../dist/diffCheck-0.0.3-py3-none-any.whl | Bin 0 -> 9938 bytes
src/gh/diffCheck/dist/diffCheck-0.0.3.tar.gz | Bin 0 -> 8460 bytes
23 files changed, 43 insertions(+), 4 deletions(-)
create mode 100644 assets/logo/logo_400_400.png
create mode 100644 assets/logo/logo_text_600_643.png
create mode 100644 assets/logo/logomaker.xcf
create mode 100644 assets/logo/logomaker_justlogo.xcf
create mode 100644 assets/logo/logotests.3dm
create mode 100644 assets/logo/raw2.png
create mode 100644 src/gh/diffCheck/diffCheck.egg-info/PKG-INFO
create mode 100644 src/gh/diffCheck/diffCheck.egg-info/SOURCES.txt
create mode 100644 src/gh/diffCheck/diffCheck.egg-info/dependency_links.txt
create mode 100644 src/gh/diffCheck/diffCheck.egg-info/top_level.txt
create mode 100644 src/gh/diffCheck/diffCheck/__pycache__/__init__.cpython-38.pyc
create mode 100644 src/gh/diffCheck/diffCheck/__pycache__/__init__.cpython-39.pyc
create mode 100644 src/gh/diffCheck/diffCheck/__pycache__/df_geometries.cpython-39.pyc
create mode 100644 src/gh/diffCheck/diffCheck/__pycache__/df_joint_detector.cpython-39.pyc
create mode 100644 src/gh/diffCheck/diffCheck/__pycache__/df_transformations.cpython-39.pyc
create mode 100644 src/gh/diffCheck/diffCheck/__pycache__/df_util.cpython-39.pyc
create mode 100644 src/gh/diffCheck/diffCheck/__pycache__/geometries.cpython-38.pyc
create mode 100644 src/gh/diffCheck/diffCheck/__pycache__/geometries.cpython-39.pyc
create mode 100644 src/gh/diffCheck/diffCheck/__pycache__/test.cpython-39.pyc
create mode 100644 src/gh/diffCheck/dist/diffCheck-0.0.3-py3-none-any.whl
create mode 100644 src/gh/diffCheck/dist/diffCheck-0.0.3.tar.gz
diff --git a/README.md b/README.md
index dbae83cc..1e17f87e 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,15 @@
-# diffCheck
-
+
+
+
+
-Temporary repository for diffCheck
+
## Roadmap
diff --git a/assets/logo/logo_400_400.png b/assets/logo/logo_400_400.png
new file mode 100644
index 0000000000000000000000000000000000000000..55410e5c2e2aaaa849170b82c808ec7cbb24619f
GIT binary patch
literal 13147
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 |