@math.gl/dggs 5.0.0-alpha.4 → 5.0.0-alpha.6

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/dist/s2.cjs CHANGED
@@ -20,22 +20,42 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  var s2_exports = {};
21
21
  __export(s2_exports, {
22
22
  S2Decoder: () => S2Decoder,
23
- getS2ChildIndex: () => getS2ChildIndex
23
+ getS2BoundaryFlat: () => getS2BoundaryFlat,
24
+ getS2Bounds: () => getS2Bounds,
25
+ getS2ChildIndex: () => getS2ChildIndex,
26
+ getS2DescendantIndex: () => getS2DescendantIndex,
27
+ getS2IndexFromCell: () => getS2IndexFromCell,
28
+ getS2IndexFromToken: () => getS2IndexFromToken,
29
+ getS2Level: () => getS2Level,
30
+ getS2LngLat: () => getS2LngLat,
31
+ getS2TokenFromIndex: () => getS2TokenFromIndex,
32
+ isS2IndexValid: () => isS2IndexValid,
33
+ isS2TokenValid: () => isS2TokenValid
24
34
  });
25
35
  module.exports = __toCommonJS(s2_exports);
26
36
 
27
37
  // dist/s2-geometry/s2-token.js
38
+ var MAXIMUM_TOKEN_LENGTH = 16;
39
+ var MAXIMUM_S2_INDEX = (1n << 64n) - 1n;
40
+ var VALID_LOWEST_ON_BITS = 0x1555555555555555n;
41
+ var MAXIMUM_LEVEL = 30;
28
42
  function getS2IndexFromToken(token) {
29
43
  if (token === "X") {
30
- token = "";
44
+ return 0n;
31
45
  }
32
- const paddedToken = token.padEnd(16, "0");
46
+ if (!isS2TokenValid(token)) {
47
+ throw new Error(`Invalid S2 token: ${token}`);
48
+ }
49
+ const paddedToken = token.padEnd(MAXIMUM_TOKEN_LENGTH, "0");
33
50
  return BigInt(`0x${paddedToken}`);
34
51
  }
