@escapace/minimum-perimeter-triangle 0.2.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -1
- package/README.md +0 -6
- package/lib/neutral/index.js +557 -0
- package/lib/neutral/index.js.map +1 -0
- package/lib/types/index.d.ts +70 -16
- package/package.json +38 -42
- package/lib/esm/index.mjs +0 -399
- package/lib/esm/index.mjs.map +0 -7
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/inscribe.d.ts +0 -35
- package/lib/types/inscribe.d.ts.map +0 -1
- package/lib/types/line.d.ts +0 -36
- package/lib/types/line.d.ts.map +0 -1
- package/lib/types/vec2.d.ts +0 -23
- package/lib/types/vec2.d.ts.map +0 -1
package/LICENSE
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
Mozilla Public License Version 2.0
|
|
2
3
|
==================================
|
|
3
4
|
|
|
@@ -357,7 +358,7 @@ Exhibit A - Source Code Form License Notice
|
|
|
357
358
|
|
|
358
359
|
This Source Code Form is subject to the terms of the Mozilla Public
|
|
359
360
|
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
360
|
-
file, You can obtain one at
|
|
361
|
+
file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
361
362
|
|
|
362
363
|
If it is not possible or desirable to put the notice in a particular
|
|
363
364
|
file, then You may include the notice in a location (such as a LICENSE
|
package/README.md
CHANGED
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
+
|
|
5
|
+
// src/line.ts
|
|
6
|
+
var Line = class {
|
|
7
|
+
constructor(start, end) {
|
|
8
|
+
__publicField(this, "delta");
|
|
9
|
+
__publicField(this, "end");
|
|
10
|
+
__publicField(this, "start");
|
|
11
|
+
this.start = start;
|
|
12
|
+
this.end = end;
|
|
13
|
+
this.delta = end.minus(start);
|
|
14
|
+
}
|
|
15
|
+
closestPoint(p) {
|
|
16
|
+
return this.evaluate(this.closestPointParam(p));
|
|
17
|
+
}
|
|
18
|
+
closestPointParam(p) {
|
|
19
|
+
return this.delta.dot(p.minus(this.start)) / this.delta.normSquared;
|
|
20
|
+
}
|
|
21
|
+
distanceToPoint(p) {
|
|
22
|
+
return Math.abs(p.cross(this.delta) - this.start.cross(this.end)) / this.delta.norm;
|
|
23
|
+
}
|
|
24
|
+
evaluate(t) {
|
|
25
|
+
return this.start.plus(this.delta.times(t));
|
|
26
|
+
}
|
|
27
|
+
intersectionParameter(that, error) {
|
|
28
|
+
const d = this.delta.cross(that.delta);
|
|
29
|
+
if (d === 0 || Math.abs(d) < error) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const dStart = this.start.minus(that.start);
|
|
33
|
+
return that.delta.cross(dStart) / d;
|
|
34
|
+
}
|
|
35
|
+
intersectionPoint(that, error) {
|
|
36
|
+
const t = this.intersectionParameter(that, error);
|
|
37
|
+
return t === null ? null : this.evaluate(t);
|
|
38
|
+
}
|
|
39
|
+
overlaps(that, error) {
|
|
40
|
+
return this.pointOnTop(that.start, error) && this.pointOnTop(that.end, error);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* If alpha is less than deviationFromZeroAngle, the 2 lines are
|
|
44
|
+
* considered parallel.
|
|
45
|
+
* _______________________________
|
|
46
|
+
* alpha (/
|
|
47
|
+
* /
|
|
48
|
+
* /
|
|
49
|
+
* /
|
|
50
|
+
*/
|
|
51
|
+
parallel(that, deviationFromZeroAngle) {
|
|
52
|
+
const d = Math.abs(this.delta.cross(that.delta));
|
|
53
|
+
return d === 0 || d < this.length * this.length * Math.sin(deviationFromZeroAngle);
|
|
54
|
+
}
|
|
55
|
+
pointOnSide(p, error = 0) {
|
|
56
|
+
const number_ = this.start.cross(this.end) - p.cross(this.delta);
|
|
57
|
+
if (number_ === 0 || Math.abs(number_) / this.delta.norm < error) {
|
|
58
|
+
return 0 /* Top */;
|
|
59
|
+
}
|
|
60
|
+
return number_ > 0 ? 1 /* Left */ : -1 /* Right */;
|
|
61
|
+
}
|
|
62
|
+
pointOnTop(p, error) {
|
|
63
|
+
return this.pointOnSide(p, error) === 0 /* Top */;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Length of a line is the length between its two defining points
|
|
67
|
+
*/
|
|
68
|
+
get length() {
|
|
69
|
+
return this.delta.norm;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// src/vec2.ts
|
|
74
|
+
var Vec2 = class _Vec2 {
|
|
75
|
+
constructor(x, y) {
|
|
76
|
+
__publicField(this, "_norm");
|
|
77
|
+
__publicField(this, "_normalized");
|
|
78
|
+
__publicField(this, "_normSquared");
|
|
79
|
+
__publicField(this, "_x");
|
|
80
|
+
__publicField(this, "_y");
|
|
81
|
+
this._x = x;
|
|
82
|
+
this._y = y;
|
|
83
|
+
}
|
|
84
|
+
cross(that) {
|
|
85
|
+
return this._x * that._y - this._y * that._x;
|
|
86
|
+
}
|
|
87
|
+
dot(that) {
|
|
88
|
+
return this._x * that._x + this._y * that._y;
|
|
89
|
+
}
|
|
90
|
+
equals(that, error) {
|
|
91
|
+
if (error === 0) {
|
|
92
|
+
return this.x === that.x && this.y === that.y;
|
|
93
|
+
}
|
|
94
|
+
return this.minus(that).normSquared < error * error;
|
|
95
|
+
}
|
|
96
|
+
minus(that) {
|
|
97
|
+
return new _Vec2(this._x - that._x, this._y - that._y);
|
|
98
|
+
}
|
|
99
|
+
normal() {
|
|
100
|
+
return new _Vec2(this._y, -this._x);
|
|
101
|
+
}
|
|
102
|
+
over(s) {
|
|
103
|
+
return new _Vec2(this._x / s, this._y / s);
|
|
104
|
+
}
|
|
105
|
+
plus(that) {
|
|
106
|
+
return new _Vec2(this._x + that._x, this._y + that._y);
|
|
107
|
+
}
|
|
108
|
+
times(s) {
|
|
109
|
+
return new _Vec2(this._x * s, this._y * s);
|
|
110
|
+
}
|
|
111
|
+
toString() {
|
|
112
|
+
return `(${this.x}, ${this.y})`;
|
|
113
|
+
}
|
|
114
|
+
get norm() {
|
|
115
|
+
return this._norm === void 0 ? this._norm = Math.sqrt(this.normSquared) : this._norm;
|
|
116
|
+
}
|
|
117
|
+
get normalized() {
|
|
118
|
+
return this._normalized === void 0 ? this._normalized = this.over(this.norm) : this._normalized;
|
|
119
|
+
}
|
|
120
|
+
get normSquared() {
|
|
121
|
+
return this._normSquared === void 0 ? this._normSquared = this.dot(this) : this._normSquared;
|
|
122
|
+
}
|
|
123
|
+
get x() {
|
|
124
|
+
return this._x;
|
|
125
|
+
}
|
|
126
|
+
get y() {
|
|
127
|
+
return this._y;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
// src/inscribe.ts
|
|
132
|
+
var Wedge = class _Wedge {
|
|
133
|
+
constructor(leftArm, rightArm, isDegenerate = false) {
|
|
134
|
+
__publicField(this, "isDegenerate");
|
|
135
|
+
__publicField(this, "leftArm");
|
|
136
|
+
__publicField(this, "rightArm");
|
|
137
|
+
this.leftArm = leftArm;
|
|
138
|
+
this.rightArm = rightArm;
|
|
139
|
+
this.isDegenerate = isDegenerate;
|
|
140
|
+
}
|
|
141
|
+
static new(leftArm, rightArm, error) {
|
|
142
|
+
if (leftArm === null || rightArm === null) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
if (error !== 0 && leftArm.overlaps(rightArm, error)) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const deviationFromZeroAngle = 0.1 / (leftArm.length * rightArm.length);
|
|
149
|
+
if (leftArm.parallel(rightArm, deviationFromZeroAngle)) {
|
|
150
|
+
const middle = new Line(leftArm.evaluate(0.5), rightArm.evaluate(0.5));
|
|
151
|
+
const p = middle.evaluate(0.5);
|
|
152
|
+
const sideLeft = leftArm.pointOnSide(p, error);
|
|
153
|
+
const sideRight = rightArm.pointOnSide(p, error);
|
|
154
|
+
if (sideLeft === 0 /* Top */ || sideRight === 0 /* Top */) {
|
|
155
|
+
throw new Error();
|
|
156
|
+
}
|
|
157
|
+
return sideLeft !== sideRight ? new _Wedge(leftArm, rightArm, true) : new _Wedge(leftArm, new Line(rightArm.end, rightArm.start));
|
|
158
|
+
}
|
|
159
|
+
const tLA = leftArm.intersectionParameter(rightArm, 0);
|
|
160
|
+
const tRA = rightArm.intersectionParameter(leftArm, 0);
|
|
161
|
+
if (tLA === 0.5 || tRA === 0.5) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
const W = leftArm.evaluate(tLA);
|
|
165
|
+
const eLA = tLA < 1 - tLA ? leftArm.end : leftArm.start;
|
|
166
|
+
const eRA = tRA < 1 - tRA ? rightArm.end : rightArm.start;
|
|
167
|
+
return new _Wedge(new Line(W, eLA), new Line(W, eRA));
|
|
168
|
+
}
|
|
169
|
+
fit_Dl(l, error) {
|
|
170
|
+
if (!this.formTriangle(l, error)) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
const A = l.intersectionPoint(this.rightArm, 0);
|
|
174
|
+
const B = l.intersectionPoint(this.leftArm, 0);
|
|
175
|
+
const AB = new Line(A, B);
|
|
176
|
+
const Ap = this.leftArm.closestPoint(A);
|
|
177
|
+
const I = A.plus(Ap).over(2);
|
|
178
|
+
const r = A.minus(Ap).norm / 2;
|
|
179
|
+
const t1 = (AB.delta.cross(A.minus(I)) + r * AB.delta.norm) / AB.delta.cross(this.rightArm.delta);
|
|
180
|
+
const t2 = (AB.delta.cross(A.minus(I)) - r * AB.delta.norm) / AB.delta.cross(this.rightArm.delta);
|
|
181
|
+
const o1 = this.rightArm.delta.times(t1).plus(I);
|
|
182
|
+
const o2 = this.rightArm.delta.times(t2).plus(I);
|
|
183
|
+
return [
|
|
184
|
+
{
|
|
185
|
+
circle: { centre: o1, r },
|
|
186
|
+
tangentParameter: l.closestPointParam(o1)
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
circle: { centre: o2, r },
|
|
190
|
+
tangentParameter: l.closestPointParam(o2)
|
|
191
|
+
}
|
|
192
|
+
];
|
|
193
|
+
}
|
|
194
|
+
fit_Dp(p, error) {
|
|
195
|
+
if (!this.strictlyContains(p, error)) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
const A = this.rightArm.closestPoint(p);
|
|
199
|
+
const Ap = this.leftArm.closestPoint(A);
|
|
200
|
+
const I = A.plus(Ap).over(2);
|
|
201
|
+
const r = A.minus(Ap).norm / 2;
|
|
202
|
+
const a = this.rightArm.delta.normSquared;
|
|
203
|
+
const b = I.minus(p).dot(this.rightArm.delta) * 2;
|
|
204
|
+
const c = I.minus(p).normSquared - r * r;
|
|
205
|
+
const discriminant = b * b - 4 * a * c;
|
|
206
|
+
if (discriminant < (-10) ** -5) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
const t = [];
|
|
210
|
+
if (Math.abs(discriminant) < 10 ** -5) {
|
|
211
|
+
t.push(-b / (2 * a));
|
|
212
|
+
} else {
|
|
213
|
+
t.push((-b + Math.sqrt(discriminant)) / (2 * a));
|
|
214
|
+
t.push((-b - Math.sqrt(discriminant)) / (2 * a));
|
|
215
|
+
}
|
|
216
|
+
const result = [];
|
|
217
|
+
t.forEach((t0) => {
|
|
218
|
+
const O = this.rightArm.delta.times(t0).plus(I);
|
|
219
|
+
result.push({
|
|
220
|
+
circle: { centre: O, r },
|
|
221
|
+
tangent: new Line(p, p.plus(O.minus(p).normal()))
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
fit_NDl(l, error) {
|
|
227
|
+
if (!this.formTriangle(l, error)) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
const C = this.leftArm.start;
|
|
231
|
+
const A = l.intersectionPoint(this.leftArm, 0);
|
|
232
|
+
const B = l.intersectionPoint(this.rightArm, 0);
|
|
233
|
+
const AC = new Line(A, C);
|
|
234
|
+
const BC = new Line(B, C);
|
|
235
|
+
const AB = new Line(A, B);
|
|
236
|
+
const a = AC.length;
|
|
237
|
+
const b = BC.length;
|
|
238
|
+
const c = AB.length;
|
|
239
|
+
const s = (a + b + c) / 2;
|
|
240
|
+
if (s * (s - a) * (s - b) / (s - c) < 0) {
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
const r = Math.sqrt(s * (s - a) * (s - b) / (s - c));
|
|
244
|
+
const det = AB.delta.cross(AC.delta);
|
|
245
|
+
const lhsAll = [
|
|
246
|
+
new Vec2(B.cross(A) + r * c, C.cross(A) + r * a),
|
|
247
|
+
new Vec2(B.cross(A) + r * c, C.cross(A) - r * a),
|
|
248
|
+
new Vec2(B.cross(A) - r * c, C.cross(A) + r * a),
|
|
249
|
+
new Vec2(B.cross(A) - r * c, C.cross(A) - r * a)
|
|
250
|
+
];
|
|
251
|
+
const OAll = [];
|
|
252
|
+
lhsAll.forEach((lhs) => {
|
|
253
|
+
OAll.push(
|
|
254
|
+
new Vec2(
|
|
255
|
+
new Vec2(AB.delta.x, AC.delta.x).cross(lhs),
|
|
256
|
+
new Vec2(AB.delta.y, AC.delta.y).cross(lhs)
|
|
257
|
+
).over(-det)
|
|
258
|
+
);
|
|
259
|
+
});
|
|
260
|
+
let o = null;
|
|
261
|
+
const dists = [];
|
|
262
|
+
for (const O of OAll) {
|
|
263
|
+
dists.push({
|
|
264
|
+
norm: Math.abs(BC.distanceToPoint(O) / r - 1),
|
|
265
|
+
raw: Math.abs(BC.distanceToPoint(O) - r)
|
|
266
|
+
});
|
|
267
|
+
const absoluteError = Math.abs(BC.distanceToPoint(O) - r);
|
|
268
|
+
const relativeError = Math.abs(BC.distanceToPoint(O) / r - 1);
|
|
269
|
+
if ((absoluteError < 10 ** -5 || relativeError < 10 ** -5) && AC.pointOnSide(O) !== BC.pointOnSide(O)) {
|
|
270
|
+
o = O;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
let message = "";
|
|
275
|
+
if (o === null) {
|
|
276
|
+
message = "fit_NDl, centre is undefined";
|
|
277
|
+
for (let index = 0; index < OAll.length; index++) {
|
|
278
|
+
message += `centre: (${OAll[index].x}, ${OAll[index].y}), r: ${r}, dist raw: ${dists[index].raw}, dist norm: ${dists[index].norm}
|
|
279
|
+
`;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (o === null) {
|
|
283
|
+
throw new Error(message);
|
|
284
|
+
}
|
|
285
|
+
return [
|
|
286
|
+
{
|
|
287
|
+
circle: { centre: o, r },
|
|
288
|
+
tangentParameter: l.closestPointParam(o)
|
|
289
|
+
}
|
|
290
|
+
];
|
|
291
|
+
}
|
|
292
|
+
// While fitting circles into a wedge
|
|
293
|
+
// There are four distinct cases:
|
|
294
|
+
// 1. Wedge is degenerate and additional element is a point
|
|
295
|
+
// 2. Wedge is degenerate and additional element is a line
|
|
296
|
+
// 3. Wedge is non-degenerate and additional element is a point
|
|
297
|
+
// 4. Wedge is non-degenerate and additional element is a line
|
|
298
|
+
// according to these assumptions, the following methods are named
|
|
299
|
+
fit_NDp(p, error) {
|
|
300
|
+
if (!this.strictlyContains(p, error)) {
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
const C = this.leftArm.start;
|
|
304
|
+
const A = this.leftArm.end;
|
|
305
|
+
const B = this.rightArm.end;
|
|
306
|
+
const a = C.minus(B).norm;
|
|
307
|
+
const b = C.minus(A).norm;
|
|
308
|
+
const D = A.minus(B).times(a / (a + b)).plus(B);
|
|
309
|
+
const bisector = new Line(C, D);
|
|
310
|
+
const eA = D.minus(C).normSquared - (A.minus(C).cross(D.minus(C)) / b) ** 2;
|
|
311
|
+
const eB = D.minus(C).dot(C.minus(p)) * 2;
|
|
312
|
+
const eC = C.minus(p).normSquared;
|
|
313
|
+
const discriminant = eB * eB - 4 * eA * eC;
|
|
314
|
+
if (discriminant < (-10) ** -5) {
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
let O, r;
|
|
318
|
+
if (Math.abs(discriminant) < 10 ** -5) {
|
|
319
|
+
const t = -eB / (2 * eA);
|
|
320
|
+
O = bisector.evaluate(t);
|
|
321
|
+
r = O.minus(p).norm;
|
|
322
|
+
} else {
|
|
323
|
+
const t1 = (-eB + Math.sqrt(discriminant)) / (2 * eA);
|
|
324
|
+
const t2 = (-eB - Math.sqrt(discriminant)) / (2 * eA);
|
|
325
|
+
if (bisector.evaluate(t1).minus(p).normSquared > bisector.evaluate(t2).minus(p).normSquared) {
|
|
326
|
+
O = bisector.evaluate(t1);
|
|
327
|
+
r = bisector.evaluate(t1).minus(p).norm;
|
|
328
|
+
} else {
|
|
329
|
+
O = bisector.evaluate(t2);
|
|
330
|
+
r = bisector.evaluate(t2).minus(p).norm;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return [
|
|
334
|
+
{
|
|
335
|
+
circle: { centre: O, r },
|
|
336
|
+
tangent: new Line(p, p.plus(O.minus(p).normal()))
|
|
337
|
+
}
|
|
338
|
+
];
|
|
339
|
+
}
|
|
340
|
+
fitCircles(element, error) {
|
|
341
|
+
if (element instanceof Vec2) {
|
|
342
|
+
return this.isDegenerate ? this.fit_Dp(element, error) : this.fit_NDp(element, error);
|
|
343
|
+
}
|
|
344
|
+
if (element instanceof Line) {
|
|
345
|
+
return this.isDegenerate ? this.fit_Dl(element instanceof Line ? element : element, error) : this.fit_NDl(element instanceof Line ? element : element, error);
|
|
346
|
+
}
|
|
347
|
+
return null;
|
|
348
|
+
}
|
|
349
|
+
formTriangle(line, error) {
|
|
350
|
+
const thin = this.leftArm.parallel(line, 0.1 / (this.leftArm.length * line.length)) || this.rightArm.parallel(line, 0.1 / (this.rightArm.length * line.length));
|
|
351
|
+
if (thin) {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
const A = line.intersectionPoint(this.leftArm, 0);
|
|
355
|
+
const B = line.intersectionPoint(this.rightArm, 0);
|
|
356
|
+
if (this.isDegenerate) {
|
|
357
|
+
return !A.equals(B, error);
|
|
358
|
+
}
|
|
359
|
+
const C = this.leftArm.intersectionPoint(this.rightArm, 0);
|
|
360
|
+
return !C.equals(A, error) && !C.equals(B, error) && !A.equals(B, error) && !new Line(A, B).pointOnTop(C, error);
|
|
361
|
+
}
|
|
362
|
+
looselyContains(p, error) {
|
|
363
|
+
const pLeft = this.leftArm.pointOnSide(p, error);
|
|
364
|
+
const pRight = this.rightArm.pointOnSide(p, error);
|
|
365
|
+
if (pLeft === 0 /* Top */ || pRight === 0 /* Top */) {
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
if (pLeft === pRight) {
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
return this.isDegenerate ? (
|
|
372
|
+
// degenerate + different sides => true
|
|
373
|
+
true
|
|
374
|
+
) : (
|
|
375
|
+
// 2. (Because the arms intersect)
|
|
376
|
+
// Projection params of the point onto the arms must be larger than 0
|
|
377
|
+
this.leftArm.closestPointParam(p) >= 0 && this.rightArm.closestPointParam(p) >= 0
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
strictlyContains(p, error) {
|
|
381
|
+
const pLeft = this.leftArm.pointOnSide(p, error);
|
|
382
|
+
const pRight = this.rightArm.pointOnSide(p, error);
|
|
383
|
+
if (pLeft === 0 /* Top */ || pRight === 0 /* Top */) {
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
if (pLeft === pRight) {
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
389
|
+
return this.isDegenerate ? (
|
|
390
|
+
// degenerate + different sides => true
|
|
391
|
+
true
|
|
392
|
+
) : (
|
|
393
|
+
// 2. (Because the arms intersect)
|
|
394
|
+
// Projection params of the point onto the arms must be larger than 0
|
|
395
|
+
this.leftArm.closestPointParam(p) >= 0 && this.rightArm.closestPointParam(p) >= 0
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
toString() {
|
|
399
|
+
return `LA: ${this.leftArm.start.toString()} --> ${this.leftArm.end.toString()}
|
|
400
|
+
RA: ${this.rightArm.start.toString()} --> ${this.rightArm.end.toString()}`;
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
// src/index.ts
|
|
405
|
+
function lineTangentToHull(line, points, halo) {
|
|
406
|
+
let holds = true;
|
|
407
|
+
let side = 0 /* Top */;
|
|
408
|
+
let k = 0;
|
|
409
|
+
while (side === 0 /* Top */ && k < points.length) {
|
|
410
|
+
side = line.pointOnSide(points[k], halo);
|
|
411
|
+
k++;
|
|
412
|
+
}
|
|
413
|
+
for (let index = k; index < points.length; index++) {
|
|
414
|
+
const testSide = line.pointOnSide(points[index], halo);
|
|
415
|
+
if (testSide === 0 /* Top */) {
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
if (testSide !== side) {
|
|
419
|
+
holds = false;
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return { holds, side };
|
|
424
|
+
}
|
|
425
|
+
function findEnclosingSide(wedge, startVertex, endVertex, points, halo) {
|
|
426
|
+
let side = null;
|
|
427
|
+
let stopVertex = startVertex;
|
|
428
|
+
let vertex = startVertex;
|
|
429
|
+
while (side === null && vertex > endVertex) {
|
|
430
|
+
const p1 = points[vertex];
|
|
431
|
+
const p2 = points[vertex - 1];
|
|
432
|
+
const edge = new Line(p1, p2);
|
|
433
|
+
const circlesEdge = wedge.fitCircles(edge, halo);
|
|
434
|
+
if (circlesEdge !== null) {
|
|
435
|
+
let tangentParameter = 100;
|
|
436
|
+
if (wedge.isDegenerate) {
|
|
437
|
+
let sidedness = 0 /* Top */;
|
|
438
|
+
let k = 0;
|
|
439
|
+
while (sidedness === 0 /* Top */ && k < points.length) {
|
|
440
|
+
sidedness = edge.pointOnSide(points[k], halo);
|
|
441
|
+
k++;
|
|
442
|
+
}
|
|
443
|
+
tangentParameter = edge.pointOnSide(circlesEdge[0].circle.centre) !== sidedness ? circlesEdge[0].tangentParameter : circlesEdge[1].tangentParameter;
|
|
444
|
+
} else {
|
|
445
|
+
tangentParameter = circlesEdge[0].tangentParameter;
|
|
446
|
+
}
|
|
447
|
+
if (tangentParameter > 0 && tangentParameter < 1) {
|
|
448
|
+
const Y = edge.evaluate(tangentParameter);
|
|
449
|
+
const joint = wedge.leftArm.intersectionPoint(edge, halo);
|
|
450
|
+
side = new Line(joint, Y);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
if (side === null) {
|
|
454
|
+
const circlesPoint = wedge.fitCircles(p2, halo);
|
|
455
|
+
if (circlesPoint !== null) {
|
|
456
|
+
let tangent;
|
|
457
|
+
if (wedge.isDegenerate) {
|
|
458
|
+
let sidedness = 0 /* Top */;
|
|
459
|
+
let k = 0;
|
|
460
|
+
while (sidedness === 0 /* Top */ && k < points.length) {
|
|
461
|
+
sidedness = circlesPoint[0].tangent.pointOnSide(points[k], halo);
|
|
462
|
+
k++;
|
|
463
|
+
}
|
|
464
|
+
tangent = circlesPoint[0].tangent.pointOnSide(circlesPoint[0].circle.centre, halo) !== sidedness ? circlesPoint[0].tangent : circlesPoint[1].tangent;
|
|
465
|
+
} else {
|
|
466
|
+
tangent = circlesPoint[0].tangent;
|
|
467
|
+
}
|
|
468
|
+
if (lineTangentToHull(tangent, points, halo).holds) {
|
|
469
|
+
const joint = wedge.leftArm.intersectionPoint(tangent, halo);
|
|
470
|
+
side = new Line(joint, p2);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
stopVertex = vertex;
|
|
475
|
+
vertex--;
|
|
476
|
+
}
|
|
477
|
+
return side === null ? null : { side, stopVertex };
|
|
478
|
+
}
|
|
479
|
+
function findAntipode(points) {
|
|
480
|
+
let farthestIndex = 0;
|
|
481
|
+
let farthestDistribution = 0;
|
|
482
|
+
for (let index = 0, n = points.length; index < n; index++) {
|
|
483
|
+
const testDistribution = new Line(points[0], points[n - 1]).distanceToPoint(
|
|
484
|
+
points[index]
|
|
485
|
+
);
|
|
486
|
+
if (testDistribution > farthestDistribution) {
|
|
487
|
+
farthestDistribution = testDistribution;
|
|
488
|
+
farthestIndex = index;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return farthestIndex;
|
|
492
|
+
}
|
|
493
|
+
function minTriangleWithBase(convexHull, error, tol) {
|
|
494
|
+
let AB, AC;
|
|
495
|
+
const n = convexHull.length;
|
|
496
|
+
const BC = new Line(convexHull[0], convexHull[n - 1]);
|
|
497
|
+
const antipodIndex = findAntipode(convexHull);
|
|
498
|
+
const baseParallel = new Line(convexHull[antipodIndex], convexHull[antipodIndex].plus(BC.delta));
|
|
499
|
+
let wedge = Wedge.new(BC, baseParallel, error);
|
|
500
|
+
let Pn = n - 1;
|
|
501
|
+
let Qn = antipodIndex;
|
|
502
|
+
do {
|
|
503
|
+
const CQinfo = findEnclosingSide(wedge, Pn, antipodIndex, convexHull, error);
|
|
504
|
+
if (CQinfo === null) {
|
|
505
|
+
return null;
|
|
506
|
+
}
|
|
507
|
+
({ side: AC, stopVertex: Pn } = CQinfo);
|
|
508
|
+
wedge = Wedge.new(wedge.leftArm, AC, error);
|
|
509
|
+
const BPinfo = findEnclosingSide(wedge, Qn, 0, convexHull, error);
|
|
510
|
+
if (BPinfo === null) {
|
|
511
|
+
return null;
|
|
512
|
+
}
|
|
513
|
+
({ side: AB, stopVertex: Qn } = BPinfo);
|
|
514
|
+
wedge = Wedge.new(wedge.leftArm, AB, error);
|
|
515
|
+
} while (AB.length - AC.length > tol);
|
|
516
|
+
const A = AC.intersectionPoint(AB, 0);
|
|
517
|
+
const B = AB.start;
|
|
518
|
+
const C = AC.start;
|
|
519
|
+
return { A, B, C };
|
|
520
|
+
}
|
|
521
|
+
function minTriangle(convexHull, error, tol) {
|
|
522
|
+
if (convexHull.length < 3) {
|
|
523
|
+
return null;
|
|
524
|
+
}
|
|
525
|
+
if (convexHull.length === 3) {
|
|
526
|
+
return { A: convexHull[0], B: convexHull[1], C: convexHull[2] };
|
|
527
|
+
}
|
|
528
|
+
const points = convexHull.map((p) => new Vec2(p.x, p.y));
|
|
529
|
+
let A = null;
|
|
530
|
+
let B = null;
|
|
531
|
+
let C = null;
|
|
532
|
+
let perimeter = -1;
|
|
533
|
+
let rotations = 0;
|
|
534
|
+
while (rotations < points.length) {
|
|
535
|
+
if (rotations > 0) {
|
|
536
|
+
points.push(points.shift());
|
|
537
|
+
}
|
|
538
|
+
const triangle = minTriangleWithBase(points, error, tol);
|
|
539
|
+
if (triangle !== null) {
|
|
540
|
+
const { A: A1, B: B1, C: C1 } = triangle;
|
|
541
|
+
const perimeter1 = A1.minus(B1).norm + B1.minus(C1).norm + C1.minus(A1).norm;
|
|
542
|
+
if (perimeter1 < perimeter || perimeter === -1) {
|
|
543
|
+
[A, B, C] = [A1, B1, C1];
|
|
544
|
+
perimeter = perimeter1;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
rotations++;
|
|
548
|
+
}
|
|
549
|
+
return perimeter === -1 ? null : {
|
|
550
|
+
A: { x: A.x, y: A.y },
|
|
551
|
+
B: { x: B.x, y: B.y },
|
|
552
|
+
C: { x: C.x, y: C.y }
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
export { lineTangentToHull, minTriangle, minTriangleWithBase };
|
|
557
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/line.ts","../../src/vec2.ts","../../src/inscribe.ts","../../src/index.ts"],"names":[],"mappings":";;;;;AAQO,IAAM,OAAN,MAAW;AAAA,EAKhB,WAAA,CAAY,OAAa,GAAA,EAAW;AAJpC,IAAA,aAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAGP,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEA,aAAa,CAAA,EAAe;AAC1B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,EAChD;AAAA,EAEA,kBAAkB,CAAA,EAAiB;AACjC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,KAAA,CAAM,KAAK,KAAK,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,WAAA;AAAA,EAC1D;AAAA,EAEA,gBAAgB,CAAA,EAAiB;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAA,CAAM,KAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,CAAK,GAAG,CAAC,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA;AAAA,EACjF;AAAA,EAEA,SAAS,CAAA,EAAiB;AACxB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC5C;AAAA,EAEA,qBAAA,CAAsB,MAAY,KAAA,EAA8B;AAC9D,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAK,KAAK,CAAA;AACrC,IAAA,IAAI,MAAM,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAC,IAAI,KAAA,EAAO;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAe,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAK,KAAK,CAAA;AAChD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,GAAI,CAAA;AAAA,EACpC;AAAA,EAEA,iBAAA,CAAkB,MAAY,KAAA,EAA4B;AACxD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,qBAAA,CAAsB,IAAA,EAAM,KAAK,CAAA;AAChD,IAAA,OAAO,CAAA,KAAM,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EAC5C;AAAA,EAEA,QAAA,CAAS,MAAY,KAAA,EAAwB;AAC3C,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,KAAK,KAAK,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAA,CAAS,MAAY,sBAAA,EAAyC;AAC5D,IAAA,MAAM,CAAA,GAAY,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAEvD,IAAA,OAAO,CAAA,KAAM,KAAK,CAAA,GAAI,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,sBAAsB,CAAA;AAAA,EACnF;AAAA,EAEA,WAAA,CAAY,CAAA,EAAS,KAAA,GAAQ,CAAA,EAAW;AACtC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC/D,IAAA,IAAI,OAAA,KAAY,KAAK,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAA,EAAO;AAChE,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,OAAA,GAAU,IAAI,CAAA,cAAY,EAAA;AAAA,EACnC;AAAA,EAEA,UAAA,CAAW,GAAS,KAAA,EAAwB;AAC1C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,CAAA,EAAG,KAAK,CAAA,KAAM,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AACF,CAAA;;;ACrFO,IAAM,IAAA,GAAN,MAAM,KAAA,CAAK;AAAA,EAQhB,WAAA,CAAY,GAAW,CAAA,EAAW;AAPlC,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,aAAA,CAAA;AAER,IAAA,aAAA,CAAA,IAAA,EAAQ,cAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAiB,IAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,IAAA,CAAA;AAGf,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AAAA,EACZ;AAAA,EAEA,MAAM,IAAA,EAAoB;AACxB,IAAA,OAAO,KAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,KAAK,IAAA,CAAK,EAAA;AAAA,EAC5C;AAAA,EAEA,IAAI,IAAA,EAAoB;AACtB,IAAA,OAAO,KAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,KAAK,IAAA,CAAK,EAAA;AAAA,EAC5C;AAAA,EAEA,MAAA,CAAO,MAAY,KAAA,EAAwB;AACzC,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,KAAK,CAAA,KAAM,IAAA,CAAK,CAAA,IAAK,IAAA,CAAK,MAAM,IAAA,CAAK,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,cAAc,KAAA,GAAQ,KAAA;AAAA,EAChD;AAAA,EAEA,MAAM,IAAA,EAAkB;AACtB,IAAA,OAAO,IAAI,MAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,EAAI,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAE,CAAA;AAAA,EACtD;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,OAAO,IAAI,KAAA,CAAK,IAAA,CAAK,EAAA,EAAI,CAAC,KAAK,EAAE,CAAA;AAAA,EACnC;AAAA,EAEA,KAAK,CAAA,EAAiB;AACpB,IAAA,OAAO,IAAI,KAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EAC1C;AAAA,EAEA,KAAK,IAAA,EAAkB;AACrB,IAAA,OAAO,IAAI,MAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,EAAI,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAE,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,CAAA,EAAiB;AACrB,IAAA,OAAO,IAAI,KAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EAC1C;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EAC9B;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA,KAAU,MAAA,GAAa,IAAA,CAAK,KAAA,GAAQ,KAAK,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,GAAK,IAAA,CAAK,KAAA;AAAA,EACtF;AAAA,EAEA,IAAI,UAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,WAAA,KAAgB,MAAA,GACvB,IAAA,CAAK,WAAA,GAAc,KAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,GACvC,IAAA,CAAK,WAAA;AAAA,EACX;AAAA,EAEA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,iBAAiB,MAAA,GACxB,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAClC,IAAA,CAAK,YAAA;AAAA,EACX;AAAA,EAEA,IAAI,CAAA,GAAY;AACd,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EACd;AAAA,EAEA,IAAI,CAAA,GAAY;AACd,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EACd;AACF,CAAA;;;AC9DO,IAAM,KAAA,GAAN,MAAM,MAAA,CAAM;AAAA,EAKT,WAAA,CAAY,OAAA,EAAe,QAAA,EAAgB,YAAA,GAAe,KAAA,EAAO;AAJzE,IAAA,aAAA,CAAA,IAAA,EAAS,cAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,SAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AAGP,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AAAA,EAEA,OAAO,GAAA,CAAI,OAAA,EAAe,QAAA,EAAgB,KAAA,EAA6B;AACrE,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,QAAA,KAAa,IAAA,EAAM;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,UAAU,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,QAAA,EAAU,KAAK,CAAA,EAAG;AACpD,MAAA,OAAO,IAAA;AAAA,IACT;AAKA,IAAA,MAAM,sBAAA,GAAyB,GAAA,IAAO,OAAA,CAAQ,MAAA,GAAS,QAAA,CAAS,MAAA,CAAA;AAChE,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,QAAA,EAAU,sBAAsB,CAAA,EAAG;AAGtD,MAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG,QAAA,CAAS,QAAA,CAAS,GAAG,CAAC,CAAA;AACrE,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AAS7B,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,WAAA,CAAY,CAAA,EAAG,KAAK,CAAA;AAC7C,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,WAAA,CAAY,CAAA,EAAG,KAAK,CAAA;AAC/C,MAAA,IAAI,4BAAyB,SAAA,KAAA,CAAA,YAAwB;AAEnD,QAAA,MAAM,IAAI,KAAA,EAAM;AAAA,MAClB;AAEA,MAAA,OAAO,aAAa,SAAA,GAChB,IAAI,MAAA,CAAM,OAAA,EAAS,UAAU,IAAI,CAAA,GACjC,IAAI,MAAA,CAAM,SAAS,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC/D;AAIA,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,qBAAA,CAAsB,QAAA,EAAU,CAAC,CAAA;AACrD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,qBAAA,CAAsB,OAAA,EAAS,CAAC,CAAA;AAGrD,IAAA,IAAI,GAAA,KAAQ,GAAA,IAAO,GAAA,KAAQ,GAAA,EAAK;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA;AAI9B,IAAA,MAAM,MAAM,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,OAAA,CAAQ,MAAM,OAAA,CAAQ,KAAA;AAElD,IAAA,MAAM,MAAM,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,QAAA,CAAS,MAAM,QAAA,CAAS,KAAA;AAEpD,IAAA,OAAO,IAAI,MAAA,CAAM,IAAI,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACrD;AAAA,EAEQ,MAAA,CACN,GACA,KAAA,EAC4D;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,KAAK,CAAA,EAAG;AAEhC,MAAA,OAAO,IAAA;AAAA,IACT;AAWA,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAC,CAAA;AAC9C,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,iBAAA,CAAkB,IAAA,CAAK,SAAS,CAAC,CAAA;AAE7C,IAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAA;AAItC,IAAA,MAAM,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA;AAC3B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,EAAE,EAAE,IAAA,GAAO,CAAA;AAG7B,IAAA,MAAM,MACH,EAAA,CAAG,KAAA,CAAM,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,MAAM,IAAA,IAAQ,EAAA,CAAG,MAAM,KAAA,CAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AACvF,IAAA,MAAM,MACH,EAAA,CAAG,KAAA,CAAM,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,MAAM,IAAA,IAAQ,EAAA,CAAG,MAAM,KAAA,CAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AAEvF,IAAA,MAAM,EAAA,GAAW,KAAK,QAAA,CAAS,KAAA,CAAM,MAAM,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA;AACrD,IAAA,MAAM,EAAA,GAAW,KAAK,QAAA,CAAS,KAAA,CAAM,MAAM,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA;AAErD,IAAA,OAAO;AAAA,MACL;AAAA,QACE,MAAA,EAAQ,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,EAAE;AAAA,QACxB,gBAAA,EAAkB,CAAA,CAAE,iBAAA,CAAkB,EAAE;AAAA,OAC1C;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,EAAE;AAAA,QACxB,gBAAA,EAAkB,CAAA,CAAE,iBAAA,CAAkB,EAAE;AAAA;AAC1C,KACF;AAAA,EACF;AAAA,EAEQ,MAAA,CAAO,GAAS,KAAA,EAAgE;AACtF,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,CAAA,EAAG,KAAK,CAAA,EAAG;AAEpC,MAAA,OAAO,IAAA;AAAA,IACT;AAaA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,CAAC,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAA;AAItC,IAAA,MAAM,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA;AAC3B,IAAA,MAAM,CAAA,GAAY,CAAA,CAAE,KAAA,CAAM,EAAE,EAAE,IAAA,GAAO,CAAA;AAKrC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,WAAA;AAC9B,IAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,CAAC,EAAE,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,GAAI,CAAA;AAChD,IAAA,MAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,cAAc,CAAA,GAAI,CAAA;AACvC,IAAA,MAAM,YAAA,GAAe,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAErC,IAAA,IAAI,YAAA,GAAgB,SAAQ,EAAA,EAAI;AAG9B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAc,EAAC;AAErB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA,GAAI,MAAM,EAAA,EAAI;AACrC,MAAA,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA,GAAI,CAAA,CAAE,CAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,CAAA,CAAE,IAAA,CAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,YAAY,CAAA,KAAM,IAAI,CAAA,CAAE,CAAA;AAC/C,MAAA,CAAA,CAAE,IAAA,CAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,YAAY,CAAA,KAAM,IAAI,CAAA,CAAE,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,SAAmD,EAAC;AAE1D,IAAA,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAe;AACxB,MAAA,MAAM,CAAA,GAAI,KAAK,QAAA,CAAS,KAAA,CAAM,MAAM,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAE;AAAA,QACvB,OAAA,EAAS,IAAI,IAAA,CAAK,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAC;AAAA,OACjD,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,OAAA,CACN,GACA,KAAA,EAC4D;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,KAAK,CAAA,EAAG;AAEhC,MAAA,OAAO,IAAA;AAAA,IACT;AAMA,IAAA,MAAM,CAAA,GAAI,KAAK,OAAA,CAAQ,KAAA;AAGvB,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,iBAAA,CAAkB,IAAA,CAAK,SAAS,CAAC,CAAA;AAG7C,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAC,CAAA;AAG9C,IAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AAGxB,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA;AAExB,IAAA,IAAK,KAAK,CAAA,GAAI,CAAA,CAAA,IAAM,IAAI,CAAA,CAAA,IAAO,CAAA,GAAI,KAAK,CAAA,EAAG;AAGzC,MAAA,OAAO,IAAA;AAAA,IACT;AAIA,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,CAAM,CAAA,IAAK,IAAI,CAAA,CAAA,IAAM,CAAA,GAAI,CAAA,CAAA,IAAO,CAAA,GAAI,CAAA,CAAE,CAAA;AAErD,IAAA,MAAM,GAAA,GAAc,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,GAAG,KAAK,CAAA;AAE3C,IAAA,MAAM,MAAA,GAAiB;AAAA,MACrB,IAAI,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,MAC/C,IAAI,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,MAC/C,IAAI,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,MAC/C,IAAI,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,IAAI,CAAC;AAAA,KACjD;AAGA,IAAA,MAAM,OAAe,EAAC;AACtB,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,GAAA,KAAc;AAC5B,MAAA,IAAA,CAAK,IAAA;AAAA,QACH,IAAI,IAAA;AAAA,UACF,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,GAAG,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AAAA,UAC1C,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,GAAG,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG;AAAA,SAC5C,CAAE,IAAA,CAAK,CAAC,GAAG;AAAA,OACb;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,IAAI,CAAA,GAAiB,IAAA;AACrB,IAAA,MAAM,QAA8C,EAAC;AACrD,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,KAAK,GAAA,CAAI,EAAA,CAAG,gBAAgB,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,QAC5C,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,eAAA,CAAgB,CAAC,IAAI,CAAC;AAAA,OACxC,CAAA;AAED,MAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,GAAG,eAAA,CAAgB,CAAC,IAAI,CAAC,CAAA;AAGxD,MAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,CAAI,EAAA,CAAG,gBAAgB,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAC5D,MAAA,IAAA,CACG,aAAA,GAAgB,EAAA,IAAM,EAAA,IAAM,aAAA,GAAgB,EAAA,IAAM,EAAA,KACnD,EAAA,CAAG,WAAA,CAAY,CAAC,CAAA,KAAM,EAAA,CAAG,WAAA,CAAY,CAAC,CAAA,EACtC;AACA,QAAA,CAAA,GAAI,CAAA;AACJ,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,OAAA,GAAU,8BAAA;AACV,MAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,IAAA,CAAK,QAAQ,KAAA,EAAA,EAAS;AAChD,QAAA,OAAA,IAAW,CAAA,SAAA,EAAY,KAAK,KAAK,CAAA,CAAE,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,CAAA,CAAE,CAAC,SAAS,CAAC,CAAA,YAAA,EAAe,MAAM,KAAK,CAAA,CAAE,GAAG,CAAA,cAAA,EAAiB,KAAA,CAAM,KAAK,CAAA,CAAE,IAAI;AAAA,CAAA;AAAA,MACnI;AAAA,IACF;AACA,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAE;AAAA,QACvB,gBAAA,EAAkB,CAAA,CAAE,iBAAA,CAAkB,CAAC;AAAA;AACzC,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,OAAA,CAAQ,GAAS,KAAA,EAAgE;AACvF,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,CAAA,EAAG,KAAK,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAcA,IAAA,MAAM,CAAA,GAAI,KAAK,OAAA,CAAQ,KAAA;AACvB,IAAA,MAAM,CAAA,GAAI,KAAK,OAAA,CAAQ,GAAA;AACvB,IAAA,MAAM,CAAA,GAAI,KAAK,QAAA,CAAS,GAAA;AAExB,IAAA,MAAM,CAAA,GAAY,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA;AAC7B,IAAA,MAAM,CAAA,GAAY,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA;AAE7B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAChB,KAAA,CAAM,CAAA,IAAK,CAAA,GAAI,CAAA,CAAE,CAAA,CACjB,IAAA,CAAK,CAAC,CAAA;AAET,IAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AAE9B,IAAA,MACE,KAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,eAAe,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,IAAI,CAAA,KAAM,CAAA;AACtE,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,CAAA;AACxC,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA;AACtB,IAAA,MAAM,YAAA,GAAe,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,EAAA;AAExC,IAAA,IAAI,YAAA,GAAgB,SAAQ,EAAA,EAAI;AAG9B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAA,EAAS,CAAA;AAEb,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA,GAAI,MAAM,EAAA,EAAI;AACrC,MAAA,MAAM,CAAA,GAAI,CAAC,EAAA,IAAM,CAAA,GAAI,EAAA,CAAA;AACrB,MAAA,CAAA,GAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AACvB,MAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAM,MAAM,CAAC,EAAA,GAAK,KAAK,IAAA,CAAK,YAAY,MAAM,CAAA,GAAI,EAAA,CAAA;AAClD,MAAA,MAAM,MAAM,CAAC,EAAA,GAAK,KAAK,IAAA,CAAK,YAAY,MAAM,CAAA,GAAI,EAAA,CAAA;AAElD,MAAA,IAAI,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,WAAA,GAAc,QAAA,CAAS,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,EAAE,WAAA,EAAa;AAC3F,QAAA,CAAA,GAAI,QAAA,CAAS,SAAS,EAAE,CAAA;AACxB,QAAA,CAAA,GAAI,SAAS,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,CAAA,GAAI,QAAA,CAAS,SAAS,EAAE,CAAA;AACxB,QAAA,CAAA,GAAI,SAAS,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAE;AAAA,QACvB,OAAA,EAAS,IAAI,IAAA,CAAK,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAC;AAAA;AAClD,KACF;AAAA,EACF;AAAA,EASA,UAAA,CAAW,SAAsB,KAAA,EAAe;AAC9C,IAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,MAAA,OAAO,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAA;AAAA,IACtF;AACA,IAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,MAAA,OAAO,KAAK,YAAA,GACR,IAAA,CAAK,MAAA,CAAO,OAAA,YAAmB,OAAO,OAAA,GAAU,OAAA,EAAS,KAAK,CAAA,GAC9D,KAAK,OAAA,CAAQ,OAAA,YAAmB,IAAA,GAAO,OAAA,GAAU,SAAS,KAAK,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,MAAY,KAAA,EAAwB;AAC/C,IAAA,MAAM,IAAA,GACJ,KAAK,OAAA,CAAQ,QAAA,CAAS,MAAM,GAAA,IAAO,IAAA,CAAK,QAAQ,MAAA,GAAS,IAAA,CAAK,OAAO,CAAA,IACrE,IAAA,CAAK,SAAS,QAAA,CAAS,IAAA,EAAM,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,CAAA;AACzE,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,SAAS,CAAC,CAAA;AAChD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAC,CAAA;AAEjD,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA;AAAA,IAC3B;AAEA,IAAA,MAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAC,CAAA;AAEzD,IAAA,OACE,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA,IAClB,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA,IAClB,CAAC,EAAE,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA,IAClB,CAAC,IAAI,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,CAAE,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA;AAAA,EAEvC;AAAA,EACA,eAAA,CAAgB,GAAS,KAAA,EAAwB;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,GAAG,KAAK,CAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,GAAG,KAAK,CAAA;AAEjD,IAAA,IAAI,yBAAsB,MAAA,KAAA,CAAA,YAAqB;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT;AAIA,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA;AAAA,MAER;AAAA;AAAA;AAAA;AAAA,MAGA,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CAAC,CAAA,IAAK,KAAK,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,CAAC,CAAA,IAAK;AAAA,KAAA;AAAA,EACtF;AAAA,EACA,gBAAA,CAAiB,GAAS,KAAA,EAAwB;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,GAAG,KAAK,CAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,GAAG,KAAK,CAAA;AAEjD,IAAA,IAAI,yBAAsB,MAAA,KAAA,CAAA,YAAqB;AAC7C,MAAA,OAAO,KAAA;AAAA,IACT;AAIA,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA;AAAA,MAER;AAAA;AAAA;AAAA;AAAA,MAGA,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CAAC,CAAA,IAAK,KAAK,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,CAAC,CAAA,IAAK;AAAA,KAAA;AAAA,EACtF;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OACE,CAAA,IAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,CAAA,KAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU;AAAA,IAAA,EAChE,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAA,EAAU,QAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,CAAA,CAAA;AAAA,EAE7E;AACF,CAAA;;;ACjdO,SAAS,iBAAA,CACd,IAAA,EACA,MAAA,EACA,IAAA,EACkC;AAClC,EAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,EAAA,IAAI,IAAA,GAAA,CAAA;AAEJ,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,IAAA,KAAA,CAAA,cAAqB,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ;AAC7C,IAAA,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA;AACvC,IAAA,CAAA,EAAA;AAAA,EACF;AAEA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAA,EAAA,EAAS;AAClD,IAAA,MAAM,WAAW,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAK,GAAG,IAAI,CAAA;AACrD,IAAA,IAAI,QAAA,KAAA,CAAA,YAAuB;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,KAAA,GAAQ,KAAA;AACR,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAYA,SAAS,iBAAA,CACP,KAAA,EACA,WAAA,EACA,SAAA,EACA,QACA,IAAA,EAC2C;AAE3C,EAAA,IAAI,IAAA,GAAoB,IAAA;AAExB,EAAA,IAAI,UAAA,GAAa,WAAA;AAEjB,EAAA,IAAI,MAAA,GAAS,WAAA;AAEb,EAAA,OAAO,IAAA,KAAS,IAAA,IAAQ,MAAA,GAAS,SAAA,EAAW;AAC1C,IAAA,MAAM,EAAA,GAAK,OAAO,MAAM,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAG5B,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AAE5B,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA;AAC/C,IAAA,IAAI,gBAAgB,IAAA,EAAM;AAIxB,MAAA,IAAI,gBAAA,GAAmB,GAAA;AACvB,MAAA,IAAI,MAAM,YAAA,EAAc;AAEtB,QAAA,IAAI,SAAA,GAAA,CAAA;AACJ,QAAA,IAAI,CAAA,GAAI,CAAA;AACR,QAAA,OAAO,SAAA,KAAA,CAAA,cAA0B,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ;AAClD,UAAA,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA;AAC5C,UAAA,CAAA,EAAA;AAAA,QACF;AAEA,QAAA,gBAAA,GACE,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,CAAC,EAAE,MAAA,CAAO,MAAM,CAAA,KAAM,SAAA,GAC/C,YAAY,CAAC,CAAA,CAAE,gBAAA,GACf,WAAA,CAAY,CAAC,CAAA,CAAE,gBAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,gBAAA,GAAmB,WAAA,CAAY,CAAC,CAAA,CAAE,gBAAA;AAAA,MACpC;AAGA,MAAA,IAAI,gBAAA,GAAmB,CAAA,IAAK,gBAAA,GAAmB,CAAA,EAAG;AAChD,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,gBAAgB,CAAA;AACxC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,iBAAA,CAAkB,MAAM,IAAI,CAAA;AACxD,QAAA,IAAA,GAAO,IAAI,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF;AAGA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,UAAA,CAAW,EAAA,EAAI,IAAI,CAAA;AAC9C,MAAA,IAAI,iBAAiB,IAAA,EAAM;AAIzB,QAAA,IAAI,OAAA;AACJ,QAAA,IAAI,MAAM,YAAA,EAAc;AAEtB,UAAA,IAAI,SAAA,GAAA,CAAA;AACJ,UAAA,IAAI,CAAA,GAAI,CAAA;AACR,UAAA,OAAO,SAAA,KAAA,CAAA,cAA0B,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ;AAClD,YAAA,SAAA,GAAY,YAAA,CAAa,CAAC,CAAA,CAAE,OAAA,CAAQ,YAAY,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA;AAC/D,YAAA,CAAA,EAAA;AAAA,UACF;AAEA,UAAA,OAAA,GACE,aAAa,CAAC,CAAA,CAAE,QAAQ,WAAA,CAAY,YAAA,CAAa,CAAC,CAAA,CAAE,MAAA,CAAO,QAAQ,IAAI,CAAA,KAAM,YACzE,YAAA,CAAa,CAAC,EAAE,OAAA,GAChB,YAAA,CAAa,CAAC,CAAA,CAAE,OAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,YAAA,CAAa,CAAC,CAAA,CAAE,OAAA;AAAA,QAC5B;AAMA,QAAA,IAAI,iBAAA,CAAkB,OAAA,EAAS,MAAA,EAAQ,IAAI,EAAE,KAAA,EAAO;AAClD,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,iBAAA,CAAkB,SAAS,IAAI,CAAA;AAC3D,UAAA,IAAA,GAAO,IAAI,IAAA,CAAK,KAAA,EAAO,EAAE,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AACA,IAAA,UAAA,GAAa,MAAA;AACb,IAAA,MAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,EAAE,MAAM,UAAA,EAAW;AACnD;AAEA,SAAS,aAAa,MAAA,EAAgB;AAEpC,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,oBAAA,GAAuB,CAAA;AAE3B,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,CAAA,GAAY,OAAO,MAAA,EAAQ,KAAA,GAAQ,GAAG,KAAA,EAAA,EAAS;AAEjE,IAAA,MAAM,gBAAA,GAA2B,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,GAAG,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA,CAAE,eAAA;AAAA,MAClE,OAAO,KAAK;AAAA,KACd;AACA,IAAA,IAAI,mBAAmB,oBAAA,EAAsB;AAC3C,MAAA,oBAAA,GAAuB,gBAAA;AACvB,MAAA,aAAA,GAAgB,KAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,aAAA;AACT;AASO,SAAS,mBAAA,CACd,UAAA,EACA,KAAA,EACA,GAAA,EACsC;AAEtC,EAAA,IAAI,EAAA,EAAU,EAAA;AAId,EAAA,MAAM,IAAI,UAAA,CAAW,MAAA;AACrB,EAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,EAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAGpD,EAAA,MAAM,YAAA,GAAe,aAAa,UAAU,CAAA;AAC5C,EAAA,MAAM,YAAA,GAAe,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG,UAAA,CAAW,YAAY,CAAA,CAAE,IAAA,CAAK,EAAA,CAAG,KAAK,CAAC,CAAA;AAG/F,EAAA,IAAI,KAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,cAAc,KAAK,CAAA;AAGtD,EAAA,IAAI,KAAK,CAAA,GAAI,CAAA;AACb,EAAA,IAAI,EAAA,GAAK,YAAA;AAET,EAAA,GAAG;AAGD,IAAA,MAAM,SAAS,iBAAA,CAAkB,KAAA,EAAO,EAAA,EAAI,YAAA,EAAc,YAAY,KAAK,CAAA;AAC3E,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAO,IAAA;AAAA,IACT;AACC,IAAA,CAAC,EAAE,IAAA,EAAM,EAAA,EAAI,UAAA,EAAY,IAAG,GAAI,MAAA;AAKjC,IAAA,KAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,IAAI,KAAK,CAAA;AAEnD,IAAA,MAAM,SAAS,iBAAA,CAAkB,KAAA,EAAO,EAAA,EAAI,CAAA,EAAG,YAAY,KAAK,CAAA;AAChE,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAO,IAAA;AAAA,IACT;AACC,IAAA,CAAC,EAAE,IAAA,EAAM,EAAA,EAAI,UAAA,EAAY,IAAG,GAAI,MAAA;AAIjC,IAAA,KAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,IAAI,KAAK,CAAA;AAAA,EAGrD,CAAA,QAAS,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,MAAA,GAAS,GAAA;AAEjC,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,iBAAA,CAAkB,EAAA,EAAI,CAAC,CAAA;AACpC,EAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AACb,EAAA,MAAM,IAAI,EAAA,CAAG,KAAA;AAEb,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACnB;AAEO,SAAS,WAAA,CACd,UAAA,EACA,KAAA,EACA,GAAA,EAKO;AACP,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,CAAA,EAAG,UAAA,CAAW,CAAC,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,CAAC,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,CAAC,CAAA,EAAE;AAAA,EAChE;AAEA,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAgC,IAAI,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAEjF,EAAA,IAAI,CAAA,GAAiB,IAAA;AACrB,EAAA,IAAI,CAAA,GAAiB,IAAA;AACrB,EAAA,IAAI,CAAA,GAAiB,IAAA;AACrB,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,OAAO,SAAA,GAAY,OAAO,MAAA,EAAQ;AAEhC,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAQ,CAAA;AAAA,IAC7B;AAGA,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,MAAA,EAAQ,KAAA,EAAO,GAAG,CAAA;AAGvD,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,MAAM,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,IAAG,GAAI,QAAA;AAEhC,MAAA,MAAM,UAAA,GAAa,EAAA,CAAG,KAAA,CAAM,EAAE,EAAE,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA;AACxE,MAAA,IAAI,UAAA,GAAa,SAAA,IAAa,SAAA,KAAc,EAAA,EAAI;AAC7C,QAAA,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,CAAC,EAAA,EAAI,IAAI,EAAE,CAAA;AACxB,QAAA,SAAA,GAAY,UAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,SAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,SAAA,KAAc,KACjB,IAAA,GACA;AAAA,IACE,GAAG,EAAE,CAAA,EAAG,EAAG,CAAA,EAAG,CAAA,EAAG,EAAG,CAAA,EAAE;AAAA,IACtB,GAAG,EAAE,CAAA,EAAG,EAAG,CAAA,EAAG,CAAA,EAAG,EAAG,CAAA,EAAE;AAAA,IACtB,GAAG,EAAE,CAAA,EAAG,EAAG,CAAA,EAAG,CAAA,EAAG,EAAG,CAAA;AAAE,GACxB;AACN;;;;"}
|