annotate OrthancStone/Resources/Graveyard/RTStructTentativeReimplementation-BGO/DicomStructureSet-BGO.cpp @ 1908:affde38b84de

moved tentative bgo reimplementation of rt-struct into graveyard
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 01 Feb 2022 08:38:32 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1908
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 namespace OrthancStone
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 static RtStructRectangleInSlab CreateRectangle(float x1, float y1,
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 float x2, float y2)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 RtStructRectangleInSlab rect;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 rect.xmin = std::min(x1, x2);
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 rect.xmax = std::max(x1, x2);
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 rect.ymin = std::min(y1, y2);
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 rect.ymax = std::max(y1, y2);
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 return rect;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 bool CompareRectanglesForProjection(const std::pair<RtStructRectangleInSlab,double>& r1,
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 const std::pair<RtStructRectangleInSlab, double>& r2)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 return r1.second < r2.second;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 bool CompareSlabsY(const RtStructRectanglesInSlab& r1,
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 const RtStructRectanglesInSlab& r2)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 if ((r1.size() == 0) || (r2.size() == 0))
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 return false;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 return r1[0].ymax < r2[0].ymax;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 bool DicomStructureSet::ProjectStructure(std::vector< std::vector<ScenePoint2D> >& chains,
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 const Structure& structure,
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 const CoordinateSystem3D& sourceSlice) const
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 // FOR SAGITTAL AND CORONAL
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 // this will contain the intersection of the polygon slab with
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 // the cutting plane, projected on the cutting plane coord system
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 // (that yields a rectangle) + the Z coordinate of the polygon
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 // (this is required to group polygons with the same Z later)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 std::vector<std::pair<RtStructRectangleInSlab, double> > projected;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 for (Polygons::const_iterator polygon = structure.polygons_.begin();
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 polygon != structure.polygons_.end(); ++polygon)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 double x1, y1, x2, y2;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 if (polygon->Project(x1, y1, x2, y2, slice, GetEstimatedNormal(), GetEstimatedSliceThickness()))
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 double curZ = polygon->GetGeometryOrigin()[2];
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 // x1,y1 and x2,y2 are in "slice" coordinates (the cutting plane
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 // geometry)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 projected.push_back(std::make_pair(CreateRectangle(
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 static_cast<float>(x1),
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 static_cast<float>(y1),
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 static_cast<float>(x2),
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 static_cast<float>(y2)),curZ));
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 // projected contains a set of rectangles specified by two opposite
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 // corners (x1,y1,x2,y2)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 // we need to merge them
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 // each slab yields ONE polygon!
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 // we need to sorted all the rectangles that originate from the same Z
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 // into lanes. To make sure they are grouped together in the array, we
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 // sort it.
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 std::sort(projected.begin(), projected.end(), CompareRectanglesForProjection);
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 std::vector<RtStructRectanglesInSlab> rectanglesForEachSlab;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 rectanglesForEachSlab.reserve(projected.size());
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 double curZ = 0;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 for (size_t i = 0; i < projected.size(); ++i)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 #if 0
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 rectanglesForEachSlab.push_back(RtStructRectanglesInSlab());
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 #else
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 if (i == 0)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 curZ = projected[i].second;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 rectanglesForEachSlab.push_back(RtStructRectanglesInSlab());
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 else
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 // this check is needed to prevent creating a new slab if
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 // the new polygon is at the same Z coord than last one
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 if (!LinearAlgebra::IsNear(curZ, projected[i].second))
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 rectanglesForEachSlab.push_back(RtStructRectanglesInSlab());
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 curZ = projected[i].second;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 #endif
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 rectanglesForEachSlab.back().push_back(projected[i].first);
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 // as long as they have the same y, we should put them into the same lane
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 // BUT in Sebastien's code, there is only one polygon per lane.
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 //std::cout << "rect: xmin = " << rect.xmin << " xmax = " << rect.xmax << " ymin = " << rect.ymin << " ymax = " << rect.ymax << std::endl;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 // now we need to sort the slabs in increasing Y order (see ConvertListOfSlabsToSegments)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 std::sort(rectanglesForEachSlab.begin(), rectanglesForEachSlab.end(), CompareSlabsY);
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 std::vector< std::pair<ScenePoint2D, ScenePoint2D> > segments;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 ConvertListOfSlabsToSegments(segments, rectanglesForEachSlab, projected.size());
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 chains.resize(segments.size());
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 for (size_t i = 0; i < segments.size(); i++)
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 {
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 chains[i].resize(2);
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 chains[i][0] = segments[i].first;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 chains[i][1] = segments[i].second;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 }
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 #endif
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 return true;
affde38b84de moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 }