@datagrok-libraries/statistics 1.8.0 → 1.9.1

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.
@@ -1,6 +1,11 @@
1
+ /* eslint-disable max-len */
1
2
  import * as DG from 'datagrok-api/dg';
2
- import { FIT_FUNCTION_LINEAR, linear, FIT_FUNCTION_SIGMOID, sigmoid, FIT_FUNCTION_LOG_LINEAR, logLinear, FIT_FUNCTION_EXPONENTIAL, exponential, FIT_FUNCTION_4PL_REGRESSION, fourPLRegression, getAuc, getDetCoeff, } from './fit-curve';
3
+ import { FIT_FUNCTION_LINEAR, linear, FIT_FUNCTION_SIGMOID, sigmoid, FIT_FUNCTION_LOG_LINEAR, logLinear, FIT_FUNCTION_EXPONENTIAL, exponential, FIT_FUNCTION_4PL_REGRESSION, fourPLRegression, getAuc, getDetCoeff, FIT_JS_FUNCTION, FIT_FUNCTION_4PL_DOSE_RESPONSE, fourPLDoseResponse, DROPLINES, FitErrorModel, getFittedCurve, } from './fit-curve';
3
4
  import { fitSeries, getDataPoints } from './fit-data';
5
+ //@ts-ignore: no types
6
+ import * as jStat from 'jstat';
7
+ import { performNelderMeadOptimization } from './fitting-algorithm/optimizer';
8
+ import { NELDER_MEAD_DEFAULTS } from './fitting-algorithm/optimizer-nelder-mead';
4
9
  /** Class for the fit functions */
5
10
  export class FitFunction {
6
11
  }
@@ -10,6 +15,7 @@ export const FitFunctionTypes = {
10
15
  LOG_LINEAR: 'log-linear',
11
16
  EXPONENTIAL: 'exponential',
12
17
  FOUR_PL_REGRESSION: '4pl-regression',
18
+ FOUR_PL_DOSE_RESPONSE: '4pl-dose-response',
13
19
  };
