-
Notifications
You must be signed in to change notification settings - Fork 0
/
class-diagram.drawio
568 lines (568 loc) · 74.6 KB
/
class-diagram.drawio
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
<mxfile host="65bd71144e">
<diagram id="BClis62ARx7J1oJiT1-s" name="Stránka-1">
<mxGraphModel dx="6841" dy="3341" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="827" pageHeight="1169" background="none" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="udVzsaCJ5JT554v93i70-2" value="Data Loading" style="swimlane;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-3480" y="280" width="1250" height="1300" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-2" source="node61" target="node7" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="342" y="245"/>
<mxPoint x="630" y="245"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node61" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>DataLayerSource</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> getDataLayers(dataStore: DataStore): Promise&lt;DataLayer[]&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-2" vertex="1">
<mxGeometry x="130" y="318" width="423" height="68" as="geometry"/>
</mxCell>
<mxCell id="node7" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>DataSource</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> checkAvailability(): Promise&lt;boolean&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-2" vertex="1">
<mxGeometry x="489" y="130" width="282" height="68" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-2" source="node18" target="node7" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="904" y="245"/>
<mxPoint x="630" y="245"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node18" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PatchSource</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> getAvailablePatches(): Promise&lt;PatchInfo[]&gt;<br/> getPatch(info: PatchInfo, includeData: boolean): Promise&lt;Patch | undefined&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-2" vertex="1">
<mxGeometry x="640" y="305" width="527" height="94" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-2" source="node53" target="node61" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-2" source="node53" target="node18" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="342" y="455"/>
<mxPoint x="750" y="455"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node53" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>LocalSource</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> storePatch(patch: Patch): Promise&lt;void&gt;<br/> storeDataLayer(dataLayer: DataLayer): Promise&lt;void&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-2" vertex="1">
<mxGeometry x="150.5" y="568" width="382" height="94" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-2" source="node10" target="node53" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="802" y="765"/>
<mxPoint x="342" y="765"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node10" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>InMemorySource</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> patches: Map&lt;string, Patch&gt;<br/> dataLayers: Map&lt;string, DataLayerObject&gt;</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> storePatch(patch: Patch): Promise&lt;void&gt;<br/> checkAvailability(): Promise&lt;boolean&gt;<br/> getAvailablePatches(): Promise&lt;PatchInfo[]&gt;<br/> getPatch(info: PatchInfo): Promise&lt;Patch | undefined&gt;<br/> storeDataLayer(dataLayer: DataLayer): Promise&lt;void&gt;<br/> getDataLayers(dataStore: DataStore): Promise&lt;DataLayer[]&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-2" vertex="1">
<mxGeometry x="590" y="840" width="423" height="285" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-2" source="node54" target="node53" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node54" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>IndexedDbSource</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> dbPromise: Promise&lt;IDBDatabase&gt;</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> checkAvailability(): Promise&lt;boolean&gt;<br/> storePatch(patch: Patch): Promise&lt;void&gt;<br/> getAvailablePatches(): Promise&lt;PatchInfo[]&gt;<br/> getPatch(info: PatchInfo): Promise&lt;Patch | undefined&gt;<br/> storeDataLayer(dataLayer: DataLayer): Promise&lt;void&gt;<br/> getDataLayers(dataStore: DataStore): Promise&lt;DataLayer[]&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-2" vertex="1">
<mxGeometry x="130" y="840" width="423" height="285" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-2" source="node23" target="node18" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="904" y="475"/>
<mxPoint x="904" y="475"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node23" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>StaticSource</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> checkAvailability(): Promise&lt;boolean&gt;<br/> getAvailablePatches(): Promise&lt;PatchInfo[]&gt;<br/> getPatch(info: PatchInfo, includeData: boolean): Promise&lt;Patch&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-2" vertex="1">
<mxGeometry x="678" y="555" width="451" height="120" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-24" value="State Management" style="swimlane;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-3480" y="-1030" width="1250" height="1300" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;" parent="udVzsaCJ5JT554v93i70-24" source="node29" target="node39" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node29" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PatchStore</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(dataStore: DataStore): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> dataStore: DataStore<br/> requests: Set&lt;string&gt;<br/> loading: boolean</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> init(): Promise&lt;void&gt;<br/> request(source: PatchSource, info: PatchInfo): Promise&lt;void&gt;<br/> store(patch: Patch): Promise&lt;void&gt;<br/> load(source: PatchSource): Promise&lt;void&gt;<br/> preload(source: PatchSource): Promise&lt;void&gt;<br/> loadAll(sources: PatchSource[]): Promise&lt;void&gt;<br/> preloadAll(sources: PatchSource[]): Promise&lt;void&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-24" vertex="1">
<mxGeometry x="142" y="820" width="434" height="341" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;" parent="udVzsaCJ5JT554v93i70-24" source="node0" target="node55" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="892" y="290"/>
<mxPoint x="625" y="290"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node0" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MapStore</b></p><hr size="1"><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(rootStore: RootStore): </p><hr size="1"><p style="margin:0 0 0 4px;line-height:1.6;"> rootStore: RootStore<br> mapLayers: Map&lt;string, MapLayer&gt;<br> mapCache: MapCache<br> mapState: MapState<br> mapControllers: MapController[]</p><hr size="1"><p style="margin:0 0 0 4px;line-height:1.6;"> updateMapState(state: MapState): Promise&lt;void&gt;<br> mapUpdate(): void (change in layrers visibility)<br> mapRedraw(): void (change in layer values)</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-24" vertex="1">
<mxGeometry x="712.5" y="350" width="360" height="280" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;" parent="udVzsaCJ5JT554v93i70-24" source="node39" target="node55" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="359" y="290"/>
<mxPoint x="625" y="290"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node39" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>DataStore</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(rootStore: RootStore): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> rootStore: RootStore<br/> patchStore: PatchStore<br/> sources: DataSource[]<br/> sites: Site[]</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> init(): Promise&lt;void&gt;<br/> load(): Promise&lt;void&gt;<br/> addSite(site: Site): void<br/> selectSite(site: Site): void<br/> addDataLayer(dataLayer: DataLayer): void<br/> pushPatch(patch: Patch): void<br/> getDataLayer(info: PatchInfo): DataLayer<br/> saveDataLayer(dataLayer: DataLayer): Promise&lt;void&gt;</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> dataLayers: DataLayer[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-24" vertex="1">
<mxGeometry x="170" y="350" width="378" height="410" as="geometry"/>
</mxCell>
<mxCell id="node55" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>RootStore</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> mapStore: MapStore<br/> dataStore: DataStore</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-24" vertex="1">
<mxGeometry x="537.5" y="110" width="175" height="130" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-89" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;" parent="udVzsaCJ5JT554v93i70-24" source="node40" target="node0" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node40" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MapState</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> zoom: number<br/> bounds: AreaBounds</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-24" vertex="1">
<mxGeometry x="680" y="713" width="159" height="94" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-24" source="node9" target="node0" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node9" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MapCache</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(size: number): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-24" vertex="1">
<mxGeometry x="890" y="713" width="216" height="68" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-29" value="<div>Map Layers<br></div>" style="swimlane;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-2220" y="-1030" width="1230" height="1540" as="geometry"/>
</mxCell>
<mxCell id="node44" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MapController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> active: boolean<br/> setActive: (active: boolean) =&gt; void<br/> onMapUpdate: () =&gt; void<br/> onMapRedraw: () =&gt; void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-29" vertex="1">
<mxGeometry x="480" y="100" width="268" height="146" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-29" source="node45" target="node44" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node45" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ContoursController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(mapStore: MapStore): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> active: boolean<br/> mapStore: MapStore</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> setActive(active: boolean): void<br/> onMapUpdate(): void<br/> onMapRedraw(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-29" vertex="1">
<mxGeometry x="310" y="380" width="264" height="220" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-29" source="node12" target="node44" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node12" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GridController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(mapStore: MapStore): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> active: boolean<br/> mapStore: MapStore<br/> oldGridLayers: GridLayer[]</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> setActive(active: boolean): void<br/> onMapUpdate(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-29" vertex="1">
<mxGeometry x="640" y="380" width="264" height="220" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-82" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-29" source="node49" target="node63" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node49" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ContoursLayer</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(grids: GridPatch[]): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: string<br/> type: &quot;custom&quot;<br/> renderingMode: &quot;2d&quot;<br/> active: boolean<br/> grids: GridPatch[]<br/> map: maplibregl.Map<br/> shader: ContoursShader<br/> compute: ContoursComputeShader<br/> countX: number<br/> countY: number<br/> bounds: AreaBounds<br/> recalculate: boolean</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> recalculateContours(): void<br/> onAdd(map: maplibregl.Map, gl: WebGLContext): void<br/> onRemove(_map: maplibregl.Map, gl: WebGLContext): void<br/> render(gl: WebGLRenderingContext | WebGL2RenderingContext, mvp: glm.mat4): void<br/> runCompute(gl: WebGLContext): void<br/> runShader(gl: WebGLContext, mvp: glm.mat4): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> patches: GridPatch[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-29" vertex="1">
<mxGeometry x="120" y="909" width="482" height="551" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-81" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-29" source="node4" target="node63" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node4" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GridLayer</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(layer: DataLayer, grid: GridPatch): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: string<br/> type: &quot;custom&quot;<br/> renderingMode: &quot;2d&quot;<br/> active: boolean<br/> offset: glm.vec2<br/> layer: DataLayer<br/> grid: GridPatch<br/> shader: GridShader<br/> map: maplibregl.Map</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> onAdd(map: maplibregl.Map, gl: WebGLContext): void<br/> onRemove(_map: maplibregl.Map, gl: WebGLContext): void<br/> render(gl: WebGLRenderingContext | WebGL2RenderingContext, mvp: glm.mat4): void</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> dataLayer: DataLayer<br/> patch: GridPatch</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-29" vertex="1">
<mxGeometry x="634" y="909" width="482" height="441" as="geometry"/>
</mxCell>
<mxCell id="node63" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MapLayer</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> active: boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-29" vertex="1">
<mxGeometry x="540" y="720" width="139" height="68" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-34" value="Map Rendering" style="swimlane;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-980" y="-1030" width="1630" height="2080" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=classic;endFill=1;dashed=1;" parent="udVzsaCJ5JT554v93i70-34" source="node32" target="node17" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="390" y="670"/>
<mxPoint x="390" y="210"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-56" value="Every shader uses one program" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="udVzsaCJ5JT554v93i70-55" vertex="1" connectable="0">
<mxGeometry x="0.0257" y="4" relative="1" as="geometry">
<mxPoint x="104" y="204" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-57" value="<div>Programs represent compiled WebGL&nbsp;</div><div>fragment and vertex shaders</div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="udVzsaCJ5JT554v93i70-55" vertex="1" connectable="0">
<mxGeometry x="0.7334" y="4" relative="1" as="geometry">
<mxPoint x="14" y="-25" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="node32" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Shader</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(program: Program): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> program: Program<br/> vao: WebGLVertexArrayObject<br/> attributes: Record&lt;string, ShaderAttribute&gt;<br/> textures: Record&lt;string, ShaderTexture&gt;</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> init(gl: WebGLContext): void<br/> getProgram(): WebGLProgram<br/> delete(gl: WebGLContext): void<br/> bind(gl: WebGLContext): void<br/> unbind(gl: WebGLContext): void<br/> borrowTexture(gl: WebGLContext, shader: Shader, name: string): void<br/> swapTextures(srcName: string, dstName: string): void<br/> setAttributeData(gl: WebGLContext, values: number[], params: AttributeParams): void<br/> setTextureData(gl: WebGLContext, values: ArrayBufferView | null, params: TextureParams): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-34" vertex="1">
<mxGeometry x="579.5" y="560" width="477" height="390" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-34" source="node1" target="node32" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="813" y="1100"/>
<mxPoint x="813" y="1100"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ContoursShader</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> mvp: glm.ReadonlyMat4<br/> camera: glm.ReadonlyVec3<br/> center: glm.ReadonlyVec3<br/> count: glm.ReadonlyVec2</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> bind(gl: WebGLContext): void<br/> setPositions(gl: WebGLContext, values: glm.vec3[]): void<br/> setUVs(gl: WebGLContext, values: glm.vec2[]): void<br/> setProjection(gl: WebGLContext, values: Float32Array): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-34" vertex="1">
<mxGeometry x="602.5" y="1510" width="421" height="286" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-48" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;" parent="udVzsaCJ5JT554v93i70-34" source="node2" target="node32" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1303" y="1030"/>
<mxPoint x="830" y="1030"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node2" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ComputeShader</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(program: Program): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> framebuffer: WebGLFramebuffer</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> init(gl: WebGLContext): void<br/> bind(gl: WebGLContext): void<br/> unbind(gl: WebGLContext): void<br/> delete(gl: WebGLContext): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-34" vertex="1">
<mxGeometry x="1180" y="1140" width="250" height="216" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-34" source="node52" target="node32" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="322" y="1260"/>
<mxPoint x="813" y="1260"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node52" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GridShader</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> mvp: glm.ReadonlyMat4<br/> camera: glm.ReadonlyVec3<br/> center: glm.ReadonlyVec3<br/> offset: glm.ReadonlyVec2<br/> tint: glm.ReadonlyVec4<br/> count: glm.ReadonlyVec2<br/> density: glm.ReadonlyVec2<br/> minmax: glm.ReadonlyVec2<br/> filter: glm.ReadonlyVec2<br/> mask: number | null<br/> zoom: number</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> bind(gl: WebGLContext): void<br/> setPositions(gl: WebGLContext, values: glm.vec3[]): void<br/> setUVs(gl: WebGLContext, values: glm.vec2[]): void<br/> setValues(gl: WebGLContext, values: Float32Array, countX: number, countY: number): void<br/> setProjection(gl: WebGLContext, values: Float32Array): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-34" vertex="1">
<mxGeometry x="93" y="1510" width="458" height="466" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-34" source="node38" target="node2" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node38" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ContoursComputeShader</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> count: glm.ReadonlyVec2<br/> start: glm.ReadonlyVec2<br/> scale: glm.ReadonlyVec2<br/> offset: glm.ReadonlyVec2<br/> minmax: glm.ReadonlyVec2<br/> filter: glm.ReadonlyVec2<br/> mask: number | null</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> init(gl: WebGLContext): void<br/> bind(gl: WebGLContext): void<br/> draw(gl: WebGLContext, countX: number, countY: number): void<br/> clear(gl: WebGLContext, value: GLclampf, countX: number, countY: number): void<br/> setValues(gl: WebGLContext, values: Float32Array, countX: number, countY: number): void<br/> setContours(gl: WebGLContext, values: Float32Array | null, countX: number, countY: number): void<br/> setPositions(gl: WebGLContext, values: glm.vec3[]): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-34" vertex="1">
<mxGeometry x="1073" y="1510" width="464" height="430" as="geometry"/>
</mxCell>
<mxCell id="node17" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Program</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(vertexSource: string, fragmentSource: string): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> vertexSource: string<br/> fragmentSource: string<br/> program: WebGLProgram | null</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> init(gl: WebGLContext): void<br/> get(): WebGLProgram<br/> createProgram(gl: WebGLContext): WebGLProgram<br/> createShader(gl: WebGLContext, source: string, type: number): WebGLShader</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-34" vertex="1">
<mxGeometry x="547" y="80" width="536" height="260" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-51" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-34" source="node60" target="node17" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="582" y="380"/>
<mxPoint x="830" y="380"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node60" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ContoursComputeProgram</b></p><hr size="1"/>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-34" vertex="1">
<mxGeometry x="462" y="420" width="241" height="30" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-34" source="node51" target="node17" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="830" y="390"/>
<mxPoint x="830" y="390"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node51" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ContoursProgram</b></p><hr size="1"/>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-34" vertex="1">
<mxGeometry x="741.5" y="420" width="171" height="30" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-53" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-34" source="node34" target="node17" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1017" y="380"/>
<mxPoint x="830" y="380"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node34" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GridProgram</b></p><hr size="1"/>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-34" vertex="1">
<mxGeometry x="952" y="420" width="131" height="30" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=none;endFill=0;" parent="1" source="node44" target="node0" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-2330" y="-830"/>
<mxPoint x="-2330" y="-550"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-60" value="MapControllers change and control map state" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="udVzsaCJ5JT554v93i70-59" vertex="1" connectable="0">
<mxGeometry x="-0.1058" y="5" relative="1" as="geometry">
<mxPoint x="197" y="-25" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="node21" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Site</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(name: string): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> name: string<br/> bounds: AreaBounds<br/> layers: DataLayer[]<br/> selected: boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
<mxGeometry x="-4025" y="-950" width="213" height="178" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-62" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;" parent="1" source="node6" target="node21" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-63" value="Site can contain many DataLayers" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="udVzsaCJ5JT554v93i70-62" vertex="1" connectable="0">
<mxGeometry x="0.1995" y="-4" relative="1" as="geometry">
<mxPoint x="95" y="41" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="node6" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>DataLayer</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(store: DataStore, site: Site, name: string, tint: Color): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> store: DataStore<br/> site: Site<br/> id: string<br/> name: string<br/> tint: Color<br/> metadata: DataLayerMetadata<br/> patches: PatchTree<br/> minmax: [number, number]<br/> filter: [number, number]<br/> selected: boolean<br/> filtered: boolean<br/> colored: boolean<br/> expanded: boolean<br/> informed: boolean</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> pushPatch(patch: Patch): void<br/> setFilter(min: number, max: number): void<br/> toggleSelect(): void<br/> toggleFilter(): void<br/> toggleColor(): void<br/> toggleInfo(): void<br/> setTint(color: Color): void<br/> setMetadata(metadata: DataLayerMetadata): void<br/> recalculateMinMax(): void<br/> toObject(): {site: string, metadata: DataLayerMetad…<br/> fromObject(dataStore: DataStore, object: DataLayerObject): DataLayer</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> active: boolean<br/> hidden: boolean<br/> loaded: boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
<mxGeometry x="-4160" y="-670" width="483" height="744" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-67" value="Data Layers" style="swimlane;whiteSpace=wrap;html=1;fontStyle=4" parent="1" vertex="1">
<mxGeometry x="-4840" y="-1030" width="1350" height="1840" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-77" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;" parent="udVzsaCJ5JT554v93i70-67" source="node22" target="node57" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="730" y="715.2941176470588" as="targetPoint"/>
<Array as="points">
<mxPoint x="732" y="1200"/>
<mxPoint x="140" y="1200"/>
<mxPoint x="140" y="709"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-78" value="All patches are stored in PatchTree (for efficient lookup)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="udVzsaCJ5JT554v93i70-77" vertex="1" connectable="0">
<mxGeometry x="-0.6151" y="4" relative="1" as="geometry">
<mxPoint x="-132" y="-19" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="node22" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Patch</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(info: PatchInfo, source?: PatchSource): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> info: PatchInfo<br/> data: PatchData<br/> bounds: AreaBounds<br/> source: PatchSource<br/> dataLayer: DataLayer</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> toObject(): {data: PatchData | undefined, bounds: A…<br/> fromObject(source: PatchSource, object: PatchObject): Patch</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: string</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-67" vertex="1">
<mxGeometry x="517.5" y="1290" width="428" height="299" as="geometry"/>
</mxCell>
<mxCell id="node35" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PatchData</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> metadata: PatchMetadata<br/> bounds: PatchBounds<br/> minValue: number<br/> maxValue: number</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-67" vertex="1">
<mxGeometry x="240" y="1366.5" width="204" height="146" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-74" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=none;endFill=0;" parent="udVzsaCJ5JT554v93i70-67" source="node26" target="node66" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-67" source="node26" target="node22" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node26" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GridPatch</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> data: GridData</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-67" vertex="1">
<mxGeometry x="665" y="1638" width="133" height="68" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-73" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-67" source="node66" target="node35" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node66" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GridData</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> values: Float32Array<br/> mask: number | null<br/> countX: number<br/> countY: number</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-67" vertex="1">
<mxGeometry x="256" y="1599" width="172" height="146" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-72" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;dashed=1;" parent="udVzsaCJ5JT554v93i70-67" source="node35" target="node22" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="udVzsaCJ5JT554v93i70-67" source="node13" target="node57" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node13" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ObservablePatchTree</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> atom: IAtom</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> push(patch: Patch): void<br/> getArea(bounds: AreaBounds, level: PatchLevel): Patch[]<br/> values(): Patch[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-67" vertex="1">
<mxGeometry x="240" y="894" width="401" height="210" as="geometry"/>
</mxCell>
<mxCell id="node57" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PatchTree</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> level: PatchLevel<br/> nodes: PatchTree[]<br/> bounds: AreaBounds<br/> patch: Patch</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> push(patch: Patch): void<br/> getArea(bounds: AreaBounds, level: PatchLevel): Patch[]<br/> values(): Patch[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-67" vertex="1">
<mxGeometry x="240" y="574" width="401" height="270" as="geometry"/>
</mxCell>
<mxCell id="node42" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>DataLayerMetadata</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> displayName: string</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-67" vertex="1">
<mxGeometry x="455" y="420" width="186" height="68" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-91" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;" parent="udVzsaCJ5JT554v93i70-67" source="node20" target="node22" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node20" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PatchInfo</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> level: PatchLevel<br/> name: string<br/> site: string<br/> index: number<br/> filename: string<br/> date: Date</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="udVzsaCJ5JT554v93i70-67" vertex="1">
<mxGeometry x="990" y="1348" width="133" height="183" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-68" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;dashed=1;endArrow=none;endFill=0;" parent="1" source="node39" target="node21" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-3400" y="-550"/>
<mxPoint x="-3400" y="-861"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-75" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;" parent="1" source="node57" target="node6" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-4200" y="-321"/>
<mxPoint x="-4200" y="-321"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-79" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=none;endFill=0;" parent="1" source="node7" target="node39" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-3400" y="444"/>
<mxPoint x="-3400" y="-540"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-83" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=none;endFill=0;" parent="1" source="node63" target="node0" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-2330" y="-276"/>
<mxPoint x="-2330" y="-540"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-86" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;dashed=1;" parent="1" source="node63" target="node32" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-87" value="MapLayers are used in shaders to render in maplibre-gl" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="udVzsaCJ5JT554v93i70-86" vertex="1" connectable="0">
<mxGeometry x="0.4884" y="4" relative="1" as="geometry">
<mxPoint y="-11" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;" parent="1" source="node42" target="node6" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-4292" y="-630"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-1" value="User Interface" style="swimlane;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-3480" y="-2240" width="1250" height="1200" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="z4KXvKS0HiufvVy1GPtC-1" source="z4KXvKS0HiufvVy1GPtC-2" target="z4KXvKS0HiufvVy1GPtC-12" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="855" y="240"/>
<mxPoint x="625" y="240"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-2" value="<font size="1"><b style="font-size: 14px;">Map</b></font>" style="html=1;whiteSpace=wrap;" parent="z4KXvKS0HiufvVy1GPtC-1" vertex="1">
<mxGeometry x="800" y="290" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;dashed=1;endArrow=none;endFill=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;startArrow=classic;startFill=1;" parent="z4KXvKS0HiufvVy1GPtC-1" source="node8" target="z4KXvKS0HiufvVy1GPtC-2" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="966" y="380"/>
<mxPoint x="855" y="380"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-8" value="Listens to static events (screenshots, redraws)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="z4KXvKS0HiufvVy1GPtC-7" vertex="1" connectable="0">
<mxGeometry x="0.2213" y="-1" relative="1" as="geometry">
<mxPoint x="-1" y="372" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="node8" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>EventBus</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> eventMap: Record&lt;keyof T, Set&lt;(...args: never[]) …</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> emit(event: K, args: any): void<br/> emitAction(event: K, args: any): void<br/> on(event: K, callback: T[K]): () =&gt; void<br/> off(event: K, callback: T[K]): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="z4KXvKS0HiufvVy1GPtC-1" vertex="1">
<mxGeometry x="780" y="920" width="371" height="180" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-12" value="<b><font style="font-size: 14px;">App</font></b>" style="html=1;whiteSpace=wrap;" parent="z4KXvKS0HiufvVy1GPtC-1" vertex="1">
<mxGeometry x="569.9999999999995" y="100" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="z4KXvKS0HiufvVy1GPtC-1" source="z4KXvKS0HiufvVy1GPtC-15" target="z4KXvKS0HiufvVy1GPtC-12" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="415" y="240"/>
<mxPoint x="625" y="240"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-15" value="<font style="font-size: 14px;"><b>GUI</b></font>" style="html=1;whiteSpace=wrap;" parent="z4KXvKS0HiufvVy1GPtC-1" vertex="1">
<mxGeometry x="360" y="290" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="z4KXvKS0HiufvVy1GPtC-1" source="z4KXvKS0HiufvVy1GPtC-20" target="z4KXvKS0HiufvVy1GPtC-15" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-20" value="<b style="font-size: 14px;">Toolbox</b>" style="html=1;whiteSpace=wrap;" parent="z4KXvKS0HiufvVy1GPtC-1" vertex="1">
<mxGeometry x="160" y="460" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="z4KXvKS0HiufvVy1GPtC-1" source="z4KXvKS0HiufvVy1GPtC-24" target="z4KXvKS0HiufvVy1GPtC-15" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-24" value="<font size="1"><b style="font-size: 14px;">Modal</b></font>" style="html=1;whiteSpace=wrap;" parent="z4KXvKS0HiufvVy1GPtC-1" vertex="1">
<mxGeometry x="550" y="460" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-28" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="z4KXvKS0HiufvVy1GPtC-1" source="z4KXvKS0HiufvVy1GPtC-26" target="z4KXvKS0HiufvVy1GPtC-20" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-26" value="<font style="font-size: 14px;"><b>ContoursTool<br></b></font>" style="html=1;whiteSpace=wrap;" parent="z4KXvKS0HiufvVy1GPtC-1" vertex="1">
<mxGeometry x="90" y="580" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="z4KXvKS0HiufvVy1GPtC-1" source="z4KXvKS0HiufvVy1GPtC-29" target="z4KXvKS0HiufvVy1GPtC-20" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="285" y="545"/>
<mxPoint x="215" y="545"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="z4KXvKS0HiufvVy1GPtC-1" source="z4KXvKS0HiufvVy1GPtC-29" target="node8" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="285" y="1010"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-37" value="Dispatches mapScreenshot, mapTiffExport" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="z4KXvKS0HiufvVy1GPtC-36" vertex="1" connectable="0">
<mxGeometry x="-0.528" y="-3" relative="1" as="geometry">
<mxPoint x="378" y="154" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-29" value="<font size="1"><b style="font-size: 14px;">ExportTool</b></font>" style="html=1;whiteSpace=wrap;" parent="z4KXvKS0HiufvVy1GPtC-1" vertex="1">
<mxGeometry x="230" y="580" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="z4KXvKS0HiufvVy1GPtC-1" source="z4KXvKS0HiufvVy1GPtC-31" target="z4KXvKS0HiufvVy1GPtC-24" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-31" value="<font size="1"><b style="font-size: 14px;">ImportModal</b></font>" style="html=1;whiteSpace=wrap;" parent="z4KXvKS0HiufvVy1GPtC-1" vertex="1">
<mxGeometry x="550" y="580" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.484;entryY=1.007;entryDx=0;entryDy=0;dashed=1;entryPerimeter=0;" parent="1" source="node0" target="node8" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-2520" y="-910"/>
<mxPoint x="-2520" y="-910"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-10" value="Dispatches mapUpdate, mapRedraw" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="z4KXvKS0HiufvVy1GPtC-9" vertex="1" connectable="0">
<mxGeometry x="0.7045" y="1" relative="1" as="geometry">
<mxPoint x="-11" y="-21" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=none;endFill=0;" parent="1" source="z4KXvKS0HiufvVy1GPtC-2" target="node0" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-2280" y="-1925"/>
<mxPoint x="-2280" y="-950"/>
<mxPoint x="-2498" y="-950"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-19" value="Reacts to state changes (mapLayers, mapState)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="z4KXvKS0HiufvVy1GPtC-18" vertex="1" connectable="0">
<mxGeometry x="0.6369" y="4" relative="1" as="geometry">
<mxPoint x="10" y="-994" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-33" value="Web Workers" style="swimlane;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-4840" y="-2240" width="1350" height="1200" as="geometry"/>
</mxCell>
<mxCell id="udVzsaCJ5JT554v93i70-93" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;" parent="z4KXvKS0HiufvVy1GPtC-33" source="node64" target="node37" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="node64" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BinaryReader</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(buffer: Buffer): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> buffer: Buffer<br/> offset: number</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> seek(offset: number): void<br/> readString(): string<br/> readBoolean(): boolean<br/> readUint32(): number<br/> readInt32(): number<br/> readInt8(): number<br/> readUint8(): number<br/> readFloat(): number<br/> readDouble(): number<br/> decodeULEB128(): number</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> byteOffset: number</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="z4KXvKS0HiufvVy1GPtC-33" vertex="1">
<mxGeometry x="854.5" y="566" width="221" height="410" as="geometry"/>
</mxCell>
<mxCell id="node37" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GridParser</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> parseGrid(request: ParseRequest): Promise&lt;GridData&gt;<br/> parseTIFF(request: ParseRequest): Promise&lt;GridData&gt;<br/> parseBIN(request: ParseRequest): Promise&lt;GridData&gt;<br/> parseCSV(request: ParseRequest): Promise&lt;GridData&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="z4KXvKS0HiufvVy1GPtC-33" vertex="1">
<mxGeometry x="770" y="340" width="390" height="146" as="geometry"/>
</mxCell>
<mxCell id="node16" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GridExporter</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> exportTIFF(request: ExportTiffRequest): Promise&lt;ArrayBuffer&gt;<br/> exportDataTIFF(request: ExportDataTiffRequest): Promise&lt;ArrayBuffer&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="z4KXvKS0HiufvVy1GPtC-33" vertex="1">
<mxGeometry x="130" y="340" width="497" height="94" as="geometry"/>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;dashed=1;" parent="1" source="z4KXvKS0HiufvVy1GPtC-31" target="node37" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-2875" y="-1520"/>
<mxPoint x="-3600" y="-1520"/>
<mxPoint x="-3600" y="-1827"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-35" value="Uses GridParser and pushes result to PatchStore" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="z4KXvKS0HiufvVy1GPtC-34" vertex="1" connectable="0">
<mxGeometry x="-0.2525" y="-1" relative="1" as="geometry">
<mxPoint x="224" y="-9" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=none;endFill=0;" parent="1" source="z4KXvKS0HiufvVy1GPtC-26" target="node0" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-3335" y="-950"/>
<mxPoint x="-2540" y="-950"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z4KXvKS0HiufvVy1GPtC-39" value="Has control over ContoursController" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="z4KXvKS0HiufvVy1GPtC-38" vertex="1" connectable="0">
<mxGeometry x="0.412" y="4" relative="1" as="geometry">
<mxPoint x="-463" y="-6" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="KBpqSQ_R69gUOc1DPDg--1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;dashed=1;" parent="1" source="z4KXvKS0HiufvVy1GPtC-2" target="node16" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-2625" y="-1460"/>
<mxPoint x="-3550" y="-1460"/>
<mxPoint x="-3550" y="-1960"/>
<mxPoint x="-4150" y="-1960"/>
<mxPoint x="-4150" y="-1853"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="KBpqSQ_R69gUOc1DPDg--2" value="Uses GridExporter to export MapLayers to GeoTIFF" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="KBpqSQ_R69gUOc1DPDg--1" connectable="0" vertex="1">
<mxGeometry x="-0.4674" y="-2" relative="1" as="geometry">
<mxPoint x="126" y="-8" as="offset"/>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>