From 42dfdea5422ab72d81c36155b4c6f352c85c1110 Mon Sep 17 00:00:00 2001 From: spo Date: Tue, 25 Aug 2015 08:55:08 +0300 Subject: [PATCH] Issue #532 - 4.13. Partition with splitting-arguments making solids with shared faces --- CMakeLists.txt | 1 + .../FeaturesPlugin_Partition.cpp | 95 ++++- src/FeaturesPlugin/partition_widget.xml | 8 +- src/GeomAlgoAPI/CMakeLists.txt | 5 + src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp | 117 ++++++ src/GeomAlgoAPI/GeomAlgoAPI_Partition.h | 66 ++++ src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp | 30 ++ src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h | 5 + src/GeomAlgoImpl/CMakeLists.txt | 27 ++ src/GeomAlgoImpl/GEOMAlgo_Splitter.cxx | 343 ++++++++++++++++++ src/GeomAlgoImpl/GEOMAlgo_Splitter.hxx | 99 +++++ src/GeomAlgoImpl/GeomAlgoImpl.h | 20 + test.squish/objects.map | 13 + test.squish/suite_ISSUES/tst_532/test.py | 38 ++ .../tst_532/verificationPoints/VP_EXTRUSION | 9 + .../tst_532/verificationPoints/VP_PARTITION | 9 + 16 files changed, 874 insertions(+), 11 deletions(-) create mode 100644 src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp create mode 100644 src/GeomAlgoAPI/GeomAlgoAPI_Partition.h create mode 100644 src/GeomAlgoImpl/CMakeLists.txt create mode 100755 src/GeomAlgoImpl/GEOMAlgo_Splitter.cxx create mode 100644 src/GeomAlgoImpl/GEOMAlgo_Splitter.hxx create mode 100644 src/GeomAlgoImpl/GeomAlgoImpl.h create mode 100644 test.squish/suite_ISSUES/tst_532/test.py create mode 100644 test.squish/suite_ISSUES/tst_532/verificationPoints/VP_EXTRUSION create mode 100644 test.squish/suite_ISSUES/tst_532/verificationPoints/VP_PARTITION diff --git a/CMakeLists.txt b/CMakeLists.txt index e24cc90e7..1ac46e691 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,7 @@ ADD_SUBDIRECTORY (src/Model) ADD_SUBDIRECTORY (src/ModelAPI) ADD_SUBDIRECTORY (src/GeomAPI) ADD_SUBDIRECTORY (src/GeomAlgoAPI) +ADD_SUBDIRECTORY (src/GeomAlgoImpl) ADD_SUBDIRECTORY (src/GeomData) ADD_SUBDIRECTORY (src/GeomDataAPI) ADD_SUBDIRECTORY (src/PartSetPlugin) diff --git a/src/FeaturesPlugin/FeaturesPlugin_Partition.cpp b/src/FeaturesPlugin/FeaturesPlugin_Partition.cpp index 284acd118..362081c0b 100755 --- a/src/FeaturesPlugin/FeaturesPlugin_Partition.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Partition.cpp @@ -16,6 +16,10 @@ #include #include +#include +#include +#include + //================================================================================================= FeaturesPlugin_Partition::FeaturesPlugin_Partition() { @@ -24,27 +28,28 @@ FeaturesPlugin_Partition::FeaturesPlugin_Partition() //================================================================================================= void FeaturesPlugin_Partition::initAttributes() { - - AttributeSelectionListPtr aSelection = + AttributeSelectionListPtr aSelection = std::dynamic_pointer_cast(data()->addAttribute( FeaturesPlugin_Partition::OBJECT_LIST_ID(), ModelAPI_AttributeSelectionList::typeId())); aSelection->setSelectionType("SOLID"); - aSelection = std::dynamic_pointer_cast(data()->addAttribute( + aSelection = + std::dynamic_pointer_cast(data()->addAttribute( FeaturesPlugin_Partition::TOOL_LIST_ID(), ModelAPI_AttributeSelectionList::typeId())); aSelection->setSelectionType("SOLID"); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), OBJECT_LIST_ID()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), TOOL_LIST_ID()); } //================================================================================================= std::shared_ptr FeaturesPlugin_Partition::getShape(const std::string& theAttrName) { - std::shared_ptr aObjRef = std::dynamic_pointer_cast< - ModelAPI_AttributeReference>(data()->attribute(theAttrName)); + std::shared_ptr aObjRef = + std::dynamic_pointer_cast(data()->attribute(theAttrName)); if (aObjRef) { - std::shared_ptr aConstr = std::dynamic_pointer_cast< - ModelAPI_ResultBody>(aObjRef->value()); + std::shared_ptr aConstr = + std::dynamic_pointer_cast(aObjRef->value()); if (aConstr) return aConstr->shape(); } @@ -54,4 +59,80 @@ std::shared_ptr FeaturesPlugin_Partition::getShape(const std::str //================================================================================================= void FeaturesPlugin_Partition::execute() { + ListOfShape anObjects, aTools; + + // Getting objects. + AttributeSelectionListPtr anObjectsSelList = selectionList(FeaturesPlugin_Partition::OBJECT_LIST_ID()); + for (int anObjectsIndex = 0; anObjectsIndex < anObjectsSelList->size(); anObjectsIndex++) { + std::shared_ptr anObjectAttr = anObjectsSelList->value(anObjectsIndex); + std::shared_ptr anObject = anObjectAttr->value(); + if (!anObject.get()) { + return; + } + anObjects.push_back(anObject); + } + + // Getting tools. + AttributeSelectionListPtr aToolsSelList = selectionList(FeaturesPlugin_Partition::TOOL_LIST_ID()); + for (int aToolsIndex = 0; aToolsIndex < aToolsSelList->size(); aToolsIndex++) { + std::shared_ptr aToolAttr = aToolsSelList->value(aToolsIndex); + std::shared_ptr aTool = aToolAttr->value(); + if (!aTool.get()) { + // it could be a construction plane + ResultPtr aContext = aToolAttr->context(); + if (aContext.get()) { + aTool = GeomAlgoAPI_ShapeTools::faceToInfinitePlane(aContext->shape()); + } + } + if (!aTool.get()) { + return; + } + aTools.push_back(aTool); + } + + int aResultIndex = 0; + + if (anObjects.empty() || aTools.empty()) { + std::string aFeatureError = "Not enough objects for partition operation"; + setError(aFeatureError); + return; + } + + // Cut each object with all tools + for (ListOfShape::iterator anObjectsIt = anObjects.begin(); anObjectsIt != anObjects.end(); anObjectsIt++) { + std::shared_ptr anObject = *anObjectsIt; + ListOfShape aListWithObject; aListWithObject.push_back(anObject); + GeomAlgoAPI_Partition aPartitionAlgo(aListWithObject, aTools); + + // Checking that the algorithm worked properly. + if (!aPartitionAlgo.isDone()) { + static const std::string aFeatureError = "Partition algorithm failed"; + setError(aFeatureError); + return; + } + if (aPartitionAlgo.shape()->isNull()) { + static const std::string aShapeError = "Resulting shape is Null"; + setError(aShapeError); + return; + } + if (!aPartitionAlgo.isValid()) { + std::string aFeatureError = "Warning: resulting shape is not valid"; + setError(aFeatureError); + return; + } + + if (GeomAlgoAPI_ShapeTools::volume(aPartitionAlgo.shape()) > 1.e-7) { + std::shared_ptr aResultBody = document()->createBody(data(), aResultIndex); + + aResultBody->store(aPartitionAlgo.shape()); + +// LoadNamingDS(aResultBody, anObject, aTools, aPartitionAlgo); + + setResult(aResultBody, aResultIndex); + aResultIndex++; + } + } + + // remove the rest results if there were produced in the previous pass + removeResults(aResultIndex); } diff --git a/src/FeaturesPlugin/partition_widget.xml b/src/FeaturesPlugin/partition_widget.xml index e46121048..7358bdc5b 100755 --- a/src/FeaturesPlugin/partition_widget.xml +++ b/src/FeaturesPlugin/partition_widget.xml @@ -6,18 +6,18 @@ icon=":icons/cut_shape.png" tooltip="Select a solid objects" type_choice="Solids" - use_choice="false" concealment="true"> - + - + diff --git a/src/GeomAlgoAPI/CMakeLists.txt b/src/GeomAlgoAPI/CMakeLists.txt index 5b986ce0a..4739f5025 100644 --- a/src/GeomAlgoAPI/CMakeLists.txt +++ b/src/GeomAlgoAPI/CMakeLists.txt @@ -31,6 +31,7 @@ SET(PROJECT_HEADERS GeomAlgoAPI_IGESExport.h GeomAlgoAPI_Transform.h GeomAlgoAPI_ShapeTools.h + GeomAlgoAPI_Partition.h ) SET(PROJECT_SOURCES @@ -58,10 +59,12 @@ SET(PROJECT_SOURCES GeomAlgoAPI_IGESExport.cpp GeomAlgoAPI_Transform.cpp GeomAlgoAPI_ShapeTools.cpp + GeomAlgoAPI_Partition.cpp ) SET(PROJECT_LIBRARIES GeomAPI + GeomAlgoImpl ModelAPI ${CAS_OCAF} ${CAS_SHAPE} @@ -90,6 +93,7 @@ SET_SOURCE_FILES_PROPERTIES(GeomAlgoAPI.i PROPERTIES SWIG_DEFINITIONS "-shadow") INCLUDE_DIRECTORIES( ../GeomAPI + ../GeomAlgoImpl ../ModelAPI ${CAS_INCLUDE_DIRS} ) @@ -103,6 +107,7 @@ SET(SWIG_SCRIPTS SET(SWIG_LINK_LIBRARIES GeomAPI GeomAlgoAPI + GeomAlgoImpl ${PYTHON_LIBRARIES} ) diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp new file mode 100644 index 000000000..05bc5d2f4 --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp @@ -0,0 +1,117 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +// File: GeomAlgoAPI_Partition.cpp +// Created: 21 Aug 2015 +// Author: Sergey POKHODENKO + +#include "GeomAlgoAPI_Partition.h" + +#include + +#include + +#include +#include +#include + +//================================================================================================= +std::shared_ptr GeomAlgoAPI_Partition::make(const ListOfShape& theObjects, + const ListOfShape& theTools) +{ + GeomAlgoAPI_Partition aBoolAlgo(theObjects, theTools); + if(aBoolAlgo.isDone() && !aBoolAlgo.shape()->isNull() && aBoolAlgo.isValid()) { + return aBoolAlgo.shape(); + } + return std::shared_ptr(); +} + +//================================================================================================= +GeomAlgoAPI_Partition::GeomAlgoAPI_Partition(const ListOfShape& theObjects, + const ListOfShape& theTools) +: myDone(false), + myShape(new GeomAPI_Shape()), + myMap(new GeomAPI_DataMapOfShapeShape()), + myMkShape(new GeomAlgoAPI_MakeShape()) +{ + build(theObjects, theTools); +} + + +//================================================================================================= +void GeomAlgoAPI_Partition::build(const ListOfShape& theObjects, + const ListOfShape& theTools) +{ + if (theObjects.empty() || theTools.empty()) { + return; + } + + // Creating partition operation. + GEOMAlgo_Splitter * anOperation = new GEOMAlgo_Splitter; + myMkShape->setImpl(anOperation); + + // Getting objects. + TopTools_ListOfShape anObjects; + for (ListOfShape::const_iterator anObjectsIt = theObjects.begin(); anObjectsIt != theObjects.end(); anObjectsIt++) { + const TopoDS_Shape& aShape = (*anObjectsIt)->impl(); + anOperation->AddArgument(aShape); + } + + // Getting tools. + TopTools_ListOfShape aTools; + for (ListOfShape::const_iterator aToolsIt = theTools.begin(); aToolsIt != theTools.end(); aToolsIt++) { + const TopoDS_Shape& aShape = (*aToolsIt)->impl(); + anOperation->AddTool(aShape); + } + + // Building and getting result. + anOperation->Perform(); + TopoDS_Shape aResult = anOperation->Shape(); + myDone = !aResult.IsNull(); + if (!myDone) { + return; + } + + if(aResult.ShapeType() == TopAbs_COMPOUND) { + aResult = GeomAlgoAPI_DFLoader::refineResult(aResult); + } + + // fill data map to keep correct orientation of sub-shapes + for (TopExp_Explorer Exp(aResult,TopAbs_FACE); Exp.More(); Exp.Next()) { + std::shared_ptr aCurrentShape(new GeomAPI_Shape()); + aCurrentShape->setImpl(new TopoDS_Shape(Exp.Current())); + myMap->bind(aCurrentShape, aCurrentShape); + } + myShape->setImpl(new TopoDS_Shape(aResult)); + +} + +//================================================================================================= +const bool GeomAlgoAPI_Partition::isDone() const +{ + return myDone; +} + +//================================================================================================= +const bool GeomAlgoAPI_Partition::isValid() const +{ + BRepCheck_Analyzer aChecker(myShape->impl()); + return (aChecker.IsValid() == Standard_True); +} + +//================================================================================================= +const std::shared_ptr& GeomAlgoAPI_Partition::shape() const +{ + return myShape; +} + +//================================================================================================= +std::shared_ptr GeomAlgoAPI_Partition::mapOfShapes() const +{ + return myMap; +} + +//================================================================================================= +std::shared_ptr GeomAlgoAPI_Partition::makeShape() const +{ + return myMkShape; +} diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Partition.h b/src/GeomAlgoAPI/GeomAlgoAPI_Partition.h new file mode 100644 index 000000000..39f69b5fe --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Partition.h @@ -0,0 +1,66 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +// File: GeomAlgoAPI_Partition.h +// Created: 21 Aug 2015 +// Author: Sergey POKHODENKO + +#ifndef GeomAlgoAPI_Partition_H_ +#define GeomAlgoAPI_Partition_H_ + +#include +#include + +#include +#include +#include + +#include + +/** \class GeomAlgoAPI_Partition + * \ingroup DataAlgo + * \brief Allows to perform of partition operations + */ +class GeomAlgoAPI_Partition : public GeomAPI_Interface +{ +public: + /** \brief Creates common partition operation. + * \param[in] theObjects the main shape. + * \param[in] theTools second shape. + * \return a solid as result of operation. + */ + GEOMALGOAPI_EXPORT static std::shared_ptr make(const ListOfShape& theObjects, + const ListOfShape& theTools); + + /// Constructor. + GEOMALGOAPI_EXPORT GeomAlgoAPI_Partition(const ListOfShape& theObjects, + const ListOfShape& theTools); + + /// \return true if algorithm succeed. + GEOMALGOAPI_EXPORT const bool isDone() const; + + /// \return true if resulting shape is valid. + GEOMALGOAPI_EXPORT const bool isValid() const; + + /// \return result of the boolean algorithm. + GEOMALGOAPI_EXPORT const std::shared_ptr& shape() const; + + /// \return map of sub-shapes of the result. To be used for History keeping. + GEOMALGOAPI_EXPORT std::shared_ptr mapOfShapes() const; + + /// \return interface for for History processing. + GEOMALGOAPI_EXPORT std::shared_ptr makeShape() const; + +private: + /// Builds resulting shape. + void build(const ListOfShape& theObjects, + const ListOfShape& theTools); + +private: + /// Fields. + bool myDone; + std::shared_ptr myShape; + std::shared_ptr myMap; + std::shared_ptr myMkShape; +}; + +#endif diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp index 54835f857..39b06f927 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp @@ -8,15 +8,23 @@ #include +#include + #include +#include #include #include +#include +#include #include #include #include #include +#include #include #include +#include + //================================================================================================= double GeomAlgoAPI_ShapeTools::volume(std::shared_ptr theShape) @@ -159,3 +167,25 @@ void GeomAlgoAPI_ShapeTools::combineShapes(const std::shared_ptr theFreeShapes.push_back(aGeomShape); } } + +//================================================================================================= +std::shared_ptr GeomAlgoAPI_ShapeTools::faceToInfinitePlane(const std::shared_ptr& theFace) +{ + if (!theFace.get()) + return std::shared_ptr(); + + TopoDS_Face aPlaneFace = TopoDS::Face(theFace->impl()); + if (aPlaneFace.IsNull()) + return std::shared_ptr(); + + Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(aPlaneFace)); + if (aPlane.IsNull()) + return std::shared_ptr(); + + // make an infinity face on the plane + TopoDS_Shape anInfiniteFace = BRepBuilderAPI_MakeFace(aPlane->Pln()).Shape(); + + std::shared_ptr aResult(new GeomAPI_Shape); + aResult->setImpl(new TopoDS_Shape(anInfiniteFace)); + return aResult; +} diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h index 009828dc7..fa792b2d6 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h @@ -37,6 +37,11 @@ public: const GeomAPI_Shape::ShapeType theType, ListOfShape& theCombinedShapes, ListOfShape& theFreeShapes); + + /** + * Returns infinite plane received from theFace plane + */ + static std::shared_ptr faceToInfinitePlane(const std::shared_ptr& theFace); }; #endif diff --git a/src/GeomAlgoImpl/CMakeLists.txt b/src/GeomAlgoImpl/CMakeLists.txt new file mode 100644 index 000000000..ca33a760c --- /dev/null +++ b/src/GeomAlgoImpl/CMakeLists.txt @@ -0,0 +1,27 @@ +## Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +SET(PROJECT_HEADERS + GeomAlgoImpl.h + GEOMAlgo_Splitter.hxx +) + +SET(PROJECT_SOURCES + GEOMAlgo_Splitter.cxx +) + +SET(PROJECT_LIBRARIES + ${CAS_SHAPE} +) + +ADD_DEFINITIONS(-DGEOMALGOIMPL_EXPORTS ${CAS_DEFINITIONS}) +ADD_LIBRARY(GeomAlgoImpl SHARED ${PROJECT_SOURCES} ${PROJECT_HEADERS}) + +INCLUDE_DIRECTORIES( + ${CAS_INCLUDE_DIRS} +) + +TARGET_LINK_LIBRARIES(GeomAlgoImpl ${PROJECT_LIBRARIES}) + +INSTALL(TARGETS GeomAlgoImpl DESTINATION bin) diff --git a/src/GeomAlgoImpl/GEOMAlgo_Splitter.cxx b/src/GeomAlgoImpl/GEOMAlgo_Splitter.cxx new file mode 100755 index 000000000..4bbcf5c48 --- /dev/null +++ b/src/GeomAlgoImpl/GEOMAlgo_Splitter.cxx @@ -0,0 +1,343 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// File: GEOMAlgo_Splitter.cxx +// Created: Thu Sep 06 10:54:04 2012 +// Author: Peter KURNEV +// +// + +#include + +#include + +#include +#include +#include + +#include + +#include +#include + +#include + + +static + void TreatCompound(const TopoDS_Shape& aC, + BOPCol_ListOfShape& aLSX); + +//======================================================================= +//function : +//purpose : +//======================================================================= +GEOMAlgo_Splitter::GEOMAlgo_Splitter() +: + BOPAlgo_Builder(), + myTools(myAllocator), + myMapTools(100, myAllocator) +{ + myLimit=TopAbs_SHAPE; + myLimitMode=0; +} +//======================================================================= +//function : +//purpose : +//======================================================================= +GEOMAlgo_Splitter::GEOMAlgo_Splitter + (const Handle(NCollection_BaseAllocator)& theAllocator) +: + BOPAlgo_Builder(theAllocator), + myTools(myAllocator), + myMapTools(100, myAllocator) +{ + myLimit=TopAbs_SHAPE; + myLimitMode=0; +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= +GEOMAlgo_Splitter::~GEOMAlgo_Splitter() +{ +} +//======================================================================= +//function : AddTool +//purpose : +//======================================================================= +void GEOMAlgo_Splitter::AddTool(const TopoDS_Shape& theShape) +{ + if (myMapTools.Add(theShape)) { + myTools.Append(theShape); + // + AddArgument(theShape); + } +} +//======================================================================= +//function : Tools +//purpose : +//======================================================================= +const BOPCol_ListOfShape& GEOMAlgo_Splitter::Tools()const +{ + return myTools; +} +//======================================================================= +//function : SetLimit +//purpose : +//======================================================================= +void GEOMAlgo_Splitter::SetLimit(const TopAbs_ShapeEnum aLimit) +{ + myLimit=aLimit; +} +//======================================================================= +//function : Limit +//purpose : +//======================================================================= +TopAbs_ShapeEnum GEOMAlgo_Splitter::Limit()const +{ + return myLimit; +} +//======================================================================= +//function : SetLimitMode +//purpose : +//======================================================================= +void GEOMAlgo_Splitter::SetLimitMode(const Standard_Integer aMode) +{ + myLimitMode=aMode; +} +//======================================================================= +//function : LimitMode +//purpose : +//======================================================================= +Standard_Integer GEOMAlgo_Splitter::LimitMode()const +{ + return myLimitMode; +} +//======================================================================= +//function : Clear +//purpose : +//======================================================================= +void GEOMAlgo_Splitter::Clear() +{ + myTools.Clear(); + myMapTools.Clear(); + myLimit=TopAbs_SHAPE; + BOPAlgo_Builder::Clear(); +} +//======================================================================= +//function : BuildResult +//purpose : +//======================================================================= +void GEOMAlgo_Splitter::BuildResult(const TopAbs_ShapeEnum theType) +{ + myErrorStatus=0; + // + TopAbs_ShapeEnum aType; + BRep_Builder aBB; + BOPCol_MapOfShape aM; + BOPCol_ListIteratorOfListOfShape aIt, aItIm; + // + aIt.Initialize(myArguments); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + aType=aS.ShapeType(); + if (aType==theType && !myMapTools.Contains(aS)) { + if (myImages.IsBound(aS)) { + const BOPCol_ListOfShape& aLSIm=myImages.Find(aS); + aItIm.Initialize(aLSIm); + for (; aItIm.More(); aItIm.Next()) { + const TopoDS_Shape& aSIm=aItIm.Value(); + if (aM.Add(aSIm)) { + aBB.Add(myShape, aSIm); + } + } + } + else { + if (aM.Add(aS)) { + aBB.Add(myShape, aS); + } + } + } + } +} +//======================================================================= +//function : PostTreat +//purpose : +//======================================================================= +void GEOMAlgo_Splitter::PostTreat() +{ + if (myLimit!=TopAbs_SHAPE) { + Standard_Integer i, aNbS; + BRep_Builder aBB; + TopoDS_Compound aC; + BOPCol_IndexedMapOfShape aMx; + // + aBB.MakeCompound(aC); + // + BOPTools::MapShapes(myShape, myLimit, aMx); + aNbS=aMx.Extent(); + for (i=1; i<=aNbS; ++i) { + const TopoDS_Shape& aS=aMx(i); + aBB.Add(aC, aS); + } + if (myLimitMode) { + Standard_Integer iType, iLimit, iTypeX; + TopAbs_ShapeEnum aType, aTypeX; + BOPCol_ListOfShape aLSP, aLSX; + BOPCol_ListIteratorOfListOfShape aIt, aItX, aItIm; + BOPCol_MapOfShape aM; + // + iLimit=(Standard_Integer)myLimit; + // + // 1. Collect the shapes to process aLSP + aIt.Initialize(myArguments); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + if (myMapTools.Contains(aS)) { + continue; + } + // + aType=aS.ShapeType(); + iType=(Standard_Integer)aType; + // + if (iType>iLimit) { + aLSP.Append(aS); + } + // + else if (aType==TopAbs_COMPOUND) { + aLSX.Clear(); + // + TreatCompound(aS, aLSX); + // + aItX.Initialize(aLSX); + for (; aItX.More(); aItX.Next()) { + const TopoDS_Shape& aSX=aItX.Value(); + aTypeX=aSX.ShapeType(); + iTypeX=(Standard_Integer)aTypeX; + // + if (iTypeX>iLimit) { + aLSP.Append(aSX); + } + } + } + }// for (; aIt.More(); aIt.Next()) { + // + aMx.Clear(); + BOPTools::MapShapes(aC, aMx); + // 2. Add them to aC + aIt.Initialize(aLSP); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + if (myImages.IsBound(aS)) { + const BOPCol_ListOfShape& aLSIm=myImages.Find(aS); + aItIm.Initialize(aLSIm); + for (; aItIm.More(); aItIm.Next()) { + const TopoDS_Shape& aSIm=aItIm.Value(); + if (aM.Add(aSIm)) { + if (!aMx.Contains(aSIm)) { + aBB.Add(aC, aSIm); + } + } + } + } + else { + if (aM.Add(aS)) { + if (!aMx.Contains(aS)) { + aBB.Add(aC, aS); + } + } + } + } + }// if (myLimitMode) { + myShape=aC; + }//if (myLimit!=TopAbs_SHAPE) { + // + Standard_Integer aNbS; + TopoDS_Iterator aIt; + BOPCol_ListOfShape aLS; + // + aIt.Initialize(myShape); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + aLS.Append(aS); + } + aNbS=aLS.Extent(); + if (aNbS==1) { + myShape=aLS.First(); + } + // + BOPAlgo_Builder::PostTreat(); +} +//======================================================================= +//function : TreatCompound +//purpose : +//======================================================================= +void TreatCompound(const TopoDS_Shape& aC1, + BOPCol_ListOfShape& aLSX) +{ + Standard_Integer aNbC1; + TopAbs_ShapeEnum aType; + BOPCol_ListOfShape aLC, aLC1; + BOPCol_ListIteratorOfListOfShape aIt, aIt1; + TopoDS_Iterator aItC; + // + aLC.Append (aC1); + while(1) { + aLC1.Clear(); + aIt.Initialize(aLC); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aC=aIt.Value(); //C is compound + // + aItC.Initialize(aC); + for (; aItC.More(); aItC.Next()) { + const TopoDS_Shape& aS=aItC.Value(); + aType=aS.ShapeType(); + if (aType==TopAbs_COMPOUND) { + aLC1.Append(aS); + } + else { + aLSX.Append(aS); + } + } + } + // + aNbC1=aLC1.Extent(); + if (!aNbC1) { + break; + } + // + aLC.Clear(); + aIt.Initialize(aLC1); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSC=aIt.Value(); + aLC.Append(aSC); + } + }// while(1) +} +// +// myErrorStatus +// +// 0 - Ok +// 1 - The object is just initialized +// 2 - PaveFiller is failed +// 10 - No shapes to process +// 30 - SolidBuilder failed diff --git a/src/GeomAlgoImpl/GEOMAlgo_Splitter.hxx b/src/GeomAlgoImpl/GEOMAlgo_Splitter.hxx new file mode 100644 index 000000000..0796e5579 --- /dev/null +++ b/src/GeomAlgoImpl/GEOMAlgo_Splitter.hxx @@ -0,0 +1,99 @@ +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File: GEOMAlgo_Splitter.hxx +// +// Author: Peter KURNEV + +#ifndef GEOMAlgo_Splitter_HeaderFile +#define GEOMAlgo_Splitter_HeaderFile + +#include + +#include +#include +#include +#include + +#include + +#include + +#include + +#include +#include + +#include + +//======================================================================= +//class : GEOMAlgo_Splitter +//purpose : +//======================================================================= +class GEOMAlgo_Splitter : public BOPAlgo_Builder +{ + public: + + GEOMALGOIMPL_EXPORT + GEOMAlgo_Splitter(); + + GEOMALGOIMPL_EXPORT + GEOMAlgo_Splitter(const Handle(NCollection_BaseAllocator)& theAllocator); + + GEOMALGOIMPL_EXPORT + virtual ~GEOMAlgo_Splitter(); + + GEOMALGOIMPL_EXPORT + void AddTool(const TopoDS_Shape& theShape); + + GEOMALGOIMPL_EXPORT + const BOPCol_ListOfShape& Tools()const; + + GEOMALGOIMPL_EXPORT + void SetLimit(const TopAbs_ShapeEnum aLimit); + + GEOMALGOIMPL_EXPORT + TopAbs_ShapeEnum Limit()const; + + GEOMALGOIMPL_EXPORT + void SetLimitMode(const Standard_Integer aMode); + + GEOMALGOIMPL_EXPORT + Standard_Integer LimitMode()const; + + GEOMALGOIMPL_EXPORT + virtual void Clear(); + + protected: + GEOMALGOIMPL_EXPORT + virtual void BuildResult(const TopAbs_ShapeEnum theType); + + GEOMALGOIMPL_EXPORT + virtual void PostTreat(); + + protected: + BOPCol_ListOfShape myTools; + BOPCol_MapOfShape myMapTools; + TopAbs_ShapeEnum myLimit; + Standard_Integer myLimitMode; +}; + +#endif diff --git a/src/GeomAlgoImpl/GeomAlgoImpl.h b/src/GeomAlgoImpl/GeomAlgoImpl.h new file mode 100644 index 000000000..19b574b26 --- /dev/null +++ b/src/GeomAlgoImpl/GeomAlgoImpl.h @@ -0,0 +1,20 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +#ifndef GEOMALGOIMPL_H +#define GEOMALGOIMPL_H + +#if defined GEOMALGOIMPL_EXPORTS +#if defined WIN32 +#define GEOMALGOIMPL_EXPORT __declspec( dllexport ) +#else +#define GEOMALGOIMPL_EXPORT +#endif +#else +#if defined WIN32 +#define GEOMALGOIMPL_EXPORT __declspec( dllimport ) +#else +#define GEOMALGOIMPL_EXPORT +#endif +#endif + +#endif diff --git a/test.squish/objects.map b/test.squish/objects.map index c8045e917..958aae64b 100644 --- a/test.squish/objects.map +++ b/test.squish/objects.map @@ -5,9 +5,11 @@ :Application errors_XGUI_ErrorDialog {type='XGUI_ErrorDialog' unnamed='1' visible='1' windowTitle='Application errors'} :Basic.Circle_AppElements_Button {container=':Sketch.Basic_AppElements_MenuGroupPanel' text='Circle' type='AppElements_Button' unnamed='1' visible='1'} :Basic.Line_AppElements_Button {container=':Sketch.Basic_AppElements_MenuGroupPanel' text='Line' type='AppElements_Button' unnamed='1' visible='1'} +:Basic.Plane_AppElements_Button {container=':Construction.Basic_AppElements_MenuGroupPanel' text='Plane' type='AppElements_Button' unnamed='1' visible='1'} :Basic.Point_AppElements_Button {container=':Sketch.Basic_AppElements_MenuGroupPanel' text='Point' type='AppElements_Button' unnamed='1' visible='1'} :Basic.Sketch_AppElements_Button {container=':Sketch.Basic_AppElements_MenuGroupPanel' text='Sketch' type='AppElements_Button' unnamed='1' visible='1'} :Basic_QToolButton {container=':Sketch.Basic_AppElements_MenuGroupPanel' occurrence='7' type='QToolButton' unnamed='1' visible='1'} +:Boolean.Partition_AppElements_Button {container=':Features.Boolean_AppElements_MenuGroupPanel' text='Partition' type='AppElements_Button' unnamed='1' visible='1'} :Center.X:_ModuleBase_ParamSpinBox {container=':Circle.Center_QGroupBox' leftWidget=':Center.X:_QLabel' type='ModuleBase_ParamSpinBox' unnamed='1' visible='1'} :Center.X:_QLabel {container=':Circle.Center_QGroupBox' text='X ' type='QLabel' unnamed='1' visible='1'} :Center.Y:_ModuleBase_ParamSpinBox {container=':Circle.Center_QGroupBox' leftWidget=':Center.Y:_QLabel' type='ModuleBase_ParamSpinBox' unnamed='1' visible='1'} @@ -24,6 +26,7 @@ :Constraints.Perpendicular_AppElements_Button {container=':Sketch.Constraints_AppElements_MenuGroupPanel' text='Perpendicular' type='AppElements_Button' unnamed='1' visible='1'} :Constraints.Radius_AppElements_Button {container=':Sketch.Constraints_AppElements_MenuGroupPanel' text='Radius' type='AppElements_Button' unnamed='1' visible='1'} :Constraints.Vertical_AppElements_Button {container=':Sketch.Constraints_AppElements_MenuGroupPanel' text='Vertical' type='AppElements_Button' unnamed='1' visible='1'} +:Construction.Basic_AppElements_MenuGroupPanel {container=':qt_tabwidget_stackedwidget.Construction_AppElements_Workbench' name='Basic' type='AppElements_MenuGroupPanel' visible='1'} :Default.Exit_AppElements_Button {container=':General.Default_AppElements_MenuGroupPanel' text='Exit' type='AppElements_Button' unnamed='1' visible='1'} :Default.Open..._AppElements_Button {container=':General.Default_AppElements_MenuGroupPanel' text='Open...' type='AppElements_Button' unnamed='1' visible='1'} :Default.Preferences_AppElements_Button {container=':General.Default_AppElements_MenuGroupPanel' text='Preferences' type='AppElements_Button' unnamed='1' visible='1'} @@ -74,6 +77,7 @@ :Extrusion_ModuleBase_PageWidget {container=':OpenParts*.Extrusion_XGUI_PropertyPanel' occurrence='2' type='ModuleBase_PageWidget' unnamed='1' visible='1'} :Extrusion_QToolButton {container=':OpenParts*.Extrusion_XGUI_PropertyPanel' occurrence='2' type='QToolButton' unnamed='1' visible='1'} :Extrusion_QToolButton_2 {container=':OpenParts*.Extrusion_XGUI_PropertyPanel' type='QToolButton' unnamed='1' visible='1'} +:Features.Boolean_AppElements_MenuGroupPanel {container=':qt_tabwidget_stackedwidget.Features_AppElements_Workbench' name='Boolean' type='AppElements_MenuGroupPanel' visible='1'} :Features.Extrusion_AppElements_MenuGroupPanel {container=':qt_tabwidget_stackedwidget.Features_AppElements_Workbench' name='Extrusion' type='AppElements_MenuGroupPanel' visible='1'} :Features_QScrollArea {container=':qt_tabwidget_stackedwidget.Features_AppElements_Workbench' type='QScrollArea' unnamed='1' visible='1'} :General.Default_AppElements_MenuGroupPanel {container=':OpenParts*.General_AppElements_DockWidget' name='Default' type='AppElements_MenuGroupPanel' visible='1'} @@ -119,7 +123,9 @@ :OpenParts*.Panning_QToolButton {text='Panning' type='QToolButton' unnamed='1' visible='1' window=':OpenParts*_AppElements_MainWindow'} :OpenParts*.Parallel_XGUI_PropertyPanel {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Parallel'} :OpenParts*.Parameter_XGUI_PropertyPanel {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Parameter'} +:OpenParts*.Partition_XGUI_PropertyPanel {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Partition'} :OpenParts*.Perpendicular_XGUI_PropertyPanel {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Perpendicular'} +:OpenParts*.Plane_XGUI_PropertyPanel {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Plane'} :OpenParts*.Point_XGUI_PropertyPanel {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Point'} :OpenParts*.Reset_QToolButton {text='Reset' type='QToolButton' unnamed='1' visible='1' window=':OpenParts*_AppElements_MainWindow'} :OpenParts*.Right_QToolButton {text='Right' type='QToolButton' unnamed='1' visible='1' window=':OpenParts*_AppElements_MainWindow'} @@ -148,7 +154,13 @@ :Parameters.Parameter_AppElements_Button {container=':Part.Parameters_AppElements_MenuGroupPanel' text='Parameter' type='AppElements_Button' unnamed='1' visible='1'} :Part.Operations_AppElements_MenuGroupPanel {container=':qt_tabwidget_stackedwidget.Part_AppElements_Workbench' name='Operations' type='AppElements_MenuGroupPanel' visible='1'} :Part.Parameters_AppElements_MenuGroupPanel {container=':qt_tabwidget_stackedwidget.Part_AppElements_Workbench' name='Parameters' type='AppElements_MenuGroupPanel' visible='1'} +:Partition.Main objects_QLabel {container=':OpenParts*.Partition_XGUI_PropertyPanel' text='Main objects' type='QLabel' unnamed='1' visible='1'} +:Partition.Main objects_QListWidget {aboveWidget=':Partition.Main objects_QLabel' container=':OpenParts*.Partition_XGUI_PropertyPanel' type='QListWidget' unnamed='1' visible='1'} +:Partition.Tool object_QLabel {container=':OpenParts*.Partition_XGUI_PropertyPanel' text='Tool object' type='QLabel' unnamed='1' visible='1'} +:Partition.Tool object_QListWidget {aboveWidget=':Partition.Tool object_QLabel' container=':OpenParts*.Partition_XGUI_PropertyPanel' type='QListWidget' unnamed='1' visible='1'} +:Partition.property_panel_ok_QToolButton {container=':OpenParts*.Partition_XGUI_PropertyPanel' name='property_panel_ok' type='QToolButton' visible='1'} :Perpendicular.property_panel_cancel_QToolButton {container=':OpenParts*.Perpendicular_XGUI_PropertyPanel' name='property_panel_cancel' type='QToolButton' visible='1'} +:Plane.property_panel_ok_QToolButton {container=':OpenParts*.Plane_XGUI_PropertyPanel' name='property_panel_ok' type='QToolButton' visible='1'} :Point.Point_QGroupBox {container=':OpenParts*.Point_XGUI_PropertyPanel' title='Point' type='QGroupBox' unnamed='1' visible='1'} :Point.X:_ModuleBase_ParamSpinBox {container=':Point.Point_QGroupBox' leftWidget=':Point.X:_QLabel' type='ModuleBase_ParamSpinBox' unnamed='1' visible='1'} :Point.X:_QLabel {container=':Point.Point_QGroupBox' text='X ' type='QLabel' unnamed='1' visible='1'} @@ -182,6 +194,7 @@ :_ModuleBase_ParamSpinBox {type='ModuleBase_ParamSpinBox' unnamed='1' visible='1' window=':_QDialog'} :_QDialog {type='QDialog' unnamed='1' visible='1'} :_QMenu {type='QMenu' unnamed='1' visible='1'} +:qt_tabwidget_stackedwidget.Construction_AppElements_Workbench {container=':General.qt_tabwidget_stackedwidget_QStackedWidget' name='Construction' type='AppElements_Workbench' visible='1'} :qt_tabwidget_stackedwidget.Features_AppElements_Workbench {container=':General.qt_tabwidget_stackedwidget_QStackedWidget' name='Features' type='AppElements_Workbench' visible='1'} :qt_tabwidget_stackedwidget.Part_AppElements_Workbench {container=':General.qt_tabwidget_stackedwidget_QStackedWidget' name='Part' type='AppElements_Workbench' visible='1'} :qt_tabwidget_stackedwidget.Sketch_AppElements_Workbench {container=':General.qt_tabwidget_stackedwidget_QStackedWidget' name='Sketch' type='AppElements_Workbench' visible='1'} diff --git a/test.squish/suite_ISSUES/tst_532/test.py b/test.squish/suite_ISSUES/tst_532/test.py new file mode 100644 index 000000000..4531dae10 --- /dev/null +++ b/test.squish/suite_ISSUES/tst_532/test.py @@ -0,0 +1,38 @@ +def sketch(): + clickButton(waitForObject(":Basic.Line_AppElements_Button")) + mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 230, 140, 0, Qt.LeftButton) + mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 128, 399, 0, Qt.LeftButton) + mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 307, 317, 0, Qt.LeftButton) + mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 473, 347, 0, Qt.LeftButton) + mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 230, 140, 0, Qt.LeftButton) + +def main(): + source(findFile("scripts", "common.py")) + + startApplication("linux_run.sh") + set_defaults() + + sketch_create(help_points("XY_plane"), lambda: sketch()) + + part_create() + + extrusion_feature([(266, 251)], 10) # on the sketch + + clickTab(waitForObject(":General.qt_tabwidget_tabbar_QTabBar"), "Construction") + clickButton(waitForObject(":Basic.Plane_AppElements_Button")) + type(waitForObject(":OpenParts*_AppElements_ViewPort"), "") + mouseDrag(waitForObject(":OpenParts*_AppElements_ViewPort"), 353, 364, -37, -171, 67108866, Qt.RightButton) + mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 274, 316, 0, Qt.LeftButton) # inner left face + clickButton(waitForObject(":Plane.property_panel_ok_QToolButton")) + + test.vp("VP_EXTRUSION") + + clickTab(waitForObject(":General.qt_tabwidget_tabbar_QTabBar"), "Features") + clickButton(waitForObject(":Boolean.Partition_AppElements_Button")) + mouseClick(waitForObject(":Partition.Main objects_QListWidget"), 10, 10, 0, Qt.LeftButton) + mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 227, 263, 0, Qt.LeftButton) # extrusion object + mouseClick(waitForObject(":Partition.Tool object_QListWidget"), 10, 10, 0, Qt.LeftButton) + mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 212, 344, 0, Qt.LeftButton) # construction plane + clickButton(waitForObject(":Partition.property_panel_ok_QToolButton")) + + test.vp("VP_PARTITION") diff --git a/test.squish/suite_ISSUES/tst_532/verificationPoints/VP_EXTRUSION b/test.squish/suite_ISSUES/tst_532/verificationPoints/VP_EXTRUSION new file mode 100644 index 000000000..dd96f63d8 --- /dev/null +++ b/test.squish/suite_ISSUES/tst_532/verificationPoints/VP_EXTRUSION @@ -0,0 +1,9 @@ + + + + iVBORw0KGgoAAAANSUhEUgAAAvIAAAKJCAIAAABWHFoZAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nO3dd3hTZf/H8e9Jk3RvSotCy2rLkCEKLpShIC4UwYmKW1EEEcfjz70eFUVBVNz6qOAEFBX3QHCAooBioUU2tIUyuleS8/vjlFJKaZP0pEnvvF9el1cb0nOftE3y6ec+9zna8hxdAAAAWj+Lv3cAAADAHFa/jKqJHqYVhlqKQ6Ta3C3rIi6xVbqiKvQ4XTRzNw4AAAKZ1S9TUNGWvLztm//+e1XR7jxzt2yxhETHJXXv2adzRs8dxZHmbhwAAAQyq7R4rgm3FBXsyP9z+bLMbr3i+hxhDTGzU3GJZW9x1co/liYmJrVJTCsoYpYNAIBgof2e3dK5Jt665euvvu7UpWtCjM1qtVos5iePgkLXurV/j7300jVb/TPLBgAAWp4f3vUtUl20Jy82opstxGqz2iwhIaYPkRSvLd+da7exyAsAgCDih1ijibhczpAQTSyaZrFoPmhr7BZxuZwcMAwAQFDx2xyNruuii67ruk6nAgAATODPQ0/0ffy4DwAAQBn+WeDdYgLn0WWmd1ybs9H4v7/3xbdcLte0ey+adO+bISEhmmbxxSHhxiivPX2D3W7fs2fPpk2bsrOz3/8ix2qzW602E0dcu2x2cXHx0Sdfb9YGD2XP7p1jz0r7v0c+GDj4DF+PBfjX7Oe/6d79FPfvn5X1zdgbPLg/gpw/J6H2zUH5J3v0TN9/7M3qRq8g4f49G2FkmhefnCDypJtfMvjsW70by49cLtfbz9383o039rl4wBMvfBUeGRUaGm5Wzvjk7ftqP3Y6naWlpS+MGLHl++9/2br1gvz8d1+6IzIyMjQ0NCQkRETOuuSBZg63Zunbl1yy4+mntbmv3VlQUHDd7S83c4ON2Jm/7fDDI7/++MbVq5ZdN3H/nvfP0H7zzVrFy87u0eR9srKy5n+zLjEpJTy8WaeAYizGqmfXrs1N3ufOrktl9Wp56aXJF7zpxRAIWh7EmilXD6r9eNori4xPp72yyOuxdfeOrXnyqem33nKz16M0Inxfm3N0uvyes//2H76e/8Unc7Zv3ZDcLvXkEWPkLP3odBGRctHq3dN9Rqa57tZn67U19cYacdbFNbd/7G76qaduCJMDc9ihxjKLy+V64fGrX7vyyoJVq5b36GE7PsV44TMx2dSGlbLS4ntvPkt27arcuHFnXp6IpHYb0iW9Z3K7DhGR0XUDkHe+/vDRO+/cJVI5efJ2kc0iu4cMGWKz2f773FfNfQwHWfLDZ3PnzMrLK/viq5FHHTktKjp27BW3iEj/DM34/48rS5r5RlXPZWf3mDJlSk5Op0bus2DBBBH5ZfEXx504on1ql2aONfaqxn4i/XrEmDXWH/8UNX4fE8dq4e+hSmMlJqY2eZ+X9qTKYefJ/fdL1jdeDIGg5e7p+KZcM6hHr94iMnTQSSIy5epB3bp1Gzp0aN2sIyLTXnY35ewra6TJWONyucorqy2WdXZrNzc3XmeYJv799+wDPs1avXzunFlFJdtHnDPqsA6pudu2fvvZBz9+u2DMReP7DRjUM8OtbTZobfZGkSfXZm9sfKwTB58ZHh5Zs+jdq4FWZ+tHZ+z/9Oh0+T27icflzTAHcblcd4w/2Wq1rvzpp8pdu/aGh4vIqFO6zv/a1GSj14x12Tm9ysrKlvz225rc3IKQEBG5c9L5L7z1fWxsYlhYZO09vTPtvoveeWezSJXIbpH1W7dKVZW8//76pCRt4MCBoaGhj8/61oTHIiIis6bf/c1nzzz3/KBTR1weEqJ998OoS8dO7dtvYM/eA35cUXJS36j7Hnsj+58VGd37mpVsLjunx8iRz4psaOQ+CxZMOPPMGVlZw7dsXNe3X4nX30x3xurXI+aPf4rCNWn+WO5kmhZ7XCZ+D//4p2j2q43dpyV/XgsWTGj+z+vpp7u7f+cRI2YG0PEECHgetDX//LWq7qeZmZnbtm0TESPuGKZcM8j9ZOOORx59vLy8fNSoUfPnP7Y9NzchPj4sLMzE7dczd86s3sf0GHXhQ7qIS9czeh4xcNipX33y8fjLT/7lr0pzx/pw9vN9ju150FhvPTh5UjPHqpfVpKnHZcqpg3Tddecj746/9Pg+HTr8vXmzvmaNiEy5a8bOHdsjIqLs9lATr6uq665n3/jxrCFpbcLDpaLi3927RWTcNXeUlRRXVVXququZ25/ywDsZGRlff52zfr2sXi333ZegaZrVag0NDc3K+ikiIq5///5DTx933tgJtV/y4K0j731ygacD7dm986P3pq3NGZuQUPNb3alTzOlnpC354bOevQeUl5aISHbWChHpkNrVlFiz732rMcZ7ZMuMZWQaU8ZyM9OYMlZLfg+bfFwt+fMyMk3zxzKMGDHTzYNs/vhBsrK+GTueI2wOyeGoCgmxaZpPTmxS90/lug5+r2mO6upKq9Ve7yF48bg8iDXDzh69c/vWFb8tNT79+OOPjQ/qxp1hp46Ycs2gh59Z6M5LsDvH1txy88QbJkz86KPHKytLqh2bd+3uc1i7du7vcyPqtRoi8u2XH5aU5Z19wYMuXddFXC7dqbucLn3I6WcuXbTok/lvWELqf4nXvv3yw9Ly/LMveKjBsd5+fVpqW9NCQJOP6+wxVzV/FKfTWVFRtm3btvW5uX/v2KGXl4vIroK8wr27KirKopxxISGmHcjldDpdLucTz83vfuOoe9PT38rNHXrqaM1icbqcLpfT6XQ2f4g5n2Yfe2y7K6/MmzUr/riTTk9OOOz66++32cJ79uy0fv3G3377KyPjma2b/51859MP3jpSRLzINCIy951ZN07oZWSahZ9tOnVE6uhzPw+POePK8eNFJDwySkQSk1ISk1KMj5vpsnN6yL4ZhEaY9R5Zd6xp02IavJtZmUb2zS41whePqwXG2ve4prXAWE0+LhMzjaHJg2w4wsZNVqvddxt/9LGHaj/WZd9FpHUZNvoes4ZYv3bZv1nfWK2xA4dfZbPX/JmX889Pm3MWiyVi6Jk3uZ9sPF4J1SU9IzI6um1iQnRUVGR0TFJSUmRUVFxCYkRcwg3jxhr3WZvVdGdu5JmaiahDKy8v37lz57p1IUlJxfPmZg8cmBQfF+d+YdP4o/vtwKT57RcfDjn9DKeuiy4u0V0u3elyVVVVVVVWHjNo0JcffDhyzFW/NS+c1u7PN59/MOSMQ4711swXrr92nMPpMCUKuPO4vN64y+V69anrx02cqbtcukhlZWWXW2+t+68WS4guMvXuC257+L3mr41yulyP/9+Ym+97K8Rqi46Jn3LXjAcfmTT8jAujYuIS26REx8TPe/OBKyc/53K5nC5XM6e9FizKHTYgTtedg44fOXz4ebouDoe89daGjIz0nJx1uq4X7/r3wVtH3vPkAvF2yivr7+WnTUoSkXvuXjr3w3XLlqWHx5xx6z0zjQ2GhUeKSGKblMQ2KWHhkabU8G4eelKX7u2jq/3TPz19Q4PH1vhorAaPCzn4DbtVjFX785r96gMqPa5aTR5kU/cIG2ai/EYXETlhxMTwyFjjhoXvPGCzW0z8iezetcVus9lsVT99+/rxJ19hs4fl/PPzntw/NE3XnaXVjiqbLdTNTXn8rvlvzv439ksuGyci6c/M6Lh9++r359Xe/sviL0SkT78TmtiWG+etCQ0Nra6u1nW9oqK6oqJi9+495eXloaHuPjyPVFdXhVhtTpfLpYtL16urq8tLSysrKxxV1S5dr6wsN3GsysryRsYqLt4rImWlJdExcc0fy3ePy+VyvfPCLbquP3H3Bdu2bVu5cuW0WQty1qzM3b6ptKQoMipm5bIvyveu/2OJvaqq6toL+j318nferY1yuVyvTLsuLCzsxalXV1RUjL94wMMzFsTExrdP7TLlrhlFRXtiYuLbp3ZZ9cv7Npvtibsv3LJly4wZMz5ZtM1qs9vt3v+23Hzn9Gcev2XIkPMcDnE6pbpaKirkqadyMjIyFi3KGTkydv36rUWFu2NiE7zbviUkxOmsFpEXZv2dkhLx+GN/fLLos8a/ZECmtmwtL+9QhPsH2YwYMdOne4KD9d83O9H/zgNamd+yRTTRNKnb3TRTjz6n/LboDRFXZJjr1+/fSGibXlWUXV1dFRkRGdfuSPczjXgaa1b8tjQ9Pb1tcnKbxMShQ4dOmjRp8pRbcyZO2pmQGFHnbtlZKyIiopqONW4ICwuLj49v06aNpm0LCwuLj/egqvFUz94DVq/48/hThjkcjsry8vLysoqysurqapfTtXbVqp69B5g4VteMXo2MFRffRkQqyktNiTU+elwul+vZR8a9dc01UlUlZWVSXKxdcklVVUVMXEKI1VpVVWm3h+Zv+fud9HSpqlrRpUuf0FDbCSnzvvZmUajDUb137953+/aV4uIVHTr0CQ21Des6Z8HK5HYdwiOiystKwiOivv901rs33FB3Z/Jzt8QlJNkTkrx7gCIy/72Xnnzym8pKYx+kqkoqKqS8XESktFSqq6szMwd99+WH55x/rXfbT+uUuXbtIhHZvbti1lvL26d1tdnqN8kP/OfyercMyNQWrTB5bRTgd6c/8L+F943z9160Arqu++gYmnoONfd0yuh77HaTT0gWHhnbf9C43xe/bRM9NsriKl/vcDrCw8Kjknpl9DzRo015EGu+/niuiOTk5OTk5MyYMSMlJeWrr74aPnz43ffdX++e5aUlu3bmNb61OnNQTfzpmZCQEBYWpuv2sLCw+Li40NBQH53qZvRF488a0mHYOaPiExMrysorKsorKyqcDmdJceHCD99/a96fJo51+jmXXX5e/0ONdfyJp4uIy9XcQ18NPnpcV5/X569HHslbsmRDfn4bkW3FxSKyZ/fO+ISkDqldrXa7o6rqx6/mbFq3zllY+M/evXlO5+u9e587rOu8r9d5uijUUV2Vk5OzyWZz7t5tbOqNPn0uHtlnzoKVbVPai8g9N5/993//a+xMosiWwkIRWb9udeeuPeObEWs2rs9q27Z7WZm4XFJdXRNrSkpKNE0rLRWHwxEREf9v9t9eb/+4E0e888qbd/ynX2pqdHhEVL1MMyBTm/3xihXLlyS2SemQ1tW4cezZfe977I3srBWm/NkABIihd74gJBv3tEymETn03NP+t2Az9yQ8Mu7oEy9dtuj1yspKi8USGhpqj+7qaaYRj2LNnDlzaj+++OKLv/rqq+eee87T8Wq5XE6HQ3SXq8lLXdpsxnlj7S6X0+Gorq6u8nrQxq347fv27drdf+P4cZMmd8nsVllRUV1VtenfdW/Peu6CSyYd1r6xEzl4Kvuf3zPSuzU4Vtu2HeISkkQkNCzclLFW/PZ9RqdOpj+uJ1/8RjshZdNtt63ZurV9bGxxZaWIlJYUdUjteliHTlHRcSXFe3fs2PF5dXVBVVWZ3Z5bWPhWbu6Uu2YU7Njuaayprq5atWrVJxUVe6qry+32/MLC/+XmTrlrRlHhnpjYhPCIqMef/0Ib1GHz7bev2bo1OSoqt7hYRPLztiandPDu0RlsNvvevVVhYeEOhzgcUllZWVS0s7AwT0RKSsThcJSW7k4JOdzr7fcbMGj6Y+2WL995wsB2K5cvSTms5kxCAzI1EVm0osRYBrWrIK9gZ25kZLSITLj1MeNGYg1U8t2j1w+984XvHvX5Gb3hAU0X0WozjUjN3NPX8x6yaJovTuO/ecNKzVVVVl6haVp1dbWjOLv6iJNqjyB2k1vnrbn12kGPP/64iCQnJ4vIx59+dvvbc4YPH37CwIH17vn1l1+UVuyLKY1uufa8NdJU9WIkU4vFWu/0fQ8+/Oi9d9/ZxK67/W3/bN4rC96d2aN9+5z8/AVvv5+7fX18mzZ7dhXExrS94pp7Ro65ypyfoL5/rI5t2uRUls186CF7qM0Yq7SotENa17TO3RISk0UkIjyq+YPuH8tp8uOqqqp8+oVP064/84AbKyutNntUVFx8fJLokp+fPyE/v/Zfh59xYVHhntLiIk8HdTlduq7fvHZtvU2Vl5a4XK4QS4jL5Xr6hU9TD9yZ0uKiysqK5nwPu2b0Xrt21cqVT4wY8UZFRXFZ2d6ioh2FhXmrV2cffXSfLl2GZWV9O/KCc5szxJiLxt9/30Pjx/d67Mk5p555wAkSs/9ZUV5WktGt78+LFn765tNnXjb5lNPO31WQt6tNXvvUri13Jo/mHxfKWIzloYZrGw4q84s633Zj7smoaBzVurk/kTV/LSrY9lu1ozosPLyqStc0LdRSufjLl08cfrXN7sEf+R60NcnJyRu3bqt7y44671i+s2vXroEDB/7880svvvTyq6+9npyc3KZNG03Tdu/effzAQb/++j+Xo2Mzh/hs3isfvzszIzl52969V054eOCQczZtWJuXu7lt28M7dW36POJej5XapXdquq20pKistDi+c7uY2AR7aFibpHZd0o/QS7NtzTjW9eCxTH9cdntoZFTMlLtmTHtk0tDho126KzYucfnPC/bmr/7BYtm5c+cff/wx89Uv16z+Y+uWfz/+4JWhw0dHRcfFxMZHRjWxEPdgFovltfd+effV+yLjOs5//6XaTYVHRr06feLEu96waJbwyKjandm+eXX33idFRsWEhjbrSKy2ieErVz4xcOC0goKNZWV7S0p2FxXtKC7eUVgoTqezoGBjfv7awcPObc4QI8dctS77r3XrllcUr12zenm3nkeJyLyv1v2y+IuVy5f0OWrgd19+6Pr5s2/PPvvoVx7v2eeY/sedbBxL1JxBG5eZ2fSJ7T01+9UGr2Uxrc7tV5s1Vnp6w2eT88XjCraxfM2YigoLCxcmpNxQ+0e+8ce/8anvpqhqhxt27r11PzVFTtav+ZuXVldX2e2h4XHdj8g46tfv34gIt4RojkWfv3TyyIk+XOC9fv36/fuRkzN5Ss1q3hvGjS3Z19NEREQltElpYsu1q7sbvd/4Gyc++OCDf/31V3l50bvv3qPrus1mjYgIDQ8PDQmx6roUFuaVlGxwOJztDzu5oUGa9vlHrxnv/bmFhSePuvaEIefoIqmdMlM7Zbq5BfctrDNWdHKn8Mi4yKiYjp27OxzVVZUVdntoXEJSh7SuaZ26rf09WzStOaM3+bh6ZWp/NWNNTVhEVGLbw9qXldxy14xdO/N03RUeEVW4c937Y8Zs/vHHX3NzL9i7t7i4MCIqJuWwtMuuuUPTLIlJKe3T0hPbHubpqFabPSIyJiYmJiW1S+2mDu/Q5c8l73w0eXKfqwfd9+S86Jj4wzt0MXamsjTv8NQubVPaR0TGePcIH75tpIjc/cSC6Y9O/uKLJ/v0OaukpKC4uKC4eGdJya78fHE4HOvWLb75zqetNnszf0nOvWj8RWd279+/7RXn91+yqtoSEmJsULNYflq0cM/38z4YMSLKZvv49NPPmzTm0Rc/G3D8MPHlH67G4t4FCyYMHHxmQpuUsIio5ox1qNXCCox1qCtCTJsWY/xTvx4xpox1qNXdhpb8Hhr69YgZOPjI5o9VV70Q02Cmoaz5dt5DxsSQLrpFszpdDk1E0ywul1MLsYhTD7HZh4z8j7mDfjP/odrhjLmn2jBl1k/E4ajOzvo9wua0aJYyR0LfnieISHrvM1f/Pjc6yl5VtadgZ25CYrKbZ471oK35+NMGlp4+Pa3m0kW1mUZEEpNSMrr3bXxrxlUTjP8O9tIrr1979RU3TJj00EMPbdm04ZhjQh999POw0ND4+LiwfUecVFSUVztc/frF7twR2aljx8PbefMd/vrTt+bPnp6ZkpJbWDjknGvOONe0PxkbVDtWRFJaaHhMbFxit55HtTu8o8vlrKysCA0Ni46Jj4lNiIiMWtv0xhrj5uMakCnLvB0pNDQ8MSlFRCIiogrb7TJ+4f785RMpLKzavHnHjh2y7wji5HYdRMTldMbGJbZpe5jxVR6x2uxxCUlJSUk9+xxTWlLkcjqjY+N/+vKVt669tuCvv5b36GEb3nX2xyuT23UIj4xKaZdaWbShZ59j4uOT4rw6Xvjh20be/UTN6fUuv/6u155/cMGC+3v0GOZ0OktKdn3yyWtDhhy5dev6Cy67yes1UHWldcr8bHH+xUNTxSWr/1rWq+9xiUkpR/Q9dvLYgZd363Zt//5RNpuIdIqJeWXIkFfvu0oeeNVINr6zYMGExOQuGd379jlqoBc/r1ruvEe20rEav8qViPTrEWPKWI1nGkNLfg9NeVx1V2sfdcXdyR3T64UYepoGaZrooumi62IV3Wkc3uJyOEOsFpfDZQmxOB0mnw1fjDfrfcOJMfdk+hC6nt5j4OoV30XFtO1/zDCbPdSiWZLbpTr6jlyz8rvImFSbPVTcb2vcudMTLy267dpBt7+9/5DhqZdcXDfH1IqIiEpMSsno1rd9atemHoeIbvyAGvjHdevWjbvi6nfffXDln9u79ah+/dU/4+Niw0LDwsLCaiN7WFiYlFf8uGhLeHiY6HrfPr0b2NCh9crUlizd+cH/nkhPTs4vKjr53OtOO+fKJr/E63qjcG/B22++aYwVkZQWFhEbn9C2W8+jevTqH5/YVtd14+hpq9WmaVr3zI4/LZzQPbNj1tqN3o3V+OPqlVnz+1EuWq9M8e5BWSwWI9lEREZVlJeJyE2Xn1RZWblk+fI1eXm7QkJE5IkHb3xy1oJ2h6VFREaLSFh4RHhEVGiox4dCW622yKiY2NjYjp27VVVVOqqrpz90hd1uX/nzz7XXnxp7dp/ZH69sm9y+bXL7bTk/dOzcLSwswnrQeml31GYaEYmLb3PLXc98OPvZj95/aUdentVqz80Vh8Mx/eWFvY483ouNNygsLLzK6Xx+0KBXbz53iz1q8LBRHdK6XnnbE38sWyT/rjsuJUVEnlqxYkPaESNbMNMce+KI5lyLyqOc0brGcj/TNHMsjzJNC3wPTXlcF11fcw2Ed174RkSSO6bnb/TqAsLBZ+iou42qxDgu1WKp316YOzF08qh7TdxaI2w2e5eM3p3Tj9BEq61k7KFh6d36ds3sLSIenZnW3btee8szUy/ZfzzjoTKNEeHbp3ZtMsXrdf5/sGXLllVWVpaXF3ZIK543d0NySnJ4eHhKcnJc3AHncdm7d++GjRtFpGPHjl78MIu2LooJDy8oLh523o3DzrzUnS/xut5Y8dsPxlhnjhmz/9bydVnL1h185x8/mXDdrc96l2lEZOXvTTyuv9bqAzKlXDTjGuZePygj2djtoVHRcbrLNfONH0ed0tm4TtO63btF5LJr7hCRiMjoxDYpmsXi9VmGLRaL3R5qt9vj4pN03VVVVXn7Q3Ouu/iYPldeuWrz5oisLBG5xTgvX2xCdGx8dHR0XHySWZcNF5ExYyeMGTshP2/L3t07L7nk2lc++N2sLRvCI6Jmvb9s0kXHzR42rGts7Pysn9b9utBusYw//PBRxx8vIttKS9/LyZn3xk9R0bFNbq0RTV5hQERMeY8UkWnTDnm+/9Y+1qGuBeGLsZq8T2scqy6KGU/UHGFyqANNWm7tt9ksFsvB1w1s8MYmuRtrwiOievU/feXyJWVlJbU3Gt1M7dGLiW1S+hw10O1f95rrdzf4b6+9+lLWmpwdO/Jzc3cltS2LjEhLSUlOSU6udy6+5OS2xuKsuLhYL1Lq6NGjN+RJZUXZkBEXevq1njp+8MiCnbn/rl31+6ot8Ylt07v1Sc/sk5iUYrXaDr6z0dN43dacdMpokSYe17K10iuz5oPmMH7tQkKsVVWVIjL12fndJ4y6p2vXt3NzhwwfrWkWl9MpIprF0pyz/db6/N0HRMTpdBYXF2/fvj1r8+aVeXklxcUismzRB1tzfkpJSYmOjg4JCTEx09RKTumQnNLh+dkmZxpDRve+//fUew++Myv8zx/+06/fbUceWftPG4qKLvzqq4tuuLeZmebhGZ/8uviLLZsbSNJ1efhEZizGAgKItnSNW2mgvLw0O2vFr4u/yM5aYSSb2m4msU1NMRNupJymft2T7evffWf2ccceZwmxaJrWYLrMy8v/denSrDVrRaRdu5RumZndu2XGxnrwmr548eIpt//nj38bCA2G2okYkSZmYereM1x073JAVWXFuuy//vz9R93lOqLPsR27dI+Kjm0w07Sk5hxbU4/T6Sjcu2vzhuy1WX8+9cikYWdcGB0d17FL98zuR6Z2yoiNSzT1UpeOnTu2nz0kre6Nl11zR+9+J6R365PU9jATx2p5P3w9f+47s9b+vigzPr5vmzb/7N69bMeO62559JKrbmvmlsvLS3ftzCuv85dJg9x8IjMWYzWTMQnlvtrZK6AR2q/uxRoRKS8vzclasXL5kl0FebIvtqd7HttT7OvffWf2sccea7FYLJrW4HFAFRWVmzZtylqztrCwMDQstFPHtG6ZnsWaJUuWTLn9P8sPHWtE5JjM/R8vbfTd3f17HorT6diza8e2LestISGpHTNi4xK92UoAc7lclZXlu3fmbd6YvWVTTlHhnpjY+A5p6akdMxKSUry4DlTjY+3ds3Pjv1mrVy3btvnf4uK90dFxh6d26dl7QMcu3c2dfvKXkuLCzRvWZq9Z0alLjx69Bxx8UQUAwMG0X7NaetFcSmhNrNEOHWtEpKKicm/h3sqKChEJDQuLi40LC/NgFuMnI9as83MdAgAAWoz/uvqmzi8cFmpPadv2wC/htAUAAOCQ/BZrdNE1ggoAADCPH2KNLmKxhLh04wyFPsk1umazWEKITAAABBU/HFnp1G3RcSllFS7fDVFaZY+Jb1dV3VpX8AMAAC/4IdaUO2N69TlqXfbqolJxSohuKpdYiyrsOVm/H3/i4Py9rX45DAAAcJ/Hl7psvhJnzOFp6eHh9mVLfy7ek+9yOU3cuMUSEh2ffNLgUw5v3yF7O7EGAIAgov3S4gu8RUTTJCXO1SbGZbfp5k4U6SJV1drOIkv+XgvHIwMAEFSsfrnWu65L7m5L7m7aFAAAYBqCBSfXjMoAABwhSURBVAAAUASxBgAAKIJYAwAAFOGHlVAAAAC+QFsDAAAUQawBAACKINYAAABFEGsAAIAi/HM6PgAAANOxEgoAACiCSSgAAKAIYg0AAFAEsQYAACiCWAMAABRBrAEAAIog1gAAAEVYdVZ4AwAAJdDWAAAARRBrAACAIog1AABAEcQaAACgCGINAABQBJe6BAAAiqCtAQAAiiDWAAAARViFWSgAAKAE2hoAAKAIYg0AAFAEsQYAACiCBd4AAEARtDUAAEARxBoAAKAIYg0AAFAE560BAACKoK0BAACKYCUUAABQBG0NAABQBLEGAAAoglgDAAAUQawBAACKINYAAABFEGsAAIAirDorvAEAgBJoawAAgCKINQAAQBHEGgAAoAhiDQAAUASxBgAAKIJLXQIAAEXQ1gAAAEVYhboGAAAogbYGAAAoglgDAAAUQawBAACKINYAAABFsMAbAAAogrYGAAAoglgDAAAUQawBAACK4HR8AABAEbQ1AABAEcQaAACgCBZ4AwAARdDWAAAARRBrAACAIog1AABAEcQaAACgCGINAABQhFVnKRQAAFACbQ0AAFAEsQYAACiCWAMAABRBrAEAAIog1gAAAEVwTSgAAKAI2hoAAKAIq1DXAAAAJdDWAAAARRBrAACAIog1AABAEcQaAACgCBZ4AwAARdDWAAAARRBrAACAIog1AABAEZyODwAAKIK2BgAAKIKVUAAAQBG0NQAAQBHEGgAAoAhiDQAAUASxBgAAKIJYAwAAFMF5awAAgCJY4A0AABTBJBQAAFAEsQYAACiCWAMAABRBrAEAAIog1gAAAEWwEgoAACiCtgYAACiC0/EBAABF0NYAAABFEGsAAIAiiDUAAEARxBoAAKAIFngDAABF0NYAAABFEGsAAIAiOG8NAABQBG0NAABQBLEGAAAogpVQAABAEbQ1AABAEcQaAACgCGINAABQBLEGAAAoglgDAAAUwen4AACAIljgDQAAFMEkFAAAUASxBgAAKIJYAwAAFEGsAQAAiiDWAAAARbASCgAAKILz1gAAAEUwCQUAABRBrAEAAIog1gAAAEUQawAAgCKINQAAQBEs8AYAAIqgrQEAAIog1gAAAEVwOj4AAKAI2hoAAKAIYg0AAFAEK6EAAIAiaGsAAIAiiDUAAEARxBoAAKAIYg0AAFAE560BAACKoK0BAACKYIE3AABQBG0NAABQBLEGAAAogliDVuacEzR/7wIAIEBZ/b0DgAfOOUGbOnV2bbL56CeODQMA7EesQeszdeps4wMj3xBuAAAGbT5vCWglRp2g1Qaaum6/fayI8JsMAOB0fGj1jKwz6gRNROYv4RcaAIKXxtsAWoVRAxuuauqpaW74rQaAoMSxNVBKTXMzkOYGAIIRbQ1aATermnpobgAg2NDWQFk0NwAQbGhrEOi8q2rqMZobId8AgNK0ebzKI4Cda0amqcvIN/zaA4CSmIRCcDFC0rkDNSHcAIBytHmLeWVHgDr3RJOrmnpqmhueAgCgCtoaBK+a5uZETQg3AKAE2hoEKF9XNfXQ3ACAAmhrABGaGwBQgjaXV3AEntEtW9XUU7sanGcHALQutDVAfbWJavSJmhBuAKD1oK1BwPFvVXMwo7zhmQIAgY+2BmiCkbFobgAg8NHWILAEWlVTD80NAAQyq/D6DLjtgObmR548ABBYNF6aEThGnxTQVU09Nc0NzyAACBjah7woIzCMaVWZppYRbngeAUAg4JBhoFmMKDbmJM34lHwDAH5EW4OA0EqrmoNR3gCAH9HWAGaqW94QbgCghdHWwP+UqWrqobkBgBZGWwP4Cs0NALQw7YNFvNrCn84bpGZVU4/R3PB0AwCfoq0BWoIR3c4bpAnhBgB8hrYG/hQkVU09RnMj5BsAMBttDdDSapMc5Q0AmIu2Bn4TnFXNwTjsBgDMQqyBf5Bp6iHcAEDzMQkFBASOKQaA5tPe5wUULe58qppGGc0Nz00A8BRtDRBwjMx3/iBNCDcA4Ant/R940USLOn8wVY0HapobnqcA4AbaGiCg1TQ3gzXjU/INADSCtgYtiqqmmShvAKARtDVAa1K3vCHcAEA92nu8MqKlXEBVYyqjueEpDAC1aGuA1srIiBcM1oRwAwAiQluDFkNV41M0NwAgtDWAGmhuAEBEtPe+5xUQPnfBEKqalmM0NyLCsxtAsCHWwOfINP5SMzPFcxxA0GASClBWzczUEE0INwCCg/YuL3bwpQupagKD0dzwfAegNtoaICgY4fLCIZoQbgCoi7YGPkRVE5hobgCoirYGCDo0NwBURVsDX6GqaRVobgCohLYGCGp1mxsh3wBo5bR3vuNVDOa7aChVTatklDfevSx0afdKdOSaejcW7B24teAcE/YMANxAWwNgPyOMXjRUE8/DTfu2c9slfFHvxhxLBbEGQIuhrYH5qGrU0Jzmpnfnu3qk/VfXLe/94DR7vwDgkGhrADSsOc1Np5Q3RCRr853Gp5kdng4P3VZQeMLWnaNq79O7810WS+WKdU+atcMAQKyByahqFONFuBnU57Tw0O07CweuWv+wcUtlVdKRXadUpbxeG2u6Hv5Cj7RHK6raEmsAmMji7x2AUsg0qpo6dfbUqbMvGqoZ+aYR3VMfb5fwZVV1wrd/LK69cWP+JQWFx9ttu3t3vsu4pWfHB0X0Vev/68OdBhB8aGsAuKtucyOHKG96db5HRF+25tV6t3/zx5ILBlsz2s9Ytf6RHmmPhNvzdhUNWJ97pa/3GUBQsXLAMMxyMVVNcKj9KRv5Zk6dcDPyuE4WrTp7601bGlr9tD73yi6HvXxcj4sPS/xMRL5avrRF9hdAEKGtAeAlI99cvC/cDDxiTGTYxj0lRy7PeabB+y9b+1KHth+kJb8jIhvyxrXkrgIIEtqcb+lrYIKLT6aqCWq33z5W1zURvayyfVV1Yu3tFVXJ36/4svbTHmmP9enyf7oe8u731f7YTQCKo60BYIJFyxeJDBaRiNCtEaFba28vrzy87t1KKzqKiNMV2qI7ByBoEGtgAqoaiMiPf/yw9Nutsu88fjTBAFoesQaAyWqOuTlZE8INgJbFSig011iqGuxzzMntjcJGDgw3i5Yv2rr3JBGpfcHhlQeAL9DWAPAhI9wMOmqQ8ensb/VN+Rf6dY8AqIxYg2ahqoE7an9Jxp6sichsZqYA+AaxBoAJln67te4M1KEY+YZwA8BHtNnf8MoCL409haoGB7j99ounTp3j9p3HiggvQQBMRFsDL5Fp0Ew1zc0pmhBuAJiEWAPAnwg3AEzEAm944xKqGpiqbrh5m3ADwFu0NQAChRFuLjlFMz4l3wDwlMYLBzxFVYNGeHTUcFObGiuEGwCeoK0BEKDqljeEGwDuINbAM1Q1aGGEGwDuI9YAaAUINwDcYdV5fYDbLh1GVQN/qhtu3vqaFy8A9dHWADDT1KlzTDxq+BBDzBaRS4cRbgDUR6yBu6hqEFAINwAORqwB0IrVDTdCvgGCHrEGbqGqQSCr/eWkvAGCnMbzH00i08BTvj68pqnRxwrhBghKtDUAVMNhN0DQ4lKXaMJlVDVoneqGmzcJN0BwsApPdgDqMsLNZUa4+YrXO0BxTEKhMZcNp6qBCmrCzXDCDaA4Yg0A87XASfm8UDfcCPkGUBGxBodEVQMl1f5WU94A6iHWAAhSzEwB6mElFBo2jqoGwaFuuPkf4QZo5WhrAKAm3Iw7dLg5OuPWamfUyn/vr3uLrluW50xtqX0E0DRiDRpAVYPmC8yjhhvXSLjp3O7tMHt+eWVK9tbrReS0/ickxf28dsuNftlPAIdi8fcOIOCQaRDkpk6dPXXq7HHDtXH71kyJyNI1M0W0I7veJSLph7+SFPdLcXmXpWue9d9uAmgAp+MDgAYc0Nx8qW/KO29T8ntpyXMH9R6TkvCDiMxfvM6/ewjgYExC4QDjTqWqAfarCTen1tQ2FVUJaclzRSRr8yR/7haAQ2AlFABfaY2H1zSoNuuH2ceKiK5ry9ZM9+seAWgYbQ32u5yqBmiU8QTRtLEi2htf8lchEHCINQDgGSPcXH6qJiKEGyCgEGtQg6qmVbv99rFSZ64ELYBwAwQgYg3QihlpRgg0/kO4AQIK08MQoapphYxA8+ST77pcTn/vSxPUOGrYHcYPhRdVwI84bw3QytQNNIGfaYJK3eZGRN74gpdXoKWxwBtyxQiqmlag3nwTgSZg1T6bLh+hicjrhBugBXFsDRDoWtF8E+oy8s0VhBugBWk82YIcVU0gI9Aow/hR8noL+BqxJqiRaQIT65tURbgBfI1JKCCA1AaaBj/1LzJW8zEtBfgabU3woqoJKLUJZvr0uTffPPrppz/07/4cbPLkMf7ehVav7jOO5gbwBdoawJ/q9jHTp8/14540KQCTVqtzcDS8YgR/WwJm0l7jGRWUrqSq8bfGA01gFjYw3eTJY3gRBkzE6fiAllZ3vsm/e4KAwIswYB7ttc95SgWdK0+jqvED9+ebbr55tO93J7AEczU1efIYXocBs3BsDeBzbgaaumkm2N7nrjxN8/cuAFABbU3QoappSW7ONwVzoAEAE9HWAObzYr6JNAMAzcelLoPLVVQ1PubFfNOrn+vCYaMAYAbaGsAcXsw3vUpDAwCmItYEEaoaX/Bivok0AwA+wnlrgsVVp5NpTObNfNNCXYQJJwDwFdoawGPezDctJMsAgM8Ra4ICVY0pvJlvIs0AQAsi1gBN836+CQDQgljgrb6rqWqawYv5plcWsmAbAPyDtgZogBfzTa9QzwCAvxFrFEdV4ykv5psINAAQIIg1QA2v55sAAAGCWKMyqhp3MN8EAMrgdHwIXt7MN33G+fQAIHCxEkpZ15xBVXNIXsw3vfwZ65sAINAxCYUg4sV8k5FmAACtArFGTVQ19Xgx30SgAYBWh1ijIDJNXV7PNwEAWh1iDdTEfBMABCFijWqoaphvAoCgRayBOphvAoAgZ9V5VVfItWcGY1XjxXzTS5/W/N7z+w8AKqGtQSvmxXxTbaABAKiHWKOOoKpqvJhvItAAgPKINWhNmjPfBABQHrFGEcpXNcw3AQCaRKxBoPN0vok0AwBBi0tdquA6FasaL+abXvyUq1ECQFCjrUHA8WK+6UUaGgAAsUYBKlU1ns43kWYAAHVZqexbtevOUiHTeDPf9IkuwoQTAOAAtDXwJ2/mmz4hywAAGkasacVadVXj8XwTaQYA0BRiDVqU9/NNAAA0hQXerdX1ra2q8WK+6YVPWLANAPAAbQ18ztP5pheoZwAAXiHWtEqtoqrxYr6JQAMAaA5iDczn9XwTAADNwXlrWp/rRwZuVePxfNOCfb9//B4CAJqNtgYm8Ga+aQFBBgBgMlZCtTLjA6yq8WK+adYC1jcBAHyCtqY1CahM4+l80yzqGQCAjxFr4Bkv5psINACAlkGsaTX8XtV4Pd8EAEDLINagacw3AQBaBWJN6+CXqob5JgBA68JKKDTAi/mm51nfBADwN07H1wrccHbLVTWezjc9/zHn0wMABAomoSDi1XzT/kADAEBgINYEOl9XNd7MNxFoAAABiVgTvLyfbwIAICARawKaL6oa5psAAKoi1gQR5psAAGpjgXfgutG8qsbT+abn9qUZfj0AAK0IbU2AMiXTeDHf9Bz1DACg1eK8NWryYr7puY90EfoZAEArRlsTiG48x/uqxuP5po8IMgAARRBrFOHNfBOBBgCgFmJNwPG0qvF+vgkAALWwEqoV83S+6dmPWN8EAFAZbU1gmeBGVePFfNOz1DMAgCBArGlNPK1nhEADAAgmxJoA0khV4/V8EwAAwYNYE9CYbwIAwH2cji9QTBh1QFXjzXzTfM6nBwAIarQ1Acfj+ab5BBkAAEREtJm8KQaAm0ZpdT91M9DwswMAoC7aGv+rzTTuzzcRaAAAOBixxp88DTSkGQAAGkGs8YPaNPPMW+tFZOKlnRu8G/UMAAAe4diaFmUEGiPN1DXx0s51CxsCDQAAXqCtaSGHCjT1MN8EAIDXuNSlb03cN98046310ug5ZWoDzTPz9cbvCQAAGsTp+Hxl4rmaiMx4c189c+jv86TLao6teWYe59MDAMB7TEKZr36gOTQj0NSkGQAA0DzEGjMRaAAA8CNijZmemacbyeZQ6s83AQAA8xBrWgj1DAAAvkas8TkCDQAALYMF3r5SO980Yx4LtgEAaAm0NeYzAs0M6hkAAFqWNmMu774AAEAFFn/vAAAAgDmINQAAQBHEGgAAoAhWQgEAAEXQ1gAAAEUQawAAgCKINQAAQBHEGgAAoAgrZ/UHAABqoK0BAACKYIE3AABQBG0NAABQBLEGAAAoglgDAAAUQawBAACKINYAAABFcN4aAACgCBZ4AwAARTAJBQAAFEGsAQAAiiDWAAAARRBrAACAIog1AABAEayEAgAAiqCtAQAAiuB0fAAAQBG0NQAAQBHEGgAAoAhiDQAAUASxBgAAKIIF3gAAQBG0NQAAQBHEGgAAoAhiDQAAUASn4wMAAIqgrQEAAIpgJRQAAFAEbQ0AAFAEsQYAACiCWAMAABRBrAEAAIog1gAAAEVYdZZCAQAAJdDWAAAARRBrAACAIog1AABAEcQaAACgCGINAABQBLEGAAAogktdAgAARdDWAAAARViFugYAACiBtgYAACiCWAMAABRBrAEAAIpgJRQAAFAEbQ0AAFAEsQYAACiCWAMAABTBeWsAAIAiaGsAAIAiiDUAAEARLPAGAACKoK0BAACKINYAAABFEGsAAIAiiDUAAEARxBoAAKAIq85SKAAAoATaGgAAoAhiDQAAUASxBgAAKIJYAwAAFEGsAQAAiiDWAAAARXCpSwAAoAirkGsAAIASmIQCAACKINYAAABFEGsAAIAiiDUAAEARrIQCAACKoK0BAACKINYAAABFEGsAAIAiOB0fAABQBG0NAABQBLEGAAAoggXeAABAEbQ1AABAEcQaAACgCGINAABQBLEGAAAogvPWAAAARbASCgAAKIJJKAAAoAhiDQAAUASxBgAAKIJYAwAAFEGsAQAAiiDWAAAARbDAGwAAKILT8QEAAEUwCQUAABRBrAEAAIog1gAAAEUQawAAgCJYCQUAABRBWwMAABRBrAEAAIrgvDUAAEARtDUAAEARxBoAAKAIYg0AAFAEC7wBAIAiaGsAAIAiiDUAAEARxBoAAKAIYg0AAFAEp+MDAACKYCUUAABQBJNQAABAEcQaAACgCGINAABQBLEGAAAoglgDAAAUQawBAACKYIE3AABQBKfjAwAAimASCgAAKIJYAwAAFEGsAQAAiiDWAAAARbASCgAAKIK2BgAAKIJYAwAAFMF5awAAgCJoawAAgCKINQAAQBHEGgAAoAgWeAMAAEXQ1gAAAEUQawAAgCKINQAAQBHEGgAAoAhOxwcAABTBSigAAKAIJqEAAIAiiDUAAEARxBoAAKAIYg0AAFAEsQYAACiCWAMAABRh1VnhDQAAlEBbAwAAFEGsAQAAiiDWAAAARRBrAACAIog1AABAEVzqEgAAKIK2BgAAKIJYAwAAFGEVZqEAAIASaGsAAIAiiDUAAEARxBoAAKAIFngDAABF0NYAAABFEGsAAIAiiDUAAEARnLcGAAAogrYGAAAogpVQAABAEbQ1AABAEcQaAACgCGINAABQBLEGAAAoglgDAAAUQawBAACKsOqs8AYAAEqgrQEAAIog1gAAAEUQawAAgCKINQAAQBHEGgAAoAgudQkAABRBWwMAABRhFeoaAACgBNoaAACgCGINAABQBLEGAAAoglgDAAAUwQJvAACgCNoaAACgCGINAABQBLEGAAAowvzT8Q09UiLDD7glMUYsmrz2ef17nnmcfPqLyaMDAICgZTV9izGREhO5/9Mwm2R0EKdTTj9WFv66//b/u0Q25Zk+OAAACF7mr4Sav+SAT8cNl4JCWfyXjDxePtsXa04/RsLt8vY3Zo8NAACCmG+PrRnSV7qlyqNzZMlfsm2n3HB2ze2D+sgnTD8BAABT+TbWnHaMfPhjzccz5knHFDkqQ8aPlE35sjTLpyMDAICgY/6xNbXuHydLs2R59v5bFq2U8weLiNzxku+GBQAAQcpXbc2EUbKnROb+eMCNn/0qLl2WrfHRmAAAIKj5JNaMGiht42TG3Ab+yemUiipfjAkAAIKdVTd7KVS/dDn+CLl1VmP3MX1QAAAA89ua8wfLqn9N3yoAAEATTD5keGAvsdmkb1fp27X+P93yvLlDAQAAHECb/BwTQgAAQAVc6hIAACjCJ7Hm5TscvtgsAABAI3wSa3S9evqERcbHT6/XfDEEAABAPeZf6lJEXK7q0NC+T984Vc69Q7oIB+8AAIAWYH5bM/3GR3TdoWlWi+UkmXePWGT63xQ2AADA56ymdyma1lXXqy2WiJCQti5XPxkqWrw2QyyTlrlMHgkAAKAOXxxbE6Lr1RaLNSSkjTwxSkT0hUxDAQAAnzM/1kyaOeaGp9qXli6pqPhl/42mVjVnn1D/lhN7yeC+Jo4AAABaH1+dt0bXyzQtwkcbT4yRO8cecMuok2TnXh+NBgAAWgffnY6vRCREbpvki02/9rlEhskZx9Z8es9l8luWrN7oi6EAAECr4ZMF3iIislEkTaS78Ynpo3z4o1xyinz6q4w+SSyazPnO7AEAAEBrY/KlLutYLXKSSIKPtv5njvTuLPdcKgnRMpmLaAIAAN9NQk169n8ipZqW6KPti8j/vpSEGNmU77sRAABAa2L+eWtq6XqZpsXv+8T87V95uuwqlLRk6ZEm/2w0f/sAAKB18ekVvHeLhMip9/pi00dnSs80efgt+XGVXDDEFyMAAIBWxqexZqNIiEiad1981kTL0TdpHW5q+MIL554o3/whIjJ/sTiccukwb/cRAACowncroUTkc5FTjKOG3R/FepPWWaSLyLERNae90e+IND74qaxs4UxdRK49U4rKZOHSmi958E2ZPkFW/Cur1pu59wAAoHXx3UoomTjz15kTv9a0+MfCH9924D9V3aR1Eeki0tZiiQ4JiQkJMf5v0zSJixNNExGXw6GJaJq2oaJij8PxvxlO42uP7SHd02Tycwds8NfVcv4QYg0AAEFNmzjTV31Nd+sLp512Wps2bXJzc4u7d6+NL+EWi2iakV2MD6p1vczhKHM6jf8XO51bRbbq+qlW6yqn801dz/DZTgIAAGX4sK1JTU1NSEiIjIxMTk7uGhvrEilzOIqdzvzKSiPBbBPZqutbRcoOkVpeuEmzzNQzfLeLAABAIT6MNZs2bcrMzLRYLAUFBS/+5z9bwm71dAsWShoAAOA2H8aaNc7xlm9eTEtLW7dunReZBgAAwCPaxGdoRAAAgAp8usAbAACg5fj0dHwAAAAth1gDAAAUQawBAACKINYAAABFEGsAAIAiWAkFAAAUYfXg4toAAAABjEkoAACgCGINAABQBLEGAAAoglgDAAAUQawBAACKYIE3AABQBG0NAABQBLEGAAAogtPxAQAARdDWAAAARRBrAACAIlgJBQAAFEFbAwAAFEGsAQAAiiDWAAAARRBrAACAIjhvDQAAUARtDQAAUAQLvAEAgCJoawAAgCKINQAAQBH/D0Pzivu2dAJOAAAAAElFTkSuQmCC + + + + + diff --git a/test.squish/suite_ISSUES/tst_532/verificationPoints/VP_PARTITION b/test.squish/suite_ISSUES/tst_532/verificationPoints/VP_PARTITION new file mode 100644 index 000000000..95cabc7c4 --- /dev/null +++ b/test.squish/suite_ISSUES/tst_532/verificationPoints/VP_PARTITION @@ -0,0 +1,9 @@ + + + + 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 + + + + + -- 2.30.2