@datagrok-libraries/statistics 1.1.2 → 1.1.4

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.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
1
  # statistics
2
2
 
3
- Statistics provides fitting support for all kind of processes along with statistical features.
4
- Library uses optimization [lbfgs](https://github.com/mimno/jsLBFGS) algorithm.
3
+ Statistics provides fitting support for all kind of processes along with statistical features.
4
+ Library uses optimization [lbfgs](https://github.com/mimno/jsLBFGS) algorithm.
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "friendlyName": "statistics",
7
- "version": "1.1.2",
7
+ "version": "1.1.4",
8
8
  "description": "",
9
9
  "dependencies": {
10
10
  "datagrok-api": "1.12.1",
@@ -6,6 +6,14 @@ export declare type FitResult = {
6
6
  confidenceBottom: (x: number) => number;
7
7
  rSquared?: number;
8
8
  auc?: number;
9
+ inverted?: (y: number) => number;
10
+ invertedTop?: (y: number) => number;
11
+ invertedBottom?: (y: number) => number;
12
+ interceptX: number;
13
+ interceptY: number;
14
+ slope: number;
15
+ top: number;
16
+ bottom: number;
9
17
  };
10
18
  /** Properties that describe {@link FitResult}. Useful for editing, initialization, transformations, etc. */
11
19
  export declare const fitResultProperties: Property[];
@@ -30,6 +38,10 @@ export interface IFitOptions {
30
38
  export declare function fit(data: {
31
39
  x: number[];
32
40
  y: number[];
33
- }, params: number[], curveFunction: (params: number[], x: number) => number, errorModel: FitErrorModel, confidenceLevel?: number, statistics?: boolean): FitResult;
41
+ }, params: {
42
+ paramvalue: number;
43
+ min?: number;
44
+ max?: number;
45
+ }[], curveFunction: (paramValues: number[], x: number) => number, errorModel: FitErrorModel, confidenceLevel?: number, statistics?: boolean): FitResult;
34
46
  export declare function sigmoid(params: number[], x: number): number;
35
47
  //# sourceMappingURL=fit-curve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fit-curve.d.ts","sourceRoot":"","sources":["fit-curve.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AASnD,oBAAY,SAAS,GAAG;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IACjC,aAAa,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,4GAA4G;AAC5G,eAAO,MAAM,mBAAmB,EAAE,QAAQ,EAGzC,CAAC;AAMF,oBAAY,aAAa;IACvB,QAAQ,IAAA;IACR,YAAY,IAAA;CACb;AAED,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C,oBAAY,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAC;AA4CnD,eAAO,MAAM,YAAY,EAAE;IAAC,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAG/C,CAAC;AAGF,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,aAAa,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAGD;;KAEK;AACL,wBAAgB,GAAG,CAAC,IAAI,EAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,EAC/B,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,EACtD,UAAU,EAAE,aAAa,EACzB,eAAe,GAAE,MAAa,EAC9B,UAAU,GAAE,OAAc,GAAG,SAAS,CAuEzD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAO3D"}
1
+ {"version":3,"file":"fit-curve.d.ts","sourceRoot":"","sources":["fit-curve.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AAWnD,oBAAY,SAAS,GAAG;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IACjC,aAAa,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IAEtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,4GAA4G;AAC5G,eAAO,MAAM,mBAAmB,EAAE,QAAQ,EAQzC,CAAC;AAQF,oBAAY,aAAa;IACvB,QAAQ,IAAA;IACR,YAAY,IAAA;CACb;AAGD,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAM5C,oBAAY,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAC;AA4CnD,eAAO,MAAM,YAAY,EAAE;IAAC,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAG/C,CAAC;AAGF,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,aAAa,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAGD;;KAEK;AACL,wBAAgB,GAAG,CAAC,IAAI,EAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,EAC/B,MAAM,EAAE;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAC,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAC,EAAE,EACzD,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,EAC3D,UAAU,EAAE,aAAa,EACzB,eAAe,GAAE,MAAa,EAC9B,UAAU,GAAE,OAAc,GAAG,SAAS,CAuGzD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAO3D"}
@@ -5,8 +5,13 @@ import { Property } from "datagrok-api/src/entities";
5
5
  import { TYPE } from "datagrok-api/src/const";
6
6
  /** Properties that describe {@link FitResult}. Useful for editing, initialization, transformations, etc. */
7
7
  export const fitResultProperties = [
8
- Property.js('rSquared', TYPE.FLOAT),
9
- Property.js('auc', TYPE.FLOAT)
8
+ Property.js('rSquared', TYPE.FLOAT, { userEditable: false }),
9
+ Property.js('auc', TYPE.FLOAT, { userEditable: false }),
10
+ Property.js('interceptY', TYPE.FLOAT, { userEditable: false }),
11
+ Property.js('interceptX', TYPE.FLOAT, { userEditable: false }),
12
+ Property.js('slope', TYPE.FLOAT, { userEditable: false }),
13
+ Property.js('top', TYPE.FLOAT, { userEditable: false }),
14
+ Property.js('bottom', TYPE.FLOAT, { userEditable: false }),
10
15
  ];
11
16
  export var FitErrorModel;
12
17
  (function (FitErrorModel) {
@@ -49,6 +54,7 @@ export const fitFunctions = {
49
54
  * statistics - whether or not to calculate fit statistics (potentially computationally intensive)
50
55
  * */
51
56
  export function fit(data, params, curveFunction, errorModel, confidenceLevel = 0.05, statistics = true) {
57
+ let paramValues = params.map(p => p.paramvalue);
52
58
  let of;
53
59
  switch (errorModel) {
54
60
  case FitErrorModel.Constant:
@@ -74,36 +80,62 @@ export function fit(data, params, curveFunction, errorModel, confidenceLevel = 0
74
80
  return gradient;
75
81
  }
76
82
  };
77
- limitedMemoryBFGS(optimizable, params);
78
- limitedMemoryBFGS(optimizable, params);
83
+ limitedMemoryBFGS(optimizable, paramValues);
84
+ limitedMemoryBFGS(optimizable, paramValues);
79
85
  let fittedCurve = (x) => {
80
- return curveFunction(params, x);
86
+ return curveFunction(paramValues, x);
81
87
  };
82
88
  let error = errorModel == FitErrorModel.Proportional ?
83
- of(curveFunction, data, params).mult :
84
- of(curveFunction, data, params).const;
85
- let studentQ = jStat.studentt.inv(1 - confidenceLevel / 2, data.x.length - params.length);
89
+ of(curveFunction, data, paramValues).mult :
90
+ of(curveFunction, data, paramValues).const;
91
+ let studentQ = jStat.studentt.inv(1 - confidenceLevel / 2, data.x.length - paramValues.length);
86
92
  let top = (x) => {
87
- let value = curveFunction(params, x);
93
+ let value = curveFunction(paramValues, x);
88
94
  if (errorModel == FitErrorModel.Constant)
89
95
  return value + studentQ * error / Math.sqrt(data.x.length);
90
96
  else
91
97
  return value + studentQ * (Math.abs(value) * error / Math.sqrt(data.x.length));
92
98
  };
93
99
  let bottom = (x) => {
94
- let value = curveFunction(params, x);
100
+ let value = curveFunction(paramValues, x);
95
101
  if (errorModel == FitErrorModel.Constant)
96
102
  return value - studentQ * error / Math.sqrt(data.x.length);
97
103
  else
98
104
  return value - studentQ * (Math.abs(value) * error / Math.sqrt(data.x.length));
99
105
  };
106
+ let inv = (y) => { return 0; };
107
+ let invTop = (y) => { return 0; };
108
+ let invBottom = (y) => { return 0; };
109
+ if (statistics) {
110
+ inv = (y) => {
111
+ //should check if more than bottom and less than top
112
+ return paramValues[2] / Math.pow((paramValues[0] - y) / (y - paramValues[3]), 1 / paramValues[1]);
113
+ };
114
+ let error = getInvError(inv, data);
115
+ invTop = (y) => {
116
+ let value = inv(y);
117
+ return value + studentQ * error / Math.sqrt(data.y.length);
118
+ };
119
+ invBottom = (y) => {
120
+ let value = inv(y);
121
+ return value - studentQ * error / Math.sqrt(data.y.length);
122
+ };
123
+ }
100
124
  let fitRes = {
101
- parameters: params,
125
+ parameters: paramValues,
102
126
  fittedCurve: fittedCurve,
103
127
  confidenceTop: top,
104
128
  confidenceBottom: bottom,
105
129
  rSquared: statistics ? getDetCoeff(fittedCurve, data) : undefined,
106
- auc: statistics ? getAuc(fittedCurve, data) : undefined
130
+ auc: statistics ? getAuc(fittedCurve, data) : undefined,
131
+ inverted: statistics ? inv : undefined,
132
+ invertedTop: statistics ? invTop : undefined,
133
+ invertedBottom: statistics ? invBottom : undefined,
134
+ interceptX: paramValues[2],
135
+ interceptY: fittedCurve(paramValues[2]),
136
+ slope: paramValues[1],
137
+ top: paramValues[0],
138
+ bottom: paramValues[3]
107
139
  };
108
140
  return fitRes;
109
141
  }
@@ -136,9 +168,9 @@ function getObjectiveDerivative(of, curveFunction, data, params, selectedParam)
136
168
  }
137
169
  function getAuc(fittedCurve, data) {
138
170
  let auc = 0;
139
- const integrationStep = 0.001;
140
171
  let min = Math.min(...data.x);
141
172
  let max = Math.max(...data.x);
173
+ const integrationStep = (max - min) / 1000;
142
174
  for (let x = min; x < max; x += integrationStep)
143
175
  auc += integrationStep * fittedCurve(x);
144
176
  return auc;
@@ -153,6 +185,22 @@ function getDetCoeff(fittedCurve, data) {
153
185
  }
154
186
  return 1 - ssRes / ssTot;
155
187
  }
188
+ function getInvError(targetFunc, data) {
189
+ const pi = Math.PI;
190
+ let sigma = 0;
191
+ let sigmaSq = 0;
192
+ let residuesSquares = new Float32Array(data.y.length);
193
+ for (let i = 0; i < data.y.length; i++) {
194
+ const obs = data.x[i];
195
+ const pred = targetFunc(data.y[i]);
196
+ residuesSquares[i] = Math.pow(obs - pred, 2);
197
+ }
198
+ for (let i = 0; i < residuesSquares.length; i++)
199
+ sigmaSq += residuesSquares[i];
200
+ sigmaSq /= residuesSquares.length;
201
+ sigma = Math.sqrt(sigmaSq);
202
+ return sigma;
203
+ }
156
204
  function objectiveNormalConstant(targetFunc, data, params) {
157
205
  //assure observed and args same length
158
206
  const pi = Math.PI;
@@ -193,4 +241,4 @@ function objectiveNormalProportional(targetFunc, data, params) {
193
241
  likelihood += residuesSquares[i] / sigmaSq + Math.log(2 * pi * sigmaSq);
194
242
  return { value: -likelihood, const: sigma, mult: 0 };
195
243
  }
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml0LWN1cnZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZml0LWN1cnZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ25ELHNCQUFzQjtBQUN0QixPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDbkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBaUI1Qyw0R0FBNEc7QUFDNUcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWU7SUFDN0MsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNuQyxRQUFRLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDO0NBQy9CLENBQUM7QUFNRixNQUFNLENBQU4sSUFBWSxhQUdYO0FBSEQsV0FBWSxhQUFhO0lBQ3ZCLHlEQUFRLENBQUE7SUFDUixpRUFBWSxDQUFBO0FBQ2QsQ0FBQyxFQUhXLGFBQWEsS0FBYixhQUFhLFFBR3hCO0FBRUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQztBQUk1QyxNQUFlLFdBQVc7Q0FLekI7QUFHRCxNQUFNLGNBQWUsU0FBUSxXQUFXO0lBQ3RDLElBQUksSUFBSSxLQUFhLE9BQU8sbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBRWxELElBQUksY0FBYztRQUNoQixPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxDQUFDLENBQUMsTUFBZ0IsRUFBRSxDQUFTO1FBQzNCLE1BQU0saUJBQWlCLENBQUM7SUFDMUIsQ0FBQztJQUVELG9CQUFvQixDQUFDLENBQVcsRUFBRSxDQUFXO1FBQzNDLE1BQU0saUJBQWlCLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBR0QsTUFBTSxlQUFnQixTQUFRLFdBQVc7SUFDdkMsSUFBSSxJQUFJLEtBQWEsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFFbkQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsQ0FBQyxDQUFDLE1BQWdCLEVBQUUsQ0FBUztRQUMzQixNQUFNLGlCQUFpQixDQUFDO0lBQzFCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxDQUFXLEVBQUUsQ0FBVztRQUMzQyxNQUFNLGlCQUFpQixDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUdELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBMkI7SUFDbEQsbUJBQW1CLEVBQUUsSUFBSSxjQUFjLEVBQUU7SUFDekMsb0JBQW9CLEVBQUUsSUFBSSxlQUFlLEVBQUU7Q0FDNUMsQ0FBQztBQVVGOztLQUVLO0FBQ0wsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUErQixFQUMvQixNQUFnQixFQUNoQixhQUFzRCxFQUN0RCxVQUF5QixFQUN6QixrQkFBMEIsSUFBSSxFQUM5QixhQUFzQixJQUFJO0lBRTVDLElBQUksRUFBcUIsQ0FBQztJQUMxQixRQUFPLFVBQVUsRUFBRTtRQUNqQixLQUFLLGFBQWEsQ0FBQyxRQUFRO1lBQ3pCLEVBQUUsR0FBRyx1QkFBdUIsQ0FBQztZQUM3QixNQUFNO1FBQ1IsS0FBSyxhQUFhLENBQUMsWUFBWTtZQUM3QixFQUFFLEdBQUcsMkJBQTJCLENBQUM7WUFDakMsTUFBTTtRQUNSO1lBQ0UsRUFBRSxHQUFHLHVCQUF1QixDQUFDO1lBQzdCLE1BQU07S0FDVDtJQUVELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUVuQixJQUFJLFdBQVcsR0FBRztRQUNoQixRQUFRLEVBQUUsQ0FBQyxVQUFvQixFQUFFLEVBQUU7WUFDakMsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDbkQsQ0FBQztRQUNELFdBQVcsRUFBRSxDQUFDLFVBQW9CLEVBQUUsUUFBa0IsRUFBRSxFQUFFO1lBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQzlDLFVBQVUsRUFBRSxDQUFDO1lBRWIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO2dCQUN4QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsc0JBQXNCLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRS9FLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7S0FDRixDQUFDO0lBRUYsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUV2QyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFO1FBQzlCLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUE7SUFFRCxJQUFJLEtBQUssR0FBRyxVQUFVLElBQUksYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RELEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUV0QyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsZUFBZSxHQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFeEYsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRTtRQUN0QixJQUFJLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksVUFBVSxJQUFJLGFBQWEsQ0FBQyxRQUFRO1lBQ3RDLE9BQVEsS0FBSyxHQUFHLFFBQVEsR0FBQyxLQUFLLEdBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDOztZQUV4RCxPQUFRLEtBQUssR0FBRyxRQUFRLEdBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFDLEtBQUssR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDLENBQUE7SUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFO1FBQ3pCLElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxVQUFVLElBQUksYUFBYSxDQUFDLFFBQVE7WUFDdEMsT0FBUSxLQUFLLEdBQUcsUUFBUSxHQUFDLEtBQUssR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7O1lBRXhELE9BQVEsS0FBSyxHQUFHLFFBQVEsR0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUMsS0FBSyxHQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUMsQ0FBQTtJQUVELElBQUksTUFBTSxHQUFjO1FBQ3RCLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLFdBQVcsRUFBRSxXQUFXO1FBQ3hCLGFBQWEsRUFBRSxHQUFHO1FBQ2xCLGdCQUFnQixFQUFFLE1BQU07UUFDeEIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNqRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ3hELENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxNQUFnQixFQUFFLENBQVM7SUFDakQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsRUFBcUIsRUFBRSxhQUFzRCxFQUN6RyxJQUFnQyxFQUFFLE1BQWdCLEVBQUUsYUFBcUI7SUFDM0UsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFDLE1BQU0sQ0FBQztJQUN4QyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEMsSUFBSSxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQzdCLElBQUksWUFBWSxHQUFhLEVBQUUsQ0FBQztJQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxJQUFHLENBQUMsSUFBSSxhQUFhLEVBQUU7WUFDckIsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDakMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDckM7YUFBTTtZQUNMLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM5QjtLQUNGO0lBQ0QsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3hELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUU5RCxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxHQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxXQUFrQyxFQUNsQyxJQUFnQztJQUM5QyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDWixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDOUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRzlCLEtBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFHLGVBQWU7UUFDM0MsR0FBRyxJQUFJLGVBQWUsR0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsV0FBa0MsRUFDbEMsSUFBZ0M7SUFDbkQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRWQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakMsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN6QztJQUVELE9BQU8sQ0FBQyxHQUFHLEtBQUssR0FBQyxLQUFLLENBQUM7QUFDekIsQ0FBQztBQUdELFNBQVMsdUJBQXVCLENBQzlCLFVBQW1ELEVBQ25ELElBQWdDLEVBQ2hDLE1BQWdCO0lBRWhCLHNDQUFzQztJQUN0QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ25CLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFbkIsSUFBSSxlQUFlLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzlDO0lBRUQsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQzVDLE9BQU8sSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUM7SUFDbEMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFM0IsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQzVDLFVBQVUsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUV4RSxPQUFPLEVBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUNwQyxVQUFtRCxFQUNuRCxJQUFnQyxFQUNoQyxNQUFnQjtJQUVkLHNDQUFzQztJQUN0QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ25CLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFbkIsSUFBSSxlQUFlLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMxQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzlDO0lBRUQsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQzVDLE9BQU8sSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUM7SUFDbEMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFM0IsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQzVDLFVBQVUsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFDLEVBQUUsR0FBQyxPQUFPLENBQUMsQ0FBQztJQUVwRSxPQUFPLEVBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2xpbWl0ZWRNZW1vcnlCRkdTfSBmcm9tIFwiLi4vLi4vbGJmZ3MvbGJmZ3NcIlxuLy9AdHMtaWdub3JlOiBubyB0eXBlc1xuaW1wb3J0ICogYXMgalN0YXQgZnJvbSAnanN0YXQnO1xuaW1wb3J0IHtQcm9wZXJ0eX0gZnJvbSBcImRhdGFncm9rLWFwaS9zcmMvZW50aXRpZXNcIjtcbmltcG9ydCB7VFlQRX0gZnJvbSBcImRhdGFncm9rLWFwaS9zcmMvY29uc3RcIjtcblxudHlwZSBMaWtlbGlob29kID0ge1xuICB2YWx1ZTogbnVtYmVyLCBcbiAgY29uc3Q6IG51bWJlciwgXG4gIG11bHQ6IG51bWJlclxufTtcblxuZXhwb3J0IHR5cGUgRml0UmVzdWx0ID0ge1xuICBwYXJhbWV0ZXJzOiBudW1iZXJbXSxcbiAgZml0dGVkQ3VydmU6ICh4Om51bWJlcik9PiBudW1iZXIsXG4gIGNvbmZpZGVuY2VUb3A6ICh4Om51bWJlcik9PiBudW1iZXIsXG4gIGNvbmZpZGVuY2VCb3R0b206ICh4Om51bWJlcik9PiBudW1iZXIsXG4gIHJTcXVhcmVkPzogbnVtYmVyLFxuICBhdWM/OiBudW1iZXI7XG59O1xuXG4vKiogUHJvcGVydGllcyB0aGF0IGRlc2NyaWJlIHtAbGluayBGaXRSZXN1bHR9LiBVc2VmdWwgZm9yIGVkaXRpbmcsIGluaXRpYWxpemF0aW9uLCB0cmFuc2Zvcm1hdGlvbnMsIGV0Yy4gKi9cbmV4cG9ydCBjb25zdCBmaXRSZXN1bHRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVtdID0gW1xuICBQcm9wZXJ0eS5qcygnclNxdWFyZWQnLCBUWVBFLkZMT0FUKSxcbiAgUHJvcGVydHkuanMoJ2F1YycsIFRZUEUuRkxPQVQpXG5dO1xuXG50eXBlIE9iamVjdGl2ZUZ1bmN0aW9uID0gKHRhcmdldEZ1bmM6IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG5kYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSxcbnBhcmFtczogbnVtYmVyW10pID0+IExpa2VsaWhvb2Q7XG5cbmV4cG9ydCBlbnVtIEZpdEVycm9yTW9kZWwge1xuICBDb25zdGFudCxcbiAgUHJvcG9ydGlvbmFsXG59XG5cbmV4cG9ydCBjb25zdCBGSVRfRlVOQ1RJT05fU0lHTU9JRCA9ICdTaWdtb2lkJztcbmV4cG9ydCBjb25zdCBGSVRfRlVOQ1RJT05fTElORUFSID0gJ0xpbmVhcic7XG5cbmV4cG9ydCB0eXBlIEZpdEZ1bmN0aW9uVHlwZSA9ICdTaWdtb2lkJyB8ICdMaW5lYXInO1xuXG5hYnN0cmFjdCBjbGFzcyBGaXRGdW5jdGlvbiB7XG4gIGFic3RyYWN0IGdldCBuYW1lKCk6IHN0cmluZztcbiAgYWJzdHJhY3QgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdO1xuICBhYnN0cmFjdCB5KHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcik6IG51bWJlcjtcbiAgYWJzdHJhY3QgZ2V0SW5pdGlhbFBhcmFtZXRlcnMoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKTogbnVtYmVyW107XG59XG5cblxuY2xhc3MgTGluZWFyRnVuY3Rpb24gZXh0ZW5kcyBGaXRGdW5jdGlvbiB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7IHJldHVybiBGSVRfRlVOQ1RJT05fTElORUFSOyB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydTbG9wZScsICdJbnRlcmNlcHQnXTtcbiAgfVxuXG4gIHkocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcbiAgfVxufVxuXG5cbmNsYXNzIFNpZ21vaWRGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uIHtcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIEZJVF9GVU5DVElPTl9TSUdNT0lEOyB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydUb3AnLCAnQm90dG9tJywgJ1Nsb3BlJywgJ0lDNTAnXTtcbiAgfVxuXG4gIHkocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcbiAgfVxufVxuXG5cbmV4cG9ydCBjb25zdCBmaXRGdW5jdGlvbnM6IHtbaW5kZXg6IHN0cmluZ106IGFueX0gPSB7XG4gIEZJVF9GVU5DVElPTl9MSU5FQVI6IG5ldyBMaW5lYXJGdW5jdGlvbigpLFxuICBGSVRfRlVOQ1RJT05fU0lHTU9JRDogbmV3IFNpZ21vaWRGdW5jdGlvbigpLFxufTtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElGaXRPcHRpb25zIHtcbiAgZXJyb3JNb2RlbDogRml0RXJyb3JNb2RlbDtcbiAgY29uZmlkZW5jZUxldmVsOiBudW1iZXI7XG4gIHN0YXRpc3RpY3M6IGJvb2xlYW47XG59XG5cblxuLyoqXG4gKiBzdGF0aXN0aWNzIC0gd2hldGhlciBvciBub3QgdG8gY2FsY3VsYXRlIGZpdCBzdGF0aXN0aWNzIChwb3RlbnRpYWxseSBjb21wdXRhdGlvbmFsbHkgaW50ZW5zaXZlKVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXQoZGF0YTp7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSwgXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgIGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTW9kZWw6IEZpdEVycm9yTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2VMZXZlbDogbnVtYmVyID0gMC4wNSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljczogYm9vbGVhbiA9IHRydWUpOiBGaXRSZXN1bHQge1xuXG4gIGxldCBvZjogT2JqZWN0aXZlRnVuY3Rpb247XG4gIHN3aXRjaChlcnJvck1vZGVsKSB7XG4gICAgY2FzZSBGaXRFcnJvck1vZGVsLkNvbnN0YW50OlxuICAgICAgb2YgPSBvYmplY3RpdmVOb3JtYWxDb25zdGFudDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRml0RXJyb3JNb2RlbC5Qcm9wb3J0aW9uYWw6XG4gICAgICBvZiA9IG9iamVjdGl2ZU5vcm1hbFByb3BvcnRpb25hbDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBvZiA9IG9iamVjdGl2ZU5vcm1hbENvbnN0YW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBsZXQgaXRlcmF0aW9ucyA9IDA7XG5cbiAgbGV0IG9wdGltaXphYmxlID0ge1xuICAgIGdldFZhbHVlOiAocGFyYW1ldGVyczogbnVtYmVyW10pID0+IHtcbiAgICAgIHJldHVybiBvZihjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBwYXJhbWV0ZXJzKS52YWx1ZTtcbiAgICB9LFxuICAgIGdldEdyYWRpZW50OiAocGFyYW1ldGVyczogbnVtYmVyW10sIGdyYWRpZW50OiBudW1iZXJbXSkgPT4ge1xuICAgICAgY29uc3QgbGVuZ3RoID0gT2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RoO1xuICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgIGdyYWRpZW50W2ldID0gZ2V0T2JqZWN0aXZlRGVyaXZhdGl2ZShvZiwgY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1ldGVycywgaSk7XG5cbiAgICAgIHJldHVybiBncmFkaWVudDtcbiAgICB9XG4gIH07XG5cbiAgbGltaXRlZE1lbW9yeUJGR1Mob3B0aW1pemFibGUsIHBhcmFtcyk7XG4gIGxpbWl0ZWRNZW1vcnlCRkdTKG9wdGltaXphYmxlLCBwYXJhbXMpO1xuXG4gIGxldCBmaXR0ZWRDdXJ2ZSA9ICh4OiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gY3VydmVGdW5jdGlvbihwYXJhbXMsIHgpO1xuICB9XG5cbiAgbGV0IGVycm9yID0gZXJyb3JNb2RlbCA9PSBGaXRFcnJvck1vZGVsLlByb3BvcnRpb25hbCA/XG4gIG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtcykubXVsdCA6XG4gIG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtcykuY29uc3Q7XG5cbiAgbGV0IHN0dWRlbnRRID0galN0YXQuc3R1ZGVudHQuaW52KDEgLSBjb25maWRlbmNlTGV2ZWwvMiwgZGF0YS54Lmxlbmd0aCAtIHBhcmFtcy5sZW5ndGgpO1xuXG4gIGxldCB0b3AgPSAoeDogbnVtYmVyKSA9PntcbiAgICBsZXQgdmFsdWUgPSBjdXJ2ZUZ1bmN0aW9uKHBhcmFtcywgeCk7XG4gICAgaWYgKGVycm9yTW9kZWwgPT0gRml0RXJyb3JNb2RlbC5Db25zdGFudClcbiAgICAgIHJldHVybiAgdmFsdWUgKyBzdHVkZW50USplcnJvci9NYXRoLnNxcnQoZGF0YS54Lmxlbmd0aCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuICB2YWx1ZSArIHN0dWRlbnRRKihNYXRoLmFicyh2YWx1ZSkqZXJyb3IvTWF0aC5zcXJ0KGRhdGEueC5sZW5ndGgpKTtcbiAgfVxuXG4gIGxldCBib3R0b20gPSAoeDogbnVtYmVyKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gY3VydmVGdW5jdGlvbihwYXJhbXMsIHgpO1xuICAgIGlmIChlcnJvck1vZGVsID09IEZpdEVycm9yTW9kZWwuQ29uc3RhbnQpXG4gICAgICByZXR1cm4gIHZhbHVlIC0gc3R1ZGVudFEqZXJyb3IvTWF0aC5zcXJ0KGRhdGEueC5sZW5ndGgpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAgdmFsdWUgLSBzdHVkZW50USooTWF0aC5hYnModmFsdWUpKmVycm9yL01hdGguc3FydChkYXRhLngubGVuZ3RoKSk7XG4gIH1cblxuICBsZXQgZml0UmVzOiBGaXRSZXN1bHQgPSB7XG4gICAgcGFyYW1ldGVyczogcGFyYW1zLFxuICAgIGZpdHRlZEN1cnZlOiBmaXR0ZWRDdXJ2ZSxcbiAgICBjb25maWRlbmNlVG9wOiB0b3AsXG4gICAgY29uZmlkZW5jZUJvdHRvbTogYm90dG9tLFxuICAgIHJTcXVhcmVkOiBzdGF0aXN0aWNzID8gZ2V0RGV0Q29lZmYoZml0dGVkQ3VydmUsIGRhdGEpIDogdW5kZWZpbmVkLFxuICAgIGF1Yzogc3RhdGlzdGljcyA/IGdldEF1YyhmaXR0ZWRDdXJ2ZSwgZGF0YSkgOiB1bmRlZmluZWRcbiAgfTtcblxuICByZXR1cm4gZml0UmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbW9pZChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBBID0gcGFyYW1zWzBdO1xuICBjb25zdCBCID0gcGFyYW1zWzFdO1xuICBjb25zdCBDID0gcGFyYW1zWzJdO1xuICBjb25zdCBEID0gcGFyYW1zWzNdO1xuICBjb25zdCByZXMgPSBEICsgKEEgLSBEKS8oMSArIE1hdGgucG93KDEwLCAoeCAtIEMpKkIpKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0aXZlRGVyaXZhdGl2ZShvZjogT2JqZWN0aXZlRnVuY3Rpb24sIGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG4gICAgZGF0YToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0sIHBhcmFtczogbnVtYmVyW10sIHNlbGVjdGVkUGFyYW06IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBzdGVwID0gcGFyYW1zW3NlbGVjdGVkUGFyYW1dKjAuMDAwMTtcbiAgc3RlcCA9IHN0ZXAgPT0gMCA/IDAuMDAxIDogc3RlcDsgXG4gIGxldCBwYXJhbXNUb3A6IG51bWJlcltdID0gW107XG4gIGxldCBwYXJhbXNCb3R0b206IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYoaSA9PSBzZWxlY3RlZFBhcmFtKSB7XG4gICAgICBwYXJhbXNUb3AucHVzaChwYXJhbXNbaV0gKyBzdGVwKTtcbiAgICAgIHBhcmFtc0JvdHRvbS5wdXNoKHBhcmFtc1tpXSAtIHN0ZXApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXNUb3AucHVzaChwYXJhbXNbaV0pO1xuICAgICAgcGFyYW1zQm90dG9tLnB1c2gocGFyYW1zW2ldKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZHJ2VG9wID0gb2YoY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1zVG9wKS52YWx1ZTtcbiAgY29uc3QgZHJ2Qm90dG9tID0gb2YoY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1zQm90dG9tKS52YWx1ZTtcblxuICByZXR1cm4gKGRydlRvcCAtIGRydkJvdHRvbSkvKDIqc3RlcCk7XG59XG5cbmZ1bmN0aW9uIGdldEF1YyhmaXR0ZWRDdXJ2ZTogKHg6IG51bWJlcikgPT4gbnVtYmVyLCBcbiAgICAgICAgICAgICAgICBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSk6IG51bWJlciB7XG4gIGxldCBhdWMgPSAwO1xuICBjb25zdCBpbnRlZ3JhdGlvblN0ZXAgPSAwLjAwMTtcbiAgbGV0IG1pbiA9IE1hdGgubWluKC4uLmRhdGEueCk7XG4gIGxldCBtYXggPSBNYXRoLm1heCguLi5kYXRhLngpO1xuXG5cbiAgZm9yKGxldCB4ID0gbWluOyB4IDwgbWF4OyB4Kz0gaW50ZWdyYXRpb25TdGVwKVxuICAgIGF1YyArPSBpbnRlZ3JhdGlvblN0ZXAqZml0dGVkQ3VydmUoeCk7XG5cbiAgcmV0dXJuIGF1Yztcbn1cblxuZnVuY3Rpb24gZ2V0RGV0Q29lZmYoZml0dGVkQ3VydmU6ICh4OiBudW1iZXIpID0+IG51bWJlciwgXG4gICAgICAgICAgICAgICAgICAgICBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSk6IG51bWJlciB7XG4gIGxldCBzc1JlcyA9IDA7XG4gIGxldCBzc1RvdCA9IDA7XG4gIFxuICBjb25zdCB5TWVhbiA9IGpTdGF0Lm1lYW4oZGF0YS55KTtcblxuICBmb3IobGV0IGkgPSAwOyBpIDwgZGF0YS54Lmxlbmd0aDsgaSsrKSB7XG4gICAgc3NSZXMgKz0gTWF0aC5wb3coZGF0YS55W2ldIC0gZml0dGVkQ3VydmUoZGF0YS54W2ldKSwgMik7XG4gICAgc3NUb3QgKz0gTWF0aC5wb3coZGF0YS55W2ldIC0geU1lYW4sIDIpO1xuICB9XG5cbiAgcmV0dXJuIDEgLSBzc1Jlcy9zc1RvdDtcbn1cblxuXG5mdW5jdGlvbiBvYmplY3RpdmVOb3JtYWxDb25zdGFudCAoXG4gIHRhcmdldEZ1bmM6IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG4gIGRhdGE6IHt5OiBudW1iZXJbXSwgeDogbnVtYmVyW119LFxuICBwYXJhbXM6IG51bWJlcltdXG4pOiBMaWtlbGlob29kIHtcbiAgLy9hc3N1cmUgb2JzZXJ2ZWQgYW5kIGFyZ3Mgc2FtZSBsZW5ndGhcbiAgY29uc3QgcGkgPSBNYXRoLlBJO1xuICBsZXQgc2lnbWEgPSAwO1xuICBsZXQgc2lnbWFTcSA9IDA7XG4gIGxldCBsaWtlbGlob29kID0gMDtcblxuICBsZXQgcmVzaWR1ZXNTcXVhcmVzID0gbmV3IEZsb2F0MzJBcnJheShkYXRhLngubGVuZ3RoKTtcbiAgZm9yKGxldCBpID0gMDsgaSA8IGRhdGEueC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG9icyA9IGRhdGEueVtpXTtcbiAgICBjb25zdCBwcmVkID0gdGFyZ2V0RnVuYyhwYXJhbXMsIGRhdGEueFtpXSk7XG4gICAgcmVzaWR1ZXNTcXVhcmVzW2ldID0gTWF0aC5wb3cob2JzIC0gcHJlZCwgMik7XG4gIH1cblxuICBmb3IobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIHNpZ21hU3EgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldO1xuICBzaWdtYVNxIC89IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7XG4gIHNpZ21hID0gTWF0aC5zcXJ0KHNpZ21hU3EpO1xuXG4gIGZvcihsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspXG4gICAgbGlrZWxpaG9vZCArPSByZXNpZHVlc1NxdWFyZXNbaV0vc2lnbWFTcSArIE1hdGgubG9nKDIgKiBwaSAqIHNpZ21hU3EpO1xuXG4gIHJldHVybiB7dmFsdWU6IC1saWtlbGlob29kLCBjb25zdDogc2lnbWEsIG11bHQ6IDB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbn1cblxuZnVuY3Rpb24gb2JqZWN0aXZlTm9ybWFsUHJvcG9ydGlvbmFsIChcbnRhcmdldEZ1bmM6IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG5kYXRhOiB7eTogbnVtYmVyW10sIHg6IG51bWJlcltdfSxcbnBhcmFtczogbnVtYmVyW11cbik6IExpa2VsaWhvb2Qge1xuICAvL2Fzc3VyZSBvYnNlcnZlZCBhbmQgYXJncyBzYW1lIGxlbmd0aFxuICBjb25zdCBwaSA9IE1hdGguUEk7XG4gIGxldCBzaWdtYSA9IDA7XG4gIGxldCBzaWdtYVNxID0gMDtcbiAgbGV0IGxpa2VsaWhvb2QgPSAwO1xuXG4gIGxldCByZXNpZHVlc1NxdWFyZXMgPSBuZXcgRmxvYXQzMkFycmF5KGRhdGEueC5sZW5ndGgpO1xuICBmb3IobGV0IGkgPSAwOyBpIDwgZGF0YS54Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb2JzID0gZGF0YS55W2ldO1xuICAgIGNvbnN0IHByZWQgPSB0YXJnZXRGdW5jKHBhcmFtcywgZGF0YS54W2ldKVxuICAgIHJlc2lkdWVzU3F1YXJlc1tpXSA9IE1hdGgucG93KG9icyAtIHByZWQsIDIpO1xuICB9XG5cbiAgZm9yKGxldCBpID0gMDsgaSA8IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7IGkrKylcbiAgICBzaWdtYVNxICs9IHJlc2lkdWVzU3F1YXJlc1tpXTtcbiAgc2lnbWFTcSAvPSByZXNpZHVlc1NxdWFyZXMubGVuZ3RoO1xuICBzaWdtYSA9IE1hdGguc3FydChzaWdtYVNxKTtcblxuICBmb3IobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIGxpa2VsaWhvb2QgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldL3NpZ21hU3EgKyBNYXRoLmxvZygyKnBpKnNpZ21hU3EpO1xuXG4gIHJldHVybiB7dmFsdWU6IC1saWtlbGlob29kLCBjb25zdDogc2lnbWEsIG11bHQ6IDB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbn1cbiJdfQ==
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml0LWN1cnZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZml0LWN1cnZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ25ELHNCQUFzQjtBQUN0QixPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDbkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBNkI1Qyw0R0FBNEc7QUFDNUcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWU7SUFDN0MsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFDLFlBQVksRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUMxRCxRQUFRLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBQyxDQUFDO0lBQ3JELFFBQVEsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFDLENBQUM7SUFDNUQsUUFBUSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFDLFlBQVksRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUM1RCxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBQyxDQUFDO0lBQ3ZELFFBQVEsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFDLENBQUM7SUFDckQsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxF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QUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2xpbWl0ZWRNZW1vcnlCRkdTfSBmcm9tIFwiLi4vLi4vbGJmZ3MvbGJmZ3NcIlxuLy9AdHMtaWdub3JlOiBubyB0eXBlc1xuaW1wb3J0ICogYXMgalN0YXQgZnJvbSAnanN0YXQnO1xuaW1wb3J0IHtQcm9wZXJ0eX0gZnJvbSBcImRhdGFncm9rLWFwaS9zcmMvZW50aXRpZXNcIjtcbmltcG9ydCB7VFlQRX0gZnJvbSBcImRhdGFncm9rLWFwaS9zcmMvY29uc3RcIjtcblxuXG50eXBlIExpa2VsaWhvb2QgPSB7XG4gIHZhbHVlOiBudW1iZXIsXG4gIGNvbnN0OiBudW1iZXIsXG4gIG11bHQ6IG51bWJlclxufTtcblxuXG5leHBvcnQgdHlwZSBGaXRSZXN1bHQgPSB7XG4gIHBhcmFtZXRlcnM6IG51bWJlcltdLFxuICBmaXR0ZWRDdXJ2ZTogKHg6bnVtYmVyKT0+IG51bWJlcixcbiAgY29uZmlkZW5jZVRvcDogKHg6bnVtYmVyKT0+IG51bWJlcixcbiAgY29uZmlkZW5jZUJvdHRvbTogKHg6bnVtYmVyKT0+IG51bWJlcixcblxuICByU3F1YXJlZD86IG51bWJlcixcbiAgYXVjPzogbnVtYmVyLFxuICBpbnZlcnRlZD86ICh5Om51bWJlcik9PiBudW1iZXIsXG4gIGludmVydGVkVG9wPzogKHk6bnVtYmVyKT0+IG51bWJlcixcbiAgaW52ZXJ0ZWRCb3R0b20/OiAoeTpudW1iZXIpPT4gbnVtYmVyLFxuICBpbnRlcmNlcHRYOiBudW1iZXIsIC8vIHBhcmFtZXRlcnNbMl1cbiAgaW50ZXJjZXB0WTogbnVtYmVyLCAvLyBmaXR0ZWRDdXJ2ZVtwYXJhbWV0ZXJzWzJdXVxuICBzbG9wZTogbnVtYmVyLCAvLyBwYXJhbWV0ZXJzWzFdXG4gIHRvcDogbnVtYmVyLCAvLyBwYXJhbWV0ZXJzWzBdXG4gIGJvdHRvbTogbnVtYmVyLCAvLyBwYXJhbWV0ZXJzWzNdXG59O1xuXG5cbi8qKiBQcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUge0BsaW5rIEZpdFJlc3VsdH0uIFVzZWZ1bCBmb3IgZWRpdGluZywgaW5pdGlhbGl6YXRpb24sIHRyYW5zZm9ybWF0aW9ucywgZXRjLiAqL1xuZXhwb3J0IGNvbnN0IGZpdFJlc3VsdFByb3BlcnRpZXM6IFByb3BlcnR5W10gPSBbXG4gIFByb3BlcnR5LmpzKCdyU3F1YXJlZCcsIFRZUEUuRkxPQVQsIHt1c2VyRWRpdGFibGU6IGZhbHNlfSksXG4gIFByb3BlcnR5LmpzKCdhdWMnLCBUWVBFLkZMT0FULCB7dXNlckVkaXRhYmxlOiBmYWxzZX0pLFxuICBQcm9wZXJ0eS5qcygnaW50ZXJjZXB0WScsIFRZUEUuRkxPQVQsIHt1c2VyRWRpdGFibGU6IGZhbHNlfSksXG4gIFByb3BlcnR5LmpzKCdpbnRlcmNlcHRYJywgVFlQRS5GTE9BVCwge3VzZXJFZGl0YWJsZTogZmFsc2V9KSxcbiAgUHJvcGVydHkuanMoJ3Nsb3BlJywgVFlQRS5GTE9BVCwge3VzZXJFZGl0YWJsZTogZmFsc2V9KSxcbiAgUHJvcGVydHkuanMoJ3RvcCcsIFRZUEUuRkxPQVQsIHt1c2VyRWRpdGFibGU6IGZhbHNlfSksXG4gIFByb3BlcnR5LmpzKCdib3R0b20nLCBUWVBFLkZMT0FULCB7dXNlckVkaXRhYmxlOiBmYWxzZX0pLFxuXTtcblxuXG50eXBlIE9iamVjdGl2ZUZ1bmN0aW9uID0gKHRhcmdldEZ1bmM6IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlcixcbiAgZGF0YToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0sXG4gIHBhcmFtczogbnVtYmVyW10pID0+IExpa2VsaWhvb2Q7XG5cblxuZXhwb3J0IGVudW0gRml0RXJyb3JNb2RlbCB7XG4gIENvbnN0YW50LFxuICBQcm9wb3J0aW9uYWxcbn1cblxuXG5leHBvcnQgY29uc3QgRklUX0ZVTkNUSU9OX1NJR01PSUQgPSAnU2lnbW9pZCc7XG5leHBvcnQgY29uc3QgRklUX0ZVTkNUSU9OX0xJTkVBUiA9ICdMaW5lYXInO1xuXG4vLyBleHBvcnQgY29uc3QgRklUX1NUQVRTX1JTUVVBUkVEID0gJ3JTcXVhcmVkJztcbi8vIGV4cG9ydCBjb25zdCBGSVRfU1RBVFNfQVVDID0gJ2F1Yyc7XG5cblxuZXhwb3J0IHR5cGUgRml0RnVuY3Rpb25UeXBlID0gJ1NpZ21vaWQnIHwgJ0xpbmVhcic7XG5cbmFic3RyYWN0IGNsYXNzIEZpdEZ1bmN0aW9uIHtcbiAgYWJzdHJhY3QgZ2V0IG5hbWUoKTogc3RyaW5nO1xuICBhYnN0cmFjdCBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW107XG4gIGFic3RyYWN0IHkocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKTogbnVtYmVyO1xuICBhYnN0cmFjdCBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBudW1iZXJbXTtcbn1cblxuXG5jbGFzcyBMaW5lYXJGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uIHtcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIEZJVF9GVU5DVElPTl9MSU5FQVI7IH1cblxuICBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ1Nsb3BlJywgJ0ludGVyY2VwdCddO1xuICB9XG5cbiAgeShwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHRocm93ICdOb3QgaW1wbGVtZW50ZWQnO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFBhcmFtZXRlcnMoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICAgIHRocm93ICdOb3QgaW1wbGVtZW50ZWQnO1xuICB9XG59XG5cblxuY2xhc3MgU2lnbW9pZEZ1bmN0aW9uIGV4dGVuZHMgRml0RnVuY3Rpb24ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gRklUX0ZVTkNUSU9OX1NJR01PSUQ7IH1cblxuICBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ1RvcCcsICdCb3R0b20nLCAnU2xvcGUnLCAnSUM1MCddO1xuICB9XG5cbiAgeShwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHRocm93ICdOb3QgaW1wbGVtZW50ZWQnO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFBhcmFtZXRlcnMoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICAgIHRocm93ICdOb3QgaW1wbGVtZW50ZWQnO1xuICB9XG59XG5cblxuZXhwb3J0IGNvbnN0IGZpdEZ1bmN0aW9uczoge1tpbmRleDogc3RyaW5nXTogYW55fSA9IHtcbiAgRklUX0ZVTkNUSU9OX0xJTkVBUjogbmV3IExpbmVhckZ1bmN0aW9uKCksXG4gIEZJVF9GVU5DVElPTl9TSUdNT0lEOiBuZXcgU2lnbW9pZEZ1bmN0aW9uKCksXG59O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZpdE9wdGlvbnMge1xuICBlcnJvck1vZGVsOiBGaXRFcnJvck1vZGVsO1xuICBjb25maWRlbmNlTGV2ZWw6IG51bWJlcjtcbiAgc3RhdGlzdGljczogYm9vbGVhbjtcbn1cblxuXG4vKipcbiAqIHN0YXRpc3RpY3MgLSB3aGV0aGVyIG9yIG5vdCB0byBjYWxjdWxhdGUgZml0IHN0YXRpc3RpY3MgKHBvdGVudGlhbGx5IGNvbXB1dGF0aW9uYWxseSBpbnRlbnNpdmUpXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpdChkYXRhOnt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtwYXJhbXZhbHVlOiBudW1iZXIsIG1pbj86bnVtYmVyLCBtYXg/OiBudW1iZXJ9W10sXG4gICAgICAgICAgICAgICAgICAgIGN1cnZlRnVuY3Rpb246IChwYXJhbVZhbHVlczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1vZGVsOiBGaXRFcnJvck1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlTGV2ZWw6IG51bWJlciA9IDAuMDUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpY3M6IGJvb2xlYW4gPSB0cnVlKTogRml0UmVzdWx0IHtcblxuICBsZXQgcGFyYW1WYWx1ZXMgPSBwYXJhbXMubWFwKHAgPT4gcC5wYXJhbXZhbHVlKTtcbiAgbGV0IG9mOiBPYmplY3RpdmVGdW5jdGlvbjtcbiAgc3dpdGNoKGVycm9yTW9kZWwpIHtcbiAgICBjYXNlIEZpdEVycm9yTW9kZWwuQ29uc3RhbnQ6XG4gICAgICBvZiA9IG9iamVjdGl2ZU5vcm1hbENvbnN0YW50O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBGaXRFcnJvck1vZGVsLlByb3BvcnRpb25hbDpcbiAgICAgIG9mID0gb2JqZWN0aXZlTm9ybWFsUHJvcG9ydGlvbmFsO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIG9mID0gb2JqZWN0aXZlTm9ybWFsQ29uc3RhbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGxldCBpdGVyYXRpb25zID0gMDtcblxuICBsZXQgb3B0aW1pemFibGUgPSB7XG4gICAgZ2V0VmFsdWU6IChwYXJhbWV0ZXJzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgcmV0dXJuIG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtZXRlcnMpLnZhbHVlO1xuICAgIH0sXG4gICAgZ2V0R3JhZGllbnQ6IChwYXJhbWV0ZXJzOiBudW1iZXJbXSwgZ3JhZGllbnQ6IG51bWJlcltdKSA9PiB7XG4gICAgICBjb25zdCBsZW5ndGggPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5sZW5ndGg7XG4gICAgICBpdGVyYXRpb25zKys7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgZ3JhZGllbnRbaV0gPSBnZXRPYmplY3RpdmVEZXJpdmF0aXZlKG9mLCBjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBwYXJhbWV0ZXJzLCBpKTtcblxuICAgICAgcmV0dXJuIGdyYWRpZW50O1xuICAgIH1cbiAgfTtcblxuICBsaW1pdGVkTWVtb3J5QkZHUyhvcHRpbWl6YWJsZSwgcGFyYW1WYWx1ZXMpO1xuICBsaW1pdGVkTWVtb3J5QkZHUyhvcHRpbWl6YWJsZSwgcGFyYW1WYWx1ZXMpO1xuXG4gIGxldCBmaXR0ZWRDdXJ2ZSA9ICh4OiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gY3VydmVGdW5jdGlvbihwYXJhbVZhbHVlcywgeCk7XG4gIH1cblxuICBsZXQgZXJyb3IgPSBlcnJvck1vZGVsID09IEZpdEVycm9yTW9kZWwuUHJvcG9ydGlvbmFsID9cbiAgb2YoY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1WYWx1ZXMpLm11bHQgOlxuICBvZihjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBwYXJhbVZhbHVlcykuY29uc3Q7XG5cbiAgbGV0IHN0dWRlbnRRID0galN0YXQuc3R1ZGVudHQuaW52KDEgLSBjb25maWRlbmNlTGV2ZWwvMiwgZGF0YS54Lmxlbmd0aCAtIHBhcmFtVmFsdWVzLmxlbmd0aCk7XG5cbiAgbGV0IHRvcCA9ICh4OiBudW1iZXIpID0+e1xuICAgIGxldCB2YWx1ZSA9IGN1cnZlRnVuY3Rpb24ocGFyYW1WYWx1ZXMsIHgpO1xuICAgIGlmIChlcnJvck1vZGVsID09IEZpdEVycm9yTW9kZWwuQ29uc3RhbnQpXG4gICAgICByZXR1cm4gIHZhbHVlICsgc3R1ZGVudFEqZXJyb3IvTWF0aC5zcXJ0KGRhdGEueC5sZW5ndGgpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAgdmFsdWUgKyBzdHVkZW50USooTWF0aC5hYnModmFsdWUpKmVycm9yL01hdGguc3FydChkYXRhLngubGVuZ3RoKSk7XG4gIH1cblxuICBsZXQgYm90dG9tID0gKHg6IG51bWJlcikgPT4ge1xuICAgIGxldCB2YWx1ZSA9IGN1cnZlRnVuY3Rpb24ocGFyYW1WYWx1ZXMsIHgpO1xuICAgIGlmIChlcnJvck1vZGVsID09IEZpdEVycm9yTW9kZWwuQ29uc3RhbnQpXG4gICAgICByZXR1cm4gIHZhbHVlIC0gc3R1ZGVudFEqZXJyb3IvTWF0aC5zcXJ0KGRhdGEueC5sZW5ndGgpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAgdmFsdWUgLSBzdHVkZW50USooTWF0aC5hYnModmFsdWUpKmVycm9yL01hdGguc3FydChkYXRhLngubGVuZ3RoKSk7XG4gIH1cblxuICBsZXQgaW52OiAoeTogbnVtYmVyKSA9PiBudW1iZXIgPSAoeTogbnVtYmVyKSA9PiB7cmV0dXJuIDA7fTtcbiAgbGV0IGludlRvcDogKHk6IG51bWJlcikgPT4gbnVtYmVyID0gKHk6IG51bWJlcikgPT4ge3JldHVybiAwO307XG4gIGxldCBpbnZCb3R0b206ICh5OiBudW1iZXIpID0+IG51bWJlciA9ICh5OiBudW1iZXIpID0+IHtyZXR1cm4gMDt9O1xuXG4gIGlmIChzdGF0aXN0aWNzKSB7XG4gICAgaW52ID0gKHk6IG51bWJlcikgPT4ge1xuICAgICAgLy9zaG91bGQgY2hlY2sgaWYgbW9yZSB0aGFuIGJvdHRvbSBhbmQgbGVzcyB0aGFuIHRvcFxuICAgICAgcmV0dXJuIHBhcmFtVmFsdWVzWzJdL01hdGgucG93KChwYXJhbVZhbHVlc1swXSAtIHkpLyh5IC0gcGFyYW1WYWx1ZXNbM10pLCAxL3BhcmFtVmFsdWVzWzFdKTtcbiAgICB9O1xuXG4gICAgbGV0IGVycm9yID0gZ2V0SW52RXJyb3IoaW52LCBkYXRhKTtcblxuICAgIGludlRvcCA9ICh5OiBudW1iZXIpID0+e1xuICAgICAgbGV0IHZhbHVlID0gaW52KHkpO1xuICAgICAgcmV0dXJuICB2YWx1ZSArIHN0dWRlbnRRKmVycm9yL01hdGguc3FydChkYXRhLnkubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpbnZCb3R0b20gPSAoeTogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBpbnYoeSk7XG4gICAgICByZXR1cm4gIHZhbHVlIC0gc3R1ZGVudFEqZXJyb3IvTWF0aC5zcXJ0KGRhdGEueS5sZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBmaXRSZXM6IEZpdFJlc3VsdCA9IHtcbiAgICBwYXJhbWV0ZXJzOiBwYXJhbVZhbHVlcyxcbiAgICBmaXR0ZWRDdXJ2ZTogZml0dGVkQ3VydmUsXG4gICAgY29uZmlkZW5jZVRvcDogdG9wLFxuICAgIGNvbmZpZGVuY2VCb3R0b206IGJvdHRvbSxcbiAgICByU3F1YXJlZDogc3RhdGlzdGljcyA/IGdldERldENvZWZmKGZpdHRlZEN1cnZlLCBkYXRhKSA6IHVuZGVmaW5lZCxcbiAgICBhdWM6IHN0YXRpc3RpY3MgPyBnZXRBdWMoZml0dGVkQ3VydmUsIGRhdGEpIDogdW5kZWZpbmVkLFxuICAgIGludmVydGVkOiBzdGF0aXN0aWNzID8gaW52IDogdW5kZWZpbmVkLFxuICAgIGludmVydGVkVG9wOiBzdGF0aXN0aWNzID8gaW52VG9wIDogdW5kZWZpbmVkLFxuICAgIGludmVydGVkQm90dG9tOiBzdGF0aXN0aWNzID8gaW52Qm90dG9tIDogdW5kZWZpbmVkLFxuICAgIGludGVyY2VwdFggOiBwYXJhbVZhbHVlc1syXSxcbiAgICBpbnRlcmNlcHRZIDogZml0dGVkQ3VydmUocGFyYW1WYWx1ZXNbMl0pLFxuICAgIHNsb3BlOiBwYXJhbVZhbHVlc1sxXSxcbiAgICB0b3A6IHBhcmFtVmFsdWVzWzBdLFxuICAgIGJvdHRvbTogcGFyYW1WYWx1ZXNbM11cbiAgfTtcblxuICByZXR1cm4gZml0UmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbW9pZChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBBID0gcGFyYW1zWzBdO1xuICBjb25zdCBCID0gcGFyYW1zWzFdO1xuICBjb25zdCBDID0gcGFyYW1zWzJdO1xuICBjb25zdCBEID0gcGFyYW1zWzNdO1xuICBjb25zdCByZXMgPSBEICsgKEEgLSBEKS8oMSArIE1hdGgucG93KDEwLCAoeCAtIEMpKkIpKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0aXZlRGVyaXZhdGl2ZShvZjogT2JqZWN0aXZlRnVuY3Rpb24sIGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlcixcbiAgICBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSwgcGFyYW1zOiBudW1iZXJbXSwgc2VsZWN0ZWRQYXJhbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IHN0ZXAgPSBwYXJhbXNbc2VsZWN0ZWRQYXJhbV0qMC4wMDAxO1xuICBzdGVwID0gc3RlcCA9PSAwID8gMC4wMDEgOiBzdGVwO1xuICBsZXQgcGFyYW1zVG9wOiBudW1iZXJbXSA9IFtdO1xuICBsZXQgcGFyYW1zQm90dG9tOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgIGlmKGkgPT0gc2VsZWN0ZWRQYXJhbSkge1xuICAgICAgcGFyYW1zVG9wLnB1c2gocGFyYW1zW2ldICsgc3RlcCk7XG4gICAgICBwYXJhbXNCb3R0b20ucHVzaChwYXJhbXNbaV0gLSBzdGVwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zVG9wLnB1c2gocGFyYW1zW2ldKTtcbiAgICAgIHBhcmFtc0JvdHRvbS5wdXNoKHBhcmFtc1tpXSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGRydlRvcCA9IG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtc1RvcCkudmFsdWU7XG4gIGNvbnN0IGRydkJvdHRvbSA9IG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtc0JvdHRvbSkudmFsdWU7XG5cbiAgcmV0dXJuIChkcnZUb3AgLSBkcnZCb3R0b20pLygyKnN0ZXApO1xufVxuXG5mdW5jdGlvbiBnZXRBdWMoZml0dGVkQ3VydmU6ICh4OiBudW1iZXIpID0+IG51bWJlcixcbiAgICAgICAgICAgICAgICBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSk6IG51bWJlciB7XG4gIGxldCBhdWMgPSAwO1xuXG4gIGxldCBtaW4gPSBNYXRoLm1pbiguLi5kYXRhLngpO1xuICBsZXQgbWF4ID0gTWF0aC5tYXgoLi4uZGF0YS54KTtcbiAgY29uc3QgaW50ZWdyYXRpb25TdGVwID0gKG1heCAtIG1pbikvMTAwMDtcblxuICBmb3IobGV0IHggPSBtaW47IHggPCBtYXg7IHgrPSBpbnRlZ3JhdGlvblN0ZXApXG4gICAgYXVjICs9IGludGVncmF0aW9uU3RlcCpmaXR0ZWRDdXJ2ZSh4KTtcblxuICByZXR1cm4gYXVjO1xufVxuXG5mdW5jdGlvbiBnZXREZXRDb2VmZihmaXR0ZWRDdXJ2ZTogKHg6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgZGF0YToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0pOiBudW1iZXIge1xuICBsZXQgc3NSZXMgPSAwO1xuICBsZXQgc3NUb3QgPSAwO1xuXG4gIGNvbnN0IHlNZWFuID0galN0YXQubWVhbihkYXRhLnkpO1xuXG4gIGZvcihsZXQgaSA9IDA7IGkgPCBkYXRhLngubGVuZ3RoOyBpKyspIHtcbiAgICBzc1JlcyArPSBNYXRoLnBvdyhkYXRhLnlbaV0gLSBmaXR0ZWRDdXJ2ZShkYXRhLnhbaV0pLCAyKTtcbiAgICBzc1RvdCArPSBNYXRoLnBvdyhkYXRhLnlbaV0gLSB5TWVhbiwgMik7XG4gIH1cblxuICByZXR1cm4gMSAtIHNzUmVzL3NzVG90O1xufVxuXG5mdW5jdGlvbiBnZXRJbnZFcnJvciAoXG4gIHRhcmdldEZ1bmM6ICh5OiBudW1iZXIpID0+IG51bWJlcixcbiAgZGF0YToge3k6IG51bWJlcltdLCB4OiBudW1iZXJbXX1cbik6IG51bWJlciB7XG4gIGNvbnN0IHBpID0gTWF0aC5QSTtcbiAgbGV0IHNpZ21hID0gMDtcbiAgbGV0IHNpZ21hU3EgPSAwO1xuXG4gIGxldCByZXNpZHVlc1NxdWFyZXMgPSBuZXcgRmxvYXQzMkFycmF5KGRhdGEueS5sZW5ndGgpO1xuICBmb3IobGV0IGkgPSAwOyBpIDwgZGF0YS55Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb2JzID0gZGF0YS54W2ldO1xuICAgIGNvbnN0IHByZWQgPSB0YXJnZXRGdW5jKGRhdGEueVtpXSk7XG4gICAgcmVzaWR1ZXNTcXVhcmVzW2ldID0gTWF0aC5wb3cob2JzIC0gcHJlZCwgMik7XG4gIH1cblxuICBmb3IobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIHNpZ21hU3EgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldO1xuICBzaWdtYVNxIC89IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7XG4gIHNpZ21hID0gTWF0aC5zcXJ0KHNpZ21hU3EpO1xuXG4gIHJldHVybiBzaWdtYTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0aXZlTm9ybWFsQ29uc3RhbnQgKFxuICB0YXJnZXRGdW5jOiAocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKSA9PiBudW1iZXIsXG4gIGRhdGE6IHt5OiBudW1iZXJbXSwgeDogbnVtYmVyW119LFxuICBwYXJhbXM6IG51bWJlcltdXG4pOiBMaWtlbGlob29kIHtcbiAgLy9hc3N1cmUgb2JzZXJ2ZWQgYW5kIGFyZ3Mgc2FtZSBsZW5ndGhcbiAgY29uc3QgcGkgPSBNYXRoLlBJO1xuICBsZXQgc2lnbWEgPSAwO1xuICBsZXQgc2lnbWFTcSA9IDA7XG4gIGxldCBsaWtlbGlob29kID0gMDtcblxuICBsZXQgcmVzaWR1ZXNTcXVhcmVzID0gbmV3IEZsb2F0MzJBcnJheShkYXRhLngubGVuZ3RoKTtcbiAgZm9yKGxldCBpID0gMDsgaSA8IGRhdGEueC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG9icyA9IGRhdGEueVtpXTtcbiAgICBjb25zdCBwcmVkID0gdGFyZ2V0RnVuYyhwYXJhbXMsIGRhdGEueFtpXSk7XG4gICAgcmVzaWR1ZXNTcXVhcmVzW2ldID0gTWF0aC5wb3cob2JzIC0gcHJlZCwgMik7XG4gIH1cblxuICBmb3IobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIHNpZ21hU3EgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldO1xuICBzaWdtYVNxIC89IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7XG4gIHNpZ21hID0gTWF0aC5zcXJ0KHNpZ21hU3EpO1xuXG4gIGZvcihsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspXG4gICAgbGlrZWxpaG9vZCArPSByZXNpZHVlc1NxdWFyZXNbaV0vc2lnbWFTcSArIE1hdGgubG9nKDIgKiBwaSAqIHNpZ21hU3EpO1xuXG4gIHJldHVybiB7dmFsdWU6IC1saWtlbGlob29kLCBjb25zdDogc2lnbWEsIG11bHQ6IDB9O1xufVxuXG5mdW5jdGlvbiBvYmplY3RpdmVOb3JtYWxQcm9wb3J0aW9uYWwgKFxudGFyZ2V0RnVuYzogKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyLFxuZGF0YToge3k6IG51bWJlcltdLCB4OiBudW1iZXJbXX0sXG5wYXJhbXM6IG51bWJlcltdXG4pOiBMaWtlbGlob29kIHtcbiAgLy9hc3N1cmUgb2JzZXJ2ZWQgYW5kIGFyZ3Mgc2FtZSBsZW5ndGhcbiAgY29uc3QgcGkgPSBNYXRoLlBJO1xuICBsZXQgc2lnbWEgPSAwO1xuICBsZXQgc2lnbWFTcSA9IDA7XG4gIGxldCBsaWtlbGlob29kID0gMDtcblxuICBsZXQgcmVzaWR1ZXNTcXVhcmVzID0gbmV3IEZsb2F0MzJBcnJheShkYXRhLngubGVuZ3RoKTtcbiAgZm9yKGxldCBpID0gMDsgaSA8IGRhdGEueC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG9icyA9IGRhdGEueVtpXTtcbiAgICBjb25zdCBwcmVkID0gdGFyZ2V0RnVuYyhwYXJhbXMsIGRhdGEueFtpXSlcbiAgICByZXNpZHVlc1NxdWFyZXNbaV0gPSBNYXRoLnBvdyhvYnMgLSBwcmVkLCAyKTtcbiAgfVxuXG4gIGZvcihsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspXG4gICAgc2lnbWFTcSArPSByZXNpZHVlc1NxdWFyZXNbaV07XG4gIHNpZ21hU3EgLz0gcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDtcbiAgc2lnbWEgPSBNYXRoLnNxcnQoc2lnbWFTcSk7XG5cbiAgZm9yKGxldCBpID0gMDsgaSA8IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7IGkrKylcbiAgICBsaWtlbGlob29kICs9IHJlc2lkdWVzU3F1YXJlc1tpXS9zaWdtYVNxICsgTWF0aC5sb2coMipwaSpzaWdtYVNxKTtcblxuICByZXR1cm4ge3ZhbHVlOiAtbGlrZWxpaG9vZCwgY29uc3Q6IHNpZ21hLCBtdWx0OiAwfTtcbn1cbiJdfQ==