astro-viewer 3.6.0 → 3.7.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.
Files changed (67) hide show
  1. package/dist/64.astroviewer.cjs +37 -0
  2. package/dist/64.astroviewer.cjs.map +1 -0
  3. package/dist/64.astroviewer.js +41 -0
  4. package/dist/64.astroviewer.js.map +1 -0
  5. package/dist/64.astroviewer.min.js +2 -0
  6. package/dist/64.astroviewer.min.js.map +1 -0
  7. package/dist/911.astroviewer.cjs +4047 -0
  8. package/dist/911.astroviewer.cjs.map +1 -0
  9. package/dist/911.astroviewer.js +735 -0
  10. package/dist/911.astroviewer.js.map +1 -0
  11. package/dist/911.astroviewer.min.js +2 -0
  12. package/dist/911.astroviewer.min.js.map +1 -0
  13. package/dist/astroviewer.cjs +2704 -510
  14. package/dist/astroviewer.cjs.map +1 -1
  15. package/dist/astroviewer.js +2861 -512
  16. package/dist/astroviewer.js.map +1 -1
  17. package/dist/astroviewer.min.js +1 -1
  18. package/dist/astroviewer.min.js.map +1 -1
  19. package/lib-esm/AstroSphere.d.ts +1 -1
  20. package/lib-esm/AstroSphere.d.ts.map +1 -1
  21. package/lib-esm/AstroSphere.js +15 -25
  22. package/lib-esm/AstroSphere.js.map +1 -1
  23. package/lib-esm/AstroViewer.d.ts +25 -23
  24. package/lib-esm/AstroViewer.d.ts.map +1 -1
  25. package/lib-esm/AstroViewer.js +97 -67
  26. package/lib-esm/AstroViewer.js.map +1 -1
  27. package/lib-esm/model/hips/AllSky.d.ts +7 -3
  28. package/lib-esm/model/hips/AllSky.d.ts.map +1 -1
  29. package/lib-esm/model/hips/AllSky.js +93 -28
  30. package/lib-esm/model/hips/AllSky.js.map +1 -1
  31. package/lib-esm/model/hips/AncestorTile.d.ts +7 -4
  32. package/lib-esm/model/hips/AncestorTile.d.ts.map +1 -1
  33. package/lib-esm/model/hips/AncestorTile.js +91 -52
  34. package/lib-esm/model/hips/AncestorTile.js.map +1 -1
  35. package/lib-esm/model/hips/FitsTileLoader.d.ts +9 -0
  36. package/lib-esm/model/hips/FitsTileLoader.d.ts.map +1 -0
  37. package/lib-esm/model/hips/FitsTileLoader.js +65 -0
  38. package/lib-esm/model/hips/FitsTileLoader.js.map +1 -0
  39. package/lib-esm/model/hips/HiPS.d.ts +9 -5
  40. package/lib-esm/model/hips/HiPS.d.ts.map +1 -1
  41. package/lib-esm/model/hips/HiPS.js +120 -72
  42. package/lib-esm/model/hips/HiPS.js.map +1 -1
  43. package/lib-esm/model/hips/HiPSCoverage.d.ts +15 -0
  44. package/lib-esm/model/hips/HiPSCoverage.d.ts.map +1 -0
  45. package/lib-esm/model/hips/HiPSCoverage.js +148 -0
  46. package/lib-esm/model/hips/HiPSCoverage.js.map +1 -0
  47. package/lib-esm/model/hips/Tile.d.ts +8 -4
  48. package/lib-esm/model/hips/Tile.d.ts.map +1 -1
  49. package/lib-esm/model/hips/Tile.js +111 -55
  50. package/lib-esm/model/hips/Tile.js.map +1 -1
  51. package/lib-esm/model/hips/TileBuffer.d.ts +13 -4
  52. package/lib-esm/model/hips/TileBuffer.d.ts.map +1 -1
  53. package/lib-esm/model/hips/TileBuffer.js +46 -11
  54. package/lib-esm/model/hips/TileBuffer.js.map +1 -1
  55. package/lib-esm/model/hips/VisibleTilesManager.d.ts +5 -5
  56. package/lib-esm/model/hips/VisibleTilesManager.d.ts.map +1 -1
  57. package/lib-esm/model/hips/VisibleTilesManager.js +6 -20
  58. package/lib-esm/model/hips/VisibleTilesManager.js.map +1 -1
  59. package/lib-esm/shader/HiPSShaderProgram.d.ts +9 -2
  60. package/lib-esm/shader/HiPSShaderProgram.d.ts.map +1 -1
  61. package/lib-esm/shader/HiPSShaderProgram.js +91 -53
  62. package/lib-esm/shader/HiPSShaderProgram.js.map +1 -1
  63. package/lib-esm/shader/ShaderManager.d.ts +2 -0
  64. package/lib-esm/shader/ShaderManager.d.ts.map +1 -1
  65. package/lib-esm/shader/ShaderManager.js +193 -94
  66. package/lib-esm/shader/ShaderManager.js.map +1 -1
  67. package/package.json +3 -3
