@sumaris-net/ngx-components 1.23.43 → 1.23.44

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.
@@ -44,10 +44,6 @@ export class Color {
44
44
  return null;
45
45
  return new Color([+parts[0], +parts[1], +parts[2]], parts.length === 4 && +parts[3] || 1, 'custom');
46
46
  }
47
- static parseHexa(hexColor) {
48
- const split = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexColor);
49
- return new Color(split ? split.slice(1, 4).map(i => parseInt(i, 16)) : [0, 0, 0]);
50
- }
51
47
  get name() {
52
48
  return this._name;
53
49
  }
@@ -83,14 +79,13 @@ Color.transparent = function () {
83
79
  // @dynamic
84
80
  export class ColorScale {
85
81
  constructor(colorArray, options) {
86
- this.colorArray = colorArray;
87
82
  options = options || {};
88
83
  // reserved last colors for value > max
89
84
  const nbIntervalBeforeUpper = !options.upperMax ? colorArray.length : (colorArray.length - 1);
90
85
  this._min = options.min || 0;
91
86
  this._max = options.max || nbIntervalBeforeUpper;
92
87
  this._rangeSize = Math.round((this._max - this._min) / nbIntervalBeforeUpper);
93
- this._legendItems = this.computeLegend();
88
+ this._legendItems = this.computeLegendItems(colorArray);
94
89
  }
95
90
  static default() {
96
91
  return ColorScale.custom(25);
@@ -113,16 +108,19 @@ export class ColorScale {
113
108
  items: this._legendItems
114
109
  };
115
110
  }
116
- getValueColor(value) {
117
- const index = Math.floor(value * (this.colorArray.length - 1) / this._max);
118
- return this.colorArray[index];
111
+ getLegendForValue(value) {
112
+ const index = Math.floor(value * (this._legendItems.length - 1) / this._max);
113
+ return this._legendItems[index];
114
+ }
115
+ getLegendAtIndex(index) {
116
+ return this._legendItems[index];
119
117
  }
120
- computeLegend() {
121
- return this.colorArray.map((color, index) => {
118
+ computeLegendItems(colorArray) {
119
+ return colorArray.map((color, index) => {
122
120
  const start = index * this._rangeSize;
123
121
  const end = start + this._rangeSize;
124
122
  return {
125
- color,
123
+ color: new Color(color),
126
124
  label: (end < this._max) ? `${start.toLocaleString()} - ${end.toLocaleString()}` : ` >= ${start}`
127
125
  };
128
126
  });
@@ -131,12 +129,10 @@ export class ColorScale {
131
129
  ColorScale.custom = (count, options) => {
132
130
  options = options || {};
133
131
  return new ColorScale(linearColorGradientWithIntermediate(count, {
134
- opacity: options.opacity,
135
132
  startColor: options.startColor || undefined,
136
133
  mainColor: options.mainColor || undefined,
137
134
  mainColorIndex: isNotNil(options.mainColorIndex) ? options.mainColorIndex : undefined,
138
- endColor: options.endColor || undefined,
139
- format: options.format
135
+ endColor: options.endColor || undefined
140
136
  }), options);
141
137
  };
142
138
  // Fill colorsMap
@@ -144,29 +140,6 @@ Object.getOwnPropertyNames(rgbArrayMap)
144
140
  .forEach((key) => {
145
141
  colorsMap[key] = new Color(rgbArrayMap[key], 1, key);
146
142
  });
147
- // Internal function
148
- function state2side(state) {
149
- switch (state) {
150
- case 0:
151
- return 0;
152
- case 1:
153
- return -1;
154
- case 2:
155
- return 0;
156
- case 3:
157
- return 1;
158
- }
159
- }
160
- const ɵ0 = (defaultStateSize) => [
161
- Math.round((rgbArrayMap.red[0] - 50) / defaultStateSize),
162
- Math.round((255 - rgbArrayMap.red[1]) / defaultStateSize),
163
- Math.round((255 - rgbArrayMap.red[2]) / defaultStateSize)
164
- ];
165
- const SCALE_OPTIONS_DEFAULT = {
166
- startColor: rgbArrayMap.red,
167
- startStates: [0, 2, 3],
168
- startStepsFn: ɵ0
169
- };
170
143
  /**
171
144
  * Internal function, that create a colors scale, using iteration
172
145
  *
@@ -179,34 +152,26 @@ const SCALE_OPTIONS_DEFAULT = {
179
152
  function linearColorGradientWithIntermediate(count, options) {
180
153
  options = options || {};
181
154
  // From [0,1]
182
- options.opacity = (options.opacity > 0 && options.opacity < 1) ? options.opacity : 1;
183
155
  options.startColor = options.startColor || [255, 255, 190]; // default start = creme
184
156
  options.mainColorIndex = options.mainColorIndex && options.mainColorIndex < count - 1 ? options.mainColorIndex : count - 1;
185
157
  options.endColor = options.endColor || [255, 0, 0]; // default main = red
186
- options.format = options.format || 'rgb';
187
158
  if (!options.mainColor) {
188
159
  return linearColorGradient(count, {
189
- opacity: options.opacity,
190
160
  startColor: options.startColor,
191
- endColor: options.endColor,
192
- format: options.format
161
+ endColor: options.endColor
193
162
  });
194
163
  }
195
164
  else {
196
165
  // Step 1: startColor -> mainColor
197
166
  const result = linearColorGradient(options.mainColorIndex + 1, {
198
- opacity: options.opacity,
199
167
  startColor: options.startColor,
200
- endColor: options.mainColor,
201
- format: options.format
168
+ endColor: options.mainColor
202
169
  });
203
170
  // Step 2: mainColor -> endColor
204
171
  if (options.mainColorIndex < count - 1) {
205
172
  return result.concat(linearColorGradient(count - options.mainColorIndex, {
206
- opacity: options.opacity,
207
173
  startColor: options.mainColor,
208
- endColor: options.endColor,
209
- format: options.format
174
+ endColor: options.endColor
210
175
  }));
211
176
  }
212
177
  else {
@@ -217,10 +182,8 @@ function linearColorGradientWithIntermediate(count, options) {
217
182
  function linearColorGradient(count, options) {
218
183
  options = options || {};
219
184
  // From [0,1]
220
- options.opacity = (options.opacity > 0 && options.opacity < 1) ? options.opacity : 1;
221
185
  options.startColor = options.startColor || [255, 255, 255]; // default start = white
222
186
  options.endColor = options.endColor || [255, 0, 0]; // default end = red
223
- options.format = options.format || 'rgb';
224
187
  const result = [];
225
188
  const color = options.startColor.slice(); // copy the start color
226
189
  const delta = [
@@ -237,24 +200,6 @@ function linearColorGradient(count, options) {
237
200
  // Force last color = end color
238
201
  result.push(options.endColor.slice());
239
202
  // Output as array
240
- if (options.format === 'array') {
241
- return result;
242
- }
243
- // Output as rgb(r,g,b) string
244
- if (options.format === 'rgb') {
245
- if (options.opacity >= 1) {
246
- return result.map(color => 'rgb(' + color.join(',') + ')');
247
- }
248
- else {
249
- return result.map(color => 'rgba(' + color.concat(options.opacity).join(',') + ')');
250
- }
251
- }
252
- // Output as hex
253
- // TODO
254
- // return result.map(color => {
255
- // return "rgb(" + color.join(',') + ")";
256
- // });
257
203
  return result;
258
204
  }
259
- export { ɵ0 };
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtY29sb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZ3JhcGgvZ3JhcGgtY29sb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBUzdDOztHQUVHO0FBQ0gsTUFBTSxXQUFXLEdBQUc7SUFDbEIsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdEIsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDdEIsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDMUIsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDdkIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDckIsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdEIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdkIsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDbEIsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7Q0FDbEIsQ0FBQztBQUVGLDhCQUE4QjtBQUM5QixNQUFNLFNBQVMsR0FBNkIsRUFBRSxDQUFDO0FBRy9DOztHQUVHO0FBQ0gsV0FBVztBQUNYLE1BQU0sT0FBTyxLQUFLO0lBaUNoQixZQUNVLFNBQW1CLEVBQ25CLFFBQWlCLEVBQ2pCLFFBQWdCLFFBQVE7UUFGeEIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLFVBQUssR0FBTCxLQUFLLENBQW1CO0lBRWxDLENBQUM7SUFwQ0QscUNBQXFDO0lBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBZTtRQUN4QixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQVUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFZO1FBQ3pCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFbEYsY0FBYztRQUNkLE1BQU0sS0FBSyxHQUFHLElBQUk7YUFDZixPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQzthQUNuQixPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzthQUNwQixPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQzthQUNoQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFZCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTFELE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNoRCxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQ3BDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQWdCO1FBQy9CLE1BQU0sS0FBSyxHQUFHLDJDQUEyQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RSxPQUFPLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBWUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBZ0I7UUFDbkIsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3RELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtZQUNoRCxPQUFPLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7U0FDaEQ7UUFDRCxPQUFPLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUNsRSxDQUFDOztBQXRDTSxpQkFBVyxHQUFHO0lBQ25CLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUM5QyxDQUFDLENBQUM7QUFnRUo7O0dBRUc7QUFDSCxXQUFXO0FBQ1gsTUFBTSxPQUFPLFVBQVU7SUF5Q3JCLFlBQW9CLFVBQW9CLEVBQUUsT0FBMkI7UUFBakQsZUFBVSxHQUFWLFVBQVUsQ0FBVTtRQUN0QyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUN4Qix1Q0FBdUM7UUFDdkMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFoQ0QsTUFBTSxDQUFDLE9BQU87UUFDWixPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOztRQUVJO0lBQ0osTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFlLEVBQUUsU0FBcUI7UUFDL0MsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQzFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBT0QsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQVlELElBQUksTUFBTTtRQUNSLE9BQU87WUFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYTtRQUN6QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVTLGFBQWE7UUFDckIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMxQyxNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN0QyxNQUFNLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNwQyxPQUFPO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLE1BQU0sR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxFQUFFO2FBQ2xHLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBckVNLGlCQUFNLEdBQUcsQ0FBQyxLQUFhLEVBQUUsT0FBMkIsRUFBRSxFQUFFO0lBQzdELE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ3hCLE9BQU8sSUFBSSxVQUFVLENBQ25CLG1DQUFtQyxDQUFDLEtBQUssRUFBRTtRQUN6QyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksU0FBUztRQUMzQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxTQUFTO1FBQ3pDLGNBQWMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3JGLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxJQUFJLFNBQVM7UUFDdkMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO0tBQ3ZCLENBQWEsRUFDZCxPQUFPLENBQ1IsQ0FBQztBQUNKLENBQUMsQ0FBQztBQTRESixpQkFBaUI7QUFDakIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztLQUNwQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtJQUNmLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZELENBQUMsQ0FBQyxDQUFDO0FBRUwsb0JBQW9CO0FBQ3BCLFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsUUFBUSxLQUFLLEVBQUU7UUFDYixLQUFLLENBQUM7WUFDSixPQUFPLENBQUMsQ0FBQztRQUNYLEtBQUssQ0FBQztZQUNKLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDWixLQUFLLENBQUM7WUFDSixPQUFPLENBQUMsQ0FBQztRQUNYLEtBQUssQ0FBQztZQUNKLE9BQU8sQ0FBQyxDQUFDO0tBQ1o7QUFDSCxDQUFDO1dBTWUsQ0FBQyxnQkFBd0IsRUFBRSxFQUFFLENBQUM7SUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7SUFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7SUFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7Q0FDMUQ7QUFQTCxNQUFNLHFCQUFxQixHQUFHO0lBQzVCLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FBRztJQUMzQixXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0QixZQUFZLElBSVQ7Q0FDSixDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLG1DQUFtQyxDQUFDLEtBQWEsRUFDYixPQUE4QjtJQUN6RSxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUV4QixhQUFhO0lBQ2IsT0FBTyxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixPQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO0lBQ3BGLE9BQU8sQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxPQUFPLENBQUMsY0FBYyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDM0gsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtJQUN6RSxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDO0lBRXpDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1FBQ3RCLE9BQU8sbUJBQW1CLENBQUMsS0FBSyxFQUFFO1lBQ2hDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDOUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtTQUN2QixDQUFDLENBQUM7S0FDSjtTQUVJO1FBQ0gsa0NBQWtDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUFFO1lBQzdELE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDOUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzNCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtTQUN2QixDQUFDLENBQUM7UUFFSCxnQ0FBZ0M7UUFDaEMsSUFBSSxPQUFPLENBQUMsY0FBYyxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDdEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUNsQixtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDbEQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2dCQUN4QixVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzdCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtnQkFDMUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFDSTtZQUNILE9BQU8sTUFBTSxDQUFDO1NBQ2Y7S0FDRjtBQUNILENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEtBQWEsRUFDYixPQUE4QjtJQUV6RCxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUV4QixhQUFhO0lBQ2IsT0FBTyxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixPQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO0lBQ3BGLE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7SUFDeEUsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQztJQUV6QyxNQUFNLE1BQU0sR0FBZSxFQUFFLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QjtJQUNqRSxNQUFNLEtBQUssR0FBRztRQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNqRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0tBQ2xFLENBQUM7SUFFRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEI7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzVCO0lBRUQsK0JBQStCO0lBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXRDLGtCQUFrQjtJQUNsQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxFQUFFO1FBQzlCLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFFRCw4QkFBOEI7SUFDOUIsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtRQUM1QixJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQzVEO2FBQU07WUFDTCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ3JGO0tBQ0Y7SUFFRCxnQkFBZ0I7SUFDaEIsT0FBTztJQUNQLCtCQUErQjtJQUMvQiwyQ0FBMkM7SUFDM0MsTUFBTTtJQUNOLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1ByZWRlZmluZWRDb2xvcnN9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7aXNOaWwsIGlzTm90TmlsfSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuXG5leHBvcnQgZGVjbGFyZSB0eXBlIENvbG9yTmFtZSA9IFByZWRlZmluZWRDb2xvcnMgfFxuICAnd2hpdGUnXG4gIHwgJ3JlZCdcbiAgfCAnZ3JlZW4nXG4gIHwgJ2JsdWUnO1xuXG5cbi8qKlxuICogRGVmaW5lIGhlcmUgdGhlbWUgY29sb3JzXG4gKi9cbmNvbnN0IHJnYkFycmF5TWFwID0ge1xuICB3aGl0ZTogWzI1NSwgMjU1LCAyNTVdLFxuICBwcmltYXJ5OiBbMjAsIDY3LCAxNDVdLCAvLyBva1xuICBzZWNvbmRhcnk6IFsxMTcsIDE5NiwgMjUzXSwgLy8gb2tcbiAgdGVydGlhcnk6IFs5MSwgOTQsIDI0NF0sIC8vIG9rXG4gIGRhbmdlcjogWzI0NSwgNjEsIDYxXSwgLy8gb2tcbiAgbGlnaHQ6IFsyNDQsIDI0NSwgMjQ4XSwgLy8gb2tcbiAgbWVkaXVtOiBbMTUyLCAxNTQsIDE2Ml0sIC8vIG9rXG4gIGRhcms6IFszNCwgMzYsIDQwXSwgLy8gb2tcbiAgcmVkOiBbMjU1LCAwLCAwXSxcbiAgZ3JlZW46IFswLCAyNTUsIDBdLFxuICBibHVlOiBbMCwgMCwgMjU1XVxufTtcblxuLy8gRmlsbCBhIG1hcCBvZiBDb2xvciBvYmplY3RzXG5jb25zdCBjb2xvcnNNYXA6IHsgW2tleTogc3RyaW5nXTogQ29sb3IgfSA9IHt9O1xuXG5cbi8qKlxuICogVXNlZnVsIGNsYXNzIGZvciBjb2xvciBjb252ZXJzaW9uXG4gKi9cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgQ29sb3Ige1xuXG4gIC8vIEhlbHBlciBtZXRob2QsIHRvIHJldHJpZXZlIGEgY29sb3JcbiAgc3RhdGljIGdldChuYW1lOiBDb2xvck5hbWUpOiBDb2xvciB7XG4gICAgcmV0dXJuIGNvbG9yc01hcFtuYW1lXSBhcyBDb2xvcjtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZVJnYmEocmdiYTogc3RyaW5nKTogQ29sb3J8bnVsbHtcbiAgICAgIGlmICghcmdiYSB8fCAoIXJnYmEuc3RhcnRzV2l0aCgncmdiKCcpICYmICFyZ2JhLnN0YXJ0c1dpdGgoJ3JnYmEoJykpKSByZXR1cm4gbnVsbDtcblxuICAgICAgLy8gUGFyc2UgcGFydHNcbiAgICAgIGNvbnN0IHBhcnRzID0gcmdiYVxuICAgICAgICAucmVwbGFjZSgncmdiKCcsICcnKVxuICAgICAgICAucmVwbGFjZSgncmdiYSgnLCAnJylcbiAgICAgICAgLnJlcGxhY2UoJyknLCAnJylcbiAgICAgICAgLnNwbGl0KCcsJyk7XG5cbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgJiYgcGFydHMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcblxuICAgICAgcmV0dXJuIG5ldyBDb2xvcihbK3BhcnRzWzBdLCArcGFydHNbMV0sICtwYXJ0c1syXV0sXG4gICAgICAgIHBhcnRzLmxlbmd0aCA9PT0gNCAmJiArcGFydHNbM10gfHwgMSxcbiAgICAgICAgJ2N1c3RvbScpO1xuICB9XG5cbiAgc3RhdGljIHBhcnNlSGV4YShoZXhDb2xvcjogc3RyaW5nKTogQ29sb3Ige1xuICAgIGNvbnN0IHNwbGl0ID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGhleENvbG9yKTtcbiAgICByZXR1cm4gbmV3IENvbG9yKHNwbGl0ID8gc3BsaXQuc2xpY2UoMSwgNCkubWFwKGkgPT4gcGFyc2VJbnQoaSwgMTYpKSA6IFswLCAwLCAwXSk7XG4gIH1cblxuICBzdGF0aWMgdHJhbnNwYXJlbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IENvbG9yKFswLDAsMF0sIDAsICd0cmFuc2x1Y2VudCcpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3JnYkFycmF5OiBudW1iZXJbXSxcbiAgICBwcml2YXRlIF9vcGFjaXR5PzogbnVtYmVyLFxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyA9ICdjdXN0b20nXG4gICkge1xuICB9XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cbiAgZ2V0IG9wYWNpdHkoKTogbnVtYmVye1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9vcGFjaXR5KSA/IHRoaXMuX29wYWNpdHkgOiAxO1xuICB9XG4gIGdldCByZ2IoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLl9yZ2JBcnJheTtcbiAgfVxuXG4gIGdldCByKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JnYkFycmF5WzBdO1xuICB9XG5cbiAgZ2V0IGcoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcmdiQXJyYXlbMV07XG4gIH1cblxuICBnZXQgYigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yZ2JBcnJheVsyXTtcbiAgfVxuXG4gIHJnYmEob3BhY2l0eT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgb3BhY2l0eSA9IGlzTm90TmlsKG9wYWNpdHkpID8gb3BhY2l0eSA6IHRoaXMuX29wYWNpdHk7XG4gICAgaWYgKGlzTmlsKG9wYWNpdHkpIHx8IG9wYWNpdHkgPCAwIHx8IG9wYWNpdHkgPiAxKSB7XG4gICAgICByZXR1cm4gJ3JnYignICsgdGhpcy5fcmdiQXJyYXkuam9pbignLCcpICsgJyknO1xuICAgIH1cbiAgICByZXR1cm4gJ3JnYmEoJyArIHRoaXMuX3JnYkFycmF5LmpvaW4oJywnKSArICcsJyArIG9wYWNpdHkgKyAnKSc7XG4gIH1cblxufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQ29sb3JHcmFkaWVudE9wdGlvbnMge1xuICBvcGFjaXR5PzogbnVtYmVyO1xuICBzdGFydENvbG9yPzogbnVtYmVyW107XG4gIG1haW5Db2xvcj86IG51bWJlcltdO1xuICBtYWluQ29sb3JJbmRleD86IG51bWJlcjtcbiAgZW5kQ29sb3I/OiBudW1iZXJbXTtcbiAgZm9ybWF0PzogJ3JnYid8J2hleCd8J2FycmF5Jztcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIENvbG9yU2NhbGVPcHRpb25zIGV4dGVuZHMgQ29sb3JHcmFkaWVudE9wdGlvbnN7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICB1cHBlck1heD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDb2xvclNjYWxlTGVnZW5kSXRlbSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGNvbG9yOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDb2xvclNjYWxlTGVnZW5kIHtcbiAgaXRlbXM6IENvbG9yU2NhbGVMZWdlbmRJdGVtW107XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciBjb2xvcnMgc2NhbGVcbiAqL1xuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBDb2xvclNjYWxlIHtcblxuICBzdGF0aWMgY3VzdG9tID0gKGNvdW50OiBudW1iZXIsIG9wdGlvbnM/OiBDb2xvclNjYWxlT3B0aW9ucykgPT4ge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBuZXcgQ29sb3JTY2FsZShcbiAgICAgIGxpbmVhckNvbG9yR3JhZGllbnRXaXRoSW50ZXJtZWRpYXRlKGNvdW50LCB7XG4gICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgc3RhcnRDb2xvcjogb3B0aW9ucy5zdGFydENvbG9yIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgbWFpbkNvbG9yOiBvcHRpb25zLm1haW5Db2xvciB8fCB1bmRlZmluZWQsXG4gICAgICAgIG1haW5Db2xvckluZGV4OiBpc05vdE5pbChvcHRpb25zLm1haW5Db2xvckluZGV4KSA/IG9wdGlvbnMubWFpbkNvbG9ySW5kZXggOiB1bmRlZmluZWQsXG4gICAgICAgIGVuZENvbG9yOiBvcHRpb25zLmVuZENvbG9yIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgZm9ybWF0OiBvcHRpb25zLmZvcm1hdFxuICAgICAgfSkgYXMgc3RyaW5nW10sXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdCgpIHtcbiAgICByZXR1cm4gQ29sb3JTY2FsZS5jdXN0b20oMjUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGFycmF5IHdpdGggdGhlIGdpdmVuIGNvbG9yXG4gICAqKi9cbiAgc3RhdGljIGZpeChsZW5ndGg/OiBudW1iZXIsIGNvbG9yTmFtZT86IENvbG9yTmFtZSk6IGFueVtdIHtcbiAgICByZXR1cm4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkobGVuZ3RoIHx8IDI1KSlcbiAgICAgIC5tYXAoU3RyaW5nLnByb3RvdHlwZS52YWx1ZU9mLCBDb2xvci5nZXQoY29sb3JOYW1lIHx8ICdwcmltYXJ5JykucmdiYSgwLjUpKTtcbiAgfVxuXG4gIHByaXZhdGUgX21pbjogbnVtYmVyO1xuICBwcml2YXRlIF9tYXg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmFuZ2VTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgX2xlZ2VuZEl0ZW1zOiBDb2xvclNjYWxlTGVnZW5kSXRlbVtdO1xuXG4gIGdldCBtaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG4gIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb2xvckFycmF5OiBzdHJpbmdbXSwgb3B0aW9ucz86IENvbG9yU2NhbGVPcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgLy8gcmVzZXJ2ZWQgbGFzdCBjb2xvcnMgZm9yIHZhbHVlID4gbWF4XG4gICAgY29uc3QgbmJJbnRlcnZhbEJlZm9yZVVwcGVyID0gIW9wdGlvbnMudXBwZXJNYXggPyBjb2xvckFycmF5Lmxlbmd0aCA6IChjb2xvckFycmF5Lmxlbmd0aCAtIDEpO1xuICAgIHRoaXMuX21pbiA9IG9wdGlvbnMubWluIHx8IDA7XG4gICAgdGhpcy5fbWF4ID0gb3B0aW9ucy5tYXggfHwgbmJJbnRlcnZhbEJlZm9yZVVwcGVyO1xuICAgIHRoaXMuX3JhbmdlU2l6ZSA9IE1hdGgucm91bmQoKHRoaXMuX21heCAtIHRoaXMuX21pbikgLyBuYkludGVydmFsQmVmb3JlVXBwZXIpO1xuICAgIHRoaXMuX2xlZ2VuZEl0ZW1zID0gdGhpcy5jb21wdXRlTGVnZW5kKCk7XG4gIH1cblxuICBnZXQgbGVnZW5kKCk6IENvbG9yU2NhbGVMZWdlbmQge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogdGhpcy5fbGVnZW5kSXRlbXNcbiAgICB9O1xuICB9XG5cbiAgZ2V0VmFsdWVDb2xvcih2YWx1ZTogbnVtYmVyKTogc3RyaW5nfG51bWJlcltdIHtcbiAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IodmFsdWUgKiAodGhpcy5jb2xvckFycmF5Lmxlbmd0aCAtIDEpIC8gdGhpcy5fbWF4KTtcbiAgICByZXR1cm4gdGhpcy5jb2xvckFycmF5W2luZGV4XTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb21wdXRlTGVnZW5kKCk6IENvbG9yU2NhbGVMZWdlbmRJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmNvbG9yQXJyYXkubWFwKChjb2xvciwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gaW5kZXggKiB0aGlzLl9yYW5nZVNpemU7XG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMuX3JhbmdlU2l6ZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yLFxuICAgICAgICBsYWJlbDogKGVuZCA8IHRoaXMuX21heCkgPyBgJHtzdGFydC50b0xvY2FsZVN0cmluZygpfSAtICR7ZW5kLnRvTG9jYWxlU3RyaW5nKCl9YCA6IGAgPj0gJHtzdGFydH1gXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG5cblxuLy8gRmlsbCBjb2xvcnNNYXBcbk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHJnYkFycmF5TWFwKVxuICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29sb3JzTWFwW2tleV0gPSBuZXcgQ29sb3IocmdiQXJyYXlNYXBba2V5XSwgMSwga2V5KTtcbiAgfSk7XG5cbi8vIEludGVybmFsIGZ1bmN0aW9uXG5mdW5jdGlvbiBzdGF0ZTJzaWRlKHN0YXRlKSB7XG4gIHN3aXRjaCAoc3RhdGUpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gMDtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gLTE7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIDA7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuXG5jb25zdCBTQ0FMRV9PUFRJT05TX0RFRkFVTFQgPSB7XG4gIHN0YXJ0Q29sb3I6IHJnYkFycmF5TWFwLnJlZCxcbiAgc3RhcnRTdGF0ZXM6IFswLCAyLCAzXSwgLy8gUj1rZWVwLCBWPWtlZXAsIEI9aW5jcmVhc2VcbiAgc3RhcnRTdGVwc0ZuOiAoZGVmYXVsdFN0YXRlU2l6ZTogbnVtYmVyKSA9PiBbXG4gICAgICBNYXRoLnJvdW5kKChyZ2JBcnJheU1hcC5yZWRbMF0gLSA1MCkgLyBkZWZhdWx0U3RhdGVTaXplKSxcbiAgICAgIE1hdGgucm91bmQoKDI1NSAtIHJnYkFycmF5TWFwLnJlZFsxXSkgLyBkZWZhdWx0U3RhdGVTaXplKSxcbiAgICAgIE1hdGgucm91bmQoKDI1NSAtIHJnYkFycmF5TWFwLnJlZFsyXSkgLyBkZWZhdWx0U3RhdGVTaXplKVxuICAgIF1cbn07XG5cbi8qKlxuICogSW50ZXJuYWwgZnVuY3Rpb24sIHRoYXQgY3JlYXRlIGEgY29sb3JzIHNjYWxlLCB1c2luZyBpdGVyYXRpb25cbiAqXG4gKiBAcGFyYW0gY291bnRcbiAqIEBwYXJhbSBvcGFjaXR5XG4gKiBAcGFyYW0gc3RhcnRDb2xvclxuICogQHBhcmFtIHN0YXJ0U3RhdGVcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGxpbmVhckNvbG9yR3JhZGllbnRXaXRoSW50ZXJtZWRpYXRlKGNvdW50OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPzogQ29sb3JHcmFkaWVudE9wdGlvbnMpOiBhbnlbXSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIEZyb20gWzAsMV1cbiAgb3B0aW9ucy5vcGFjaXR5ID0gKG9wdGlvbnMub3BhY2l0eSA+IDAgJiYgb3B0aW9ucy5vcGFjaXR5IDwgMSkgPyBvcHRpb25zLm9wYWNpdHkgOiAxO1xuICBvcHRpb25zLnN0YXJ0Q29sb3IgPSBvcHRpb25zLnN0YXJ0Q29sb3IgfHwgWzI1NSwgMjU1LCAxOTBdOyAvLyBkZWZhdWx0IHN0YXJ0ID0gY3JlbWVcbiAgb3B0aW9ucy5tYWluQ29sb3JJbmRleCA9IG9wdGlvbnMubWFpbkNvbG9ySW5kZXggJiYgb3B0aW9ucy5tYWluQ29sb3JJbmRleCA8IGNvdW50IC0gMSA/IG9wdGlvbnMubWFpbkNvbG9ySW5kZXggOiBjb3VudCAtIDE7XG4gIG9wdGlvbnMuZW5kQ29sb3IgPSBvcHRpb25zLmVuZENvbG9yIHx8IFsyNTUsIDAsIDBdOyAvLyBkZWZhdWx0IG1haW4gPSByZWRcbiAgb3B0aW9ucy5mb3JtYXQgPSBvcHRpb25zLmZvcm1hdCB8fCAncmdiJztcblxuICBpZiAoIW9wdGlvbnMubWFpbkNvbG9yKSB7XG4gICAgcmV0dXJuIGxpbmVhckNvbG9yR3JhZGllbnQoY291bnQsIHtcbiAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgIHN0YXJ0Q29sb3I6IG9wdGlvbnMuc3RhcnRDb2xvcixcbiAgICAgIGVuZENvbG9yOiBvcHRpb25zLmVuZENvbG9yLFxuICAgICAgZm9ybWF0OiBvcHRpb25zLmZvcm1hdFxuICAgIH0pO1xuICB9XG5cbiAgZWxzZSB7XG4gICAgLy8gU3RlcCAxOiBzdGFydENvbG9yIC0+IG1haW5Db2xvclxuICAgIGNvbnN0IHJlc3VsdCA9IGxpbmVhckNvbG9yR3JhZGllbnQob3B0aW9ucy5tYWluQ29sb3JJbmRleCArIDEsIHtcbiAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgIHN0YXJ0Q29sb3I6IG9wdGlvbnMuc3RhcnRDb2xvcixcbiAgICAgIGVuZENvbG9yOiBvcHRpb25zLm1haW5Db2xvcixcbiAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXRcbiAgICB9KTtcblxuICAgIC8vIFN0ZXAgMjogbWFpbkNvbG9yIC0+IGVuZENvbG9yXG4gICAgaWYgKG9wdGlvbnMubWFpbkNvbG9ySW5kZXggPCBjb3VudCAtIDEpIHtcbiAgICAgIHJldHVybiByZXN1bHQuY29uY2F0KFxuICAgICAgICBsaW5lYXJDb2xvckdyYWRpZW50KGNvdW50IC0gb3B0aW9ucy5tYWluQ29sb3JJbmRleCwge1xuICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICBzdGFydENvbG9yOiBvcHRpb25zLm1haW5Db2xvcixcbiAgICAgICAgICBlbmRDb2xvcjogb3B0aW9ucy5lbmRDb2xvcixcbiAgICAgICAgICBmb3JtYXQ6IG9wdGlvbnMuZm9ybWF0XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsaW5lYXJDb2xvckdyYWRpZW50KGNvdW50OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM/OiBDb2xvckdyYWRpZW50T3B0aW9ucyk6IGFueVtdIHtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBGcm9tIFswLDFdXG4gIG9wdGlvbnMub3BhY2l0eSA9IChvcHRpb25zLm9wYWNpdHkgPiAwICYmIG9wdGlvbnMub3BhY2l0eSA8IDEpID8gb3B0aW9ucy5vcGFjaXR5IDogMTtcbiAgb3B0aW9ucy5zdGFydENvbG9yID0gb3B0aW9ucy5zdGFydENvbG9yIHx8IFsyNTUsIDI1NSwgMjU1XTsgLy8gZGVmYXVsdCBzdGFydCA9IHdoaXRlXG4gIG9wdGlvbnMuZW5kQ29sb3IgPSBvcHRpb25zLmVuZENvbG9yIHx8IFsyNTUsIDAsIDBdOyAvLyBkZWZhdWx0IGVuZCA9IHJlZFxuICBvcHRpb25zLmZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICdyZ2InO1xuXG4gIGNvbnN0IHJlc3VsdDogbnVtYmVyW11bXSA9IFtdO1xuICBjb25zdCBjb2xvciA9IG9wdGlvbnMuc3RhcnRDb2xvci5zbGljZSgpOyAvLyBjb3B5IHRoZSBzdGFydCBjb2xvclxuICBjb25zdCBkZWx0YSA9IFtcbiAgICBNYXRoLnJvdW5kKChvcHRpb25zLmVuZENvbG9yWzBdIC0gb3B0aW9ucy5zdGFydENvbG9yWzBdKSAvIGNvdW50KSxcbiAgICBNYXRoLnJvdW5kKChvcHRpb25zLmVuZENvbG9yWzFdIC0gb3B0aW9ucy5zdGFydENvbG9yWzFdKSAvIGNvdW50KSxcbiAgICBNYXRoLnJvdW5kKChvcHRpb25zLmVuZENvbG9yWzJdIC0gb3B0aW9ucy5zdGFydENvbG9yWzJdKSAvIGNvdW50KVxuICBdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgY29sb3Jbal0gKz0gZGVsdGFbal07XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKGNvbG9yLnNsaWNlKCkpO1xuICB9XG5cbiAgLy8gRm9yY2UgbGFzdCBjb2xvciA9IGVuZCBjb2xvclxuICByZXN1bHQucHVzaChvcHRpb25zLmVuZENvbG9yLnNsaWNlKCkpO1xuXG4gIC8vIE91dHB1dCBhcyBhcnJheVxuICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gT3V0cHV0IGFzIHJnYihyLGcsYikgc3RyaW5nXG4gIGlmIChvcHRpb25zLmZvcm1hdCA9PT0gJ3JnYicpIHtcbiAgICBpZiAob3B0aW9ucy5vcGFjaXR5ID49IDEpIHtcbiAgICAgIHJldHVybiByZXN1bHQubWFwKGNvbG9yID0+ICdyZ2IoJyArIGNvbG9yLmpvaW4oJywnKSArICcpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXN1bHQubWFwKGNvbG9yID0+ICdyZ2JhKCcgKyBjb2xvci5jb25jYXQob3B0aW9ucy5vcGFjaXR5KS5qb2luKCcsJykgKyAnKScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE91dHB1dCBhcyBoZXhcbiAgLy8gVE9ET1xuICAvLyByZXR1cm4gcmVzdWx0Lm1hcChjb2xvciA9PiB7XG4gIC8vICAgcmV0dXJuIFwicmdiKFwiICsgY29sb3Iuam9pbignLCcpICsgXCIpXCI7XG4gIC8vIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtY29sb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZ3JhcGgvZ3JhcGgtY29sb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBVTdDOztHQUVHO0FBQ0gsTUFBTSxXQUFXLEdBQUc7SUFDbEIsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdEIsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDdEIsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDMUIsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDdkIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDckIsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdEIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdkIsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDbEIsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7Q0FDbEIsQ0FBQztBQUVGLDhCQUE4QjtBQUM5QixNQUFNLFNBQVMsR0FBNkIsRUFBRSxDQUFDO0FBRy9DOztHQUVHO0FBQ0gsV0FBVztBQUNYLE1BQU0sT0FBTyxLQUFLO0lBNEJoQixZQUNVLFNB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LFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXRDLGtCQUFrQjtJQUNsQixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQcmVkZWZpbmVkQ29sb3JzfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQge2lzTmlsLCBpc05vdE5pbH0gZnJvbSAnLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7aGV4VG9SZ2IsIGhleFRvUmdiQXJyYXksIHJnYkFycmF5VG9IZXh9IGZyb20gJy4vY29sb3JzLnV0aWxzJztcblxuZXhwb3J0IGRlY2xhcmUgdHlwZSBDb2xvck5hbWUgPSBQcmVkZWZpbmVkQ29sb3JzIHxcbiAgJ3doaXRlJ1xuICB8ICdyZWQnXG4gIHwgJ2dyZWVuJ1xuICB8ICdibHVlJztcblxuXG4vKipcbiAqIERlZmluZSBoZXJlIHRoZW1lIGNvbG9yc1xuICovXG5jb25zdCByZ2JBcnJheU1hcCA9IHtcbiAgd2hpdGU6IFsyNTUsIDI1NSwgMjU1XSxcbiAgcHJpbWFyeTogWzIwLCA2NywgMTQ1XSwgLy8gb2tcbiAgc2Vjb25kYXJ5OiBbMTE3LCAxOTYsIDI1M10sIC8vIG9rXG4gIHRlcnRpYXJ5OiBbOTEsIDk0LCAyNDRdLCAvLyBva1xuICBkYW5nZXI6IFsyNDUsIDYxLCA2MV0sIC8vIG9rXG4gIGxpZ2h0OiBbMjQ0LCAyNDUsIDI0OF0sIC8vIG9rXG4gIG1lZGl1bTogWzE1MiwgMTU0LCAxNjJdLCAvLyBva1xuICBkYXJrOiBbMzQsIDM2LCA0MF0sIC8vIG9rXG4gIHJlZDogWzI1NSwgMCwgMF0sXG4gIGdyZWVuOiBbMCwgMjU1LCAwXSxcbiAgYmx1ZTogWzAsIDAsIDI1NV1cbn07XG5cbi8vIEZpbGwgYSBtYXAgb2YgQ29sb3Igb2JqZWN0c1xuY29uc3QgY29sb3JzTWFwOiB7IFtrZXk6IHN0cmluZ106IENvbG9yIH0gPSB7fTtcblxuXG4vKipcbiAqIFVzZWZ1bCBjbGFzcyBmb3IgY29sb3IgY29udmVyc2lvblxuICovXG4vLyBAZHluYW1pY1xuZXhwb3J0IGNsYXNzIENvbG9yIHtcblxuICAvLyBIZWxwZXIgbWV0aG9kLCB0byByZXRyaWV2ZSBhIGNvbG9yXG4gIHN0YXRpYyBnZXQobmFtZTogQ29sb3JOYW1lKTogQ29sb3Ige1xuICAgIHJldHVybiBjb2xvcnNNYXBbbmFtZV0gYXMgQ29sb3I7XG4gIH1cblxuICBzdGF0aWMgcGFyc2VSZ2JhKHJnYmE6IHN0cmluZyk6IENvbG9yfG51bGx7XG4gICAgICBpZiAoIXJnYmEgfHwgKCFyZ2JhLnN0YXJ0c1dpdGgoJ3JnYignKSAmJiAhcmdiYS5zdGFydHNXaXRoKCdyZ2JhKCcpKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgIC8vIFBhcnNlIHBhcnRzXG4gICAgICBjb25zdCBwYXJ0cyA9IHJnYmFcbiAgICAgICAgLnJlcGxhY2UoJ3JnYignLCAnJylcbiAgICAgICAgLnJlcGxhY2UoJ3JnYmEoJywgJycpXG4gICAgICAgIC5yZXBsYWNlKCcpJywgJycpXG4gICAgICAgIC5zcGxpdCgnLCcpO1xuXG4gICAgICBpZiAocGFydHMubGVuZ3RoICE9PSAzICYmIHBhcnRzLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIHJldHVybiBuZXcgQ29sb3IoWytwYXJ0c1swXSwgK3BhcnRzWzFdLCArcGFydHNbMl1dLFxuICAgICAgICBwYXJ0cy5sZW5ndGggPT09IDQgJiYgK3BhcnRzWzNdIHx8IDEsXG4gICAgICAgICdjdXN0b20nKTtcbiAgfVxuXG4gIHN0YXRpYyB0cmFuc3BhcmVudCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgQ29sb3IoWzAsMCwwXSwgMCwgJ3RyYW5zbHVjZW50Jyk7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcmdiQXJyYXk6IG51bWJlcltdLFxuICAgIHByaXZhdGUgX29wYWNpdHk/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nID0gJ2N1c3RvbSdcbiAgKSB7XG4gIH1cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuICBnZXQgb3BhY2l0eSgpOiBudW1iZXJ7XG4gICAgcmV0dXJuIGlzTm90TmlsKHRoaXMuX29wYWNpdHkpID8gdGhpcy5fb3BhY2l0eSA6IDE7XG4gIH1cbiAgZ2V0IHJnYigpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3JnYkFycmF5O1xuICB9XG5cbiAgZ2V0IHIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcmdiQXJyYXlbMF07XG4gIH1cblxuICBnZXQgZygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yZ2JBcnJheVsxXTtcbiAgfVxuXG4gIGdldCBiKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JnYkFycmF5WzJdO1xuICB9XG5cbiAgcmdiYShvcGFjaXR5PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBvcGFjaXR5ID0gaXNOb3ROaWwob3BhY2l0eSkgPyBvcGFjaXR5IDogdGhpcy5fb3BhY2l0eTtcbiAgICBpZiAoaXNOaWwob3BhY2l0eSkgfHwgb3BhY2l0eSA8IDAgfHwgb3BhY2l0eSA+IDEpIHtcbiAgICAgIHJldHVybiAncmdiKCcgKyB0aGlzLl9yZ2JBcnJheS5qb2luKCcsJykgKyAnKSc7XG4gICAgfVxuICAgIHJldHVybiAncmdiYSgnICsgdGhpcy5fcmdiQXJyYXkuam9pbignLCcpICsgJywnICsgb3BhY2l0eSArICcpJztcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDb2xvckdyYWRpZW50T3B0aW9ucyB7XG4gIHN0YXJ0Q29sb3I/OiBudW1iZXJbXTtcbiAgbWFpbkNvbG9yPzogbnVtYmVyW107XG4gIG1haW5Db2xvckluZGV4PzogbnVtYmVyO1xuICBlbmRDb2xvcj86IG51bWJlcltdO1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQ29sb3JTY2FsZU9wdGlvbnMgZXh0ZW5kcyBDb2xvckdyYWRpZW50T3B0aW9ucyB7XG4gIG9wYWNpdHk/OiBudW1iZXI7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICB1cHBlck1heD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDb2xvclNjYWxlTGVnZW5kSXRlbSB7XG4gIGxhYmVsOiBzdHJpbmd8bnVtYmVyW107XG4gIGNvbG9yOiBDb2xvcjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIENvbG9yU2NhbGVMZWdlbmQge1xuICBpdGVtczogQ29sb3JTY2FsZUxlZ2VuZEl0ZW1bXTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIGNvbG9ycyBzY2FsZVxuICovXG4vLyBAZHluYW1pY1xuZXhwb3J0IGNsYXNzIENvbG9yU2NhbGUge1xuXG4gIHN0YXRpYyBjdXN0b20gPSAoY291bnQ6IG51bWJlciwgb3B0aW9ucz86IENvbG9yU2NhbGVPcHRpb25zKSA9PiB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIG5ldyBDb2xvclNjYWxlKFxuICAgICAgbGluZWFyQ29sb3JHcmFkaWVudFdpdGhJbnRlcm1lZGlhdGUoY291bnQsIHtcbiAgICAgICAgc3RhcnRDb2xvcjogb3B0aW9ucy5zdGFydENvbG9yIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgbWFpbkNvbG9yOiBvcHRpb25zLm1haW5Db2xvciB8fCB1bmRlZmluZWQsXG4gICAgICAgIG1haW5Db2xvckluZGV4OiBpc05vdE5pbChvcHRpb25zLm1haW5Db2xvckluZGV4KSA/IG9wdGlvbnMubWFpbkNvbG9ySW5kZXggOiB1bmRlZmluZWQsXG4gICAgICAgIGVuZENvbG9yOiBvcHRpb25zLmVuZENvbG9yIHx8IHVuZGVmaW5lZFxuICAgICAgfSksXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdCgpIHtcbiAgICByZXR1cm4gQ29sb3JTY2FsZS5jdXN0b20oMjUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGFycmF5IHdpdGggdGhlIGdpdmVuIGNvbG9yXG4gICAqKi9cbiAgc3RhdGljIGZpeChsZW5ndGg/OiBudW1iZXIsIGNvbG9yTmFtZT86IENvbG9yTmFtZSk6IGFueVtdIHtcbiAgICByZXR1cm4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkobGVuZ3RoIHx8IDI1KSlcbiAgICAgIC5tYXAoU3RyaW5nLnByb3RvdHlwZS52YWx1ZU9mLCBDb2xvci5nZXQoY29sb3JOYW1lIHx8ICdwcmltYXJ5JykucmdiYSgwLjUpKTtcbiAgfVxuXG4gIHByaXZhdGUgX21pbjogbnVtYmVyO1xuICBwcml2YXRlIF9tYXg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmFuZ2VTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgX2xlZ2VuZEl0ZW1zOiBDb2xvclNjYWxlTGVnZW5kSXRlbVtdO1xuXG4gIGdldCBtaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG4gIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgY29uc3RydWN0b3IoY29sb3JBcnJheTogbnVtYmVyW11bXSwgb3B0aW9ucz86IENvbG9yU2NhbGVPcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgLy8gcmVzZXJ2ZWQgbGFzdCBjb2xvcnMgZm9yIHZhbHVlID4gbWF4XG4gICAgY29uc3QgbmJJbnRlcnZhbEJlZm9yZVVwcGVyID0gIW9wdGlvbnMudXBwZXJNYXggPyBjb2xvckFycmF5Lmxlbmd0aCA6IChjb2xvckFycmF5Lmxlbmd0aCAtIDEpO1xuICAgIHRoaXMuX21pbiA9IG9wdGlvbnMubWluIHx8IDA7XG4gICAgdGhpcy5fbWF4ID0gb3B0aW9ucy5tYXggfHwgbmJJbnRlcnZhbEJlZm9yZVVwcGVyO1xuICAgIHRoaXMuX3JhbmdlU2l6ZSA9IE1hdGgucm91bmQoKHRoaXMuX21heCAtIHRoaXMuX21pbikgLyBuYkludGVydmFsQmVmb3JlVXBwZXIpO1xuICAgIHRoaXMuX2xlZ2VuZEl0ZW1zID0gdGhpcy5jb21wdXRlTGVnZW5kSXRlbXMoY29sb3JBcnJheSk7XG4gIH1cblxuICBnZXQgbGVnZW5kKCk6IENvbG9yU2NhbGVMZWdlbmQge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogdGhpcy5fbGVnZW5kSXRlbXNcbiAgICB9O1xuICB9XG5cbiAgZ2V0TGVnZW5kRm9yVmFsdWUodmFsdWU6IG51bWJlcik6IENvbG9yU2NhbGVMZWdlbmRJdGVtIHtcbiAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IodmFsdWUgKiAodGhpcy5fbGVnZW5kSXRlbXMubGVuZ3RoIC0gMSkgLyB0aGlzLl9tYXgpO1xuICAgIHJldHVybiB0aGlzLl9sZWdlbmRJdGVtc1tpbmRleF07XG4gIH1cblxuICBnZXRMZWdlbmRBdEluZGV4KGluZGV4OiBudW1iZXIpOiBDb2xvclNjYWxlTGVnZW5kSXRlbSB7XG4gICAgcmV0dXJuIHRoaXMuX2xlZ2VuZEl0ZW1zW2luZGV4XTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb21wdXRlTGVnZW5kSXRlbXMoY29sb3JBcnJheTogbnVtYmVyW11bXSk6IENvbG9yU2NhbGVMZWdlbmRJdGVtW10ge1xuICAgIHJldHVybiBjb2xvckFycmF5Lm1hcCgoY29sb3IsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzdGFydCA9IGluZGV4ICogdGhpcy5fcmFuZ2VTaXplO1xuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyB0aGlzLl9yYW5nZVNpemU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogbmV3IENvbG9yKGNvbG9yKSxcbiAgICAgICAgbGFiZWw6IChlbmQgPCB0aGlzLl9tYXgpID8gYCR7c3RhcnQudG9Mb2NhbGVTdHJpbmcoKX0gLSAke2VuZC50b0xvY2FsZVN0cmluZygpfWAgOiBgID49ICR7c3RhcnR9YFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuXG5cbi8vIEZpbGwgY29sb3JzTWFwXG5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyZ2JBcnJheU1hcClcbiAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbG9yc01hcFtrZXldID0gbmV3IENvbG9yKHJnYkFycmF5TWFwW2tleV0sIDEsIGtleSk7XG4gIH0pO1xuXG5cbi8qKlxuICogSW50ZXJuYWwgZnVuY3Rpb24sIHRoYXQgY3JlYXRlIGEgY29sb3JzIHNjYWxlLCB1c2luZyBpdGVyYXRpb25cbiAqXG4gKiBAcGFyYW0gY291bnRcbiAqIEBwYXJhbSBvcGFjaXR5XG4gKiBAcGFyYW0gc3RhcnRDb2xvclxuICogQHBhcmFtIHN0YXJ0U3RhdGVcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGxpbmVhckNvbG9yR3JhZGllbnRXaXRoSW50ZXJtZWRpYXRlKGNvdW50OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPzogQ29sb3JHcmFkaWVudE9wdGlvbnMpOiBudW1iZXJbXVtdIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRnJvbSBbMCwxXVxuICBvcHRpb25zLnN0YXJ0Q29sb3IgPSBvcHRpb25zLnN0YXJ0Q29sb3IgfHwgWzI1NSwgMjU1LCAxOTBdOyAvLyBkZWZhdWx0IHN0YXJ0ID0gY3JlbWVcbiAgb3B0aW9ucy5tYWluQ29sb3JJbmRleCA9IG9wdGlvbnMubWFpbkNvbG9ySW5kZXggJiYgb3B0aW9ucy5tYWluQ29sb3JJbmRleCA8IGNvdW50IC0gMSA/IG9wdGlvbnMubWFpbkNvbG9ySW5kZXggOiBjb3VudCAtIDE7XG4gIG9wdGlvbnMuZW5kQ29sb3IgPSBvcHRpb25zLmVuZENvbG9yIHx8IFsyNTUsIDAsIDBdOyAvLyBkZWZhdWx0IG1haW4gPSByZWRcblxuICBpZiAoIW9wdGlvbnMubWFpbkNvbG9yKSB7XG4gICAgcmV0dXJuIGxpbmVhckNvbG9yR3JhZGllbnQoY291bnQsIHtcbiAgICAgIHN0YXJ0Q29sb3I6IG9wdGlvbnMuc3RhcnRDb2xvcixcbiAgICAgIGVuZENvbG9yOiBvcHRpb25zLmVuZENvbG9yXG4gICAgfSk7XG4gIH1cblxuICBlbHNlIHtcbiAgICAvLyBTdGVwIDE6IHN0YXJ0Q29sb3IgLT4gbWFpbkNvbG9yXG4gICAgY29uc3QgcmVzdWx0ID0gbGluZWFyQ29sb3JHcmFkaWVudChvcHRpb25zLm1haW5Db2xvckluZGV4ICsgMSwge1xuICAgICAgc3RhcnRDb2xvcjogb3B0aW9ucy5zdGFydENvbG9yLFxuICAgICAgZW5kQ29sb3I6IG9wdGlvbnMubWFpbkNvbG9yXG4gICAgfSk7XG5cbiAgICAvLyBTdGVwIDI6IG1haW5Db2xvciAtPiBlbmRDb2xvclxuICAgIGlmIChvcHRpb25zLm1haW5Db2xvckluZGV4IDwgY291bnQgLSAxKSB7XG4gICAgICByZXR1cm4gcmVzdWx0LmNvbmNhdChcbiAgICAgICAgbGluZWFyQ29sb3JHcmFkaWVudChjb3VudCAtIG9wdGlvbnMubWFpbkNvbG9ySW5kZXgsIHtcbiAgICAgICAgICBzdGFydENvbG9yOiBvcHRpb25zLm1haW5Db2xvcixcbiAgICAgICAgICBlbmRDb2xvcjogb3B0aW9ucy5lbmRDb2xvclxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGluZWFyQ29sb3JHcmFkaWVudChjb3VudDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPzogQ29sb3JHcmFkaWVudE9wdGlvbnMpOiBhbnlbXSB7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRnJvbSBbMCwxXVxuICBvcHRpb25zLnN0YXJ0Q29sb3IgPSBvcHRpb25zLnN0YXJ0Q29sb3IgfHwgWzI1NSwgMjU1LCAyNTVdOyAvLyBkZWZhdWx0IHN0YXJ0ID0gd2hpdGVcbiAgb3B0aW9ucy5lbmRDb2xvciA9IG9wdGlvbnMuZW5kQ29sb3IgfHwgWzI1NSwgMCwgMF07IC8vIGRlZmF1bHQgZW5kID0gcmVkXG5cbiAgY29uc3QgcmVzdWx0OiBudW1iZXJbXVtdID0gW107XG4gIGNvbnN0IGNvbG9yID0gb3B0aW9ucy5zdGFydENvbG9yLnNsaWNlKCk7IC8vIGNvcHkgdGhlIHN0YXJ0IGNvbG9yXG4gIGNvbnN0IGRlbHRhID0gW1xuICAgIE1hdGgucm91bmQoKG9wdGlvbnMuZW5kQ29sb3JbMF0gLSBvcHRpb25zLnN0YXJ0Q29sb3JbMF0pIC8gY291bnQpLFxuICAgIE1hdGgucm91bmQoKG9wdGlvbnMuZW5kQ29sb3JbMV0gLSBvcHRpb25zLnN0YXJ0Q29sb3JbMV0pIC8gY291bnQpLFxuICAgIE1hdGgucm91bmQoKG9wdGlvbnMuZW5kQ29sb3JbMl0gLSBvcHRpb25zLnN0YXJ0Q29sb3JbMl0pIC8gY291bnQpXG4gIF07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudCAtIDE7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICBjb2xvcltqXSArPSBkZWx0YVtqXTtcbiAgICB9XG4gICAgcmVzdWx0LnB1c2goY29sb3Iuc2xpY2UoKSk7XG4gIH1cblxuICAvLyBGb3JjZSBsYXN0IGNvbG9yID0gZW5kIGNvbG9yXG4gIHJlc3VsdC5wdXNoKG9wdGlvbnMuZW5kQ29sb3Iuc2xpY2UoKSk7XG5cbiAgLy8gT3V0cHV0IGFzIGFycmF5XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=
@@ -18883,10 +18883,6 @@ class Color {
18883
18883
  return null;
18884
18884
  return new Color([+parts[0], +parts[1], +parts[2]], parts.length === 4 && +parts[3] || 1, 'custom');
18885
18885
  }
18886
- static parseHexa(hexColor) {
18887
- const split = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexColor);
18888
- return new Color(split ? split.slice(1, 4).map(i => parseInt(i, 16)) : [0, 0, 0]);
18889
- }
18890
18886
  get name() {
18891
18887
  return this._name;
18892
18888
  }
@@ -18922,14 +18918,13 @@ Color.transparent = function () {
18922
18918
  // @dynamic
18923
18919
  class ColorScale {
18924
18920
  constructor(colorArray, options) {
18925
- this.colorArray = colorArray;
18926
18921
  options = options || {};
18927
18922
  // reserved last colors for value > max
18928
18923
  const nbIntervalBeforeUpper = !options.upperMax ? colorArray.length : (colorArray.length - 1);
18929
18924
  this._min = options.min || 0;
18930
18925
  this._max = options.max || nbIntervalBeforeUpper;
18931
18926
  this._rangeSize = Math.round((this._max - this._min) / nbIntervalBeforeUpper);
18932
- this._legendItems = this.computeLegend();
18927
+ this._legendItems = this.computeLegendItems(colorArray);
18933
18928
  }
18934
18929
  static default() {
18935
18930
  return ColorScale.custom(25);
@@ -18952,16 +18947,19 @@ class ColorScale {
18952
18947
  items: this._legendItems
18953
18948
  };
18954
18949
  }
18955
- getValueColor(value) {
18956
- const index = Math.floor(value * (this.colorArray.length - 1) / this._max);
18957
- return this.colorArray[index];
18950
+ getLegendForValue(value) {
18951
+ const index = Math.floor(value * (this._legendItems.length - 1) / this._max);
18952
+ return this._legendItems[index];
18953
+ }
18954
+ getLegendAtIndex(index) {
18955
+ return this._legendItems[index];
18958
18956
  }
18959
- computeLegend() {
18960
- return this.colorArray.map((color, index) => {
18957
+ computeLegendItems(colorArray) {
18958
+ return colorArray.map((color, index) => {
18961
18959
  const start = index * this._rangeSize;
18962
18960
  const end = start + this._rangeSize;
18963
18961
  return {
18964
- color,
18962
+ color: new Color(color),
18965
18963
  label: (end < this._max) ? `${start.toLocaleString()} - ${end.toLocaleString()}` : ` >= ${start}`
18966
18964
  };
18967
18965
  });
@@ -18970,12 +18968,10 @@ class ColorScale {
18970
18968
  ColorScale.custom = (count, options) => {
18971
18969
  options = options || {};
18972
18970
  return new ColorScale(linearColorGradientWithIntermediate(count, {
18973
- opacity: options.opacity,
18974
18971
  startColor: options.startColor || undefined,
18975
18972
  mainColor: options.mainColor || undefined,
18976
18973
  mainColorIndex: isNotNil(options.mainColorIndex) ? options.mainColorIndex : undefined,
18977
- endColor: options.endColor || undefined,
18978
- format: options.format
18974
+ endColor: options.endColor || undefined
18979
18975
  }), options);
18980
18976
  };
18981
18977
  // Fill colorsMap
@@ -18983,29 +18979,6 @@ Object.getOwnPropertyNames(rgbArrayMap)
18983
18979
  .forEach((key) => {
18984
18980
  colorsMap[key] = new Color(rgbArrayMap[key], 1, key);
18985
18981
  });
18986
- // Internal function
18987
- function state2side(state) {
18988
- switch (state) {
18989
- case 0:
18990
- return 0;
18991
- case 1:
18992
- return -1;
18993
- case 2:
18994
- return 0;
18995
- case 3:
18996
- return 1;
18997
- }
18998
- }
18999
- const ɵ0$b = (defaultStateSize) => [
19000
- Math.round((rgbArrayMap.red[0] - 50) / defaultStateSize),
19001
- Math.round((255 - rgbArrayMap.red[1]) / defaultStateSize),
19002
- Math.round((255 - rgbArrayMap.red[2]) / defaultStateSize)
19003
- ];
19004
- const SCALE_OPTIONS_DEFAULT = {
19005
- startColor: rgbArrayMap.red,
19006
- startStates: [0, 2, 3],
19007
- startStepsFn: ɵ0$b
19008
- };
19009
18982
  /**
19010
18983
  * Internal function, that create a colors scale, using iteration
19011
18984
  *
@@ -19018,34 +18991,26 @@ const SCALE_OPTIONS_DEFAULT = {
19018
18991
  function linearColorGradientWithIntermediate(count, options) {
19019
18992
  options = options || {};
19020
18993
  // From [0,1]
19021
- options.opacity = (options.opacity > 0 && options.opacity < 1) ? options.opacity : 1;
19022
18994
  options.startColor = options.startColor || [255, 255, 190]; // default start = creme
19023
18995
  options.mainColorIndex = options.mainColorIndex && options.mainColorIndex < count - 1 ? options.mainColorIndex : count - 1;
19024
18996
  options.endColor = options.endColor || [255, 0, 0]; // default main = red
19025
- options.format = options.format || 'rgb';
19026
18997
  if (!options.mainColor) {
19027
18998
  return linearColorGradient(count, {
19028
- opacity: options.opacity,
19029
18999
  startColor: options.startColor,
19030
- endColor: options.endColor,
19031
- format: options.format
19000
+ endColor: options.endColor
19032
19001
  });
19033
19002
  }
19034
19003
  else {
19035
19004
  // Step 1: startColor -> mainColor
19036
19005
  const result = linearColorGradient(options.mainColorIndex + 1, {
19037
- opacity: options.opacity,
19038
19006
  startColor: options.startColor,
19039
- endColor: options.mainColor,
19040
- format: options.format
19007
+ endColor: options.mainColor
19041
19008
  });
19042
19009
  // Step 2: mainColor -> endColor
19043
19010
  if (options.mainColorIndex < count - 1) {
19044
19011
  return result.concat(linearColorGradient(count - options.mainColorIndex, {
19045
- opacity: options.opacity,
19046
19012
  startColor: options.mainColor,
19047
- endColor: options.endColor,
19048
- format: options.format
19013
+ endColor: options.endColor
19049
19014
  }));
19050
19015
  }
19051
19016
  else {
@@ -19056,10 +19021,8 @@ function linearColorGradientWithIntermediate(count, options) {
19056
19021
  function linearColorGradient(count, options) {
19057
19022
  options = options || {};
19058
19023
  // From [0,1]
19059
- options.opacity = (options.opacity > 0 && options.opacity < 1) ? options.opacity : 1;
19060
19024
  options.startColor = options.startColor || [255, 255, 255]; // default start = white
19061
19025
  options.endColor = options.endColor || [255, 0, 0]; // default end = red
19062
- options.format = options.format || 'rgb';
19063
19026
  const result = [];
19064
19027
  const color = options.startColor.slice(); // copy the start color
19065
19028
  const delta = [
@@ -19076,23 +19039,6 @@ function linearColorGradient(count, options) {
19076
19039
  // Force last color = end color
19077
19040
  result.push(options.endColor.slice());
19078
19041
  // Output as array
19079
- if (options.format === 'array') {
19080
- return result;
19081
- }
19082
- // Output as rgb(r,g,b) string
19083
- if (options.format === 'rgb') {
19084
- if (options.opacity >= 1) {
19085
- return result.map(color => 'rgb(' + color.join(',') + ')');
19086
- }
19087
- else {
19088
- return result.map(color => 'rgba(' + color.concat(options.opacity).join(',') + ')');
19089
- }
19090
- }
19091
- // Output as hex
19092
- // TODO
19093
- // return result.map(color => {
19094
- // return "rgb(" + color.join(',') + ")";
19095
- // });
19096
19042
  return result;
19097
19043
  }
19098
19044
 
@@ -28362,7 +28308,7 @@ AdminModule.decorators = [
28362
28308
  ];
28363
28309
  AdminModule.ctorParameters = () => [];
28364
28310
 
28365
- const ɵ0$c = {
28311
+ const ɵ0$b = {
28366
28312
  profile: 'ADMIN'
28367
28313
  };
28368
28314
  const routes = [
@@ -28372,7 +28318,7 @@ const routes = [
28372
28318
  component: UsersPage,
28373
28319
  canActivate: [AuthGuardService],
28374
28320
  canDeactivate: [ComponentDirtyGuard],
28375
- data: ɵ0$c
28321
+ data: ɵ0$b
28376
28322
  }
28377
28323
  ];
28378
28324
  class AdminRoutingModule {