From 2f2267c2163fa171ed8675829fc7c35f979b5bd6 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Tue, 2 Mar 2010 13:45:13 +0000 Subject: [PATCH] rewrote classificationEditor --- Fltk/classificationEditor.cpp | 1002 +++++++++--------- Fltk/classificationEditor.h | 49 +- benchmarks/extrude/sphere_boundary_layer.geo | 22 +- benchmarks/stl/coupe_geom.stl.gz | Bin 23495 -> 21752 bytes 4 files changed, 557 insertions(+), 516 deletions(-) diff --git a/Fltk/classificationEditor.cpp b/Fltk/classificationEditor.cpp index 6e1c480d82..4e130fd34a 100644 --- a/Fltk/classificationEditor.cpp +++ b/Fltk/classificationEditor.cpp @@ -4,7 +4,7 @@ // bugs and problems to <gmsh@geuz.org>. #include <FL/Fl_Tabs.H> -#include <FL/Fl_Value_Input.H> +#include <FL/Fl_Box.H> #include "FlGui.h" #include "classificationEditor.h" #include "paletteWindow.h" @@ -19,184 +19,43 @@ #include "discreteEdge.h" #include "discreteFace.h" -static void NoElementsSelectedMode(classificationEditor *e) -{ - e->_buttons[CLASSBUTTON_DEL]->deactivate(); - e->_buttons[CLASSBUTTON_ADD]->deactivate(); - e->_buttons[CLASSBUTTON_CLEAR]->deactivate(); - // e->_buttons[CLASSBUTTON_OK]->deactivate(); - e->_togbuttons[CLASSTOGBUTTON_CLOS]->deactivate(); - e->_inputs[CLASSVALUE_ANGLE]->deactivate(); - - e->_buttons[CLASSBUTTON_SELECT]->activate(); - e->_togbuttons[CLASSTOGBUTTON_HIDE]->activate(); -} - -static void ElementsSelectedMode(classificationEditor *e) -{ - e->_buttons[CLASSBUTTON_DEL]->activate(); - e->_buttons[CLASSBUTTON_ADD]->activate(); - e->_buttons[CLASSBUTTON_CLEAR]->activate(); - e->_togbuttons[CLASSTOGBUTTON_CLOS]->activate(); - e->_inputs[CLASSVALUE_ANGLE]->activate(); - // e->_buttons[CLASSBUTTON_OK]->activate(); - - e->_buttons[CLASSBUTTON_SELECT]->deactivate(); - e->_togbuttons[CLASSTOGBUTTON_HIDE]->deactivate(); -} - -// we should -static void class_selectgface_cb(Fl_Widget *w, void *data) -{ - classificationEditor *e = (classificationEditor*)data; - std::vector<GFace*> temp; - - opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, 1); - - while(1) { - CTX::instance()->mesh.changed = ENT_ALL; - drawContext::global()->draw(); - - Msg::StatusBar(3, false, "Select Model Face\n" - "[Press 'e' to end selection or 'q' to abort]"); - - char ib = FlGui::instance()->selectEntity(ENT_SURFACE); - if(ib == 'l') { - for(unsigned int i = 0; i < FlGui::instance()->selectedFaces.size(); i++){ - FlGui::instance()->selectedFaces[i]->setSelection(1); - temp.push_back(FlGui::instance()->selectedFaces[i]); - } - } - // ok store the list of gfaces ! - if(ib == 'e') { - GModel::current()->setSelection(0); - for(unsigned int i = 0; i < temp.size(); i++){ - e->_faces.insert(temp[i]); - } - break; - } - // do nothing - if(ib == 'q') { - GModel::current()->setSelection(0); - break; - } - } - CTX::instance()->mesh.changed = ENT_ALL; - drawContext::global()->draw(); - Msg::StatusBar(3, false, ""); -} - -static void class_deleteedge_cb(Fl_Widget *w, void *data) +edge_angle::edge_angle(MVertex *_v1, MVertex *_v2, MElement *t1, MElement *t2) + : v1(_v1), v2(_v2) { - classificationEditor *e = (classificationEditor*)data; - std::vector<MLine*> ele; - - CTX::instance()->pickElements = 1; - - while(1) { - CTX::instance()->mesh.changed = ENT_ALL; - drawContext::global()->draw(); - - Msg::StatusBar(3, false, "Select Elements\n" - "[Press 'e' to end selection or 'q' to abort]"); - - char ib = FlGui::instance()->selectEntity(ENT_ALL); - if(ib == 'l') { - if(CTX::instance()->pickElements){ - for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++){ - MElement *me = FlGui::instance()->selectedElements[i]; - if(me->getType() == TYPE_LIN && me->getVisibility() != 2){ - me->setVisibility(2); ele.push_back((MLine*)me); - } - } - } - } - if(ib == 'r') { - for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++) - FlGui::instance()->selectedElements[i]->setVisibility(1); - } - // ok, we compute edges ! - if(ib == 'e') { - GModel::current()->setSelection(0); - break; - } - // do nothing - if(ib == 'q') { - GModel::current()->setSelection(0); - ele.clear(); - break; + if(!t2) angle = 0; + else{ + double c1[3]; + double c2[3]; + double c3[3]; + { + MVertex *p1 = t1->getVertex(0); + MVertex *p2 = t1->getVertex(1); + MVertex *p3 = t1->getVertex(2); + double a[3] = {p1->x() - p2->x(), p1->y() - p2->y(), p1->z() - p2->z()}; + double b[3] = {p1->x() - p3->x(), p1->y() - p3->y(), p1->z() - p3->z()}; + c1[2] = a[0] * b[1] - a[1] * b[0]; + c1[1] = -a[0] * b[2] + a[2] * b[0]; + c1[0] = a[1] * b[2] - a[2] * b[1]; } - } - - std::sort(ele.begin(),ele.end()); - // look in all temporary edges if a deleted one is present and delete it ! - std::vector<MLine*> temp = e->temporary->lines; - e->temporary->lines.clear(); - - for(unsigned int i = 0; i < temp.size(); i++){ - std::vector<MLine*>::iterator it = std::find(ele.begin(), ele.end(), temp[i]); - if(it != ele.end()){ - delete temp[i]; + { + MVertex *p1 = t2->getVertex(0); + MVertex *p2 = t2->getVertex(1); + MVertex *p3 = t2->getVertex(2); + double a[3] = {p1->x() - p2->x(), p1->y() - p2->y(), p1->z() - p2->z()}; + double b[3] = {p1->x() - p3->x(), p1->y() - p3->y(), p1->z() - p3->z()}; + c2[2] = a[0] * b[1] - a[1] * b[0]; + c2[1] = -a[0] * b[2] + a[2] * b[0]; + c2[0] = a[1] * b[2] - a[2] * b[1]; } - else e->temporary->lines.push_back(temp[i]); - } - - CTX::instance()->mesh.changed = ENT_ALL; - CTX::instance()->pickElements = 0; - drawContext::global()->draw(); - Msg::StatusBar(3, false, ""); -} - -static void class_save_cb(Fl_Widget *w, void *data) -{ - classificationEditor *e = (classificationEditor*)data; - - e->saved->lines.insert(e->saved->lines.end(), e->temporary->lines.begin(), - e->temporary->lines.end()); - e->temporary->lines.clear(); - e->_elements.clear(); - e->edges_detected.clear(); - - CTX::instance()->mesh.changed = ENT_ALL; - CTX::instance()->pickElements = 0; - NoElementsSelectedMode(e); - drawContext::global()->draw(); - Msg::StatusBar(3, false, ""); -} - -static void class_clear_cb(Fl_Widget *w, void *data) -{ - classificationEditor *e = (classificationEditor*)data; - - for(unsigned int i = 0; i < e->temporary->lines.size(); i++){ - delete e->temporary->lines[i]; + norme(c1); + norme(c2); + prodve(c1, c2, c3); + double cosa; prosca(c1, c2, &cosa); + double sina = norme(c3); + angle = atan2(sina, cosa); } - e->temporary->lines.clear(); - - CTX::instance()->mesh.changed = ENT_ALL; - CTX::instance()->pickElements = 0; - NoElementsSelectedMode(e); - drawContext::global()->draw(); - Msg::StatusBar(3, false, ""); } -static void class_ok_cb(Fl_Widget *w, void *data) -{ - classificationEditor *e = (classificationEditor*)data; - e->edge_detec->deactivate(); - e->edge_detec->hide(); - e->face_color->activate(); - e->face_color->show(); - class_save_cb(w,data); - opt_mesh_lines(0, GMSH_SET | GMSH_GUI, e->op[0]); - opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, e->op[1]); - opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, e->op[2]); - opt_mesh_line_width(0, GMSH_SET | GMSH_GUI, e->op[3]); - - Msg::StatusBar(3, false, ""); -} - - struct compareMLinePtr { bool operator () (MLine *l1, MLine *l2) const @@ -206,6 +65,23 @@ struct compareMLinePtr } }; +static void buildListOfEdgeAngle(e2t_cont adj, std::vector<edge_angle> &edges_detected, + std::vector<edge_angle> &edges_lonly) +{ + e2t_cont::iterator it = adj.begin(); + for(; it != adj.end(); ++it){ + if(it->second.second) + edges_detected.push_back(edge_angle(it->first.getVertex(0), + it->first.getVertex(1), + it->second.first, it->second.second)); + else + edges_lonly.push_back(edge_angle(it->first.getVertex(0), + it->first.getVertex(1), + it->second.first, it->second.second)); + } + std::sort(edges_detected.begin(), edges_detected.end()); +} + static void recurClassify(MTri3 *t, GFace *gf, std::map<MLine*, GEdge*, compareMLinePtr> &lines, std::map<MTriangle*, GFace*> &reverse) @@ -232,20 +108,19 @@ static GEdge *getNewModelEdge(GFace *gf1, GFace *gf2, { int t1 = gf1 ? gf1->tag() : -1; int t2 = gf2 ? gf2->tag() : -1; - int i1 = std::min(t1,t2); - int i2 = std::max(t1,t2); + int i1 = std::min(t1, t2); + int i2 = std::max(t1, t2); if(i1 == i2) return 0; std::map<std::pair<int, int>, GEdge*>::iterator it = newEdges.find(std::make_pair<int, int>(i1, i2)); if(it == newEdges.end()){ - discreteEdge *temporary = new discreteEdge + discreteEdge *ge = new discreteEdge (GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0); - //printf("add new edge gf1=%d gf2=%d \n", t1, t2); - GModel::current()->add(temporary); - newEdges[std::make_pair<int, int>(i1, i2)] = temporary; - return temporary; + GModel::current()->add(ge); + newEdges[std::make_pair<int, int>(i1, i2)] = ge; + return ge; } else return it->second; @@ -258,7 +133,6 @@ static void recurClassifyEdges(MTri3 *t, std::map<std::pair<int, int>, GEdge*> &newEdges) { if(!t->isDeleted()){ - t->setDeleted(true); GFace *gf1 = reverse[t->tri()]; for(int i = 0; i < 3; i++){ @@ -279,179 +153,62 @@ static void recurClassifyEdges(MTri3 *t, if(tn) recurClassifyEdges(tn, reverse, lines, touched, newEdges); } - } } -static void class_color_cb(Fl_Widget* w, void* data) +static void NoElementsSelectedMode(classificationEditor *e) { - classificationEditor *e = (classificationEditor*)data; - std::map<MLine*, GEdge*, compareMLinePtr> lines; - { - GModel::eiter it = GModel::current()->firstEdge(); - GModel::eiter ite = GModel::current()->lastEdge(); - for( ; it != ite; ++it){ - for(unsigned int i = 0; i < (*it)->lines.size();i++) - lines[(*it)->lines[i]] = *it; - } - } - - std::list<MTri3*> tris; - { - std::set<GFace*>::iterator it = e->_faces.begin(); - while(it != e->_faces.end()){ - GFace *gf = *it; - for(unsigned int i = 0; i < gf->triangles.size(); i++){ - tris.push_back(new MTri3(gf->triangles[i], 0)); - } - gf->triangles.clear(); - ++it; - } - } + e->buttons[CLASS_BUTTON_SELECT_ELEMENTS]->activate(); + e->buttons[CLASS_BUTTON_SELECT_ALL_ELEMENTS]->activate(); - if ( !tris.size() )return; - - - connectTriangles(tris); - - { - std::map<MTriangle*,GFace*> reverse; - - // color all triangles - std::list<MTri3*> ::iterator it = tris.begin(); - while(it != tris.end()){ - if(!(*it)->isDeleted()){ - discreteFace *temporary = new discreteFace - (GModel::current(), GModel::current()->maxFaceNum() + 1); - recurClassify(*it, temporary, lines, reverse); - GModel::current()->add(temporary); - } - ++it; - } - - // color some lines - it = tris.begin(); - while(it != tris.end()){ - (*it)->setDeleted(false); - ++it; - } - - it = tris.begin(); - - //classify edges that are bound by different GFaces - //-------------------------------------------------- - std::map<std::pair<int, int>, GEdge*> newEdges; - std::set<MLine*> touched; - recurClassifyEdges(*it, reverse, lines, touched, newEdges); - GModel::current()->remove(e->saved); - - //check if new edges should not be splitted - //splitted if composed of several open or closed edges - //----------------------------------------------------- - for (std::map<std::pair<int, int>, GEdge*>::iterator it = newEdges.begin() ; it != newEdges.end() ; ++it){ - - GEdge *ge = it->second; - //printf("NEW edge with tag = %d \n", ge->tag()); - - std::list<MLine*> segments; - for (unsigned int i = 0; i < ge->lines.size(); i++){ - segments.push_back(ge->lines[i]); - } + e->buttons[CLASS_BUTTON_DELETE_FROM_SELECTION]->deactivate(); + e->buttons[CLASS_BUTTON_RESET_SELECTION]->deactivate(); + e->toggles[CLASS_TOGGLE_BOUNDARY]->deactivate(); + e->inputs[CLASS_VALUE_ANGLE]->deactivate(); + e->buttons[CLASS_BUTTON_CLASSIFY]->deactivate(); - //for each actual GEdge - while (!segments.empty()) { - std::vector<MLine*> myLines; - std::list<MLine*>::iterator it = segments.begin(); - MVertex *vB = (*it)->getVertex(0); - MVertex *vE = (*it)->getVertex(1); - myLines.push_back(*it); - segments.erase(it); - it++; - //printf("***candidate mline %d %d of size %d \n", vB->getNum(), vE->getNum(), segments.size()); - - for (int i=0; i<2; i++) { - for (std::list<MLine*>::iterator it = segments.begin() ; it != segments.end(); ++it){ - MVertex *v1 = (*it)->getVertex(0); - MVertex *v2 = (*it)->getVertex(1); - //printf("mline %d %d \n", v1->getNum(), v2->getNum()); - std::list<MLine*>::iterator itp; - if ( v1 == vE ){ - //printf("->push back this mline \n"); - myLines.push_back(*it); - itp = it; - it++; - segments.erase(itp); - vE = v2; - i = -1; - } - else if ( v2 == vE){ - //printf("->push back this mline \n"); - myLines.push_back(*it); - itp = it; - it++; - segments.erase(itp); - vE = v1; - i=-1; - } - if (it == segments.end()) break; - } - if (vB == vE) break; - if (segments.empty()) break; - //printf("not found VB=%d vE=%d\n", vB->getNum(), vE->getNum()); - MVertex *temp = vB; - vB = vE; - vE = temp; - //printf("not found VB=%d vE=%d\n", vB->getNum(), vE->getNum()); - } - GEdge *newGe = new discreteEdge - (GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0); - newGe->lines.insert(newGe->lines.end(), myLines.begin(), myLines.end()); - GModel::current()->add(newGe); - }//end for each actual GEdge - } - //printf("end new edge with tag \n"); - - for (std::map<std::pair<int, int>, GEdge*>::iterator it = newEdges.begin(); - it != newEdges.end(); ++it){ - GEdge *ge = it->second; - GModel::current()->remove(ge); - } - - while(it != tris.end()){ - delete *it; - ++it; - } - } - CTX::instance()->mesh.changed = ENT_ALL; + CTX::instance()->pickElements = 0; drawContext::global()->draw(); Msg::StatusBar(3, false, ""); } -static void updateedges_cb(Fl_Widget* w, void* data) +static void ElementsSelectedMode(classificationEditor *e) +{ + e->buttons[CLASS_BUTTON_DELETE_FROM_SELECTION]->activate(); + e->buttons[CLASS_BUTTON_RESET_SELECTION]->activate(); + e->toggles[CLASS_TOGGLE_BOUNDARY]->activate(); + e->inputs[CLASS_VALUE_ANGLE]->activate(); + + e->buttons[CLASS_BUTTON_SELECT_ELEMENTS]->deactivate(); + e->buttons[CLASS_BUTTON_SELECT_ALL_ELEMENTS]->deactivate(); +} + +static void update_edges_cb(Fl_Widget *w, void *data) { classificationEditor *e = (classificationEditor*)data; + if(!e->selected) return; + printf("%d inside edges detected\n", (int)e->edges_detected.size()); - for(unsigned int i = 0; i < e->temporary->lines.size(); i++){ - delete e->temporary->lines[i]; - } - e->temporary->lines.clear(); + for(unsigned int i = 0; i < e->selected->lines.size(); i++) + delete e->selected->lines[i]; + e->selected->lines.clear(); for(unsigned int i = 0; i < e->edges_detected.size(); i++){ edge_angle ea = e->edges_detected[i]; // printf("angle = %g\n",ea.angle); - if(ea.angle <= e->_inputs[CLASSVALUE_ANGLE]->value() / 180 * M_PI) + if(ea.angle <= e->inputs[CLASS_VALUE_ANGLE]->value() / 180 * M_PI) break; - e->temporary->lines.push_back(new MLine(ea.v1, ea.v2)); + e->selected->lines.push_back(new MLine(ea.v1, ea.v2)); } printf("%d boundary edges detected\n", (int)e->edges_lonly.size()); - if(e->_togbuttons[CLASSTOGBUTTON_CLOS]->value()){ + if(e->toggles[CLASS_TOGGLE_BOUNDARY]->value()){ for(unsigned int i = 0 ; i < e->edges_lonly.size(); i++){ edge_angle ea = e->edges_lonly[i]; - e->temporary->lines.push_back(new MLine(ea.v1, ea.v2)); + e->selected->lines.push_back(new MLine(ea.v1, ea.v2)); //check if closed loop } } @@ -460,6 +217,91 @@ static void updateedges_cb(Fl_Widget* w, void* data) drawContext::global()->draw(); } +static void class_select_elements_cb(Fl_Widget *w, void *data) +{ + classificationEditor *e = (classificationEditor*)data; + std::vector<MTriangle*> &ele(e->elements); + + // allocate discrete edge to hold the selected mesh segments + if(!e->selected){ + e->selected = new discreteEdge + (GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0); + GModel::current()->add(e->selected); + } + + CTX::instance()->pickElements = 1; + + while(1) { + CTX::instance()->mesh.changed = ENT_ALL; + drawContext::global()->draw(); + + Msg::StatusBar(3, false, "Select elements\n" + "[Press 'e' to end selection or 'q' to abort]"); + + char ib = FlGui::instance()->selectEntity(ENT_ALL); + if(ib == 'l') { + for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++){ + MElement *me = FlGui::instance()->selectedElements[i]; + if(me->getType() == TYPE_TRI && me->getVisibility() != 2){ + me->setVisibility(2); ele.push_back((MTriangle*)me); + } + } + } + if(ib == 'r') { + for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++) + FlGui::instance()->selectedElements[i]->setVisibility(1); + } + if(ib == 'e') { // ok, compute the edges + GModel::current()->setSelection(0); + e2t_cont adj; + buildEdgeToTriangle(ele, adj); + buildListOfEdgeAngle(adj, e->edges_detected, e->edges_lonly); + ElementsSelectedMode(e); + break; + } + if(ib == 'q') { // do nothing + GModel::current()->setSelection(0); + ele.clear(); + break; + } + } + + update_edges_cb(0, data); + + CTX::instance()->mesh.changed = ENT_ALL; + CTX::instance()->pickElements = 0; + drawContext::global()->draw(); + Msg::StatusBar(3, false, ""); +} + +static void class_select_all_elements_cb(Fl_Widget *w, void *data) +{ + classificationEditor *e = (classificationEditor*)data; + + // allocate discrete edge to hold the selected mesh segments + if(!e->selected){ + e->selected = new discreteEdge + (GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0); + GModel::current()->add(e->selected); + } + + for(GModel::fiter it = GModel::current()->firstFace(); + it != GModel::current()->lastFace(); ++it) + e->elements.insert(e->elements.end(), (*it)->triangles.begin(), + (*it)->triangles.end()); + + e2t_cont adj; + buildEdgeToTriangle(e->elements, adj); + buildListOfEdgeAngle(adj, e->edges_detected, e->edges_lonly); + ElementsSelectedMode(e); + update_edges_cb(0, data); + + CTX::instance()->mesh.changed = ENT_ALL; + CTX::instance()->pickElements = 0; + drawContext::global()->draw(); + Msg::StatusBar(3, false, ""); +} + static void class_hide_cb(Fl_Widget *w, void *data) { CTX::instance()->hideUnselected = !CTX::instance()->hideUnselected; @@ -467,45 +309,45 @@ static void class_hide_cb(Fl_Widget *w, void *data) drawContext::global()->draw(); } -static void buildListOfEdgeAngle(e2t_cont adj, std::vector<edge_angle> &edges_detected, - std::vector<edge_angle> &edges_lonly) +static void show_only_edges_cb(Fl_Widget *w, void *data) { - e2t_cont::iterator it = adj.begin(); - for(; it != adj.end(); ++it){ - if(it->second.second) - edges_detected.push_back(edge_angle(it->first.getVertex(0), - it->first.getVertex(1), - it->second.first, it->second.second)); - else - edges_lonly.push_back(edge_angle(it->first.getVertex(0), - it->first.getVertex(1), - it->second.first, it->second.second)); + classificationEditor *e = (classificationEditor*)data; + static int old_sf = opt_mesh_surfaces_faces(0, GMSH_GET, 0.); + static int old_se = opt_mesh_surfaces_edges(0, GMSH_GET, 0.); + if(e->toggles[CLASS_TOGGLE_SHOW_ONLY_EDGES]->value()){ + opt_mesh_lines(0, GMSH_SET | GMSH_GUI, 1.); + opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, 0.); + opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, 0.); } - std::sort(edges_detected.begin(), edges_detected.end()); + else{ + opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, old_sf); + opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, old_se); + } + drawContext::global()->draw(); } -static void class_select_cb(Fl_Widget *w, void *data) +static void class_delete_edge_cb(Fl_Widget *w, void *data) { classificationEditor *e = (classificationEditor*)data; - std::vector<MTriangle*> &ele(e->getElements()); - CTX::instance()->pickElements = 1; + if(!e->selected) return; + CTX::instance()->pickElements = 1; + std::vector<MLine*> ele; + while(1) { CTX::instance()->mesh.changed = ENT_ALL; drawContext::global()->draw(); - Msg::StatusBar(3, false, "Select Elements\n" + Msg::StatusBar(3, false, "Select elements\n" "[Press 'e' to end selection or 'q' to abort]"); char ib = FlGui::instance()->selectEntity(ENT_ALL); if(ib == 'l') { - if(CTX::instance()->pickElements){ - for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++){ - MElement *me = FlGui::instance()->selectedElements[i]; - if(me->getType() == TYPE_TRI && me->getVisibility() != 2){ - me->setVisibility(2); ele.push_back((MTriangle*)me); - } + for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++){ + MElement *me = FlGui::instance()->selectedElements[i]; + if(me->getType() == TYPE_LIN && me->getVisibility() != 2){ + me->setVisibility(2); ele.push_back((MLine*)me); } } } @@ -516,10 +358,6 @@ static void class_select_cb(Fl_Widget *w, void *data) // ok, we compute edges ! if(ib == 'e') { GModel::current()->setSelection(0); - e2t_cont adj; - buildEdgeToTriangle(ele, adj); - buildListOfEdgeAngle(adj, e->edges_detected, e->edges_lonly); - ElementsSelectedMode(e); break; } // do nothing @@ -529,164 +367,366 @@ static void class_select_cb(Fl_Widget *w, void *data) break; } } - - updateedges_cb(0, data); + std::sort(ele.begin(), ele.end()); + + // look in all selected edges if a deleted one is present and delete it + std::vector<MLine*> temp = e->selected->lines; + e->selected->lines.clear(); + for(unsigned int i = 0; i < temp.size(); i++){ + std::vector<MLine*>::iterator it = std::find(ele.begin(), ele.end(), temp[i]); + if(it != ele.end()) + delete temp[i]; + else + e->selected->lines.push_back(temp[i]); + } + CTX::instance()->mesh.changed = ENT_ALL; CTX::instance()->pickElements = 0; drawContext::global()->draw(); Msg::StatusBar(3, false, ""); + + e->elements.clear(); + e->edges_detected.clear(); } -edge_angle::edge_angle(MVertex *_v1, MVertex *_v2, MElement *t1, MElement *t2) - : v1(_v1), v2(_v2) +static void class_reset_selection_cb(Fl_Widget *w, void *data) { - if(!t2) angle = 0; - else{ - double c1[3]; - double c2[3]; - double c3[3]; - { - MVertex *p1 = t1->getVertex(0); - MVertex *p2 = t1->getVertex(1); - MVertex *p3 = t1->getVertex(2); - double a[3] = {p1->x() - p2->x(), p1->y() - p2->y(), p1->z() - p2->z()}; - double b[3] = {p1->x() - p3->x(), p1->y() - p3->y(), p1->z() - p3->z()}; - c1[2] = a[0] * b[1] - a[1] * b[0]; - c1[1] = -a[0] * b[2] + a[2] * b[0]; - c1[0] = a[1] * b[2] - a[2] * b[1]; + classificationEditor *e = (classificationEditor*)data; + if(!e->selected) return; + for(unsigned int i = 0; i < e->selected->lines.size(); i++) + delete e->selected->lines[i]; + e->selected->lines.clear(); + e->selected->deleteVertexArrays(); + e->elements.clear(); + e->edges_detected.clear(); + NoElementsSelectedMode(e); +} + +static void class_select_surfaces_cb(Fl_Widget *w, void *data) +{ + classificationEditor *e = (classificationEditor*)data; + std::vector<GFace*> temp; + + opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, 1); + + while(1) { + CTX::instance()->mesh.changed = ENT_ALL; + drawContext::global()->draw(); + + Msg::StatusBar(3, false, "Select Surface\n" + "[Press 'e' to end selection or 'q' to abort]"); + + char ib = FlGui::instance()->selectEntity(ENT_SURFACE); + if(ib == 'l') { + for(unsigned int i = 0; i < FlGui::instance()->selectedFaces.size(); i++){ + FlGui::instance()->selectedFaces[i]->setSelection(1); + temp.push_back(FlGui::instance()->selectedFaces[i]); + } } - { - MVertex *p1 = t2->getVertex(0); - MVertex *p2 = t2->getVertex(1); - MVertex *p3 = t2->getVertex(2); - double a[3] = {p1->x() - p2->x(), p1->y() - p2->y(), p1->z() - p2->z()}; - double b[3] = {p1->x() - p3->x(), p1->y() - p3->y(), p1->z() - p3->z()}; - c2[2] = a[0] * b[1] - a[1] * b[0]; - c2[1] = -a[0] * b[2] + a[2] * b[0]; - c2[0] = a[1] * b[2] - a[2] * b[1]; + if(ib == 'e') { // store the list of gfaces + GModel::current()->setSelection(0); + for(unsigned int i = 0; i < temp.size(); i++){ + e->faces.insert(temp[i]); + } + break; } - norme(c1); - norme(c2); - prodve(c1, c2, c3); - double cosa; prosca(c1, c2, &cosa); - double sina = norme(c3); - angle = atan2(sina, cosa); + if(ib == 'q') { // do nothing + GModel::current()->setSelection(0); + break; + } + } + + if(e->faces.size()) + e->buttons[CLASS_BUTTON_CLASSIFY]->activate(); + + CTX::instance()->mesh.changed = ENT_ALL; + drawContext::global()->draw(); + Msg::StatusBar(3, false, ""); +} + +static void class_select_all_surfaces_cb(Fl_Widget *w, void *data) +{ + classificationEditor *e = (classificationEditor*)data; + + for(GModel::fiter it = GModel::current()->firstFace(); + it != GModel::current()->lastFace(); ++it) + e->faces.insert(*it); + + if(e->faces.size()) + e->buttons[CLASS_BUTTON_CLASSIFY]->activate(); + + CTX::instance()->mesh.changed = ENT_ALL; + drawContext::global()->draw(); + Msg::StatusBar(3, false, ""); +} + +static void class_classify_cb(Fl_Widget *w, void *data) +{ + classificationEditor *e = (classificationEditor*)data; + std::map<MLine*, GEdge*, compareMLinePtr> lines; + for(GModel::eiter it = GModel::current()->firstEdge(); + it != GModel::current()->lastEdge(); ++it){ + for(unsigned int i = 0; i < (*it)->lines.size();i++) + lines[(*it)->lines[i]] = *it; } + + std::list<MTri3*> tris; + { + std::set<GFace*>::iterator it = e->faces.begin(); + while(it != e->faces.end()){ + GFace *gf = *it; + for(unsigned int i = 0; i < gf->triangles.size(); i++) + tris.push_back(new MTri3(gf->triangles[i], 0)); + gf->triangles.clear(); + ++it; + } + } + if(tris.empty()) return; + + connectTriangles(tris); + + std::map<MTriangle*, GFace*> reverse; + // color all triangles + std::list<MTri3*> ::iterator it = tris.begin(); + while(it != tris.end()){ + if(!(*it)->isDeleted()){ + discreteFace *gf = new discreteFace + (GModel::current(), GModel::current()->maxFaceNum() + 1); + recurClassify(*it, gf, lines, reverse); + GModel::current()->add(gf); + } + ++it; + } + + // color some lines + it = tris.begin(); + while(it != tris.end()){ + (*it)->setDeleted(false); + ++it; + } + + it = tris.begin(); + + // classify edges that are bound by different GFaces + std::map<std::pair<int, int>, GEdge*> newEdges; + std::set<MLine*> touched; + recurClassifyEdges(*it, reverse, lines, touched, newEdges); + + // check if new edges should not be splitted + // splitted if composed of several open or closed edges + for (std::map<std::pair<int, int>, GEdge*>::iterator it = newEdges.begin(); + it != newEdges.end() ; ++it){ + GEdge *ge = it->second; + std::list<MLine*> segments; + for (unsigned int i = 0; i < ge->lines.size(); i++){ + segments.push_back(ge->lines[i]); + } + + // for each actual GEdge + while (!segments.empty()) { + std::vector<MLine*> myLines; + std::list<MLine*>::iterator it = segments.begin(); + MVertex *vB = (*it)->getVertex(0); + MVertex *vE = (*it)->getVertex(1); + myLines.push_back(*it); + segments.erase(it); + it++; + // printf("***candidate mline %d %d of size %d \n", + // vB->getNum(), vE->getNum(), segments.size()); + + for (int i=0; i<2; i++) { + for (std::list<MLine*>::iterator it = segments.begin(); + it != segments.end(); ++it){ + MVertex *v1 = (*it)->getVertex(0); + MVertex *v2 = (*it)->getVertex(1); + // printf("mline %d %d \n", v1->getNum(), v2->getNum()); + std::list<MLine*>::iterator itp; + if (v1 == vE){ + // printf("->push back this mline \n"); + myLines.push_back(*it); + itp = it; + it++; + segments.erase(itp); + vE = v2; + i = -1; + } + else if ( v2 == vE){ + //printf("->push back this mline \n"); + myLines.push_back(*it); + itp = it; + it++; + segments.erase(itp); + vE = v1; + i = -1; + } + if (it == segments.end()) break; + } + if (vB == vE) break; + if (segments.empty()) break; + // printf("not found VB=%d vE=%d\n", vB->getNum(), vE->getNum()); + MVertex *temp = vB; + vB = vE; + vE = temp; + // printf("not found VB=%d vE=%d\n", vB->getNum(), vE->getNum()); + } + GEdge *newGe = new discreteEdge + (GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0); + newGe->lines.insert(newGe->lines.end(), myLines.begin(), myLines.end()); + GModel::current()->add(newGe); + } //end for each actual GEdge + } + + //printf("end new edge with tag \n"); + + for (std::map<std::pair<int, int>, GEdge*>::iterator it = newEdges.begin(); + it != newEdges.end(); ++it){ + GEdge *ge = it->second; + GModel::current()->remove(ge); + } + + while(it != tris.end()){ + delete *it; + ++it; + } + + // remove selected, but do not delete its elements + if(e->selected){ + GModel::current()->remove(e->selected); + e->selected->lines.clear(); + delete e->selected; + e->selected = 0; + } + e->elements.clear(); + e->edges_detected.clear(); + NoElementsSelectedMode(e); } -classificationEditor::classificationEditor() +classificationEditor::classificationEditor() : selected(0) { - op[0] = opt_mesh_lines(0, GMSH_GET, 0.); - op[1] = opt_mesh_surfaces_edges(0, GMSH_GET, 0.); - op[2] = opt_mesh_surfaces_faces(0, GMSH_GET, 0.); - op[3] = opt_mesh_line_width(0, GMSH_SET | GMSH_GET,0.); - - opt_mesh_lines(0, GMSH_SET | GMSH_GUI, 1); - opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, 0); - opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, 1); - opt_mesh_line_width(0, GMSH_SET | GMSH_GUI, 1.5); - - // construct GUI in terms of standard sizes - int BBB = (int)(1.4 * BB); // labels too long - const int width = (int)(3.5 * BBB), height = 10 * BH; - - _window = new paletteWindow - (width, height, CTX::instance()->nonModalWindows ? true : false, "Classify"); + opt_mesh_lines(0, GMSH_SET | GMSH_GUI, 1.); + + drawContext::global()->draw(); + + int BBB = (int)(1.4 * BB); + const int width = (int)(3.15 * BBB), height = (int)(9.5 * BH); + + window = new paletteWindow + (width, height, CTX::instance()->nonModalWindows ? true : false, "Reclassify"); + window->box(GMSH_WINDOW_BOX); - new Fl_Tabs(WB, WB, width - 2 * WB, height - 2 * WB); + int x = WB, y = WB; { - Fl_Group *o = new Fl_Group - (WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Edge Detection"); - edge_detec = o; + Fl_Box *b = new Fl_Box + (x, y, width, BH, "1. Select mesh elements on which to perform edge detection"); + b->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); - _buttons[CLASSBUTTON_OK] = new Fl_Button - (4*WB+2*BBB, 7*WB+6*BH, BBB, BH, "OK"); - _buttons[CLASSBUTTON_OK]->callback(class_ok_cb, this); + x += WB; + y += BH; + buttons[CLASS_BUTTON_SELECT_ELEMENTS] = new Fl_Button + (x, y, BBB, BH, "Select elements"); + buttons[CLASS_BUTTON_SELECT_ELEMENTS]->callback(class_select_elements_cb, this); + + buttons[CLASS_BUTTON_SELECT_ALL_ELEMENTS] = new Fl_Button + (x + BBB + WB, y, (int)(0.5 * BBB) - WB, BH, "All"); + buttons[CLASS_BUTTON_SELECT_ALL_ELEMENTS]->callback(class_select_all_elements_cb, this); - _buttons[CLASSBUTTON_SELECT] = new Fl_Button - (2*WB, 2*WB+1*BH, BBB, BH, "Select Elements"); - _buttons[CLASSBUTTON_SELECT]->callback(class_select_cb, this); + toggles[CLASS_TOGGLE_HIDE] = new Fl_Check_Button + (x + 1.5 * BBB + WB, y, width - 1.5 * BBB - x - 2 * WB, BH, "Hide unselected elements"); + toggles[CLASS_TOGGLE_HIDE]->type(FL_TOGGLE_BUTTON); + toggles[CLASS_TOGGLE_HIDE]->callback(class_hide_cb, this); - _togbuttons[CLASSTOGBUTTON_HIDE] = new Fl_Toggle_Button - (3*WB+BBB, 2*WB+1*BH, BBB, BH, "Hide Unselected"); - _togbuttons[CLASSTOGBUTTON_HIDE]->callback(class_hide_cb,this); - - _togbuttons[CLASSTOGBUTTON_CLOS] = new Fl_Toggle_Button - (2*WB, 4*WB+3*BH, BBB, BH, "Include Closure"); - _togbuttons[CLASSTOGBUTTON_CLOS]->callback(updateedges_cb,this); + x -= WB; + } + { + y += BH / 2; + Fl_Box* b = new Fl_Box(x, y + BH - WB, width - 2 * WB, 2); + b->box(FL_ENGRAVED_FRAME); + b->labeltype(FL_NO_LABEL); + } + { + y += BH; + Fl_Box *b = new Fl_Box + (x, y, width, BH, "2. Fine-tune edge selection"); + b->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); - _inputs[CLASSVALUE_ANGLE] = new Fl_Value_Input - (3*WB+BBB, 4*WB+3*BH, BBB, BH, "Treshold Angle"); - _inputs[CLASSVALUE_ANGLE]->value(40); - _inputs [CLASSVALUE_ANGLE]->maximum(90); - _inputs[CLASSVALUE_ANGLE]->minimum(0); - _inputs[CLASSVALUE_ANGLE]->align(FL_ALIGN_RIGHT); - _inputs[CLASSVALUE_ANGLE]->step(1); - _inputs[CLASSVALUE_ANGLE]->when(FL_WHEN_RELEASE); - _inputs[CLASSVALUE_ANGLE]->callback(updateedges_cb,this); - - _buttons[CLASSBUTTON_DEL] = new Fl_Button - (2*WB, 5*WB+4*BH, BBB, BH, "Delete Edge"); - _buttons[CLASSBUTTON_DEL]->callback(class_deleteedge_cb, this); - _buttons[CLASSBUTTON_DEL]->deactivate(); - - _buttons[CLASSBUTTON_ADD] = new Fl_Button - (2*WB, 6*WB+5*BH, BBB, BH, "Save Selection"); - _buttons[CLASSBUTTON_ADD]->callback(class_save_cb, this); - _buttons[CLASSBUTTON_ADD]->deactivate(); - - _buttons[CLASSBUTTON_CLEAR] = new Fl_Button - (2*WB, 7*WB+6*BH, BBB, BH, "Clear Selection"); - _buttons[CLASSBUTTON_CLEAR]->callback(class_clear_cb, this); - _buttons[CLASSBUTTON_CLEAR]->deactivate(); - o->end(); + x += WB; + y += BH; + inputs[CLASS_VALUE_ANGLE] = new Fl_Value_Input + (x, y, 2 * BBB / 3, BH, "Threshold angle"); + inputs[CLASS_VALUE_ANGLE]->value(40); + inputs[CLASS_VALUE_ANGLE]->maximum(180); + inputs[CLASS_VALUE_ANGLE]->minimum(0); + inputs[CLASS_VALUE_ANGLE]->align(FL_ALIGN_RIGHT); + inputs[CLASS_VALUE_ANGLE]->step(1); + inputs[CLASS_VALUE_ANGLE]->when(FL_WHEN_RELEASE); + inputs[CLASS_VALUE_ANGLE]->callback(update_edges_cb, this); + + toggles[CLASS_TOGGLE_SHOW_ONLY_EDGES] = new Fl_Check_Button + (x + 1.5 * BBB + WB, y, width - x - 1.5 * BBB - 2 * WB, BH, "Show only edges"); + toggles[CLASS_TOGGLE_SHOW_ONLY_EDGES]->type(FL_TOGGLE_BUTTON); + toggles[CLASS_TOGGLE_SHOW_ONLY_EDGES]->callback(show_only_edges_cb, this); + + y += BH; + toggles[CLASS_TOGGLE_BOUNDARY] = new Fl_Check_Button + (x, y, width - x - 2 * WB, BH, "Include edges on boundary (closure)"); + toggles[CLASS_TOGGLE_BOUNDARY]->type(FL_TOGGLE_BUTTON); + toggles[CLASS_TOGGLE_BOUNDARY]->callback(update_edges_cb, this); + + y += BH; + buttons[CLASS_BUTTON_DELETE_FROM_SELECTION] = new Fl_Button + (x, y, 1.5 * BBB, BH, "Delete edges from selection"); + buttons[CLASS_BUTTON_DELETE_FROM_SELECTION]->callback(class_delete_edge_cb, this); + buttons[CLASS_BUTTON_DELETE_FROM_SELECTION]->deactivate(); + + buttons[CLASS_BUTTON_RESET_SELECTION] = new Fl_Button + (x + 1.5 * BBB + WB, y, BBB, BH, "Reset selection"); + buttons[CLASS_BUTTON_RESET_SELECTION]->callback(class_reset_selection_cb, this); + buttons[CLASS_BUTTON_RESET_SELECTION]->deactivate(); + + x -= WB; } { - Fl_Group *o = new Fl_Group - (WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Face Colouring"); - face_color = o; - o->deactivate(); - o->hide(); - _buttons[CLASSBUTTON_SELFAC] = new Fl_Button - (2*WB, 2*WB+1*BH, BBB, BH, "Select Model Face"); - _buttons[CLASSBUTTON_SELFAC]->callback(class_selectgface_cb, this); - _buttons[CLASSBUTTON_COLOR] = new Fl_Button - (2*WB, 3*WB+2*BH, BBB, BH, "Classify Mesh Faces"); - _buttons[CLASSBUTTON_COLOR]->callback(class_color_cb, this); - o->end(); + y += BH / 2; + Fl_Box* b = new Fl_Box(x, y + BH - WB, width - 2 * WB, 2); + b->box(FL_ENGRAVED_FRAME); + b->labeltype(FL_NO_LABEL); } { - Fl_Group *o = new Fl_Group - (WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Reparametrize Surfaces"); - reverse_eng = o; - o->hide(); - o->deactivate(); - o->end(); + y += BH; + Fl_Box *b = new Fl_Box + (x, y, width, BH, "3. Reclassify surfaces using selected edges"); + b->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); + + x += WB; + y += BH; + + buttons[CLASS_BUTTON_SELECT_SURFACES] = new Fl_Button + (x, y, BBB, BH, "Select surfaces"); + buttons[CLASS_BUTTON_SELECT_SURFACES]->callback(class_select_surfaces_cb, this); + + buttons[CLASS_BUTTON_SELECT_ALL_SURFACES] = new Fl_Button + (x + BBB + WB, y, (int)(0.5 * BBB) - WB, BH, "All"); + buttons[CLASS_BUTTON_SELECT_ALL_SURFACES]->callback(class_select_all_surfaces_cb, this); + + buttons[CLASS_BUTTON_CLASSIFY] = new Fl_Button + (x + 1.5 * BBB + WB, y, BBB, BH, "Reclassify"); + buttons[CLASS_BUTTON_CLASSIFY]->callback(class_classify_cb, this); + buttons[CLASS_BUTTON_CLASSIFY]->deactivate(); + + x -= WB; } - NoElementsSelectedMode(this); - // allocate detected edges - // temporary for the selection - // saved for the ones that have been saved by the user - // and that will be used for next step + window->end(); + window->hotspot(window); - temporary = new discreteEdge(GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0); - GModel::current()->add(temporary); - saved = new discreteEdge(GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0); - GModel::current()->add(saved); - - _window->end(); - _window->hotspot(_window); - _window->size_range(width, (int)(0.85 * height)); + NoElementsSelectedMode(this); } void mesh_classify_cb(Fl_Widget* w, void* data) { // create the (static) editor static classificationEditor *editor = 0; - if(!editor){ - editor = new classificationEditor(); - } + if(!editor) editor = new classificationEditor(); editor->show(); } diff --git a/Fltk/classificationEditor.h b/Fltk/classificationEditor.h index 55ba72a2db..4bd2b2711b 100644 --- a/Fltk/classificationEditor.h +++ b/Fltk/classificationEditor.h @@ -7,24 +7,26 @@ #define _CLASSIFICATION_EDITOR_H_ #include <vector> -#include <FL/Fl_Toggle_Button.H> -#include <FL/Fl_Round_Button.H> #include <FL/Fl_Window.H> +#include <FL/Fl_Check_Button.H> #include <FL/Fl_Value_Input.H> #include "GModel.h" #include "MElement.h" #include "ColorTable.h" -#define CLASSBUTTON_SELECT 0 -#define CLASSBUTTON_DEL 1 -#define CLASSBUTTON_ADD 2 -#define CLASSBUTTON_CLEAR 3 -#define CLASSBUTTON_OK 4 -#define CLASSBUTTON_COLOR 5 -#define CLASSBUTTON_SELFAC 6 -#define CLASSTOGBUTTON_HIDE 0 -#define CLASSTOGBUTTON_CLOS 1 -#define CLASSVALUE_ANGLE 0 +#define CLASS_BUTTON_SELECT_ELEMENTS 0 +#define CLASS_BUTTON_SELECT_ALL_ELEMENTS 1 +#define CLASS_BUTTON_DELETE_FROM_SELECTION 2 +#define CLASS_BUTTON_RESET_SELECTION 3 +#define CLASS_BUTTON_SELECT_SURFACES 4 +#define CLASS_BUTTON_SELECT_ALL_SURFACES 5 +#define CLASS_BUTTON_CLASSIFY 6 + +#define CLASS_TOGGLE_HIDE 0 +#define CLASS_TOGGLE_BOUNDARY 1 +#define CLASS_TOGGLE_SHOW_ONLY_EDGES 2 + +#define CLASS_VALUE_ANGLE 0 class edge_angle { public : @@ -40,21 +42,16 @@ class edge_angle { class classificationEditor { public: double op[10]; - std::vector<MTriangle*> _elements; - std::set<GFace*> _faces; - Fl_Window *_window; - Fl_Button *_buttons[10]; - Fl_Toggle_Button *_togbuttons[10]; - Fl_Value_Input *_inputs[10]; - GEdge *temporary; - GEdge *saved; - std::list<GFace *> tempFaces; - std::vector<edge_angle> edges_detected; - std::vector<edge_angle> edges_lonly; + std::vector<MTriangle*> elements; + std::set<GFace*> faces; + Fl_Window *window; + Fl_Button *buttons[10]; + Fl_Check_Button *toggles[10]; + Fl_Value_Input *inputs[10]; + GEdge *selected, *saved; + std::vector<edge_angle> edges_detected, edges_lonly; classificationEditor(); - void show(){ _window->show(); } - std::vector<MTriangle*> &getElements() { return _elements; } - Fl_Group *edge_detec, *face_color, *reverse_eng; + void show(){ window->show(); } }; void mesh_classify_cb(Fl_Widget* w, void* data); diff --git a/benchmarks/extrude/sphere_boundary_layer.geo b/benchmarks/extrude/sphere_boundary_layer.geo index dc79a3ccac..e8498a641f 100644 --- a/benchmarks/extrude/sphere_boundary_layer.geo +++ b/benchmarks/extrude/sphere_boundary_layer.geo @@ -1,4 +1,4 @@ -lc = .2; +lc = 1; Point(1) = {0.0,0.0,0.0,lc}; Point(2) = {1,0.0,0.0,lc}; @@ -37,9 +37,12 @@ Ruled Surface(26) = {25}; Line Loop(27) = {-4,12,-6}; Ruled Surface(28) = {27}; -Extrude { - Surface{14:28:2}; Layers{10, 0.2}; // Recombine; -} +old = Geometry.ExtrudeReturnLateralEntities; +Geometry.ExtrudeReturnLateralEntities = 0; +tmp[] = Extrude { + Surface{14:28:2}; Layers{5, 0.2}; Recombine; // 14:28:2 means itterate from 14 to 28 by steps of 2 +}; +Geometry.ExtrudeReturnLateralEntities = old; Point(100) = {-1.5,-1.5,-1.5, lc}; Point(101) = {-1.5,1.5,-1.5, lc}; @@ -74,10 +77,11 @@ Plane Surface(186) = {185}; Line Loop(187) = {172, 173, 174, 167}; Plane Surface(188) = {187}; -Surface Loop(1000) = {20, 22, 18, 14, 26, 16, 24, 28}; -Surface Loop(1001) = {45, 96, 113, 79, 62, 130, 147, 164}; -Surface Loop(1002) = {188, 186, 184, 180, 178, 182}; -Volume(1000) = {1000}; // inside -Volume(1001) = {1002, 1001}; // outside +Surface Loop(1000) = {14:28:2}; // the sphere (only need for internal mesh) +Surface Loop(1001) = {tmp[{0:14:2}]}; // The outside of the BL +Surface Loop(1002) = {188, 186, 184, 180, 178, 182}; // the box (entire farfield surface loop) + +//Volume(1000) = {1000}; /// inside the sphere +Volume(1001) = {1002, 1001}; /// FarField Mesh.Algorithm3D = 4; diff --git a/benchmarks/stl/coupe_geom.stl.gz b/benchmarks/stl/coupe_geom.stl.gz index ae299fdde2d37645c8dce300fd4075242009c319..ec014157e439ba7cfe120432d23cb73a5be82e26 100644 GIT binary patch literal 21752 zcmb2|=HT#T?)7G1PR=haNR3ZV&Ck^<F3DlITYI`s*E;X%o%q7%$L?Ne7FxNI*Wc#j z5&MKKs~MTEu4{Xn_vN{{r1h7MGbebu7M>_RZMter@W%3tT(3uul0Vx2|Ma~6_x1b# zUcUeLQU2e*`Tw77zyI&~{y+Wpf3N5N|2O^rkNE$ep5L$2*Y~m$`1`W_`JeoMt$Il% z@Aud7uNO!<pis|N_htM2f1m3Az4rhA@%H@xpQiuc`}gPV{Quwm|9_0H|5d;L@4I-t zACn&V*K7M93-9~m8Tha0Q~wJuuFBsxy4i*IGkjsM<rKX9?fG+d&JA`i;_`l<|Cdnl zv!&s%`M;O<|CiS1{>ztUo4;W}xZjlGs`YYls=H$z^|{tDx^XNy&=hy^`IOJUV~y(l zbT)2LZ4DB5$kW}=zet(q!n7wEi9fiyB?ZJ2C(b+as4w<R#3H8dGuaI?-(nlr`?&0Q zFY(jr-w%_TN7Eyggm>sYz3axUuj#NV|CqF3?T4MozrHrxITqY_!(?37cyx*5U(<xd zd&-litvH~xuc=?IT<4Uw*z?$&h?WT@5kJE9j=KJ@6K9(!?!Wu*sqD$gN6v5f@g;#r z?+W|l(;wwDAM$j2Hvh^#aA=Ran(jv_?tRrvQ=V*3|H0hdKhvvy(TDjTrMlj7b@xdL zSz1k(5^`X?CtkXvLa%}Om0RPv_uYHbeWMhTe)4hrml62()-bc>y2lCKBXuHI?+PlZ zKDQFmTe^MvS6iW%Q!k3=EIZZarME@-Oywa7KfTM3i@#{qOn-jio15Md`4XlhOEfbJ zJMs=NdRabVIR7x=uGD0)ieBfskD{meeD=C3R(%p}SF-Q;Uhy{eqPAm-_};k8nsp+t z*7=FZzdf__*AJNwnX+D++3j`)e^R&bxiwL${SPnSIs5kJ(s-X+^B?`XlOge@?qz<_ zKZT>;wKsoNeYD&Aac=#W+Qz+#{H2wO$C$K)%nsj^Q%G!`e!qkLgIsHtLZ^Sv1W}Kg zFW-zdSqr>ob4$7Z{)<q|vG8}7`B;Uz_9nU|NiP0>k7Mc_WoM1v;*<`}t7{(>_pOxB zXn&r4_icGi#YfvCa&MT}KYAWp=+GqRk`$TnxLP{o67K`&{TF-RBz|A;gIRGyeVf=e z!5<0z`G<M+?f%BLu<|`>PFbuZxX<y>k=;`~)^umqWH(!Fn#gv|^$oMbZK;!u{aoEY zp1k}R+IJ=4LHQz(dY{L<%op?<6BAV)M}NL7$jh<uZP$a?f(vD>KYnITOTW;)>HAgx zG-=+>7dgQ?i`C0BkM%YEXJc(Oln9Iv+yCR*w-Om;3-{h+3!NJ>x$-KLYIzT-pL!xR zHRQhGXH$;!@MltKn;H@|0s@XK>Csrz6<w2G88u5ZD`wJpXFILn?o{?|9x^^bzMFr9 zJPv>Pj%WXpQ%mP9NcUf|E5=s7u|7;Z_VMhvML(pb|9WwKskm$0;XM9{ncAVRD>^3M zSthn$qCK?cZ#8p>Q1^^I>!S}IjZvQT=i{3|g|oprHB&=YNNEX2_#EOFiCZ#t!kuTL z)_e~en&k^M-Z{!#bJ1P*#{Z<&joMr5x$VArADA2Xk^NKB1x>xP{CTn;PbJ^e4dyGi z%k_WUbNa@K*r33|6YMgl7}<MmBMKvgH|^MDpQ@(*&ZX~ub9{6E*{TdS@t}|iXBMZc zKMd=*5a5y8{Z~uIQ(JQ9NzHo-du*TSJIq)XmL(w8s<qC?|G1{j&N3s0_?bK3bIe!t zH`cCEWcV4vJ0;0WGu~=anO4!{pg%!8(^@pvz43F^sQGxc@|=E=-Ly8w|IBBFxhnbh ztzHoqbKsu%oWu<+?RTCFTeH<2V91L4UdS_zMSa~Gztbyiws0MCxN>OX869Qm<xDO7 zdbt&@3Cmeu7X^J22zcz|U$BwgLNx9EHwLwBZ6W`=g18s1DEsl?G~@kGGh$X9J9yn* zto41ybA|0YkLVvu<h9&y<e)m8Bf>lTCwpRAp!3E(4F4)Ov9&MOpZ@b;Ov9^hr4MSX zN+qrpOkj<9B>s4Vnp<INy_eoY!Dx<iA1&i0!|Gan6kqe5y14N4o4f$Ozv1VC&J^Ak ztm*R(kvYZKUUR_lq3z7V2;s#$HrdP0eGuMaKG$KJKF5`q&Nmy~)YM<F>{hVcsDAz0 zGl`d*g|?gOJh7Wy(fr^qV~ar(L)VVUf-SBOJGCzdf9l-uJn6~j8~I;&S<mxHYh3!} zeqQfm)}Hn3vdK&jUcOln?d1IKbEhn`Re}J&gwOL;S0r>gePV9T?eqU&-BxA3Nm#Tj zJ~R8^hplQkP5uor$q}1%|1=Bjyv+1d)#QoY{2xmtbU3|ZBIiyEK6>F*%FlHV&sWG# ziaW%6H1kzWpPsJ0$D5kpzb02rXT5oQ-G|4Ot2P~<^>cS|Sx`Vga-N~PsDOLC-Ut1Y z;oRG1&&j`4Q{}kkp#t{~q!9L4C&trU!5<K`SG6M5F#D5`d%WI0j>`0{m*syv<L}xh zsm&gFK($QfLj&_43BK$kk??QJbFG=Oawhp64n5x)ckc6g<MS(j>`FL%M7I4<!88YM znS;-FxExiKD`;Tm`~1_&7OH7Y-R<2Mm<}Jf=GLL>GvC<ls9|NvYl+qXr}GCLJ0mZu zCZ#HVzj;Kug@;|>6JtxJ-%_^3z=}twzLeA`S>=?g+;`f!B}jhXzOH8}7FA^*TP>H) zny@@P!ROS>ME!+|-+#6+HNRYEY|7@XBphB=-pja;X=&IiwdYHoynE&QvSGh>BV#?+ z=1I5y9he_9;iqdXPki~L-+Ld0JUn`Q=J|b5tp6DdW5apfR(dh%d^Ifl|M$+u6LY%G z|9@xd`7}Lep_;gGgHo;i_pt1hH){Qk&KD@syPK}2*_%6a_k*9)el3*fuHrr$IrkXf z61m%3XSJT`UZ>M^b|UXWjdjOWs~vOgR=;h?cPKMjd9~!{qlIEEn+lW4W_@0;=SS74 zg@Frn)@g?<E^9Qu5&8JR$Bi1I%TxQ!xRqG7t#@s1{r5mZhtvPAz3}&_2ebMb#dptp zBY9QA+iz0GjJ}O0m^Msl%Te)Ku5qXHtc_r@=T-d=Zz=_UcZiDB>57}kygKprl(yH6 zErFkXH0K`U7eA^Zc0|mtP{Y3M@T`QpQyI0AxdV#7NYDPT_M|}N^1#2@YTF*fGhPf_ zvEsu^fpeu%*N#9mG{_%L^gZ+G)W0noS*NdjG+~LaTy(~)e&rySC-$NSMuJB~Ud6wu z-DxiWBj)u!CAC8PZ2^TE>@uJFA8t@ft4yswWfb96ZPsMz>mwJ{9hsIU$otAnK%+hE z;PDR^eqZ^u&Gnqr)E)A%70m(3I@TNy8JZ4N8Z>Rth^b7ix~^d`nPqyG?Vjh#S=x?w zlzo%ZT?I3{)-(AWDz5F<IGeb19h)on(^(Q5V!cl$ul&8xL2cJM#;36|vo4?QPhH}( z*-*?br~ICZxT#wF>O+#u`|R(O%z620?X|YFcgG`c{PWh@`PDZy?bgcjxo!&<?a-Xw z5_@%a#<^D^We+CCyq;KiX3>UJr5PpazViPj?Ok9t|7zKRH*@xOPgo_p;Dq*8tMya% zyvnjTCVr^w^)#{g3F3BJnUf=u^0-$To=|2xDsM2O&wQ0(gwVQu^=f&d^8+4p=Nzq3 zN)p~J#3&qe<x@&omIlMMy$>dGMr85vGtWFXsmJ|Ai(c^RZuff~5r=L*{qb?*9Oo4m zc|@k3e3bT9fxW5Ck@HQuDbI!meXjh%cWbZBI$vvj!)v+Gma^9|3y$7<`Lxz+me&W> z^2N98XKc2bDm!8Moe*&^PSaa@`xi_x*L;(3F)m=%`7G-j)h;pDJ9YO+?633;?D|w& zxa!}d<TcGJc|Xma9ktxi<=bx2i`!Oe+!c;hTDv)HTEm$GhorlX#51hesbYVjrt;z; z^}P2o=MJ`CR$bfauiIffS5a`WwZg*A1G6SZ2=Cgv#VNPjWyO|<<(Bi3s;*nQ-CXf! zwnWR`AFi%-Tg`Z;Pft(l=t}4`_1LO#<BQuOO|N{9mMjr#q0e3{!X9flljEZnZu3_P zYrbP=XmR~YiQ@D%Sxc-o)%~1&cT$xwm-DF)cCYsH8%HRIepmJr?W}N6dc@fI)9eqY z%C#e#^w$Q6mOrX4zV16IZ|0;j%h|pOl0UQNt$X|M_RLQC)}Z2ezCV_H*^ffMKlW>C z@=l$ud}CXj=F-<b&tEj1o4euWVfH_Jc6iHKKjz>`+f(<BtNg00luMh!-t+D=yC*Da zUUoU4>&lNm5e4^p9@MI+h-gk)@>`Ix#$`#GVo`U(l9#{w?$2D~mMO4iN^9?#!=)k* z%N5NXmU_Foi2Kj{Zg}tW?vldG_q2Y7z1N<&%**DU#TB6lORbyEy=z$}{djQXrG-en zPg4GhEzR7<!F}16RN3RYG`DiNJdFPvQdBEc&dWEke{sZL4z<1KQs>XIoiJT|=Fx|* zzDM@n=aRW07v(Lx-~Q88QE47K72oL(k1NTTDX*C_ZEdtx(YnedvzpfPoz0UlQP<n! zB4qk)vEoswDHTUV*0>**dA3THk?)(L%<bi$^Zj{QPX=pLEH`x6%eLpYLW}sv+?mnK zS>jE8|B$NeJu?68Gk^ETD;KckpL-kB+`!Cn^f)s|S4ppEi|Wk#ta69joP<N3FWwe# zOMKtK3C>?W8?5mEW%^<5VMceEq;u>tB7$DpeAzorEahLv9rpR-rMy!YT(qCm@Gwjf z;X7;?aC$!H8MmOnJ`N`e+L{daS(hKoGW?*-W_d)gdCdp09tj=K7x(uo-J5&fbfWZ( z*OS}(7+cp&{9~Q;;rFz!T{q_NY0Q>*KUGm;V>MgLmt+N<LUVmv-BdZ_CsNa%Za$f+ z@q1>2Q*HM%AB(ialmMpcCp(v_OpLLcy5Q%BIWF?vZw?ndnPK;K=`WVu`VTT*FmTr# zKmRyj^Yna~AU$@OWs_%C$*5ibe6={*HUH(OT@w#H{PVG6-!11S;cA~QY-?395D~oT z`r0sWIqUDF;|KdK5-cAjSjtVYSd$pSed24IGv9@8u8f&S^DSCJObTCmTF3U@H<J0# z(Cn?uw<O_4n2Z?f+jUK$w`|ORNVWRtOXh_w_N%+Se$|tA?L5lXmz8WUNwv<2Ii?*n z*<XE^_cz<xqu)GMex0Y->M`r2iM&vDWAEv!*8&ySvlhoqoLFtN|M%&Q5g`_ZnVqM2 z^503uebY5w^jew0^>tcZ(*~D6H}&5{#nrG{1a$Dt2tKSGwC8!m1IF&3a+5iA#6l;= zL@hEp$t_?drtw%l+IMfyk}Et}KW9v83g=q5WZHRgyVfo_#^SOH$7$cWb^e@B+_+-G zlS@LSbHzGW1*^7+DO`)#*RotDL#SH*kn0DgW!u*+{ouGPeEv_dYa#E~m}WLsd_K$P z@=sGCZ0f`qsfBv;AIIiyzsYuO)BpQTVT)cYczNdcgMTOYTo-XJ{=ek@CXE+Utd3hs zDqh_hyI?)<pFIpkS3(X}OrE6e=;$u)nzuGoAY5!k&OuGyb`8ZRFQU&`Z~h&>Ox^fJ z`7!qD1dCXo8yVd`Pi;c2W^S<;<(p`0nPtHenE2{%grk?#{M+K)Z(i)PeG-09DElzu zehyFOpz!doOJ+U#tQq5~#JuZ&r_pTnx$i#npJ!dRQLp6bY!R+`tDY`g@_6O6m)tLt zCOP;9cRxA({P6VBfb(Sm7sFO;tDZh{zpnr5+8Ko#+J0YadD|p^ie1zBj=x)=yR*rX zvNI1kvwhF}{rvFmq@cEHVP|jV{H<F(7xSdq%D?%Ybn0J;t|Tkl|AU{8ntpj^p(Ev5 z^?F}Kio5q4Mb#sH%!z9zXFp+2-0rpb$UnyR6I-Sx<@~<GzT*FmV{&qb7Mgu~Z?WLF zri|Fnh2eGWW;HjLDSn!NMq^X<&WeQB7c7G0o821cf3e$Ero?$|zEYv~yPpm}jFNSy z3vubK{HVtM*ib!m#w+IqEI*PLF4H%6%=UO5^m}zuEw@uydc+hx<!y-zIfG|zj1cAD zzsV)_#JbaNAEgdGyAk$W$YphXoy(G%oKF#^Q*Yk(KJ!GRSmVvceXNSsykegh$Et0J zm@2&kr03kzh`By-K_3`r1qaUIpVjoZ|Dw=7^G%C?Eqb(M<MUrfWtN+6-1l2?cbBV0 z(nS7<GpCLG6E<p@7o>LXS|MBiXrA=*^ZxgOuVy|oXMAsJe8avV#qH42kkx8SnVNS# z+Ip$o_Ex!l#&<TQ$ATRN3`tS5Bl(YP+Hzp3;HpC=3#XLLKE<K4OeR-niqB8p%bWJ( zteO|oQ1<O<Zo#qI?H@00nEOD0-(rIO0|Q<D1;-Nu-5#7`3jLzYqLi~;BRF_^^y!z& zByHkT)0WC#`|wos-F1r(OhJChp@E%(v$xncdCyvOcyYjr12ZRPg$Pybe>UO#n}>&s zZ);p_%3Z<exye=V*{(ye!rM;QoaI@YbLn1`^-Qyw_ZF<&w)q{mcHQa18>=&m*3asw zX$`pi{7JX43HwubA%$B$ov$j?&r9npynNxJrrd8AQ{S~_Q%yINCY|lecRCcBoYK{l ztMuf-E|!gtZ|Ali|D(eC`)S0QuKbwDMcbN|oZayw_MOlQXT2xsnyfrpOL=;`7l{Vf z$0g19^s-}q=$%|f*2@VCH*y<`txmEHpSEJH!opX+8>b5`iP&Q)>T`a}!adF3wYRFb z21zGQh;cX@B5Ym0+y7vlEmV1O;?3(~ZEIWZ1d47vdr5sZ&&r~g%k@NNuV?8Lns@YZ z*v9R@RdU!5)v~uJ?a5|Mik$KM6h~<&^MuuZ_V4L@-n_|IzO*m$q7Cn1@t==2?(W?; zr~Q%G#qGaMe3}p2=!QSupmC@;wNdMr;4YWBQ@GflDd*;Kxh{0QY@(AZEL!$bWu=AR znXK~#8!q)fEh#z9STD%eeaJfe+w!G}cGteFs8{{+Ae!5D^5qTj8k0?Y*d(0JPq#i4 zs8+#SU+uIvf4c9D9hE|@&(*%YY6{AK-h6nvYquct71fRRB_3s(6p5xsI@s1(imk5r zJ5^O{rTd91`uv4zMX%R?U|40CEHAt7kQtYeL{0iM!(~x|-vmIa%XAKvM@VGMkn0XL z?9=uR3F5!MEOpQJGwU9zM+E3>JyqXT<*~E0VBy)vXLB|^?dIH*ZE?ExRp3UA`-z73 z4#`YVZEA-#-c2?A)VQ(bMwhot^?$Z+ipOVZtTR_pGVXe9Il1gw(fpb{jVrR0MLDb( z4D~Zsuq8!SJU+!y`sMKN3#ti|k4J2F_}JR9K#=GE73saaD><)*q_QN1eZ6oi<8<w> zkH-#9SLXZKaM*@7`0)mfO@*KUW;F6jIj*>WQcB~kiq0oDt_D8%&{${C%kd{Z=qRIs z!LI8jXS|}{UGC2<(|qv2*JZ_HW|vua!q2`)fAdhd&S?LRtTIkfEj`T-yAQ=SH~VO> zaV`JTsG4@mecHa`y((ubcDW`>S=W^pPPjR>Girw0tmQxdz5RATd~;g7OnZ3V6V(<y zuQt^OnHS$Ke_oNhuFvZE*A2Pz!gzh&Ew{G;MQQdMMQ52+nRBwcJpZ}wky!pg!S12M zJ=F}06E0sb7Z(ZEoh~?#U+|%;_)^#5Mb*z<)m&{`&Ga==_{5XC{Yp=ka2f8&pM0}m zsz?X#U9Ov31KqiqWBt#Ro!xnTlE|`ssVgq@TL0g}@L1UR+2ws@i*qN6pU;z;yEZen z<ayZyH)gjgk)Be;3*5;eZJ7$@hYsHNbJ@x>aeu$Pon(nc*95f{Z*!xK_3rz;%L!b~ zWW)W)WWQWbsNh5I>=3uCMaLb#uiIgDETBcw`O?CVGgVIi`I&d5X4cfe{PNnK=XEQd z@iQD-wcx{2(^rp71MY2>-Cp7Q@zUNK2LytQZ2yLCI8pdr>|Vr^p2gR<*<2{LkNfPF z#PM*h!a|SPvnNJ~3GFj+i9O>sYxiw2&WTxT*Cjj*I`ne}Z#_?kLz!`Sq0ix)4|i(Z zD7Me|%%-$UkVE4s!;u;RfBqwj8a^x))jDkE>p4R|WZ#kvTezq4E3MC*|Hp;jNPhdq zm%$6C$9&-wxVGW!5>?H@g63q#m0rue8mxD2;+|gfzIc}IBjW}U?$YBMJGc(dTyNF6 zN3S8YZ0d#YE`0uHA17UUR(s{cCRfIH)*Sa(l9FFVJWu(oDl40i+3b|6p{!NZG=D}_ zW7F@B=!qUq^Z!atk2v<>y-_JI-?S6GLhY#&@2Y-#(0-zqrD(%h#VHH&Lkhl}x0o{H z6_5JMn`vf+yDm>>{K4$7=d`yRQ_{`U;=*IAqT^qQygZwl9KKh(R<&z}$;K}KM&<>% zqF)#B@A>NQdgT4l{c;y4>F#x1$I!FbTIhGAW1`gjlSOVE>-4quh;MC3vzOW(_;4X- z(XEdW5^{SDJaeD3Z&}SU^RI)?%C~ZvNn3h&buXnnTm5cn&eInkLXvA!pFFQ)aBpo- zT=0fPj$8SdxY^3L44$O|JC77>dT*IJ(~%`~UyWIZ@Qt-SXQwnTNi>z^DL-VteX)gT z{|8;UZ40J}^-oQF{605G{Iq9sNcR$nwfWPZEZC(w`Jjw{$CZm7jRma#>x^c6W@COa zy>X*S&Y!)OTDzSNDRhe3Y_5D^?b_w}+|@Mo&h+n7b3Ha&CbxD~{j=V<V7K91S?>S3 zVqB*Uk~bRU{MoDf>XFsbV$m8#hOOLcn;$0jaPhw}E`P9i&9%oJ#!tA~HgmZYC!}9n zFvW14&9`td_I0Oo^B$XtZtuLQXBS*KJ>$CAT?zKxQ<ncq*!*JkqL@v$?8?O?xZen| z&8t`Oy?tR<#16?Lw<B_D<`r;!5b;^t&vE0W#&3b1NGEyDn)NqRjbuDUUu|+{dS_I{ zE4EFeU#Ppa@qudD#5TLX2i!Oh%N=}Vn)6mz?8N-b+y0v6vHK+-<aUf{as9`~efEs2 zvDj<91>Mf!vAay~$aKnHyi%;L=-_g+vG9^4o2B5^a_$=2$$D!Hh4rf!RjfX}k%{@; zqSuZNGjFWv%Bsoh=rY_kpR3}e-aP%R#F`g%Q{0=|)7IZPkeq1o^^nTcz<D=VH!m@< zQ-8C`!sqb>o<RMYsYk9iW`Afn{CU~ysUH{q4xA_3|3Owx>fwLs3Y~8K_*+YiP946o z_17X5qaQbxeR19SDe&slUyWgxS0_l@?wUB)hjZTxt2i<FU9wMCRy<Lbd)m={%<c_T z>!v2nU-znyub;GP&#V%&9TOILG9PtpVeA!HY(IH>q@?05>F1Tr4?jd3_?)uvGPu?{ zP5*4*%@+4{^JNZ%=gO6Jo!9dG<A2wU!@<sU@l(-VC1&n9i5)NUmOP)HyisdaO=kBh zkN)($YqKw$_!(g(_Q&6p!%X;VmA`cUxqv6}vkzJxJ|y#Urm2RhSltn(sQP>S2^+PR z)MR!>J$ts${4UF)dHIt!h)1tU{FGbax*+QKuGk5xQx;qaoAaQ?|HP4$`{rzF+j_73 z>j|=66L{?Z5)BU4$*=80yWZT_RAoIY^V}}j^0@MU6}i(+Ow-j?rfB^sE#3X0|L~Ee zPj9$z&Yrm@v#6=x==0jQIhyypq%s|?k4GL1`NvS9(>*cf){;ppD~`-_EvQj9QJNmF zw0<(Lu*kND<(6Nyo5MZgBmXM(ZEjc@VslEczvhUua&h+Y<j9^Um()sAT6;J0O`V`3 z%<^iU$G3>X%ZyW6V`t2<`8t0N@AnwNbjj0^2SV>9RMfL5%N%H^<dw9QczsBD`m>5& zw)u8@f}>VW@8Ng2{)zKt=#ALxA=B$6o@r*D4T-9hkFNisIsfk=`8nSI+`jCayZD5O z+0)B;TffGwJae2?>QUpLkBZ-emDMsGf9zyvzqcgqV)(|0eeFU0qQ^ZBe!nT5qZa!5 zlY7J(xg%dA_T2R1+3VZwpYmbrBTu#xr;9v`f4-2~r@qGNZ=-Vj-<r<XDo@fY&Iwm8 zyY%cx-rnZizAZ=gCG}}p*!4bE`gTj;w|={&>fEATSJ%fsoco{gLxfwizHiXWx$4(d z!W{HsGJ0e7^vqeD=5*HGUt=Ff<?*k|jb2=F=BWo>U0?s<Txdnco?>gc(~p>@o2`61 zf&EoU@5aKnc?+k1{u3<u$tOrun2WE`|KEAJA2p}e$3K|+U+_bOnD~w@o>QCo?p-z9 zbZAX?`O5T%GG4ORwn!hF=TWj}#b5uIThj`r?MmeT@myMBV%9v*HfzVcO0~A>E7y3L z-prAn|7@ONPT~oVX%qfrK7Oq8Z`EXz9}n)?Roq$iC`HfBoVShb#D(dJ{lzm1V;I=y zAGKTBxaR5F150<lnZcB$_Ney5jL9oDGEQM*6LPcqeDUm({Id3y8#&x{{xEW{PxzXq z6L!=sEN60g>>Y#j>HSY)1FIivFWQ@aa@~P$4)2%3-!(ci?r?4YRJd=F*IkKu+jXAa znXUNq>>M}l&x`d#Zdm-d<8k)Hp8HAa+<R8I|NU&wAa}as!%|PJzs2_+i}G^{{JQs7 zLr5ki=<}!b4KFlID$K4*_kNmmcXRy1`STw$+IJq`bmG8L->kpI*Jl|W($1AqvXwf* zKJAmm-+)cbL09E(&F@R9xb7GKL3DTe{sZ>^nfkv>uF&b`iMh38*NlZ>e}057+~9rL z<tNiO>p81>zEo^ctrO7vDq~?e@l9-@nqAzf3tb+Sf-js`Bp7ThZ3sM^+W&jT{a~lh zrQzOA{pAg64axhbgvIElXY64<Zr^fDi~rpvsjZQ}12%6`nO9b^TlVAIMd}6}JRepD zx+HCUpJ2!3zjev=yYAX~Q;kjTJz2ZhFuupW@t9Wrw@Xr`;a)99eM!Dgg2cU9I!>OC z*Zi|U`0CMPH8B%4gS(`!)rqg&5ol(S^!31meDf0*xYsLAd9~g?McUouhdz`4(&k3h z{nNkL_Duh=dIJMjru?0~FKaBd?iwi_Tj6<1ulU?qjdcvlo0Z>OxPJb`dWU^2d6KFh z^_O}FcK>_9mnE2MJ3Xe_`2D78Zu>gEB;ND6E6?ll-{Ent;u38u+`Iov!VYDLr^gRO zJUg$ysVCskJ)tw#JxdbvbE}dSKg%xLC}3Fg;^@)a-A~KqK1LrlNZ!HMDdMi;wz@*1 zGc^3d(}k;3)i$jDxRL+4)19q958Znr{kTTv!u}v1&8q^bPvotwc#UT+HtEke^mCaw zr)9t^UTY7>@_w1Q^ACJ`Vsp(_U-84E&s^(YdiwvFp1iT+Rb14fOZ?|`BlNm9yb-_h zfN!5eR;|g>Meh2Hap!&;UHS1bbgGH-?X!G;xXf#gFOu1CK>kRQ;OqTcTvDfS&svgJ zk*K%VEP(C*$CFm)JsRRwr(E$2PrQ8D<AVQ>2b0;B9#@jx@WH<0sM4wW%+6cZTUT;@ z`0DrO_Ln<SE+?c8&f`~)e89f9|8JZ2!S)YF1AKp{{y8vrmf=_1Nk5*y{oZkWPRR44 zh2NW0^1W9r)4OGUbMEwZ{ap=Vca-<bbi4Z9TB@q`e&W0awwJDXaVty`7qRz-d~d(2 zEqWv9{l#_74g!l8wI8ZsT)V^FZ({?qn2ElTVdGJy_OF+Orhe}@y;Y|<{KzuayVoBn z+fMme%@S{Coz>`5RcZI^kNEAnldM}F$=w8LD>>qH`B2)iq=|>CGCOxEZO;;ORLl0Z zj$dDRc)}dD`!#Epc<KuYKE6~J<NoJ$T=)Zq`!Alv@bd(5m8{!nnCTm(aO&KJ&!>Nj zaI(#wkhGgU_fZFn{qcFR9)EWV{9P$^R^`*G+glpkZ*6w=Y`ZCT-8)Iy`dOQ1RNDL7 zTo0Kvww*GI@0NMW>^(i;K)BYuY_@4~+_#N(t23Pad070Iz{fMqc6P_@S)5MYC^*4z z^M8lu8;b{w>{bsJNJeBGO+5RsXy?)^j(hJkng3y&SY<f9oWn6(*KSv>k&u<3%!>wl zS=Z|Boi>73v@_L{C!PEDf}K@=UtnnMKKJnU`q(7>mA}uay1hT=!W&-sT6<0&uUOZn zN^7xhiMLBtvzQ~V@OKL_JT~~ZNW>sy!^D!bmW37;8<tP<-x%>^?fQaUrV(e@zp8DB zIPy+kH&FV-qFZl!FU<;%QC}8!YRU88>?%xQ8b7x!QTo?;DAlC;HTRr%U9I*BjP5$m zti55nmUB+1z4>|SiMZayVGmBq%++6O<m+&wb*a-v^P7Q%eCwZky}J7@GW*wI=8au9 z;-waPNi<%M6WyMAOFHqTmS9eU<g)ZBO7XcuR`>5~pH7gq*(=<C{^S3NF%1{KwM}M? zE#Du%Yr9n-%f3EuTh$~NkGo1Pmwbe;#XK&HmVCLC^%aYtK#lgvNj=9GSg;&jt;Q5t ze$3rkiB0bJ#N%gP*mRg@)@#Y!VEOjx-TfuTQ~tKE<DM9#lNfb3V88yg8yA_XCkP#t z$?A*~OMHIe9Qy-tP0z)%4_%)#y?WiccK#g?ve{)l<bCYkF8KXpj>lA<ZwHpo4f*-6 z!FEsKf}#VAeHI$uT1DGUpTB-u7gWx8h1;2}>6hWT_#)2gn~!94{rmjybg^9ieMoHG zg}JjIfA%+FTymvI?hohD>)y&As)GV|PIG5Eu=}ncTSopfjfHNqx6dSo2V9KrJG#i? z{8H7d?0d!gZI0}eSyE_w;-;OiEBAWFrq@~OGd_0PZt6I^ZowjJv4_?=CJ&{I#k!N? zrcYb3WYNB}>UYb|=rMfMWA9eFXy)sBvo5(Hal(g`Zr%8t->NcYjG}8Jro7*9;YO=u zx2xfLZ|^G`FYYMbpdc^tbm{E;he14_b3*(~w|!pM{x;y*g}dJ+<y98vD-_u=IJzq= zQ|12Zu!gHVR%&5iT}AxT8y%Sv$L_RF65Obz?R$Y=aQbQ0?~d_roV~PfSxJ3kkxiAU zv3xM0-@>O|{fot#&XU-u1zmL~0=nEzC%-H0Dw^_ajTG;;uDTl;KUKklS2NN>^Of?e zUhV9+a{B2iVj*+%sp_lHI|_pDRsIyM-8|o{Rd9vH21_C7=QoQd?}&dq!F9XQ^Mk7= zEj5=>I>Gqm&b|$gw#&4CO8V59tCjz3{V^-<T<w~U*?nhK1^%htTzJQNk3*H<(ZJ6y z&&qH<jx^`ipBBq#ZsvS)LDNHjyM3QtHW%xrU5_~Nr>HY|yZ@1xUu&ivYFCw4(E6GD zdD0Avr<aaC-g`KpO?9d7+TZCLI%dxOdZo<8b7i*RG~ZJut2P+ucNQ_)^OdpZ>}$DS z5_^|R)~GjpYDK^DmfK7nH!I|SowJ^9^7-Kz???GMB2M)a*5``<nq=@<E;PeU_h8cx zrhL;~MNa~9CQVh@S#u$?Q*ydW>qdd3c%h1&KDV3g3_H43nsRSoI9YpaVVSk+^g9u4 z&ljtGPmT+!vJ|NO@lD~rS!%#?ZzHL1Jxym<P0!qra84}hkow7jv<_Krv#$$g`{%?6 zSx<I6<+$5l^oPcJg+(dL4{6HA_Ot5WJNafw8|&wFcJlruF+b}ACh|X?wCT(*PhYmq zpJvs<l_$8|_N@{XuF-S7R+?B}cXFNWiSWexMw9p#ui?BoW4g*rkC`j($)9<!(QV-k z#x(vPTka;>id9N07HBAI+I_KLz1{PDl}tyWr;?zzpp{~J{qgOZi*tT%*?DAogwBNv z?iU~E9G2tU(CeDHkjt#(Y>dt4NgbVr((!knAF$8=u=D@Sn3g3HIW?Byucf%FD$8^? zsvkC*%y$1|rp^-+yB(FDuCutfzBrpFA5yDS3@`n*T&vnYK`<yY(060E&~B%t(>rgy z5UEW5Jc(<vnUC&1UZKN%OS#W9YW&fDc1Qofq7xr9PVF@@HkQwPJLSzn^?$XZ|5__O zjf4!|Z=LbJAW&!H-6<+>r)-UVec9a4mp44|VQNxEfBy6vhoUY`o^(0-q+;BKkjGs| ztd~FWst!=GdBnG}UiIJh@&MHsg+Q+RA+}BmLRXWc{99d8ELJKuzS(dkK+Mz4-ukFc z@#`iPv(xIE^Uwe6sm$-4(4qhFe29tK!T-lubPqhg`MWRpp84YmHy_I+Rdmjp{&eOt zi>m^~udDuCW51eoCFtLi3-4dwlt@0bS>mU<%#RZV7v?3OpZw>_xe3Ac+xGS6-Z5Bq zOH_5?=NEy69yhK#C%!P}HxgfY<+;-DU7dd2#`ZGPeX5Lt?snEBEU~dX(``S&zvb`; z`;13hjndby_!YnAwP56yH%|9&GSt|#@0xdJ|EZO7UzjagM7*WB4{&$XeB3@cNUbKL z>ciXDiO0ewo8D${N%+5py@s)z@zVQ3j!V-5zL_jAQ0y?7t{_@>gwMZR_6O6USBcN2 zC%@)f<*_~2*5|)w<Lilf`*s&UEsB&nbt(M(Plv<bKi0Zld1c*MGjsL*w7e%qTZ$+7 zA9GoHJ#l0Aq|K`s&hC<1cHVY};vx2hSNaphjy}KpvY<72NpxIvlhQ`J<L5$Vo#x0p z_~}lD#eR+eUCYT$fgFy)Yc{TT|Mh0$>!ONpY^zf^|1ajQusZ!#n2+(My3SY2C2RRh zxY*UQZ<d-*l3)9>aN)Eg-&Zu{+_<j%Y3jnwp`85B!(MK_Dl_-!F1rT@RwwWqY`ebf zireFrg%0nJ36>d6pZo1z(v-Z(EnUT*j#b@gSjo@SyU5om*VZWGxz4|z418}Gz8kdo zES==_u8X;;cnL??-AMm)nFR+m_s+gtGwr#?l;Cr-R2u{qY;WxFkbF0l{|(#p2X{i! zLbNg*xbD4jJ^9_gw*F#&O4~=h<Ga7C{<)*|?tGDXPPWd^T~pr8$(}l$<#U!o^Ia#c zhP@G8)7zfDiJ5suC97b9pvcOtjg@Ixxo?(UQQQ@EwECg_jcdVi^LELde3sD?=Ck8x z{L3u`)kd4wbe*c0xgqeaqOqdXu?^~G<^gjin_qiuc4+td_P1$QO4HXLt`)o<)zfSe zVYz1MZ=n_17r!!<6}<7+ILH3F>ciWNDZgayUs}3USlGJs&4l^(=Al2<?J_r>ubCUq z^77M*#+-fAE^0FcfBRY?nRKP@`hk?a8$B#}riwCeFPz{tYtHI*p^t7KPSoCZ+UVb$ zl7G#)wwE5Y+}xTK5<kQD`wAPCaKF`o>e5S1EG%3Ke5bdH8=Kh(ek>CCx1`o~;-vML z8-DIu)S-LixXgu*xuvn4TNv2wZlz9eT=9I#i^AvYSZB=Kktwos?d!^ZjWrzyr^R?5 zHi?*`SgC&A_f=?y)>|i^E3dyd#_u@##kF&Zi|@pST3esA31vray!Tki@AUBWjJZw0 z_9d2lj-PlI3a$RZq_QN=;*nA?bExuyTw9?XpLRz1CH&W({5r>Xj`$y^85M4K+=Cqt zUyof=_2f^K;D)Q|)59kTDTW4aDzz=ze8pjzk9el+gxkeCkL*o;EX-$IbZpfst$QbT z$4tK>x-;mO<;eqG=hs@uuX#PuP`haPwa<MW{5#e)Dfx1|^QrpHC^Khyz;iW^8+PxK zb;@>TzTdO%!nrN;q*<$iyY6ZoI;p-mpQ&Td`DEQl@qH)nEj!h}>7(1jm3yW5k8pb~ z%#{AH^s)cZGkqnK`#rZEy)jwOs65d~YO2iToco6gSij8=bnv)YePOC{w3zbK^DD2~ zJuGA1A-AbO<Z-1&eu=92<c|wo7yU?2K4sJ1$P$w^aRSGJ>H}#UjdN4ZnnZt2`Z0-B z{#DYSWr;ENDu#XUtYo&cFsFoX>^4a~@Q?eK!weC>=1Rjw%irEgYOuYvPone1JhA8X zM-;s8^IthG@$u0zr7M@doT|&S&g#_v7d2UL;?p-Jp@zqfe$dmY4Djdssy;>kx$)*d zENp+GKTl*`Dc@zd>z>Zs6WK<8j~zYX5c7|*=Bwe2>(jz-%5!)2|9Cwi=f<+VSC6os z;<^*le@yLifct`zt*V?a&4jo&sQ7-KRA^|_r*~{#M`}LPDvhZdHoXwx<$bfJHNe{P z-r7lpds;&-n%_HRdP*SWUV(SiLGPg7E4Zy9#SXh0<SpLz?YIj^&V7^F=Q#gAmi%gw zq_EJC{RWea0{i7FcQsbJUpKntxZ;6aKF6n*dp4}_h>#Rlew^^*PiFr|v7!spp8X6y zC7$Z+9A)ppIsLTmi|0($s=;p>JA<AHD}?7ye3`uRu6L2u2kTXD4s4mR_CD9W@MGVY zUF>Fg*@is1<o7%}<48jAq}9TmPs_C>(y|YF82RWb$uGTXarLs}A9dgEzCy!)vDfa; zy7hDADzEK7FX_#_##zgCe7DQeiDDBMwVeFiP_u5XSP=h%+SkF8=G64%Hy(eTB!4(* z&CZ^Fg_NZ5yox?aZz-o^tM2gpZ(8>}t;@esV?|n<WD{4L>g$cAyLAsX+A4eLUTYIv znfC69Sy{Em!)gh&_|qA;-5v)w9{8T{cK<}d?KRJS>{5;4kPs~teVk;sEc}>~|H_5l zPfcFimUFDU!{T<uoM%qYrYuGCO#2IGvW@hf{kRe4*R?K`?W6jR;KqqxuQSIdSn$LN z=5IMEU)}FjUU;n1@K>$dai6JkwBJOR+?tRomA;f$Fz6ajhPmFe7ym!=pR!NS`L{oP zzv;ZxKhI@Krmj}$mCQ8=7SjE)EKhr$isp;Qb4sQD+AU6Ac9Z*n!Va;R9=)Kul0jV$ zJ&mmo?T~mZHmmqTXtm?9)-4M|l-wWPit|`B+xYIo^=7Xu_5R$5J8{Wk=EhJ*_Q00+ zd`?Olr*5pW+mYDQE7=^rs$i1Gc@v%s>_xsG7BGmcU!A_`&w{iUX-ww3Bz7;Z6Ye<S z{K~M*ts?HN)8A&f<fng{H<bryyLz@Aemiqk^u$V0HqEVpni^9LcDH?A7NPC*r)&4c z9W!>;9Bh`zc^>|`uh!>D(&pwlbKHW@?U->=$TmC6y<DqnPMr5K;llySUK-J=M_(p? z-1OyA)S+zMjaTP#87AfOCVW=1JGNo@J*6y{iFSY2&GWot$6m7g;-N~<+q{3$yu3p# zEX=nBEPYa@UU*n>;q?pZt84Ec$T#H+;<@Ivpw+J7^>nt$30J19@!6(Rlgj^S<IVur z$fMd5w(qXf>xy#<ZMZ)vjiK;WjX)*S`xU2`FZgkAZD`B-oc_ythf_}<V*0Zz$|&Td zN1O$p?6ODeOwQ`)Ge(4povOMQ`EhpE$pBZe8{*lzLV;1tLR(Mix%@lu^1`81@5|xm zW4E^Owq&hJ^%jq1xc=l(1>?o(SI)HyY=}DEV;l4K`t2XO`3n~vcAHRbJT=Dnijm=E zOJBEBzjoKX(vi>JwOEDc@5_MOPuDJM{T@`X?|rvM;KVx}VH4;5zG-myX?5-2IT7X8 zIi9RP9^Cloq*#2cag~RnnamP7sRdUHI(F=Mv~R<@^i5NL1<F+1bPnFf)6)Lz!p6(7 z?k#5?E{Hk*{9cvD4)=7GrWU*PFP>h1pm6-r1Ann)9ZOkLZ$AF^{&S)b`_rm4Q#Lu) zCi_GDU7HOnufJ7JDXS6v>GiqG&R&AEX8I+sAl`4SzCN7JD>h6JoD^%i?n7jMt%<7O zlQk!<&75wcedwctn99!IK6mxJuHV0_mk~EnO(8YzQoHt-8Sf^Gb8z~dW=Y=~91@XY zckfOEYiroS)5}{=J1$<65qD`#z}e=A4leDWVD`y{o>x?D9d-pS`BE#!{dZDY>)N*b zIhW^N`f`zB$BQa^qx=7MdWN08Vfrm9l&h+ESL)k?{7w}{AFZc8+qyYew$>{5V5O5| zesK0Xugo{`+drxQY?26hr1xz8b)H9S%w{i}-!`{>%J+<?Wt~QQS02@OP2s7T5w?B* zwf#B#bpq+r)m6O=zBqlT|B#-NnYtrC&v(Y`Ws$Egb#3|S5f~`(oss9?&ZSqyr6htl zO0*s)xE20Y6I{!9XII?4X^NG<nRaf!X5iU7D~#(m|DTVZ`zt4$4V>H~D1Z9;TT^Wx z=Ne{?&>arjq~w2@Uf-x0>3&JW_uRgl;{0)Dr+D67i%IWW7jy1?&?KQwzN2q#XXL9e zt$ZYUjn#LXU$4WNEoLvvI69@j)IDE2%WB&P*NIN8G9ib~Zey*L%AS}xVcH}1pKbi< z%S^2M;>rt_iCtpxTxog#q=$={#9YraC7yL3=hSKaV!pdl=%`-x{n#l2G3R0**(zC` zmDqJtK7+L(`?g@B^{VU%N}bCrx9)a+rWkPTMULM;hj^Ri^UwcqkgoUiSr{#CpLAkv z?9A(j4Kki=TvHsewwQDJX{(Mi?s;!lW}e>nbe?9~G5JY}eoM>lEh*h_ig}a%#B$cH zw=C5rS@b--&9wjWn;82SN20RqG`BC_$R4QJabwPDA(?A=Wjn2t8GJuIZ?jI7Z`)Y& zg3+3<wJJvGnc4kcx?bnQ8<h;R)cBuqGWv7;b-q;+9W}%0S;OzLLKY83(K5r|X@@&A zLypGlzwlFv4mp<CbI8~GEcc=%ttG$CEUTFjx~X*MlNCooe_VPqX>s5Ct_$lz%BJj5 zD@r{-eYUDqxOeU+y%Npx`C1j`cNSh+XwZB3%H6~%H=^_fkM8%#+s9IMQelg*^6v+q zOZMLF(NCN_t;#`)v*z2*+?FTpt0tYjUOY>1ZrS}yYAe4myqv_e>dKNYLbu)CJrS0% zj_fbuT|MPOlBa^*3ssqC(H2eTv)>3!RyerF-E&8zRHp9tDQ0e;7H&1HI&*gJq?^^A zE7xSax?%W@`TW;YnK_I$ET<07?X3G@y!rn+&3$L~%yv1vQ;yH_WW&0uM=a`_clb|J ze%iS1<*d`HGd0akr819O_~v`4J2qBrIkm^*<t<4$?czt9t+_rnIL&<@6Bw}ag=FB2 z$a4_~PXFJ2rMkr<$?Na!nh%qk*yjgwob$ik#KHXJ%5T#NvWKSJIyhm$lFMInW-FBD zuI;(q&{-E4u<UaRN0-grea}5SyyP+h3ud=`vJogSVYgyfc=Gqn#u-r;PK0V&-JdtP z(9Yu6%v87IGMf|LFB6l^f1JJP$U18Qk*>DX&c@%@A~lv~o;zOFRylJ^aa`x?%}>s} zPM#-Ql`-4<m-gRE_WqI!*EOw!z8ti_w_)xL>$z{UQbdeo12q11G`%V@SY)ty&coZA zJg&ZZ@Uiwx{SUS2r{n{lt=g1&V2Ss}&1X7R`WoFcW4)~H%2e@g@4LkY#RoG28wwl_ z9u#B^{oKXL`nlG!Sbt@?%g-`*jT&`huEyB&UK6*sH9u?jI>31DaCq_W_s??__i7lq z=P%p)mBs0+^W^0vQ9fyG`CD~8)-8CN<8aK!=~cOl68o$T-9Oz;7aFwh<YN7|W8szy zo^jb97SFU+pQ>vRcXE4PN%)MXU&2K0y={Nhxch}Ii?ijS33WVdkHduK^0lulz3$b) z)xLhR%He`Jx`!Mu-c~<){nE6!LWYn1*=H0^R8I4&p8xiTEz^+;n>R5sx+{bn?p*8O zqnq(#---07%yQQWe!u6jC{0{4!{>!&LqKGUhWK@t<}(MUJzDnn=#TXN0=+Z2tREB= z?DBf&vm|9XI{(mnKEav$q5<m~*L%0WxB3+8e7>V}>C3f_OOqlle->gpu-0Vb#kBKx zzOI>nn(KkHL(P_sKgkY0dMBjT2XL}jyjd7g_|5jAK-;Onn?I%Y_J7@eM=HWQV@{*& z*PeKd1xp^)XbUG_7t2}}{i1A1@Q)w2B}#MFx%XIJn|R|>#5$+oV2ugZizf7GtZ=KA z042c_{;J0>?Ve^3$o2QOi*+g+Yv$wg_r3}#obst;k9Odg_2J8%>bvfVYDtUT82dF2 zoL`v0<*-(5)^lqm`SO-k%(q&crY$-<?ec^siJ7jqcC<d3ynjOZ{2TRI(I@WTYSQ9K zU*uKxVcIRGyzet!PwsO_$@rCEa`D^+j-HwIA<A6FGqM97thSl9Ztp4SjqN8~jn=93 z9+}}IJB9VCxh7-Lt1k{xHjihrtrXnbo^Zll;sr;umRfe}L5b2CNz1zn0%kOelp1<w z?Tm5o+4tQj=-Z2POONIJ_$wgrBiSM1G2i4jC4vH7a}}GPdVQ^Stu@+pqsz>tN#}RT zHNynf51I;j^QVL<<Q<VsyRlM=<ChqRYle`@kr`E;n>}_MjWdv1WUc>yBlC~@JRQ=7 z?UGgNS9W_#+<ue0l40_kM+I&M9)3^5geR;Ibk*!u(phVBX7Zmc>aQo>%jK}Gak!ZH z)^x(U^s@Z(wg$_XEX~`4UL7k)cxiV|@T@tPY3Gi`0ha_>ud-wba}}SKOcs5?#+v<n z#VV%!`^VPgo?7eYv*?6ro$lA$OIr>$d*qzoCFmjiek((3XUExiMy_iNSArJp%yW+j zOvrOQJ5z;!X<7P*zbDm~+fP@XbF)4yT4S*;OYf$=Gc%+PMrU&yRqUCvOxESk*}64V zo}GVfTIDnU1^Q~7NnGcoIBi||0gWfVTDxyDMK`If)qZ?b=_;G|$F9E?wv!E5Y!<V- zeUWQgD3kcXT_S|NnU}5jN@CaCe=>a0IXc&?Tq`OAU%ZKJQ@M9j-1$WB4_oFVZ)+1- z56P9!NLp^s>GFy7Rio~qC?`WJbC0DpTQB=E{M*iaNN&f>q~){HX3r6xswW`w<k_o> zRWr}6OPm?>a_7rEZ@G&i)2?h=Jip6&uD5^Co93;YzG`=ltV+|}FPN0;Saq%QR$xPZ zV1P?}kH!qkn`cV1T@@vB6rViURjBN^hS|Dqy5roPJ#sH=zsNNz)^InUlE^WbQF~$K z?QiOZ3I6uqjl07Gte0=!+{dxcLV69z#Z9$|%#YgSt%`5QF(33kUvqG8^|i;}(%Cc~ zyD+F(aZT1(e?rbb$6D64VA1}W;)#zp7wuOviWO`ZRtm_PXR2`Z&^&AQZn5?ceU4=^ zhXmQDF5Aq@{yEor>tYdy57P~|FT6KZDmnjd?eT<~un&2!*ZA&M)D?4>*sh|pSGV@E zFY}|bwjH)AagD3|OJAMMlh<?o(>>*u;zY@xQEZBv{fex5#CN(i)!T47F5PEdQ?QR+ z-EiV{kApt@ZZy44^Wt|b&2^b6bH#$~|AeKl=KkMz_HNIDUG}+7ykU7w?@ub^s?0C( zGEbcQ#Yyn)Y?daOBiGtgf_0g<MK}BF*XhQV-ni1O%aG(H=_I^ynoibdnUo6u-TK>) zEjh3|T6F0audo|Mvz3$@Z<e|pie6=@@PjGPWY#7QM%(ZIN}p_=y#AeDU7yhok5B>Q zuSwdI4jW5JN-4M$O*;0%cIv_@7SlvbKX<NuB>U}&K}S(`*7?qpUuV5)%Co!O>+v>V z!p-EBzA7TN8(%PlzGVy6PdgjMf8KXxYsRWKs``(1RYgqLnC*Ocmh<|PZ*QjhoH_f! zxJXe-;YQ=9(z*#T!ZnYb{|gJ%@ALY9WL2`!)ur|}>feLbi#yn@X5aR#=w`aZtHswf zg!!F}883F#Tl0OmcgHZBD@#2-=fhch4ZhFY_ofHV(dO&tUl;m9SIKC8wCmRCC;RIJ zgdQ`q>^(KnqNity-!vh!*bkQ{PGon=6<~<8UAB3TOuca#JJ*wnR~NlF&Ri5-yQlbl zseG%(r4--YAy;Oux^vU)wOQY1b(81J)>9YuDnF4n@Lp8<;6Y8^$~h}%ewUIn=9IND z*k|D=e@Rp5njz22`hS9<#)i-CWq)zWy(Ir4u*>+{@dJwA0uLH>7OXSPo&9kF`$U6_ zb51qCXzkWqU3TP5^<DjrNb6&fUA8g_=bu)*{PF&I6NhtFO2V^yuk#k(dA0D_q#&;; z?LV4%)Lw41tht`1k@5XZ_1&`>oSJ>kteo*jYxqjzgzw5+_4#A{Q=+OR$m!tWvnSK5 zFKP&%-+R4Q<i={Qt5-Q@7liqCpFAS{@3>}|qWyM*H}AH!PD)(C{YY9Rvn}q--Wzu- zN*_AURm{47OnSpswWHIY>(38%o3vrNzT91gW|q$O=%z`*bNY+*%f#C(-`dVK-7(>K ziurt=<m_2z{sjE!cMEjL-Vn7f&-%pwZ?ZDa^SP(4>?(eD=}yho+@(TZuPt1ZUOhXo zeNOSN6@QO(uRV~c=DDD7$xj}A-HqGNZg{uY|B%@MpT|zKBqz;H-qe2aiO~<~Ni|$= z;x#4~o9nLqA<32VxUftkB&w=7-|SM!;u&#;8+n92J}}HrTKK8;#B%N>MpOTbZ>=g> zcYms3@MG6#X6?|zz1$kl?&b8j&TQdJVLo-@TB7@s@--g&3_gaQIR16Xl_!!Sc~V_B z&7&DupI%rVU}UKI@UD|mJjW$j>$S&LH#n(!+k8)RPPwesap-)b|GxT#%FnkgX|7qg zBkjy@wNmrz5l7$5)@^7y%ags!VFlx|?LqD5qaV3UdBC>(hx)=9)tePR<O}<Gy<zey z$@^cwY5%#9<L~1&9vjWtzfFiUR4w_{(PLd+vzN?Z*|Bn-kH+=uw~e2z7yc$7sIGrW zSf<AE(Sk`~v#U1lw%}O2blvp%Ps2|{pPIJcZ<*)rlV`52bas@N;R@}_e|5C&d0NQy z_TvF;C%^1ulw&lTS^96+p3MH`C##bWEB0BudD!78vn(#h@l2JP%esRPeb)S3ad&N@ zLGS+6mC<WLAKGkg+q<dY)LAp{iP60oTU#tY=iGm^HK;1g;7dyzyST&EnMs#!nzsG9 ze)^{I&BY6AE{PW1IPIun{8R11{qr^3H+y8Km1w!<Jbm~%eaT$sS)Q+xRKJ(r`e)W# zxBJ+=q}=+cHx_iY+&(3_=BvW#qimh$weGRi>V@<Pv;`%1+P-qrl`<|pw&y`q?ti7= zrGnL8*{iQ!vb(A@P0}f3Yl+n6ZO6Eix31c&WVCcL@1{akZPVyAVSBntZ-=(`=G5-= zT7OC@M9DC0YizPf_D-v{9r|qy%^Itp>sqh+Q~kV@i(y;LzKul*Yc*EOoV>W*E2?wN zr<Yf_vw!|uxrswuL!#8RS7XgI<*(~hUOnnI6f@_!SHcikoPJAncCPD+$yayG(rS3{ z)8JL#jPEOdBpL+t%#gn_VbisA{ruu-;eI#2*S&w@EVHOc^XDRMF2gRznOa$4*&dun zwfBlGJ5l%`G2o0~<ZJb*TY5xIjb~(=wen>4*KSf{TPF1PoQSNXZ)Q&<UV)uu}p zonJWh&;)_=aXM<7)hp{;UO#Bwy8Otk!$vpHEWRnyxH6UZl_$5d^nn|fyY?JlU#jrt zZEW}M>Z8#<c`K%Ny$f*RJaTTyp=P6Nb&~$=SAztMUhY0{FKMG`(KC^SCGJK?on}pw zN$y{_@lp<7Nw1;7+5=a-mmcAi?r2Sax7_jIsvk*rMJL~#&s8n(y|;gv!3}50i5@w1 zk&b3>d3RlFdvNvay_{J!o_n?*3JX4^KP{Hubz^E%TTDc&>>3ZBYqM8Q&^WWI?O*-L zmpq3HPk25(Zz}ZcSHNS*jS*~)YNgH%b){_w(w{Eab$lM9)}B|^trM47osql}x-o0I zf~?e*U2mj*i`Ps!#{P1d?XkT($|s(8D~q4a{_y5emUyeXJT8vmmg(LZcUK&axwBdQ z@y(x0+cV$3@o`*Vr!ghwf~o#2qbTz<Ro(T=Qf|rCZ0Fo}^0CG|=7X-GwmpW8`8v#z zF?`B%Bb9z^d)<7(@1rGOoa+AxaiR?#N6dY{N<V63pTzTZ%~e+U`IEI5&E+a8s%{EM zOk8jIP}2J0;+g*Im+e-(R8rV*d9&p2m4}PiAH9vNV{KW)bcpN7lcr<V)4vDrRa^3M zQlx|J>Y10j&%ArUzn;-axGh29NKf@rzR8OAE4)8tb}ru>`j*44rR9I9htIl<ioX2a z^X{>}oSJnp|EH6k_H(6@ny&^o&+OI?Y+<>$V6O68Evt7gD_xm)PY9k9q#9fk#b$N= z+{U>=J%J}y@=4sX^4M^N!O&j4c=_@^Z(hD#b$;rdkG>r~mdIhq+1XlfZK2UlIqkYE znLmu}M!Ec9GHbpWRBrjBz~^%-rdF_Sy_21Tex=vM{J;8_s@)joGd}uv%z!EJyZy6s z&*ZJO3YD98ZV{i{y8FVl<5LvpczwLr_(6TahBti5BIYpy4^HnrTGwD%{YJHeNAvQF zoq^d3r-F2A^aEYgikxj(b_j$ljy%cyOm51l7qwffR{HC_D{%~xoV)7A|FHe-0Z#iX zn)~A=gspAX9krQp!Yfti%X5by)AGUscbSk)0@uE>@K~@spV8oUU7wHT$DxT4J%^V~ zd$sD=tSJ*ir~mF{p6oF<r0cBWhDYWv4`jYM=*n|-<udU}F9P{~zF)Cw#-{)4!mOj- zL^N&D*)7GGAhSuMoA;YS7W=F%Y}HNy$-O~Ahw86A(b>!NAiQs>=zjMChWZ1Fa)klB z&$c{Dxa%KWH$$+!;E3bYXOp5%FudLS<J9DJ>&uwCLY`JGILY<E*kQ+ev$j(TJq|Zk z-kKx*t=Xeu(Y#|1{AHWC9{GB%`QOuWzu|+V#<x31=U%?Vag=wT+4EED8lA4*^J1*N zCKPv5yzb)P^E#Cr7HfI;G(L0=sHtwZ<2=fH>e-Ez>p4?0>y<rLip#coOwQHvVU1bI zKDlP!l=(c(KZ<xFUCnFS0;(iU=QEt-&C5So5clWMIV0Y8M$GRwa_TAlu8H^IJ9#d- z=<jcvZB`YP=dLH6x0LzB*j{tQ(Y)|<$KfkgZO@gS3jHe9NP4=oe*Tr2XC6$r(UJNl z;b>#hOWE2*=bxQi{o>e_YTW~gUGM&hK1f*lzWe3#O|^-K8~4jCUYuwfk>%U6<7UsL zl?RSJu`{{FEc4d!>XEdi{?Gnyxg~ewW_dM>S6}`<o#Td6Ev<Za_x&y3`pBSlH&^?M zsQW^X8FrrItZZLibE)O!5zVCSE7Xe{zi-XH_(I~Z-t(v755M2%W`A8bD`jnVL4fI( zr;m!XZ*$a~``~E$fmQ$c4e@(h&rX=f$i(k(K#(JJYmX#Hv`x~qE&mjR_K6&rw}GqX z=8u2sPp|Rs;W^a4V8?#zo`5?Yd1ohvnTotr6A5zkTNrxesPEhr-=1&?f3cg(rjVcT zLqNoRwZ~=YBRs8^N`~HlOhtFtEsN0h{b}wM<a}?TLVSso_mO*XZ(8TiyBU&c%b}S! zwR`!yqAv^AI&|5miv9ilyS40T(W-5VOn)9_eR=O)+qJ`H`YNk?@!WjDuO;<mCxvI9 z?|f8p?(grKd9y9P=IO325{$g{=dQ<YgK0~ORxi8v+Kg}VLm6GZ-JkyUG4E97<Jy~S z&3Em?m84%QZ;J2Ana;^>cWIMwW5+L<9WvhQEmdd66#lw%#V#h9e^qVbV*fJhs2u(i z<^e5I4IY;+O}!f+`as4)lz02Tbz#=C4#l=I*T>}jR&qXR(zcwTTWiw%jV24*b9Xgp z+m?&3yu$f-^@nP<_JRWoWeNjczKST^@NT*0wN=Ls*0(pGlB>A6ue6w*vwGRVJHpm; zmaj4>1C<RK0wpX?g8R*w6MNmyOuA<3q2a@{O>FK3WnV*!`+i^6e&_L<dgR@WOU3~; z)lphKkJv<xbsW*j{JXJRdEboeX%|j66x}e$@wsr4wQ$oSX$d<PR+$AJm%|d<4#`ZM zq53a-K|rLdk3@8h<{mGNjgF3&E_f~f`B(bc7XgvuyiJ$oS|z!PL)_W=lCsZDk9sFC z>)+#LKf?vowo2FD(fgYF@#E7JtA`1qs$qhS+LsiKc)mXI&$;2WTKmAF@<J>A7_}#^ z7eB8!-?_m<uF3f5+&)W@l^!i_ae+||(Ju?`9qTx&S@|zXM(w(BjeJ{kjpTe&ftvqz zGv0(PnC?-2ZBdQo>SWH!BZ?NGdJ$hdqqfU-c8k3BQI6z)rhn@7vTL8`*nWs}y5F_o z;Zcnxh8lq}46fG~+eV}x&NsTTa+3dp@OxLIw;L{5yXr%%^aZ_%+%jkOufEtP#-9GI zma)C|q3-WPTh13w-kBF#8tKOJEAFP6@Z%SIwmF5^&+=p4XYeWB!p3~%#QG|`2ZHRO zZzqVhulySE)}z+$K!IIKxsCjyMS=JBonLFga%SSL{zK;*<>z&KOb&W*{rQrt7n>#9 zXMVLQ_tX0<pYwdli$xo+TdgRcl&>kq88nq4{>p;0KeSi<KE%4}+!r;?XU9Yg0<S!= zeS6Sdx{m*jc+I?{wV!rt?A!6+@P%E6b}UGWzfm8q%@@35b-{zTk={&?w5Qf}=XvtF zoHaOoB&6Hm%imY2Y@VyXvv1o}AXdHQ@pm4+f&+?wCHSuWHIe-M*HFgc&F%z$D@&e* zU*_n|Pb|^;mTkV|f0@ILML#zy-j{bd^zp9Iio5L`hTq<)Bx!u;&gc<6B;UwX&&O44 zQ*ZWUHyc-I51)dg@VU=#7Hrxdao>3V57pD++D5Z4_d85nz7~|;D*ol1DCZU7`lYF~ zpktx)!F56=tkIo!+$?&nXBqxc)OdEjOFBT}@z2eP#k@a-GT%t?-L&#g?0CNTwwk1d zhdZZ_RrN%bG)XQKmc@@(8ib2=o?o{?$?4y^K9}2b-tsJGw%qi>vh3j#g~gd(k{<ad z6N`EtFWY#lMZ7joSmmC|7Kf0~DKndYy8T%;i9t$6;bUXyD%%f?ThG5*-5a|qbGvz6 zxH4b&$sg76F6QsLA8xtxt##d|ykmaH7x3xN`L$QjWp*`3)UyZsU$86-c^p3bQGDB~ z8+&ZG^S+#8FaPQKb7oQ34e!|aj9+iOHSuGOM*C;Q72jIV?ptf|;PmH*a@E(2Pv7Y> zusI%btik!$vpGCm`iJ@sU#XgBqaN(I=8gEzJrfs+{>+~LW@eL{)bF-Un=7|0_rAGP z?p(rQEfXJi)%W*Z?^O9_@L#-oR_Ah@@m9edNh?pjmN~ssJeskUhgYvwMrMDy#^2%? zq1gA58ZTVmL|il4^h55$t*h-C-76Nbb?p@2{eI%9-J&0otLJQS`kK#UxXV-HM@B*D zEZ>TN&W5vE72j8wop{r&`%tsh>BW7GoCRCO#AgQh7f-JEz<O`1fZ1;~kGJn8?^4Sw z2>LN?v;MY4H`EkbZj?40oSgqq_FiP?!TDWppNoIc4&J?E53@PTnyx>yR%x8Q(>-%_ z!?6#14XcZzT`mgFFx~ZU!D$ooX&$%k+~{nsV|P7bCw@b@a=BOWnY}l-G=6;exbgR` zdG#0B?Dnac&04;IA+tBzcf*l=dtOA9s2lHmAaeZKn{HV-lP>X(qEp*8CM^1P_lf0= z%<h_<{(YNH|5?1_?~RmvZOi%XfhIZEt?cZ+CoNuVsj6yXBcVLSYQNvUiT13C2PSCv z1@cQiej)W!M<`x*?W-WSI;U%%wdeNUsMSc>Ab<3u<G(3ZUz`8;ywN(BEAVp3!m^pC z_9)$ZJhxWFEGJ;Y#hc>N*{o~0cAYuR{gwTv@82Jm>v%N-oD}Vh{(s4wAN^JCu;6b# zN3|8RI&W^yH?y%={`R)q6hkK?&-L?--fRhC4=g$G++*brd%sT)uj&ciUw8PR=GlZL zvw}^&r!k8?JIV4$YIofuw{K$J{Nj$cw35>{2uzjqblW=lGON_miX|`H1IsLaryXuC zb{1yi({TUu?tFe-tWND0lib+qI<K5$Y1TQj1SX2yFkqLS70s3AYyafUY~F|)Z2leg z{x5a!d{*m!v;3Hu{mh4@CTHGVQB-8)dgXCKVp|`})Fqad>hU?O0!kI{Z-4*Uv-4b` z)}hwBPbTcvxOC*+cI_jdpHFoRyJs96n$v$$JeslP`_s7&)$`vUeQ0+gZFYair8$%4 z%5?A9pMBj%zV^uP-O((Yoh<K!Rwq9?%BHZUxT>S}N#YTe`_)V9;-^F!iKO%Ulw5MY z+_>PD?4C##`RPkKZu{)J!K9FMD$iryNB*|2{`+>NnB2dUaz*KidV+k!k#7OJ+!<@4 z7Bx-r+jrwdr$qb24fayr|MwlJUiC<GuBC-$p2YSl-mJqOO<yKmpR1TBF4p_v`IBm1 zzh$9!CS)@1P;5K(FFdtTC_^kgjg5UFhe$T3)=5`6uk(L5xVoRUxN!2j)V$4Iu}Mqh zL_XHIZ=BrswS)J~+jF98(tkSc$&Z}%NGPB`&FR7;gRgPQFAY}ps@(IvaeA}O0XfTQ z@4bWU>?2(cwN1}@`FJ)v-*e`j0Va>yCcig*l%NyQ-#GWdxsvUY-5c%NJNtj1G@S8< z%iNaJZsvmkvxC*<Vxb3rU8&YR(a8F5=c@^vA78kdEKko<y5Bf?vHZ+yS2{$jnH;s! zk143R_}Y|z+AH>?ZRUe#S5D4q7BYMHVsnjr@GncPI2RVP)@fTGM_<{0)$hBEgna!f zx4xC%cl9z$&sh@w>ibe(zM^D~KedrEk4?<g%a1SQv3O(jJJ`Z!-}R=b?xUL>S{d2f zYvUafCz%xJa(>Dxm{GM}u`63U!vA(c;;ZM{EHfql{@bUJDLQAdgf(Bu0mgm{jYUS2 z-<#T`uf3eMU}Z^_{-X|Q(MRtmFG-%QyH|ic^x?lN)pw6E&bVMv@^@#C=CQxOZ^$gP zh-ce>e1~CzRL4zmX*rW=nV;vf?5m1=ud=85`D>M}=Ta<}db%zOp8bQN)hj#Y-O)Do z-mNE<ECe5YP?-FGOXTJn<@%g&CgB_FvP3g)X{E*Iu!`j9*_9;;$9{^=3EelbU$?H* zeCmCRRwem`7gl=t?7cA~YWr0+d&BTQRn042sXdF!apgQ2BiW~yCb{C}`xEX@)F$qB zU7@j1Yj0w=$xY`Pf1XKY)uykkot_@oEWhb^;fYxukGHw&HaW>n^Y(gQX-N1qw|zp3 zzoq7i9hTwA=lIsj_i63lJ?DCExk2q3<D%_%Coa+wtWr11_u*SRUyo0t`HGg1=PJv# zw+H2vG&y$G?%JXI;OCK$w?~fGc{iqse>V6tp?)0;*Yi_z9-2MBa{c_LNxTP^pWZzq z$68b3w9y;BTZ>k3>70?wEB34X`X=FH-hv-yKl<;V;(s+=C1Le3joXhtU&}SMj1FyP zzU=>kS-`mdN5CYlwLFgMI}%rO8;Pf`6`wX;EBA=hndjOKwf{{-I1C)G%n>nv)pTa6 z$7}byA8U<$;tKv4x2%)xZTuS_T5^9CXWrR99l6r!KRmLg{`&NhCDz$`Uj?&uz)6$H z&EeN_ZaxysU;a7Lu4jHgisM<+rO$TV`I^+<eN69;gmPktMwCrmll=rQ?;iDSAtzRr z?{Lvn3~f<=!|D54aAVCIru+L3Zok6BW&Qr&Qf)hp)!)~O<>~ycUzGnVYKxb7;~|Yl znW9^x^}d}jx0}+|%puidShr+Ose4PI?X{RsNrm<|rTzrJb!XYI{+08KyE2{k?`xmf zVS7D)oo<A7)^g9%6)exrJ_=rT=b`Z5$J2KPi1J;FnP*yV(Yo7k&fH~%J0>19dUi%_ z;{T0v3!P(*&oP>PxXyRibI(w@;&~ZjHB;pq|48Px8@_J3kgX>y|IhEBUB1U@>DgZC zpIz*yN$s0>z-ZZ-w6_;RBA?!CN#3;RM3iL8T9>GGr<Bu!c;EaMH{34o)AW<)_f098 zHLGmG@{_pALys;z;aomdt#0Cl{J^xoEn4p{#aL#n4T)Ln_PH?rN6?22`cpph`(~M3 zt2ON0J*(DiE@$F=X2JAmPgl{^n^&%kxOt0NOQ+HQnAS%58*(kZ-)5vPSToZtX}!+2 zP3NDkvY9D6`IPWaCMTbL$2T-4UR_akHz3IH{?65^5i<@}<U~6kx?#uD6j~F!dyUkR z8fV#qBHv^6S0Au<o;W4n_fyAOGxO+KwK1o-^bgIuXZHN>HMcLSX3DROzy3=NZ%8=t z;X~}I(;p%ZZ@*^n?U9|>y#qa!p)wO6Y3b}#|0__ref6jL*COVA-L~`g@k9TgVmX5J PKl5y^QwCe^Gcf=F`9<HO literal 23495 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 T9Yr4=|Cbkbbvl0j4HE+Zht-fn -- GitLab