@flowmap.gl/data 8.0.0-alpha.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 (56) hide show
  1. package/LICENSE +199 -0
  2. package/dist/FlowMapAggregateAccessors.d.ts +15 -0
  3. package/dist/FlowMapAggregateAccessors.d.ts.map +1 -0
  4. package/dist/FlowMapAggregateAccessors.js +43 -0
  5. package/dist/FlowMapSelectors.d.ts +156 -0
  6. package/dist/FlowMapSelectors.d.ts.map +1 -0
  7. package/dist/FlowMapSelectors.js +831 -0
  8. package/dist/FlowMapState.d.ts +24 -0
  9. package/dist/FlowMapState.d.ts.map +1 -0
  10. package/dist/FlowMapState.js +2 -0
  11. package/dist/cluster/ClusterIndex.d.ts +42 -0
  12. package/dist/cluster/ClusterIndex.d.ts.map +1 -0
  13. package/dist/cluster/ClusterIndex.js +178 -0
  14. package/dist/cluster/cluster.d.ts +31 -0
  15. package/dist/cluster/cluster.d.ts.map +1 -0
  16. package/dist/cluster/cluster.js +206 -0
  17. package/dist/colors.d.ts +103 -0
  18. package/dist/colors.d.ts.map +1 -0
  19. package/dist/colors.js +441 -0
  20. package/dist/getViewStateForLocations.d.ts +16 -0
  21. package/dist/getViewStateForLocations.d.ts.map +1 -0
  22. package/dist/getViewStateForLocations.js +30 -0
  23. package/dist/index.d.ts +11 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +10 -0
  26. package/dist/provider/FlowMapDataProvider.d.ts +16 -0
  27. package/dist/provider/FlowMapDataProvider.d.ts.map +1 -0
  28. package/dist/provider/FlowMapDataProvider.js +17 -0
  29. package/dist/provider/LocalFlowMapDataProvider.d.ts +20 -0
  30. package/dist/provider/LocalFlowMapDataProvider.d.ts.map +1 -0
  31. package/dist/provider/LocalFlowMapDataProvider.js +87 -0
  32. package/dist/time.d.ts +24 -0
  33. package/dist/time.d.ts.map +1 -0
  34. package/dist/time.js +126 -0
  35. package/dist/types.d.ts +116 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +23 -0
  38. package/dist/util.d.ts +2 -0
  39. package/dist/util.d.ts.map +1 -0
  40. package/dist/util.js +4 -0
  41. package/package.json +48 -0
  42. package/src/FlowMapAggregateAccessors.ts +60 -0
  43. package/src/FlowMapSelectors.ts +1407 -0
  44. package/src/FlowMapState.ts +26 -0
  45. package/src/cluster/ClusterIndex.ts +266 -0
  46. package/src/cluster/cluster.ts +299 -0
  47. package/src/colors.ts +723 -0
  48. package/src/getViewStateForLocations.ts +64 -0
  49. package/src/index.ts +10 -0
  50. package/src/provider/FlowMapDataProvider.ts +63 -0
  51. package/src/provider/LocalFlowMapDataProvider.ts +108 -0
  52. package/src/time.ts +160 -0
  53. package/src/types.ts +162 -0
  54. package/src/util.ts +3 -0
  55. package/tsconfig.json +11 -0
  56. package/typings.d.ts +1 -0