35
52
  function getS2TokenFromIndex(cellId) {
36
53
  if (cellId === 0n) {
37
54
  return "X";
38
55
  }
56
+ if (!isS2IndexValid(cellId)) {
57
+ throw new Error(`Invalid S2 index: ${cellId}`);
58
+ }
39
59
  let numZeroDigits = countTrailingZeros(cellId);
40
60
  const remainder = numZeroDigits % 4;
41
61
  numZeroDigits = (numZeroDigits - remainder) / 4;
@@ -46,13 +66,43 @@ function getS2TokenFromIndex(cellId) {
46
66
  const zeroString = Array(17 - trailingZeroHexChars - hexString.length).join("0");
47
67
  return zeroString + hexString;
48
68
  }
69
+ function isS2IndexValid(s2Index) {
70
+ if (typeof s2Index !== "bigint" || s2Index <= 0n || s2Index > MAXIMUM_S2_INDEX) {
71
+ return false;
72
+ }
73
+ const face = s2Index >> 61n;
74
+ const lowestOnBit = s2Index & -s2Index;
75
+ return face < 6n && (lowestOnBit & VALID_LOWEST_ON_BITS) !== 0n;
76
+ }
77
+ function isS2TokenValid(token) {
78
+ if (typeof token !== "string" || !/^[0-9a-fA-F]{1,16}$/.test(token) || token.endsWith("0")) {
79
+ return false;
80
+ }
81
+ const paddedToken = token.padEnd(MAXIMUM_TOKEN_LENGTH, "0");
82
+ return isS2IndexValid(BigInt(`0x${paddedToken}`));
83
+ }
84
+ function getS2Level(s2Index) {
85
+ if (!isS2IndexValid(s2Index)) {
86
+ throw new Error(`Invalid S2 index: ${s2Index}`);
87
+ }
88
+ return (60 - countTrailingZeros(s2Index)) / 2;
89
+ }
49
90
  function getS2ChildIndex(s2Index, index) {
91
+ if (!isS2IndexValid(s2Index)) {
92
+ throw new Error(`Invalid S2 index: ${s2Index}`);
93
+ }
94
+ if (!Number.isInteger(index) || index < 0 || index > 3) {
95
+ throw new Error(`Invalid S2 child index: ${index}`);
96
+ }
97
+ if (getS2Level(s2Index) === MAXIMUM_LEVEL) {
98
+ throw new Error("Cannot subdivide an S2 leaf cell");
99
+ }
50
100
  const newLsb = lsb(s2Index) >> 2n;
51
101
  const childCellId = s2Index + BigInt(2 * index + 1 - 4) * newLsb;
52
102
  return childCellId;
53
103
  }
54
104
  function lsb(cellId) {
55
- return cellId & cellId + 1n;
105
+ return cellId & -cellId;
56
106
  }
57
107
  function countTrailingZeros(n) {
58
108
  let count = 0;
@@ -65,6 +115,9 @@ function countTrailingZeros(n) {
65
115
 
66
116
  // dist/s2-geometry/s2-geometry.js
67
117
  function getS2Cell(s2Index) {
118
+ if (!isS2IndexValid(s2Index)) {
119
+ throw new Error(`Invalid S2 index: ${s2Index}`);
120
+ }
68
121
  const key = toHilbertQuadkey(s2Index);
69
122
  const s2cell = fromHilbertQuadKey(key);
70
123
  return s2cell;
@@ -73,7 +126,36 @@ var FACE_BITS = 3;
73
126
  var MAX_LEVEL = 30;
74
127
  var POS_BITS = 2 * MAX_LEVEL + 1;
75
128
  var RADIAN_TO_DEGREE = 180 / Math.PI;
129
+ var HILBERT_MAP = {
130
+ a: [
131
+ [0, "d"],
132
+ [1, "a"],
133
+ [3, "b"],
134
+ [2, "a"]
135
+ ],
136
+ b: [
137
+ [2, "b"],
138
+ [1, "b"],
139
+ [3, "a"],
140
+ [0, "c"]
141
+ ],
142
+ c: [
143
+ [2, "c"],
144
+ [3, "d"],
145
+ [1, "c"],
146
+ [0, "b"]
147
+ ],
148
+ d: [
149
+ [0, "a"],
150
+ [3, "c"],
151
+ [1, "d"],
152
+ [2, "d"]
153
+ ]
154
+ };
76
155
  function fromHilbertQuadKey(hilbertQuadkey) {
156
+ if (!/^[0-5]\/[0-3]{0,30}$/.test(hilbertQuadkey)) {
157
+ throw new Error(`Invalid S2 Hilbert quadkey: ${hilbertQuadkey}`);
158
+ }
77
159
  const parts = hilbertQuadkey.split("/");
78
160
  const face = parseInt(parts[0], 10);
79
161
  const position = parts[1] || "";
@@ -106,6 +188,9 @@ function fromHilbertQuadKey(hilbertQuadkey) {
106
188
  return { face, ij: point, level };
107
189
  }
108
190
  function toHilbertQuadkey(id) {
191
+ if (!isS2IndexValid(id)) {
192
+ throw new Error(`Invalid S2 index: ${id}`);
193
+ }
109
194
  let bin = id.toString(2);
110
195
  while (bin.length < FACE_BITS + POS_BITS) {
111
196
  bin = "0" + bin;
@@ -124,6 +209,42 @@ function toHilbertQuadkey(id) {
124
209
  }
125
210
  return `${faceS}/${posS}`;
126
211
  }
212
+ function getS2IndexFromCell(s2Cell) {
213
+ const { face, ij, level } = s2Cell;
214
+ if (!Number.isInteger(face) || face < 0 || face > 5) {
215
+ throw new Error(`Invalid S2 face: ${face}`);
216
+ }
217
+ if (!Number.isInteger(level) || level < 0 || level > MAX_LEVEL) {
218
+ throw new Error(`Invalid S2 level: ${level}`);
219
+ }
220
+ const maximumCoordinate = 2 ** level;
221
+ if (!Number.isInteger(ij[0]) || !Number.isInteger(ij[1]) || ij[0] < 0 || ij[1] < 0 || ij[0] >= maximumCoordinate || ij[1] >= maximumCoordinate) {
222
+ throw new Error(`Invalid S2 IJ coordinates: ${ij[0]}, ${ij[1]}`);
223
+ }
224
+ const positions = getHilbertQuadList(ij[0], ij[1], level, face);
225
+ let s2Index = BigInt(face) << 61n;
226
+ for (let positionIndex = 0; positionIndex < positions.length; positionIndex++) {
227
+ const bitOffset = 59 - positionIndex * 2;
228
+ s2Index |= BigInt(positions[positionIndex]) << BigInt(bitOffset);
229
+ }
230
+ s2Index |= 1n << BigInt(60 - level * 2);
231
+ return s2Index;
232
+ }
233
+ function getS2DescendantIndex(rootIndex, relativeLevel, x, y) {
234
+ const rootCell = getS2Cell(rootIndex);
235
+ if (!Number.isInteger(relativeLevel) || relativeLevel < 0 || rootCell.level + relativeLevel > MAX_LEVEL) {
236
+ throw new Error(`Invalid S2 relative level: ${relativeLevel}`);
237
+ }
238
+ const divisionCount = 2 ** relativeLevel;
239
+ if (!Number.isInteger(x) || !Number.isInteger(y) || x < 0 || y < 0 || x >= divisionCount || y >= divisionCount) {
240
+ throw new Error(`Invalid S2 descendant coordinates: ${x}, ${y}`);
241
+ }
242
+ return getS2IndexFromCell({
243
+ face: rootCell.face,
244
+ ij: [rootCell.ij[0] * divisionCount + x, rootCell.ij[1] * divisionCount + y],
245
+ level: rootCell.level + relativeLevel
246
+ });
247
+ }
127
248
  function IJToST(ij, order, offsets) {
128
249
  const maxSize = 1 << order;
129
250
  return [(ij[0] + offsets[0]) / maxSize, (ij[1] + offsets[1]) / maxSize];
@@ -171,6 +292,19 @@ function rotateAndFlipQuadrant(n, point, rx, ry) {
171
292
  point[1] = x;
172
293
  }
173
294
  }
295
+ function getHilbertQuadList(x, y, level, face) {
296
+ let orientation = face % 2 === 1 ? "d" : "a";
297
+ const positions = [];
298
+ for (let bit = level - 1; bit >= 0; bit--) {
299
+ const mask = 1 << bit;
300
+ const quadrantX = (x & mask) !== 0 ? 1 : 0;
301
+ const quadrantY = (y & mask) !== 0 ? 1 : 0;
302
+ const [position, nextOrientation] = HILBERT_MAP[orientation][quadrantX * 2 + quadrantY];
303
+ positions.push(position);
304
+ orientation = nextOrientation;
305
+ }
306
+ return positions;
307
+ }
174
308
 
175
309
  // dist/s2-geometry/s2-to-boundary.js
176
310
  var MAX_RESOLUTION = 100;
@@ -223,7 +357,7 @@ var S2Decoder = {
223
357
  hasNumericRepresentation: true,
224
358
  cellColumnNames: ["s2", "s2Token", "s2_token", "s2Cell", "s2_cell", "s2CellId", "s2_cell_id"],
225
359
  tokenToCell: (s2Token) => getS2IndexFromToken(s2Token),
226
- cellToToken: (cell) => typeof cell === "string" ? cell : getS2TokenFromIndex(cell),
360
+ cellToToken: (cell) => getS2TokenFromIndex(getS2CellIndex(cell)),
227
361
  cellToLngLat: (cell) => getS2LngLat(cell),
228
362
  cellToBoundary: (cell) => getS2Boundary(cell),
229
363
  cellToBoundaryFlat: (cell) => getS2BoundaryFlat(cell),
@@ -252,27 +386,83 @@ function getS2Boundary(cell) {
252
386
  return boundary;
253
387
  }
254
388
  function getS2Bounds(cell) {
255
- const flatBoundary = getS2Boundary(cell);
256
- let xmin = Infinity;
257
- let ymin = Infinity;
258
- let xmax = -Infinity;
259
- let ymax = -Infinity;
260
- for (const [x, y] of flatBoundary) {
261
- if (x < xmin)
262
- xmin = x;
263
- if (x > xmax)
264
- xmax = x;
265
- if (y < ymin)
266
- ymin = y;
267
- if (y > ymax)
268
- ymax = y;
389
+ const s2Cell = getS2Cell(getS2CellIndex(cell));
390
+ if (s2Cell.level === 0) {
391
+ return getS2RootBounds(s2Cell.face);
392
+ }
393
+ const offsets = [
394
+ [0, 0],
395
+ [0, 1],
396
+ [1, 1],
397
+ [1, 0]
398
+ ];
399
+ let west = Infinity;
400
+ let south = Infinity;
401
+ let east = -Infinity;
402
+ let north = -Infinity;
403
+ let previousLongitude;
404
+ for (const offset of offsets) {
405
+ const st = IJToST(s2Cell.ij, s2Cell.level, offset);
406
+ const uv = STToUV(st);
407
+ const [x, y, z] = FaceUVToXYZ(s2Cell.face, uv);
408
+ let [longitude, latitude] = XYZToLngLat([x, y, z]);
409
+ if (x === 0 && y === 0 && previousLongitude !== void 0) {
410
+ longitude = previousLongitude;
411
+ }
412
+ if (previousLongitude !== void 0) {
413
+ const longitudeDelta = longitude - previousLongitude;
414
+ longitude += longitudeDelta > 180 ? -360 : longitudeDelta < -180 ? 360 : 0;
415
+ }
416
+ previousLongitude = longitude;
417
+ west = Math.min(west, longitude);
418
+ south = Math.min(south, latitude);
419
+ east = Math.max(east, longitude);
420
+ north = Math.max(north, latitude);
269
421
  }
422
+ const angularEpsilon = 2 * Number.EPSILON * 180 / Math.PI;
270
423
  return [
271
- [xmin, ymin],
272
- [xmax, ymax]
424
+ [west - angularEpsilon, Math.max(-90, south - angularEpsilon)],
425
+ [east + angularEpsilon, Math.min(90, north + angularEpsilon)]
273
426
  ];
274
427
  }
275
428
  function getS2CellIndex(cell) {
276
429
  return typeof cell === "bigint" ? cell : getS2IndexFromToken(cell);
277
430
  }
431
+ function getS2RootBounds(face) {
432
+ const polarLatitude = Math.asin(Math.sqrt(1 / 3)) * 180 / Math.PI;
433
+ switch (face) {
434
+ case 0:
435
+ return [
436
+ [-45, -45],
437
+ [45, 45]
438
+ ];
439
+ case 1:
440
+ return [
441
+ [45, -45],
442
+ [135, 45]
443
+ ];
444
+ case 2:
445
+ return [
446
+ [-180, polarLatitude],
447
+ [180, 90]
448
+ ];
449
+ case 3:
450
+ return [
451
+ [135, -45],
452
+ [225, 45]
453
+ ];
454
+ case 4:
455
+ return [
456
+ [-135, -45],
457
+ [-45, 45]
458
+ ];
459
+ case 5:
460
+ return [
461
+ [-180, -90],
462
+ [180, -polarLatitude]
463
+ ];
464
+ default:
465
+ throw new Error(`Invalid S2 face: ${face}`);
466
+ }
467
+ }
278
468
  //# sourceMappingURL=s2.cjs.map
package/dist/s2.cjs.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/s2.ts", "../src/s2-geometry/s2-token.ts", "../src/s2-geometry/s2-geometry.ts", "../src/s2-geometry/s2-to-boundary.ts", "../src/s2-decoder.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;ACgBM,SAAU,oBAAoB,OAAa;AAC/C,MAAI,UAAU,KAAK;AACjB,YAAQ;EACV;AAEA,QAAM,cAAc,MAAM,OAAO,IAAI,GAAG;AACxC,SAAO,OAAO,KAAK,WAAW,EAAE;AAClC;AAMM,SAAU,oBAAoB,QAAc;AAChD,MAAI,WAAW,IAAI;AACjB,WAAO;EACT;AACA,MAAI,gBAAgB,mBAAmB,MAAM;AAE7C,QAAM,YAAY,gBAAgB;AAClC,mBAAiB,gBAAgB,aAAa;AAC9C,QAAM,uBAAuB;AAC7B,mBAAiB;AAEjB,QAAM,IAAI,UAAU,OAAO,aAAa;AACxC,QAAM,YAAY,EAAE,SAAS,EAAE,EAAE,QAAQ,OAAO,EAAE;AAClD,QAAM,aAAa,MAAM,KAAK,uBAAuB,UAAU,MAAM,EAAE,KAAK,GAAG;AAC/E,SAAO,aAAa;AACtB;AAEM,SAAU,gBAAgB,SAAiB,OAAa;AAE5D,QAAM,SAAS,IAAI,OAAO,KAAK;AAE/B,QAAM,cAAsB,UAAU,OAAO,IAAI,QAAQ,IAAI,CAAC,IAAI;AAClE,SAAO;AACT;AAMA,SAAS,IAAI,QAAc;AACzB,SAAO,SAAU,SAAS;AAC5B;AAEA,SAAS,mBAAmB,GAAS;AACnC,MAAI,QAAQ;AACZ,SAAO,IAAI,OAAO,IAAI;AACpB,SAAK;AACL;EACF;AACA,SAAO;AACT;;;AClDM,SAAU,UAAU,SAAe;AACvC,QAAM,MAAM,iBAAiB,OAAO;AACpC,QAAM,SAAS,mBAAmB,GAAG;AACrC,SAAO;AACT;AAKA,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,WAAW,IAAI,YAAY;AACjC,IAAM,mBAAmB,MAAM,KAAK;AAM9B,SAAU,mBAAmB,gBAAsB;AACvD,QAAM,QAAQ,eAAe,MAAM,GAAG;AACtC,QAAM,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAClC,QAAM,WAAW,MAAM,CAAC,KAAK;AAC7B,QAAM,WAAW,SAAS;AAC1B,MAAI,QAAQ;AAEZ,QAAM,QAAQ,CAAC,GAAG,CAAC;AAEnB,WAAS,IAAI,WAAW,GAAG,KAAK,GAAG,KAAK;AACtC,YAAQ,WAAW;AACnB,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,KAAK;AACT,QAAI,KAAK;AACT,QAAI,QAAQ,KAAK;AACf,WAAK;IACP,WAAW,QAAQ,KAAK;AACtB,WAAK;AACL,WAAK;IACP,WAAW,QAAQ,KAAK;AACtB,WAAK;IACP;AAEA,UAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC;AACjC,0BAAsB,KAAK,OAAO,IAAI,EAAE;AAExC,UAAM,CAAC,KAAK,MAAM;AAClB,UAAM,CAAC,KAAK,MAAM;EACpB;AAEA,MAAI,OAAO,MAAM,GAAG;AAClB,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,CAAC,IAAI,MAAM,CAAC;AAClB,UAAM,CAAC,IAAI;EACb;AAEA,SAAO,EAAC,MAAM,IAAI,OAAO,MAAK;AAChC;AAEM,SAAU,iBAAiB,IAAU;AACzC,MAAI,MAAM,GAAG,SAAS,CAAC;AAEvB,SAAO,IAAI,SAAS,YAAY,UAAU;AAExC,UAAM,MAAM;EACd;AAGA,QAAM,WAAW,IAAI,YAAY,GAAG;AAGpC,QAAM,QAAQ,IAAI,UAAU,GAAG,CAAC;AAEhC,QAAM,OAAO,IAAI,UAAU,GAAG,QAAQ;AACtC,QAAM,SAAS,KAAK,SAAS;AAE7B,QAAM,QAAQ,OAAO,KAAK,KAAK,EAAE,EAAE,SAAS,EAAE;AAE9C,MAAI,OAAO;AACX,MAAI,WAAW,GAAG;AAChB,WAAO,OAAO,KAAK,IAAI,EAAE,EAAE,SAAS,CAAC;AAErC,WAAO,KAAK,SAAS,QAAQ;AAE3B,aAAO,MAAM;IACf;EACF;AACA,SAAO,GAAG,KAAK,IAAI,IAAI;AACzB;AAEM,SAAU,OACd,IACA,OACA,SAAyB;AAEzB,QAAM,UAAU,KAAK;AAErB,SAAO,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,UAAU,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,OAAO;AACxE;AAEA,SAAS,aAAa,IAAU;AAC9B,MAAI,MAAM,KAAK;AACb,WAAQ,IAAI,KAAQ,IAAI,KAAK,KAAK;EACpC;AACA,SAAQ,IAAI,KAAQ,IAAI,KAAK,IAAI,OAAO,IAAI;AAC9C;AAEM,SAAU,OAAO,IAAoB;AACzC,SAAO,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC;AAClD;AAEM,SAAU,YAAY,MAAc,CAAC,GAAG,CAAC,GAAmB;AAChE,UAAQ,MAAM;IACZ,KAAK;AACH,aAAO,CAAC,GAAG,GAAG,CAAC;IACjB,KAAK;AACH,aAAO,CAAC,CAAC,GAAG,GAAG,CAAC;IAClB,KAAK;AACH,aAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACnB,KAAK;AACH,aAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,KAAK;AACH,aAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACnB,KAAK;AACH,aAAO,CAAC,GAAG,GAAG,EAAE;IAClB;AACE,YAAM,IAAI,MAAM,cAAc;EAClC;AACF;AAEM,SAAU,YAAY,CAAC,GAAG,GAAG,CAAC,GAA2B;AAC7D,QAAM,MAAM,KAAK,MAAM,GAAG,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC;AAClD,QAAM,MAAM,KAAK,MAAM,GAAG,CAAC;AAE3B,SAAO,CAAC,MAAM,kBAAkB,MAAM,gBAAgB;AACxD;AAEA,SAAS,sBAAsB,GAAW,OAAyB,IAAY,IAAU;AACvF,MAAI,OAAO,GAAG;AACZ,QAAI,OAAO,GAAG;AACZ,YAAM,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC;AAC1B,YAAM,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC;IAC5B;AAEA,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,CAAC,IAAI,MAAM,CAAC;AAClB,UAAM,CAAC,IAAI;EACb;AACF;;;AC/JA,IAAM,iBAAiB;AAEjB,SAAU,eAAe,SAAe;AAC5C,QAAM,SAAS,UAAU,OAAO;AAChC,SAAO,uBAAuB,MAAM;AACtC;AAUM,SAAU,uBAAuB,EACrC,MACA,IACA,MAAK,GAKN;AACC,QAAM,UAAU;IACd,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;;AAGP,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AAC9E,QAAM,SAAS,IAAI,aAAa,IAAI,aAAa,IAAI,CAAC;AACtD,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,SAAS,QAAQ,CAAC,EAAE,MAAM,CAAC;AACjC,UAAM,aAAa,QAAQ,IAAI,CAAC;AAChC,UAAM,SAAS,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK;AAC5C,UAAM,SAAS,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK;AAE5C,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,aAAO,CAAC,KAAK;AACb,aAAO,CAAC,KAAK;AAGb,YAAM,KAAK,OAAO,IAAI,OAAO,MAAM;AACnC,YAAM,KAAK,OAAO,EAAE;AACpB,YAAM,MAAM,YAAY,MAAM,EAAE;AAChC,YAAM,SAAS,YAAY,GAAG;AAG9B,UAAI,KAAK,IAAI,OAAO,CAAC,CAAC,IAAI,QAAQ;AAChC,eAAO,CAAC,IAAI;MACd;AACA,YAAM,WAAW,OAAO,CAAC,IAAI;AAC7B,aAAO,CAAC,KAAK,WAAW,MAAM,OAAO,WAAW,OAAO,MAAM;AAE7D,aAAO,SAAS,IAAI,OAAO,CAAC;AAC5B,aAAO,SAAS,IAAI,OAAO,CAAC;AAC5B,gBAAU,OAAO,CAAC;IACpB;EACF;AAEA,SAAO,SAAS,IAAI,OAAO,CAAC;AAC5B,SAAO,SAAS,IAAI,OAAO,CAAC;AAC5B,SAAO;AACT;;;AC/DO,IAAM,YAAY;EACvB,MAAM;EACN,0BAA0B;EAC1B,iBAAiB,CAAC,MAAM,WAAW,YAAY,UAAU,WAAW,YAAY,YAAY;EAC5F,aAAa,CAAC,YAA4B,oBAAoB,OAAO;EACrE,aAAa,CAAC,SACZ,OAAO,SAAS,WAAW,OAAO,oBAAoB,IAAI;EAC5D,cAAc,CAAC,SAAqC,YAAY,IAAI;EACpE,gBAAgB,CAAC,SAAuC,cAAc,IAAI;EAC1E,oBAAoB,CAAC,SAA6B,kBAAkB,IAAI;EACxE,cAAc,CAAC,SAA6B,YAAY,IAAI;;AAMxD,SAAU,YAAY,MAAc;AACxC,QAAM,UAAU,eAAe,IAAI;AACnC,QAAM,SAAS,UAAU,OAAO;AAEhC,QAAM,KAAK,OAAO,OAAO,IAAI,OAAO,OAAO,CAAC,KAAK,GAAG,CAAC;AACrD,QAAM,KAAK,OAAO,EAAE;AACpB,QAAM,MAAM,YAAY,OAAO,MAAM,EAAE;AACvC,QAAM,SAAS,YAAY,GAAG;AAE9B,SAAO;AACT;AAQM,SAAU,kBAAkB,MAAc;AAC9C,QAAM,UAAU,eAAe,IAAI;AACnC,QAAM,eAAe,eAAe,OAAO;AAE3C,SAAO,MAAM,KAAK,YAAY;AAChC;AAEA,SAAS,cAAc,MAAc;AACnC,QAAM,eAAe,kBAAkB,IAAI;AAC3C,QAAM,WAA+B,CAAA;AACrC,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,GAAG;AAC/C,aAAS,KAAK,CAAC,aAAa,CAAC,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC;EACtD;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAc;AACjC,QAAM,eAAe,cAAc,IAAI;AAGvC,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AAEX,aAAW,CAAC,GAAG,CAAC,KAAK,cAAc;AACjC,QAAI,IAAI;AAAM,aAAO;AACrB,QAAI,IAAI;AAAM,aAAO;AACrB,QAAI,IAAI;AAAM,aAAO;AACrB,QAAI,IAAI;AAAM,aAAO;EACvB;AAEA,SAAO;IACL,CAAC,MAAM,IAAI;IACX,CAAC,MAAM,IAAI;;AAEf;AAEA,SAAS,eAAe,MAAc;AACpC,SAAO,OAAO,SAAS,WAAW,OAAO,oBAAoB,IAAI;AACnE;",
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;ACOA,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB,MAAM,OAAO;AACvC,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB;AAShB,SAAU,oBAAoB,OAAa;AAC/C,MAAI,UAAU,KAAK;AACjB,WAAO;EACT;AACA,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,UAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE;EAC9C;AAEA,QAAM,cAAc,MAAM,OAAO,sBAAsB,GAAG;AAC1D,SAAO,OAAO,KAAK,WAAW,EAAE;AAClC;AAMM,SAAU,oBAAoB,QAAc;AAChD,MAAI,WAAW,IAAI;AACjB,WAAO;EACT;AACA,MAAI,CAAC,eAAe,MAAM,GAAG;AAC3B,UAAM,IAAI,MAAM,qBAAqB,MAAM,EAAE;EAC/C;AACA,MAAI,gBAAgB,mBAAmB,MAAM;AAE7C,QAAM,YAAY,gBAAgB;AAClC,mBAAiB,gBAAgB,aAAa;AAC9C,QAAM,uBAAuB;AAC7B,mBAAiB;AAEjB,QAAM,IAAI,UAAU,OAAO,aAAa;AACxC,QAAM,YAAY,EAAE,SAAS,EAAE,EAAE,QAAQ,OAAO,EAAE;AAClD,QAAM,aAAa,MAAM,KAAK,uBAAuB,UAAU,MAAM,EAAE,KAAK,GAAG;AAC/E,SAAO,aAAa;AACtB;AAQM,SAAU,eAAe,SAAgB;AAC7C,MAAI,OAAO,YAAY,YAAY,WAAW,MAAM,UAAU,kBAAkB;AAC9E,WAAO;EACT;AACA,QAAM,OAAO,WAAW;AACxB,QAAM,cAAc,UAAU,CAAC;AAC/B,SAAO,OAAO,OAAO,cAAc,0BAA0B;AAC/D;AAUM,SAAU,eAAe,OAAc;AAC3C,MAAI,OAAO,UAAU,YAAY,CAAC,sBAAsB,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG,GAAG;AAC1F,WAAO;EACT;AACA,QAAM,cAAc,MAAM,OAAO,sBAAsB,GAAG;AAC1D,SAAO,eAAe,OAAO,KAAK,WAAW,EAAE,CAAC;AAClD;AAQM,SAAU,WAAW,SAAe;AACxC,MAAI,CAAC,eAAe,OAAO,GAAG;AAC5B,UAAM,IAAI,MAAM,qBAAqB,OAAO,EAAE;EAChD;AACA,UAAQ,KAAK,mBAAmB,OAAO,KAAK;AAC9C;AASM,SAAU,gBAAgB,SAAiB,OAAa;AAC5D,MAAI,CAAC,eAAe,OAAO,GAAG;AAC5B,UAAM,IAAI,MAAM,qBAAqB,OAAO,EAAE;EAChD;AACA,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,GAAG;AACtD,UAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;EACpD;AACA,MAAI,WAAW,OAAO,MAAM,eAAe;AACzC,UAAM,IAAI,MAAM,kCAAkC;EACpD;AAEA,QAAM,SAAS,IAAI,OAAO,KAAK;AAE/B,QAAM,cAAsB,UAAU,OAAO,IAAI,QAAQ,IAAI,CAAC,IAAI;AAClE,SAAO;AACT;AAMA,SAAS,IAAI,QAAc;AACzB,SAAO,SAAS,CAAC;AACnB;AAEA,SAAS,mBAAmB,GAAS;AACnC,MAAI,QAAQ;AACZ,SAAO,IAAI,OAAO,IAAI;AACpB,SAAK;AACL;EACF;AACA,SAAO;AACT;;;ACrHM,SAAU,UAAU,SAAe;AACvC,MAAI,CAAC,eAAe,OAAO,GAAG;AAC5B,UAAM,IAAI,MAAM,qBAAqB,OAAO,EAAE;EAChD;AACA,QAAM,MAAM,iBAAiB,OAAO;AACpC,QAAM,SAAS,mBAAmB,GAAG;AACrC,SAAO;AACT;AAKA,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,WAAW,IAAI,YAAY;AACjC,IAAM,mBAAmB,MAAM,KAAK;AAIpC,IAAM,cAGF;EACF,GAAG;IACD,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;;EAET,GAAG;IACD,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;;EAET,GAAG;IACD,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;;EAET,GAAG;IACD,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;IACP,CAAC,GAAG,GAAG;;;AAQL,SAAU,mBAAmB,gBAAsB;AACvD,MAAI,CAAC,uBAAuB,KAAK,cAAc,GAAG;AAChD,UAAM,IAAI,MAAM,+BAA+B,cAAc,EAAE;EACjE;AACA,QAAM,QAAQ,eAAe,MAAM,GAAG;AACtC,QAAM,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAClC,QAAM,WAAW,MAAM,CAAC,KAAK;AAC7B,QAAM,WAAW,SAAS;AAC1B,MAAI,QAAQ;AAEZ,QAAM,QAAQ,CAAC,GAAG,CAAC;AAEnB,WAAS,IAAI,WAAW,GAAG,KAAK,GAAG,KAAK;AACtC,YAAQ,WAAW;AACnB,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,KAAK;AACT,QAAI,KAAK;AACT,QAAI,QAAQ,KAAK;AACf,WAAK;IACP,WAAW,QAAQ,KAAK;AACtB,WAAK;AACL,WAAK;IACP,WAAW,QAAQ,KAAK;AACtB,WAAK;IACP;AAEA,UAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC;AACjC,0BAAsB,KAAK,OAAO,IAAI,EAAE;AAExC,UAAM,CAAC,KAAK,MAAM;AAClB,UAAM,CAAC,KAAK,MAAM;EACpB;AAEA,MAAI,OAAO,MAAM,GAAG;AAClB,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,CAAC,IAAI,MAAM,CAAC;AAClB,UAAM,CAAC,IAAI;EACb;AAEA,SAAO,EAAC,MAAM,IAAI,OAAO,MAAK;AAChC;AAEM,SAAU,iBAAiB,IAAU;AACzC,MAAI,CAAC,eAAe,EAAE,GAAG;AACvB,UAAM,IAAI,MAAM,qBAAqB,EAAE,EAAE;EAC3C;AACA,MAAI,MAAM,GAAG,SAAS,CAAC;AAEvB,SAAO,IAAI,SAAS,YAAY,UAAU;AAExC,UAAM,MAAM;EACd;AAGA,QAAM,WAAW,IAAI,YAAY,GAAG;AAGpC,QAAM,QAAQ,IAAI,UAAU,GAAG,CAAC;AAEhC,QAAM,OAAO,IAAI,UAAU,GAAG,QAAQ;AACtC,QAAM,SAAS,KAAK,SAAS;AAE7B,QAAM,QAAQ,OAAO,KAAK,KAAK,EAAE,EAAE,SAAS,EAAE;AAE9C,MAAI,OAAO;AACX,MAAI,WAAW,GAAG;AAChB,WAAO,OAAO,KAAK,IAAI,EAAE,EAAE,SAAS,CAAC;AAErC,WAAO,KAAK,SAAS,QAAQ;AAE3B,aAAO,MAAM;IACf;EACF;AACA,SAAO,GAAG,KAAK,IAAI,IAAI;AACzB;AAQM,SAAU,mBAAmB,QAAc;AAC/C,QAAM,EAAC,MAAM,IAAI,MAAK,IAAI;AAC1B,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,GAAG;AACnD,UAAM,IAAI,MAAM,oBAAoB,IAAI,EAAE;EAC5C;AACA,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,WAAW;AAC9D,UAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE;EAC9C;AACA,QAAM,oBAAoB,KAAK;AAC/B,MACE,CAAC,OAAO,UAAU,GAAG,CAAC,CAAC,KACvB,CAAC,OAAO,UAAU,GAAG,CAAC,CAAC,KACvB,GAAG,CAAC,IAAI,KACR,GAAG,CAAC,IAAI,KACR,GAAG,CAAC,KAAK,qBACT,GAAG,CAAC,KAAK,mBACT;AACA,UAAM,IAAI,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;EACjE;AAEA,QAAM,YAAY,mBAAmB,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,IAAI;AAC9D,MAAI,UAAU,OAAO,IAAI,KAAK;AAC9B,WAAS,gBAAgB,GAAG,gBAAgB,UAAU,QAAQ,iBAAiB;AAC7E,UAAM,YAAY,KAAK,gBAAgB;AACvC,eAAW,OAAO,UAAU,aAAa,CAAC,KAAK,OAAO,SAAS;EACjE;AACA,aAAW,MAAM,OAAO,KAAK,QAAQ,CAAC;AACtC,SAAO;AACT;AAcM,SAAU,qBACd,WACA,eACA,GACA,GAAS;AAET,QAAM,WAAW,UAAU,SAAS;AACpC,MACE,CAAC,OAAO,UAAU,aAAa,KAC/B,gBAAgB,KAChB,SAAS,QAAQ,gBAAgB,WACjC;AACA,UAAM,IAAI,MAAM,8BAA8B,aAAa,EAAE;EAC/D;AACA,QAAM,gBAAgB,KAAK;AAC3B,MACE,CAAC,OAAO,UAAU,CAAC,KACnB,CAAC,OAAO,UAAU,CAAC,KACnB,IAAI,KACJ,IAAI,KACJ,KAAK,iBACL,KAAK,eACL;AACA,UAAM,IAAI,MAAM,sCAAsC,CAAC,KAAK,CAAC,EAAE;EACjE;AACA,SAAO,mBAAmB;IACxB,MAAM,SAAS;IACf,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,gBAAgB,GAAG,SAAS,GAAG,CAAC,IAAI,gBAAgB,CAAC;IAC3E,OAAO,SAAS,QAAQ;GACzB;AACH;AAEM,SAAU,OACd,IACA,OACA,SAAyB;AAEzB,QAAM,UAAU,KAAK;AAErB,SAAO,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,UAAU,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,OAAO;AACxE;AAEA,SAAS,aAAa,IAAU;AAC9B,MAAI,MAAM,KAAK;AACb,WAAQ,IAAI,KAAQ,IAAI,KAAK,KAAK;EACpC;AACA,SAAQ,IAAI,KAAQ,IAAI,KAAK,IAAI,OAAO,IAAI;AAC9C;AAEM,SAAU,OAAO,IAAoB;AACzC,SAAO,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC;AAClD;AAEM,SAAU,YAAY,MAAc,CAAC,GAAG,CAAC,GAAmB;AAChE,UAAQ,MAAM;IACZ,KAAK;AACH,aAAO,CAAC,GAAG,GAAG,CAAC;IACjB,KAAK;AACH,aAAO,CAAC,CAAC,GAAG,GAAG,CAAC;IAClB,KAAK;AACH,aAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACnB,KAAK;AACH,aAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,KAAK;AACH,aAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACnB,KAAK;AACH,aAAO,CAAC,GAAG,GAAG,EAAE;IAClB;AACE,YAAM,IAAI,MAAM,cAAc;EAClC;AACF;AAEM,SAAU,YAAY,CAAC,GAAG,GAAG,CAAC,GAA2B;AAC7D,QAAM,MAAM,KAAK,MAAM,GAAG,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC;AAClD,QAAM,MAAM,KAAK,MAAM,GAAG,CAAC;AAE3B,SAAO,CAAC,MAAM,kBAAkB,MAAM,gBAAgB;AACxD;AAEA,SAAS,sBAAsB,GAAW,OAAyB,IAAY,IAAU;AACvF,MAAI,OAAO,GAAG;AACZ,QAAI,OAAO,GAAG;AACZ,YAAM,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC;AAC1B,YAAM,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC;IAC5B;AAEA,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,CAAC,IAAI,MAAM,CAAC;AAClB,UAAM,CAAC,IAAI;EACb;AACF;AAEA,SAAS,mBAAmB,GAAW,GAAW,OAAe,MAAY;AAC3E,MAAI,cAAkC,OAAO,MAAM,IAAI,MAAM;AAC7D,QAAM,YAAsB,CAAA;AAC5B,WAAS,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO;AACzC,UAAM,OAAO,KAAK;AAClB,UAAM,aAAa,IAAI,UAAU,IAAI,IAAI;AACzC,UAAM,aAAa,IAAI,UAAU,IAAI,IAAI;AACzC,UAAM,CAAC,UAAU,eAAe,IAAI,YAAY,WAAW,EAAE,YAAY,IAAI,SAAS;AACtF,cAAU,KAAK,QAAQ;AACvB,kBAAc;EAChB;AACA,SAAO;AACT;;;ACxSA,IAAM,iBAAiB;AAEjB,SAAU,eAAe,SAAe;AAC5C,QAAM,SAAS,UAAU,OAAO;AAChC,SAAO,uBAAuB,MAAM;AACtC;AAUM,SAAU,uBAAuB,EACrC,MACA,IACA,MAAK,GAKN;AACC,QAAM,UAAU;IACd,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;;AAGP,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AAC9E,QAAM,SAAS,IAAI,aAAa,IAAI,aAAa,IAAI,CAAC;AACtD,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,SAAS,QAAQ,CAAC,EAAE,MAAM,CAAC;AACjC,UAAM,aAAa,QAAQ,IAAI,CAAC;AAChC,UAAM,SAAS,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK;AAC5C,UAAM,SAAS,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK;AAE5C,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,aAAO,CAAC,KAAK;AACb,aAAO,CAAC,KAAK;AAGb,YAAM,KAAK,OAAO,IAAI,OAAO,MAAM;AACnC,YAAM,KAAK,OAAO,EAAE;AACpB,YAAM,MAAM,YAAY,MAAM,EAAE;AAChC,YAAM,SAAS,YAAY,GAAG;AAG9B,UAAI,KAAK,IAAI,OAAO,CAAC,CAAC,IAAI,QAAQ;AAChC,eAAO,CAAC,IAAI;MACd;AACA,YAAM,WAAW,OAAO,CAAC,IAAI;AAC7B,aAAO,CAAC,KAAK,WAAW,MAAM,OAAO,WAAW,OAAO,MAAM;AAE7D,aAAO,SAAS,IAAI,OAAO,CAAC;AAC5B,aAAO,SAAS,IAAI,OAAO,CAAC;AAC5B,gBAAU,OAAO,CAAC;IACpB;EACF;AAEA,SAAO,SAAS,IAAI,OAAO,CAAC;AAC5B,SAAO,SAAS,IAAI,OAAO,CAAC;AAC5B,SAAO;AACT;;;AC/DO,IAAM,YAAY;EACvB,MAAM;EACN,0BAA0B;EAC1B,iBAAiB,CAAC,MAAM,WAAW,YAAY,UAAU,WAAW,YAAY,YAAY;EAC5F,aAAa,CAAC,YAA4B,oBAAoB,OAAO;EACrE,aAAa,CAAC,SAA2B,oBAAoB,eAAe,IAAI,CAAC;EACjF,cAAc,CAAC,SAAqC,YAAY,IAAI;EACpE,gBAAgB,CAAC,SAAuC,cAAc,IAAI;EAC1E,oBAAoB,CAAC,SAA6B,kBAAkB,IAAI;EACxE,cAAc,CAAC,SAA6B,YAAY,IAAI;;AAMxD,SAAU,YAAY,MAAc;AACxC,QAAM,UAAU,eAAe,IAAI;AACnC,QAAM,SAAS,UAAU,OAAO;AAEhC,QAAM,KAAK,OAAO,OAAO,IAAI,OAAO,OAAO,CAAC,KAAK,GAAG,CAAC;AACrD,QAAM,KAAK,OAAO,EAAE;AACpB,QAAM,MAAM,YAAY,OAAO,MAAM,EAAE;AACvC,QAAM,SAAS,YAAY,GAAG;AAE9B,SAAO;AACT;AAQM,SAAU,kBAAkB,MAAc;AAC9C,QAAM,UAAU,eAAe,IAAI;AACnC,QAAM,eAAe,eAAe,OAAO;AAE3C,SAAO,MAAM,KAAK,YAAY;AAChC;AAEA,SAAS,cAAc,MAAc;AACnC,QAAM,eAAe,kBAAkB,IAAI;AAC3C,QAAM,WAA+B,CAAA;AACrC,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,GAAG;AAC/C,aAAS,KAAK,CAAC,aAAa,CAAC,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC;EACtD;AACA,SAAO;AACT;AAWM,SAAU,YAAY,MAAc;AACxC,QAAM,SAAS,UAAU,eAAe,IAAI,CAAC;AAC7C,MAAI,OAAO,UAAU,GAAG;AACtB,WAAO,gBAAgB,OAAO,IAAI;EACpC;AAKA,QAAM,UAAuC;IAC3C,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;;AAEP,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,MAAI;AACJ,aAAW,UAAU,SAAS;AAC5B,UAAM,KAAK,OAAO,OAAO,IAAI,OAAO,OAAO,MAAM;AACjD,UAAM,KAAK,OAAO,EAAE;AACpB,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,YAAY,OAAO,MAAM,EAAE;AAC7C,QAAI,CAAC,WAAW,QAAQ,IAAI,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC;AACjD,QAAI,MAAM,KAAK,MAAM,KAAK,sBAAsB,QAAW;AACzD,kBAAY;IACd;AACA,QAAI,sBAAsB,QAAW;AACnC,YAAM,iBAAiB,YAAY;AACnC,mBAAa,iBAAiB,MAAM,OAAO,iBAAiB,OAAO,MAAM;IAC3E;AACA,wBAAoB;AACpB,WAAO,KAAK,IAAI,MAAM,SAAS;AAC/B,YAAQ,KAAK,IAAI,OAAO,QAAQ;AAChC,WAAO,KAAK,IAAI,MAAM,SAAS;AAC/B,YAAQ,KAAK,IAAI,OAAO,QAAQ;EAClC;AAEA,QAAM,iBAAkB,IAAI,OAAO,UAAU,MAAO,KAAK;AACzD,SAAO;IACL,CAAC,OAAO,gBAAgB,KAAK,IAAI,KAAK,QAAQ,cAAc,CAAC;IAC7D,CAAC,OAAO,gBAAgB,KAAK,IAAI,IAAI,QAAQ,cAAc,CAAC;;AAEhE;AAEA,SAAS,eAAe,MAAc;AACpC,SAAO,OAAO,SAAS,WAAW,OAAO,oBAAoB,IAAI;AACnE;AAEA,SAAS,gBAAgB,MAAY;AACnC,QAAM,gBAAiB,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,MAAO,KAAK;AACjE,UAAQ,MAAM;IACZ,KAAK;AACH,aAAO;QACL,CAAC,KAAK,GAAG;QACT,CAAC,IAAI,EAAE;;IAEX,KAAK;AACH,aAAO;QACL,CAAC,IAAI,GAAG;QACR,CAAC,KAAK,EAAE;;IAEZ,KAAK;AACH,aAAO;QACL,CAAC,MAAM,aAAa;QACpB,CAAC,KAAK,EAAE;;IAEZ,KAAK;AACH,aAAO;QACL,CAAC,KAAK,GAAG;QACT,CAAC,KAAK,EAAE;;IAEZ,KAAK;AACH,aAAO;QACL,CAAC,MAAM,GAAG;QACV,CAAC,KAAK,EAAE;;IAEZ,KAAK;AACH,aAAO;QACL,CAAC,MAAM,GAAG;QACV,CAAC,KAAK,CAAC,aAAa;;IAExB;AACE,YAAM,IAAI,MAAM,oBAAoB,IAAI,EAAE;EAC9C;AACF;",
5
5
  "names": []
6
6
  }
package/dist/s2.d.ts CHANGED
@@ -1,3 +1,5 @@
1
- export { S2Decoder } from "./s2-decoder.js";
2
- export { getS2ChildIndex } from "./s2-geometry/s2-token.js";
1
+ export { S2Decoder, getS2Bounds, getS2LngLat, getS2BoundaryFlat } from "./s2-decoder.js";
2
+ export { getS2ChildIndex, getS2IndexFromToken, getS2Level, getS2TokenFromIndex, isS2IndexValid, isS2TokenValid } from "./s2-geometry/s2-token.js";
3
+ export { getS2DescendantIndex, getS2IndexFromCell } from "./s2-geometry/s2-geometry.js";
4
+ export type { S2Cell } from "./s2-geometry/s2-geometry.js";
3
5
  //# sourceMappingURL=s2.d.ts.map
package/dist/s2.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s2.d.ts","sourceRoot":"","sources":["../src/s2.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,SAAS,EAAC,wBAAqB;AACvC,OAAO,EAAC,eAAe,EAAC,kCAA+B"}
1
+ {"version":3,"file":"s2.d.ts","sourceRoot":"","sources":["../src/s2.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAC,wBAAqB;AACpF,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,kCAA+B;AAChC,OAAO,EAAC,oBAAoB,EAAE,kBAAkB,EAAC,qCAAkC;AACnF,YAAY,EAAC,MAAM,EAAC,qCAAkC"}
package/dist/s2.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // math.gl
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
- export { S2Decoder } from "./s2-decoder.js";
5
- export { getS2ChildIndex } from "./s2-geometry/s2-token.js";
4
+ export { S2Decoder, getS2Bounds, getS2LngLat, getS2BoundaryFlat } from "./s2-decoder.js";
5
+ export { getS2ChildIndex, getS2IndexFromToken, getS2Level, getS2TokenFromIndex, isS2IndexValid, isS2TokenValid } from "./s2-geometry/s2-token.js";
6
+ export { getS2DescendantIndex, getS2IndexFromCell } from "./s2-geometry/s2-geometry.js";
6
7
  //# sourceMappingURL=s2.js.map
package/dist/s2.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s2.js","sourceRoot":"","sources":["../src/s2.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,SAAS,EAAC,wBAAqB;AACvC,OAAO,EAAC,eAAe,EAAC,kCAA+B"}
1
+ {"version":3,"file":"s2.js","sourceRoot":"","sources":["../src/s2.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAC,wBAAqB;AACpF,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,kCAA+B;AAChC,OAAO,EAAC,oBAAoB,EAAE,kBAAkB,EAAC,qCAAkC"}
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
9
- "version": "5.0.0-alpha.4",
9
+ "version": "5.0.0-alpha.6",
10
10
  "keywords": [
11
11
  "javascript",
12
12
  "math",
@@ -68,7 +68,7 @@
68
68
  "src"
69
69
  ],
70
70
  "dependencies": {
71
- "@math.gl/types": "5.0.0-alpha.4",
71
+ "@math.gl/types": "5.0.0-alpha.6",
72
72
  "a5-js": "^0.10.0",
73
73
  "h3-js": "^4.5.0",
74
74
  "open-location-code": "^1.0.3"
@@ -76,5 +76,5 @@
76
76
  "devDependencies": {
77
77
  "s2-geometry": "^1.2.10"
78
78
  },
79
- "gitHead": "a206fd1b8c58f8ae979106efd4f494544edb651b"
79
+ "gitHead": "c1c6ebefad1b81f33c4b17354a4236f3366fce0d"
80
80
  }
package/src/index.ts CHANGED
@@ -16,8 +16,17 @@ export {GeohashDecoder};
16
16
  export {H3Decoder};
17
17
  export {PlusCodeDecoder};
18
18
  export {QuadkeyDecoder, quadkeyToWorldBounds} from './quadkey-decoder';
19
- export {S2Decoder};
20
- export {getS2ChildIndex} from './s2-geometry/s2-token';
19
+ export {S2Decoder, getS2Bounds, getS2LngLat, getS2BoundaryFlat} from './s2-decoder';
20
+ export {
21
+ getS2ChildIndex,
22
+ getS2IndexFromToken,
23
+ getS2Level,
24
+ getS2TokenFromIndex,
25
+ isS2IndexValid,
26
+ isS2TokenValid
27
+ } from './s2-geometry/s2-token';
28
+ export {getS2DescendantIndex, getS2IndexFromCell} from './s2-geometry/s2-geometry';
29
+ export type {S2Cell} from './s2-geometry/s2-geometry';
21
30
 
22
31
  /** Lightweight decoders bundled with this module. */
23
32
  export const DGGS_DECODERS: readonly DGGSDecoder[] = [
package/src/s2-decoder.ts CHANGED
@@ -15,8 +15,7 @@ export const S2Decoder = {
15
15
  hasNumericRepresentation: true,
16
16
  cellColumnNames: ['s2', 's2Token', 's2_token', 's2Cell', 's2_cell', 's2CellId', 's2_cell_id'],
17
17
  tokenToCell: (s2Token: string): bigint => getS2IndexFromToken(s2Token),
18
- cellToToken: (cell: DGGSCell): string =>
19
- typeof cell === 'string' ? cell : getS2TokenFromIndex(cell),
18
+ cellToToken: (cell: DGGSCell): string => getS2TokenFromIndex(getS2CellIndex(cell)),
20
19
  cellToLngLat: (cell: DGGSCell): [number, number] => getS2LngLat(cell),
21
20
  cellToBoundary: (cell: DGGSCell): [number, number][] => getS2Boundary(cell),
22
21
  cellToBoundaryFlat: (cell: DGGSCell): number[] => getS2BoundaryFlat(cell),
@@ -60,28 +59,99 @@ function getS2Boundary(cell: DGGSCell): [number, number][] {
60
59
  return boundary;
61
60
  }
62
61
 
63
- function getS2Bounds(cell: DGGSCell): Bounds2D {
64
- const flatBoundary = getS2Boundary(cell);
65
-
66
- // We know that we have at least one point, no Infinity will be returned.
67
- let xmin = Infinity;
68
- let ymin = Infinity;
69
- let xmax = -Infinity;
70
- let ymax = -Infinity;
62
+ /**
63
+ * Returns conservative longitude/latitude bounds for an S2 cell.
64
+ *
65
+ * Longitudes are unwrapped so `east >= west`; either endpoint may lie outside `[-180, 180]` for
66
+ * antimeridian cells. The two level-zero polar faces span a complete 360-degree longitude range.
67
+ *
68
+ * @param cell - S2 token or 64-bit cell index.
69
+ * @returns Bounds in `[[west, south], [east, north]]` order and degrees.
70
+ */
71
+ export function getS2Bounds(cell: DGGSCell): Bounds2D {
72
+ const s2Cell = getS2Cell(getS2CellIndex(cell));
73
+ if (s2Cell.level === 0) {
74
+ return getS2RootBounds(s2Cell.face);
75
+ }
71
76
 
72
- for (const [x, y] of flatBoundary) {
73
- if (x < xmin) xmin = x;
74
- if (x > xmax) xmax = x;
75
- if (y < ymin) ymin = y;
76
- if (y > ymax) ymax = y;
77
+ // For non-root S2 cells, latitude and longitude extrema occur at vertices. Root cells require
78
+ // the special cases above because their curved edges or interiors contain the extrema.
79
+ // https://github.com/google/s2geometry/blob/master/src/s2/s2cell.cc
80
+ const offsets: readonly [number, number][] = [
81
+ [0, 0],
82
+ [0, 1],
83
+ [1, 1],
84
+ [1, 0]
85
+ ];
86
+ let west = Infinity;
87
+ let south = Infinity;
88
+ let east = -Infinity;
89
+ let north = -Infinity;
90
+ let previousLongitude: number | undefined;
91
+ for (const offset of offsets) {
92
+ const st = IJToST(s2Cell.ij, s2Cell.level, offset);
93
+ const uv = STToUV(st);
94
+ const [x, y, z] = FaceUVToXYZ(s2Cell.face, uv);
95
+ let [longitude, latitude] = XYZToLngLat([x, y, z]);
96
+ if (x === 0 && y === 0 && previousLongitude !== undefined) {
97
+ longitude = previousLongitude;
98
+ }
99
+ if (previousLongitude !== undefined) {
100
+ const longitudeDelta = longitude - previousLongitude;
101
+ longitude += longitudeDelta > 180 ? -360 : longitudeDelta < -180 ? 360 : 0;
102
+ }
103
+ previousLongitude = longitude;
104
+ west = Math.min(west, longitude);
105
+ south = Math.min(south, latitude);
106
+ east = Math.max(east, longitude);
107
+ north = Math.max(north, latitude);
77
108
  }
78
109
 
110
+ const angularEpsilon = (2 * Number.EPSILON * 180) / Math.PI;
79
111
  return [
80
- [xmin, ymin],
81
- [xmax, ymax]
112
+ [west - angularEpsilon, Math.max(-90, south - angularEpsilon)],
113
+ [east + angularEpsilon, Math.min(90, north + angularEpsilon)]
82
114
  ];
83
115
  }
84
116
 
85
117
  function getS2CellIndex(cell: DGGSCell): bigint {
86
118
  return typeof cell === 'bigint' ? cell : getS2IndexFromToken(cell);
87
119
  }
120
+
121
+ function getS2RootBounds(face: number): Bounds2D {
122
+ const polarLatitude = (Math.asin(Math.sqrt(1 / 3)) * 180) / Math.PI;
123
+ switch (face) {
124
+ case 0:
125
+ return [
126
+ [-45, -45],
127
+ [45, 45]
128
+ ];
129
+ case 1:
130
+ return [
131
+ [45, -45],
132
+ [135, 45]
133
+ ];
134
+ case 2:
135
+ return [
136
+ [-180, polarLatitude],
137
+ [180, 90]
138
+ ];
139
+ case 3:
140
+ return [
141
+ [135, -45],
142
+ [225, 45]
143
+ ];
144
+ case 4:
145
+ return [
146
+ [-135, -45],
147
+ [-45, 45]
148
+ ];
149
+ case 5:
150
+ return [
151
+ [-180, -90],
152
+ [180, -polarLatitude]
153
+ ];
154
+ default:
155
+ throw new Error(`Invalid S2 face: ${face}`);
156
+ }
157
+ }