14
20
  export class Fit {
15
21
  constructor(values, data) {
@@ -18,6 +24,14 @@ export class Fit {
18
24
  this.series = data;
19
25
  }
20
26
  }
27
+ export class JSFunctionFit extends Fit {
28
+ constructor(values, data) {
29
+ super(values, data);
30
+ }
31
+ get name() {
32
+ return FIT_JS_FUNCTION;
33
+ }
34
+ }
21
35
  class LinearFit extends Fit {
22
36
  get name() {
23
37
  return FIT_FUNCTION_LINEAR;
@@ -237,6 +251,44 @@ export class FourPLRegressionFunction extends FitFunction {
237
251
  return params;
238
252
  }
239
253
  }
254
+ export class FourPLDoseResponseFunction extends FourPLRegressionFunction {
255
+ get name() {
256
+ return FIT_FUNCTION_4PL_DOSE_RESPONSE;
257
+ }
258
+ get parameterNames() {
259
+ return ['Max', 'Hill', 'IC50', 'Min'];
260
+ }
261
+ y(params, x) {
262
+ return fourPLDoseResponse(params, x);
263
+ }
264
+ }
265
+ /** Class that implements user JS functions */
266
+ export class JsFunction extends FitFunction {
267
+ constructor(name, yFunc, getInitParamsFunc, parameterNames) {
268
+ super();
269
+ this._name = name;
270
+ this._parameterNames = parameterNames;
271
+ this.y = yFunc;
272
+ this.getInitialParameters = getInitParamsFunc;
273
+ }
274
+ fillParams(fitCurve, data) {
275
+ const params = new Float32Array(this._parameterNames.length);
276
+ params.set(fitCurve.parameters);
277
+ return new JSFunctionFit({ ...getAucAndRsquared(fitCurve.fittedCurve, getDataPoints(data)) }, data);
278
+ }
279
+ get name() {
280
+ return this._name;
281
+ }
282
+ get parameterNames() {
283
+ return this._parameterNames;
284
+ }
285
+ y(params, x) {
286
+ throw new Error('Not implemented');
287
+ }
288
+ getInitialParameters(x, y) {
289
+ throw new Error('Not implemented');
290
+ }
291
+ }
240
292
  // Object with fit functions
241
293
  export const fitFunctions = {
242
294
  'linear': new LinearFunction(),
@@ -244,6 +296,7 @@ export const fitFunctions = {
244
296
  'log-linear': new LogLinearFunction(),
245
297
  'exponential': new ExponentialFunction(),
246
298
  '4pl-regression': new FourPLRegressionFunction(),
299
+ '4pl-dose-response': new FourPLDoseResponseFunction(),
247
300
  };
248
301
  class FitFunctions {
249
302
  constructor(series) {
@@ -269,6 +322,9 @@ class FitFunctions {
269
322
  return fitFunctions[FIT_FUNCTION_4PL_REGRESSION]
270
323
  .fillParams(fitSeries(this.series, fitFunctions[FIT_FUNCTION_4PL_REGRESSION]), this.series);
271
324
  }
325
+ fourPLDoseResponse() {
326
+ return fitFunctions[FIT_FUNCTION_4PL_DOSE_RESPONSE].fillParams(fitSeries(this.series, fitFunctions[FIT_FUNCTION_4PL_DOSE_RESPONSE]), this.series);
327
+ }
272
328
  }
273
329
  export class FitSeries {
274
330
  constructor(points) {
@@ -276,11 +332,225 @@ export class FitSeries {
276
332
  this.fit = new FitFunctions(this);
277
333
  }
278
334
  }
279
- const series = new FitSeries([
280
- { 'x': 0, 'y': 0 },
281
- { 'x': 1, 'y': 0.5 },
282
- { 'x': 2, 'y': 1 },
283
- { 'x': 3, 'y': 10, 'outlier': true },
284
- { 'x': 4, 'y': 0 },
285
- ]);
286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LWZpdC1BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJuZXctZml0LUFQSS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsTUFBTSxFQUdOLG9CQUFvQixFQUNwQixPQUFPLEVBQ1AsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCx3QkFBd0IsRUFDeEIsV0FBVyxFQUNYLDJCQUEyQixFQUMzQixnQkFBZ0IsRUFNYSxNQUFNLEVBQUUsV0FBVyxHQUNqRCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUMsU0FBUyxFQUFFLGFBQWEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUdwRCxrQ0FBa0M7QUFDbEMsTUFBTSxPQUFnQixXQUFXO0NBTWhDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsa0JBQWtCLEVBQUUsZ0JBQWdCO0NBQzVCLENBQUM7QUFtQ1gsTUFBTSxPQUFnQixHQUFHO0lBT3ZCLFlBQXNCLE1BQVksRUFBRSxJQUFlO1FBQ2pELElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztDQUNGO0FBRUQsTUFBTSxTQUFVLFNBQVEsR0FBRztJQUl6QixJQUFJLElBQUk7UUFDTixPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7SUFFRCxZQUFZLE1BQWtCLEVBQUUsSUFBZTtRQUM3QyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDcEMsQ0FBQztDQUNGO0FBRUQsTUFBTSxZQUFhLFNBQVEsU0FBUztJQUNsQyxJQUFJLElBQUk7UUFDTixPQUFPLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQUVELE1BQU0sVUFBVyxTQUFRLEdBQUc7SUFNMUIsSUFBSSxJQUFJO1FBQ04sT0FBTyxvQkFBb0IsQ0FBQztJQUM5QixDQUFDO0lBRUQsWUFBWSxNQUFtQixFQUFFLElBQWU7UUFDOUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBRUQsTUFBTSxjQUFlLFNBQVEsR0FBRztJQUk5QixJQUFJLElBQUk7UUFDTixPQUFPLHdCQUF3QixDQUFDO0lBQ2xDLENBQUM7SUFFRCxZQUFZLE1BQXVCLEVBQUUsSUFBZTtRQUNsRCxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBRUQsTUFBTSxtQkFBb0IsU0FBUSxHQUFHO0lBTW5DLElBQUksSUFBSTtRQUNOLE9BQU8sMkJBQTJCLENBQUM7SUFDckMsQ0FBQztJQUVELFlBQVksTUFBNEIsRUFBRSxJQUFlO1FBQ3ZELEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUVELFNBQVMsaUJBQWlCLENBQUMsUUFBK0IsRUFBRSxJQUFnQztJQUMxRixPQUFPO1FBQ0wsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO1FBQzNCLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztLQUN0QyxDQUFDO0FBQ0osQ0FBQztBQUVELGdEQUFnRDtBQUNoRCxNQUFNLE9BQU8sY0FBZSxTQUFRLFdBQXNCO0lBQ3hELElBQUksSUFBSTtRQUNOLE9BQU8sbUJBQW1CLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxVQUFVLENBQUMsUUFBa0IsRUFBRSxJQUFlO1FBQzVDLE9BQU8sSUFBSSxTQUFTLENBQUM7WUFDbkIsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRCxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDN0IsU0FBUyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ2xDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsQ0FBQyxDQUFDLE1BQW9CLEVBQUUsQ0FBUztRQUMvQixPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELG9CQUFvQixDQUFDLENBQVcsRUFBRSxDQUFXO1FBQzNDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDcEIsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNmLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ3BCLFFBQVEsR0FBRyxDQUFDLENBQUM7U0FDaEI7UUFFRCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sT0FBTyxlQUFnQixTQUFRLFdBQXVCO0lBQzFELElBQUksSUFBSTtRQUNOLE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELFVBQVUsQ0FBQyxRQUFrQixFQUFFLElBQWU7UUFDNUMsT0FBTyxJQUFJLFVBQVUsQ0FBQztZQUNwQixHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9ELEdBQUcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUMvQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELENBQUMsQ0FBQyxNQUFvQixFQUFFLENBQVM7UUFDL0IsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxDQUFXLEVBQUUsQ0FBVztRQUMzQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUN2RSxJQUFJLFlBQVksR0FBRyxVQUFVLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDckQsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksZUFBZSxHQUFHLFlBQVksRUFBRTtnQkFDbEMsWUFBWSxHQUFHLGVBQWUsQ0FBQztnQkFDL0IsYUFBYSxHQUFHLENBQUMsQ0FBQzthQUNuQjtTQUNGO1FBQ0QsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5QyxvQ0FBb0M7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUFFRCw0REFBNEQ7QUFDNUQsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFdBQXlCO0lBQzlELElBQUksSUFBSTtRQUNOLE9BQU8sdUJBQXVCLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxVQUFVLENBQUMsUUFBa0IsRUFBRSxJQUFlO1FBQzVDLE9BQU8sSUFBSSxZQUFZLENBQUM7WUFDdEIsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRCxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDN0IsU0FBUyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ2xDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsQ0FBQyxDQUFDLE1BQW9CLEVBQUUsQ0FBUztRQUMvQixPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELG9CQUFvQixDQUFDLENBQVcsRUFBRSxDQUFXO1FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQUVELHFEQUFxRDtBQUNyRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsV0FBMkI7SUFDbEUsSUFBSSxJQUFJO1FBQ04sT0FBTyx3QkFBd0IsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFVBQVUsQ0FBQyxRQUFrQixFQUFFLElBQWU7UUFDNUMsT0FBTyxJQUFJLGNBQWMsQ0FBQztZQUN4QixHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9ELFFBQVEsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNoQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDOUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxDQUFDLENBQUMsTUFBb0IsRUFBRSxDQUFTO1FBQy9CLE9BQU8sV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsQ0FBVyxFQUFFLENBQVc7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxXQUFnQztJQUM1RSxJQUFJLElBQUk7UUFDTixPQUFPLDJCQUEyQixDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxVQUFVLENBQUMsUUFBa0IsRUFBRSxJQUFlO1FBQzVDLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQztZQUM3QixHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9ELEdBQUcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUMvQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELENBQUMsQ0FBQyxNQUFvQixFQUFFLENBQVM7UUFDL0IsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELG9CQUFvQixDQUFDLENBQVcsRUFBRSxDQUFXO1FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN6QyxJQUFJLFlBQVksR0FBRyxHQUFHLEdBQUUsTUFBTSxDQUFDO1FBQy9CLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUM5QyxJQUFJLGVBQWUsR0FBRyxZQUFZLEVBQUU7Z0JBQ2xDLFlBQVksR0FBRyxlQUFlLENBQUM7Z0JBQy9CLGFBQWEsR0FBRyxDQUFDLENBQUM7YUFDbkI7U0FDRjtRQUNELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5QixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdkMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBR0QsNEJBQTRCO0FBQzVCLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQixRQUFRLEVBQUUsSUFBSSxjQUFjLEVBQUU7SUFDOUIsU0FBUyxFQUFFLElBQUksZUFBZSxFQUFFO0lBQ2hDLFlBQVksRUFBRSxJQUFJLGlCQUFpQixFQUFFO0lBQ3JDLGFBQWEsRUFBRSxJQUFJLG1CQUFtQixFQUFFO0lBQ3hDLGdCQUFnQixFQUFFLElBQUksd0JBQXdCLEVBQUU7Q0FDakQsQ0FBQztBQUVGLE1BQU0sWUFBWTtJQUdoQixZQUFZLE1BQWlCO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxZQUFZLENBQUMsbUJBQW1CLENBQUM7YUFDckMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxZQUFZLENBQUMsdUJBQXVCLENBQUM7YUFDekMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxZQUFZLENBQUMsb0JBQW9CLENBQUM7YUFDdEMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxZQUFZLENBQUMsd0JBQXdCLENBQUM7YUFDMUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxZQUFZLENBQUMsMkJBQTJCLENBQUM7YUFDN0MsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hHLENBQUM7Q0FDRjtBQUdELE1BQU0sT0FBTyxTQUFTO0lBTXBCLFlBQVksTUFBbUI7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0NBc0JGO0FBR0QsTUFBTSxNQUFNLEdBQWMsSUFBSSxTQUFTLENBQUM7SUFDdEMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7SUFDaEIsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUM7SUFDbEIsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7SUFDaEIsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQztJQUNsQyxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBQztDQUNqQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHtcbiAgRklUX0ZVTkNUSU9OX0xJTkVBUixcbiAgbGluZWFyLFxuICBJRml0U2VyaWVzLFxuICBJRml0UG9pbnQsXG4gIEZJVF9GVU5DVElPTl9TSUdNT0lELFxuICBzaWdtb2lkLFxuICBGSVRfRlVOQ1RJT05fTE9HX0xJTkVBUixcbiAgbG9nTGluZWFyLFxuICBGSVRfRlVOQ1RJT05fRVhQT05FTlRJQUwsXG4gIGV4cG9uZW50aWFsLFxuICBGSVRfRlVOQ1RJT05fNFBMX1JFR1JFU1NJT04sXG4gIGZvdXJQTFJlZ3Jlc3Npb24sXG4gIElGaXRGdW5jdGlvbkRlc2NyaXB0aW9uLFxuICBGaXRQYXJhbUJvdW5kcyxcbiAgRml0TWFya2VyVHlwZSxcbiAgRml0T3V0bGllck1hcmtlclR5cGUsXG4gIEZpdExpbmVTdHlsZSxcbiAgRml0RXJyb3JNb2RlbFR5cGUsIEZpdEN1cnZlLCBnZXRBdWMsIGdldERldENvZWZmLFxufSBmcm9tICcuL2ZpdC1jdXJ2ZSc7XG5pbXBvcnQge2ZpdFNlcmllcywgZ2V0RGF0YVBvaW50c30gZnJvbSAnLi9maXQtZGF0YSc7XG5cblxuLyoqIENsYXNzIGZvciB0aGUgZml0IGZ1bmN0aW9ucyAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZpdEZ1bmN0aW9uPFQ+IHtcbiAgYWJzdHJhY3QgZ2V0IG5hbWUoKTogc3RyaW5nO1xuICBhYnN0cmFjdCBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW107XG4gIGFic3RyYWN0IGZpbGxQYXJhbXMoZml0Q3VydmU6IEZpdEN1cnZlLCBkYXRhOiBGaXRTZXJpZXMpOiBUO1xuICBhYnN0cmFjdCB5KHBhcmFtczogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIpOiBudW1iZXI7XG4gIGFic3RyYWN0IGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IEZsb2F0MzJBcnJheTtcbn1cblxuZXhwb3J0IGNvbnN0IEZpdEZ1bmN0aW9uVHlwZXMgPSB7XG4gIFNJR01PSUQ6ICdzaWdtb2lkJyxcbiAgTElORUFSOiAnbGluZWFyJyxcbiAgTE9HX0xJTkVBUjogJ2xvZy1saW5lYXInLFxuICBFWFBPTkVOVElBTDogJ2V4cG9uZW50aWFsJyxcbiAgRk9VUl9QTF9SRUdSRVNTSU9OOiAnNHBsLXJlZ3Jlc3Npb24nLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRml0RnVuY3Rpb25UeXBlID0gdHlwZW9mIEZpdEZ1bmN0aW9uVHlwZXNba2V5b2YgdHlwZW9mIEZpdEZ1bmN0aW9uVHlwZXNdO1xuXG5pbnRlcmZhY2UgSUZpdCB7XG4gIGF1YzogbnVtYmVyO1xuICByU3F1YXJlZDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSUxpbmVhckZpdCBleHRlbmRzIElGaXQge1xuICBzbG9wZTogbnVtYmVyO1xuICBpbnRlcmNlcHQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElMb2dMaW5lYXJGaXQgZXh0ZW5kcyBJTGluZWFyRml0IHt9XG5cbmludGVyZmFjZSBJU2lnbW9pZEZpdCBleHRlbmRzIElGaXQge1xuICB0b3A6IG51bWJlcjtcbiAgc2xvcGU6IG51bWJlcjtcbiAgaWM1MDogbnVtYmVyO1xuICBib3R0b206IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElFeHBvbmVudGlhbEZpdCBleHRlbmRzIElGaXQge1xuICBtYW50aXNzYTogbnVtYmVyO1xuICBwb3dlcjogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSUZvdXJQTFJlZ3Jlc3Npb25GaXQgZXh0ZW5kcyBJRml0IHtcbiAgdG9wOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xuICBzbG9wZTogbnVtYmVyO1xuICBlYzUwOiBudW1iZXI7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGaXQgaW1wbGVtZW50cyBJRml0IHtcbiAgYXVjOiBudW1iZXI7XG4gIHJTcXVhcmVkOiBudW1iZXI7XG4gIHNlcmllczogRml0U2VyaWVzO1xuXG4gIGFic3RyYWN0IGdldCBuYW1lKCk6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IodmFsdWVzOiBJRml0LCBkYXRhOiBGaXRTZXJpZXMpIHtcbiAgICB0aGlzLmF1YyA9IHZhbHVlcy5hdWM7XG4gICAgdGhpcy5yU3F1YXJlZCA9IHZhbHVlcy5yU3F1YXJlZDtcbiAgICB0aGlzLnNlcmllcyA9IGRhdGE7XG4gIH1cbn1cblxuY2xhc3MgTGluZWFyRml0IGV4dGVuZHMgRml0IGltcGxlbWVudHMgSUxpbmVhckZpdCB7XG4gIHNsb3BlOiBudW1iZXI7XG4gIGludGVyY2VwdDogbnVtYmVyO1xuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9MSU5FQVI7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2YWx1ZXM6IElMaW5lYXJGaXQsIGRhdGE6IEZpdFNlcmllcykge1xuICAgIHN1cGVyKHZhbHVlcywgZGF0YSk7XG4gICAgdGhpcy5zbG9wZSA9IHZhbHVlcy5zbG9wZTtcbiAgICB0aGlzLmludGVyY2VwdCA9IHZhbHVlcy5pbnRlcmNlcHQ7XG4gIH1cbn1cblxuY2xhc3MgTG9nTGluZWFyRml0IGV4dGVuZHMgTGluZWFyRml0IGltcGxlbWVudHMgSUxvZ0xpbmVhckZpdCB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9MT0dfTElORUFSO1xuICB9XG59XG5cbmNsYXNzIFNpZ21vaWRGaXQgZXh0ZW5kcyBGaXQgaW1wbGVtZW50cyBJU2lnbW9pZEZpdCB7XG4gIHRvcDogbnVtYmVyO1xuICBzbG9wZTogbnVtYmVyO1xuICBpYzUwOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9TSUdNT0lEO1xuICB9XG5cbiAgY29uc3RydWN0b3IodmFsdWVzOiBJU2lnbW9pZEZpdCwgZGF0YTogRml0U2VyaWVzKSB7XG4gICAgc3VwZXIodmFsdWVzLCBkYXRhKTtcbiAgICB0aGlzLnRvcCA9IHZhbHVlcy50b3A7XG4gICAgdGhpcy5zbG9wZSA9IHZhbHVlcy5zbG9wZTtcbiAgICB0aGlzLmljNTAgPSB2YWx1ZXMuaWM1MDtcbiAgICB0aGlzLmJvdHRvbSA9IHZhbHVlcy5ib3R0b207XG4gIH1cbn1cblxuY2xhc3MgRXhwb25lbnRpYWxGaXQgZXh0ZW5kcyBGaXQgaW1wbGVtZW50cyBJRXhwb25lbnRpYWxGaXQge1xuICBtYW50aXNzYTogbnVtYmVyO1xuICBwb3dlcjogbnVtYmVyO1xuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9FWFBPTkVOVElBTDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHZhbHVlczogSUV4cG9uZW50aWFsRml0LCBkYXRhOiBGaXRTZXJpZXMpIHtcbiAgICBzdXBlcih2YWx1ZXMsIGRhdGEpO1xuICAgIHRoaXMubWFudGlzc2EgPSB2YWx1ZXMubWFudGlzc2E7XG4gICAgdGhpcy5wb3dlciA9IHZhbHVlcy5wb3dlcjtcbiAgfVxufVxuXG5jbGFzcyBGb3VyUExSZWdyZXNzaW9uRml0IGV4dGVuZHMgRml0IGltcGxlbWVudHMgSUZvdXJQTFJlZ3Jlc3Npb25GaXQge1xuICB0b3A6IG51bWJlcjtcbiAgYm90dG9tOiBudW1iZXI7XG4gIHNsb3BlOiBudW1iZXI7XG4gIGVjNTA6IG51bWJlcjtcblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fNFBMX1JFR1JFU1NJT047XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2YWx1ZXM6IElGb3VyUExSZWdyZXNzaW9uRml0LCBkYXRhOiBGaXRTZXJpZXMpIHtcbiAgICBzdXBlcih2YWx1ZXMsIGRhdGEpO1xuICAgIHRoaXMudG9wID0gdmFsdWVzLnRvcDtcbiAgICB0aGlzLmJvdHRvbSA9IHZhbHVlcy5ib3R0b207XG4gICAgdGhpcy5zbG9wZSA9IHZhbHVlcy5zbG9wZTtcbiAgICB0aGlzLmVjNTAgPSB2YWx1ZXMuZWM1MDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZTogKHg6IG51bWJlcikgPT4gbnVtYmVyLCBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSk6IElGaXQge1xuICByZXR1cm4ge1xuICAgIGF1YzogZ2V0QXVjKGZpdEN1cnZlLCBkYXRhKSxcbiAgICByU3F1YXJlZDogZ2V0RGV0Q29lZmYoZml0Q3VydmUsIGRhdGEpLFxuICB9O1xufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBsaW5lYXIgZnVuY3Rpb24gKi9cbmV4cG9ydCBjbGFzcyBMaW5lYXJGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uPExpbmVhckZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fTElORUFSO1xuICB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydTbG9wZScsICdJbnRlcmNlcHQnXTtcbiAgfVxuXG4gIGZpbGxQYXJhbXMoZml0Q3VydmU6IEZpdEN1cnZlLCBkYXRhOiBGaXRTZXJpZXMpOiBMaW5lYXJGaXQge1xuICAgIHJldHVybiBuZXcgTGluZWFyRml0KHtcbiAgICAgIC4uLmdldEF1Y0FuZFJzcXVhcmVkKGZpdEN1cnZlLmZpdHRlZEN1cnZlLCBnZXREYXRhUG9pbnRzKGRhdGEpKSxcbiAgICAgIHNsb3BlOiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzBdLFxuICAgICAgaW50ZXJjZXB0OiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzFdLFxuICAgIH0sIGRhdGEpO1xuICB9XG5cbiAgeShwYXJhbXM6IEZsb2F0MzJBcnJheSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbGluZWFyKHBhcmFtcywgeCk7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBGbG9hdDMyQXJyYXkge1xuICAgIGxldCBtaW5JbmRleCA9IDA7XG4gICAgbGV0IG1heEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh4W2ldIDwgeFttaW5JbmRleF0pXG4gICAgICAgIG1pbkluZGV4ID0gaTtcbiAgICAgIGlmICh4W2ldID4geFttYXhJbmRleF0pXG4gICAgICAgIG1heEluZGV4ID0gaTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWx0YVggPSB4W21heEluZGV4XSAtIHhbbWluSW5kZXhdO1xuICAgIGNvbnN0IGRlbHRhWSA9IHlbbWF4SW5kZXhdIC0geVttaW5JbmRleF07XG4gICAgY29uc3QgQSA9IGRlbHRhWSAvIGRlbHRhWDtcbiAgICBjb25zdCBCID0geVttYXhJbmRleF0gLSBBICogeFttYXhJbmRleF07XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEZsb2F0MzJBcnJheSgyKTtcbiAgICBwYXJhbXMuc2V0KFtBLCBCXSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBzaWdtb2lkIGZ1bmN0aW9uICovXG5leHBvcnQgY2xhc3MgU2lnbW9pZEZ1bmN0aW9uIGV4dGVuZHMgRml0RnVuY3Rpb248U2lnbW9pZEZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fU0lHTU9JRDtcbiAgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnVG9wJywgJ1Nsb3BlJywgJ0lDNTAnLCAnQm90dG9tJ107XG4gIH1cblxuICBmaWxsUGFyYW1zKGZpdEN1cnZlOiBGaXRDdXJ2ZSwgZGF0YTogRml0U2VyaWVzKTogU2lnbW9pZEZpdCB7XG4gICAgcmV0dXJuIG5ldyBTaWdtb2lkRml0KHtcbiAgICAgIC4uLmdldEF1Y0FuZFJzcXVhcmVkKGZpdEN1cnZlLmZpdHRlZEN1cnZlLCBnZXREYXRhUG9pbnRzKGRhdGEpKSxcbiAgICAgIHRvcDogZml0Q3VydmUucGFyYW1ldGVyc1swXSxcbiAgICAgIHNsb3BlOiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzFdLFxuICAgICAgaWM1MDogZml0Q3VydmUucGFyYW1ldGVyc1syXSxcbiAgICAgIGJvdHRvbTogZml0Q3VydmUucGFyYW1ldGVyc1szXSxcbiAgICB9LCBkYXRhKTtcbiAgfVxuXG4gIHkocGFyYW1zOiBGbG9hdDMyQXJyYXksIHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHNpZ21vaWQocGFyYW1zLCB4KTtcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgZGF0YUJvdW5kcyA9IERHLlJlY3QuZnJvbVhZQXJyYXlzKHgsIHkpO1xuICAgIGNvbnN0IG1lZFkgPSAoZGF0YUJvdW5kcy5tYXhZIC0gZGF0YUJvdW5kcy5taW5ZKSAvIDIgKyBkYXRhQm91bmRzLm1pblk7XG4gICAgbGV0IG1heFlJbnRlcnZhbCA9IGRhdGFCb3VuZHMubWF4WSAtIGRhdGFCb3VuZHMubWluWTtcbiAgICBsZXQgbmVhcmVzdFhJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50SW50ZXJ2YWwgPSBNYXRoLmFicyh5W2ldIC0gbWVkWSk7XG4gICAgICBpZiAoY3VycmVudEludGVydmFsIDwgbWF4WUludGVydmFsKSB7XG4gICAgICAgIG1heFlJbnRlcnZhbCA9IGN1cnJlbnRJbnRlcnZhbDtcbiAgICAgICAgbmVhcmVzdFhJbmRleCA9IGk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHhBdE1lZFkgPSB4W25lYXJlc3RYSW5kZXhdO1xuICAgIGNvbnN0IHNsb3BlID0geVswXSA+IHlbeS5sZW5ndGggLSAxXSA/IDEgOiAtMTtcblxuICAgIC8vIHBhcmFtcyBhcmU6IFttYXgsIHRhbiwgSUM1MCwgbWluXVxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgcGFyYW1zLnNldChbZGF0YUJvdW5kcy5tYXhZLCBzbG9wZSwgeEF0TWVkWSwgZGF0YUJvdW5kcy5taW5ZXSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBsaW5lYXIgbG9nYXJpdGhtaWMgZnVuY3Rpb24gKi9cbmV4cG9ydCBjbGFzcyBMb2dMaW5lYXJGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uPExvZ0xpbmVhckZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fTE9HX0xJTkVBUjtcbiAgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnU2xvcGUnLCAnSW50ZXJjZXB0J107XG4gIH1cblxuICBmaWxsUGFyYW1zKGZpdEN1cnZlOiBGaXRDdXJ2ZSwgZGF0YTogRml0U2VyaWVzKTogTG9nTGluZWFyRml0IHtcbiAgICByZXR1cm4gbmV3IExvZ0xpbmVhckZpdCh7XG4gICAgICAuLi5nZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZS5maXR0ZWRDdXJ2ZSwgZ2V0RGF0YVBvaW50cyhkYXRhKSksXG4gICAgICBzbG9wZTogZml0Q3VydmUucGFyYW1ldGVyc1swXSxcbiAgICAgIGludGVyY2VwdDogZml0Q3VydmUucGFyYW1ldGVyc1sxXSxcbiAgICB9LCBkYXRhKTtcbiAgfVxuXG4gIHkocGFyYW1zOiBGbG9hdDMyQXJyYXksIHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGxvZ0xpbmVhcihwYXJhbXMsIHgpO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFBhcmFtZXRlcnMoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgRmxvYXQzMkFycmF5KDIpO1xuICAgIHBhcmFtcy5zZXQoWy01LCAxMDBdKTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG59XG5cbi8qKiBDbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGV4cG9uZW50aWFsIGZ1bmN0aW9uICovXG5leHBvcnQgY2xhc3MgRXhwb25lbnRpYWxGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uPEV4cG9uZW50aWFsRml0PiB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9FWFBPTkVOVElBTDtcbiAgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnTWFudGlzc2EnLCAnUG93ZXInXTtcbiAgfVxuXG4gIGZpbGxQYXJhbXMoZml0Q3VydmU6IEZpdEN1cnZlLCBkYXRhOiBGaXRTZXJpZXMpOiBFeHBvbmVudGlhbEZpdCB7XG4gICAgcmV0dXJuIG5ldyBFeHBvbmVudGlhbEZpdCh7XG4gICAgICAuLi5nZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZS5maXR0ZWRDdXJ2ZSwgZ2V0RGF0YVBvaW50cyhkYXRhKSksXG4gICAgICBtYW50aXNzYTogZml0Q3VydmUucGFyYW1ldGVyc1swXSxcbiAgICAgIHBvd2VyOiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzFdLFxuICAgIH0sIGRhdGEpO1xuICB9XG5cbiAgeShwYXJhbXM6IEZsb2F0MzJBcnJheSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZXhwb25lbnRpYWwocGFyYW1zLCB4KTtcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEZsb2F0MzJBcnJheSgyKTtcbiAgICBwYXJhbXMuc2V0KFsxMDAsIC0yXSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBGb3VyIFBhcmFtZXRlciBMb2dpc3RpYyBSZWdyZXNzaW9uIGZ1bmN0aW9uICovXG5leHBvcnQgY2xhc3MgRm91clBMUmVncmVzc2lvbkZ1bmN0aW9uIGV4dGVuZHMgRml0RnVuY3Rpb248Rm91clBMUmVncmVzc2lvbkZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fNFBMX1JFR1JFU1NJT047XG4gIH1cblxuICBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ1RvcCcsICdTbG9wZScsICdFQzUwJywgJ0JvdHRvbSddO1xuICB9XG5cbiAgZmlsbFBhcmFtcyhmaXRDdXJ2ZTogRml0Q3VydmUsIGRhdGE6IEZpdFNlcmllcyk6IEZvdXJQTFJlZ3Jlc3Npb25GaXQge1xuICAgIHJldHVybiBuZXcgRm91clBMUmVncmVzc2lvbkZpdCh7XG4gICAgICAuLi5nZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZS5maXR0ZWRDdXJ2ZSwgZ2V0RGF0YVBvaW50cyhkYXRhKSksXG4gICAgICB0b3A6IGZpdEN1cnZlLnBhcmFtZXRlcnNbMF0sXG4gICAgICBzbG9wZTogZml0Q3VydmUucGFyYW1ldGVyc1sxXSxcbiAgICAgIGVjNTA6IGZpdEN1cnZlLnBhcmFtZXRlcnNbMl0sXG4gICAgICBib3R0b206IGZpdEN1cnZlLnBhcmFtZXRlcnNbM10sXG4gICAgfSwgZGF0YSk7XG4gIH1cblxuICB5KHBhcmFtczogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBmb3VyUExSZWdyZXNzaW9uKHBhcmFtcywgeCk7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBGbG9hdDMyQXJyYXkge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgY29uc3QgYm90dG9tID0gTWF0aC5taW4oLi4ueSk7XG4gICAgY29uc3QgdG9wID0gTWF0aC5tYXgoLi4ueSk7XG4gICAgY29uc3QgbWVkWSA9ICh0b3AgLSBib3R0b20pIC8gMiArIGJvdHRvbTtcbiAgICBsZXQgbWF4WUludGVydmFsID0gdG9wIC1ib3R0b207XG4gICAgbGV0IG5lYXJlc3RYSW5kZXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY3VycmVudEludGVydmFsID0gTWF0aC5hYnMoeVtpXSAtIG1lZFkpO1xuICAgICAgaWYgKGN1cnJlbnRJbnRlcnZhbCA8IG1heFlJbnRlcnZhbCkge1xuICAgICAgICBtYXhZSW50ZXJ2YWwgPSBjdXJyZW50SW50ZXJ2YWw7XG4gICAgICAgIG5lYXJlc3RYSW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlYzUwID0geFtuZWFyZXN0WEluZGV4XTtcbiAgICBjb25zdCBzbG9wZSA9IHlbMF0gPiB5W3kubGVuZ3RoIC0gMV0/IC0xMCA6IDEwO1xuICAgIHBhcmFtcy5zZXQoW3RvcCwgc2xvcGUsIGVjNTAsIGJvdHRvbV0pO1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbn1cblxuXG4vLyBPYmplY3Qgd2l0aCBmaXQgZnVuY3Rpb25zXG5leHBvcnQgY29uc3QgZml0RnVuY3Rpb25zID0ge1xuICAnbGluZWFyJzogbmV3IExpbmVhckZ1bmN0aW9uKCksXG4gICdzaWdtb2lkJzogbmV3IFNpZ21vaWRGdW5jdGlvbigpLFxuICAnbG9nLWxpbmVhcic6IG5ldyBMb2dMaW5lYXJGdW5jdGlvbigpLFxuICAnZXhwb25lbnRpYWwnOiBuZXcgRXhwb25lbnRpYWxGdW5jdGlvbigpLFxuICAnNHBsLXJlZ3Jlc3Npb24nOiBuZXcgRm91clBMUmVncmVzc2lvbkZ1bmN0aW9uKCksXG59O1xuXG5jbGFzcyBGaXRGdW5jdGlvbnMge1xuICBzZXJpZXM6IEZpdFNlcmllcztcblxuICBjb25zdHJ1Y3RvcihzZXJpZXM6IEZpdFNlcmllcykge1xuICAgIHRoaXMuc2VyaWVzID0gc2VyaWVzO1xuICB9XG5cbiAgbGluZWFyKCk6IExpbmVhckZpdCB7XG4gICAgcmV0dXJuIGZpdEZ1bmN0aW9uc1tGSVRfRlVOQ1RJT05fTElORUFSXVxuICAgICAgLmZpbGxQYXJhbXMoZml0U2VyaWVzKHRoaXMuc2VyaWVzLCBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX0xJTkVBUl0pLCB0aGlzLnNlcmllcyk7XG4gIH1cblxuICBsb2dMaW5lYXIoKTogTG9nTGluZWFyRml0IHtcbiAgICByZXR1cm4gZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl9MT0dfTElORUFSXVxuICAgICAgLmZpbGxQYXJhbXMoZml0U2VyaWVzKHRoaXMuc2VyaWVzLCBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX0xPR19MSU5FQVJdKSwgdGhpcy5zZXJpZXMpO1xuICB9XG5cbiAgc2lnbW9pZCgpOiBTaWdtb2lkRml0IHtcbiAgICByZXR1cm4gZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl9TSUdNT0lEXVxuICAgICAgLmZpbGxQYXJhbXMoZml0U2VyaWVzKHRoaXMuc2VyaWVzLCBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX1NJR01PSURdKSwgdGhpcy5zZXJpZXMpO1xuICB9XG5cbiAgZXhwb25lbnRpYWwoKTogRXhwb25lbnRpYWxGaXQge1xuICAgIHJldHVybiBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX0VYUE9ORU5USUFMXVxuICAgICAgLmZpbGxQYXJhbXMoZml0U2VyaWVzKHRoaXMuc2VyaWVzLCBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX0VYUE9ORU5USUFMXSksIHRoaXMuc2VyaWVzKTtcbiAgfVxuXG4gIGZvdXJQTCgpOiBGb3VyUExSZWdyZXNzaW9uRml0IHtcbiAgICByZXR1cm4gZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl80UExfUkVHUkVTU0lPTl1cbiAgICAgIC5maWxsUGFyYW1zKGZpdFNlcmllcyh0aGlzLnNlcmllcywgZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl80UExfUkVHUkVTU0lPTl0pLCB0aGlzLnNlcmllcyk7XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgRml0U2VyaWVzIGltcGxlbWVudHMgSUZpdFNlcmllcyB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcblxuICBmaXQ6IEZpdEZ1bmN0aW9ucztcbiAgcG9pbnRzOiBJRml0UG9pbnRbXTtcblxuICBjb25zdHJ1Y3Rvcihwb2ludHM6IElGaXRQb2ludFtdKSB7XG4gICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG4gICAgdGhpcy5maXQgPSBuZXcgRml0RnVuY3Rpb25zKHRoaXMpO1xuICB9XG5cbiAgbmFtZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250cm9scyB0aGUgc2VyaWVzIG5hbWVcbiAgZml0RnVuY3Rpb24/OiBzdHJpbmcgfCBJRml0RnVuY3Rpb25EZXNjcmlwdGlvbjsgLy8gY29udHJvbHMgdGhlIHNlcmllcyBmaXQgZnVuY3Rpb25cbiAgcGFyYW1ldGVycz86IG51bWJlcltdOyAgICAgICAgICAgICAgICAvLyBjb250cm9scyB0aGUgc2VyaWVzIHBhcmFtZXRlcnMsIGF1dG8tZml0dGluZyB3aGVuIG5vdCBkZWZpbmVkXG4gIHBhcmFtZXRlckJvdW5kcz86IEZpdFBhcmFtQm91bmRzW107ICAgLy8gZGVmaW5lcyB0aGUgYWNjZXB0YWJsZSByYW5nZSBvZiBlYWNoIHBhcmFtZXRlciwgd2hpY2ggaXMgdGFrZW4gaW50byBhY2NvdW50IGR1cmluZyB0aGUgZml0dGluZy4gU2VlIGFsc28gYHBhcmFtZXRlcnNgLlxuICBtYXJrZXJUeXBlPzogRml0TWFya2VyVHlwZTsgICAgICAgICAgIC8vIGRlZmluZXMgdGhlIHNlcmllcyBtYXJrZXIgdHlwZVxuICBvdXRsaWVyTWFya2VyVHlwZT86IEZpdE91dGxpZXJNYXJrZXJUeXBlOyAgLy8gZGVmaW5lcyB0aGUgc2VyaWVzIG91dGxpZXIgbWFya2VyIHR5cGVcbiAgbGluZVN0eWxlPzogRml0TGluZVN0eWxlOyAgICAgICAgICAgICAvLyBkZWZpbmVzIHRoZSBzZXJpZXMgbGluZSBzdHlsZVxuICBwb2ludENvbG9yPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlcyB0aGUgc3RhbmRhcmRpemVkIHNlcmllcyBwb2ludCBjb2xvclxuICBmaXRMaW5lQ29sb3I/OiBzdHJpbmc7ICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlcyB0aGUgc3RhbmRhcmRpemVkIHNlcmllcyBmaXQgbGluZSBjb2xvclxuICBjb25maWRlbmNlSW50ZXJ2YWxDb2xvcj86IHN0cmluZzsgICAgIC8vIG92ZXJyaWRlcyB0aGUgc3RhbmRhcmRpemVkIHNlcmllcyBjb25maWRlbmNlIGludGVydmFsIGNvbG9yXG4gIG91dGxpZXJDb2xvcj86IHN0cmluZzsgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGVzIHRoZSBzdGFuZGFyZGl6ZWQgc2VyaWVzIG91dGxpZXIgY29sb3JcbiAgY29ubmVjdERvdHM/OiBib29sZWFuOyAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHdoZXRoZXIgdG8gY29ubmVjdCB0aGUgcG9pbnRzIHdpdGggbGluZXMgb3Igbm90LiBJZiB0cnVlIGFuZCBzaG93Rml0TGluZSBpcyBmYWxzZSAtIGZpdHRpbmcgaXMgZGlzYWJsZWQgLSBvdGhlcndpc2UsIGl0IHdpbGwgYmUgcmVuZGVyZWQgYWNjb3JkaW5nbHkgdG8gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgc2hvd0ZpdExpbmU/OiBib29sZWFuOyAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgZml0IGxpbmUgb3Igbm90XG4gIHNob3dQb2ludHM/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lcyB0aGUgZGF0YSBkaXNwbGF5IG1vZGVcbiAgc2hvd0N1cnZlQ29uZmlkZW5jZUludGVydmFsPzogYm9vbGVhbjsgICAgLy8gZGVmaW5lcyB3aGV0aGVyIHRvIHNob3cgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG9yIG5vdFxuICBlcnJvck1vZGVsPzogRml0RXJyb3JNb2RlbFR5cGU7ICAgICAgIC8vIGRlZmluZXMgdGhlIHNlcmllcyBlcnJvciBtb2RlbFxuICBjbGlja1RvVG9nZ2xlPzogYm9vbGVhbjsgICAgLy8gaWYgdHJ1ZSwgY2xpY2tpbmcgb24gdGhlIHBvaW50IHRvZ2dsZXMgaXRzIG91dGxpZXIgc3RhdHVzIGFuZCBjYXVzZXMgY3VydmUgcmVmaXR0aW5nXG4gIGxhYmVscz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFufTsgLy8gY29udHJvbGxlZCBieSBJRml0Q2hhcnREYXRhIGxhYmVsT3B0aW9ucywgc2hvd3MgbGFiZWxzXG4gIGRyb3BsaW5lcz86IHN0cmluZ1tdOyAgICAgICAgICAgICAgICAgLy8gZGVmaW5lcyB0aGUgZHJvcGxpbmVzIHRoYXQgd291bGQgYmUgc2hvd24gb24gdGhlIHBsb3QgKElDNTApXG4gIGNvbHVtbk5hbWU/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lcyB0aGUgY29sdW1uIG5hbWUgd2hlcmUgdGhlIHNlcmllcyBpcyBzdG9yZWRcbn1cblxuXG5jb25zdCBzZXJpZXM6IEZpdFNlcmllcyA9IG5ldyBGaXRTZXJpZXMoW1xuICB7J3gnOiAwLCAneSc6IDB9LFxuICB7J3gnOiAxLCAneSc6IDAuNX0sXG4gIHsneCc6IDIsICd5JzogMX0sXG4gIHsneCc6IDMsICd5JzogMTAsICdvdXRsaWVyJzogdHJ1ZX0sXG4gIHsneCc6IDQsICd5JzogMH0sXG5dKTtcbiJdfQ==
335
+ /** Properties that describe {@link IFitSeriesOptions}. Useful for editing, initialization, transformations, etc. */
336
+ export const fitSeriesProperties = [
337
+ DG.Property.js('fitFunction', DG.TYPE.STRING, { category: 'Fitting', choices: Object.keys(fitFunctions), defaultValue: 'sigmoid' }),
338
+ DG.Property.js('pointColor', DG.TYPE.STRING, { category: 'Rendering', nullable: true, inputType: 'Color' }),
339
+ DG.Property.js('fitLineColor', DG.TYPE.STRING, { category: 'Rendering', nullable: true, inputType: 'Color' }),
340
+ DG.Property.js('outlierColor', DG.TYPE.STRING, { category: 'Rendering', nullable: true, inputType: 'Color' }),
341
+ DG.Property.js('errorModel', DG.TYPE.STRING, { category: 'Fitting', defaultValue: 'constant',
342
+ choices: ['constant', 'proportional', 'combined'], nullable: false }),
343
+ DG.Property.js('connectDots', DG.TYPE.BOOL, { category: 'Fitting', defaultValue: false }),
344
+ DG.Property.js('clickToToggle', DG.TYPE.BOOL, { category: 'Fitting', description: 'Click on a point to mark it as outlier and refit', nullable: true, defaultValue: false }),
345
+ DG.Property.js('showFitLine', DG.TYPE.BOOL, { category: 'Fitting', defaultValue: true }),
346
+ DG.Property.js('showPoints', DG.TYPE.STRING, // rewrite description
347
+ { category: 'Fitting', description: 'Whether points/candlesticks/none should be rendered',
348
+ defaultValue: 'points', choices: ['points', 'candlesticks', 'both'] }),
349
+ DG.Property.js('showCurveConfidenceInterval', DG.TYPE.BOOL, { category: 'Fitting', description: 'Whether confidence intervals should be rendered', defaultValue: false,
350
+ //@ts-ignore
351
+ friendlyName: 'Confidence Interval' }),
352
+ DG.Property.js('markerType', DG.TYPE.STRING, { category: 'Rendering', defaultValue: 'circle',
353
+ choices: ['asterisk', 'circle', 'cross border', 'diamond', 'square', 'star',
354
+ 'triangle bottom', 'triangle left', 'triangle right', 'triangle top'], nullable: false,
355
+ //@ts-ignore
356
+ friendlyName: 'Marker' }),
357
+ DG.Property.js('outlierMarkerType', DG.TYPE.STRING, { category: 'Rendering', defaultValue: 'outlier',
358
+ choices: ['asterisk', 'circle', 'cross border', 'diamond', 'outlier', 'square', 'star',
359
+ 'triangle bottom', 'triangle left', 'triangle right', 'triangle top'], nullable: false,
360
+ //@ts-ignore
361
+ friendlyName: 'Outlier Marker' }),
362
+ DG.Property.js('lineStyle', DG.TYPE.STRING, { category: 'Rendering', defaultValue: 'solid',
363
+ choices: ['solid', 'dotted', 'dashed', 'dashdotted'], nullable: false }),
364
+ DG.Property.js('droplines', DG.TYPE.STRING_LIST, { description: 'Whether specific droplines should be rendered',
365
+ choices: DROPLINES, inputType: 'MultiChoice' }),
366
+ DG.Property.js('columnName', DG.TYPE.STRING, { description: 'Column name where the series is stored', defaultValue: '' }),
367
+ ];
368
+ export function getOrCreateFitFunction(seriesFitFunc) {
369
+ if (typeof seriesFitFunc === 'string')
370
+ return fitFunctions[seriesFitFunc];
371
+ else if (!fitFunctions[seriesFitFunc.name]) {
372
+ const name = seriesFitFunc.name;
373
+ const paramNames = seriesFitFunc.parameterNames;
374
+ const fitFunctionParts = seriesFitFunc.function.split('=>').map((elem) => elem.trim());
375
+ const getInitParamsParts = seriesFitFunc.getInitialParameters.split('=>').map((elem) => elem.trim());
376
+ const fitFunction = new Function(fitFunctionParts[0].slice(1, fitFunctionParts[0].length - 1), `${fitFunctionParts[1].includes(';') ? '' : 'return '}${fitFunctionParts[1]}`);
377
+ const getInitParamsFunc = new Function(getInitParamsParts[0].slice(1, getInitParamsParts[0].length - 1), `return ${getInitParamsParts[1]}`);
378
+ const fitFunc = new JsFunction(name, fitFunction, getInitParamsFunc, paramNames);
379
+ fitFunctions[name] = fitFunc;
380
+ }
381
+ return fitFunctions[seriesFitFunc.name];
382
+ }
383
+ export function fitData(data, fitFunction, errorModel, parameterBounds) {
384
+ errorModel !== null && errorModel !== void 0 ? errorModel : (errorModel = FitErrorModel.CONSTANT);
385
+ const curveFunction = fitFunction.y;
386
+ let paramValues = fitFunction.getInitialParameters(data.x, data.y);
387
+ const of = objectiveFactory(curveFunction, data, errorModel);
388
+ const bottomParamBounds = new Float32Array(fitFunction.parameterNames.length);
389
+ const topParamBounds = new Float32Array(fitFunction.parameterNames.length);
390
+ for (let i = 0; i < fitFunction.parameterNames.length; i++) {
391
+ bottomParamBounds[i] = paramValues[i] === 0 ? -1 : paramValues[i] - Math.abs(paramValues[i] * 0.5);
392
+ topParamBounds[i] = paramValues[i] === 0 ? 1 : paramValues[i] + Math.abs(paramValues[i] * 0.5);
393
+ }
394
+ const parameterBoundsBitset = DG.BitSet.create(fitFunction.parameterNames.length * 2);
395
+ if (parameterBounds && parameterBounds.length !== 0) {
396
+ for (let i = 0; i < parameterBounds.length; i++) {
397
+ if (parameterBounds[i].min !== undefined && parameterBounds[i].min !== null) {
398
+ bottomParamBounds[i] = parameterBounds[i].min;
399
+ parameterBoundsBitset.set(i * 2, true);
400
+ }
401
+ if (parameterBounds[i].max !== undefined && parameterBounds[i].max !== null) {
402
+ topParamBounds[i] = parameterBounds[i].max;
403
+ parameterBoundsBitset.set(i * 2 + 1, true);
404
+ }
405
+ }
406
+ }
407
+ const getConsistency = (extremum) => {
408
+ const residuals = of(extremum.point).residuals;
409
+ let q1q4 = 0;
410
+ let q2q3 = 0;
411
+ // TODO: rewrite quartiles to a better condition
412
+ for (let i = 0; i < residuals.length; i++) {
413
+ if (residuals.length / 4 > i)
414
+ q1q4 += Math.pow(residuals[i], 2);
415
+ else if (3 * residuals.length / 4 > i)
416
+ q2q3 += Math.pow(residuals[i], 2);
417
+ else
418
+ q1q4 += Math.pow(residuals[i], 2);
419
+ }
420
+ return q1q4 / q2q3;
421
+ };
422
+ let iter = -1;
423
+ let continueOptimization = 0;
424
+ let statistics = null;
425
+ let optimization;
426
+ let minIdx = 0;
427
+ do {
428
+ optimization = performNelderMeadOptimization(of, bottomParamBounds, topParamBounds, {
429
+ tolerance: NELDER_MEAD_DEFAULTS.TOLERANCE,
430
+ maxIter: NELDER_MEAD_DEFAULTS.MAX_ITER,
431
+ nonZeroParam: NELDER_MEAD_DEFAULTS.NON_ZERO_PARAM,
432
+ initialScale: NELDER_MEAD_DEFAULTS.INITIAL_SCALE,
433
+ scaleReflection: NELDER_MEAD_DEFAULTS.SCALE_REFLECTION,
434
+ scaleExpansion: NELDER_MEAD_DEFAULTS.SCALE_EXPANSION,
435
+ scaleContraction: NELDER_MEAD_DEFAULTS.SCALE_CONTRACTION,
436
+ }, 10, paramValues);
437
+ minIdx = 0;
438
+ for (let i = 1; i < optimization.extremums.length; i++) {
439
+ if (optimization.extremums[i].cost < optimization.extremums[minIdx].cost)
440
+ minIdx = i;
441
+ }
442
+ const newStatistics = getConsistency(optimization.extremums[minIdx]);
443
+ if (statistics === null)
444
+ statistics = newStatistics;
445
+ else if (newStatistics < statistics) {
446
+ statistics = newStatistics;
447
+ continueOptimization = 0;
448
+ }
449
+ else
450
+ continueOptimization++;
451
+ paramValues = optimization.extremums[minIdx].point;
452
+ if (iter > 40 || continueOptimization === 3)
453
+ break;
454
+ for (let i = 0; i < fitFunction.parameterNames.length; i++) {
455
+ if (!parameterBoundsBitset.get(i * 2))
456
+ bottomParamBounds[i] = paramValues[i] - Math.abs(paramValues[i] * (continueOptimization + 0.5));
457
+ if (!parameterBoundsBitset.get(i * 2 + 1))
458
+ topParamBounds[i] = paramValues[i] + Math.abs(paramValues[i] * (continueOptimization + 0.5));
459
+ }
460
+ iter++;
461
+ } while (true);
462
+ const fittedCurve = getFittedCurve(curveFunction, paramValues);
463
+ return {
464
+ fittedCurve: fittedCurve,
465
+ parameters: paramValues,
466
+ };
467
+ }
468
+ function objectiveFactory(targetFunc, data, errorModel) {
469
+ return (params) => {
470
+ let likelihood = 0;
471
+ let sigmaA = 0;
472
+ let sigmaB = 0;
473
+ const obs = data.y;
474
+ const pred = data.x.map((x) => targetFunc(params, x));
475
+ const residuals = obs.map((obs, i) => obs - pred[i]);
476
+ const residuesSquares = residuals.map((res) => Math.pow(res, 2));
477
+ for (let i = 0; i < residuesSquares.length; i++) {
478
+ if ([FitErrorModel.CONSTANT, FitErrorModel.COMBINED].includes(errorModel))
479
+ sigmaA += residuesSquares[i];
480
+ else if (errorModel === FitErrorModel.PROPORTIONAL)
481
+ sigmaB += residuesSquares[i] / (pred[i] * pred[i]);
482
+ }
483
+ sigmaA = Math.sqrt(sigmaA / residuesSquares.length);
484
+ sigmaB = Math.sqrt(sigmaB / residuesSquares.length);
485
+ if (errorModel === FitErrorModel.COMBINED)
486
+ ({ sigmaA, sigmaB } = getSigmasForCombinedErrorModel(sigmaA, sigmaB, residuesSquares, pred));
487
+ const sigmaSqI = [];
488
+ for (let i = 0; i < residuesSquares.length; i++) {
489
+ sigmaSqI[i] = Math.pow(sigmaA + sigmaB * pred[i], 2);
490
+ likelihood += residuesSquares[i] / sigmaSqI[i] + Math.log(2 * Math.PI * sigmaSqI[i]);
491
+ }
492
+ return { likelihood, residuals };
493
+ };
494
+ }
495
+ function getSigma(targetFunc, data, errorModel, params) {
496
+ let sigmaA = 0;
497
+ let sigmaB = 0;
498
+ const obs = data.y;
499
+ const pred = data.x.map((x) => targetFunc(params, x));
500
+ const residuals = obs.map((obs, i) => obs - pred[i]);
501
+ const residuesSquares = residuals.map((res) => Math.pow(res, 2));
502
+ for (let i = 0; i < residuesSquares.length; i++) {
503
+ if ([FitErrorModel.CONSTANT, FitErrorModel.COMBINED].includes(errorModel))
504
+ sigmaA += residuesSquares[i];
505
+ else if (errorModel === FitErrorModel.PROPORTIONAL)
506
+ sigmaB += Math.pow(residuals[i] / Math.abs(pred[i]), 2);
507
+ }
508
+ sigmaA = Math.sqrt(sigmaA / residuesSquares.length);
509
+ sigmaB = Math.sqrt(sigmaB / residuesSquares.length);
510
+ if (errorModel === FitErrorModel.COMBINED)
511
+ ({ sigmaA, sigmaB } = getSigmasForCombinedErrorModel(sigmaA, sigmaB, residuesSquares, pred));
512
+ return { sigmaA, sigmaB };
513
+ }
514
+ function getSigmasForCombinedErrorModel(sigmaA, sigmaB, residuesSquares, pred) {
515
+ let likelihoodCombined = Number.MAX_VALUE;
516
+ let finalProportion = 0;
517
+ for (let i = 0; i <= 10; i++) {
518
+ let likelihoodCombinedLocal = 0;
519
+ const proportion = i / 10;
520
+ const sigmaACombined = sigmaA * proportion;
521
+ const sigmaBCombined = sigmaA * (1 - proportion);
522
+ const sigmaSqICombined = [];
523
+ for (let j = 0; j < residuesSquares.length; j++) {
524
+ sigmaSqICombined[j] = Math.pow(sigmaACombined + sigmaBCombined * pred[j], 2);
525
+ likelihoodCombinedLocal += residuesSquares[j] / sigmaSqICombined[j] + Math.log(2 * Math.PI * sigmaSqICombined[j]);
526
+ }
527
+ if (likelihoodCombinedLocal < likelihoodCombined) {
528
+ likelihoodCombined = likelihoodCombinedLocal;
529
+ finalProportion = proportion;
530
+ }
531
+ }
532
+ sigmaB = sigmaA * (1 - finalProportion);
533
+ sigmaA = sigmaA * finalProportion;
534
+ return { sigmaA, sigmaB };
535
+ }
536
+ export function getCurveConfidenceIntervals(data, paramValues, curveFunction, confidenceLevel = 0.05, errorModel) {
537
+ const error = getSigma(curveFunction, data, errorModel, paramValues);
538
+ const quantile = jStat.normal.inv(1 - confidenceLevel / 2, 0, 1);
539
+ const top = (x) => {
540
+ const value = curveFunction(paramValues, x);
541
+ return value + quantile * (error.sigmaA + Math.abs(value) * error.sigmaB);
542
+ };
543
+ const bottom = (x) => {
544
+ const value = curveFunction(paramValues, x);
545
+ return value - quantile * (error.sigmaA + Math.abs(value) * error.sigmaB);
546
+ };
547
+ return { confidenceTop: top, confidenceBottom: bottom };
548
+ }
549
+ // const series: FitSeries = new FitSeries([
550
+ // {'x': 0, 'y': 0},
551
+ // {'x': 1, 'y': 0.5},
552
+ // {'x': 2, 'y': 1},
553
+ // {'x': 3, 'y': 10, 'outlier': true},
554
+ // {'x': 4, 'y': 0},
555
+ // ]);
556
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LWZpdC1BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJuZXctZml0LUFQSS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLE1BQU0sRUFHTixvQkFBb0IsRUFDcEIsT0FBTyxFQUNQLHVCQUF1QixFQUN2QixTQUFTLEVBQ1Qsd0JBQXdCLEVBQ3hCLFdBQVcsRUFDWCwyQkFBMkIsRUFDM0IsZ0JBQWdCLEVBTWEsTUFBTSxFQUFFLFdBQVcsRUFDaEQsZUFBZSxFQUNmLDhCQUE4QixFQUM5QixrQkFBa0IsRUFDbEIsU0FBUyxFQUNULGFBQWEsRUFFYixjQUFjLEdBQ2YsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEQsc0JBQXNCO0FBQ3RCLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRS9CLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBRy9FLGtDQUFrQztBQUNsQyxNQUFNLE9BQWdCLFdBQVc7Q0FNaEM7QUFFRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixPQUFPLEVBQUUsU0FBUztJQUNsQixNQUFNLEVBQUUsUUFBUTtJQUNoQixVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsYUFBYTtJQUMxQixrQkFBa0IsRUFBRSxnQkFBZ0I7SUFDcEMscUJBQXFCLEVBQUUsbUJBQW1CO0NBQ2xDLENBQUM7QUFtQ1gsTUFBTSxPQUFnQixHQUFHO0lBT3ZCLFlBQXNCLE1BQVksRUFBRSxJQUFlO1FBQ2pELElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUN0QixJ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SUFFRixPQUFPLEVBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUMsQ0FBQztBQUN4RCxDQUFDO0FBR0QsNENBQTRDO0FBQzVDLHNCQUFzQjtBQUN0Qix3QkFBd0I7QUFDeEIsc0JBQXNCO0FBQ3RCLHdDQUF3QztBQUN4QyxzQkFBc0I7QUFDdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQge1xuICBGSVRfRlVOQ1RJT05fTElORUFSLFxuICBsaW5lYXIsXG4gIElGaXRTZXJpZXMsXG4gIElGaXRQb2ludCxcbiAgRklUX0ZVTkNUSU9OX1NJR01PSUQsXG4gIHNpZ21vaWQsXG4gIEZJVF9GVU5DVElPTl9MT0dfTElORUFSLFxuICBsb2dMaW5lYXIsXG4gIEZJVF9GVU5DVElPTl9FWFBPTkVOVElBTCxcbiAgZXhwb25lbnRpYWwsXG4gIEZJVF9GVU5DVElPTl80UExfUkVHUkVTU0lPTixcbiAgZm91clBMUmVncmVzc2lvbixcbiAgSUZpdEZ1bmN0aW9uRGVzY3JpcHRpb24sXG4gIEZpdFBhcmFtQm91bmRzLFxuICBGaXRNYXJrZXJUeXBlLFxuICBGaXRPdXRsaWVyTWFya2VyVHlwZSxcbiAgRml0TGluZVN0eWxlLFxuICBGaXRFcnJvck1vZGVsVHlwZSwgRml0Q3VydmUsIGdldEF1YywgZ2V0RGV0Q29lZmYsXG4gIEZJVF9KU19GVU5DVElPTixcbiAgRklUX0ZVTkNUSU9OXzRQTF9ET1NFX1JFU1BPTlNFLFxuICBmb3VyUExEb3NlUmVzcG9uc2UsXG4gIERST1BMSU5FUyxcbiAgRml0RXJyb3JNb2RlbCxcbiAgRml0Q29uZmlkZW5jZUludGVydmFscyxcbiAgZ2V0Rml0dGVkQ3VydmUsXG59IGZyb20gJy4vZml0LWN1cnZlJztcbmltcG9ydCB7Zml0U2VyaWVzLCBnZXREYXRhUG9pbnRzfSBmcm9tICcuL2ZpdC1kYXRhJztcbi8vQHRzLWlnbm9yZTogbm8gdHlwZXNcbmltcG9ydCAqIGFzIGpTdGF0IGZyb20gJ2pzdGF0JztcbmltcG9ydCB7RXh0cmVtdW0sIE9wdGltaXphdGlvblJlc3VsdH0gZnJvbSAnLi9maXR0aW5nLWFsZ29yaXRobS9vcHRpbWl6ZXItbWlzYyc7XG5pbXBvcnQge3BlcmZvcm1OZWxkZXJNZWFkT3B0aW1pemF0aW9ufSBmcm9tICcuL2ZpdHRpbmctYWxnb3JpdGhtL29wdGltaXplcic7XG5pbXBvcnQge05FTERFUl9NRUFEX0RFRkFVTFRTfSBmcm9tICcuL2ZpdHRpbmctYWxnb3JpdGhtL29wdGltaXplci1uZWxkZXItbWVhZCc7XG5cblxuLyoqIENsYXNzIGZvciB0aGUgZml0IGZ1bmN0aW9ucyAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZpdEZ1bmN0aW9uPFQgPSBGaXQ+IHtcbiAgYWJzdHJhY3QgZ2V0IG5hbWUoKTogc3RyaW5nO1xuICBhYnN0cmFjdCBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW107XG4gIGFic3RyYWN0IGZpbGxQYXJhbXMoZml0Q3VydmU6IEZpdEN1cnZlLCBkYXRhOiBGaXRTZXJpZXMpOiBUO1xuICBhYnN0cmFjdCB5KHBhcmFtczogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIpOiBudW1iZXI7XG4gIGFic3RyYWN0IGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IEZsb2F0MzJBcnJheTtcbn1cblxuZXhwb3J0IGNvbnN0IEZpdEZ1bmN0aW9uVHlwZXMgPSB7XG4gIFNJR01PSUQ6ICdzaWdtb2lkJyxcbiAgTElORUFSOiAnbGluZWFyJyxcbiAgTE9HX0xJTkVBUjogJ2xvZy1saW5lYXInLFxuICBFWFBPTkVOVElBTDogJ2V4cG9uZW50aWFsJyxcbiAgRk9VUl9QTF9SRUdSRVNTSU9OOiAnNHBsLXJlZ3Jlc3Npb24nLFxuICBGT1VSX1BMX0RPU0VfUkVTUE9OU0U6ICc0cGwtZG9zZS1yZXNwb25zZScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBGaXRGdW5jdGlvblR5cGUgPSB0eXBlb2YgRml0RnVuY3Rpb25UeXBlc1trZXlvZiB0eXBlb2YgRml0RnVuY3Rpb25UeXBlc107XG5cbmludGVyZmFjZSBJRml0IHtcbiAgYXVjOiBudW1iZXI7XG4gIHJTcXVhcmVkOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBJTGluZWFyRml0IGV4dGVuZHMgSUZpdCB7XG4gIHNsb3BlOiBudW1iZXI7XG4gIGludGVyY2VwdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSUxvZ0xpbmVhckZpdCBleHRlbmRzIElMaW5lYXJGaXQge31cblxuaW50ZXJmYWNlIElTaWdtb2lkRml0IGV4dGVuZHMgSUZpdCB7XG4gIHRvcDogbnVtYmVyO1xuICBzbG9wZTogbnVtYmVyO1xuICBpYzUwOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSUV4cG9uZW50aWFsRml0IGV4dGVuZHMgSUZpdCB7XG4gIG1hbnRpc3NhOiBudW1iZXI7XG4gIHBvd2VyOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBJRm91clBMUmVncmVzc2lvbkZpdCBleHRlbmRzIElGaXQge1xuICB0b3A6IG51bWJlcjtcbiAgYm90dG9tOiBudW1iZXI7XG4gIHNsb3BlOiBudW1iZXI7XG4gIGVjNTA6IG51bWJlcjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZpdCBpbXBsZW1lbnRzIElGaXQge1xuICBhdWM6IG51bWJlcjtcbiAgclNxdWFyZWQ6IG51bWJlcjtcbiAgc2VyaWVzOiBGaXRTZXJpZXM7XG5cbiAgYWJzdHJhY3QgZ2V0IG5hbWUoKTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih2YWx1ZXM6IElGaXQsIGRhdGE6IEZpdFNlcmllcykge1xuICAgIHRoaXMuYXVjID0gdmFsdWVzLmF1YztcbiAgICB0aGlzLnJTcXVhcmVkID0gdmFsdWVzLnJTcXVhcmVkO1xuICAgIHRoaXMuc2VyaWVzID0gZGF0YTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSlNGdW5jdGlvbkZpdCBleHRlbmRzIEZpdCB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlczogSUZpdCwgZGF0YTogRml0U2VyaWVzKSB7XG4gICAgc3VwZXIodmFsdWVzLCBkYXRhKTtcbiAgfVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfSlNfRlVOQ1RJT047XG4gIH1cbn1cblxuY2xhc3MgTGluZWFyRml0IGV4dGVuZHMgRml0IGltcGxlbWVudHMgSUxpbmVhckZpdCB7XG4gIHNsb3BlOiBudW1iZXI7XG4gIGludGVyY2VwdDogbnVtYmVyO1xuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9MSU5FQVI7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2YWx1ZXM6IElMaW5lYXJGaXQsIGRhdGE6IEZpdFNlcmllcykge1xuICAgIHN1cGVyKHZhbHVlcywgZGF0YSk7XG4gICAgdGhpcy5zbG9wZSA9IHZhbHVlcy5zbG9wZTtcbiAgICB0aGlzLmludGVyY2VwdCA9IHZhbHVlcy5pbnRlcmNlcHQ7XG4gIH1cbn1cblxuY2xhc3MgTG9nTGluZWFyRml0IGV4dGVuZHMgTGluZWFyRml0IGltcGxlbWVudHMgSUxvZ0xpbmVhckZpdCB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9MT0dfTElORUFSO1xuICB9XG59XG5cbmNsYXNzIFNpZ21vaWRGaXQgZXh0ZW5kcyBGaXQgaW1wbGVtZW50cyBJU2lnbW9pZEZpdCB7XG4gIHRvcDogbnVtYmVyO1xuICBzbG9wZTogbnVtYmVyO1xuICBpYzUwOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9TSUdNT0lEO1xuICB9XG5cbiAgY29uc3RydWN0b3IodmFsdWVzOiBJU2lnbW9pZEZpdCwgZGF0YTogRml0U2VyaWVzKSB7XG4gICAgc3VwZXIodmFsdWVzLCBkYXRhKTtcbiAgICB0aGlzLnRvcCA9IHZhbHVlcy50b3A7XG4gICAgdGhpcy5zbG9wZSA9IHZhbHVlcy5zbG9wZTtcbiAgICB0aGlzLmljNTAgPSB2YWx1ZXMuaWM1MDtcbiAgICB0aGlzLmJvdHRvbSA9IHZhbHVlcy5ib3R0b207XG4gIH1cbn1cblxuY2xhc3MgRXhwb25lbnRpYWxGaXQgZXh0ZW5kcyBGaXQgaW1wbGVtZW50cyBJRXhwb25lbnRpYWxGaXQge1xuICBtYW50aXNzYTogbnVtYmVyO1xuICBwb3dlcjogbnVtYmVyO1xuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9FWFBPTkVOVElBTDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHZhbHVlczogSUV4cG9uZW50aWFsRml0LCBkYXRhOiBGaXRTZXJpZXMpIHtcbiAgICBzdXBlcih2YWx1ZXMsIGRhdGEpO1xuICAgIHRoaXMubWFudGlzc2EgPSB2YWx1ZXMubWFudGlzc2E7XG4gICAgdGhpcy5wb3dlciA9IHZhbHVlcy5wb3dlcjtcbiAgfVxufVxuXG5jbGFzcyBGb3VyUExSZWdyZXNzaW9uRml0IGV4dGVuZHMgRml0IGltcGxlbWVudHMgSUZvdXJQTFJlZ3Jlc3Npb25GaXQge1xuICB0b3A6IG51bWJlcjtcbiAgYm90dG9tOiBudW1iZXI7XG4gIHNsb3BlOiBudW1iZXI7XG4gIGVjNTA6IG51bWJlcjtcblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fNFBMX1JFR1JFU1NJT047XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2YWx1ZXM6IElGb3VyUExSZWdyZXNzaW9uRml0LCBkYXRhOiBGaXRTZXJpZXMpIHtcbiAgICBzdXBlcih2YWx1ZXMsIGRhdGEpO1xuICAgIHRoaXMudG9wID0gdmFsdWVzLnRvcDtcbiAgICB0aGlzLmJvdHRvbSA9IHZhbHVlcy5ib3R0b207XG4gICAgdGhpcy5zbG9wZSA9IHZhbHVlcy5zbG9wZTtcbiAgICB0aGlzLmVjNTAgPSB2YWx1ZXMuZWM1MDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZTogKHg6IG51bWJlcikgPT4gbnVtYmVyLCBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSk6IElGaXQge1xuICByZXR1cm4ge1xuICAgIGF1YzogZ2V0QXVjKGZpdEN1cnZlLCBkYXRhKSxcbiAgICByU3F1YXJlZDogZ2V0RGV0Q29lZmYoZml0Q3VydmUsIGRhdGEpLFxuICB9O1xufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBsaW5lYXIgZnVuY3Rpb24gKi9cbmV4cG9ydCBjbGFzcyBMaW5lYXJGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uPExpbmVhckZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fTElORUFSO1xuICB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydTbG9wZScsICdJbnRlcmNlcHQnXTtcbiAgfVxuXG4gIGZpbGxQYXJhbXMoZml0Q3VydmU6IEZpdEN1cnZlLCBkYXRhOiBGaXRTZXJpZXMpOiBMaW5lYXJGaXQge1xuICAgIHJldHVybiBuZXcgTGluZWFyRml0KHtcbiAgICAgIC4uLmdldEF1Y0FuZFJzcXVhcmVkKGZpdEN1cnZlLmZpdHRlZEN1cnZlLCBnZXREYXRhUG9pbnRzKGRhdGEpKSxcbiAgICAgIHNsb3BlOiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzBdLFxuICAgICAgaW50ZXJjZXB0OiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzFdLFxuICAgIH0sIGRhdGEpO1xuICB9XG5cbiAgeShwYXJhbXM6IEZsb2F0MzJBcnJheSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbGluZWFyKHBhcmFtcywgeCk7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBGbG9hdDMyQXJyYXkge1xuICAgIGxldCBtaW5JbmRleCA9IDA7XG4gICAgbGV0IG1heEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh4W2ldIDwgeFttaW5JbmRleF0pXG4gICAgICAgIG1pbkluZGV4ID0gaTtcbiAgICAgIGlmICh4W2ldID4geFttYXhJbmRleF0pXG4gICAgICAgIG1heEluZGV4ID0gaTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWx0YVggPSB4W21heEluZGV4XSAtIHhbbWluSW5kZXhdO1xuICAgIGNvbnN0IGRlbHRhWSA9IHlbbWF4SW5kZXhdIC0geVttaW5JbmRleF07XG4gICAgY29uc3QgQSA9IGRlbHRhWSAvIGRlbHRhWDtcbiAgICBjb25zdCBCID0geVttYXhJbmRleF0gLSBBICogeFttYXhJbmRleF07XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEZsb2F0MzJBcnJheSgyKTtcbiAgICBwYXJhbXMuc2V0KFtBLCBCXSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBzaWdtb2lkIGZ1bmN0aW9uICovXG5leHBvcnQgY2xhc3MgU2lnbW9pZEZ1bmN0aW9uIGV4dGVuZHMgRml0RnVuY3Rpb248U2lnbW9pZEZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fU0lHTU9JRDtcbiAgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnVG9wJywgJ1Nsb3BlJywgJ0lDNTAnLCAnQm90dG9tJ107XG4gIH1cblxuICBmaWxsUGFyYW1zKGZpdEN1cnZlOiBGaXRDdXJ2ZSwgZGF0YTogRml0U2VyaWVzKTogU2lnbW9pZEZpdCB7XG4gICAgcmV0dXJuIG5ldyBTaWdtb2lkRml0KHtcbiAgICAgIC4uLmdldEF1Y0FuZFJzcXVhcmVkKGZpdEN1cnZlLmZpdHRlZEN1cnZlLCBnZXREYXRhUG9pbnRzKGRhdGEpKSxcbiAgICAgIHRvcDogZml0Q3VydmUucGFyYW1ldGVyc1swXSxcbiAgICAgIHNsb3BlOiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzFdLFxuICAgICAgaWM1MDogZml0Q3VydmUucGFyYW1ldGVyc1syXSxcbiAgICAgIGJvdHRvbTogZml0Q3VydmUucGFyYW1ldGVyc1szXSxcbiAgICB9LCBkYXRhKTtcbiAgfVxuXG4gIHkocGFyYW1zOiBGbG9hdDMyQXJyYXksIHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHNpZ21vaWQocGFyYW1zLCB4KTtcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgZGF0YUJvdW5kcyA9IERHLlJlY3QuZnJvbVhZQXJyYXlzKHgsIHkpO1xuICAgIGNvbnN0IG1lZFkgPSAoZGF0YUJvdW5kcy5tYXhZIC0gZGF0YUJvdW5kcy5taW5ZKSAvIDIgKyBkYXRhQm91bmRzLm1pblk7XG4gICAgbGV0IG1heFlJbnRlcnZhbCA9IGRhdGFCb3VuZHMubWF4WSAtIGRhdGFCb3VuZHMubWluWTtcbiAgICBsZXQgbmVhcmVzdFhJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50SW50ZXJ2YWwgPSBNYXRoLmFicyh5W2ldIC0gbWVkWSk7XG4gICAgICBpZiAoY3VycmVudEludGVydmFsIDwgbWF4WUludGVydmFsKSB7XG4gICAgICAgIG1heFlJbnRlcnZhbCA9IGN1cnJlbnRJbnRlcnZhbDtcbiAgICAgICAgbmVhcmVzdFhJbmRleCA9IGk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHhBdE1lZFkgPSB4W25lYXJlc3RYSW5kZXhdO1xuICAgIGNvbnN0IHNsb3BlID0geVswXSA+IHlbeS5sZW5ndGggLSAxXSA/IDEgOiAtMTtcblxuICAgIC8vIHBhcmFtcyBhcmU6IFttYXgsIHRhbiwgSUM1MCwgbWluXVxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgcGFyYW1zLnNldChbZGF0YUJvdW5kcy5tYXhZLCBzbG9wZSwgeEF0TWVkWSwgZGF0YUJvdW5kcy5taW5ZXSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBsaW5lYXIgbG9nYXJpdGhtaWMgZnVuY3Rpb24gKi9cbmV4cG9ydCBjbGFzcyBMb2dMaW5lYXJGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uPExvZ0xpbmVhckZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fTE9HX0xJTkVBUjtcbiAgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnU2xvcGUnLCAnSW50ZXJjZXB0J107XG4gIH1cblxuICBmaWxsUGFyYW1zKGZpdEN1cnZlOiBGaXRDdXJ2ZSwgZGF0YTogRml0U2VyaWVzKTogTG9nTGluZWFyRml0IHtcbiAgICByZXR1cm4gbmV3IExvZ0xpbmVhckZpdCh7XG4gICAgICAuLi5nZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZS5maXR0ZWRDdXJ2ZSwgZ2V0RGF0YVBvaW50cyhkYXRhKSksXG4gICAgICBzbG9wZTogZml0Q3VydmUucGFyYW1ldGVyc1swXSxcbiAgICAgIGludGVyY2VwdDogZml0Q3VydmUucGFyYW1ldGVyc1sxXSxcbiAgICB9LCBkYXRhKTtcbiAgfVxuXG4gIHkocGFyYW1zOiBGbG9hdDMyQXJyYXksIHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGxvZ0xpbmVhcihwYXJhbXMsIHgpO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFBhcmFtZXRlcnMoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgRmxvYXQzMkFycmF5KDIpO1xuICAgIHBhcmFtcy5zZXQoWy01LCAxMDBdKTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG59XG5cbi8qKiBDbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGV4cG9uZW50aWFsIGZ1bmN0aW9uICovXG5leHBvcnQgY2xhc3MgRXhwb25lbnRpYWxGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uPEV4cG9uZW50aWFsRml0PiB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9FWFBPTkVOVElBTDtcbiAgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnTWFudGlzc2EnLCAnUG93ZXInXTtcbiAgfVxuXG4gIGZpbGxQYXJhbXMoZml0Q3VydmU6IEZpdEN1cnZlLCBkYXRhOiBGaXRTZXJpZXMpOiBFeHBvbmVudGlhbEZpdCB7XG4gICAgcmV0dXJuIG5ldyBFeHBvbmVudGlhbEZpdCh7XG4gICAgICAuLi5nZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZS5maXR0ZWRDdXJ2ZSwgZ2V0RGF0YVBvaW50cyhkYXRhKSksXG4gICAgICBtYW50aXNzYTogZml0Q3VydmUucGFyYW1ldGVyc1swXSxcbiAgICAgIHBvd2VyOiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzFdLFxuICAgIH0sIGRhdGEpO1xuICB9XG5cbiAgeShwYXJhbXM6IEZsb2F0MzJBcnJheSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZXhwb25lbnRpYWwocGFyYW1zLCB4KTtcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEZsb2F0MzJBcnJheSgyKTtcbiAgICBwYXJhbXMuc2V0KFsxMDAsIC0yXSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBGb3VyIFBhcmFtZXRlciBMb2dpc3RpYyBSZWdyZXNzaW9uIGZ1bmN0aW9uICovXG5leHBvcnQgY2xhc3MgRm91clBMUmVncmVzc2lvbkZ1bmN0aW9uIGV4dGVuZHMgRml0RnVuY3Rpb248Rm91clBMUmVncmVzc2lvbkZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fNFBMX1JFR1JFU1NJT047XG4gIH1cblxuICBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ1RvcCcsICdTbG9wZScsICdFQzUwJywgJ0JvdHRvbSddO1xuICB9XG5cbiAgZmlsbFBhcmFtcyhmaXRDdXJ2ZTogRml0Q3VydmUsIGRhdGE6IEZpdFNlcmllcyk6IEZvdXJQTFJlZ3Jlc3Npb25GaXQge1xuICAgIHJldHVybiBuZXcgRm91clBMUmVncmVzc2lvbkZpdCh7XG4gICAgICAuLi5nZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZS5maXR0ZWRDdXJ2ZSwgZ2V0RGF0YVBvaW50cyhkYXRhKSksXG4gICAgICB0b3A6IGZpdEN1cnZlLnBhcmFtZXRlcnNbMF0sXG4gICAgICBzbG9wZTogZml0Q3VydmUucGFyYW1ldGVyc1sxXSxcbiAgICAgIGVjNTA6IGZpdEN1cnZlLnBhcmFtZXRlcnNbMl0sXG4gICAgICBib3R0b206IGZpdEN1cnZlLnBhcmFtZXRlcnNbM10sXG4gICAgfSwgZGF0YSk7XG4gIH1cblxuICB5KHBhcmFtczogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBmb3VyUExSZWdyZXNzaW9uKHBhcmFtcywgeCk7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBGbG9hdDMyQXJyYXkge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgY29uc3QgYm90dG9tID0gTWF0aC5taW4oLi4ueSk7XG4gICAgY29uc3QgdG9wID0gTWF0aC5tYXgoLi4ueSk7XG4gICAgY29uc3QgbWVkWSA9ICh0b3AgLSBib3R0b20pIC8gMiArIGJvdHRvbTtcbiAgICBsZXQgbWF4WUludGVydmFsID0gdG9wIC1ib3R0b207XG4gICAgbGV0IG5lYXJlc3RYSW5kZXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY3VycmVudEludGVydmFsID0gTWF0aC5hYnMoeVtpXSAtIG1lZFkpO1xuICAgICAgaWYgKGN1cnJlbnRJbnRlcnZhbCA8IG1heFlJbnRlcnZhbCkge1xuICAgICAgICBtYXhZSW50ZXJ2YWwgPSBjdXJyZW50SW50ZXJ2YWw7XG4gICAgICAgIG5lYXJlc3RYSW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlYzUwID0geFtuZWFyZXN0WEluZGV4XTtcbiAgICBjb25zdCBzbG9wZSA9IHlbMF0gPiB5W3kubGVuZ3RoIC0gMV0/IC0xMCA6IDEwO1xuICAgIHBhcmFtcy5zZXQoW3RvcCwgc2xvcGUsIGVjNTAsIGJvdHRvbV0pO1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZvdXJQTERvc2VSZXNwb25zZUZ1bmN0aW9uIGV4dGVuZHMgRm91clBMUmVncmVzc2lvbkZ1bmN0aW9uIHtcbiAgb3ZlcnJpZGUgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRklUX0ZVTkNUSU9OXzRQTF9ET1NFX1JFU1BPTlNFO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydNYXgnLCAnSGlsbCcsICdJQzUwJywgJ01pbiddO1xuICB9XG5cbiAgb3ZlcnJpZGUgeShwYXJhbXM6IEZsb2F0MzJBcnJheSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZm91clBMRG9zZVJlc3BvbnNlKHBhcmFtcywgeCk7XG4gIH1cbn1cblxuLyoqIENsYXNzIHRoYXQgaW1wbGVtZW50cyB1c2VyIEpTIGZ1bmN0aW9ucyAqL1xuZXhwb3J0IGNsYXNzIEpzRnVuY3Rpb24gZXh0ZW5kcyBGaXRGdW5jdGlvbjxGaXQ+IHtcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9wYXJhbWV0ZXJOYW1lczogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB5RnVuYzogKHBhcmFtczogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIpID0+IG51bWJlcixcbiAgICBnZXRJbml0UGFyYW1zRnVuYzogKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSkgPT4gRmxvYXQzMkFycmF5LCBwYXJhbWV0ZXJOYW1lczogc3RyaW5nW10pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fcGFyYW1ldGVyTmFtZXMgPSBwYXJhbWV0ZXJOYW1lcztcblxuICAgIHRoaXMueSA9IHlGdW5jO1xuICAgIHRoaXMuZ2V0SW5pdGlhbFBhcmFtZXRlcnMgPSBnZXRJbml0UGFyYW1zRnVuYztcbiAgfVxuXG4gIGZpbGxQYXJhbXMoZml0Q3VydmU6IEZpdEN1cnZlLCBkYXRhOiBGaXRTZXJpZXMpOiBGaXQge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5fcGFyYW1ldGVyTmFtZXMubGVuZ3RoKTtcbiAgICBwYXJhbXMuc2V0KGZpdEN1cnZlLnBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBuZXcgSlNGdW5jdGlvbkZpdCh7Li4uZ2V0QXVjQW5kUnNxdWFyZWQoZml0Q3VydmUuZml0dGVkQ3VydmUsIGdldERhdGFQb2ludHMoZGF0YSkpfSwgZGF0YSk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVyTmFtZXM7XG4gIH1cblxuICB5KHBhcmFtczogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBGbG9hdDMyQXJyYXkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuLy8gT2JqZWN0IHdpdGggZml0IGZ1bmN0aW9uc1xuZXhwb3J0IGNvbnN0IGZpdEZ1bmN0aW9uczoge1trZXk6IHN0cmluZ106IEZpdEZ1bmN0aW9uPGFueT59ID0ge1xuICAnbGluZWFyJzogbmV3IExpbmVhckZ1bmN0aW9uKCksXG4gICdzaWdtb2lkJzogbmV3IFNpZ21vaWRGdW5jdGlvbigpLFxuICAnbG9nLWxpbmVhcic6IG5ldyBMb2dMaW5lYXJGdW5jdGlvbigpLFxuICAnZXhwb25lbnRpYWwnOiBuZXcgRXhwb25lbnRpYWxGdW5jdGlvbigpLFxuICAnNHBsLXJlZ3Jlc3Npb24nOiBuZXcgRm91clBMUmVncmVzc2lvbkZ1bmN0aW9uKCksXG4gICc0cGwtZG9zZS1yZXNwb25zZSc6IG5ldyBGb3VyUExEb3NlUmVzcG9uc2VGdW5jdGlvbigpLFxufTtcblxuY2xhc3MgRml0RnVuY3Rpb25zIHtcbiAgc2VyaWVzOiBGaXRTZXJpZXM7XG5cbiAgY29uc3RydWN0b3Ioc2VyaWVzOiBGaXRTZXJpZXMpIHtcbiAgICB0aGlzLnNlcmllcyA9IHNlcmllcztcbiAgfVxuXG4gIGxpbmVhcigpOiBMaW5lYXJGaXQge1xuICAgIHJldHVybiBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX0xJTkVBUl1cbiAgICAgIC5maWxsUGFyYW1zKGZpdFNlcmllcyh0aGlzLnNlcmllcywgZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl9MSU5FQVJdKSwgdGhpcy5zZXJpZXMpO1xuICB9XG5cbiAgbG9nTGluZWFyKCk6IExvZ0xpbmVhckZpdCB7XG4gICAgcmV0dXJuIGZpdEZ1bmN0aW9uc1tGSVRfRlVOQ1RJT05fTE9HX0xJTkVBUl1cbiAgICAgIC5maWxsUGFyYW1zKGZpdFNlcmllcyh0aGlzLnNlcmllcywgZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl9MT0dfTElORUFSXSksIHRoaXMuc2VyaWVzKTtcbiAgfVxuXG4gIHNpZ21vaWQoKTogU2lnbW9pZEZpdCB7XG4gICAgcmV0dXJuIGZpdEZ1bmN0aW9uc1tGSVRfRlVOQ1RJT05fU0lHTU9JRF1cbiAgICAgIC5maWxsUGFyYW1zKGZpdFNlcmllcyh0aGlzLnNlcmllcywgZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl9TSUdNT0lEXSksIHRoaXMuc2VyaWVzKTtcbiAgfVxuXG4gIGV4cG9uZW50aWFsKCk6IEV4cG9uZW50aWFsRml0IHtcbiAgICByZXR1cm4gZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl9FWFBPTkVOVElBTF1cbiAgICAgIC5maWxsUGFyYW1zKGZpdFNlcmllcyh0aGlzLnNlcmllcywgZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl9FWFBPTkVOVElBTF0pLCB0aGlzLnNlcmllcyk7XG4gIH1cblxuICBmb3VyUEwoKTogRm91clBMUmVncmVzc2lvbkZpdCB7XG4gICAgcmV0dXJuIGZpdEZ1bmN0aW9uc1tGSVRfRlVOQ1RJT05fNFBMX1JFR1JFU1NJT05dXG4gICAgICAuZmlsbFBhcmFtcyhmaXRTZXJpZXModGhpcy5zZXJpZXMsIGZpdEZ1bmN0aW9uc1tGSVRfRlVOQ1RJT05fNFBMX1JFR1JFU1NJT05dKSwgdGhpcy5zZXJpZXMpO1xuICB9XG5cbiAgZm91clBMRG9zZVJlc3BvbnNlKCk6IEZvdXJQTFJlZ3Jlc3Npb25GaXQge1xuICAgIHJldHVybiBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OXzRQTF9ET1NFX1JFU1BPTlNFXS5maWxsUGFyYW1zKGZpdFNlcmllcyh0aGlzLnNlcmllcywgZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl80UExfRE9TRV9SRVNQT05TRV0pLCB0aGlzLnNlcmllcyk7XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgRml0U2VyaWVzIGltcGxlbWVudHMgSUZpdFNlcmllcyB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcblxuICBmaXQ6IEZpdEZ1bmN0aW9ucztcbiAgcG9pbnRzOiBJRml0UG9pbnRbXTtcblxuICBjb25zdHJ1Y3Rvcihwb2ludHM6IElGaXRQb2ludFtdKSB7XG4gICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG4gICAgdGhpcy5maXQgPSBuZXcgRml0RnVuY3Rpb25zKHRoaXMpO1xuICB9XG5cbiAgbmFtZT86IHN0cmluZzsgLy8gY29udHJvbHMgdGhlIHNlcmllcyBuYW1lXG4gIGZpdEZ1bmN0aW9uPzogc3RyaW5nIHwgSUZpdEZ1bmN0aW9uRGVzY3JpcHRpb247IC8vIGNvbnRyb2xzIHRoZSBzZXJpZXMgZml0IGZ1bmN0aW9uXG4gIHBhcmFtZXRlcnM/OiBudW1iZXJbXTsgLy8gY29udHJvbHMgdGhlIHNlcmllcyBwYXJhbWV0ZXJzLCBhdXRvLWZpdHRpbmcgd2hlbiBub3QgZGVmaW5lZFxuICBwYXJhbWV0ZXJCb3VuZHM/OiBGaXRQYXJhbUJvdW5kc1tdOyAvLyBkZWZpbmVzIHRoZSBhY2NlcHRhYmxlIHJhbmdlIG9mIGVhY2ggcGFyYW1ldGVyLCB3aGljaCBpcyB0YWtlbiBpbnRvIGFjY291bnQgZHVyaW5nIHRoZSBmaXR0aW5nLiBTZWUgYWxzbyBgcGFyYW1ldGVyc2AuXG4gIG1hcmtlclR5cGU/OiBGaXRNYXJrZXJUeXBlOyAvLyBkZWZpbmVzIHRoZSBzZXJpZXMgbWFya2VyIHR5cGVcbiAgb3V0bGllck1hcmtlclR5cGU/OiBGaXRPdXRsaWVyTWFya2VyVHlwZTsgLy8gZGVmaW5lcyB0aGUgc2VyaWVzIG91dGxpZXIgbWFya2VyIHR5cGVcbiAgbGluZVN0eWxlPzogRml0TGluZVN0eWxlOyAvLyBkZWZpbmVzIHRoZSBzZXJpZXMgbGluZSBzdHlsZVxuICBwb2ludENvbG9yPzogc3RyaW5nOyAvLyBvdmVycmlkZXMgdGhlIHN0YW5kYXJkaXplZCBzZXJpZXMgcG9pbnQgY29sb3JcbiAgZml0TGluZUNvbG9yPzogc3RyaW5nOyAvLyBvdmVycmlkZXMgdGhlIHN0YW5kYXJkaXplZCBzZXJpZXMgZml0IGxpbmUgY29sb3JcbiAgY29uZmlkZW5jZUludGVydmFsQ29sb3I/OiBzdHJpbmc7IC8vIG92ZXJyaWRlcyB0aGUgc3RhbmRhcmRpemVkIHNlcmllcyBjb25maWRlbmNlIGludGVydmFsIGNvbG9yXG4gIG91dGxpZXJDb2xvcj86IHN0cmluZzsgLy8gb3ZlcnJpZGVzIHRoZSBzdGFuZGFyZGl6ZWQgc2VyaWVzIG91dGxpZXIgY29sb3JcbiAgY29ubmVjdERvdHM/OiBib29sZWFuOyAvLyBkZWZpbmVzIHdoZXRoZXIgdG8gY29ubmVjdCB0aGUgcG9pbnRzIHdpdGggbGluZXMgb3Igbm90LiBJZiB0cnVlIGFuZCBzaG93Rml0TGluZSBpcyBmYWxzZSAtIGZpdHRpbmcgaXMgZGlzYWJsZWQgLSBvdGhlcndpc2UsIGl0IHdpbGwgYmUgcmVuZGVyZWQgYWNjb3JkaW5nbHkgdG8gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgc2hvd0ZpdExpbmU/OiBib29sZWFuOyAvLyBkZWZpbmVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgZml0IGxpbmUgb3Igbm90XG4gIHNob3dQb2ludHM/OiBzdHJpbmc7IC8vIGRlZmluZXMgdGhlIGRhdGEgZGlzcGxheSBtb2RlXG4gIHNob3dDdXJ2ZUNvbmZpZGVuY2VJbnRlcnZhbD86IGJvb2xlYW47IC8vIGRlZmluZXMgd2hldGhlciB0byBzaG93IHRoZSBjb25maWRlbmNlIGludGVydmFscyBvciBub3RcbiAgZXJyb3JNb2RlbD86IEZpdEVycm9yTW9kZWxUeXBlOyAvLyBkZWZpbmVzIHRoZSBzZXJpZXMgZXJyb3IgbW9kZWxcbiAgY2xpY2tUb1RvZ2dsZT86IGJvb2xlYW47IC8vIGlmIHRydWUsIGNsaWNraW5nIG9uIHRoZSBwb2ludCB0b2dnbGVzIGl0cyBvdXRsaWVyIHN0YXR1cyBhbmQgY2F1c2VzIGN1cnZlIHJlZml0dGluZ1xuICBsYWJlbHM/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn07IC8vIGNvbnRyb2xsZWQgYnkgSUZpdENoYXJ0RGF0YSBsYWJlbE9wdGlvbnMsIHNob3dzIGxhYmVsc1xuICBkcm9wbGluZXM/OiBzdHJpbmdbXTsgLy8gZGVmaW5lcyB0aGUgZHJvcGxpbmVzIHRoYXQgd291bGQgYmUgc2hvd24gb24gdGhlIHBsb3QgKElDNTApXG4gIGNvbHVtbk5hbWU/OiBzdHJpbmc7IC8vIGRlZmluZXMgdGhlIGNvbHVtbiBuYW1lIHdoZXJlIHRoZSBzZXJpZXMgaXMgc3RvcmVkXG59XG5cblxuLyoqIFByb3BlcnRpZXMgdGhhdCBkZXNjcmliZSB7QGxpbmsgSUZpdFNlcmllc09wdGlvbnN9LiBVc2VmdWwgZm9yIGVkaXRpbmcsIGluaXRpYWxpemF0aW9uLCB0cmFuc2Zvcm1hdGlvbnMsIGV0Yy4gKi9cbmV4cG9ydCBjb25zdCBmaXRTZXJpZXNQcm9wZXJ0aWVzOiBERy5Qcm9wZXJ0eVtdID0gW1xuICBERy5Qcm9wZXJ0eS5qcygnZml0RnVuY3Rpb24nLCBERy5UWVBFLlNUUklORyxcbiAgICB7Y2F0ZWdvcnk6ICdGaXR0aW5nJywgY2hvaWNlczogT2JqZWN0LmtleXMoZml0RnVuY3Rpb25zKSwgZGVmYXVsdFZhbHVlOiAnc2lnbW9pZCd9KSxcbiAgREcuUHJvcGVydHkuanMoJ3BvaW50Q29sb3InLCBERy5UWVBFLlNUUklORyxcbiAgICB7Y2F0ZWdvcnk6ICdSZW5kZXJpbmcnLCBudWxsYWJsZTogdHJ1ZSwgaW5wdXRUeXBlOiAnQ29sb3InfSksXG4gIERHLlByb3BlcnR5LmpzKCdmaXRMaW5lQ29sb3InLCBERy5UWVBFLlNUUklORyxcbiAgICB7Y2F0ZWdvcnk6ICdSZW5kZXJpbmcnLCBudWxsYWJsZTogdHJ1ZSwgaW5wdXRUeXBlOiAnQ29sb3InfSksXG4gIERHLlByb3BlcnR5LmpzKCdvdXRsaWVyQ29sb3InLCBERy5UWVBFLlNUUklORyxcbiAgICB7Y2F0ZWdvcnk6ICdSZW5kZXJpbmcnLCBudWxsYWJsZTogdHJ1ZSwgaW5wdXRUeXBlOiAnQ29sb3InfSksXG4gIERHLlByb3BlcnR5LmpzKCdlcnJvck1vZGVsJywgREcuVFlQRS5TVFJJTkcsIHtjYXRlZ29yeTogJ0ZpdHRpbmcnLCBkZWZhdWx0VmFsdWU6ICdjb25zdGFudCcsXG4gICAgY2hvaWNlczogWydjb25zdGFudCcsICdwcm9wb3J0aW9uYWwnLCAnY29tYmluZWQnXSwgbnVsbGFibGU6IGZhbHNlfSksXG4gIERHLlByb3BlcnR5LmpzKCdjb25uZWN0RG90cycsIERHLlRZUEUuQk9PTCwge2NhdGVnb3J5OiAnRml0dGluZycsIGRlZmF1bHRWYWx1ZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ2NsaWNrVG9Ub2dnbGUnLCBERy5UWVBFLkJPT0wsIHtjYXRlZ29yeTogJ0ZpdHRpbmcnLCBkZXNjcmlwdGlvbjpcbiAgICAnQ2xpY2sgb24gYSBwb2ludCB0byBtYXJrIGl0IGFzIG91dGxpZXIgYW5kIHJlZml0JywgbnVsbGFibGU6IHRydWUsIGRlZmF1bHRWYWx1ZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ3Nob3dGaXRMaW5lJywgREcuVFlQRS5CT09MLCB7Y2F0ZWdvcnk6ICdGaXR0aW5nJywgZGVmYXVsdFZhbHVlOiB0cnVlfSksXG4gIERHLlByb3BlcnR5LmpzKCdzaG93UG9pbnRzJywgREcuVFlQRS5TVFJJTkcsIC8vIHJld3JpdGUgZGVzY3JpcHRpb25cbiAgICB7Y2F0ZWdvcnk6ICdGaXR0aW5nJywgZGVzY3JpcHRpb246ICdXaGV0aGVyIHBvaW50cy9jYW5kbGVzdGlja3Mvbm9uZSBzaG91bGQgYmUgcmVuZGVyZWQnLFxuICAgICAgZGVmYXVsdFZhbHVlOiAncG9pbnRzJywgY2hvaWNlczogWydwb2ludHMnLCAnY2FuZGxlc3RpY2tzJywgJ2JvdGgnXX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnc2hvd0N1cnZlQ29uZmlkZW5jZUludGVydmFsJywgREcuVFlQRS5CT09MLFxuICAgIHtjYXRlZ29yeTogJ0ZpdHRpbmcnLCBkZXNjcmlwdGlvbjogJ1doZXRoZXIgY29uZmlkZW5jZSBpbnRlcnZhbHMgc2hvdWxkIGJlIHJlbmRlcmVkJywgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgZnJpZW5kbHlOYW1lOiAnQ29uZmlkZW5jZSBJbnRlcnZhbCd9KSxcbiAgREcuUHJvcGVydHkuanMoJ21hcmtlclR5cGUnLCBERy5UWVBFLlNUUklORywge2NhdGVnb3J5OiAnUmVuZGVyaW5nJywgZGVmYXVsdFZhbHVlOiAnY2lyY2xlJyxcbiAgICBjaG9pY2VzOiBbJ2FzdGVyaXNrJywgJ2NpcmNsZScsICdjcm9zcyBib3JkZXInLCAnZGlhbW9uZCcsICdzcXVhcmUnLCAnc3RhcicsXG4gICAgICAndHJpYW5nbGUgYm90dG9tJywgJ3RyaWFuZ2xlIGxlZnQnLCAndHJpYW5nbGUgcmlnaHQnLCAndHJpYW5nbGUgdG9wJ10sIG51bGxhYmxlOiBmYWxzZSxcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBmcmllbmRseU5hbWU6ICdNYXJrZXInfSksXG4gIERHLlByb3BlcnR5LmpzKCdvdXRsaWVyTWFya2VyVHlwZScsIERHLlRZUEUuU1RSSU5HLCB7Y2F0ZWdvcnk6ICdSZW5kZXJpbmcnLCBkZWZhdWx0VmFsdWU6ICdvdXRsaWVyJyxcbiAgICBjaG9pY2VzOiBbJ2FzdGVyaXNrJywgJ2NpcmNsZScsICdjcm9zcyBib3JkZXInLCAnZGlhbW9uZCcsICdvdXRsaWVyJywgJ3NxdWFyZScsICdzdGFyJyxcbiAgICAgICd0cmlhbmdsZSBib3R0b20nLCAndHJpYW5nbGUgbGVmdCcsICd0cmlhbmdsZSByaWdodCcsICd0cmlhbmdsZSB0b3AnXSwgbnVsbGFibGU6IGZhbHNlLFxuICAgIC8vQHRzLWlnbm9yZVxuICAgIGZyaWVuZGx5TmFtZTogJ091dGxpZXIgTWFya2VyJ30pLFxuICBERy5Qcm9wZXJ0eS5qcygnbGluZVN0eWxlJywgREcuVFlQRS5TVFJJTkcsIHtjYXRlZ29yeTogJ1JlbmRlcmluZycsIGRlZmF1bHRWYWx1ZTogJ3NvbGlkJyxcbiAgICBjaG9pY2VzOiBbJ3NvbGlkJywgJ2RvdHRlZCcsICdkYXNoZWQnLCAnZGFzaGRvdHRlZCddLCBudWxsYWJsZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ2Ryb3BsaW5lcycsIERHLlRZUEUuU1RSSU5HX0xJU1QsIHtkZXNjcmlwdGlvbjogJ1doZXRoZXIgc3BlY2lmaWMgZHJvcGxpbmVzIHNob3VsZCBiZSByZW5kZXJlZCcsXG4gICAgY2hvaWNlczogRFJPUExJTkVTLCBpbnB1dFR5cGU6ICdNdWx0aUNob2ljZSd9KSxcbiAgREcuUHJvcGVydHkuanMoJ2NvbHVtbk5hbWUnLCBERy5UWVBFLlNUUklORywge2Rlc2NyaXB0aW9uOiAnQ29sdW1uIG5hbWUgd2hlcmUgdGhlIHNlcmllcyBpcyBzdG9yZWQnLCBkZWZhdWx0VmFsdWU6ICcnfSksXG5dO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPckNyZWF0ZUZpdEZ1bmN0aW9uKHNlcmllc0ZpdEZ1bmM6IHN0cmluZyB8IElGaXRGdW5jdGlvbkRlc2NyaXB0aW9uKTogRml0RnVuY3Rpb248Rml0PiB7XG4gIGlmICh0eXBlb2Ygc2VyaWVzRml0RnVuYyA9PT0gJ3N0cmluZycpXG4gICAgcmV0dXJuIGZpdEZ1bmN0aW9uc1tzZXJpZXNGaXRGdW5jXTtcbiAgZWxzZSBpZiAoIWZpdEZ1bmN0aW9uc1tzZXJpZXNGaXRGdW5jLm5hbWVdKSB7XG4gICAgY29uc3QgbmFtZSA9IHNlcmllc0ZpdEZ1bmMubmFtZTtcbiAgICBjb25zdCBwYXJhbU5hbWVzID0gc2VyaWVzRml0RnVuYy5wYXJhbWV0ZXJOYW1lcztcbiAgICBjb25zdCBmaXRGdW5jdGlvblBhcnRzID0gc2VyaWVzRml0RnVuYy5mdW5jdGlvbi5zcGxpdCgnPT4nKS5tYXAoKGVsZW0pID0+IGVsZW0udHJpbSgpKTtcbiAgICBjb25zdCBnZXRJbml0UGFyYW1zUGFydHMgPSBzZXJpZXNGaXRGdW5jLmdldEluaXRpYWxQYXJhbWV0ZXJzLnNwbGl0KCc9PicpLm1hcCgoZWxlbSkgPT4gZWxlbS50cmltKCkpO1xuICAgIGNvbnN0IGZpdEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGZpdEZ1bmN0aW9uUGFydHNbMF0uc2xpY2UoMSwgZml0RnVuY3Rpb25QYXJ0c1swXS5sZW5ndGggLSAxKSxcbiAgICAgIGAke2ZpdEZ1bmN0aW9uUGFydHNbMV0uaW5jbHVkZXMoJzsnKSA/ICcnIDogJ3JldHVybiAnfSR7Zml0RnVuY3Rpb25QYXJ0c1sxXX1gKTtcbiAgICBjb25zdCBnZXRJbml0UGFyYW1zRnVuYyA9IG5ldyBGdW5jdGlvbihnZXRJbml0UGFyYW1zUGFydHNbMF0uc2xpY2UoMSwgZ2V0SW5pdFBhcmFtc1BhcnRzWzBdLmxlbmd0aCAtIDEpLFxuICAgICAgYHJldHVybiAke2dldEluaXRQYXJhbXNQYXJ0c1sxXX1gKTtcbiAgICBjb25zdCBmaXRGdW5jID0gbmV3IEpzRnVuY3Rpb24obmFtZSwgKGZpdEZ1bmN0aW9uIGFzIChwYXJhbXM6IEZsb2F0MzJBcnJheSwgeDogbnVtYmVyKSA9PiBudW1iZXIpLFxuICAgICAgKGdldEluaXRQYXJhbXNGdW5jIGFzICh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pID0+IEZsb2F0MzJBcnJheSksIHBhcmFtTmFtZXMpO1xuICAgIGZpdEZ1bmN0aW9uc1tuYW1lXSA9IGZpdEZ1bmM7XG4gIH1cblxuICByZXR1cm4gZml0RnVuY3Rpb25zW3Nlcmllc0ZpdEZ1bmMubmFtZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXREYXRhKGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119LCBmaXRGdW5jdGlvbjogRml0RnVuY3Rpb248Rml0PiwgZXJyb3JNb2RlbD86IEZpdEVycm9yTW9kZWxUeXBlLFxuICBwYXJhbWV0ZXJCb3VuZHM/OiBGaXRQYXJhbUJvdW5kc1tdKTogRml0Q3VydmUge1xuICBlcnJvck1vZGVsID8/PSBGaXRFcnJvck1vZGVsLkNPTlNUQU5UIGFzIEZpdEVycm9yTW9kZWxUeXBlO1xuICBjb25zdCBjdXJ2ZUZ1bmN0aW9uID0gZml0RnVuY3Rpb24ueTtcbiAgbGV0IHBhcmFtVmFsdWVzID0gZml0RnVuY3Rpb24uZ2V0SW5pdGlhbFBhcmFtZXRlcnMoZGF0YS54LCBkYXRhLnkpO1xuXG4gIGNvbnN0IG9mID0gb2JqZWN0aXZlRmFjdG9yeShjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBlcnJvck1vZGVsKTtcbiAgY29uc3QgYm90dG9tUGFyYW1Cb3VuZHMgPSBuZXcgRmxvYXQzMkFycmF5KGZpdEZ1bmN0aW9uLnBhcmFtZXRlck5hbWVzLmxlbmd0aCk7XG4gIGNvbnN0IHRvcFBhcmFtQm91bmRzID0gbmV3IEZsb2F0MzJBcnJheShmaXRGdW5jdGlvbi5wYXJhbWV0ZXJOYW1lcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpdEZ1bmN0aW9uLnBhcmFtZXRlck5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYm90dG9tUGFyYW1Cb3VuZHNbaV0gPSBwYXJhbVZhbHVlc1tpXSA9PT0gMCA/IC0xIDogcGFyYW1WYWx1ZXNbaV0gLSBNYXRoLmFicyhwYXJhbVZhbHVlc1tpXSAqIDAuNSk7XG4gICAgdG9wUGFyYW1Cb3VuZHNbaV0gPSBwYXJhbVZhbHVlc1tpXSA9PT0gMCA/IDEgOiBwYXJhbVZhbHVlc1tpXSArIE1hdGguYWJzKHBhcmFtVmFsdWVzW2ldICogMC41KTtcbiAgfVxuICBjb25zdCBwYXJhbWV0ZXJCb3VuZHNCaXRzZXQ6IERHLkJpdFNldCA9IERHLkJpdFNldC5jcmVhdGUoZml0RnVuY3Rpb24ucGFyYW1ldGVyTmFtZXMubGVuZ3RoICogMik7XG4gIGlmIChwYXJhbWV0ZXJCb3VuZHMgJiYgcGFyYW1ldGVyQm91bmRzLmxlbmd0aCAhPT0gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1ldGVyQm91bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGFyYW1ldGVyQm91bmRzW2ldLm1pbiAhPT0gdW5kZWZpbmVkICYmIHBhcmFtZXRlckJvdW5kc1tpXS5taW4gIT09IG51bGwpIHtcbiAgICAgICAgYm90dG9tUGFyYW1Cb3VuZHNbaV0gPSBwYXJhbWV0ZXJCb3VuZHNbaV0ubWluITtcbiAgICAgICAgcGFyYW1ldGVyQm91bmRzQml0c2V0LnNldChpICogMiwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1ldGVyQm91bmRzW2ldLm1heCAhPT0gdW5kZWZpbmVkICYmIHBhcmFtZXRlckJvdW5kc1tpXS5tYXggIT09IG51bGwpIHtcbiAgICAgICAgdG9wUGFyYW1Cb3VuZHNbaV0gPSBwYXJhbWV0ZXJCb3VuZHNbaV0ubWF4ITtcbiAgICAgICAgcGFyYW1ldGVyQm91bmRzQml0c2V0LnNldChpICogMiArIDEsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBnZXRDb25zaXN0ZW5jeSA9IChleHRyZW11bTogRXh0cmVtdW0pID0+IHtcbiAgICBjb25zdCByZXNpZHVhbHMgPSBvZihleHRyZW11bS5wb2ludCkucmVzaWR1YWxzO1xuICAgIGxldCBxMXE0ID0gMDtcbiAgICBsZXQgcTJxMyA9IDA7XG4gICAgLy8gVE9ETzogcmV3cml0ZSBxdWFydGlsZXMgdG8gYSBiZXR0ZXIgY29uZGl0aW9uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNpZHVhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZXNpZHVhbHMubGVuZ3RoIC8gNCA+IGkpXG4gICAgICAgIHExcTQgKz0gTWF0aC5wb3cocmVzaWR1YWxzW2ldLCAyKTtcbiAgICAgIGVsc2UgaWYgKDMgKiByZXNpZHVhbHMubGVuZ3RoIC8gNCA+IGkpXG4gICAgICAgIHEycTMgKz0gTWF0aC5wb3cocmVzaWR1YWxzW2ldLCAyKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcTFxNCArPSBNYXRoLnBvdyhyZXNpZHVhbHNbaV0sIDIpO1xuICAgIH1cbiAgICByZXR1cm4gcTFxNCAvIHEycTM7XG4gIH07XG5cbiAgbGV0IGl0ZXIgPSAtMTtcbiAgbGV0IGNvbnRpbnVlT3B0aW1pemF0aW9uID0gMDtcbiAgbGV0IHN0YXRpc3RpY3M6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBsZXQgb3B0aW1pemF0aW9uOiBPcHRpbWl6YXRpb25SZXN1bHQ7XG4gIGxldCBtaW5JZHggPSAwO1xuICBkbyB7XG4gICAgb3B0aW1pemF0aW9uID0gcGVyZm9ybU5lbGRlck1lYWRPcHRpbWl6YXRpb24ob2YsIGJvdHRvbVBhcmFtQm91bmRzLCB0b3BQYXJhbUJvdW5kcywge1xuICAgICAgdG9sZXJhbmNlOiBORUxERVJfTUVBRF9ERUZBVUxUUy5UT0xFUkFOQ0UsXG4gICAgICBtYXhJdGVyOiBORUxERVJfTUVBRF9ERUZBVUxUUy5NQVhfSVRFUixcbiAgICAgIG5vblplcm9QYXJhbTogTkVMREVSX01FQURfREVGQVVMVFMuTk9OX1pFUk9fUEFSQU0sXG4gICAgICBpbml0aWFsU2NhbGU6IE5FTERFUl9NRUFEX0RFRkFVTFRTLklOSVRJQUxfU0NBTEUsXG4gICAgICBzY2FsZVJlZmxlY3Rpb246IE5FTERFUl9NRUFEX0RFRkFVTFRTLlNDQUxFX1JFRkxFQ1RJT04sXG4gICAgICBzY2FsZUV4cGFuc2lvbjogTkVMREVSX01FQURfREVGQVVMVFMuU0NBTEVfRVhQQU5TSU9OLFxuICAgICAgc2NhbGVDb250cmFjdGlvbjogTkVMREVSX01FQURfREVGQVVMVFMuU0NBTEVfQ09OVFJBQ1RJT04sXG4gICAgfSwgMTAsIHBhcmFtVmFsdWVzKTtcblxuICAgIG1pbklkeCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcHRpbWl6YXRpb24uZXh0cmVtdW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob3B0aW1pemF0aW9uLmV4dHJlbXVtc1tpXS5jb3N0IDwgb3B0aW1pemF0aW9uLmV4dHJlbXVtc1ttaW5JZHhdLmNvc3QpXG4gICAgICAgIG1pbklkeCA9IGk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3U3RhdGlzdGljcyA9IGdldENvbnNpc3RlbmN5KG9wdGltaXphdGlvbi5leHRyZW11bXNbbWluSWR4XSk7XG4gICAgaWYgKHN0YXRpc3RpY3MgPT09IG51bGwpXG4gICAgICBzdGF0aXN0aWNzID0gbmV3U3RhdGlzdGljcztcbiAgICBlbHNlIGlmIChuZXdTdGF0aXN0aWNzIDwgc3RhdGlzdGljcykge1xuICAgICAgc3RhdGlzdGljcyA9IG5ld1N0YXRpc3RpY3M7XG4gICAgICBjb250aW51ZU9wdGltaXphdGlvbiA9IDA7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgIGNvbnRpbnVlT3B0aW1pemF0aW9uKys7XG5cbiAgICBwYXJhbVZhbHVlcyA9IG9wdGltaXphdGlvbi5leHRyZW11bXNbbWluSWR4XS5wb2ludDtcblxuICAgIGlmIChpdGVyID4gNDAgfHwgY29udGludWVPcHRpbWl6YXRpb24gPT09IDMpXG4gICAgICBicmVhaztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZml0RnVuY3Rpb24ucGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghcGFyYW1ldGVyQm91bmRzQml0c2V0LmdldChpICogMikpXG4gICAgICAgIGJvdHRvbVBhcmFtQm91bmRzW2ldID0gcGFyYW1WYWx1ZXNbaV0gLSBNYXRoLmFicyhwYXJhbVZhbHVlc1tpXSAqIChjb250aW51ZU9wdGltaXphdGlvbiArIDAuNSkpO1xuICAgICAgaWYgKCFwYXJhbWV0ZXJCb3VuZHNCaXRzZXQuZ2V0KGkgKiAyICsgMSkpXG4gICAgICAgIHRvcFBhcmFtQm91bmRzW2ldID0gcGFyYW1WYWx1ZXNbaV0gKyBNYXRoLmFicyhwYXJhbVZhbHVlc1tpXSAqIChjb250aW51ZU9wdGltaXphdGlvbiArIDAuNSkpO1xuICAgIH1cblxuICAgIGl0ZXIrKztcbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgY29uc3QgZml0dGVkQ3VydmUgPSBnZXRGaXR0ZWRDdXJ2ZShjdXJ2ZUZ1bmN0aW9uLCBwYXJhbVZhbHVlcyk7XG5cbiAgcmV0dXJuIHtcbiAgICBmaXR0ZWRDdXJ2ZTogZml0dGVkQ3VydmUsXG4gICAgcGFyYW1ldGVyczogcGFyYW1WYWx1ZXMsXG4gIH07XG59XG5cblxuZnVuY3Rpb24gb2JqZWN0aXZlRmFjdG9yeSh0YXJnZXRGdW5jOiAocGFyYW1zOiBGbG9hdDMyQXJyYXksIHg6IG51bWJlcikgPT4gbnVtYmVyLFxuICBkYXRhOiB7eTogbnVtYmVyW10sIHg6IG51bWJlcltdfSwgZXJyb3JNb2RlbDogRml0RXJyb3JNb2RlbFR5cGUpOlxuICAgIChwYXJhbXM6IEZsb2F0MzJBcnJheSkgPT4ge2xpa2VsaWhvb2Q6IG51bWJlciwgcmVzaWR1YWxzOiBudW1iZXJbXX0ge1xuICByZXR1cm4gKHBhcmFtczogRmxvYXQzMkFycmF5KSA9PiB7XG4gICAgbGV0IGxpa2VsaWhvb2QgPSAwO1xuICAgIGxldCBzaWdtYUEgPSAwO1xuICAgIGxldCBzaWdtYUIgPSAwO1xuXG4gICAgY29uc3Qgb2JzID0gZGF0YS55O1xuICAgIGNvbnN0IHByZWQgPSBkYXRhLngubWFwKCh4KSA9PiB0YXJnZXRGdW5jKHBhcmFtcywgeCkpO1xuICAgIGNvbnN0IHJlc2lkdWFscyA9IG9icy5tYXAoKG9icywgaSkgPT4gb2JzIC0gcHJlZFtpXSk7XG4gICAgY29uc3QgcmVzaWR1ZXNTcXVhcmVzID0gcmVzaWR1YWxzLm1hcCgocmVzKSA9PiBNYXRoLnBvdyhyZXMsIDIpKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoW0ZpdEVycm9yTW9kZWwuQ09OU1RBTlQsIEZpdEVycm9yTW9kZWwuQ09NQklORURdLmluY2x1ZGVzKGVycm9yTW9kZWwpKVxuICAgICAgICBzaWdtYUEgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldO1xuICAgICAgZWxzZSBpZiAoZXJyb3JNb2RlbCA9PT0gRml0RXJyb3JNb2RlbC5QUk9QT1JUSU9OQUwpXG4gICAgICAgIHNpZ21hQiArPSByZXNpZHVlc1NxdWFyZXNbaV0gLyAocHJlZFtpXSAqIHByZWRbaV0pO1xuICAgIH1cbiAgICBzaWdtYUEgPSBNYXRoLnNxcnQoc2lnbWFBIC8gcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aCk7XG4gICAgc2lnbWFCID0gTWF0aC5zcXJ0KHNpZ21hQiAvIHJlc2lkdWVzU3F1YXJlcy5sZW5ndGgpO1xuXG4gICAgaWYgKGVycm9yTW9kZWwgPT09IEZpdEVycm9yTW9kZWwuQ09NQklORUQpXG4gICAgICAoe3NpZ21hQSwgc2lnbWFCfSA9IGdldFNpZ21hc0ZvckNvbWJpbmVkRXJyb3JNb2RlbChzaWdtYUEsIHNpZ21hQiwgcmVzaWR1ZXNTcXVhcmVzLCBwcmVkKSk7XG5cbiAgICBjb25zdCBzaWdtYVNxSTogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgc2lnbWFTcUlbaV0gPSBNYXRoLnBvdyhzaWdtYUEgKyBzaWdtYUIgKiBwcmVkW2ldLCAyKTtcbiAgICAgIGxpa2VsaWhvb2QgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldIC8gc2lnbWFTcUlbaV0gKyBNYXRoLmxvZygyICogTWF0aC5QSSAqIHNpZ21hU3FJW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2xpa2VsaWhvb2QsIHJlc2lkdWFsc307XG4gIH07XG59XG5cblxuZnVuY3Rpb24gZ2V0U2lnbWEodGFyZ2V0RnVuYzogKHBhcmFtczogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIpID0+IG51bWJlcixcbiAgZGF0YToge3k6IG51bWJlcltdLCB4OiBudW1iZXJbXX0sIGVycm9yTW9kZWw6IEZpdEVycm9yTW9kZWxUeXBlLCBwYXJhbXM6IEZsb2F0MzJBcnJheSk6IHtzaWdtYUE6IG51bWJlciwgc2lnbWFCOiBudW1iZXJ9IHtcbiAgbGV0IHNpZ21hQSA9IDA7XG4gIGxldCBzaWdtYUIgPSAwO1xuXG4gIGNvbnN0IG9icyA9IGRhdGEueTtcbiAgY29uc3QgcHJlZCA9IGRhdGEueC5tYXAoKHgpID0+IHRhcmdldEZ1bmMocGFyYW1zLCB4KSk7XG4gIGNvbnN0IHJlc2lkdWFscyA9IG9icy5tYXAoKG9icywgaSkgPT4gb2JzIC0gcHJlZFtpXSk7XG4gIGNvbnN0IHJlc2lkdWVzU3F1YXJlcyA9IHJlc2lkdWFscy5tYXAoKHJlcykgPT4gTWF0aC5wb3cocmVzLCAyKSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoW0ZpdEVycm9yTW9kZWwuQ09OU1RBTlQsIEZpdEVycm9yTW9kZWwuQ09NQklORURdLmluY2x1ZGVzKGVycm9yTW9kZWwpKVxuICAgICAgc2lnbWFBICs9IHJlc2lkdWVzU3F1YXJlc1tpXTtcbiAgICBlbHNlIGlmIChlcnJvck1vZGVsID09PSBGaXRFcnJvck1vZGVsLlBST1BPUlRJT05BTClcbiAgICAgIHNpZ21hQiArPSBNYXRoLnBvdyhyZXNpZHVhbHNbaV0gLyBNYXRoLmFicyhwcmVkW2ldKSwgMik7XG4gIH1cbiAgc2lnbWFBID0gTWF0aC5zcXJ0KHNpZ21hQSAvIHJlc2lkdWVzU3F1YXJlcy5sZW5ndGgpO1xuICBzaWdtYUIgPSBNYXRoLnNxcnQoc2lnbWFCIC8gcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aCk7XG5cbiAgaWYgKGVycm9yTW9kZWwgPT09IEZpdEVycm9yTW9kZWwuQ09NQklORUQpXG4gICAgKHtzaWdtYUEsIHNpZ21hQn0gPSBnZXRTaWdtYXNGb3JDb21iaW5lZEVycm9yTW9kZWwoc2lnbWFBLCBzaWdtYUIsIHJlc2lkdWVzU3F1YXJlcywgcHJlZCkpO1xuXG4gIHJldHVybiB7c2lnbWFBLCBzaWdtYUJ9O1xufVxuXG5mdW5jdGlvbiBnZXRTaWdtYXNGb3JDb21iaW5lZEVycm9yTW9kZWwoc2lnbWFBOiBudW1iZXIsIHNpZ21hQjogbnVtYmVyLCByZXNpZHVlc1NxdWFyZXM6IG51bWJlcltdLCBwcmVkOiBudW1iZXJbXSk6XG4gIHtzaWdtYUE6IG51bWJlciwgc2lnbWFCOiBudW1iZXJ9IHtcbiAgbGV0IGxpa2VsaWhvb2RDb21iaW5lZCA9IE51bWJlci5NQVhfVkFMVUU7XG4gIGxldCBmaW5hbFByb3BvcnRpb24gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8PSAxMDsgaSsrKSB7XG4gICAgbGV0IGxpa2VsaWhvb2RDb21iaW5lZExvY2FsID0gMDtcbiAgICBjb25zdCBwcm9wb3J0aW9uID0gaSAvIDEwO1xuICAgIGNvbnN0IHNpZ21hQUNvbWJpbmVkID0gc2lnbWFBICogcHJvcG9ydGlvbjtcbiAgICBjb25zdCBzaWdtYUJDb21iaW5lZCA9IHNpZ21hQSAqICgxIC0gcHJvcG9ydGlvbik7XG4gICAgY29uc3Qgc2lnbWFTcUlDb21iaW5lZDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7IGorKykge1xuICAgICAgc2lnbWFTcUlDb21iaW5lZFtqXSA9IE1hdGgucG93KHNpZ21hQUNvbWJpbmVkICsgc2lnbWFCQ29tYmluZWQgKiBwcmVkW2pdLCAyKTtcbiAgICAgIGxpa2VsaWhvb2RDb21iaW5lZExvY2FsICs9IHJlc2lkdWVzU3F1YXJlc1tqXSAvIHNpZ21hU3FJQ29tYmluZWRbal0gKyBNYXRoLmxvZygyICogTWF0aC5QSSAqIHNpZ21hU3FJQ29tYmluZWRbal0pO1xuICAgIH1cbiAgICBpZiAobGlrZWxpaG9vZENvbWJpbmVkTG9jYWwgPCBsaWtlbGlob29kQ29tYmluZWQpIHtcbiAgICAgIGxpa2VsaWhvb2RDb21iaW5lZCA9IGxpa2VsaWhvb2RDb21iaW5lZExvY2FsO1xuICAgICAgZmluYWxQcm9wb3J0aW9uID0gcHJvcG9ydGlvbjtcbiAgICB9XG4gIH1cbiAgc2lnbWFCID0gc2lnbWFBICogKDEgLSBmaW5hbFByb3BvcnRpb24pO1xuICBzaWdtYUEgPSBzaWdtYUEgKiBmaW5hbFByb3BvcnRpb247XG5cbiAgcmV0dXJuIHtzaWdtYUEsIHNpZ21hQn07XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnZlQ29uZmlkZW5jZUludGVydmFscyhkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSwgcGFyYW1WYWx1ZXM6IEZsb2F0MzJBcnJheSxcbiAgY3VydmVGdW5jdGlvbjogKHBhcmFtczogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIpID0+IG51bWJlciwgY29uZmlkZW5jZUxldmVsOiBudW1iZXIgPSAwLjA1LCBlcnJvck1vZGVsOiBGaXRFcnJvck1vZGVsVHlwZSk6XG4gIEZpdENvbmZpZGVuY2VJbnRlcnZhbHMge1xuICBjb25zdCBlcnJvciA9IGdldFNpZ21hKGN1cnZlRnVuY3Rpb24sIGRhdGEsIGVycm9yTW9kZWwsIHBhcmFtVmFsdWVzKTtcbiAgY29uc3QgcXVhbnRpbGUgPSBqU3RhdC5ub3JtYWwuaW52KDEgLSBjb25maWRlbmNlTGV2ZWwvMiwgMCwgMSk7XG5cbiAgY29uc3QgdG9wID0gKHg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gY3VydmVGdW5jdGlvbihwYXJhbVZhbHVlcywgeCk7XG4gICAgcmV0dXJuIHZhbHVlICsgcXVhbnRpbGUgKiAoZXJyb3Iuc2lnbWFBICsgTWF0aC5hYnModmFsdWUpICogZXJyb3Iuc2lnbWFCKTtcbiAgfTtcblxuICBjb25zdCBib3R0b20gPSAoeDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBjdXJ2ZUZ1bmN0aW9uKHBhcmFtVmFsdWVzLCB4KTtcbiAgICByZXR1cm4gdmFsdWUgLSBxdWFudGlsZSAqIChlcnJvci5zaWdtYUEgKyBNYXRoLmFicyh2YWx1ZSkgKiBlcnJvci5zaWdtYUIpO1xuICB9O1xuXG4gIHJldHVybiB7Y29uZmlkZW5jZVRvcDogdG9wLCBjb25maWRlbmNlQm90dG9tOiBib3R0b219O1xufVxuXG5cbi8vIGNvbnN0IHNlcmllczogRml0U2VyaWVzID0gbmV3IEZpdFNlcmllcyhbXG4vLyAgIHsneCc6IDAsICd5JzogMH0sXG4vLyAgIHsneCc6IDEsICd5JzogMC41fSxcbi8vICAgeyd4JzogMiwgJ3knOiAxfSxcbi8vICAgeyd4JzogMywgJ3knOiAxMCwgJ291dGxpZXInOiB0cnVlfSxcbi8vICAgeyd4JzogNCwgJ3knOiAwfSxcbi8vIF0pO1xuXG4iXX0=