@@ -0,0 +1,103 @@
1
+ import { SettingsState } from './FlowMapState';
2
+ export declare type ColorScale = (value: number) => RGBA;
3
+ export declare type RGBA = [number, number, number, number];
4
+ export declare function opacityFloatToInteger(opacity: number): number;
5
+ export declare function opacifyHex(hexCode: string, opacity: number): string;
6
+ export declare function colorAsRgba(color: string): RGBA;
7
+ export declare enum ColorScheme {
8
+ primary = "#162d3c"
9
+ }
10
+ export declare const BLUES_PALE: string[];
11
+ export declare const schemeTeal: string[];
12
+ export declare const DEFAULT_COLOR_SCHEME: string[];
13
+ export declare const COLOR_SCHEMES: {
14
+ [key: string]: string[];
15
+ };
16
+ export declare const COLOR_SCHEME_KEYS: string[];
17
+ export declare function getFlowMapColors(settingsState: SettingsState): Colors | DiffColors;
18
+ export declare function getColors(diffMode: boolean, schemeKey: string | undefined, darkMode: boolean, fadeEnabled: boolean, fadeAmount: number, animate: boolean): Colors | DiffColors;
19
+ export declare function createFlowColorScale(domain: [number, number], scheme: string[], animate: boolean | undefined): ColorScale;
20
+ export declare function getFlowColorScale(colors: ColorsRGBA | DiffColorsRGBA, magnitudeExtent: [number, number] | undefined, animate: boolean | undefined): (magnitude: number) => [number, number, number, number];
21
+ export declare function isDiffColors(colors: DiffColors | Colors): colors is DiffColors;
22
+ export declare function isDiffColorsRGBA(colors: DiffColorsRGBA | ColorsRGBA): colors is DiffColorsRGBA;
23
+ export interface FlowColors {
24
+ scheme?: string[];
25
+ highlighted?: string;
26
+ }
27
+ export interface LocationCircleColors {
28
+ inner?: string;
29
+ outgoing?: string;
30
+ incoming?: string;
31
+ highlighted?: string;
32
+ empty?: string;
33
+ emptyOutline?: string;
34
+ }
35
+ export interface LocationAreaColors {
36
+ outline?: string;
37
+ normal?: string;
38
+ selected?: string;
39
+ highlighted?: string;
40
+ connected?: string;
41
+ }
42
+ export interface BaseColors {
43
+ darkMode?: boolean;
44
+ locationAreas?: LocationAreaColors;
45
+ dimmedOpacity?: number;
46
+ outlineColor?: string;
47
+ }
48
+ export interface Colors extends BaseColors {
49
+ flows?: FlowColors;
50
+ locationCircles?: LocationCircleColors;
51
+ }
52
+ export interface FlowAndCircleColors {
53
+ flows?: FlowColors;
54
+ locationCircles?: LocationCircleColors;
55
+ }
56
+ export interface DiffColors extends BaseColors {
57
+ positive?: FlowAndCircleColors;
58
+ negative?: FlowAndCircleColors;
59
+ }
60
+ export interface FlowColorsRGBA {
61
+ scheme: string[];
62
+ highlighted: RGBA;
63
+ }
64
+ export interface LocationCircleColorsRGBA {
65
+ inner: RGBA;
66
+ outgoing: RGBA;
67
+ incoming: RGBA;
68
+ highlighted: RGBA;
69
+ empty: RGBA;
70
+ emptyOutline: RGBA;
71
+ }
72
+ export interface LocationAreaColorsRGBA {
73
+ outline: RGBA;
74
+ normal: RGBA;
75
+ selected: RGBA;
76
+ highlighted: RGBA;
77
+ connected: RGBA;
78
+ }
79
+ export interface BaseColorsRGBA {
80
+ darkMode: boolean;
81
+ locationAreas: LocationAreaColorsRGBA;
82
+ dimmedOpacity: number;
83
+ outlineColor: RGBA;
84
+ }
85
+ export interface ColorsRGBA extends BaseColorsRGBA {
86
+ flows: FlowColorsRGBA;
87
+ locationCircles: LocationCircleColorsRGBA;
88
+ }
89
+ export interface FlowAndCircleColorsRGBA {
90
+ flows: FlowColorsRGBA;
91
+ locationCircles: LocationCircleColorsRGBA;
92
+ }
93
+ export interface DiffColorsRGBA extends BaseColorsRGBA {
94
+ positive: FlowAndCircleColorsRGBA;
95
+ negative: FlowAndCircleColorsRGBA;
96
+ }
97
+ export declare function getColorsRGBA(colors: Colors | undefined): ColorsRGBA;
98
+ export declare function getDiffColorsRGBA(colors: DiffColors | undefined): DiffColorsRGBA;
99
+ export declare function rgbaAsString(color: RGBA): string;
100
+ export declare function midpoint(a: number, b: number, zeroToOne: number): number;
101
+ export declare function mixColorsRGBA(color1: RGBA, color2: RGBA, zeroToOne: number): RGBA;
102
+ export default getColors;
103
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"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"}
package/dist/colors.js ADDED
@@ -0,0 +1,441 @@
1
+ import { interpolateCool, interpolateInferno, interpolateMagma, interpolatePlasma, interpolateViridis, interpolateWarm, schemeBlues, schemeBuGn, schemeBuPu, schemeGnBu, schemeGreens, schemeGreys, schemeOranges, schemeOrRd, schemePuBu, schemePuBuGn, schemePuRd, schemePurples, schemeRdPu, schemeReds, schemeYlGn, schemeYlGnBu, schemeYlOrBr, schemeYlOrRd, } from 'd3-scale-chromatic';
2
+ import { range } from 'd3-array';
3
+ import { scalePow, scaleSequential, scaleSequentialPow } from 'd3-scale';
4
+ import { interpolateRgbBasis } from 'd3-interpolate';
5
+ import { color as d3color, hcl } from 'd3-color';
6
+ const DEFAULT_OUTLINE_COLOR = '#fff';
7
+ const DEFAULT_DIMMED_OPACITY = 0.4;
8
+ const DEFAULT_FLOW_MIN_COLOR = 'rgba(240,240,240,0.5)';
9
+ const DEFAULT_FLOW_COLOR_SCHEME = [DEFAULT_FLOW_MIN_COLOR, '#137CBD'];
10
+ const DEFAULT_LOCATION_AREA_COLOR = 'rgba(220,220,220,0.5)';
11
+ const DEFAULT_FLOW_COLOR_SCHEME_POSITIVE = [DEFAULT_FLOW_MIN_COLOR, '#f6654e'];
12
+ const DEFAULT_FLOW_COLOR_SCHEME_NEGATIVE = [DEFAULT_FLOW_MIN_COLOR, '#00a9cc'];
13
+ const FALLBACK_COLOR_RGBA = [255, 255, 255, 255];
14
+ export function opacityFloatToInteger(opacity) {
15
+ return Math.round(opacity * 255);
16
+ }
17
+ export function opacifyHex(hexCode, opacity) {
18
+ const c = d3color(hexCode);
19
+ if (!c) {
20
+ console.warn('Invalid color: ', hexCode);
21
+ return `rgba(255, 255, 255, ${opacity})`;
22
+ }
23
+ const col = c.rgb();
24
+ return `rgba(${col.r}, ${col.g}, ${col.b}, ${opacity})`;
25
+ }
26
+ export function colorAsRgba(color) {
27
+ const col = d3color(color);
28
+ if (!col) {
29
+ console.warn('Invalid color: ', color);
30
+ return FALLBACK_COLOR_RGBA;
31
+ }
32
+ const rgbColor = col.rgb();
33
+ return [
34
+ Math.floor(rgbColor.r),
35
+ Math.floor(rgbColor.g),
36
+ Math.floor(rgbColor.b),
37
+ opacityFloatToInteger(col.opacity),
38
+ ];
39
+ }
40
+ function colorAsRgbaOr(color, defaultColor) {
41
+ if (color) {
42
+ return colorAsRgba(color);
43
+ }
44
+ if (typeof defaultColor === 'string') {
45
+ return colorAsRgba(defaultColor);
46
+ }
47
+ return defaultColor;
48
+ }
49
+ const asScheme = (scheme) => scheme[scheme.length - 1];
50
+ export var ColorScheme;
51
+ (function (ColorScheme) {
52
+ ColorScheme["primary"] = "#162d3c";
53
+ })(ColorScheme || (ColorScheme = {}));
54
+ const SCALE_NUM_STEPS = 20;
55
+ const getColorSteps = (interpolate) => range(0, SCALE_NUM_STEPS + 1)
56
+ .map((i) => interpolate(i / SCALE_NUM_STEPS))
57
+ .reverse();
58
+ const FLOW_MIN_COLOR = 'rgba(240,240,240,0.5)';
59
+ export const BLUES_PALE = [FLOW_MIN_COLOR, ColorScheme.primary];
60
+ const schemeBluYl = [
61
+ '#f7feae',
62
+ '#b7e6a5',
63
+ '#7ccba2',
64
+ '#46aea0',
65
+ '#089099',
66
+ '#00718b',
67
+ '#045275',
68
+ ];
69
+ const schemeEmrld = [
70
+ '#d3f2a3',
71
+ '#97e196',
72
+ '#6cc08b',
73
+ '#4c9b82',
74
+ '#217a79',
75
+ '#105965',
76
+ '#074050',
77
+ ];
78
+ export const schemeTeal = [
79
+ '#d1eeea',
80
+ '#a8dbd9',
81
+ '#85c4c9',
82
+ '#68abb8',
83
+ '#4f90a6',
84
+ '#3b738f',
85
+ '#2a5674',
86
+ ];
87
+ export const DEFAULT_COLOR_SCHEME = schemeTeal;
88
+ export const COLOR_SCHEMES = {
89
+ Blues: asScheme(schemeBlues),
90
+ BluesPale: BLUES_PALE,
91
+ BluGrn: [
92
+ '#c4e6c3',
93
+ '#96d2a4',
94
+ '#6dbc90',
95
+ '#4da284',
96
+ '#36877a',
97
+ '#266b6e',
98
+ '#1d4f60',
99
+ ],
100
+ BluYl: schemeBluYl,
101
+ BrwnYl: [
102
+ '#ede5cf',
103
+ '#e0c2a2',
104
+ '#d39c83',
105
+ '#c1766f',
106
+ '#a65461',
107
+ '#813753',
108
+ '#541f3f',
109
+ ],
110
+ BuGn: asScheme(schemeBuGn),
111
+ BuPu: asScheme(schemeBuPu),
112
+ Burg: [
113
+ '#ffc6c4',
114
+ '#f4a3a8',
115
+ '#e38191',
116
+ '#cc607d',
117
+ '#ad466c',
118
+ '#8b3058',
119
+ '#672044',
120
+ ],
121
+ BurgYl: [
122
+ '#fbe6c5',
123
+ '#f5ba98',
124
+ '#ee8a82',
125
+ '#dc7176',
126
+ '#c8586c',
127
+ '#9c3f5d',
128
+ '#70284a',
129
+ ],
130
+ Cool: getColorSteps(interpolateCool),
131
+ DarkMint: [
132
+ '#d2fbd4',
133
+ '#a5dbc2',
134
+ '#7bbcb0',
135
+ '#559c9e',
136
+ '#3a7c89',
137
+ '#235d72',
138
+ '#123f5a',
139
+ ],
140
+ Emrld: schemeEmrld,
141
+ GnBu: asScheme(schemeGnBu),
142
+ Greens: asScheme(schemeGreens),
143
+ Greys: asScheme(schemeGreys),
144
+ Inferno: getColorSteps(interpolateInferno),
145
+ Magenta: [
146
+ '#f3cbd3',
147
+ '#eaa9bd',
148
+ '#dd88ac',
149
+ '#ca699d',
150
+ '#b14d8e',
151
+ '#91357d',
152
+ '#6c2167',
153
+ ],
154
+ Magma: getColorSteps(interpolateMagma),
155
+ Mint: [
156
+ '#e4f1e1',
157
+ '#b4d9cc',
158
+ '#89c0b6',
159
+ '#63a6a0',
160
+ '#448c8a',
161
+ '#287274',
162
+ '#0d585f',
163
+ ],
164
+ Oranges: asScheme(schemeOranges),
165
+ OrRd: asScheme(schemeOrRd),
166
+ OrYel: [
167
+ '#ecda9a',
168
+ '#efc47e',
169
+ '#f3ad6a',
170
+ '#f7945d',
171
+ '#f97b57',
172
+ '#f66356',
173
+ '#ee4d5a',
174
+ ],
175
+ Peach: [
176
+ '#fde0c5',
177
+ '#facba6',
178
+ '#f8b58b',
179
+ '#f59e72',
180
+ '#f2855d',
181
+ '#ef6a4c',
182
+ '#eb4a40',
183
+ ],
184
+ Plasma: getColorSteps(interpolatePlasma),
185
+ PinkYl: [
186
+ '#fef6b5',
187
+ '#ffdd9a',
188
+ '#ffc285',
189
+ '#ffa679',
190
+ '#fa8a76',
191
+ '#f16d7a',
192
+ '#e15383',
193
+ ],
194
+ PuBu: asScheme(schemePuBu),
195
+ PuBuGn: asScheme(schemePuBuGn),
196
+ PuRd: asScheme(schemePuRd),
197
+ Purp: [
198
+ '#f3e0f7',
199
+ '#e4c7f1',
200
+ '#d1afe8',
201
+ '#b998dd',
202
+ '#9f82ce',
203
+ '#826dba',
204
+ '#63589f',
205
+ ],
206
+ Purples: asScheme(schemePurples),
207
+ PurpOr: [
208
+ '#f9ddda',
209
+ '#f2b9c4',
210
+ '#e597b9',
211
+ '#ce78b3',
212
+ '#ad5fad',
213
+ '#834ba0',
214
+ '#573b88',
215
+ ],
216
+ RdPu: asScheme(schemeRdPu),
217
+ RedOr: [
218
+ '#f6d2a9',
219
+ '#f5b78e',
220
+ '#f19c7c',
221
+ '#ea8171',
222
+ '#dd686c',
223
+ '#ca5268',
224
+ '#b13f64',
225
+ ],
226
+ Reds: asScheme(schemeReds),
227
+ Sunset: [
228
+ '#f3e79b',
229
+ '#fac484',
230
+ '#f8a07e',
231
+ '#eb7f86',
232
+ '#ce6693',
233
+ '#a059a0',
234
+ '#5c53a5',
235
+ ],
236
+ SunsetDark: [
237
+ '#fcde9c',
238
+ '#faa476',
239
+ '#f0746e',
240
+ '#e34f6f',
241
+ '#dc3977',
242
+ '#b9257a',
243
+ '#7c1d6f',
244
+ ],
245
+ Teal: schemeTeal,
246
+ TealGrn: [
247
+ '#b0f2bc',
248
+ '#89e8ac',
249
+ '#67dba5',
250
+ '#4cc8a3',
251
+ '#38b2a3',
252
+ '#2c98a0',
253
+ '#257d98',
254
+ ],
255
+ Viridis: getColorSteps(interpolateViridis),
256
+ Warm: getColorSteps(interpolateWarm),
257
+ YlGn: asScheme(schemeYlGn),
258
+ YlGnBu: asScheme(schemeYlGnBu),
259
+ YlOrBr: asScheme(schemeYlOrBr),
260
+ YlOrRd: asScheme(schemeYlOrRd),
261
+ };
262
+ export const COLOR_SCHEME_KEYS = Object.keys(COLOR_SCHEMES);
263
+ const complementary = '#f52020';
264
+ const baseDiffColor = '#17a5be';
265
+ const diffColors = {
266
+ negative: {
267
+ flows: {
268
+ scheme: [FLOW_MIN_COLOR, baseDiffColor],
269
+ },
270
+ },
271
+ positive: {
272
+ flows: {
273
+ scheme: [FLOW_MIN_COLOR, complementary],
274
+ },
275
+ },
276
+ locationAreas: {
277
+ outline: 'rgba(92,112,128,0.5)',
278
+ normal: 'rgba(220,220,220,0.5)',
279
+ },
280
+ outlineColor: 'rgb(230,233,237)',
281
+ };
282
+ export function getFlowMapColors(settingsState) {
283
+ return getColors(false, // TODO: diffMode
284
+ settingsState.colorScheme, settingsState.darkMode, settingsState.fadeEnabled, settingsState.fadeAmount, settingsState.animationEnabled);
285
+ }
286
+ export function getColors(diffMode, schemeKey, darkMode, fadeEnabled, fadeAmount, animate) {
287
+ if (diffMode) {
288
+ return diffColors;
289
+ }
290
+ let scheme = (schemeKey && COLOR_SCHEMES[schemeKey]) || DEFAULT_COLOR_SCHEME;
291
+ if (darkMode) {
292
+ scheme = scheme.slice().reverse();
293
+ }
294
+ // if (animate)
295
+ // if (fadeAmount > 0)
296
+ {
297
+ const indices = range(0, Math.max(10, scheme.length));
298
+ const N = indices.length - 1;
299
+ const colorScale = scaleSequential(interpolateRgbBasis(scheme)).domain([
300
+ 0,
301
+ N,
302
+ ]);
303
+ if (!fadeEnabled || fadeAmount === 0) {
304
+ scheme = indices.map((c, i) => colorScale(i));
305
+ }
306
+ else {
307
+ const amount = scalePow()
308
+ // .exponent(animate ? 1 : 1/2.5)
309
+ // .exponent(animate ? 100 : 50)
310
+ // .exponent(animate ? 20 : 5)
311
+ // .exponent(1/2.5)
312
+ .exponent(1.5)
313
+ .domain([N, 0])
314
+ // .range([fadeAmount/100*(animate?2:1), 0])
315
+ // .range([0, fadeAmount/100*(animate?2:1)])
316
+ // .range(darkMode ? [1-fadeAmount/100, 1] : [1, 1 - fadeAmount/100])
317
+ // .range(darkMode ? [1 - fadeAmount/100, 1] : [fadeAmount/100, 0])
318
+ // .range([1 - fadeAmount/100, 1])
319
+ .range([0, (2 * fadeAmount) / 100]);
320
+ scheme = indices.map((c, i) => {
321
+ const color = colorScale(i);
322
+ const alpha = amount(i);
323
+ if (color == null || alpha == null)
324
+ return '#000';
325
+ const col = hcl(color);
326
+ col.l = darkMode
327
+ ? col.l - col.l * alpha
328
+ : col.l + (100 - col.l) * alpha;
329
+ col.c = col.c - col.c * (alpha / 4);
330
+ return col.toString();
331
+ });
332
+ }
333
+ }
334
+ return {
335
+ darkMode,
336
+ flows: {
337
+ scheme,
338
+ },
339
+ locationCircles: {
340
+ outgoing: darkMode ? '#000' : '#fff',
341
+ },
342
+ outlineColor: darkMode ? '#000' : 'rgba(255, 255, 255, 0.5)',
343
+ };
344
+ }
345
+ export function createFlowColorScale(domain, scheme, animate) {
346
+ const scale = scaleSequentialPow(interpolateRgbBasis(scheme))
347
+ // @ts-ignore
348
+ .exponent(animate ? 1 / 2 : 1 / 3)
349
+ .domain(domain);
350
+ return (value) => colorAsRgba(scale(value));
351
+ }
352
+ export function getFlowColorScale(colors, magnitudeExtent, animate) {
353
+ const minMagnitude = magnitudeExtent ? magnitudeExtent[0] : 0;
354
+ const maxMagnitude = magnitudeExtent ? magnitudeExtent[1] : 0;
355
+ if (isDiffColorsRGBA(colors)) {
356
+ const posScale = createFlowColorScale([0, maxMagnitude], colors.positive.flows.scheme, animate);
357
+ const negScale = createFlowColorScale([0, minMagnitude], colors.negative.flows.scheme, animate);
358
+ return (magnitude) => magnitude >= 0 ? posScale(magnitude) : negScale(magnitude);
359
+ }
360
+ const scale = createFlowColorScale([0, maxMagnitude || 0], colors.flows.scheme, animate);
361
+ return (magnitude) => scale(magnitude);
362
+ }
363
+ export function isDiffColors(colors) {
364
+ return colors.positive !== undefined;
365
+ }
366
+ export function isDiffColorsRGBA(colors) {
367
+ return colors.positive !== undefined;
368
+ }
369
+ function getLocationAreaColorsRGBA(colors, darkMode) {
370
+ const normalColor = (colors && colors.normal) || DEFAULT_LOCATION_AREA_COLOR;
371
+ const normalColorHcl = hcl(normalColor);
372
+ const locationAreasNormal = colorAsRgba(normalColor);
373
+ return {
374
+ normal: locationAreasNormal,
375
+ connected: colorAsRgbaOr(colors && colors.connected, locationAreasNormal),
376
+ highlighted: colorAsRgbaOr(colors && colors.highlighted, opacifyHex(normalColorHcl[darkMode ? 'brighter' : 'darker'](1).toString(), 0.5)),
377
+ selected: colorAsRgbaOr(colors && colors.selected, opacifyHex(normalColorHcl[darkMode ? 'brighter' : 'darker'](2).toString(), 0.8)),
378
+ outline: colorAsRgbaOr(colors && colors.outline, colorAsRgba(normalColorHcl[darkMode ? 'brighter' : 'darker'](4).toString())),
379
+ };
380
+ }
381
+ function getFlowAndCircleColors(inputColors, defaultFlowColorScheme, darkMode) {
382
+ var _a;
383
+ const flowColorScheme = (inputColors && inputColors.flows && inputColors.flows.scheme) ||
384
+ defaultFlowColorScheme;
385
+ const maxFlowColorHcl = hcl(flowColorScheme[flowColorScheme.length - 1]);
386
+ const flowColorHighlighted = colorAsRgbaOr(inputColors && inputColors.flows && inputColors.flows.highlighted, colorAsRgba(maxFlowColorHcl[darkMode ? 'brighter' : 'darker'](0.7).toString()));
387
+ const emptyColor = colorAsRgbaOr((_a = inputColors === null || inputColors === void 0 ? void 0 : inputColors.locationCircles) === null || _a === void 0 ? void 0 : _a.empty, darkMode ? '#000' : '#fff');
388
+ const innerColor = colorAsRgbaOr(inputColors &&
389
+ inputColors.locationCircles &&
390
+ inputColors.locationCircles.inner, maxFlowColorHcl.toString());
391
+ return {
392
+ flows: {
393
+ scheme: flowColorScheme,
394
+ highlighted: flowColorHighlighted,
395
+ },
396
+ locationCircles: {
397
+ inner: innerColor,
398
+ outgoing: colorAsRgbaOr(inputColors &&
399
+ inputColors.locationCircles &&
400
+ inputColors.locationCircles.outgoing, darkMode ? '#000' : '#fff'),
401
+ incoming: colorAsRgbaOr(inputColors &&
402
+ inputColors.locationCircles &&
403
+ inputColors.locationCircles.incoming, maxFlowColorHcl[darkMode ? 'brighter' : 'darker'](1.25).toString()),
404
+ highlighted: colorAsRgbaOr(inputColors &&
405
+ inputColors.locationCircles &&
406
+ inputColors.locationCircles.highlighted, flowColorHighlighted),
407
+ empty: emptyColor,
408
+ emptyOutline: mixColorsRGBA(innerColor, emptyColor, 0.4),
409
+ },
410
+ };
411
+ }
412
+ function getBaseColorsRGBA(colors) {
413
+ const darkMode = colors && colors.darkMode ? true : false;
414
+ return {
415
+ darkMode,
416
+ locationAreas: getLocationAreaColorsRGBA(colors && colors.locationAreas, darkMode),
417
+ outlineColor: colorAsRgba((colors && colors.outlineColor) || DEFAULT_OUTLINE_COLOR),
418
+ dimmedOpacity: colors && colors.dimmedOpacity != null
419
+ ? colors.dimmedOpacity
420
+ : DEFAULT_DIMMED_OPACITY,
421
+ };
422
+ }
423
+ export function getColorsRGBA(colors) {
424
+ const baseColorsRGBA = getBaseColorsRGBA(colors);
425
+ return Object.assign(Object.assign({}, baseColorsRGBA), getFlowAndCircleColors(colors, DEFAULT_FLOW_COLOR_SCHEME, baseColorsRGBA.darkMode));
426
+ }
427
+ export function getDiffColorsRGBA(colors) {
428
+ const baseColorsRGBA = getBaseColorsRGBA(colors);
429
+ return Object.assign(Object.assign({}, baseColorsRGBA), { positive: getFlowAndCircleColors(colors && colors.positive, DEFAULT_FLOW_COLOR_SCHEME_POSITIVE, baseColorsRGBA.darkMode), negative: getFlowAndCircleColors(colors && colors.negative, DEFAULT_FLOW_COLOR_SCHEME_NEGATIVE, baseColorsRGBA.darkMode) });
430
+ }
431
+ export function rgbaAsString(color) {
432
+ return `rgba(${color.join(',')})`;
433
+ }
434
+ export function midpoint(a, b, zeroToOne) {
435
+ return a + (b - a) * zeroToOne;
436
+ }
437
+ export function mixColorsRGBA(color1, color2, zeroToOne) {
438
+ return color1.map((v, i) => midpoint(v, color2[i], zeroToOne));
439
+ }
440
+ export default getColors;
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsV0FBVyxFQUNYLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsYUFBYSxFQUNiLFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixhQUFhLEVBQ2IsVUFBVSxFQUNWLFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxLQUFLLElBQUksT0FBTyxFQUFFLEdBQUcsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUcvQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUNyQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLHVCQUF1QixDQUFDO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN0RSxNQUFNLDJCQUEyQixHQUFHLHVCQUF1QixDQUFDO0FBRTVELE1BQU0sa0NBQWtDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvRSxNQUFNLGtDQUFrQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFL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LEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFTLENBQUM7QUFDekUsQ0FBQztBQUVELGVBQWUsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgaW50ZXJwb2xhdGVDb29sLFxuICBpbnRlcnBvbGF0ZUluZmVybm8sXG4gIGludGVycG9sYXRlTWFnbWEsXG4gIGludGVycG9sYXRlUGxhc21hLFxuICBpbnRlcnBvbGF0ZVZpcmlkaXMsXG4gIGludGVycG9sYXRlV2FybSxcbiAgc2NoZW1lQmx1ZXMsXG4gIHNjaGVtZUJ1R24sXG4gIHNjaGVtZUJ1UHUsXG4gIHNjaGVtZUduQnUsXG4gIHNjaGVtZUdyZWVucyxcbiAgc2NoZW1lR3JleXMsXG4gIHNjaGVtZU9yYW5nZXMsXG4gIHNjaGVtZU9yUmQsXG4gIHNjaGVtZVB1QnUsXG4gIHNjaGVtZVB1QnVHbixcbiAgc2NoZW1lUHVSZCxcbiAgc2NoZW1lUHVycGxlcyxcbiAgc2NoZW1lUmRQdSxcbiAgc2NoZW1lUmVkcyxcbiAgc2NoZW1lWWxHbixcbiAgc2NoZW1lWWxHbkJ1LFxuICBzY2hlbWVZbE9yQnIsXG4gIHNjaGVtZVlsT3JSZCxcbn0gZnJvbSAnZDMtc2NhbGUtY2hyb21hdGljJztcbmltcG9ydCB7cmFuZ2V9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7c2NhbGVQb3csIHNjYWxlU2VxdWVudGlhbCwgc2NhbGVTZXF1ZW50aWFsUG93fSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQge2ludGVycG9sYXRlUmdiQmFzaXN9IGZyb20gJ2QzLWludGVycG9sYXRlJztcbmltcG9ydCB7Y29sb3IgYXMgZDNjb2xvciwgaGNsfSBmcm9tICdkMy1jb2xvcic7XG5pbXBvcnQge1NldHRpbmdzU3RhdGV9IGZyb20gJy4vRmxvd01hcFN0YXRlJztcblxuY29uc3QgREVGQVVMVF9PVVRMSU5FX0NPTE9SID0gJyNmZmYnO1xuY29uc3QgREVGQVVMVF9ESU1NRURfT1BBQ0lUWSA9IDAuNDtcbmNvbnN0IERFRkFVTFRfRkxPV19NSU5fQ09MT1IgPSAncmdiYSgyNDAsMjQwLDI0MCwwLjUpJztcbmNvbnN0IERFRkFVTFRfRkxPV19DT0xPUl9TQ0hFTUUgPSBbREVGQVVMVF9GTE9XX01JTl9DT0xPUiwgJyMxMzdDQkQnXTtcbmNvbnN0IERFRkFVTFRfTE9DQVRJT05fQVJFQV9DT0xPUiA9ICdyZ2JhKDIyMCwyMjAsMjIwLDAuNSknO1xuXG5jb25zdCBERUZBVUxUX0ZMT1dfQ09MT1JfU0NIRU1FX1BPU0lUSVZFID0gW0RFRkFVTFRfRkxPV19NSU5fQ09MT1IsICcjZjY2NTRlJ107XG5jb25zdCBERUZBVUxUX0ZMT1dfQ09MT1JfU0NIRU1FX05FR0FUSVZFID0gW0RFRkFVTFRfRkxPV19NSU5fQ09MT1IsICcjMDBhOWNjJ107XG5cbmV4cG9ydCB0eXBlIENvbG9yU2NhbGUgPSAodmFsdWU6IG51bWJlcikgPT4gUkdCQTtcbmV4cG9ydCB0eXBlIFJHQkEgPSBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuY29uc3QgRkFMTEJBQ0tfQ09MT1JfUkdCQTogUkdCQSA9IFsyNTUsIDI1NSwgMjU1LCAyNTVdO1xuXG5leHBvcnQgZnVuY3Rpb24gb3BhY2l0eUZsb2F0VG9JbnRlZ2VyKG9wYWNpdHk6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKG9wYWNpdHkgKiAyNTUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3BhY2lmeUhleChoZXhDb2RlOiBzdHJpbmcsIG9wYWNpdHk6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGMgPSBkM2NvbG9yKGhleENvZGUpO1xuICBpZiAoIWMpIHtcbiAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgY29sb3I6ICcsIGhleENvZGUpO1xuICAgIHJldHVybiBgcmdiYSgyNTUsIDI1NSwgMjU1LCAke29wYWNpdHl9KWA7XG4gIH1cbiAgY29uc3QgY29sID0gYy5yZ2IoKTtcbiAgcmV0dXJuIGByZ2JhKCR7Y29sLnJ9LCAke2NvbC5nfSwgJHtjb2wuYn0sICR7b3BhY2l0eX0pYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yQXNSZ2JhKGNvbG9yOiBzdHJpbmcpOiBSR0JBIHtcbiAgY29uc3QgY29sID0gZDNjb2xvcihjb2xvcik7XG4gIGlmICghY29sKSB7XG4gICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGNvbG9yOiAnLCBjb2xvcik7XG4gICAgcmV0dXJuIEZBTExCQUNLX0NPTE9SX1JHQkE7XG4gIH1cbiAgY29uc3QgcmdiQ29sb3IgPSBjb2wucmdiKCk7XG4gIHJldHVybiBbXG4gICAgTWF0aC5mbG9vcihyZ2JDb2xvci5yKSxcbiAgICBNYXRoLmZsb29yKHJnYkNvbG9yLmcpLFxuICAgIE1hdGguZmxvb3IocmdiQ29sb3IuYiksXG4gICAgb3BhY2l0eUZsb2F0VG9JbnRlZ2VyKGNvbC5vcGFjaXR5KSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gY29sb3JBc1JnYmFPcihcbiAgY29sb3I6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGVmYXVsdENvbG9yOiBSR0JBIHwgc3RyaW5nLFxuKTogUkdCQSB7XG4gIGlmIChjb2xvcikge1xuICAgIHJldHVybiBjb2xvckFzUmdiYShjb2xvcik7XG4gIH1cbiAgaWYgKHR5cGVvZiBkZWZhdWx0Q29sb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNvbG9yQXNSZ2JhKGRlZmF1bHRDb2xvcik7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRDb2xvcjtcbn1cblxuY29uc3QgYXNTY2hlbWUgPSAoc2NoZW1lOiBSZWFkb25seUFycmF5PFJlYWRvbmx5QXJyYXk8c3RyaW5nPj4pID0+XG4gIHNjaGVtZVtzY2hlbWUubGVuZ3RoIC0gMV0gYXMgc3RyaW5nW107XG5cbmV4cG9ydCBlbnVtIENvbG9yU2NoZW1lIHtcbiAgcHJpbWFyeSA9ICcjMTYyZDNjJyxcbn1cblxuY29uc3QgU0NBTEVfTlVNX1NURVBTID0gMjA7XG5jb25zdCBnZXRDb2xvclN0ZXBzID0gKGludGVycG9sYXRlOiAoeDogbnVtYmVyKSA9PiBzdHJpbmcpID0+XG4gIHJhbmdlKDAsIFNDQUxFX05VTV9TVEVQUyArIDEpXG4gICAgLm1hcCgoaSkgPT4gaW50ZXJwb2xhdGUoaSAvIFNDQUxFX05VTV9TVEVQUykpXG4gICAgLnJldmVyc2UoKTtcblxuY29uc3QgRkxPV19NSU5fQ09MT1IgPSAncmdiYSgyNDAsMjQwLDI0MCwwLjUpJztcbmV4cG9ydCBjb25zdCBCTFVFU19QQUxFID0gW0ZMT1dfTUlOX0NPTE9SLCBDb2xvclNjaGVtZS5wcmltYXJ5XTtcbmNvbnN0IHNjaGVtZUJsdVlsID0gW1xuICAnI2Y3ZmVhZScsXG4gICcjYjdlNmE1JyxcbiAgJyM3Y2NiYTInLFxuICAnIzQ2YWVhMCcsXG4gICcjMDg5MDk5JyxcbiAgJyMwMDcxOGInLFxuICAnIzA0NTI3NScsXG5dO1xuXG5jb25zdCBzY2hlbWVFbXJsZCA9IFtcbiAgJyNkM2YyYTMnLFxuICAnIzk3ZTE5NicsXG4gICcjNmNjMDhiJyxcbiAgJyM0YzliODInLFxuICAnIzIxN2E3OScsXG4gICcjMTA1OTY1JyxcbiAgJyMwNzQwNTAnLFxuXTtcblxuZXhwb3J0IGNvbnN0IHNjaGVtZVRlYWwgPSBbXG4gICcjZDFlZWVhJyxcbiAgJyNhOGRiZDknLFxuICAnIzg1YzRjOScsXG4gICcjNjhhYmI4JyxcbiAgJyM0ZjkwYTYnLFxuICAnIzNiNzM4ZicsXG4gICcjMmE1Njc0Jyxcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTE9SX1NDSEVNRSA9IHNjaGVtZVRlYWw7XG5leHBvcnQgY29uc3QgQ09MT1JfU0NIRU1FUzoge1trZXk6IHN0cmluZ106IHN0cmluZ1tdfSA9IHtcbiAgQmx1ZXM6IGFzU2NoZW1lKHNjaGVtZUJsdWVzKSxcbiAgQmx1ZXNQYWxlOiBCTFVFU19QQUxFLFxuICBCbHVHcm46IFtcbiAgICAnI2M0ZTZjMycsXG4gICAgJyM5NmQyYTQnLFxuICAgICcjNmRiYzkwJyxcbiAgICAnIzRkYTI4NCcsXG4gICAgJyMzNjg3N2EnLFxuICAgICcjMjY2YjZlJyxcbiAgICAnIzFkNGY2MCcsXG4gIF0sXG4gIEJsdVlsOiBzY2hlbWVCbHVZbCxcbiAgQnJ3bllsOiBbXG4gICAgJyNlZGU1Y2YnLFxuICAgICcjZTBjMmEyJyxcbiAgICAnI2QzOWM4MycsXG4gICAgJyNjMTc2NmYnLFxuICAgICcjYTY1NDYxJyxcbiAgICAnIzgxMzc1MycsXG4gICAgJyM1NDFmM2YnLFxuICBdLFxuICBCdUduOiBhc1NjaGVtZShzY2hlbWVCdUduKSxcbiAgQnVQdTogYXNTY2hlbWUoc2NoZW1lQnVQdSksXG4gIEJ1cmc6IFtcbiAgICAnI2ZmYzZjNCcsXG4gICAgJyNmNGEzYTgnLFxuICAgICcjZTM4MTkxJyxcbiAgICAnI2NjNjA3ZCcsXG4gICAgJyNhZDQ2NmMnLFxuICAgICcjOGIzMDU4JyxcbiAgICAnIzY3MjA0NCcsXG4gIF0sXG4gIEJ1cmdZbDogW1xuICAgICcjZmJlNmM1JyxcbiAgICAnI2Y1YmE5OCcsXG4gICAgJyNlZThhODInLFxuICAgICcjZGM3MTc2JyxcbiAgICAnI2M4NTg2YycsXG4gICAgJyM5YzNmNWQnLFxuICAgICcjNzAyODRhJyxcbiAgXSxcbiAgQ29vbDogZ2V0Q29sb3JTdGVwcyhpbnRlcnBvbGF0ZUNvb2wpLFxuICBEYXJrTWludDogW1xuICAgICcjZDJmYmQ0JyxcbiAgICAnI2E1ZGJjMicsXG4gICAgJyM3YmJjYjAnLFxuICAgICcjNTU5YzllJyxcbiAgICAnIzNhN2M4OScsXG4gICAgJyMyMzVkNzInLFxuICAgICcjMTIzZjVhJyxcbiAgXSxcbiAgRW1ybGQ6IHNjaGVtZUVtcmxkLFxuICBHbkJ1OiBhc1NjaGVtZShzY2hlbWVHbkJ1KSxcbiAgR3JlZW5zOiBhc1NjaGVtZShzY2hlbWVHcmVlbnMpLFxuICBHcmV5czogYXNTY2hlbWUoc2NoZW1lR3JleXMpLFxuICBJbmZlcm5vOiBnZXRDb2xvclN0ZXBzKGludGVycG9sYXRlSW5mZXJubyksXG4gIE1hZ2VudGE6IFtcbiAgICAnI2YzY2JkMycsXG4gICAgJyNlYWE5YmQnLFxuICAgICcjZGQ4OGFjJyxcbiAgICAnI2NhNjk5ZCcsXG4gICAgJyNiMTRkOGUnLFxuICAgICcjOTEzNTdkJyxcbiAgICAnIzZjMjE2NycsXG4gIF0sXG4gIE1hZ21hOiBnZXRDb2xvclN0ZXBzKGludGVycG9sYXRlTWFnbWEpLFxuICBNaW50OiBbXG4gICAgJyNlNGYxZTEnLFxuICAgICcjYjRkOWNjJyxcbiAgICAnIzg5YzBiNicsXG4gICAgJyM2M2E2YTAnLFxuICAgICcjNDQ4YzhhJyxcbiAgICAnIzI4NzI3NCcsXG4gICAgJyMwZDU4NWYnLFxuICBdLFxuICBPcmFuZ2VzOiBhc1NjaGVtZShzY2hlbWVPcmFuZ2VzKSxcbiAgT3JSZDogYXNTY2hlbWUoc2NoZW1lT3JSZCksXG4gIE9yWWVsOiBbXG4gICAgJyNlY2RhOWEnLFxuICAgICcjZWZjNDdlJyxcbiAgICAnI2YzYWQ2YScsXG4gICAgJyNmNzk0NWQnLFxuICAgICcjZjk3YjU3JyxcbiAgICAnI2Y2NjM1NicsXG4gICAgJyNlZTRkNWEnLFxuICBdLFxuICBQZWFjaDogW1xuICAgICcjZmRlMGM1JyxcbiAgICAnI2ZhY2JhNicsXG4gICAgJyNmOGI1OGInLFxuICAgICcjZjU5ZTcyJyxcbiAgICAnI2YyODU1ZCcsXG4gICAgJyNlZjZhNGMnLFxuICAgICcjZWI0YTQwJyxcbiAgXSxcbiAgUGxhc21hOiBnZXRDb2xvclN0ZXBzKGludGVycG9sYXRlUGxhc21hKSxcbiAgUGlua1lsOiBbXG4gICAgJyNmZWY2YjUnLFxuICAgICcjZmZkZDlhJyxcbiAgICAnI2ZmYzI4NScsXG4gICAgJyNmZmE2NzknLFxuICAgICcjZmE4YTc2JyxcbiAgICAnI2YxNmQ3YScsXG4gICAgJyNlMTUzODMnLFxuICBdLFxuICBQdUJ1OiBhc1NjaGVtZShzY2hlbWVQdUJ1KSxcbiAgUHVCdUduOiBhc1NjaGVtZShzY2hlbWVQdUJ1R24pLFxuICBQdVJkOiBhc1NjaGVtZShzY2hlbWVQdVJkKSxcbiAgUHVycDogW1xuICAgICcjZjNlMGY3JyxcbiAgICAnI2U0YzdmMScsXG4gICAgJyNkMWFmZTgnLFxuICAgICcjYjk5OGRkJyxcbiAgICAnIzlmODJjZScsXG4gICAgJyM4MjZkYmEnLFxuICAgICcjNjM1ODlmJyxcbiAgXSxcbiAgUHVycGxlczogYXNTY2hlbWUoc2NoZW1lUHVycGxlcyksXG4gIFB1cnBPcjogW1xuICAgICcjZjlkZGRhJyxcbiAgICAnI2YyYjljNCcsXG4gICAgJyNlNTk3YjknLFxuICAgICcjY2U3OGIzJyxcbiAgICAnI2FkNWZhZCcsXG4gICAgJyM4MzRiYTAnLFxuICAgICcjNTczYjg4JyxcbiAgXSxcbiAgUmRQdTogYXNTY2hlbWUoc2NoZW1lUmRQdSksXG4gIFJlZE9yOiBbXG4gICAgJyNmNmQyYTknLFxuICAgICcjZjViNzhlJyxcbiAgICAnI2YxOWM3YycsXG4gICAgJyNlYTgxNzEnLFxuICAgICcjZGQ2ODZjJyxcbiAgICAnI2NhNTI2OCcsXG4gICAgJyNiMTNmNjQnLFxuICBdLFxuICBSZWRzOiBhc1NjaGVtZShzY2hlbWVSZWRzKSxcbiAgU3Vuc2V0OiBbXG4gICAgJyNmM2U3OWInLFxuICAgICcjZmFjNDg0JyxcbiAgICAnI2Y4YTA3ZScsXG4gICAgJyNlYjdmODYnLFxuICAgICcjY2U2NjkzJyxcbiAgICAnI2EwNTlhMCcsXG4gICAgJyM1YzUzYTUnLFxuICBdLFxuICBTdW5zZXREYXJrOiBbXG4gICAgJyNmY2RlOWMnLFxuICAgICcjZmFhNDc2JyxcbiAgICAnI2YwNzQ2ZScsXG4gICAgJyNlMzRmNmYnLFxuICAgICcjZGMzOTc3JyxcbiAgICAnI2I5MjU3YScsXG4gICAgJyM3YzFkNmYnLFxuICBdLFxuICBUZWFsOiBzY2hlbWVUZWFsLFxuICBUZWFsR3JuOiBbXG4gICAgJyNiMGYyYmMnLFxuICAgICcjODllOGFjJyxcbiAgICAnIzY3ZGJhNScsXG4gICAgJyM0Y2M4YTMnLFxuICAgICcjMzhiMmEzJyxcbiAgICAnIzJjOThhMCcsXG4gICAgJyMyNTdkOTgnLFxuICBdLFxuICBWaXJpZGlzOiBnZXRDb2xvclN0ZXBzKGludGVycG9sYXRlVmlyaWRpcyksXG4gIFdhcm06IGdldENvbG9yU3RlcHMoaW50ZXJwb2xhdGVXYXJtKSxcbiAgWWxHbjogYXNTY2hlbWUoc2NoZW1lWWxHbiksXG4gIFlsR25CdTogYXNTY2hlbWUoc2NoZW1lWWxHbkJ1KSxcbiAgWWxPckJyOiBhc1NjaGVtZShzY2hlbWVZbE9yQnIpLFxuICBZbE9yUmQ6IGFzU2NoZW1lKHNjaGVtZVlsT3JSZCksXG59O1xuXG5leHBvcnQgY29uc3QgQ09MT1JfU0NIRU1FX0tFWVMgPSBPYmplY3Qua2V5cyhDT0xPUl9TQ0hFTUVTKTtcblxuY29uc3QgY29tcGxlbWVudGFyeSA9ICcjZjUyMDIwJztcbmNvbnN0IGJhc2VEaWZmQ29sb3IgPSAnIzE3YTViZSc7XG5cbmNvbnN0IGRpZmZDb2xvcnM6IERpZmZDb2xvcnMgPSB7XG4gIG5lZ2F0aXZlOiB7XG4gICAgZmxvd3M6IHtcbiAgICAgIHNjaGVtZTogW0ZMT1dfTUlOX0NPTE9SLCBiYXNlRGlmZkNvbG9yXSxcbiAgICB9LFxuICB9LFxuICBwb3NpdGl2ZToge1xuICAgIGZsb3dzOiB7XG4gICAgICBzY2hlbWU6IFtGTE9XX01JTl9DT0xPUiwgY29tcGxlbWVudGFyeV0sXG4gICAgfSxcbiAgfSxcbiAgbG9jYXRpb25BcmVhczoge1xuICAgIG91dGxpbmU6ICdyZ2JhKDkyLDExMiwxMjgsMC41KScsXG4gICAgbm9ybWFsOiAncmdiYSgyMjAsMjIwLDIyMCwwLjUpJyxcbiAgfSxcbiAgb3V0bGluZUNvbG9yOiAncmdiKDIzMCwyMzMsMjM3KScsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmxvd01hcENvbG9ycyhcbiAgc2V0dGluZ3NTdGF0ZTogU2V0dGluZ3NTdGF0ZSxcbik6IENvbG9ycyB8IERpZmZDb2xvcnMge1xuICByZXR1cm4gZ2V0Q29sb3JzKFxuICAgIGZhbHNlLCAvLyBUT0RPOiBkaWZmTW9kZVxuICAgIHNldHRpbmdzU3RhdGUuY29sb3JTY2hlbWUsXG4gICAgc2V0dGluZ3NTdGF0ZS5kYXJrTW9kZSxcbiAgICBzZXR0aW5nc1N0YXRlLmZhZGVFbmFibGVkLFxuICAgIHNldHRpbmdzU3RhdGUuZmFkZUFtb3VudCxcbiAgICBzZXR0aW5nc1N0YXRlLmFuaW1hdGlvbkVuYWJsZWQsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xvcnMoXG4gIGRpZmZNb2RlOiBib29sZWFuLFxuICBzY2hlbWVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGFya01vZGU6IGJvb2xlYW4sXG4gIGZhZGVFbmFibGVkOiBib29sZWFuLFxuICBmYWRlQW1vdW50OiBudW1iZXIsXG4gIGFuaW1hdGU6IGJvb2xlYW4sXG4pOiBDb2xvcnMgfCBEaWZmQ29sb3JzIHtcbiAgaWYgKGRpZmZNb2RlKSB7XG4gICAgcmV0dXJuIGRpZmZDb2xvcnM7XG4gIH1cblxuICBsZXQgc2NoZW1lID0gKHNjaGVtZUtleSAmJiBDT0xPUl9TQ0hFTUVTW3NjaGVtZUtleV0pIHx8IERFRkFVTFRfQ09MT1JfU0NIRU1FO1xuXG4gIGlmIChkYXJrTW9kZSkge1xuICAgIHNjaGVtZSA9IHNjaGVtZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgfVxuICAvLyBpZiAoYW5pbWF0ZSlcbiAgLy8gaWYgKGZhZGVBbW91bnQgPiAwKVxuICB7XG4gICAgY29uc3QgaW5kaWNlcyA9IHJhbmdlKDAsIE1hdGgubWF4KDEwLCBzY2hlbWUubGVuZ3RoKSk7XG4gICAgY29uc3QgTiA9IGluZGljZXMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBjb2xvclNjYWxlID0gc2NhbGVTZXF1ZW50aWFsKGludGVycG9sYXRlUmdiQmFzaXMoc2NoZW1lKSkuZG9tYWluKFtcbiAgICAgIDAsXG4gICAgICBOLFxuICAgIF0pO1xuXG4gICAgaWYgKCFmYWRlRW5hYmxlZCB8fCBmYWRlQW1vdW50ID09PSAwKSB7XG4gICAgICBzY2hlbWUgPSBpbmRpY2VzLm1hcCgoYywgaSkgPT4gY29sb3JTY2FsZShpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9IHNjYWxlUG93KClcbiAgICAgICAgLy8gLmV4cG9uZW50KGFuaW1hdGUgPyAxIDogMS8yLjUpXG4gICAgICAgIC8vIC5leHBvbmVudChhbmltYXRlID8gMTAwIDogNTApXG4gICAgICAgIC8vIC5leHBvbmVudChhbmltYXRlID8gMjAgOiA1KVxuICAgICAgICAvLyAuZXhwb25lbnQoMS8yLjUpXG4gICAgICAgIC5leHBvbmVudCgxLjUpXG4gICAgICAgIC5kb21haW4oW04sIDBdKVxuICAgICAgICAvLyAucmFuZ2UoW2ZhZGVBbW91bnQvMTAwKihhbmltYXRlPzI6MSksIDBdKVxuICAgICAgICAvLyAucmFuZ2UoWzAsIGZhZGVBbW91bnQvMTAwKihhbmltYXRlPzI6MSldKVxuICAgICAgICAvLyAucmFuZ2UoZGFya01vZGUgPyBbMS1mYWRlQW1vdW50LzEwMCwgMV0gOiBbMSwgMSAtIGZhZGVBbW91bnQvMTAwXSlcbiAgICAgICAgLy8gLnJhbmdlKGRhcmtNb2RlID8gWzEgLSBmYWRlQW1vdW50LzEwMCwgMV0gOiBbZmFkZUFtb3VudC8xMDAsIDBdKVxuICAgICAgICAvLyAucmFuZ2UoWzEgLSBmYWRlQW1vdW50LzEwMCwgMV0pXG4gICAgICAgIC5yYW5nZShbMCwgKDIgKiBmYWRlQW1vdW50KSAvIDEwMF0pO1xuXG4gICAgICBzY2hlbWUgPSBpbmRpY2VzLm1hcChcbiAgICAgICAgKGMsIGkpID0+IHtcbiAgICAgICAgICBjb25zdCBjb2xvciA9IGNvbG9yU2NhbGUoaSk7XG4gICAgICAgICAgY29uc3QgYWxwaGEgPSBhbW91bnQoaSk7XG4gICAgICAgICAgaWYgKGNvbG9yID09IG51bGwgfHwgYWxwaGEgPT0gbnVsbCkgcmV0dXJuICcjMDAwJztcbiAgICAgICAgICBjb25zdCBjb2wgPSBoY2woY29sb3IpO1xuICAgICAgICAgIGNvbC5sID0gZGFya01vZGVcbiAgICAgICAgICAgID8gY29sLmwgLSBjb2wubCAqIGFscGhhXG4gICAgICAgICAgICA6IGNvbC5sICsgKDEwMCAtIGNvbC5sKSAqIGFscGhhO1xuICAgICAgICAgIGNvbC5jID0gY29sLmMgLSBjb2wuYyAqIChhbHBoYSAvIDQpO1xuICAgICAgICAgIHJldHVybiBjb2wudG9TdHJpbmcoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gaW50ZXJwb2xhdGVSZ2JCYXNpcyhbY29sb3JTY2FsZShpKSwgZGFya01vZGUgPyAnIzAwMCcgOiAnI2ZmZiddKShhbW91bnQoaSkpXG4gICAgICAgIC8vIGludGVycG9sYXRlSHNsKGNvbG9yU2NhbGUoaSksIGRhcmtNb2RlID8gJyMwMDAnIDogJyNmZmYnKShhbW91bnQoaSkpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkYXJrTW9kZSxcbiAgICBmbG93czoge1xuICAgICAgc2NoZW1lLFxuICAgIH0sXG4gICAgbG9jYXRpb25DaXJjbGVzOiB7XG4gICAgICBvdXRnb2luZzogZGFya01vZGUgPyAnIzAwMCcgOiAnI2ZmZicsXG4gICAgfSxcbiAgICBvdXRsaW5lQ29sb3I6IGRhcmtNb2RlID8gJyMwMDAnIDogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC41KScsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG93Q29sb3JTY2FsZShcbiAgZG9tYWluOiBbbnVtYmVyLCBudW1iZXJdLFxuICBzY2hlbWU6IHN0cmluZ1tdLFxuICBhbmltYXRlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogQ29sb3JTY2FsZSB7XG4gIGNvbnN0IHNjYWxlID0gc2NhbGVTZXF1ZW50aWFsUG93KGludGVycG9sYXRlUmdiQmFzaXMoc2NoZW1lKSlcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgLmV4cG9uZW50KGFuaW1hdGUgPyAxIC8gMiA6IDEgLyAzKVxuICAgIC5kb21haW4oZG9tYWluKTtcbiAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiBjb2xvckFzUmdiYShzY2FsZSh2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmxvd0NvbG9yU2NhbGUoXG4gIGNvbG9yczogQ29sb3JzUkdCQSB8IERpZmZDb2xvcnNSR0JBLFxuICBtYWduaXR1ZGVFeHRlbnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsXG4gIGFuaW1hdGU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4pOiAobWFnbml0dWRlOiBudW1iZXIpID0+IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgbWluTWFnbml0dWRlID0gbWFnbml0dWRlRXh0ZW50ID8gbWFnbml0dWRlRXh0ZW50WzBdIDogMDtcbiAgY29uc3QgbWF4TWFnbml0dWRlID0gbWFnbml0dWRlRXh0ZW50ID8gbWFnbml0dWRlRXh0ZW50WzFdIDogMDtcbiAgaWYgKGlzRGlmZkNvbG9yc1JHQkEoY29sb3JzKSkge1xuICAgIGNvbnN0IHBvc1NjYWxlID0gY3JlYXRlRmxvd0NvbG9yU2NhbGUoXG4gICAgICBbMCwgbWF4TWFnbml0dWRlXSxcbiAgICAgIGNvbG9ycy5wb3NpdGl2ZS5mbG93cy5zY2hlbWUsXG4gICAgICBhbmltYXRlLFxuICAgICk7XG4gICAgY29uc3QgbmVnU2NhbGUgPSBjcmVhdGVGbG93Q29sb3JTY2FsZShcbiAgICAgIFswLCBtaW5NYWduaXR1ZGVdLFxuICAgICAgY29sb3JzLm5lZ2F0aXZlLmZsb3dzLnNjaGVtZSxcbiAgICAgIGFuaW1hdGUsXG4gICAgKTtcblxuICAgIHJldHVybiAobWFnbml0dWRlOiBudW1iZXIpID0+XG4gICAgICBtYWduaXR1ZGUgPj0gMCA/IHBvc1NjYWxlKG1hZ25pdHVkZSkgOiBuZWdTY2FsZShtYWduaXR1ZGUpO1xuICB9XG5cbiAgY29uc3Qgc2NhbGUgPSBjcmVhdGVGbG93Q29sb3JTY2FsZShcbiAgICBbMCwgbWF4TWFnbml0dWRlIHx8IDBdLFxuICAgIGNvbG9ycy5mbG93cy5zY2hlbWUsXG4gICAgYW5pbWF0ZSxcbiAgKTtcbiAgcmV0dXJuIChtYWduaXR1ZGU6IG51bWJlcikgPT4gc2NhbGUobWFnbml0dWRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlmZkNvbG9ycyhcbiAgY29sb3JzOiBEaWZmQ29sb3JzIHwgQ29sb3JzLFxuKTogY29sb3JzIGlzIERpZmZDb2xvcnMge1xuICByZXR1cm4gKGNvbG9ycyBhcyBEaWZmQ29sb3JzKS5wb3NpdGl2ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEaWZmQ29sb3JzUkdCQShcbiAgY29sb3JzOiBEaWZmQ29sb3JzUkdCQSB8IENvbG9yc1JHQkEsXG4pOiBjb2xvcnMgaXMgRGlmZkNvbG9yc1JHQkEge1xuICByZXR1cm4gKGNvbG9ycyBhcyBEaWZmQ29sb3JzUkdCQSkucG9zaXRpdmUgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0TG9jYXRpb25BcmVhQ29sb3JzUkdCQShcbiAgY29sb3JzOiBMb2NhdGlvbkFyZWFDb2xvcnMgfCB1bmRlZmluZWQsXG4gIGRhcmtNb2RlOiBib29sZWFuLFxuKTogTG9jYXRpb25BcmVhQ29sb3JzUkdCQSB7XG4gIGNvbnN0IG5vcm1hbENvbG9yID0gKGNvbG9ycyAmJiBjb2xvcnMubm9ybWFsKSB8fCBERUZBVUxUX0xPQ0FUSU9OX0FSRUFfQ09MT1I7XG4gIGNvbnN0IG5vcm1hbENvbG9ySGNsID0gaGNsKG5vcm1hbENvbG9yKTtcbiAgY29uc3QgbG9jYXRpb25BcmVhc05vcm1hbCA9IGNvbG9yQXNSZ2JhKG5vcm1hbENvbG9yKTtcbiAgcmV0dXJuIHtcbiAgICBub3JtYWw6IGxvY2F0aW9uQXJlYXNOb3JtYWwsXG4gICAgY29ubmVjdGVkOiBjb2xvckFzUmdiYU9yKGNvbG9ycyAmJiBjb2xvcnMuY29ubmVjdGVkLCBsb2NhdGlvbkFyZWFzTm9ybWFsKSxcbiAgICBoaWdobGlnaHRlZDogY29sb3JBc1JnYmFPcihcbiAgICAgIGNvbG9ycyAmJiBjb2xvcnMuaGlnaGxpZ2h0ZWQsXG4gICAgICBvcGFjaWZ5SGV4KFxuICAgICAgICBub3JtYWxDb2xvckhjbFtkYXJrTW9kZSA/ICdicmlnaHRlcicgOiAnZGFya2VyJ10oMSkudG9TdHJpbmcoKSxcbiAgICAgICAgMC41LFxuICAgICAgKSxcbiAgICApLFxuICAgIHNlbGVjdGVkOiBjb2xvckFzUmdiYU9yKFxuICAgICAgY29sb3JzICYmIGNvbG9ycy5zZWxlY3RlZCxcbiAgICAgIG9wYWNpZnlIZXgoXG4gICAgICAgIG5vcm1hbENvbG9ySGNsW2RhcmtNb2RlID8gJ2JyaWdodGVyJyA6ICdkYXJrZXInXSgyKS50b1N0cmluZygpLFxuICAgICAgICAwLjgsXG4gICAgICApLFxuICAgICksXG4gICAgb3V0bGluZTogY29sb3JBc1JnYmFPcihcbiAgICAgIGNvbG9ycyAmJiBjb2xvcnMub3V0bGluZSxcbiAgICAgIGNvbG9yQXNSZ2JhKFxuICAgICAgICBub3JtYWxDb2xvckhjbFtkYXJrTW9kZSA/ICdicmlnaHRlcicgOiAnZGFya2VyJ10oNCkudG9TdHJpbmcoKSxcbiAgICAgICksXG4gICAgKSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbG93Q29sb3JzIHtcbiAgc2NoZW1lPzogc3RyaW5nW107XG4gIGhpZ2hsaWdodGVkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uQ2lyY2xlQ29sb3JzIHtcbiAgaW5uZXI/OiBzdHJpbmc7XG4gIG91dGdvaW5nPzogc3RyaW5nO1xuICBpbmNvbWluZz86IHN0cmluZztcbiAgaGlnaGxpZ2h0ZWQ/OiBzdHJpbmc7XG4gIGVtcHR5Pzogc3RyaW5nO1xuICBlbXB0eU91dGxpbmU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb25BcmVhQ29sb3JzIHtcbiAgb3V0bGluZT86IHN0cmluZztcbiAgbm9ybWFsPzogc3RyaW5nO1xuICBzZWxlY3RlZD86IHN0cmluZztcbiAgaGlnaGxpZ2h0ZWQ/OiBzdHJpbmc7XG4gIGNvbm5lY3RlZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ29sb3JzIHtcbiAgZGFya01vZGU/OiBib29sZWFuO1xuICBsb2NhdGlvbkFyZWFzPzogTG9jYXRpb25BcmVhQ29sb3JzO1xuICBkaW1tZWRPcGFjaXR5PzogbnVtYmVyO1xuICBvdXRsaW5lQ29sb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JzIGV4dGVuZHMgQmFzZUNvbG9ycyB7XG4gIGZsb3dzPzogRmxvd0NvbG9ycztcbiAgbG9jYXRpb25DaXJjbGVzPzogTG9jYXRpb25DaXJjbGVDb2xvcnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0FuZENpcmNsZUNvbG9ycyB7XG4gIGZsb3dzPzogRmxvd0NvbG9ycztcbiAgbG9jYXRpb25DaXJjbGVzPzogTG9jYXRpb25DaXJjbGVDb2xvcnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlmZkNvbG9ycyBleHRlbmRzIEJhc2VDb2xvcnMge1xuICBwb3NpdGl2ZT86IEZsb3dBbmRDaXJjbGVDb2xvcnM7XG4gIG5lZ2F0aXZlPzogRmxvd0FuZENpcmNsZUNvbG9ycztcbn1cblxuLy8gVGhlIHh4eENvbG9yc1JHQkEgb2JqZWN0cyBhcmUgbWlycm9yaW5nIHRoZSBpbnB1dCBjb2xvcnMnIG9iamVjdHMsXG4vLyBidXQgY29udmVydGVkIHRvIFJHQkEgYW5kIHdpdGggYWxsIHRoZSBvbWl0dGVkIG9uZXMgc2V0IHRvIGRlZmF1bHRzXG4vLyBvciBkZXJpdmVkLlxuZXhwb3J0IGludGVyZmFjZSBGbG93Q29sb3JzUkdCQSB7XG4gIHNjaGVtZTogc3RyaW5nW107XG4gIGhpZ2hsaWdodGVkOiBSR0JBO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uQ2lyY2xlQ29sb3JzUkdCQSB7XG4gIGlubmVyOiBSR0JBO1xuICBvdXRnb2luZzogUkdCQTtcbiAgaW5jb21pbmc6IFJHQkE7XG4gIGhpZ2hsaWdodGVkOiBSR0JBO1xuICBlbXB0eTogUkdCQTtcbiAgZW1wdHlPdXRsaW5lOiBSR0JBO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uQXJlYUNvbG9yc1JHQkEge1xuICBvdXRsaW5lOiBSR0JBO1xuICBub3JtYWw6IFJHQkE7XG4gIHNlbGVjdGVkOiBSR0JBO1xuICBoaWdobGlnaHRlZDogUkdCQTtcbiAgY29ubmVjdGVkOiBSR0JBO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VDb2xvcnNSR0JBIHtcbiAgZGFya01vZGU6IGJvb2xlYW47XG4gIGxvY2F0aW9uQXJlYXM6IExvY2F0aW9uQXJlYUNvbG9yc1JHQkE7XG4gIGRpbW1lZE9wYWNpdHk6IG51bWJlcjtcbiAgb3V0bGluZUNvbG9yOiBSR0JBO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbG9yc1JHQkEgZXh0ZW5kcyBCYXNlQ29sb3JzUkdCQSB7XG4gIGZsb3dzOiBGbG93Q29sb3JzUkdCQTtcbiAgbG9jYXRpb25DaXJjbGVzOiBMb2NhdGlvbkNpcmNsZUNvbG9yc1JHQkE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0FuZENpcmNsZUNvbG9yc1JHQkEge1xuICBmbG93czogRmxvd0NvbG9yc1JHQkE7XG4gIGxvY2F0aW9uQ2lyY2xlczogTG9jYXRpb25DaXJjbGVDb2xvcnNSR0JBO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpZmZDb2xvcnNSR0JBIGV4dGVuZHMgQmFzZUNvbG9yc1JHQkEge1xuICBwb3NpdGl2ZTogRmxvd0FuZENpcmNsZUNvbG9yc1JHQkE7XG4gIG5lZ2F0aXZlOiBGbG93QW5kQ2lyY2xlQ29sb3JzUkdCQTtcbn1cblxuZnVuY3Rpb24gZ2V0Rmxvd0FuZENpcmNsZUNvbG9ycyhcbiAgaW5wdXRDb2xvcnM6IEZsb3dBbmRDaXJjbGVDb2xvcnMgfCB1bmRlZmluZWQsXG4gIGRlZmF1bHRGbG93Q29sb3JTY2hlbWU6IHN0cmluZ1tdLFxuICBkYXJrTW9kZTogYm9vbGVhbixcbik6IEZsb3dBbmRDaXJjbGVDb2xvcnNSR0JBIHtcbiAgY29uc3QgZmxvd0NvbG9yU2NoZW1lID1cbiAgICAoaW5wdXRDb2xvcnMgJiYgaW5wdXRDb2xvcnMuZmxvd3MgJiYgaW5wdXRDb2xvcnMuZmxvd3Muc2NoZW1lKSB8fFxuICAgIGRlZmF1bHRGbG93Q29sb3JTY2hlbWU7XG4gIGNvbnN0IG1heEZsb3dDb2xvckhjbCA9IGhjbChmbG93Q29sb3JTY2hlbWVbZmxvd0NvbG9yU2NoZW1lLmxlbmd0aCAtIDFdKTtcbiAgY29uc3QgZmxvd0NvbG9ySGlnaGxpZ2h0ZWQgPSBjb2xvckFzUmdiYU9yKFxuICAgIGlucHV0Q29sb3JzICYmIGlucHV0Q29sb3JzLmZsb3dzICYmIGlucHV0Q29sb3JzLmZsb3dzLmhpZ2hsaWdodGVkLFxuICAgIGNvbG9yQXNSZ2JhKFxuICAgICAgbWF4Rmxvd0NvbG9ySGNsW2RhcmtNb2RlID8gJ2JyaWdodGVyJyA6ICdkYXJrZXInXSgwLjcpLnRvU3RyaW5nKCksXG4gICAgKSxcbiAgKTtcblxuICBjb25zdCBlbXB0eUNvbG9yID0gY29sb3JBc1JnYmFPcihcbiAgICBpbnB1dENvbG9ycz8ubG9jYXRpb25DaXJjbGVzPy5lbXB0eSxcbiAgICBkYXJrTW9kZSA/ICcjMDAwJyA6ICcjZmZmJyxcbiAgKTtcbiAgY29uc3QgaW5uZXJDb2xvciA9IGNvbG9yQXNSZ2JhT3IoXG4gICAgaW5wdXRDb2xvcnMgJiZcbiAgICAgIGlucHV0Q29sb3JzLmxvY2F0aW9uQ2lyY2xlcyAmJlxuICAgICAgaW5wdXRDb2xvcnMubG9jYXRpb25DaXJjbGVzLmlubmVyLFxuICAgIG1heEZsb3dDb2xvckhjbC50b1N0cmluZygpLFxuICApO1xuICByZXR1cm4ge1xuICAgIGZsb3dzOiB7XG4gICAgICBzY2hlbWU6IGZsb3dDb2xvclNjaGVtZSxcbiAgICAgIGhpZ2hsaWdodGVkOiBmbG93Q29sb3JIaWdobGlnaHRlZCxcbiAgICB9LFxuICAgIGxvY2F0aW9uQ2lyY2xlczoge1xuICAgICAgaW5uZXI6IGlubmVyQ29sb3IsXG4gICAgICBvdXRnb2luZzogY29sb3JBc1JnYmFPcihcbiAgICAgICAgaW5wdXRDb2xvcnMgJiZcbiAgICAgICAgICBpbnB1dENvbG9ycy5sb2NhdGlvbkNpcmNsZXMgJiZcbiAgICAgICAgICBpbnB1dENvbG9ycy5sb2NhdGlvbkNpcmNsZXMub3V0Z29pbmcsXG4gICAgICAgIGRhcmtNb2RlID8gJyMwMDAnIDogJyNmZmYnLFxuICAgICAgKSxcbiAgICAgIGluY29taW5nOiBjb2xvckFzUmdiYU9yKFxuICAgICAgICBpbnB1dENvbG9ycyAmJlxuICAgICAgICAgIGlucHV0Q29sb3JzLmxvY2F0aW9uQ2lyY2xlcyAmJlxuICAgICAgICAgIGlucHV0Q29sb3JzLmxvY2F0aW9uQ2lyY2xlcy5pbmNvbWluZyxcbiAgICAgICAgbWF4Rmxvd0NvbG9ySGNsW2RhcmtNb2RlID8gJ2JyaWdodGVyJyA6ICdkYXJrZXInXSgxLjI1KS50b1N0cmluZygpLFxuICAgICAgKSxcbiAgICAgIGhpZ2hsaWdodGVkOiBjb2xvckFzUmdiYU9yKFxuICAgICAgICBpbnB1dENvbG9ycyAmJlxuICAgICAgICAgIGlucHV0Q29sb3JzLmxvY2F0aW9uQ2lyY2xlcyAmJlxuICAgICAgICAgIGlucHV0Q29sb3JzLmxvY2F0aW9uQ2lyY2xlcy5oaWdobGlnaHRlZCxcbiAgICAgICAgZmxvd0NvbG9ySGlnaGxpZ2h0ZWQsXG4gICAgICApLFxuICAgICAgZW1wdHk6IGVtcHR5Q29sb3IsXG4gICAgICBlbXB0eU91dGxpbmU6IG1peENvbG9yc1JHQkEoaW5uZXJDb2xvciwgZW1wdHlDb2xvciwgMC40KSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRCYXNlQ29sb3JzUkdCQShcbiAgY29sb3JzOiBDb2xvcnMgfCBEaWZmQ29sb3JzIHwgdW5kZWZpbmVkLFxuKTogQmFzZUNvbG9yc1JHQkEge1xuICBjb25zdCBkYXJrTW9kZSA9IGNvbG9ycyAmJiBjb2xvcnMuZGFya01vZGUgPyB0cnVlIDogZmFsc2U7XG4gIHJldHVybiB7XG4gICAgZGFya01vZGUsXG4gICAgbG9jYXRpb25BcmVhczogZ2V0TG9jYXRpb25BcmVhQ29sb3JzUkdCQShcbiAgICAgIGNvbG9ycyAmJiBjb2xvcnMubG9jYXRpb25BcmVhcyxcbiAgICAgIGRhcmtNb2RlLFxuICAgICksXG4gICAgb3V0bGluZUNvbG9yOiBjb2xvckFzUmdiYShcbiAgICAgIChjb2xvcnMgJiYgY29sb3JzLm91dGxpbmVDb2xvcikgfHwgREVGQVVMVF9PVVRMSU5FX0NPTE9SLFxuICAgICksXG4gICAgZGltbWVkT3BhY2l0eTpcbiAgICAgIGNvbG9ycyAmJiBjb2xvcnMuZGltbWVkT3BhY2l0eSAhPSBudWxsXG4gICAgICAgID8gY29sb3JzLmRpbW1lZE9wYWNpdHlcbiAgICAgICAgOiBERUZBVUxUX0RJTU1FRF9PUEFDSVRZLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29sb3JzUkdCQShjb2xvcnM6IENvbG9ycyB8IHVuZGVmaW5lZCk6IENvbG9yc1JHQkEge1xuICBjb25zdCBiYXNlQ29sb3JzUkdCQSA9IGdldEJhc2VDb2xvcnNSR0JBKGNvbG9ycyk7XG4gIHJldHVybiB7XG4gICAgLi4uYmFzZUNvbG9yc1JHQkEsXG4gICAgLi4uZ2V0Rmxvd0FuZENpcmNsZUNvbG9ycyhcbiAgICAgIGNvbG9ycyxcbiAgICAgIERFRkFVTFRfRkxPV19DT0xPUl9TQ0hFTUUsXG4gICAgICBiYXNlQ29sb3JzUkdCQS5kYXJrTW9kZSxcbiAgICApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlmZkNvbG9yc1JHQkEoXG4gIGNvbG9yczogRGlmZkNvbG9ycyB8IHVuZGVmaW5lZCxcbik6IERpZmZDb2xvcnNSR0JBIHtcbiAgY29uc3QgYmFzZUNvbG9yc1JHQkEgPSBnZXRCYXNlQ29sb3JzUkdCQShjb2xvcnMpO1xuICByZXR1cm4ge1xuICAgIC4uLmJhc2VDb2xvcnNSR0JBLFxuICAgIHBvc2l0aXZlOiBnZXRGbG93QW5kQ2lyY2xlQ29sb3JzKFxuICAgICAgY29sb3JzICYmIGNvbG9ycy5wb3NpdGl2ZSxcbiAgICAgIERFRkFVTFRfRkxPV19DT0xPUl9TQ0hFTUVfUE9TSVRJVkUsXG4gICAgICBiYXNlQ29sb3JzUkdCQS5kYXJrTW9kZSxcbiAgICApLFxuICAgIG5lZ2F0aXZlOiBnZXRGbG93QW5kQ2lyY2xlQ29sb3JzKFxuICAgICAgY29sb3JzICYmIGNvbG9ycy5uZWdhdGl2ZSxcbiAgICAgIERFRkFVTFRfRkxPV19DT0xPUl9TQ0hFTUVfTkVHQVRJVkUsXG4gICAgICBiYXNlQ29sb3JzUkdCQS5kYXJrTW9kZSxcbiAgICApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiYUFzU3RyaW5nKGNvbG9yOiBSR0JBKTogc3RyaW5nIHtcbiAgcmV0dXJuIGByZ2JhKCR7Y29sb3Iuam9pbignLCcpfSlgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWlkcG9pbnQoYTogbnVtYmVyLCBiOiBudW1iZXIsIHplcm9Ub09uZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGEgKyAoYiAtIGEpICogemVyb1RvT25lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWl4Q29sb3JzUkdCQShcbiAgY29sb3IxOiBSR0JBLFxuICBjb2xvcjI6IFJHQkEsXG4gIHplcm9Ub09uZTogbnVtYmVyLFxuKTogUkdCQSB7XG4gIHJldHVybiBjb2xvcjEubWFwKCh2LCBpKSA9PiBtaWRwb2ludCh2LCBjb2xvcjJbaV0sIHplcm9Ub09uZSkpIGFzIFJHQkE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldENvbG9ycztcbiJdfQ==
@@ -0,0 +1,16 @@
1
+ import { FeatureCollection, GeometryCollection, GeometryObject } from 'geojson';
2
+ import { ViewState } from './types';
3
+ export declare type LocationProperties = any;
4
+ export declare function getViewStateForFeatures(featureCollection: FeatureCollection<GeometryObject, LocationProperties> | GeometryCollection, size: [number, number], opts?: {
5
+ pad?: number;
6
+ tileSize?: number;
7
+ minZoom?: number;
8
+ maxZoom?: number;
9
+ }): ViewState;
10
+ export declare function getViewStateForLocations(locations: any[], getLocationCentroid: (location: any) => [number, number], size: [number, number], opts?: {
11
+ pad?: number;
12
+ tileSize?: number;
13
+ minZoom?: number;
14
+ maxZoom?: number;
15
+ }): ViewState;
16
+ //# sourceMappingURL=getViewStateForLocations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getViewStateForLocations.d.ts","sourceRoot":"","sources":["../src/getViewStateForLocations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAC,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;AAElC,oBAAY,kBAAkB,GAAG,GAAG,CAAC;AAErC,wBAAgB,uBAAuB,CACrC,iBAAiB,EACb,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,CAAC,GACrD,kBAAkB,EACtB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACtB,IAAI,CAAC,EAAE;IACL,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,SAAS,CAqBX;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,GAAG,EAAE,EAChB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EACxD,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACtB,IAAI,CAAC,EAAE;IACL,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,SAAS,CAYX"}