@@ -176,15 +176,6 @@ export default class ShaderManager {
176
176
 
177
177
  in vec2 vTextureCoord;
178
178
 
179
- uniform sampler2D uSampler0;
180
- uniform sampler2D uSampler1;
181
- uniform sampler2D uSampler2;
182
- uniform sampler2D uSampler3;
183
- uniform sampler2D uSampler4;
184
- uniform sampler2D uSampler5;
185
- uniform sampler2D uSampler6;
186
- uniform sampler2D uSampler7;
187
-
188
179
  uniform float uFactor0;
189
180
  uniform float uFactor1;
190
181
  uniform float uFactor2;
@@ -194,23 +185,53 @@ export default class ShaderManager {
194
185
  uniform float uFactor6;
195
186
  uniform float uFactor7;
196
187
 
188
+ ${ShaderManager.hipsSamplersGLSL()}
189
+
197
190
  out vec4 fragColor;
198
191
 
199
192
  void main() {
200
193
  vec3 finalColor = vec3(0.0);
201
194
 
202
- if (uFactor0 >= 0.0){
203
- vec4 mycolor;
204
- #if __VERSION__ > 120
205
- vec4 color0 = texture(uSampler0, vTextureCoord);
206
- #else
207
- vec4 color0 = texture2D(uSampler0, vTextureCoord);
208
- #endif
209
- mycolor = color0;
210
- finalColor += mycolor.rgb * uFactor0;
211
- } else if (uFactor7 >= 0.0){
212
- finalColor = vec3(1.0, 0.0, 0.0);
195
+ if (uFactor0 >= 0.0) {
196
+ finalColor +=
197
+ sampleHiPSTexture0(vTextureCoord).rgb * uFactor0;
198
+ }
199
+
200
+ if (uFactor1 >= 0.0) {
201
+ finalColor +=
202
+ sampleHiPSTexture1(vTextureCoord).rgb * uFactor1;
203
+ }
204
+
205
+ if (uFactor2 >= 0.0) {
206
+ finalColor +=
207
+ sampleHiPSTexture2(vTextureCoord).rgb * uFactor2;
208
+ }
209
+
210
+ if (uFactor3 >= 0.0) {
211
+ finalColor +=
212
+ sampleHiPSTexture3(vTextureCoord).rgb * uFactor3;
213
+ }
214
+
215
+ if (uFactor4 >= 0.0) {
216
+ finalColor +=
217
+ sampleHiPSTexture4(vTextureCoord).rgb * uFactor4;
218
+ }
219
+
220
+ if (uFactor5 >= 0.0) {
221
+ finalColor +=
222
+ sampleHiPSTexture5(vTextureCoord).rgb * uFactor5;
223
+ }
224
+
225
+ if (uFactor6 >= 0.0) {
226
+ finalColor +=
227
+ sampleHiPSTexture6(vTextureCoord).rgb * uFactor6;
213
228
  }
229
+
230
+ if (uFactor7 >= 0.0) {
231
+ finalColor +=
232
+ sampleHiPSTexture7(vTextureCoord).rgb * uFactor7;
233
+ }
234
+
214
235
  fragColor = vec4(finalColor, 1.0);
215
236
  }`;
216
237
  }
@@ -220,15 +241,6 @@ export default class ShaderManager {
220
241
 
221
242
  in vec2 vTextureCoord;
222
243
 
223
- uniform sampler2D uSampler0;
224
- uniform sampler2D uSampler1;
225
- uniform sampler2D uSampler2;
226
- uniform sampler2D uSampler3;
227
- uniform sampler2D uSampler4;
228
- uniform sampler2D uSampler5;
229
- uniform sampler2D uSampler6;
230
- uniform sampler2D uSampler7;
231
-
232
244
  uniform float uFactor0;
233
245
  uniform float uFactor1;
234
246
  uniform float uFactor2;
@@ -238,76 +250,61 @@ export default class ShaderManager {
238
250
  uniform float uFactor6;
239
251
  uniform float uFactor7;
240
252
 
253
+ ${ShaderManager.hipsSamplersGLSL()}
254
+
241
255
  out vec4 fragColor;
242
256
 
243
257
  void main() {
244
258
  vec3 finalColor = vec3(0.0);
245
259
 
246
- if (uFactor0 >= 0.0){
247
- #if __VERSION__ > 120
248
- vec4 color0 = texture(uSampler0, vTextureCoord);
249
- #else
250
- vec4 color0 = texture2D(uSampler0, vTextureCoord);
251
- #endif
252
- float gray = 0.21 * color0.r + 0.71 * color0.g + 0.07 * color0.b;
253
- finalColor = color0.rgb * (1.0 - uFactor0) + vec3(gray) * uFactor0;
260
+ if (uFactor0 >= 0.0) {
261
+ vec4 color0 = sampleHiPSTexture0(vTextureCoord);
262
+
263
+ float gray =
264
+ 0.21 * color0.r +
265
+ 0.71 * color0.g +
266
+ 0.07 * color0.b;
267
+
268
+ finalColor =
269
+ color0.rgb * (1.0 - uFactor0) +
270
+ vec3(gray) * uFactor0;
254
271
  }
255
- if (uFactor1 >= 0.0){
256
- #if __VERSION__ > 120
257
- vec4 color1 = texture(uSampler1, vTextureCoord);
258
- #else
259
- vec4 color1 = texture2D(uSampler1, vTextureCoord);
260
- #endif
272
+
273
+ if (uFactor1 >= 0.0) {
274
+ vec4 color1 = sampleHiPSTexture1(vTextureCoord);
261
275
  finalColor += color1.rgb * uFactor1;
262
276
  }
263
- if (uFactor2 >= 0.0){
264
- #if __VERSION__ > 120
265
- vec4 color2 = texture(uSampler2, vTextureCoord);
266
- #else
267
- vec4 color2 = texture2D(uSampler2, vTextureCoord);
268
- #endif
277
+
278
+ if (uFactor2 >= 0.0) {
279
+ vec4 color2 = sampleHiPSTexture2(vTextureCoord);
269
280
  finalColor += color2.rgb * uFactor2;
270
281
  }
271
- if (uFactor3 >= 0.0){
272
- #if __VERSION__ > 120
273
- vec4 color3 = texture(uSampler3, vTextureCoord);
274
- #else
275
- vec4 color3 = texture2D(uSampler3, vTextureCoord);
276
- #endif
282
+
283
+ if (uFactor3 >= 0.0) {
284
+ vec4 color3 = sampleHiPSTexture3(vTextureCoord);
277
285
  finalColor += color3.rgb * uFactor3;
278
286
  }
279
- if (uFactor4 >= 0.0){
280
- #if __VERSION__ > 120
281
- vec4 color4 = texture(uSampler4, vTextureCoord);
282
- #else
283
- vec4 color4 = texture2D(uSampler4, vTextureCoord);
284
- #endif
287
+
288
+ if (uFactor4 >= 0.0) {
289
+ vec4 color4 = sampleHiPSTexture4(vTextureCoord);
285
290
  finalColor += color4.rgb * uFactor4;
286
291
  }
287
- if (uFactor5 >= 0.0){
288
- #if __VERSION__ > 120
289
- vec4 color5 = texture(uSampler5, vTextureCoord);
290
- #else
291
- vec4 color5 = texture2D(uSampler5, vTextureCoord);
292
- #endif
292
+
293
+ if (uFactor5 >= 0.0) {
294
+ vec4 color5 = sampleHiPSTexture5(vTextureCoord);
293
295
  finalColor += color5.rgb * uFactor5;
294
296
  }
295
- if (uFactor6 >= 0.0){
296
- #if __VERSION__ > 120
297
- vec4 color6 = texture(uSampler6, vTextureCoord);
298
- #else
299
- vec4 color6 = texture2D(uSampler6, vTextureCoord);
300
- #endif
297
+
298
+ if (uFactor6 >= 0.0) {
299
+ vec4 color6 = sampleHiPSTexture6(vTextureCoord);
301
300
  finalColor += color6.rgb * uFactor6;
302
301
  }
303
- if (uFactor7 >= 0.0){
304
- #if __VERSION__ > 120
305
- vec4 color7 = texture(uSampler7, vTextureCoord);
306
- #else
307
- vec4 color7 = texture2D(uSampler7, vTextureCoord);
308
- #endif
302
+
303
+ if (uFactor7 >= 0.0) {
304
+ vec4 color7 = sampleHiPSTexture7(vTextureCoord);
309
305
  finalColor += color7.rgb * uFactor7;
310
306
  }
307
+
311
308
  fragColor = vec4(finalColor, 1.0);
312
309
  }`;
313
310
  }
@@ -317,37 +314,139 @@ export default class ShaderManager {
317
314
 
318
315
  in vec2 vTextureCoord;
319
316
 
320
- // UBO
321
317
  layout (std140) uniform colormap {
322
318
  float r_palette[256];
323
319
  float g_palette[256];
324
320
  float b_palette[256];
325
321
  };
326
322
 
327
- uniform sampler2D uSampler0;
328
323
  uniform float uFactor0;
324
+ uniform float uFactor1;
325
+ uniform float uFactor2;
326
+ uniform float uFactor3;
327
+ uniform float uFactor4;
328
+ uniform float uFactor5;
329
+ uniform float uFactor6;
330
+ uniform float uFactor7;
331
+
332
+ ${ShaderManager.hipsSamplersGLSL()}
329
333
 
330
334
  out vec4 fragColor;
331
335
 
332
- void main() {
333
- #if __VERSION__ > 120
334
- vec4 color0 = texture(uSampler0, vTextureCoord);
335
- #else
336
- vec4 color0 = texture2D(uSampler0, vTextureCoord);
337
- #endif
336
+ vec3 applyColorMap(vec4 color) {
337
+ int x = int(clamp(color.r, 0.0, 1.0) * 255.0);
338
+ int y = int(clamp(color.g, 0.0, 1.0) * 255.0);
339
+ int z = int(clamp(color.b, 0.0, 1.0) * 255.0);
338
340
 
339
- int x = int(color0.r * 255.0);
340
341
  float px = r_palette[x] / 256.0;
341
-
342
- int y = int(color0.g * 255.0);
343
342
  float py = g_palette[y] / 256.0;
344
-
345
- int z = int(color0.b * 255.0);
346
343
  float pz = b_palette[z] / 256.0;
347
344
 
348
- // uFactor0 reserved for future blending if needed
349
- fragColor = vec4(px, py, pz, 1.0);
345
+ return vec3(px, py, pz);
346
+ }
347
+
348
+ void main() {
349
+ vec3 finalColor = vec3(0.0);
350
+
351
+ if (uFactor0 >= 0.0) {
352
+ finalColor +=
353
+ applyColorMap(
354
+ sampleHiPSTexture0(vTextureCoord)
355
+ ) * uFactor0;
356
+ }
357
+
358
+ if (uFactor1 >= 0.0) {
359
+ finalColor +=
360
+ applyColorMap(
361
+ sampleHiPSTexture1(vTextureCoord)
362
+ ) * uFactor1;
363
+ }
364
+
365
+ if (uFactor2 >= 0.0) {
366
+ finalColor +=
367
+ applyColorMap(
368
+ sampleHiPSTexture2(vTextureCoord)
369
+ ) * uFactor2;
370
+ }
371
+
372
+ if (uFactor3 >= 0.0) {
373
+ finalColor +=
374
+ applyColorMap(
375
+ sampleHiPSTexture3(vTextureCoord)
376
+ ) * uFactor3;
377
+ }
378
+
379
+ if (uFactor4 >= 0.0) {
380
+ finalColor +=
381
+ applyColorMap(
382
+ sampleHiPSTexture4(vTextureCoord)
383
+ ) * uFactor4;
384
+ }
385
+
386
+ if (uFactor5 >= 0.0) {
387
+ finalColor +=
388
+ applyColorMap(
389
+ sampleHiPSTexture5(vTextureCoord)
390
+ ) * uFactor5;
391
+ }
392
+
393
+ if (uFactor6 >= 0.0) {
394
+ finalColor +=
395
+ applyColorMap(
396
+ sampleHiPSTexture6(vTextureCoord)
397
+ ) * uFactor6;
398
+ }
399
+
400
+ if (uFactor7 >= 0.0) {
401
+ finalColor +=
402
+ applyColorMap(
403
+ sampleHiPSTexture7(vTextureCoord)
404
+ ) * uFactor7;
405
+ }
406
+
407
+ fragColor = vec4(finalColor, 1.0);
350
408
  }`;
351
409
  }
410
+ static hipsSamplerGLSL(index) {
411
+ return `
412
+ uniform sampler2D uSampler${index};
413
+ uniform int uTextureMode${index};
414
+ uniform float uDataMin${index};
415
+ uniform float uDataMax${index};
416
+
417
+ vec4 sampleHiPSTexture${index}(vec2 uv) {
418
+ vec4 color = texture(uSampler${index}, uv);
419
+
420
+ // JPG / PNG
421
+ if (uTextureMode${index} == 0) {
422
+ return color;
423
+ }
424
+
425
+ // FITS physical value stored in red channel
426
+ float value = color.r;
427
+
428
+ if (isnan(value)) {
429
+ discard;
430
+ }
431
+
432
+ float normalized = clamp(
433
+ (value - uDataMin${index}) /
434
+ (uDataMax${index} - uDataMin${index}),
435
+ 0.0,
436
+ 1.0
437
+ );
438
+
439
+ return vec4(
440
+ normalized,
441
+ normalized,
442
+ normalized,
443
+ 1.0
444
+ );
445
+ }
446
+ `;
447
+ }
448
+ static hipsSamplersGLSL() {
449
+ return Array.from({ length: 8 }, (_, index) => ShaderManager.hipsSamplerGLSL(index)).join("\n");
450
+ }
352
451
  }
353
452
  //# sourceMappingURL=ShaderManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShaderManager.js","sourceRoot":"","sources":["../../src/shader/ShaderManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,MAAM,CAAC,WAAW;QAChB,OAAO;;;;;;;;;;;;;;;;;;;MAmBL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8FL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO;;;;;;;;;;;;MAYL,CAAC;IAEL,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO;;;;;;;;MAQL,CAAC;IAEL,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO;;;;;;;;;;;;;MAaL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAyCL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,eAAe;QACpB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8FL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,cAAc;QACnB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmCL,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"ShaderManager.js","sourceRoot":"","sources":["../../src/shader/ShaderManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,MAAM,CAAC,WAAW;QAChB,OAAO;;;;;;;;;;;;;;;;;;;MAmBL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8FL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO;;;;;;;;;;;;MAYL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO;;;;;;;;MAQL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO;;;;;;;;;;;;;MAaL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,OAAO;;;;;;;;;;;;;;MAcL,aAAa,CAAC,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAgDhC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,eAAe;QACpB,OAAO;;;;;;;;;;;;;;MAcL,aAAa,CAAC,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAwDhC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,cAAc;QACnB,OAAO;;;;;;;;;;;;;;;;;;;;MAoBL,aAAa,CAAC,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA4EhC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,KAAa;QAC1C,OAAO;gCACqB,KAAK;8BACP,KAAK;4BACP,KAAK;4BACL,KAAK;;4BAEL,KAAK;qCACI,KAAK;;;wBAGlB,KAAK;;;;;;;;;;;;2BAYF,KAAK;mBACb,KAAK,cAAc,KAAK;;;;;;;;;;;;GAYxC,CAAC;IACF,CAAC;IAEO,MAAM,CAAC,gBAAgB;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAC5C,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CACrC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;CACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "astro-viewer",
3
3
  "description": "3D scientific visualization engine for astronomical and Earth observation data, supporting HiPS, FITS, TAP, ADQL, footprints and WebGL-based spatial exploration.",
4
- "version": "3.6.0",
4
+ "version": "3.7.0",
5
5
  "keywords": [
6
6
  "astronomy",
7
7
  "astrophysics",
@@ -91,8 +91,8 @@
91
91
  "astrospatial-core": "^0.4.1",
92
92
  "cross-fetch": "^3.2.0",
93
93
  "gl-matrix": "^3.4.4",
94
- "jsfitsio": "^2.1.2",
95
- "wcslight": "^3.1.1"
94
+ "jsfitsio": "^3.1.0",
95
+ "wcslight": "^3.1.4"
96
96
  },
97
97
  "browser": {
98
98
  "fs": false,