@magic-xpa/gui 4.800.0-dev480.21 → 4.800.0-dev480.213
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/bundles/magic-xpa-gui.umd.js +1055 -7529
- package/bundles/magic-xpa-gui.umd.js.map +1 -1
- package/bundles/magic-xpa-gui.umd.min.js +1 -1
- package/bundles/magic-xpa-gui.umd.min.js.map +1 -1
- package/esm2015/index.js +1 -1
- package/esm2015/magic-xpa-gui.js +1 -4
- package/esm2015/src/Commands.js +11 -114
- package/esm2015/src/Events.js +1 -517
- package/esm2015/src/EventsProcessor.js +1 -51
- package/esm2015/src/FocusManager.js +1 -13
- package/esm2015/src/GuiConstants.js +2 -11
- package/esm2015/src/GuiEnums.js +126 -130
- package/esm2015/src/GuiEnvironment.js +1 -1
- package/esm2015/src/IFlowMonitorQueue.js +1 -1
- package/esm2015/src/Manager.js +10 -148
- package/esm2015/src/UIBridge.js +1 -6
- package/esm2015/src/env/IEnvironment.js +1 -1
- package/esm2015/src/gui/ControlBase.js +1 -1
- package/esm2015/src/gui/GuiMgControl.js +1 -94
- package/esm2015/src/gui/GuiMgForm.js +1 -1
- package/esm2015/src/gui/KeyboardItem.js +5 -46
- package/esm2015/src/gui/LastFocusedVal.js +1 -5
- package/esm2015/src/gui/MgValue.js +1 -1
- package/esm2015/src/gui/PropParentInterface.js +1 -1
- package/esm2015/src/gui/low/DialogHandler.js +1 -10
- package/esm2015/src/gui/low/GuiCommand.js +1 -12
- package/esm2015/src/gui/low/GuiCommandQueue.js +1 -66
- package/esm2015/src/gui/low/GuiInteractive.js +8 -465
- package/esm2015/src/gui/low/Style.js +1 -9
- package/esm2015/src/management/RuntimeContextBase.js +11 -14
- package/esm2015/src/management/data/BlobType.js +0 -0
- package/esm2015/src/management/data/DcValues.js +8 -67
- package/esm2015/src/management/data/DcValuesBuilderBase.js +2 -37
- package/esm2015/src/management/data/FieldDef.js +1 -95
- package/esm2015/src/management/data/FieldsTable.js +2 -28
- package/esm2015/src/management/data/GuiDataViewBase.js +33 -72
- package/esm2015/src/management/data/GuiFieldBase.js +4 -39
- package/esm2015/src/management/data/IRecord.js +1 -1
- package/esm2015/src/management/data/IReferencedObject.js +1 -8
- package/esm2015/src/management/data/NUM_TYPE.js +14 -485
- package/esm2015/src/management/data/ObjectReferenceBase.js +1 -3
- package/esm2015/src/management/data/ObjectReferencesCollection.js +1 -2
- package/esm2015/src/management/data/RecordUtils.js +6 -112
- package/esm2015/src/management/data/VectorType.js +17 -252
- package/esm2015/src/management/data/VectorTypeBase.js +1 -35
- package/esm2015/src/management/events/IActionManager.js +1 -1
- package/esm2015/src/management/events/IGuiEventsManager.js +1 -1
- package/esm2015/src/management/exp/ExpressionInterface.js +5 -3
- package/esm2015/src/management/exp/GuiExpressionEvaluator.js +38 -155
- package/esm2015/src/management/gui/ControlTable.js +18 -72
- package/esm2015/src/management/gui/DisplayConvertor.js +43 -493
- package/esm2015/src/management/gui/FieldValidator.js +58 -339
- package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +1 -1
- package/esm2015/src/management/gui/GuiFormPropertyAdapter.js +1 -8
- package/esm2015/src/management/gui/HebrewDate.js +3 -140
- package/esm2015/src/management/gui/Helps.js +2 -48
- package/esm2015/src/management/gui/MgControlBase.js +143 -876
- package/esm2015/src/management/gui/MgFormBase.js +68 -407
- package/esm2015/src/management/gui/PIC.js +58 -285
- package/esm2015/src/management/gui/PropDefaults.js +13 -48
- package/esm2015/src/management/gui/PropInterface.js +2 -4
- package/esm2015/src/management/gui/PropTable.js +72 -183
- package/esm2015/src/management/gui/Property.js +38 -372
- package/esm2015/src/management/gui/ValidationDetails.js +10 -52
- package/esm2015/src/management/gui/ValidationDetailsBase.js +12 -45
- package/esm2015/src/management/gui/WrongFormatException.js +1 -15
- package/esm2015/src/management/tasks/GuiDataCollection.js +1 -1
- package/esm2015/src/management/tasks/GuiTaskBase.js +38 -383
- package/esm2015/src/management/tasks/IMGDataTable.js +1 -1
- package/esm2015/src/management/tasks/ITask.js +1 -1
- package/esm2015/src/management/tasks/MgTimer.js +1 -16
- package/esm2015/src/management/tasks/TaskDefinitionId.js +8 -18
- package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +1 -13
- package/esm2015/src/util/AuthenticationDialogHandler.js +1 -4
- package/esm2015/src/util/MemoryUtil.js +1 -41
- package/esm2015/src/util/ObjectReference.js +1 -8
- package/esm2015/src/util/ProcessLauncher.js +3 -21
- package/esm2015/src/util/UsernamePasswordCredentials.js +1 -9
- package/fesm2015/magic-xpa-gui.js +859 -7052
- package/fesm2015/magic-xpa-gui.js.map +1 -1
- package/magic-xpa-gui.d.ts +0 -3
- package/package.json +2 -2
- package/src/Commands.d.ts +2 -0
- package/src/Events.d.ts +0 -2
- package/src/GuiEnums.d.ts +125 -128
- package/src/env/IEnvironment.d.ts +3 -0
- package/src/gui/PropParentInterface.d.ts +1 -1
- package/src/gui/low/GuiInteractive.d.ts +3 -1
- package/src/gui/low/Style.d.ts +0 -3
- package/src/management/RuntimeContextBase.d.ts +2 -0
- package/src/management/data/GuiDataViewBase.d.ts +4 -4
- package/src/management/data/IRecord.d.ts +1 -1
- package/src/management/exp/ExpressionInterface.d.ts +4 -0
- package/src/management/exp/GuiExpressionEvaluator.d.ts +4 -6
- package/src/management/gui/ControlTable.d.ts +1 -1
- package/src/management/gui/DisplayConvertor.d.ts +1 -1
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +1 -1
- package/src/management/gui/MgControlBase.d.ts +7 -7
- package/src/management/gui/MgFormBase.d.ts +6 -6
- package/src/management/gui/PIC.d.ts +1 -0
- package/src/management/gui/PropInterface.d.ts +2 -4
- package/src/management/gui/PropTable.d.ts +4 -5
- package/src/management/gui/Property.d.ts +1 -1
- package/src/management/tasks/GuiTaskBase.d.ts +8 -14
- package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
|
@@ -8,6 +8,7 @@ import { NUM_TYPE } from '../data/NUM_TYPE';
|
|
|
8
8
|
import { HebrewDate } from './HebrewDate';
|
|
9
9
|
import { BlobType } from '../data/BlobType';
|
|
10
10
|
import { GuiEnvironment } from '../../GuiEnvironment';
|
|
11
|
+
import { PropInterface } from "./PropInterface";
|
|
11
12
|
export class FieldValidator {
|
|
12
13
|
constructor() {
|
|
13
14
|
this._newvalue = null;
|
|
@@ -23,16 +24,12 @@ export class FieldValidator {
|
|
|
23
24
|
this._environment = GuiEnvironment.Environment;
|
|
24
25
|
this._decimal = (this._environment.GetDecimal() || "");
|
|
25
26
|
}
|
|
26
|
-
/// <summary> the main method of this class</summary>
|
|
27
|
-
/// <param name="valDet">a ValidationDetails object to use when validating</param>
|
|
28
27
|
checkVal(valDet) {
|
|
29
28
|
this._newvalue = (this._oldvalue = (this._pictureReal = (this._pictureEnable = null)));
|
|
30
29
|
this.init(valDet);
|
|
31
30
|
valDet.setValidationFailed(false);
|
|
32
31
|
let ctrl = valDet.getControl();
|
|
33
|
-
|
|
34
|
-
// let modInQueuy: boolean = await ctrl.checkPropWithLine(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false, ctrl.getDisplayLine(false));
|
|
35
|
-
let modInQueuy = ctrl.Type === MgControlType.CTRL_TYPE_TAB;
|
|
32
|
+
let modInQueuy = ctrl.isRepeatable() ? false : ctrl.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false, ctrl.getDisplayLine(false));
|
|
36
33
|
let useNative = ctrl.isModifiable();
|
|
37
34
|
if (ctrl.getForm().getTask().getMode() === 'E' && !modInQueuy) {
|
|
38
35
|
valDet.setValue(this._oldvalue);
|
|
@@ -59,7 +56,6 @@ export class FieldValidator {
|
|
|
59
56
|
valDet.setValue(this._newvalue);
|
|
60
57
|
return valDet;
|
|
61
58
|
}
|
|
62
|
-
// space|nothing was inserted -> use default value
|
|
63
59
|
if (ctrl.DataType !== StorageAttribute.ALPHA && ctrl.DataType !== StorageAttribute.UNICODE && ctrl.DataType !== StorageAttribute.BLOB) {
|
|
64
60
|
if ((typeof this._newvalue === 'string' && this._newvalue.trim().length === 0) || (ctrl.DataType === StorageAttribute.DATE && (ctrl.isDateZero(this._newvalue) || this.isNullDisplayVal()))) {
|
|
65
61
|
let field = ctrl.getField();
|
|
@@ -91,7 +87,7 @@ export class FieldValidator {
|
|
|
91
87
|
valDet.setValue(this.checkAlphaField());
|
|
92
88
|
break;
|
|
93
89
|
case StorageAttribute.NUMERIC:
|
|
94
|
-
this._pictureReal = valDet.getPictureReal();
|
|
90
|
+
this._pictureReal = valDet.getPictureReal();
|
|
95
91
|
this._pictureEnable = valDet.getPictureEnable();
|
|
96
92
|
this.checkNumericPicture();
|
|
97
93
|
valDet.setValue(this.checkNumericField());
|
|
@@ -106,7 +102,6 @@ export class FieldValidator {
|
|
|
106
102
|
valDet.setValue(this.checkTimeField());
|
|
107
103
|
break;
|
|
108
104
|
case StorageAttribute.BLOB:
|
|
109
|
-
// there is no real picture to BLOB, do nothing
|
|
110
105
|
case StorageAttribute.BLOB_VECTOR:
|
|
111
106
|
valDet.setValue(this._newvalue);
|
|
112
107
|
break;
|
|
@@ -118,7 +113,6 @@ export class FieldValidator {
|
|
|
118
113
|
}
|
|
119
114
|
catch (goBack) {
|
|
120
115
|
if (goBack instanceof WrongFormatException) {
|
|
121
|
-
// need change to old value, set focus back and write Error Message
|
|
122
116
|
valDet.setValue(this._oldvalue);
|
|
123
117
|
this.setValidationFailed(true);
|
|
124
118
|
if (goBack.getType() !== MsgInterface.STR_RNG_TXT) {
|
|
@@ -132,13 +126,6 @@ export class FieldValidator {
|
|
|
132
126
|
}
|
|
133
127
|
return valDet;
|
|
134
128
|
}
|
|
135
|
-
/// <summary>Check & validate Alpha field by his old/new value and 2 pictures:
|
|
136
|
-
/// Real and Enable
|
|
137
|
-
/// 1.check if newvalue complete with pictures, otherwise return oldvalue
|
|
138
|
-
/// 2.check if newvalue complete with range
|
|
139
|
-
/// 2.1 complete value, if possible, otherwise return oldvalue
|
|
140
|
-
/// </summary>
|
|
141
|
-
/// <returns> String - new value of validated field</returns>
|
|
142
129
|
checkAlphaField() {
|
|
143
130
|
let control = this._valDet.getControl();
|
|
144
131
|
let IsAttrAlpha = this._valDet.getType() === StorageAttribute.ALPHA;
|
|
@@ -184,12 +171,12 @@ export class FieldValidator {
|
|
|
184
171
|
currPicture = currPicture + 2;
|
|
185
172
|
}
|
|
186
173
|
else {
|
|
187
|
-
stringBuilder.Append(' ')
|
|
174
|
+
stringBuilder.Append(' ');
|
|
188
175
|
currPicture = currPicture + 1;
|
|
189
176
|
}
|
|
190
177
|
}
|
|
191
178
|
else {
|
|
192
|
-
stringBuilder.Append(' ')
|
|
179
|
+
stringBuilder.Append(' ');
|
|
193
180
|
currPicture = currPicture + 1;
|
|
194
181
|
}
|
|
195
182
|
}
|
|
@@ -212,7 +199,7 @@ export class FieldValidator {
|
|
|
212
199
|
}
|
|
213
200
|
}
|
|
214
201
|
else {
|
|
215
|
-
stringBuilder.Append(' ')
|
|
202
|
+
stringBuilder.Append(' ');
|
|
216
203
|
currPicture = currPicture + 1;
|
|
217
204
|
if (this._valDet.getControl() !== null) {
|
|
218
205
|
let type = control.Type;
|
|
@@ -230,9 +217,6 @@ export class FieldValidator {
|
|
|
230
217
|
}
|
|
231
218
|
return this._newvalue;
|
|
232
219
|
}
|
|
233
|
-
/// <summary>check if char in Alpha compleate with Directive Character for the letter</summary>
|
|
234
|
-
/// <param name="index">of directive in string to check</param>
|
|
235
|
-
/// <returns> true if complete, false otherwise</returns>
|
|
236
220
|
isPossibleAlphaLetter(indexInput, indexPicture) {
|
|
237
221
|
let result;
|
|
238
222
|
switch (this._picture.charCodeAt(indexPicture)) {
|
|
@@ -265,9 +249,6 @@ export class FieldValidator {
|
|
|
265
249
|
return false;
|
|
266
250
|
}
|
|
267
251
|
}
|
|
268
|
-
/// <summary>if new value wasn't finished and stay unwritable peaces of the Real picture - add it
|
|
269
|
-
/// to the end of the newvalue
|
|
270
|
-
/// </summary>
|
|
271
252
|
fillAllAlpha() {
|
|
272
253
|
let stringBuilder = new StringBuilder(this._picture.length);
|
|
273
254
|
stringBuilder.Append(this._newvalue);
|
|
@@ -286,7 +267,7 @@ export class FieldValidator {
|
|
|
286
267
|
else {
|
|
287
268
|
for (let i = this._newvalue.length - 1; i < this._picture.length && i >= 0; i++) {
|
|
288
269
|
if (DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(i))) {
|
|
289
|
-
stringBuilder.Append(' ')
|
|
270
|
+
stringBuilder.Append(' ');
|
|
290
271
|
}
|
|
291
272
|
else {
|
|
292
273
|
stringBuilder.Append(this._picture.charAt(i));
|
|
@@ -296,8 +277,6 @@ export class FieldValidator {
|
|
|
296
277
|
}
|
|
297
278
|
return stringBuilder.ToString();
|
|
298
279
|
}
|
|
299
|
-
/// <summary>Comparative newvalue with possible Range in ContinuousRangeValues/DiscreteRangeValues</summary>
|
|
300
|
-
/// <returns> newvalue if it possible, oldvalue otherwise</returns>
|
|
301
280
|
fillAlphaByRange(ContinuousRangeValues, DiscreteRangeValues) {
|
|
302
281
|
let tmpBuffer = DisplayConvertor.Instance.fillAlphaByDiscreteRangeValues(DiscreteRangeValues, this._newvalue);
|
|
303
282
|
if (tmpBuffer !== null) {
|
|
@@ -311,24 +290,14 @@ export class FieldValidator {
|
|
|
311
290
|
this.printMessage(MsgInterface.STR_RNG_TXT, true);
|
|
312
291
|
return this._oldvalue;
|
|
313
292
|
}
|
|
314
|
-
/// <summary>Try to complete the newvalue by Range</summary>
|
|
315
|
-
/// <returns> completed value if it possible, otherwise oldvalue</returns>
|
|
316
293
|
CompleteAlphaByRange(DiscreteRangeValues) {
|
|
317
294
|
let tmpNewValue = DisplayConvertor.Instance.completeAlphaByRange(DiscreteRangeValues, this._newvalue);
|
|
318
295
|
if (tmpNewValue !== null) {
|
|
319
296
|
return tmpNewValue;
|
|
320
297
|
}
|
|
321
|
-
// focus back
|
|
322
298
|
this.printMessage(MsgInterface.STR_RNG_TXT, true);
|
|
323
299
|
return this._oldvalue;
|
|
324
300
|
}
|
|
325
|
-
/// <summary>check & validate Logical field by his old/new value and 2 pictures:
|
|
326
|
-
/// Real and Enable
|
|
327
|
-
/// 1.check if newvalue complete with pictures, otherwise return oldvalue
|
|
328
|
-
/// 2.check if newvalue complete with range
|
|
329
|
-
/// 2.1 complete value, if possible, otherwise return oldvalue
|
|
330
|
-
/// </summary>
|
|
331
|
-
/// <returns> String - new value of validated field</returns>
|
|
332
301
|
checkLogicalField() {
|
|
333
302
|
if (this._newvalue.length === 0 && this._valDet.getContinuousRangeValues() === null && this._valDet.getDiscreteRangeValues() === null) {
|
|
334
303
|
throw new WrongFormatException(MsgInterface.STR_RNG_TXT);
|
|
@@ -337,17 +306,8 @@ export class FieldValidator {
|
|
|
337
306
|
this._newvalue = this.fillAlphaByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues());
|
|
338
307
|
}
|
|
339
308
|
this.setValidationFailed(false);
|
|
340
|
-
// todo : need to check what is to handle for checking ranges
|
|
341
309
|
return this._newvalue;
|
|
342
310
|
}
|
|
343
|
-
/// <summary>**************************Numeric*********************************</summary>
|
|
344
|
-
/// <summary>check & validate Numeric field by his old/new value and 2 pictures:
|
|
345
|
-
/// Real and Enable
|
|
346
|
-
/// 1.check if newvalue complete with pictures, otherwise return oldvalue
|
|
347
|
-
/// 2.check if newvalue complete with range
|
|
348
|
-
/// 2.1 complete value, if possible, otherwise return oldvalue
|
|
349
|
-
/// </summary>
|
|
350
|
-
/// <returns> String - new value of validated field</returns>
|
|
351
311
|
checkNumericField() {
|
|
352
312
|
let evaluated;
|
|
353
313
|
if (typeof this._newvalue === 'string') {
|
|
@@ -360,7 +320,6 @@ export class FieldValidator {
|
|
|
360
320
|
let evaluatedLeft;
|
|
361
321
|
let evaluatedRight;
|
|
362
322
|
this.setValidationFailed(false);
|
|
363
|
-
// check if the format of newvalue matches the numeric mask.
|
|
364
323
|
if (!this.checkNumericInDecFormat())
|
|
365
324
|
throw new WrongFormatException(MsgInterface.EDT_ERR_STR_1);
|
|
366
325
|
if (delimeterPictIndex !== -1 && delimeterRealIndex !== -1) {
|
|
@@ -374,7 +333,7 @@ export class FieldValidator {
|
|
|
374
333
|
evaluatedRight = this.checkNumericRight(delimeterPictIndex, delimeterPictIndex - 1);
|
|
375
334
|
evaluated = evaluatedLeft + this._decimal + evaluatedRight;
|
|
376
335
|
}
|
|
377
|
-
else {
|
|
336
|
+
else {
|
|
378
337
|
if (delimeterPictIndex === -1 && delimeterRealIndex === -1) {
|
|
379
338
|
evaluated = this.checkNumericRight(-1, -1);
|
|
380
339
|
evaluatedLeft = evaluated;
|
|
@@ -392,11 +351,10 @@ export class FieldValidator {
|
|
|
392
351
|
}
|
|
393
352
|
}
|
|
394
353
|
if ((evaluatedRight.length === 0 && evaluatedLeft.length === 0) || (evaluated.length === 0 && this._newvalue.length > 0)) {
|
|
395
|
-
// space|nothing was inserted -> use default value
|
|
396
354
|
let ctrl;
|
|
397
355
|
ctrl = this._valDet.getControl();
|
|
398
356
|
let field = ctrl.getField();
|
|
399
|
-
let defValue = field.getDefaultValue();
|
|
357
|
+
let defValue = field.getDefaultValue();
|
|
400
358
|
let dispDefValue = null;
|
|
401
359
|
if (field.isNullDefault()) {
|
|
402
360
|
this._valDet.setNull(true);
|
|
@@ -405,16 +363,12 @@ export class FieldValidator {
|
|
|
405
363
|
if (dispDefValue == null)
|
|
406
364
|
dispDefValue = DisplayConvertor.Instance.mg2disp(defValue, this._valDet.getRange(), this._valDet.getPIC(), true, field.getTask().getCompIdx(), false);
|
|
407
365
|
}
|
|
408
|
-
// check if the digit before the delimiter do not exceed the pic wholes.
|
|
409
366
|
let wholeDigitdiff = this.digitsBeforeDelimeter(evaluated, 0, this._decimal) - this._valDet.getPIC().getWholes();
|
|
410
|
-
// if they do, check if the exceeding chars are the pad chars. if so, there is no error.
|
|
411
367
|
if (wholeDigitdiff > 0) {
|
|
412
368
|
let padCharOnly = false;
|
|
413
|
-
// is there a pad, check it. no pad is a certain error.
|
|
414
369
|
if (this._valDet.getIsPadFill()) {
|
|
415
370
|
padCharOnly = true;
|
|
416
371
|
for (let i = 0; i < wholeDigitdiff && padCharOnly; i++)
|
|
417
|
-
// if the char is not the pad, then this is an error.
|
|
418
372
|
if (evaluated[i] !== this._valDet.getPadFillChar())
|
|
419
373
|
padCharOnly = false;
|
|
420
374
|
}
|
|
@@ -424,33 +378,22 @@ export class FieldValidator {
|
|
|
424
378
|
if (this._valDet.getIsNegative() && (this._newvalue.trim().startsWith("-") || (this._valDet.getNegativeSignPref().length !== 0 && this._newvalue.trim().startsWith(this._valDet.getNegativeSignPref())))) {
|
|
425
379
|
evaluated = "-" + evaluated;
|
|
426
380
|
}
|
|
427
|
-
// from this point have evaluated string - the value (without mask) of the control
|
|
428
|
-
// needed to be inserted to the picture
|
|
429
381
|
evaluated = DisplayConvertor.Instance.disp2mg(this._newvalue, "", this._valDet.getPIC(), this._valDet.getControl().getForm().getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
|
|
430
382
|
evaluated = DisplayConvertor.Instance.mg2disp(evaluated, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), true);
|
|
431
|
-
// in order check if user has entered a blank value , trim and then check it's length.
|
|
432
383
|
let tempDispVal = StrUtil.ltrim(evaluated);
|
|
433
384
|
if (tempDispVal.length === 0 && this._valDet.getPIC().zeroFill() && this._valDet.getPIC().getZeroPad() === ' ')
|
|
434
385
|
evaluated = "0";
|
|
435
386
|
}
|
|
436
387
|
else {
|
|
437
|
-
// from this point have evaluated string - the value (without mask) of the control
|
|
438
|
-
// needed to be inserted to the picture
|
|
439
388
|
evaluated = DisplayConvertor.Instance.disp2mg(this._newvalue, "", this._valDet.getPIC(), this._valDet.getControl().getForm().getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
|
|
440
389
|
evaluated = DisplayConvertor.Instance.mg2disp(evaluated, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), true);
|
|
441
390
|
}
|
|
442
|
-
// Insert the number to range
|
|
443
391
|
if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null) {
|
|
444
392
|
this._newvalue = evaluated;
|
|
445
393
|
evaluated = this.fillNumericByRange();
|
|
446
394
|
}
|
|
447
395
|
return evaluated;
|
|
448
396
|
}
|
|
449
|
-
/// <summary>Check validity of numerical picture from found 'delimeter' to left.
|
|
450
|
-
/// <-.
|
|
451
|
-
/// </summary>
|
|
452
|
-
/// <param name="delimeterPictIndex">found delimeter in the picture</param>
|
|
453
|
-
/// <param name="delimeterRealIndex">found delimeter in the inserted by user new value</param>
|
|
454
397
|
checkNumericLeft(delimeterPictIndex, delimeterRealIndex) {
|
|
455
398
|
let buffer = new StringBuilder();
|
|
456
399
|
let RealIndex = delimeterRealIndex - 1;
|
|
@@ -471,7 +414,6 @@ export class FieldValidator {
|
|
|
471
414
|
RealIndex = tmpstorage;
|
|
472
415
|
buffer.Append(this._pictureReal[PictIndex]);
|
|
473
416
|
}
|
|
474
|
-
// can insert only number
|
|
475
417
|
else {
|
|
476
418
|
for (; RealIndex >= 0; RealIndex--) {
|
|
477
419
|
if (UtilStrByteMode.isDigit(this._newvalue[RealIndex])) {
|
|
@@ -483,23 +425,16 @@ export class FieldValidator {
|
|
|
483
425
|
}
|
|
484
426
|
}
|
|
485
427
|
if (RealIndex < 0 && PictIndex >= 0)
|
|
486
|
-
// try to add unwritable
|
|
487
428
|
for (; PictIndex >= 0; PictIndex--) {
|
|
488
429
|
if (this._pictureEnable[PictIndex] === '1')
|
|
489
430
|
buffer.Append(this._pictureReal[PictIndex]);
|
|
490
431
|
else {
|
|
491
|
-
// only from left need PadFill
|
|
492
432
|
if (this._valDet.getIsPadFill())
|
|
493
433
|
buffer.Append(this._valDet.getPadFillChar());
|
|
494
434
|
}
|
|
495
435
|
}
|
|
496
436
|
return StrUtil.ReverseString(buffer).ToString();
|
|
497
437
|
}
|
|
498
|
-
/// <summary>Check validity of numerical picture from found 'delimeter' to right.
|
|
499
|
-
/// .->
|
|
500
|
-
/// </summary>
|
|
501
|
-
/// <param name="delimeterPictIndex">found delimeter in the picture</param>
|
|
502
|
-
/// <param name="delimeterRealIndex">found delimeter in the inserted by user new value</param>
|
|
503
438
|
checkNumericRight(delimeterPictIndex, delimeterRealIndex) {
|
|
504
439
|
let buffer = new StringBuilder();
|
|
505
440
|
let RealIndex = delimeterRealIndex + 1;
|
|
@@ -511,10 +446,8 @@ export class FieldValidator {
|
|
|
511
446
|
RealIndex = PictIndex;
|
|
512
447
|
buffer.Append(this._pictureReal[PictIndex]);
|
|
513
448
|
}
|
|
514
|
-
// can insert only number
|
|
515
449
|
else {
|
|
516
450
|
for (; RealIndex < this._newvalue.length; RealIndex++) {
|
|
517
|
-
// Append the digit of actual input data. If it is mask char, skip it.
|
|
518
451
|
if (UtilStrByteMode.isDigit(this._newvalue[RealIndex]) && !pic.picIsMask(RealIndex)) {
|
|
519
452
|
buffer.Append(this._newvalue[RealIndex]);
|
|
520
453
|
RealIndex++;
|
|
@@ -523,27 +456,21 @@ export class FieldValidator {
|
|
|
523
456
|
}
|
|
524
457
|
}
|
|
525
458
|
}
|
|
526
|
-
// if right part has any input data, then only append unwritable chars
|
|
527
459
|
if (buffer.Length > 0) {
|
|
528
460
|
if (RealIndex >= this._newvalue.length && PictIndex < this._pictureReal.length)
|
|
529
|
-
// try to add unwritable
|
|
530
461
|
for (; PictIndex < this._pictureReal.length; PictIndex++) {
|
|
531
462
|
if (this._pictureEnable[PictIndex] === '1')
|
|
532
463
|
buffer.Append(this._pictureReal[PictIndex]);
|
|
533
|
-
// else Do nothing
|
|
534
464
|
}
|
|
535
465
|
}
|
|
536
466
|
return buffer.ToString();
|
|
537
467
|
}
|
|
538
|
-
/// <summary>BUG: 442788
|
|
539
|
-
/// Changing decimal separator in thew pictureReal to value got from Environment
|
|
540
|
-
/// </summary>
|
|
541
468
|
checkNumericPicture() {
|
|
542
469
|
let indexOfDec;
|
|
543
470
|
let lastDec;
|
|
544
471
|
let maxLength;
|
|
545
472
|
let currIndx;
|
|
546
|
-
let POINT_DEC = ".";
|
|
473
|
+
let POINT_DEC = ".";
|
|
547
474
|
let pic = this._valDet.getPIC();
|
|
548
475
|
if (this._pictureReal == null || this._pictureEnable == null || pic.getAttr() !== StorageAttribute.NUMERIC || !pic.withDecimal())
|
|
549
476
|
return;
|
|
@@ -553,25 +480,17 @@ export class FieldValidator {
|
|
|
553
480
|
while (currIndx < lastDec) {
|
|
554
481
|
indexOfDec = this._pictureEnable.indexOf("1", currIndx);
|
|
555
482
|
if (indexOfDec === -1)
|
|
556
|
-
// not found
|
|
557
483
|
return;
|
|
558
484
|
else {
|
|
559
|
-
if (indexOfDec === this._pictureReal.indexOf(POINT_DEC, currIndx))
|
|
560
|
-
// it's real decimal point and not \. into the picture
|
|
561
|
-
{
|
|
485
|
+
if (indexOfDec === this._pictureReal.indexOf(POINT_DEC, currIndx)) {
|
|
562
486
|
let first;
|
|
563
487
|
let second;
|
|
564
488
|
first = second = "";
|
|
565
|
-
if (indexOfDec === 0)
|
|
566
|
-
// the point on the first place .###
|
|
567
|
-
{
|
|
489
|
+
if (indexOfDec === 0) {
|
|
568
490
|
if (indexOfDec + 1 < maxLength)
|
|
569
|
-
// only 1 .
|
|
570
491
|
second = this._pictureReal.substr(indexOfDec + 1);
|
|
571
492
|
}
|
|
572
|
-
else if (indexOfDec === maxLength)
|
|
573
|
-
// the point on the last place ###.
|
|
574
|
-
{
|
|
493
|
+
else if (indexOfDec === maxLength) {
|
|
575
494
|
first = this._pictureReal.substr(0, indexOfDec);
|
|
576
495
|
}
|
|
577
496
|
else {
|
|
@@ -587,8 +506,6 @@ export class FieldValidator {
|
|
|
587
506
|
}
|
|
588
507
|
}
|
|
589
508
|
}
|
|
590
|
-
/// <summary> Compare newvalue with the range</summary>
|
|
591
|
-
/// <returns> newvalue if it's in the range, oldvalue otherwise</returns>
|
|
592
509
|
fillNumericByRange() {
|
|
593
510
|
let controlPic = this._valDet.getControl().getPIC();
|
|
594
511
|
let continuousRangeValues = this._valDet.getContinuousRangeValues();
|
|
@@ -609,7 +526,6 @@ export class FieldValidator {
|
|
|
609
526
|
}
|
|
610
527
|
}
|
|
611
528
|
catch (ex_CC) {
|
|
612
|
-
// skip non-numeric range values
|
|
613
529
|
}
|
|
614
530
|
}
|
|
615
531
|
}
|
|
@@ -625,23 +541,17 @@ export class FieldValidator {
|
|
|
625
541
|
}
|
|
626
542
|
}
|
|
627
543
|
catch (ex_15B) {
|
|
628
|
-
// skip non-numeric range values
|
|
629
544
|
}
|
|
630
545
|
}
|
|
631
546
|
}
|
|
632
547
|
throw new WrongFormatException();
|
|
633
548
|
}
|
|
634
|
-
/// <summary> returns a numeric value extracted from the beginning of a string
|
|
635
|
-
/// on failure returns NEGATIVE_INFINITY
|
|
636
|
-
/// </summary>
|
|
637
|
-
/// <param name="val">the string to parse</param>
|
|
638
549
|
getDoubleVal(val) {
|
|
639
550
|
let dotFound = false;
|
|
640
551
|
let minusFound = false;
|
|
641
552
|
let digitFound = false;
|
|
642
553
|
let endOfNum = false;
|
|
643
554
|
let i = 0;
|
|
644
|
-
// find the delemeting non numeric character
|
|
645
555
|
for (i = 0; i < val.length && !endOfNum; i++) {
|
|
646
556
|
let c = val[i];
|
|
647
557
|
if (c >= '0' && c <= '9')
|
|
@@ -676,8 +586,6 @@ export class FieldValidator {
|
|
|
676
586
|
}
|
|
677
587
|
return -Infinity;
|
|
678
588
|
}
|
|
679
|
-
/// <summary>set Numeric value Without Picture, filter input from user</summary>
|
|
680
|
-
/// <returns> the pure number, without picture mask</returns>
|
|
681
589
|
setNumericValueWithoutPicture(val) {
|
|
682
590
|
let checkedStr = new StringBuilder(val.length);
|
|
683
591
|
let isFirstDecimal = false;
|
|
@@ -699,8 +607,6 @@ export class FieldValidator {
|
|
|
699
607
|
}
|
|
700
608
|
return checkedStr.ToString();
|
|
701
609
|
}
|
|
702
|
-
/// <summary> check if newvalue format matches the numeric pic format.</summary>
|
|
703
|
-
/// <returns></returns>
|
|
704
610
|
checkNumericInDecFormat() {
|
|
705
611
|
let pic = this._valDet.getPIC();
|
|
706
612
|
let i;
|
|
@@ -708,55 +614,36 @@ export class FieldValidator {
|
|
|
708
614
|
let Whole;
|
|
709
615
|
let DecPos;
|
|
710
616
|
let decimalChar = this._environment.GetDecimal();
|
|
711
|
-
// Count number of digits and position of decimal point
|
|
712
617
|
Dec = 0;
|
|
713
618
|
Whole = 0;
|
|
714
619
|
DecPos = -1;
|
|
715
620
|
for (i = 0; i < this._newvalue.length; i++)
|
|
716
621
|
if (pic.isNumeric(i))
|
|
717
622
|
if (UtilStrByteMode.isDigit(this._newvalue[i]))
|
|
718
|
-
// when dec pos not found, count wholes, if found, count dec.
|
|
719
623
|
if (DecPos >= 0)
|
|
720
624
|
Dec++;
|
|
721
625
|
else
|
|
722
626
|
Whole++;
|
|
723
627
|
else if (this._newvalue[i] === decimalChar)
|
|
724
628
|
DecPos = i;
|
|
725
|
-
// did we exceed the mask ?
|
|
726
629
|
if (pic.getWholes() < Whole || pic.getDec() < Dec)
|
|
727
630
|
return false;
|
|
728
631
|
else
|
|
729
632
|
return true;
|
|
730
633
|
}
|
|
731
|
-
/// <summary>check & validate Date field by his old/new value and 2 pictures:
|
|
732
|
-
/// Real and Enable
|
|
733
|
-
/// 1.check if newvalue complete with pictures, otherwise return oldvalue
|
|
734
|
-
/// 2.check if newvalue complete with range
|
|
735
|
-
/// 2.1 complete value, if possible, otherwise return oldvalue
|
|
736
|
-
/// </summary>
|
|
737
|
-
/// <returns> new value of validated field</returns>
|
|
738
634
|
checkDateField() {
|
|
739
635
|
let newDate = (this._newvalue == null ? null : new Date(this._newvalue));
|
|
740
636
|
this.setValidationFailed(false);
|
|
741
637
|
if (this._valDet.getControl().isDateZero(this._newvalue)) {
|
|
742
|
-
// get default value of the field
|
|
743
638
|
let defaultMgValue = this._valDet.getControl().getField().getDefaultValue();
|
|
744
639
|
newDate = DisplayConvertor.Instance.mg2disp(defaultMgValue, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), false);
|
|
745
640
|
}
|
|
746
641
|
else {
|
|
747
|
-
// range date
|
|
748
642
|
if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null)
|
|
749
643
|
newDate = this.fillDateByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues(), this._newvalue);
|
|
750
644
|
}
|
|
751
645
|
return newDate;
|
|
752
646
|
}
|
|
753
|
-
/// <summary>Add found in newvalue numbers(2 or 3 letters) to buffer and return
|
|
754
|
-
/// last found number index
|
|
755
|
-
/// </summary>
|
|
756
|
-
/// <param name="currValue">in newvalue</param>
|
|
757
|
-
/// <param name="buffer"></param>
|
|
758
|
-
/// <param name="type">- which type of positional directive, for checking validity</param>
|
|
759
|
-
/// <returns> currValue in newvalue</returns>
|
|
760
647
|
add2Date(currValue, buffer, type) {
|
|
761
648
|
let start = currValue;
|
|
762
649
|
let currAdd = new StringBuilder(this._newvalue.length);
|
|
@@ -777,16 +664,16 @@ export class FieldValidator {
|
|
|
777
664
|
case PICInterface.PIC_W:
|
|
778
665
|
letters = 1;
|
|
779
666
|
break;
|
|
780
|
-
case PICInterface.PIC_YJ:
|
|
667
|
+
case PICInterface.PIC_YJ:
|
|
781
668
|
letters = 2;
|
|
782
|
-
type = PICInterface.PIC_YY;
|
|
669
|
+
type = PICInterface.PIC_YY;
|
|
783
670
|
break;
|
|
784
671
|
}
|
|
785
672
|
while (start < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue.charAt(start)))
|
|
786
|
-
start++;
|
|
673
|
+
start++;
|
|
787
674
|
if (start === this._newvalue.length && (this._newvalue.length === 0 || this._newvalue === "0")) {
|
|
788
675
|
for (let nul = 0; nul < letters; nul = nul + 1) {
|
|
789
|
-
buffer.Append('0')
|
|
676
|
+
buffer.Append('0');
|
|
790
677
|
}
|
|
791
678
|
return currValue;
|
|
792
679
|
}
|
|
@@ -804,28 +691,19 @@ export class FieldValidator {
|
|
|
804
691
|
currAdd.Append('0');
|
|
805
692
|
}
|
|
806
693
|
let add = NNumber.Parse(currAdd.ToString());
|
|
807
|
-
// boundary conditions cases:
|
|
808
694
|
if ((add < 1 && type !== PICInterface.PIC_YYYY && type !== PICInterface.PIC_YY) ||
|
|
809
695
|
(add > 31 && (type === PICInterface.PIC_DD || type === PICInterface.PIC_DDDD)) ||
|
|
810
696
|
(add > 12 && type === PICInterface.PIC_MMD) || (add > 7 && type === PICInterface.PIC_W)) {
|
|
811
697
|
throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
|
|
812
698
|
}
|
|
813
|
-
// than picture is YYYY and inserted 0-2 numbers, use CENTURE value, otherwise add zeros before the year
|
|
814
699
|
if (type === PICInterface.PIC_YYYY && this._environment.GetCentury(this._valDet.getControl().getForm().getTask().getCompIdx()) > 999 && currAdd.Length < 3)
|
|
815
700
|
currAdd = this.checkCentury(add);
|
|
816
701
|
for (let j = 0; j < letters - currAdd.Length; j = j + 1) {
|
|
817
|
-
buffer.Append('0')
|
|
702
|
+
buffer.Append('0');
|
|
818
703
|
}
|
|
819
704
|
buffer.Append(currAdd.ToString());
|
|
820
705
|
return i;
|
|
821
706
|
}
|
|
822
|
-
/// <summary>Add found in newvalue letters to buffer and return
|
|
823
|
-
/// last found number index
|
|
824
|
-
/// </summary>
|
|
825
|
-
/// <param name="currValue">in newvalue</param>
|
|
826
|
-
/// <param name="letters">amount of letters to insert to buffer</param>
|
|
827
|
-
/// <param name="buffer"></param>
|
|
828
|
-
/// <returns> currValue in newvalue</returns>
|
|
829
707
|
addM2Date(currValue, letters, buffer, type) {
|
|
830
708
|
let array;
|
|
831
709
|
let result;
|
|
@@ -849,7 +727,7 @@ export class FieldValidator {
|
|
|
849
727
|
}
|
|
850
728
|
}
|
|
851
729
|
else {
|
|
852
|
-
if (type === PICInterface.PIC_BB) {
|
|
730
|
+
if (type === PICInterface.PIC_BB) {
|
|
853
731
|
array = UtilDateJpn.getArrayDow();
|
|
854
732
|
}
|
|
855
733
|
else {
|
|
@@ -877,20 +755,17 @@ export class FieldValidator {
|
|
|
877
755
|
else {
|
|
878
756
|
buffer.Append(array[max].trim());
|
|
879
757
|
for (let i = letters - array[max].trim().length; i > 0; i = i - 1) {
|
|
880
|
-
buffer.Append(' ')
|
|
758
|
+
buffer.Append(' ');
|
|
881
759
|
}
|
|
882
760
|
}
|
|
883
761
|
return currValue + letters;
|
|
884
762
|
}
|
|
885
|
-
/// <summary>get end index of every numeric block in the mask from mask[currValue]</summary>
|
|
886
|
-
/// <returns> end of numeric block in newValue</returns>
|
|
887
763
|
getEndOfNumericBlock(currValue) {
|
|
888
764
|
while (currValue < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue.charAt(currValue))) {
|
|
889
765
|
currValue = currValue + 1;
|
|
890
766
|
}
|
|
891
767
|
return currValue;
|
|
892
768
|
}
|
|
893
|
-
/// <summary>added suffix to relevant number of the day</summary>
|
|
894
769
|
addDateSuffix(last) {
|
|
895
770
|
let thenumber = NNumber.Parse(last);
|
|
896
771
|
if (thenumber === 1 || thenumber === 21 || thenumber === 31)
|
|
@@ -901,22 +776,15 @@ export class FieldValidator {
|
|
|
901
776
|
return "rd";
|
|
902
777
|
return "th";
|
|
903
778
|
}
|
|
904
|
-
/// <summary>get size of block letters of type 'type', which start at 'start'</summary>
|
|
905
779
|
getSizeOfBlock(start, type) {
|
|
906
780
|
let letters = start + 1;
|
|
907
781
|
while (letters < this._picture.length && this._picture.charCodeAt(letters) === type)
|
|
908
782
|
letters++;
|
|
909
783
|
return letters - start;
|
|
910
784
|
}
|
|
911
|
-
/// <summary>get String part/full name of month/day of week</summary>
|
|
912
|
-
/// <param name="month">part/full name of month/day of week</param>
|
|
913
|
-
/// <param name="max">of possible letters in month/day of week, size of block in picture of the control</param>
|
|
914
|
-
/// <param name="type:">PIC_ week|month</param>
|
|
915
|
-
/// <returns> number of month 1-12, or day of week 1-7</returns>
|
|
916
785
|
getMonthOrWeek(month_str, letters, type) {
|
|
917
786
|
let array;
|
|
918
787
|
if (type === PICInterface.PIC_MMM || type === PICInterface.PIC_MMD) {
|
|
919
|
-
// Month
|
|
920
788
|
if (this.hebrew)
|
|
921
789
|
array = HebrewDate.GetLocalMonths();
|
|
922
790
|
else {
|
|
@@ -924,9 +792,7 @@ export class FieldValidator {
|
|
|
924
792
|
array = DateUtil.getLocalMonths(monthStr.toString());
|
|
925
793
|
}
|
|
926
794
|
}
|
|
927
|
-
else if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W)
|
|
928
|
-
// Week
|
|
929
|
-
{
|
|
795
|
+
else if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W) {
|
|
930
796
|
if (this.hebrew)
|
|
931
797
|
array = HebrewDate.GetLocalDows();
|
|
932
798
|
else {
|
|
@@ -934,22 +800,17 @@ export class FieldValidator {
|
|
|
934
800
|
array = DateUtil.getLocalDays(dayStr.toString());
|
|
935
801
|
}
|
|
936
802
|
}
|
|
937
|
-
else if (type === PICInterface.PIC_BB)
|
|
938
|
-
// JPN: Japanese date picture support
|
|
939
|
-
{
|
|
803
|
+
else if (type === PICInterface.PIC_BB) {
|
|
940
804
|
array = UtilDateJpn.getArrayDow();
|
|
941
805
|
}
|
|
942
806
|
else {
|
|
943
|
-
return 1;
|
|
807
|
+
return 1;
|
|
944
808
|
}
|
|
945
809
|
if (letters > month_str.length)
|
|
946
|
-
// cut letter if it's end of string
|
|
947
810
|
letters = month_str.length;
|
|
948
811
|
if (this.hebrew) {
|
|
949
812
|
let hstr = NString.TrimStart(month_str).substr(0, letters).trim();
|
|
950
|
-
for (let i = 1; i < array.length; i++)
|
|
951
|
-
// start checking from 1st member, because 0 = ""
|
|
952
|
-
{
|
|
813
|
+
for (let i = 1; i < array.length; i++) {
|
|
953
814
|
if (array[i].trim() === hstr) {
|
|
954
815
|
if (i === 14)
|
|
955
816
|
i = 6;
|
|
@@ -959,7 +820,6 @@ export class FieldValidator {
|
|
|
959
820
|
return 0;
|
|
960
821
|
}
|
|
961
822
|
try {
|
|
962
|
-
// the number inserted and not string -> find mounth/day of week by number 1-12|1-7
|
|
963
823
|
let str = month_str.substr(0, letters).trim();
|
|
964
824
|
let numBuffer = new StringBuilder(str.length);
|
|
965
825
|
for (let i = 0; i < str.length; i++) {
|
|
@@ -976,22 +836,17 @@ export class FieldValidator {
|
|
|
976
836
|
return 12;
|
|
977
837
|
}
|
|
978
838
|
else if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W || type === PICInterface.PIC_BB) {
|
|
979
|
-
// JPN: Japanese date picture support
|
|
980
839
|
if (theNumber > 7)
|
|
981
840
|
return 7;
|
|
982
841
|
}
|
|
983
842
|
return theNumber;
|
|
984
843
|
}
|
|
985
844
|
catch (ex_21A) {
|
|
986
|
-
// doNothing_StringInserted
|
|
987
845
|
}
|
|
988
|
-
// inserted string - name of month|day of week ->try identyfy it
|
|
989
846
|
let found = new Array(array.length);
|
|
990
847
|
let from;
|
|
991
|
-
let max = -1;
|
|
992
|
-
for (let tmp = 1; tmp < array.length; tmp++)
|
|
993
|
-
// start checking from 1st member, because 0 = ""
|
|
994
|
-
{
|
|
848
|
+
let max = -1;
|
|
849
|
+
for (let tmp = 1; tmp < array.length; tmp++) {
|
|
995
850
|
found[tmp] = 0;
|
|
996
851
|
from = 0;
|
|
997
852
|
for (let i = 0; i < array[tmp].length && from < month_str.length && i < letters; i++, from++) {
|
|
@@ -1000,9 +855,7 @@ export class FieldValidator {
|
|
|
1000
855
|
else
|
|
1001
856
|
break;
|
|
1002
857
|
}
|
|
1003
|
-
if (from === letters || from === array[tmp].length)
|
|
1004
|
-
// all letters found
|
|
1005
|
-
{
|
|
858
|
+
if (from === letters || from === array[tmp].length) {
|
|
1006
859
|
max = tmp;
|
|
1007
860
|
break;
|
|
1008
861
|
}
|
|
@@ -1011,8 +864,6 @@ export class FieldValidator {
|
|
|
1011
864
|
max = this.findMax(found);
|
|
1012
865
|
return max;
|
|
1013
866
|
}
|
|
1014
|
-
/// <summary>is numeric data allowed in date
|
|
1015
|
-
/// return true if it is allowed, otherwise false</summary>
|
|
1016
867
|
isNumberAllowedInDate() {
|
|
1017
868
|
for (let i = 0; i < this._picture.length; i++) {
|
|
1018
869
|
if (this.isDatePositionalNumericDirective(this._picture[i]))
|
|
@@ -1020,8 +871,6 @@ export class FieldValidator {
|
|
|
1020
871
|
}
|
|
1021
872
|
return false;
|
|
1022
873
|
}
|
|
1023
|
-
/// <summary>find if all numbers of the new user inserted value are 0
|
|
1024
|
-
/// return true if all numbers in the input are 0, otherwise true</summary>
|
|
1025
874
|
isAllNumbers0() {
|
|
1026
875
|
let currChr;
|
|
1027
876
|
for (let i = 0; i < this._newvalue.length; i++) {
|
|
@@ -1031,9 +880,6 @@ export class FieldValidator {
|
|
|
1031
880
|
}
|
|
1032
881
|
return true;
|
|
1033
882
|
}
|
|
1034
|
-
/// <summary>check validity of Year for YYYY part of the mask</summary>
|
|
1035
|
-
/// <param name="yearIn">inserted by user</param>
|
|
1036
|
-
/// <returns> calculated by environment.century right value</returns>
|
|
1037
883
|
checkCentury(yearIn) {
|
|
1038
884
|
let outVal;
|
|
1039
885
|
let start_century = this._environment.GetCentury(this._valDet.getControl().getForm().getTask().getCompIdx());
|
|
@@ -1045,10 +891,6 @@ export class FieldValidator {
|
|
|
1045
891
|
outVal = ((++century) * 100 + yearIn);
|
|
1046
892
|
return new StringBuilder(outVal.toString());
|
|
1047
893
|
}
|
|
1048
|
-
/// <summary>check if the date legal for picture range, used for validation date 0</summary>
|
|
1049
|
-
/// <param name="ContinuousRange"></param>
|
|
1050
|
-
/// <param name="DiscreteRange"></param>
|
|
1051
|
-
/// <param name="date">integer - magic date number of days from 01.01.0000</param>
|
|
1052
894
|
isDateLegal4Range(ContinuousRange, DiscreteRange, currDate) {
|
|
1053
895
|
let pic = this._valDet.getPIC();
|
|
1054
896
|
let i;
|
|
@@ -1068,11 +910,8 @@ export class FieldValidator {
|
|
|
1068
910
|
return true;
|
|
1069
911
|
}
|
|
1070
912
|
}
|
|
1071
|
-
// the date is not in the range
|
|
1072
|
-
// return false;
|
|
1073
913
|
throw new WrongFormatException();
|
|
1074
914
|
}
|
|
1075
|
-
/// <summary>check and fill DATE type by range</summary>
|
|
1076
915
|
fillDateByRange(ContinuousRange, DiscreteRange, buffer) {
|
|
1077
916
|
let pic = this._valDet.getPIC();
|
|
1078
917
|
let i;
|
|
@@ -1095,12 +934,8 @@ export class FieldValidator {
|
|
|
1095
934
|
}
|
|
1096
935
|
}
|
|
1097
936
|
}
|
|
1098
|
-
// the date is not in the range
|
|
1099
937
|
throw new WrongFormatException();
|
|
1100
938
|
}
|
|
1101
|
-
/// <summary>check if day suitable (not bigger than max) for Year and Month</summary>
|
|
1102
|
-
/// <param name="date">user inserted string</param>
|
|
1103
|
-
/// <param name="isDoy">is picture of needed day is DDD - day of year</param>
|
|
1104
939
|
checkDay(date, isDoy) {
|
|
1105
940
|
let day = this.getDateElement(date, DateElement.DAY);
|
|
1106
941
|
if (day < 29 && !isDoy)
|
|
@@ -1112,22 +947,18 @@ export class FieldValidator {
|
|
|
1112
947
|
if (this._environment.GetDateMode(this._valDet.getControl().getForm().getTask().getCompIdx()) === 'B')
|
|
1113
948
|
year -= PICInterface.DATE_BUDDHIST_GAP;
|
|
1114
949
|
let month = this.getDateElement(date, DateElement.MONTH);
|
|
1115
|
-
// if day not consistained to year & month - change day
|
|
1116
950
|
let dayMax = this.getMaxDayInMonth(year, month);
|
|
1117
951
|
if (day > dayMax) {
|
|
1118
952
|
throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
|
|
1119
953
|
}
|
|
1120
954
|
}
|
|
1121
955
|
else {
|
|
1122
|
-
// if month not consistained to day(DDD) - change month
|
|
1123
956
|
let monthReal = this.getMonthByDay(year, day);
|
|
1124
957
|
if (monthReal < 1 || monthReal > 12)
|
|
1125
958
|
throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
|
|
1126
959
|
}
|
|
1127
960
|
return new StringBuilder(date);
|
|
1128
961
|
}
|
|
1129
|
-
/// <summary>check if day of week suitable (right) for Year, Month and Day</summary>
|
|
1130
|
-
/// <param name="date">user inserted string</param>
|
|
1131
962
|
checkWeek(date) {
|
|
1132
963
|
let dow = this.getDateElement(date, DateElement.DOW);
|
|
1133
964
|
let breakParams = DisplayConvertor.Instance.getNewDateBreakParams();
|
|
@@ -1138,17 +969,12 @@ export class FieldValidator {
|
|
|
1138
969
|
date = this.changeDow(date, dowReal);
|
|
1139
970
|
return new StringBuilder(date);
|
|
1140
971
|
}
|
|
1141
|
-
// JPN: Japanese date picture support
|
|
1142
|
-
/// <summary>check if the combination of Japanese era and year is valid.</summary>
|
|
1143
|
-
/// <param name="strDate">user inserted string</param>
|
|
1144
|
-
/// <returns> date string of properly Japanese era</returns>
|
|
1145
972
|
checkJpnEraYear(strDate) {
|
|
1146
973
|
let breakParams = DisplayConvertor.Instance.getNewDateBreakParams();
|
|
1147
974
|
let dateMagic = DisplayConvertor.Instance.a_2_date(strDate, this._picture, this._valDet.getControl().getForm().getTask().getCompIdx());
|
|
1148
975
|
DisplayConvertor.Instance.date_break_datemode(breakParams, dateMagic, true, this._valDet.getControl().getForm().getTask().getCompIdx());
|
|
1149
976
|
let intYearAD = breakParams.year;
|
|
1150
977
|
let intDoy = breakParams.doy;
|
|
1151
|
-
// get the name and a year of the era
|
|
1152
978
|
let strEraAlpha;
|
|
1153
979
|
let strEraKanji;
|
|
1154
980
|
strEraAlpha = UtilDateJpn.getInstance().date_jpn_yr_2_a(intYearAD, intDoy, false);
|
|
@@ -1162,10 +988,6 @@ export class FieldValidator {
|
|
|
1162
988
|
strYearJpnEra.Append("0");
|
|
1163
989
|
}
|
|
1164
990
|
strYearJpnEra.Append(num.toString());
|
|
1165
|
-
// build a properly year of the era
|
|
1166
|
-
// A DBCS character in "str" consumes two characters in "mask".
|
|
1167
|
-
// If "str" contains DBCS, the position of "mask" has to skip next index.
|
|
1168
|
-
// This variable indicates the number of skipped indexes.
|
|
1169
991
|
let intPicIdxOfs = 0;
|
|
1170
992
|
for (let intCnt = 0; intCnt + intPicIdxOfs < this._picture.length; intCnt++) {
|
|
1171
993
|
switch (this._picture.charCodeAt(intCnt + intPicIdxOfs)) {
|
|
@@ -1174,20 +996,19 @@ export class FieldValidator {
|
|
|
1174
996
|
break;
|
|
1175
997
|
case (PICInterface.PIC_JY2):
|
|
1176
998
|
strDate = UtilStrByteMode.repC(strDate, strEraKanji, intCnt + 1, 1);
|
|
1177
|
-
intPicIdxOfs++;
|
|
999
|
+
intPicIdxOfs++;
|
|
1178
1000
|
break;
|
|
1179
1001
|
case (PICInterface.PIC_JY4):
|
|
1180
1002
|
strDate = UtilStrByteMode.repC(strDate, strEraKanji, intCnt + 1, 2);
|
|
1181
|
-
intCnt++;
|
|
1182
|
-
intPicIdxOfs += 2;
|
|
1003
|
+
intCnt++;
|
|
1004
|
+
intPicIdxOfs += 2;
|
|
1183
1005
|
break;
|
|
1184
1006
|
case (PICInterface.PIC_YJ):
|
|
1185
1007
|
strDate = UtilStrByteMode.repC(strDate, strYearJpnEra.toString(), intCnt + 1, 2);
|
|
1186
|
-
intCnt++;
|
|
1008
|
+
intCnt++;
|
|
1187
1009
|
break;
|
|
1188
1010
|
default:
|
|
1189
1011
|
if (intCnt < strDate.length) {
|
|
1190
|
-
// if "strDate" contains DBCS, the next index of "picture" has to be skipped.
|
|
1191
1012
|
if (UtilStrByteMode.isHalfWidth(strDate[intCnt]) === false && UtilStrByteMode.isHalfWidth(this._picture[intCnt + intPicIdxOfs]) === true)
|
|
1192
1013
|
intPicIdxOfs++;
|
|
1193
1014
|
}
|
|
@@ -1196,10 +1017,6 @@ export class FieldValidator {
|
|
|
1196
1017
|
}
|
|
1197
1018
|
return new StringBuilder(strDate);
|
|
1198
1019
|
}
|
|
1199
|
-
/// <summary>get max number of day in month</summary>
|
|
1200
|
-
/// <param name="year"></param>
|
|
1201
|
-
/// <param name="month"></param>
|
|
1202
|
-
/// <returns> max days [28-31] number</returns>
|
|
1203
1020
|
getMaxDayInMonth(year, month) {
|
|
1204
1021
|
let array = [
|
|
1205
1022
|
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
|
@@ -1209,10 +1026,6 @@ export class FieldValidator {
|
|
|
1209
1026
|
return array[month] + 1;
|
|
1210
1027
|
return array[month];
|
|
1211
1028
|
}
|
|
1212
|
-
/// <summary>get month for day, than day have mask DDD</summary>
|
|
1213
|
-
/// <param name="year"></param>
|
|
1214
|
-
/// <param name="day">[0-365]</param>
|
|
1215
|
-
/// <returns> number of month</returns>
|
|
1216
1029
|
getMonthByDay(year, day) {
|
|
1217
1030
|
let i;
|
|
1218
1031
|
let LeapYear;
|
|
@@ -1222,36 +1035,27 @@ export class FieldValidator {
|
|
|
1222
1035
|
if (PICInterface.date_day_tab[i] >= day)
|
|
1223
1036
|
return i;
|
|
1224
1037
|
}
|
|
1225
|
-
// is Leap Year
|
|
1226
1038
|
else {
|
|
1227
1039
|
if (i < 3) {
|
|
1228
1040
|
if (PICInterface.date_day_tab[i] >= day)
|
|
1229
1041
|
return i;
|
|
1230
1042
|
}
|
|
1231
|
-
// add 1 day after second month
|
|
1232
1043
|
else {
|
|
1233
1044
|
if (PICInterface.date_day_tab[i] + 1 >= day)
|
|
1234
1045
|
return i;
|
|
1235
1046
|
}
|
|
1236
1047
|
}
|
|
1237
|
-
}
|
|
1238
|
-
return i;
|
|
1048
|
+
}
|
|
1049
|
+
return i;
|
|
1239
1050
|
}
|
|
1240
|
-
/// </summary>get Year|Month|Day|Dow of date
|
|
1241
|
-
/// <param name="date">date</param>
|
|
1242
|
-
/// <param name="element">required date element (year/month/day/dow) </param>
|
|
1243
|
-
/// <returns>Year|Month|Day|Dow of date</returns>
|
|
1244
1051
|
getDateElement(date, element) {
|
|
1245
1052
|
let buffer = null;
|
|
1246
1053
|
let letters = 0;
|
|
1247
1054
|
let exitLoop = false;
|
|
1248
|
-
let picWeekType = PICInterface.PIC_WWW;
|
|
1249
|
-
let isJpnEraYear = false;
|
|
1055
|
+
let picWeekType = PICInterface.PIC_WWW;
|
|
1056
|
+
let isJpnEraYear = false;
|
|
1250
1057
|
let era_year = 0;
|
|
1251
|
-
|
|
1252
|
-
// If "date" contains DBCS, the position of "picture" has to skip next index.
|
|
1253
|
-
// This variable indicates the number of skipped indexes.
|
|
1254
|
-
let intPicIdxOfs = 0; // JPN: Japanese date picture support
|
|
1058
|
+
let intPicIdxOfs = 0;
|
|
1255
1059
|
let minLen = 0;
|
|
1256
1060
|
if (UtilStrByteMode.isLocaleDefLangJPN())
|
|
1257
1061
|
minLen = UtilStrByteMode.getMinLenPicture(date, this._picture);
|
|
@@ -1278,7 +1082,7 @@ export class FieldValidator {
|
|
|
1278
1082
|
break;
|
|
1279
1083
|
case PICInterface.PIC_DDDD:
|
|
1280
1084
|
if (element === DateElement.DAY) {
|
|
1281
|
-
buffer = date.substr(i, 2);
|
|
1085
|
+
buffer = date.substr(i, 2);
|
|
1282
1086
|
exitLoop = true;
|
|
1283
1087
|
}
|
|
1284
1088
|
i += 3;
|
|
@@ -1291,7 +1095,6 @@ export class FieldValidator {
|
|
|
1291
1095
|
i++;
|
|
1292
1096
|
break;
|
|
1293
1097
|
case PICInterface.PIC_MMM:
|
|
1294
|
-
// get size of PIC_MMM block
|
|
1295
1098
|
letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_MMM);
|
|
1296
1099
|
if (element === DateElement.MONTH) {
|
|
1297
1100
|
buffer = date.substr(i, letters);
|
|
@@ -1334,13 +1137,11 @@ export class FieldValidator {
|
|
|
1334
1137
|
case PICInterface.PIC_HYYYYY:
|
|
1335
1138
|
case PICInterface.PIC_HL:
|
|
1336
1139
|
case PICInterface.PIC_HDD:
|
|
1337
|
-
// not implemented for hebrew yet
|
|
1338
1140
|
break;
|
|
1339
|
-
case PICInterface.PIC_BB:
|
|
1141
|
+
case PICInterface.PIC_BB:
|
|
1340
1142
|
letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_BB);
|
|
1341
1143
|
if (i + Math.floor(letters / 2) < date.length) {
|
|
1342
1144
|
buffer = date.substr(i, Math.floor(letters / 2));
|
|
1343
|
-
// if date contains DBCS, some indexes of picture have to be skipped.
|
|
1344
1145
|
intPicIdxOfs += letters - buffer.length;
|
|
1345
1146
|
}
|
|
1346
1147
|
if (element === DateElement.DOW) {
|
|
@@ -1352,28 +1153,28 @@ export class FieldValidator {
|
|
|
1352
1153
|
}
|
|
1353
1154
|
i += letters - 1;
|
|
1354
1155
|
break;
|
|
1355
|
-
case PICInterface.PIC_JY1:
|
|
1156
|
+
case PICInterface.PIC_JY1:
|
|
1356
1157
|
isJpnEraYear = true;
|
|
1357
1158
|
break;
|
|
1358
|
-
case PICInterface.PIC_JY2:
|
|
1159
|
+
case PICInterface.PIC_JY2:
|
|
1359
1160
|
isJpnEraYear = true;
|
|
1360
1161
|
intPicIdxOfs++;
|
|
1361
1162
|
break;
|
|
1362
|
-
case PICInterface.PIC_JY4:
|
|
1163
|
+
case PICInterface.PIC_JY4:
|
|
1363
1164
|
isJpnEraYear = true;
|
|
1364
1165
|
intPicIdxOfs += 2;
|
|
1365
1166
|
i++;
|
|
1366
1167
|
break;
|
|
1367
|
-
case PICInterface.PIC_YJ:
|
|
1168
|
+
case PICInterface.PIC_YJ:
|
|
1368
1169
|
if (element === DateElement.YEAR) {
|
|
1369
1170
|
buffer = date.substr(i, 2);
|
|
1370
1171
|
exitLoop = true;
|
|
1371
1172
|
}
|
|
1372
1173
|
i++;
|
|
1373
1174
|
break;
|
|
1374
|
-
}
|
|
1375
|
-
}
|
|
1376
|
-
}
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1377
1178
|
if (buffer == null) {
|
|
1378
1179
|
if (element === DateElement.YEAR)
|
|
1379
1180
|
return DateTime.Now.Year;
|
|
@@ -1381,9 +1182,7 @@ export class FieldValidator {
|
|
|
1381
1182
|
return 1;
|
|
1382
1183
|
}
|
|
1383
1184
|
buffer = buffer.trim();
|
|
1384
|
-
if (letters > 0)
|
|
1385
|
-
// it's PIC_WWW or PIC_MMM
|
|
1386
|
-
{
|
|
1185
|
+
if (letters > 0) {
|
|
1387
1186
|
if (element === DateElement.MONTH)
|
|
1388
1187
|
letters = this.getMonthOrWeek(buffer.toString(), letters, PICInterface.PIC_MMM);
|
|
1389
1188
|
else if (element === DateElement.DOW)
|
|
@@ -1398,7 +1197,6 @@ export class FieldValidator {
|
|
|
1398
1197
|
letters = NNumber.Parse(buffer.toString());
|
|
1399
1198
|
}
|
|
1400
1199
|
if (element === DateElement.YEAR && isJpnEraYear) {
|
|
1401
|
-
// get the start year of the era
|
|
1402
1200
|
era_year = UtilDateJpn.getInstance().getStartYearOfEra(date, this._picture);
|
|
1403
1201
|
if (era_year === 0)
|
|
1404
1202
|
return 0;
|
|
@@ -1406,19 +1204,13 @@ export class FieldValidator {
|
|
|
1406
1204
|
}
|
|
1407
1205
|
return letters;
|
|
1408
1206
|
}
|
|
1409
|
-
/// <summary>change day number in date field to dayMax</summary>
|
|
1410
|
-
/// <param name="date">to change day into</param>
|
|
1411
|
-
/// <param name="dayMax">the new day value</param>
|
|
1412
1207
|
changeDow(date, dow) {
|
|
1413
1208
|
let isDate = false;
|
|
1414
1209
|
let letters;
|
|
1415
1210
|
let startPart;
|
|
1416
1211
|
let finishPart;
|
|
1417
1212
|
let number1;
|
|
1418
|
-
number1 = "" + dow;
|
|
1419
|
-
// A DBCS character in "date" consumes two characters in "picture".
|
|
1420
|
-
// If "date" contains DBCS, the position of "picture" has to skip next index.
|
|
1421
|
-
// This variable indicates the number of skipped indexes. (JPN: DBCS support)
|
|
1213
|
+
number1 = "" + dow;
|
|
1422
1214
|
let intPicIdxOfs = 0;
|
|
1423
1215
|
for (let i = 0; i + intPicIdxOfs < this._picture.length && !isDate; i++) {
|
|
1424
1216
|
if (this.isDataPositionalDirective(this._picture[i + intPicIdxOfs])) {
|
|
@@ -1444,12 +1236,10 @@ export class FieldValidator {
|
|
|
1444
1236
|
date = startPart + number1 + finishPart;
|
|
1445
1237
|
isDate = true;
|
|
1446
1238
|
break;
|
|
1447
|
-
case PICInterface.PIC_BB:
|
|
1239
|
+
case PICInterface.PIC_BB:
|
|
1448
1240
|
letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_BB);
|
|
1449
|
-
// "letters" means a number of characters in "picture"
|
|
1450
1241
|
startPart = date.substr(0, i);
|
|
1451
1242
|
finishPart = date.substr(i + Math.floor(letters / 2));
|
|
1452
|
-
// "letters / 2" means a number of characters in "date"
|
|
1453
1243
|
number1 = UtilDateJpn.getStrDow(dow);
|
|
1454
1244
|
if (UtilStrByteMode.lenB(number1) > letters)
|
|
1455
1245
|
number1 = UtilStrByteMode.leftB(number1, letters);
|
|
@@ -1460,68 +1250,40 @@ export class FieldValidator {
|
|
|
1460
1250
|
isDate = true;
|
|
1461
1251
|
break;
|
|
1462
1252
|
default:
|
|
1463
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS())
|
|
1464
|
-
// JPN: DBCS support
|
|
1465
|
-
{
|
|
1253
|
+
if (UtilStrByteMode.isLocaleDefLangDBCS()) {
|
|
1466
1254
|
if (i < date.length) {
|
|
1467
|
-
// if "date" contains DBCS, the next index of "picture" has to be skipped.
|
|
1468
1255
|
if (UtilStrByteMode.isHalfWidth(date[i]) === false && UtilStrByteMode.isHalfWidth(this._picture[i + intPicIdxOfs]) === true)
|
|
1469
1256
|
intPicIdxOfs++;
|
|
1470
1257
|
}
|
|
1471
1258
|
}
|
|
1472
1259
|
break;
|
|
1473
|
-
}
|
|
1474
|
-
}
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1475
1262
|
}
|
|
1476
1263
|
return date;
|
|
1477
1264
|
}
|
|
1478
|
-
/// <summary>check & validate Time field by his old/new value and 2 pictures:
|
|
1479
|
-
/// Real and Enable
|
|
1480
|
-
/// 1.check if newvalue complete with pictures, otherwise return oldvalue
|
|
1481
|
-
/// 2.check if newvalue complete with range
|
|
1482
|
-
/// 2.1 complete value, if possible, otherwise return oldvalue
|
|
1483
|
-
/// </summary>
|
|
1484
|
-
/// <returns> String - new value of validated field</returns>
|
|
1485
1265
|
checkTimeField() {
|
|
1486
1266
|
let newTime = new Date(this._newvalue);
|
|
1487
1267
|
this.setValidationFailed(false);
|
|
1488
1268
|
if (this._valDet.getControl().isDateZero(this._newvalue)) {
|
|
1489
|
-
// get default value of the field
|
|
1490
1269
|
let defaultMgValue = this._valDet.getControl().getField().getDefaultValue();
|
|
1491
1270
|
newTime = DisplayConvertor.Instance.mg2disp(defaultMgValue, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), false);
|
|
1492
1271
|
}
|
|
1493
1272
|
else {
|
|
1494
|
-
// range of the time
|
|
1495
1273
|
if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null)
|
|
1496
1274
|
newTime = this.fillTimeByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues(), this._newvalue);
|
|
1497
1275
|
}
|
|
1498
1276
|
return newTime;
|
|
1499
1277
|
}
|
|
1500
|
-
/// <summary>Add found in newvalue numbers(2(or 1) letters) to buffer and return
|
|
1501
|
-
/// last found number index
|
|
1502
|
-
/// </summary>
|
|
1503
|
-
/// <param name="currValue">in newvalue</param>
|
|
1504
|
-
/// <param name="buffer">/// </param>
|
|
1505
|
-
/// <param name="type">which type of positional directive, for checking validity</param>
|
|
1506
|
-
/// <returns> currValue in newvalue</returns>
|
|
1507
1278
|
add2Time(currValue, buffer, type) {
|
|
1508
1279
|
let start = currValue;
|
|
1509
1280
|
let i;
|
|
1510
1281
|
let STR_00 = "00";
|
|
1511
1282
|
let currAdd = new StringBuilder();
|
|
1512
1283
|
while (start < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue[start])) {
|
|
1513
|
-
start++;
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
// on non-digits place STR_00 will be added
|
|
1517
|
-
// Since Mask Editing . This error is irrelevant. Time now, always contains non digits like : and might contain ' ' for unfilled chars.
|
|
1518
|
-
// This is a valid case and we do not want an error popping about it.
|
|
1519
|
-
// guiManager.writeToMessagePane(valDet.getControl().getForm().getTask(), ClientManager.Instance.getMessageString(STR_ERR_TIME), StatusBarMessageType.SB_RUNTIME_MSG);
|
|
1520
|
-
// setValidationFailed(true);
|
|
1521
|
-
}
|
|
1522
|
-
if (start === this._newvalue.length)
|
|
1523
|
-
// not found more digits
|
|
1524
|
-
{
|
|
1284
|
+
start++;
|
|
1285
|
+
}
|
|
1286
|
+
if (start === this._newvalue.length) {
|
|
1525
1287
|
buffer.Append(STR_00.toString());
|
|
1526
1288
|
return currValue;
|
|
1527
1289
|
}
|
|
@@ -1529,22 +1291,15 @@ export class FieldValidator {
|
|
|
1529
1291
|
if (UtilStrByteMode.isDigit(this._newvalue[i]))
|
|
1530
1292
|
currAdd.Append(this._newvalue[i]);
|
|
1531
1293
|
else {
|
|
1532
|
-
currAdd.Insert(0, '0');
|
|
1294
|
+
currAdd.Insert(0, '0');
|
|
1533
1295
|
break;
|
|
1534
1296
|
}
|
|
1535
1297
|
}
|
|
1536
1298
|
if (i === this._newvalue.length && i === start + 1)
|
|
1537
1299
|
currAdd.Insert(0, '0');
|
|
1538
|
-
// only 1 digit found
|
|
1539
1300
|
else if (i === this._newvalue.length && i === start)
|
|
1540
1301
|
currAdd.Append(STR_00.toString());
|
|
1541
1302
|
let add = NNumber.Parse(currAdd.ToString());
|
|
1542
|
-
/*if (add < 0)
|
|
1543
|
-
currAdd=new StringBuffer("00");
|
|
1544
|
-
else if (add > 59 && type==PIC_MMT)
|
|
1545
|
-
currAdd=new StringBuffer("59");
|
|
1546
|
-
else if (add > 59 && type==PIC_SS)
|
|
1547
|
-
currAdd=new StringBuffer("59");*/
|
|
1548
1303
|
if (add < 0 || (add > 59 && type === PICInterface.PIC_MMT) || (add > 59 && type === PICInterface.PIC_SS))
|
|
1549
1304
|
throw new WrongFormatException(MsgInterface.STR_ERR_TIME);
|
|
1550
1305
|
else if (type === PICInterface.PIC_HH) {
|
|
@@ -1572,7 +1327,6 @@ export class FieldValidator {
|
|
|
1572
1327
|
buffer.Append(currAdd.ToString());
|
|
1573
1328
|
return i;
|
|
1574
1329
|
}
|
|
1575
|
-
/// <summary>Append PM or AM to time</summary>
|
|
1576
1330
|
addPM2Time(currValue, buffer) {
|
|
1577
1331
|
let i;
|
|
1578
1332
|
if ((i = this._newvalue.toUpperCase().indexOf("AM", currValue)) !== -1) {
|
|
@@ -1593,8 +1347,6 @@ export class FieldValidator {
|
|
|
1593
1347
|
}
|
|
1594
1348
|
return currValue;
|
|
1595
1349
|
}
|
|
1596
|
-
/// <summary>Check if where is 'PM' positional directive in the Time Picture</summary>
|
|
1597
|
-
/// <returns> true - there is PM, else false</returns>
|
|
1598
1350
|
getIsPM() {
|
|
1599
1351
|
for (let curr = 0; curr < this._picture.length; curr++) {
|
|
1600
1352
|
if (this._picture.charCodeAt(curr) === PICInterface.PIC_PM)
|
|
@@ -1622,16 +1374,8 @@ export class FieldValidator {
|
|
|
1622
1374
|
return new Date(buffer);
|
|
1623
1375
|
}
|
|
1624
1376
|
}
|
|
1625
|
-
// the time is not in the range
|
|
1626
1377
|
throw new WrongFormatException();
|
|
1627
1378
|
}
|
|
1628
|
-
/// <summary>*************************************************************
|
|
1629
|
-
/// SERVICE functions
|
|
1630
|
-
/// ***************************************************************
|
|
1631
|
-
/// </summary>
|
|
1632
|
-
/// <summary> print ERROR prompt message about range to status bar</summary>
|
|
1633
|
-
/// <param name="msgId">of error Message</param>
|
|
1634
|
-
/// <param name="setValidationFaild">validation failed</param>
|
|
1635
1379
|
printMessage(msgId, setValidationFaild) {
|
|
1636
1380
|
let message = new StringBuilder("");
|
|
1637
1381
|
let ctrlType;
|
|
@@ -1658,13 +1402,8 @@ export class FieldValidator {
|
|
|
1658
1402
|
}
|
|
1659
1403
|
}
|
|
1660
1404
|
if (setValidationFaild)
|
|
1661
|
-
// from this point the focus send back to control and setValidationFailed(true) can not set it to true
|
|
1662
1405
|
this.setValidationFailed(true);
|
|
1663
1406
|
}
|
|
1664
|
-
/// <summary>Change inside 'newvalue' substring on position 'index' to string 'to'</summary>
|
|
1665
|
-
/// <param name="newvalue">to change inside</param>
|
|
1666
|
-
/// <param name="to">string to change by him</param>
|
|
1667
|
-
/// <param name="index">the substring to change on the position</param>
|
|
1668
1407
|
changeStringInside(to, index) {
|
|
1669
1408
|
this._newvalue = this._newvalue.substr(0, index) + to + this._newvalue.substr(index + to.length);
|
|
1670
1409
|
}
|
|
@@ -1688,7 +1427,6 @@ export class FieldValidator {
|
|
|
1688
1427
|
this._picture = this._picture.substr(0, pIC.getMaskSize());
|
|
1689
1428
|
}
|
|
1690
1429
|
}
|
|
1691
|
-
/// <summary>Return index of Max member in array</summary>
|
|
1692
1430
|
findMax(array) {
|
|
1693
1431
|
let index = 0;
|
|
1694
1432
|
let max = array[index];
|
|
@@ -1700,43 +1438,32 @@ export class FieldValidator {
|
|
|
1700
1438
|
}
|
|
1701
1439
|
return index;
|
|
1702
1440
|
}
|
|
1703
|
-
/// <summary>is checked char Data Positional Directive</summary>
|
|
1704
1441
|
isDataPositionalDirective(toCheck) {
|
|
1705
1442
|
let ascii = toCheck.charCodeAt(0);
|
|
1706
1443
|
return (ascii === PICInterface.PIC_YY || ascii === PICInterface.PIC_YYYY || ascii === PICInterface.PIC_MMD || ascii === PICInterface.PIC_MMM
|
|
1707
1444
|
|| ascii === PICInterface.PIC_DD || ascii === PICInterface.PIC_DDD || ascii === PICInterface.PIC_DDDD || ascii === PICInterface.PIC_W
|
|
1708
1445
|
|| ascii === PICInterface.PIC_WWW || ascii === PICInterface.PIC_HYYYYY || ascii === PICInterface.PIC_HL || ascii === PICInterface.PIC_HDD || ascii === PICInterface.PIC_YJ
|
|
1709
|
-
|| ascii === PICInterface.PIC_JY1 || ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB);
|
|
1446
|
+
|| ascii === PICInterface.PIC_JY1 || ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB);
|
|
1710
1447
|
}
|
|
1711
|
-
/// <summary>check if Numeric Data Positional Directive exists</summary>
|
|
1712
1448
|
isDatePositionalNumericDirective(toCheck) {
|
|
1713
1449
|
let ascii = toCheck.charCodeAt(0);
|
|
1714
1450
|
return (ascii === PICInterface.PIC_YY || ascii === PICInterface.PIC_YYYY || ascii === PICInterface.PIC_MMD || ascii === PICInterface.PIC_DD
|
|
1715
1451
|
|| ascii === PICInterface.PIC_DDD || ascii === PICInterface.PIC_DDDD || ascii === PICInterface.PIC_W || ascii === PICInterface.PIC_HYYYYY
|
|
1716
1452
|
|| ascii === PICInterface.PIC_HL || ascii === PICInterface.PIC_HDD || ascii === PICInterface.PIC_YJ || ascii === PICInterface.PIC_JY1
|
|
1717
|
-
|| ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB);
|
|
1453
|
+
|| ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB);
|
|
1718
1454
|
}
|
|
1719
|
-
/// <summary>is checked char Numeric Positional Directive</summary>
|
|
1720
1455
|
isNumericPositionalDirective(toCheck) {
|
|
1721
1456
|
let ascii = toCheck.charCodeAt(0);
|
|
1722
1457
|
return (ascii === PICInterface.PIC_N);
|
|
1723
1458
|
}
|
|
1724
|
-
/// <summary>is checked char Logic Positional Directive</summary>
|
|
1725
1459
|
isLogicPositionalDirective(toCheck) {
|
|
1726
1460
|
let ascii = toCheck.charCodeAt(0);
|
|
1727
1461
|
return (ascii === PICInterface.PIC_X);
|
|
1728
1462
|
}
|
|
1729
|
-
/// <summary>Find if the letter at index is Positional Date Directive</summary>
|
|
1730
|
-
/// <param name="char">to check in picture</param>
|
|
1731
|
-
/// <returns> true if Positional Date Directive; false otherwise</returns>
|
|
1732
1463
|
isTimePositionalDirective(toCheck) {
|
|
1733
1464
|
let ascii = toCheck.charCodeAt(0);
|
|
1734
1465
|
return (ascii === PICInterface.PIC_HH || ascii === PICInterface.PIC_MMT || ascii === PICInterface.PIC_SS || ascii === PICInterface.PIC_PM || ascii === PICInterface.PIC_MS);
|
|
1735
1466
|
}
|
|
1736
|
-
/// <summary>is checked string Positional Directive of any type</summary>
|
|
1737
|
-
/// <param name="full/part">of picture
|
|
1738
|
-
/// </param>
|
|
1739
|
-
/// <returns> index of directive position or -1 if not found</returns>
|
|
1740
1467
|
indexOfPositionalNonDirective(str) {
|
|
1741
1468
|
let tmp;
|
|
1742
1469
|
for (let i = 0; i < str.length; i++) {
|
|
@@ -1748,18 +1475,12 @@ export class FieldValidator {
|
|
|
1748
1475
|
}
|
|
1749
1476
|
return -1;
|
|
1750
1477
|
}
|
|
1751
|
-
/// <summary> set the "validation failed" flag</summary>
|
|
1752
|
-
/// <param name="val">value to use</param>
|
|
1753
1478
|
setValidationFailed(val) {
|
|
1754
1479
|
if (this._valDet.ValidationFailed)
|
|
1755
1480
|
return;
|
|
1756
1481
|
else
|
|
1757
1482
|
this._valDet.setValidationFailed(val);
|
|
1758
1483
|
}
|
|
1759
|
-
/// <summary> Count digits in string before delimeter</summary>
|
|
1760
|
-
/// <param name="inputString">- string to look into for delimeter</param>
|
|
1761
|
-
/// <param name="searchStart">- initial index position for search in inputString</param>
|
|
1762
|
-
/// <param name="delimeter">we are looking for</param>
|
|
1763
1484
|
digitsBeforeDelimeter(inputString, searchStart, delimeter) {
|
|
1764
1485
|
let counter = 0;
|
|
1765
1486
|
let searchEndPos = inputString.indexOf(delimeter, searchStart);
|
|
@@ -1770,8 +1491,6 @@ export class FieldValidator {
|
|
|
1770
1491
|
counter++;
|
|
1771
1492
|
return counter;
|
|
1772
1493
|
}
|
|
1773
|
-
/// <summary> by Ctrl+U (Set to Null), null display value is set to ctrl. In this case we need following checking , in order to set field to null.</summary>
|
|
1774
|
-
/// <param name="val">- entered value to value to check</param>
|
|
1775
1494
|
isNullDisplayVal() {
|
|
1776
1495
|
let isNullDisplayVal = false;
|
|
1777
1496
|
let field = this._valDet.getControl().getField();
|
|
@@ -1785,4 +1504,4 @@ export class FieldValidator {
|
|
|
1785
1504
|
return isNullDisplayVal;
|
|
1786
1505
|
}
|
|
1787
1506
|
}
|
|
1788
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL0ZpZWxkVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUVULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUs5QixPQUFPLEVBQW1CLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkUsT0FBTyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxXQUFXLEVBQ1gsZUFBZSxFQUNoQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHdEQsTUFBTSxPQUFPLGNBQWM7SUFZekI7UUFYUSxjQUFTLEdBQVEsSUFBSSxDQUFDO1FBQ3RCLGNBQVMsR0FBUSxJQUFJLENBQUM7UUFDdEIsaUJBQVksR0FBVyxJQUFJLENBQUM7UUFDNUIsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFDOUIsWUFBTyxHQUFzQixJQUFJLENBQUM7UUFD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QUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFFBQVEsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU87ZUFDdkksS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxLQUFLO2VBQ2xJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsVUFBVSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTTtlQUN2SyxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscUNBQXFDO0lBRWxMLENBQUM7SUFFRCx3RUFBd0U7SUFDaEUsZ0NBQWdDLENBQUMsT0FBZTtRQUN0RCxJQUFJLEtBQUssR0FBVyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFFBQVEsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU07ZUFDdEksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxLQUFLLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxVQUFVO2VBQ3RJLEtBQUssS0FBSyxZQUFZLENB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LEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixPQUFPLEVBQUUsQ0FBQztRQUVaLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCw0SkFBNEo7SUFDNUosK0RBQStEO0lBQ3ZELGdCQUFnQjtRQUN0QixJQUFJLGdCQUFnQixHQUFZLEtBQUssQ0FBQztRQUN0QyxJQUFJLEtBQUssR0FBaUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUUvRCxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLG1CQUFtQixFQUFFLEVBQ3BEO1lBQ0UsSUFBSSxZQUFZLEdBQVEsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQy9DLElBQUksWUFBWSxLQUFLLElBQUk7Z0JBQ3ZCLGdCQUFnQixHQUFHLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Z0JBRWhFLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUNoRDtRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBEYXRlVGltZSxcclxuICBFeGNlcHRpb24sXHJcbiAgTGlzdCxcclxuICBOQ2hhcixcclxuICBOTnVtYmVyLFxyXG4gIE5TdHJpbmcsXHJcbiAgTnVtYmVyRm9ybWF0SW5mbyxcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uRGV0YWlscyB9IGZyb20gJy4vVmFsaWRhdGlvbkRldGFpbHMnO1xyXG5pbXBvcnQgeyBJRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9lbnYvSUVudmlyb25tZW50JztcclxuaW1wb3J0IHsgTWdDb250cm9sQmFzZSB9IGZyb20gJy4vTWdDb250cm9sQmFzZSc7XHJcbmltcG9ydCB7IEd1aUZpZWxkQmFzZSB9IGZyb20gJy4uL2RhdGEvR3VpRmllbGRCYXNlJztcclxuaW1wb3J0IHsgRGF0ZUJyZWFrUGFyYW1zLCBEaXNwbGF5Q29udmVydG9yIH0gZnJvbSAnLi9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHtcclxuICBEYXRlVXRpbCxcclxuICBIVE1MXzJfU1RSLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTXNnSW50ZXJmYWNlLFxyXG4gIFBJQ0ludGVyZmFjZSxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbERhdGVKcG4sXHJcbiAgVXRpbFN0ckJ5dGVNb2RlXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IEV2ZW50cyB9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7IFdyb25nRm9ybWF0RXhjZXB0aW9uIH0gZnJvbSAnLi9Xcm9uZ0Zvcm1hdEV4Y2VwdGlvbic7XHJcbmltcG9ydCB7IFBJQyB9IGZyb20gJy4vUElDJztcclxuaW1wb3J0IHsgRGF0ZUVsZW1lbnQgfSBmcm9tICcuLi8uLi9HdWlFbnVtcyc7XHJcbmltcG9ydCB7IE5VTV9UWVBFIH0gZnJvbSAnLi4vZGF0YS9OVU1fVFlQRSc7XHJcbmltcG9ydCB7IEhlYnJld0RhdGUgfSBmcm9tICcuL0hlYnJld0RhdGUnO1xyXG5pbXBvcnQgeyBCbG9iVHlwZSB9IGZyb20gJy4uL2RhdGEvQmxvYlR5cGUnO1xyXG5pbXBvcnQgeyBHdWlFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL0d1aUVudmlyb25tZW50JztcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgRmllbGRWYWxpZGF0b3Ige1xyXG4gIHByaXZhdGUgX25ld3ZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX29sZHZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BpY3R1cmVSZWFsOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BpY3R1cmVFbmFibGU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfdmFsRGV0OiBWYWxpZGF0aW9uRGV0YWlscyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaXNQbTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3BpY3R1cmU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBoZWJyZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9kZWNpbWFsOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX2Vudmlyb25tZW50OiBJRW52aXJvbm1lbnQgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX2Vudmlyb25tZW50ID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQ7XHJcbiAgICB0aGlzLl9kZWNpbWFsID0gKHRoaXMuX2Vudmlyb25tZW50LkdldERlY2ltYWwoKSB8fCBcIlwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gdGhlIG1haW4gbWV0aG9kIG9mIHRoaXMgY2xhc3M8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsRGV0XCI+YSBWYWxpZGF0aW9uRGV0YWlscyBvYmplY3QgdG8gdXNlIHdoZW4gdmFsaWRhdGluZzwvcGFyYW0+XHJcbiAgY2hlY2tWYWwodmFsRGV0OiBWYWxpZGF0aW9uRGV0YWlscyk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuICAgIHRoaXMuX25ld3ZhbHVlID0gKHRoaXMuX29sZHZhbHVlID0gKHRoaXMuX3BpY3R1cmVSZWFsID0gKHRoaXMuX3BpY3R1cmVFbmFibGUgPSBudWxsKSkpO1xyXG4gICAgdGhpcy5pbml0KHZhbERldCk7XHJcbiAgICB2YWxEZXQuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHZhbERldC5nZXRDb250cm9sKCk7XHJcbiAgICAvLyBUT0RPIC0gdW5jb21tZW50IHRoaXMgbGluZSB3aGVuICdQUk9QX1RZUEVfTU9ESUZZX0lOX1FVRVJZJyBpcyBzdXBwb3J0ZWQgZm9yIG90aGVyIGNvbnRyb2xzXHJcbiAgICAvLyBsZXQgbW9kSW5RdWV1eTogYm9vbGVhbiA9IGF3YWl0IGN0cmwuY2hlY2tQcm9wV2l0aExpbmUoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZZX0lOX1FVRVJZLCBmYWxzZSwgY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSkpO1xyXG4gICAgbGV0IG1vZEluUXVldXk6IGJvb2xlYW4gPSBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQjtcclxuICAgIGxldCB1c2VOYXRpdmU6IGJvb2xlYW4gPSBjdHJsLmlzTW9kaWZpYWJsZSgpO1xyXG5cclxuICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TW9kZSgpID09PSAnRScgJiYgIW1vZEluUXVldXkpIHtcclxuICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuX29sZHZhbHVlKTtcclxuICAgICAgcmV0dXJuIHZhbERldDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCIHx8IGN0cmwuaXNTZWxlY3Rpb25DdHJsKCkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCkge1xyXG4gICAgICAgICAgdmFsRGV0LnNldE51bGwoY3RybC5pc051bGxWYWx1ZSh0aGlzLl9uZXd2YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fbmV3dmFsdWUgIT09IG51bGwgJiYgY3RybC5pc1NlbGVjdGlvbkN0cmwoKSkge1xyXG4gICAgICAgICAgbGV0IGlkeDogbnVtYmVyID0gTk51bWJlci5QYXJzZSh0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgICAgICBpZiAoY3RybC5pc0Nob2ljZU51bGwoaWR4KSkge1xyXG4gICAgICAgICAgICB2YWxEZXQuc2V0TnVsbCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4XzExMSkge1xyXG4gICAgICAgIGlmIChleF8xMTEgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXhfMTExO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgIHJldHVybiB2YWxEZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc3BhY2V8bm90aGluZyB3YXMgaW5zZXJ0ZWQgIC0+IHVzZSBkZWZhdWx0IHZhbHVlXHJcbiAgICBpZiAoY3RybC5EYXRhVHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSAmJiBjdHJsLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgJiYgY3RybC5EYXRhVHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgICBpZiAoKHR5cGVvZiB0aGlzLl9uZXd2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5fbmV3dmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkgfHwgKGN0cmwuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSAmJiAoY3RybC5pc0RhdGVaZXJvKHRoaXMuX25ld3ZhbHVlKSB8fCB0aGlzLmlzTnVsbERpc3BsYXlWYWwoKSkpKSB7XHJcbiAgICAgICAgICAgIGxldCBmaWVsZDogR3VpRmllbGRCYXNlID0gY3RybC5nZXRGaWVsZCgpO1xyXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlOiBzdHJpbmcgPSBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICAgICAgbGV0IHRleHQ6IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGxEZWZhdWx0KCkpIHtcclxuICAgICAgICAgICAgICB2YWxEZXQuc2V0TnVsbCh0cnVlKTtcclxuICAgICAgICAgICAgICB0ZXh0ID0gZmllbGQuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgICAgICAgICBpZiAoTlN0cmluZy5Jc051bGxPckVtcHR5KHRleHQpICYmIGN0cmwuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSkge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChkZWZhdWx0VmFsdWUsIHZhbERldC5nZXRSYW5nZSgpLCB2YWxEZXQuZ2V0UElDKCksIHVzZU5hdGl2ZSwgZmllbGQuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHRleHQgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AoZGVmYXVsdFZhbHVlLCB2YWxEZXQuZ2V0UmFuZ2UoKSwgdmFsRGV0LmdldFBJQygpLCB1c2VOYXRpdmUsIGZpZWxkLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoKCFmaWVsZC5pc051bGxEZWZhdWx0KCkgJiYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9PSBudWxsKSkpXHJcbiAgICAgICAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0ZXh0O1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGV4dCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbERldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgIH1cclxuXHJcblxyXG4gICAgaWYgKCh0eXBlb2YgdGhpcy5fbmV3dmFsdWUgPT09ICdzdHJpbmcnICYmICEoU3RyVXRpbC5ydHJpbSh0aGlzLl9uZXd2YWx1ZSkgPT09IFN0clV0aWwucnRyaW0odGhpcy5fb2xkdmFsdWUpKSkgfHwgY3RybC5Nb2RpZmllZEJ5VXNlcilcclxuICAgIHtcclxuICAgICAgdHJ5XHJcbiAgICAgIHtcclxuICAgICAgICBzd2l0Y2ggKHZhbERldC5nZXRUeXBlKCkpXHJcbiAgICAgICAge1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja0FscGhhRmllbGQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgICB0aGlzLl9waWN0dXJlUmVhbCA9IHZhbERldC5nZXRQaWN0dXJlUmVhbCgpOyAvLyBvbmx5IG51bWVyaWMgdHlwZSBuZWVkIGFub3RoZXIgcGljdHVyZSBmb3JtYXRcclxuICAgICAgICAgICAgdGhpcy5fcGljdHVyZUVuYWJsZSA9IHZhbERldC5nZXRQaWN0dXJlRW5hYmxlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tOdW1lcmljUGljdHVyZSgpO1xyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja051bWVyaWNGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrTG9naWNhbEZpZWxkKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuY2hlY2tEYXRlRmllbGQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja1RpbWVGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgICAvLyB0aGVyZSBpcyBubyByZWFsIHBpY3R1cmUgdG8gQkxPQiwgZG8gbm90aGluZ1xyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTpcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiRmllbGRWYWxpZGF0b3IuY2hlY2tWYWw6IFR5cGUgb2YgdGhlIGZpZWxkIFwiICsgdmFsRGV0LmdldFR5cGUoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZ29CYWNrKSB7XHJcbiAgICAgICAgaWYgKGdvQmFjayBpbnN0YW5jZW9mIFdyb25nRm9ybWF0RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAvLyBuZWVkIGNoYW5nZSB0byBvbGQgdmFsdWUsIHNldCBmb2N1cyBiYWNrIGFuZCB3cml0ZSBFcnJvciBNZXNzYWdlXHJcbiAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5fb2xkdmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgICAgICAgaWYgKGdvQmFjay5nZXRUeXBlKCkgIT09IE1zZ0ludGVyZmFjZS5TVFJfUk5HX1RYVCkge1xyXG4gICAgICAgICAgICB0aGlzLnByaW50TWVzc2FnZShnb0JhY2suZ2V0VHlwZSgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhULCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxEZXQ7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrICYgdmFsaWRhdGUgQWxwaGEgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0FscGhhRmllbGQoKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCk7XHJcblxyXG4gICAgbGV0IElzQXR0ckFscGhhOiBib29sZWFuID0gdGhpcy5fdmFsRGV0LmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTtcclxuXHJcbiAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID09PSAwICYmIHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSA9PT0gbnVsbCAmJiB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9uZXd2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSXNBdHRyQWxwaGEgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICBsZXQgcGljTGVuQjogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIodGhpcy5fcGljdHVyZSk7XHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUubGVuQih0aGlzLl9uZXd2YWx1ZSkgPiBwaWNMZW5CKSB7XHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodGhpcy5fbmV3dmFsdWUsIHBpY0xlbkIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA+IHRoaXMuX3BpY3R1cmUubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoMCwgdGhpcy5fcGljdHVyZS5sZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgY3VyclBpY3R1cmU6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXIgPSBjdXJyUGljdHVyZSA9IDA7XHJcblxyXG4gICAgZm9yIChjdXJyUGljdHVyZSA9IGkgPSAwOyBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoICYmIGN1cnJQaWN0dXJlIDwgdGhpcy5fcGljdHVyZS5sZW5ndGg7ICkge1xyXG4gICAgICBpZiAoIURpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSAmJiB0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkgPT09IHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSkge1xyXG4gICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSk7XHJcbiAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpICYmIHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSAhPT0gdGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSB7XHJcbiAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpO1xyXG4gICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSAmJiB0aGlzLmlzUG9zc2libGVBbHBoYUxldHRlcihpLCBjdXJyUGljdHVyZSkpIHtcclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgICAgICAgICBsZXQgc3RyVmFsOiBzdHJpbmcgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoaSwgMSk7XHJcbiAgICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0clZhbCkgPT09IDIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChJc0F0dHJBbHBoYSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY3VyclBpY3R1cmUgKyAxIDwgdGhpcy5fcGljdHVyZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSArIDEpKSAmJiB0aGlzLmlzUG9zc2libGVBbHBoYUxldHRlcihpLCBjdXJyUGljdHVyZSArIDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpKTtcclxuICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpLyonICcqLztcclxuICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHR5cGU6IE1nQ29udHJvbFR5cGUgPSBjb250cm9sLlR5cGU7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfTlVNLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9uZXd2YWx1ZSA9IHN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKTtcclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT09IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuZmlsbEFscGhhQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICB0aGlzLl9uZXd2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiBjaGFyIGluIEFscGhhIGNvbXBsZWF0ZSB3aXRoIERpcmVjdGl2ZSBDaGFyYWN0ZXIgZm9yIHRoZSBsZXR0ZXI8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5kZXhcIj5vZiBkaXJlY3RpdmUgaW4gc3RyaW5nIHRvIGNoZWNrPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgY29tcGxldGUsIGZhbHNlIG90aGVyd2lzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGlzUG9zc2libGVBbHBoYUxldHRlcihpbmRleElucHV0OiBudW1iZXIsIGluZGV4UGljdHVyZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG4gICAgc3dpdGNoICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoaW5kZXhQaWN0dXJlKSkge1xyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0o6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19HOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfUzpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1Q6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVTpcclxuICAgICAgICBsZXQgdXBwZXI6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKHVwcGVyICE9PSB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XSlcclxuICAgICAgICAgIHRoaXMuY2hhbmdlU3RyaW5nSW5zaWRlKFwiXCIgKyB1cHBlciwgaW5kZXhJbnB1dCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTDpcclxuICAgICAgICBsZXQgbG93ZXI6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKGxvd2VyICE9PSB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XSlcclxuICAgICAgICAgIHRoaXMuY2hhbmdlU3RyaW5nSW5zaWRlKFwiXCIgKyBsb3dlciwgaW5kZXhJbnB1dCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTjpcclxuICAgICAgICBsZXQgbnVtYmVyMTogc3RyaW5nID0gdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF07XHJcbiAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KG51bWJlcjEpIHx8IE5DaGFyLklzV2hpdGVTcGFjZShudW1iZXIxKSB8fCBVdGlsU3RyQnl0ZU1vZGUuYXNOdW1lcmljKG51bWJlcjEpKVxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUVycm9yVG9Mb2coXCJCYWQgQWxwaGEgdmFsdWUuIFNob3VsZCBiZSBudW1iZXIgb25seSBvbiBwbGFjZSBOdW0uIFwiICsgaW5kZXhJbnB1dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBFdmVudHMuV3JpdGVFcnJvclRvTG9nKFwiRmllbGRWYWxpZGF0b3IuaXNQb3NzaWJsZUFscGhhTGV0dGVyOiBpbGxlZ2FsIENoYXIgRGlyZWN0aXZlOiBcIiArIHRoaXMuX3BpY3R1cmUuaW5kZXhPZihTdHJpbmcuZnJvbUNoYXJDb2RlKGluZGV4UGljdHVyZSkpICsgXCIgZm9yIFwiICsgdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF0pO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pZiBuZXcgdmFsdWUgd2Fzbid0IGZpbmlzaGVkIGFuZCBzdGF5IHVud3JpdGFibGUgcGVhY2VzIG9mIHRoZSBSZWFsIHBpY3R1cmUgLSBhZGQgaXRcclxuICAvLy8gdG8gdGhlIGVuZCBvZiB0aGUgbmV3dmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmlsbEFsbEFscGhhKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuX3BpY3R1cmUubGVuZ3RoKTtcclxuICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlKTtcclxuXHJcbiAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiB0aGlzLl92YWxEZXQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSB7XHJcbiAgICAgIGxldCBpbnROZXd2YWx1ZUxlbkI6IG51bWJlciA9IFV0aWxTdHJCeXRlTW9kZS5sZW5CKHRoaXMuX25ld3ZhbHVlKTtcclxuICAgICAgbGV0IHN0ckJ1aWVkUGljdHVyZTogc3RyaW5nID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHRoaXMuX3BpY3R1cmUsIGludE5ld3ZhbHVlTGVuQik7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHN0ckJ1aWVkUGljdHVyZS5sZW5ndGg7IGkgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZS5jaGFyQXQoaSkpKSB7XHJcbiAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGkpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggLSAxOyBpIDwgdGhpcy5fcGljdHVyZS5sZW5ndGggJiYgaSA+PSAwOyBpKyspIHtcclxuICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChpKSkpIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKCcgJykvKicgJyovO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNvbXBhcmF0aXZlIG5ld3ZhbHVlIHdpdGggcG9zc2libGUgUmFuZ2UgaW4gQ29udGludW91c1JhbmdlVmFsdWVzL0Rpc2NyZXRlUmFuZ2VWYWx1ZXM8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXd2YWx1ZSBpZiBpdCBwb3NzaWJsZSwgb2xkdmFsdWUgb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZmlsbEFscGhhQnlSYW5nZShDb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgRGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+KTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgdG1wQnVmZmVyOiBzdHJpbmcgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZpbGxBbHBoYUJ5RGlzY3JldGVSYW5nZVZhbHVlcyhEaXNjcmV0ZVJhbmdlVmFsdWVzLCB0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICBpZiAodG1wQnVmZmVyICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0bXBCdWZmZXI7XHJcbiAgICB9XHJcblxyXG4gICAgdG1wQnVmZmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5maWxsQWxwaGFCeUNvbnRpbnVvdXNSYW5nZVZhbHVlcyhDb250aW51b3VzUmFuZ2VWYWx1ZXMsIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiB0bXBCdWZmZXI7XHJcblxyXG4gICAgICBpZiAoRGlzY3JldGVSYW5nZVZhbHVlcyAhPT0gbnVsbClcclxuICAgICAgICByZXR1cm4gdGhpcy5Db21wbGV0ZUFscGhhQnlSYW5nZShEaXNjcmV0ZVJhbmdlVmFsdWVzKTtcclxuXHJcblxyXG4gICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhULCB0cnVlKTtcclxuICAgIHJldHVybiB0aGlzLl9vbGR2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5UcnkgdG8gY29tcGxldGUgdGhlIG5ld3ZhbHVlIGJ5IFJhbmdlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gY29tcGxldGVkIHZhbHVlIGlmIGl0IHBvc3NpYmxlLCBvdGhlcndpc2Ugb2xkdmFsdWU8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBDb21wbGV0ZUFscGhhQnlSYW5nZShEaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4pOiBzdHJpbmcge1xyXG4gICAgbGV0IHRtcE5ld1ZhbHVlOiBzdHJpbmcgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmNvbXBsZXRlQWxwaGFCeVJhbmdlKERpc2NyZXRlUmFuZ2VWYWx1ZXMsIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIGlmICh0bXBOZXdWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdG1wTmV3VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZm9jdXMgYmFja1xyXG4gICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhULCB0cnVlKTtcclxuICAgIHJldHVybiB0aGlzLl9vbGR2YWx1ZTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgJiB2YWxpZGF0ZSBMb2dpY2FsIGZpZWxkIGJ5IGhpcyBvbGQvbmV3IHZhbHVlIGFuZCAyIHBpY3R1cmVzOlxyXG4gIC8vLyBSZWFsIGFuZCBFbmFibGVcclxuICAvLy8gMS5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHBpY3R1cmVzLCBvdGhlcndpc2UgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDIuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCByYW5nZVxyXG4gIC8vLyAyLjEgY29tcGxldGUgdmFsdWUsIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBTdHJpbmcgLSBuZXcgdmFsdWUgb2YgdmFsaWRhdGVkIGZpZWxkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tMb2dpY2FsRmllbGQoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgPT09IG51bGwgJiYgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSA9PT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhUKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9PSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLmZpbGxBbHBoYUJ5UmFuZ2UodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpLCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQoZmFsc2UpO1xyXG5cclxuICAvLyB0b2RvIDogbmVlZCB0byBjaGVjayB3aGF0IGlzIHRvIGhhbmRsZSBmb3IgY2hlY2tpbmcgcmFuZ2VzXHJcbiAgICByZXR1cm4gdGhpcy5fbmV3dmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KioqKioqKioqKioqKioqKioqKioqKioqKipOdW1lcmljKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgJiB2YWxpZGF0ZSBOdW1lcmljIGZpZWxkIGJ5IGhpcyBvbGQvbmV3IHZhbHVlIGFuZCAyIHBpY3R1cmVzOlxyXG4gIC8vLyBSZWFsIGFuZCBFbmFibGVcclxuICAvLy8gMS5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHBpY3R1cmVzLCBvdGhlcndpc2UgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDIuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCByYW5nZVxyXG4gIC8vLyAyLjEgY29tcGxldGUgdmFsdWUsIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBTdHJpbmcgLSBuZXcgdmFsdWUgb2YgdmFsaWRhdGVkIGZpZWxkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljRmllbGQoKTogYW55IHtcclxuXHJcbiAgICBsZXQgZXZhbHVhdGVkOiBhbnk7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuX25ld3ZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBcIjBcIjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGRlbGltZXRlclJlYWxJbmRleDogbnVtYmVyID0gdGhpcy5fbmV3dmFsdWUuaW5kZXhPZih0aGlzLl9kZWNpbWFsKTtcclxuICAgICAgbGV0IGRlbGltZXRlclBpY3RJbmRleDogbnVtYmVyID0gdGhpcy5fcGljdHVyZVJlYWwuaW5kZXhPZih0aGlzLl9kZWNpbWFsKTtcclxuXHJcbiAgICAgIGV2YWx1YXRlZCA9IFwiXCI7XHJcbiAgICAgIGxldCBldmFsdWF0ZWRMZWZ0OiBzdHJpbmc7XHJcbiAgICAgIGxldCBldmFsdWF0ZWRSaWdodDogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgZm9ybWF0IG9mIG5ld3ZhbHVlIG1hdGNoZXMgdGhlIG51bWVyaWMgbWFzay5cclxuICAgICAgaWYgKCF0aGlzLmNoZWNrTnVtZXJpY0luRGVjRm9ybWF0KCkpXHJcbiAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5FRFRfRVJSX1NUUl8xKTtcclxuXHJcbiAgICAgIGlmIChkZWxpbWV0ZXJQaWN0SW5kZXggIT09IC0xICYmIGRlbGltZXRlclJlYWxJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBldmFsdWF0ZWRMZWZ0ID0gdGhpcy5jaGVja051bWVyaWNMZWZ0KGRlbGltZXRlclBpY3RJbmRleCwgZGVsaW1ldGVyUmVhbEluZGV4KTtcclxuICAgICAgICBldmFsdWF0ZWRSaWdodCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoZGVsaW1ldGVyUGljdEluZGV4LCBkZWxpbWV0ZXJSZWFsSW5kZXgpO1xyXG4gICAgICAgIGV2YWx1YXRlZCA9IGV2YWx1YXRlZExlZnQgKyB0aGlzLl9kZWNpbWFsICsgZXZhbHVhdGVkUmlnaHQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGRlbGltZXRlclBpY3RJbmRleCAhPT0gLTEgJiYgZGVsaW1ldGVyUmVhbEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgZXZhbHVhdGVkTGVmdCA9IHRoaXMuY2hlY2tOdW1lcmljTGVmdChkZWxpbWV0ZXJQaWN0SW5kZXgsIE1hdGgubWluKGRlbGltZXRlclBpY3RJbmRleCwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgICBldmFsdWF0ZWRSaWdodCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoZGVsaW1ldGVyUGljdEluZGV4LCBkZWxpbWV0ZXJQaWN0SW5kZXggLSAxKTtcclxuICAgICAgICAgIGV2YWx1YXRlZCA9IGV2YWx1YXRlZExlZnQgKyB0aGlzLl9kZWNpbWFsICsgZXZhbHVhdGVkUmlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgeyAvLyBkZWxpbWV0ZXJQaWN0SW5kZXggPT0gLTEgJiYgZGVsaW1ldGVyUmVhbEluZGV4ICE9IC0xXHJcbiAgICAgICAgICBpZiAoZGVsaW1ldGVyUGljdEluZGV4ID09PSAtMSAmJiBkZWxpbWV0ZXJSZWFsSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoLTEsIC0xKTtcclxuICAgICAgICAgICAgZXZhbHVhdGVkTGVmdCA9IGV2YWx1YXRlZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZGVsaW1ldGVyUmVhbEluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5fbmV3dmFsdWUuc3Vic3RyKDAsIGRlbGltZXRlclJlYWxJbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBcIjBcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBldmFsdWF0ZWQgPSB0aGlzLmNoZWNrTnVtZXJpY1JpZ2h0KC0xLCAtMSk7XHJcbiAgICAgICAgICAgIGV2YWx1YXRlZExlZnQgPSBldmFsdWF0ZWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoKGV2YWx1YXRlZFJpZ2h0Lmxlbmd0aCA9PT0gMCAmJiBldmFsdWF0ZWRMZWZ0Lmxlbmd0aCA9PT0gMCkgfHwgKGV2YWx1YXRlZC5sZW5ndGggPT09IDAgJiYgdGhpcy5fbmV3dmFsdWUubGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAvLyBzcGFjZXxub3RoaW5nIHdhcyBpbnNlcnRlZCAgLT4gdXNlIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZTtcclxuICAgICAgICBjdHJsID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKTtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSBjdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgICAgbGV0IGRlZlZhbHVlOiBzdHJpbmcgPSBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKTsgLy8gaW5uZXIgdmFsdWUgaW5zZXJ0ZWRcclxuICAgICAgICBsZXQgZGlzcERlZlZhbHVlOiBhbnkgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoZmllbGQuaXNOdWxsRGVmYXVsdCgpKSB7XHJcbiAgICAgICAgICB0aGlzLl92YWxEZXQuc2V0TnVsbCh0cnVlKTtcclxuICAgICAgICAgIGRpc3BEZWZWYWx1ZSA9IGZpZWxkLmdldE51bGxEaXNwbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwRGVmVmFsdWUgPT0gbnVsbClcclxuICAgICAgICAgIGRpc3BEZWZWYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChkZWZWYWx1ZSwgdGhpcy5fdmFsRGV0LmdldFJhbmdlKCksIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgZmllbGQuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIGRpZ2l0IGJlZm9yZSB0aGUgZGVsaW1pdGVyIGRvIG5vdCBleGNlZWQgdGhlIHBpYyB3aG9sZXMuXHJcbiAgICAgIGxldCB3aG9sZURpZ2l0ZGlmZjogbnVtYmVyID0gdGhpcy5kaWdpdHNCZWZvcmVEZWxpbWV0ZXIoZXZhbHVhdGVkLCAwLCB0aGlzLl9kZWNpbWFsKSAtIHRoaXMuX3ZhbERldC5nZXRQSUMoKS5nZXRXaG9sZXMoKTtcclxuICAgICAgLy8gaWYgdGhleSBkbywgY2hlY2sgaWYgdGhlIGV4Y2VlZGluZyBjaGFycyBhcmUgdGhlIHBhZCBjaGFycy4gaWYgc28sIHRoZXJlIGlzIG5vIGVycm9yLlxyXG4gICAgICBpZiAod2hvbGVEaWdpdGRpZmYgPiAwKSB7XHJcbiAgICAgICAgbGV0IHBhZENoYXJPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgLy8gaXMgdGhlcmUgYSBwYWQsIGNoZWNrIGl0LiBubyBwYWQgaXMgYSBjZXJ0YWluIGVycm9yLlxyXG4gICAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0SXNQYWRGaWxsKCkpIHtcclxuICAgICAgICAgIHBhZENoYXJPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB3aG9sZURpZ2l0ZGlmZiAmJiBwYWRDaGFyT25seTsgaSsrKVxyXG4gICAgICAgICAgICAvLyBpZiB0aGUgY2hhciBpcyBub3QgdGhlIHBhZCwgdGhlbiB0aGlzIGlzIGFuIGVycm9yLlxyXG4gICAgICAgICAgICBpZiAoZXZhbHVhdGVkW2ldICE9PSB0aGlzLl92YWxEZXQuZ2V0UGFkRmlsbENoYXIoKSlcclxuICAgICAgICAgICAgICBwYWRDaGFyT25seSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwYWRDaGFyT25seSlcclxuICAgICAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuRURUX0VSUl9TVFJfMSk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICBpZiAodGhpcy5fdmFsRGV0LmdldElzTmVnYXRpdmUoKSAmJiAodGhpcy5fbmV3dmFsdWUudHJpbSgpLnN0YXJ0c1dpdGgoXCItXCIpIHx8ICh0aGlzLl92YWxEZXQuZ2V0TmVnYXRpdmVTaWduUHJlZigpLmxlbmd0aCAhPT0gMCAmJiB0aGlzLl9uZXd2YWx1ZS50cmltKCkuc3RhcnRzV2l0aCh0aGlzLl92YWxEZXQuZ2V0TmVnYXRpdmVTaWduUHJlZigpKSkpKSB7XHJcbiAgICAgICAgZXZhbHVhdGVkID0gXCItXCIgKyBldmFsdWF0ZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGZyb20gdGhpcyBwb2ludCBoYXZlIGV2YWx1YXRlZCBzdHJpbmcgLSB0aGUgdmFsdWUgKHdpdGhvdXQgbWFzaykgb2YgdGhlIGNvbnRyb2xcclxuICAgICAgLy8gbmVlZGVkIHRvIGJlIGluc2VydGVkIHRvIHRoZSBwaWN0dXJlXHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyh0aGlzLl9uZXd2YWx1ZSwgXCJcIiwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTik7XHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChldmFsdWF0ZWQsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgdHJ1ZSk7XHJcblxyXG4gICAgICAvLyBpbiBvcmRlciBjaGVjayBpZiB1c2VyIGhhcyBlbnRlcmVkIGEgYmxhbmsgdmFsdWUgLCB0cmltIGFuZCB0aGVuIGNoZWNrIGl0J3MgbGVuZ3RoLlxyXG4gICAgICBsZXQgdGVtcERpc3BWYWw6IHN0cmluZyA9IFN0clV0aWwubHRyaW0oZXZhbHVhdGVkKTtcclxuICAgICAgaWYgKHRlbXBEaXNwVmFsLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl92YWxEZXQuZ2V0UElDKCkuemVyb0ZpbGwoKSAmJiB0aGlzLl92YWxEZXQuZ2V0UElDKCkuZ2V0WmVyb1BhZCgpID09PSAnICcpXHJcbiAgICAgICAgZXZhbHVhdGVkID0gXCIwXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuXHJcbiAgICAgIC8vIGZyb20gdGhpcyBwb2ludCBoYXZlIGV2YWx1YXRlZCBzdHJpbmcgLSB0aGUgdmFsdWUgKHdpdGhvdXQgbWFzaykgb2YgdGhlIGNvbnRyb2xcclxuICAgICAgLy8gbmVlZGVkIHRvIGJlIGluc2VydGVkIHRvIHRoZSBwaWN0dXJlXHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyh0aGlzLl9uZXd2YWx1ZSwgXCJcIiwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTik7XHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChldmFsdWF0ZWQsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgdHJ1ZSk7XHJcblxyXG4gICAgfVxyXG4gICAgLy8gSW5zZXJ0IHRoZSBudW1iZXIgdG8gcmFuZ2VcclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuX25ld3ZhbHVlID0gZXZhbHVhdGVkO1xyXG4gICAgICBldmFsdWF0ZWQgPSB0aGlzLmZpbGxOdW1lcmljQnlSYW5nZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGV2YWx1YXRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5DaGVjayB2YWxpZGl0eSBvZiBudW1lcmljYWwgcGljdHVyZSBmcm9tIGZvdW5kICdkZWxpbWV0ZXInIHRvIGxlZnQuXHJcbiAgLy8vIDwtLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1ldGVyUGljdEluZGV4XCI+Zm91bmQgZGVsaW1ldGVyIGluIHRoZSBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJSZWFsSW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIGluc2VydGVkIGJ5IHVzZXIgbmV3IHZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrTnVtZXJpY0xlZnQoZGVsaW1ldGVyUGljdEluZGV4OiBudW1iZXIsIGRlbGltZXRlclJlYWxJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBidWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IFJlYWxJbmRleDogbnVtYmVyID0gZGVsaW1ldGVyUmVhbEluZGV4IC0gMTtcclxuICAgIGxldCBQaWN0SW5kZXg6IG51bWJlcjtcclxuICAgIGxldCBpc0ZvdW5kOiBib29sZWFuO1xyXG5cclxuICAgIGZvciAoUGljdEluZGV4ID0gZGVsaW1ldGVyUGljdEluZGV4IC0gMTsgUGljdEluZGV4ID49IDAgJiYgUmVhbEluZGV4ID49IDA7IFBpY3RJbmRleC0tKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgdG1wc3RvcmFnZTogbnVtYmVyID0gUmVhbEluZGV4O1xyXG4gICAgICAgIGlzRm91bmQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgZm9yICg7IFJlYWxJbmRleCA+PSAwOyBSZWFsSW5kZXgtLSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSA9PT0gdGhpcy5fbmV3dmFsdWVbUmVhbEluZGV4XSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaXNGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIFJlYWxJbmRleC0tO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXNGb3VuZClcclxuICAgICAgICAgIFJlYWxJbmRleCA9IHRtcHN0b3JhZ2U7XHJcblxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gY2FuIGluc2VydCBvbmx5IG51bWJlclxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBmb3IgKDsgUmVhbEluZGV4ID49IDA7IFJlYWxJbmRleC0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKTtcclxuICAgICAgICAgICAgUmVhbEluZGV4LS07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChSZWFsSW5kZXggPCAwICYmIFBpY3RJbmRleCA+PSAwKVxyXG4gICAgLy8gdHJ5IHRvIGFkZCB1bndyaXRhYmxlXHJcbiAgICAgIGZvciAoOyBQaWN0SW5kZXggPj0gMDsgUGljdEluZGV4LS0pXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmVSZWFsW1BpY3RJbmRleF0pO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAvLyBvbmx5IGZyb20gbGVmdCBuZWVkIFBhZEZpbGxcclxuICAgICAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0SXNQYWRGaWxsKCkpXHJcbiAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fdmFsRGV0LmdldFBhZEZpbGxDaGFyKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIHJldHVybiBTdHJVdGlsLlJldmVyc2VTdHJpbmcoYnVmZmVyKS5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrIHZhbGlkaXR5IG9mIG51bWVyaWNhbCBwaWN0dXJlIGZyb20gZm91bmQgJ2RlbGltZXRlcicgdG8gcmlnaHQuXHJcbiAgLy8vIC4tPlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1ldGVyUGljdEluZGV4XCI+Zm91bmQgZGVsaW1ldGVyIGluIHRoZSBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJSZWFsSW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIGluc2VydGVkIGJ5IHVzZXIgbmV3IHZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrTnVtZXJpY1JpZ2h0KGRlbGltZXRlclBpY3RJbmRleDogbnVtYmVyLCBkZWxpbWV0ZXJSZWFsSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBSZWFsSW5kZXg6IG51bWJlciA9IGRlbGltZXRlclJlYWxJbmRleCArIDE7XHJcbiAgICBsZXQgUGljdEluZGV4OiBudW1iZXI7XHJcbiAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcblxyXG4gICAgZm9yIChQaWN0SW5kZXggPSBkZWxpbWV0ZXJQaWN0SW5kZXggKyAxOyBQaWN0SW5kZXggPCB0aGlzLl9waWN0dXJlRW5hYmxlLmxlbmd0aCAmJiBSZWFsSW5kZXggPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IFBpY3RJbmRleCsrKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoUmVhbEluZGV4IDwgUGljdEluZGV4KVxyXG4gICAgICAgICAgUmVhbEluZGV4ID0gUGljdEluZGV4O1xyXG5cclxuICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmVSZWFsW1BpY3RJbmRleF0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNhbiBpbnNlcnQgb25seSBudW1iZXJcclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgZm9yICg7IFJlYWxJbmRleCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDsgUmVhbEluZGV4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSBkaWdpdCBvZiBhY3R1YWwgaW5wdXQgZGF0YS4gSWYgaXQgaXMgbWFzayBjaGFyLCBza2lwIGl0LlxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW1JlYWxJbmRleF0pICYmICFwaWMucGljSXNNYXNrKFJlYWxJbmRleCkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fbmV3dmFsdWVbUmVhbEluZGV4XSk7XHJcbiAgICAgICAgICAgIFJlYWxJbmRleCsrO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiByaWdodCBwYXJ0IGhhcyBhbnkgaW5wdXQgZGF0YSwgdGhlbiBvbmx5IGFwcGVuZCB1bndyaXRhYmxlIGNoYXJzXHJcbiAgICBpZiAoYnVmZmVyLkxlbmd0aCA+IDApXHJcbiAgICB7XHJcbiAgICAgIGlmIChSZWFsSW5kZXggPj0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoICYmIFBpY3RJbmRleCA8IHRoaXMuX3BpY3R1cmVSZWFsLmxlbmd0aClcclxuICAgICAgLy8gdHJ5IHRvIGFkZCB1bndyaXRhYmxlXHJcbiAgICAgICAgZm9yICg7IFBpY3RJbmRleCA8IHRoaXMuX3BpY3R1cmVSZWFsLmxlbmd0aDsgUGljdEluZGV4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3BpY3R1cmVFbmFibGVbUGljdEluZGV4XSA9PT0gJzEnKVxyXG4gICAgICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmVSZWFsW1BpY3RJbmRleF0pO1xyXG4gICAgICAgICAgLy8gZWxzZSBEbyBub3RoaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkJVRzogNDQyNzg4XHJcbiAgLy8vIENoYW5naW5nIGRlY2ltYWwgc2VwYXJhdG9yIGluIHRoZXcgcGljdHVyZVJlYWwgdG8gdmFsdWUgZ290IGZyb20gRW52aXJvbm1lbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljUGljdHVyZSgpOiB2b2lkIHtcclxuICAgIGxldCBpbmRleE9mRGVjOiBudW1iZXI7XHJcbiAgICBsZXQgbGFzdERlYzogbnVtYmVyO1xyXG4gICAgbGV0IG1heExlbmd0aDogbnVtYmVyO1xyXG4gICAgbGV0IGN1cnJJbmR4OiBudW1iZXI7XHJcbiAgICBsZXQgUE9JTlRfREVDOiBzdHJpbmcgPSBcIi5cIjsgLy8gdXNlZCBpbiBQSUNUVVJFIGZvciBkZWNpbWFsIHNlcGFyYXRvclxyXG5cclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fcGljdHVyZVJlYWwgPT0gbnVsbCB8fCB0aGlzLl9waWN0dXJlRW5hYmxlID09IG51bGwgfHwgcGljLmdldEF0dHIoKSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8ICFwaWMud2l0aERlY2ltYWwoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGxhc3REZWMgPSB0aGlzLl9waWN0dXJlUmVhbC5sYXN0SW5kZXhPZihQT0lOVF9ERUMpO1xyXG4gICAgbWF4TGVuZ3RoID0gdGhpcy5fcGljdHVyZUVuYWJsZS5sZW5ndGg7XHJcbiAgICBjdXJySW5keCA9IDA7XHJcbiAgICB3aGlsZSAoY3VyckluZHggPCBsYXN0RGVjKVxyXG4gICAge1xyXG4gICAgICBpbmRleE9mRGVjID0gdGhpcy5fcGljdHVyZUVuYWJsZS5pbmRleE9mKFwiMVwiLCBjdXJySW5keCk7XHJcblxyXG4gICAgICBpZiAoaW5kZXhPZkRlYyA9PT0gLTEpXHJcbiAgICAgIC8vIG5vdCBmb3VuZFxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGluZGV4T2ZEZWMgPT09IHRoaXMuX3BpY3R1cmVSZWFsLmluZGV4T2YoIFBPSU5UX0RFQywgY3VyckluZHgpKVxyXG4gICAgICAgIC8vIGl0J3MgcmVhbCBkZWNpbWFsIHBvaW50IGFuZCBub3QgXFwuIGludG8gdGhlIHBpY3R1cmVcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgZmlyc3Q6IHN0cmluZztcclxuICAgICAgICAgIGxldCBzZWNvbmQ6IHN0cmluZztcclxuXHJcbiAgICAgICAgICBmaXJzdCA9IHNlY29uZCA9IFwiXCI7XHJcbiAgICAgICAgICBpZiAoaW5kZXhPZkRlYyA9PT0gMClcclxuICAgICAgICAgIC8vIHRoZSBwb2ludCBvbiB0aGUgZmlyc3QgcGxhY2UgLiMjI1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhPZkRlYyArIDEgPCBtYXhMZW5ndGgpXHJcbiAgICAgICAgICAgIC8vIG9ubHkgMSAuXHJcbiAgICAgICAgICAgICAgc2Vjb25kID0gdGhpcy5fcGljdHVyZVJlYWwuc3Vic3RyKGluZGV4T2ZEZWMgKyAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGluZGV4T2ZEZWMgPT09IG1heExlbmd0aClcclxuICAgICAgICAgIC8vIHRoZSBwb2ludCBvbiB0aGUgbGFzdCBwbGFjZSAjIyMuXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpcnN0ID0gdGhpcy5fcGljdHVyZVJlYWwuc3Vic3RyKDAgLCBpbmRleE9mRGVjKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmlyc3QgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoMCAsIGluZGV4T2ZEZWMpO1xyXG4gICAgICAgICAgICBzZWNvbmQgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoaW5kZXhPZkRlYyArIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fcGljdHVyZVJlYWwgPSBmaXJzdCArIHRoaXMuX2RlY2ltYWwgKyBzZWNvbmQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGN1cnJJbmR4ID0gKytpbmRleE9mRGVjO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDb21wYXJlIG5ld3ZhbHVlIHdpdGggdGhlIHJhbmdlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gbmV3dmFsdWUgaWYgaXQncyBpbiB0aGUgcmFuZ2UsIG9sZHZhbHVlIG90aGVyd2lzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGZpbGxOdW1lcmljQnlSYW5nZSgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNvbnRyb2xQaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0UElDKCk7XHJcbiAgICBsZXQgY29udGludW91c1JhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4gPSB0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCk7XHJcbiAgICBsZXQgZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+ID0gdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKTtcclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gICAgbGV0IGNoZWNrZWRTdHI6IHN0cmluZyA9IHRoaXMuc2V0TnVtZXJpY1ZhbHVlV2l0aG91dFBpY3R1cmUodGhpcy5fbmV3dmFsdWUudG9TdHJpbmcoKSk7XHJcblxyXG5cclxuICAgIGlmIChjaGVja2VkU3RyLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgICByZXR1cm4gdGhpcy5fb2xkdmFsdWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgICAgbGV0IGNoZWNrZWROdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKHRoaXMuX25ld3ZhbHVlLnRvU3RyaW5nKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0UElDKCksIDApO1xyXG5cclxuICAgICAgaWYgKGRpc2NyZXRlUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGlzY3JldGVSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgbGV0IHJhbmdlSXRlbVZhbHVlMTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoZGlzY3JldGVSYW5nZVZhbHVlcy5nZXRfSXRlbShpKSwgY29udHJvbFBpYywgMCk7XHJcblxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKE5VTV9UWVBFLm51bV9jbXAoY2hlY2tlZE51bSwgcmFuZ2VJdGVtVmFsdWUxKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZXd2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2ggKGV4X0NDKSB7XHJcbiAgICAgICAgICAgIC8vIHNraXAgbm9uLW51bWVyaWMgcmFuZ2UgdmFsdWVzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29udGludW91c1JhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNvbnRpbnVvdXNSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgICAgIGxldCByYW5nZUl0ZW1WYWx1ZTE6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgICAgICBsZXQgcmFuZ2VJdGVtVmFsdWUyOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG5cclxuICAgICAgICAgIHJhbmdlSXRlbVZhbHVlMS5udW1fNF9hX3N0ZChjb250aW51b3VzUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSsrKSk7XHJcbiAgICAgICAgICByYW5nZUl0ZW1WYWx1ZTIubnVtXzRfYV9zdGQoY29udGludW91c1JhbmdlVmFsdWVzLmdldF9JdGVtKGkpKTtcclxuXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoTlVNX1RZUEUubnVtX2NtcChjaGVja2VkTnVtLCByYW5nZUl0ZW1WYWx1ZTEpICE9PSAtMSAmJiBOVU1fVFlQRS5udW1fY21wKHJhbmdlSXRlbVZhbHVlMiwgY2hlY2tlZE51bSkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25ld3ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXRjaCAoZXhfMTVCKSB7XHJcbiAgICAgICAgICAgIC8vIHNraXAgbm9uLW51bWVyaWMgcmFuZ2UgdmFsdWVzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm5zIGEgbnVtZXJpYyB2YWx1ZSBleHRyYWN0ZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEgc3RyaW5nXHJcbiAgLy8vIG9uIGZhaWx1cmUgcmV0dXJucyBORUdBVElWRV9JTkZJTklUWVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+dGhlIHN0cmluZyB0byBwYXJzZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXREb3VibGVWYWwodmFsOiBzdHJpbmcpOiBudW1iZXIge1xyXG5cclxuICAgIGxldCBkb3RGb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG1pbnVzRm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBkaWdpdEZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZW5kT2ZOdW06IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIGZpbmQgdGhlIGRlbGVtZXRpbmcgbm9uIG51bWVyaWMgY2hhcmFjdGVyXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsLmxlbmd0aCAmJiAhZW5kT2ZOdW07IGkrKylcclxuICAgIHtcclxuICAgICAgbGV0IGM6IHN0cmluZyA9IHZhbFtpXTtcclxuICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKVxyXG4gICAgICAgIGRpZ2l0Rm91bmQgPSB0cnVlO1xyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBzd2l0Y2ggKGMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FzZSAnLSc6XHJcbiAgICAgICAgICAgIGlmIChkaWdpdEZvdW5kIHx8IGRvdEZvdW5kIHx8IG1pbnVzRm91bmQpXHJcbiAgICAgICAgICAgICAgZW5kT2ZOdW0gPSB0cnVlO1xyXG4gICAgICAgICAgICBtaW51c0ZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAnLic6XHJcbiAgICAgICAgICAgIGlmIChkb3RGb3VuZCB8fCBtaW51c0ZvdW5kICYmICFkaWdpdEZvdW5kKVxyXG4gICAgICAgICAgICAgIGVuZE9mTnVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgZG90Rm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlICcgJzpcclxuICAgICAgICAgICAgaWYgKGRpZ2l0Rm91bmQgfHwgZG90Rm91bmQgfHwgbWludXNGb3VuZClcclxuICAgICAgICAgICAgICBlbmRPZk51bSA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGVuZE9mTnVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVuZE9mTnVtKSB7XHJcbiAgICAgIGkgPSBpIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaSA+IDApIHtcclxuICAgICAgcmV0dXJuIE5OdW1iZXIuUGFyc2UodmFsLnN1YnN0cigwLCBpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC1JbmZpbml0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5zZXQgTnVtZXJpYyB2YWx1ZSBXaXRob3V0IFBpY3R1cmUsIGZpbHRlciBpbnB1dCBmcm9tIHVzZXI8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcHVyZSBudW1iZXIsIHdpdGhvdXQgcGljdHVyZSBtYXNrPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc2V0TnVtZXJpY1ZhbHVlV2l0aG91dFBpY3R1cmUodmFsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNoZWNrZWRTdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih2YWwubGVuZ3RoKTtcclxuICAgIGxldCBpc0ZpcnN0RGVjaW1hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGN1cnJDaGFyOiBzdHJpbmc7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3BpY3R1cmVSZWFsLmxlbmd0aCAmJiBpIDwgdmFsLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICBjdXJyQ2hhciA9IHZhbFtpXTtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGN1cnJDaGFyKSlcclxuICAgICAgICBjaGVja2VkU3RyLkFwcGVuZChjdXJyQ2hhcik7XHJcbiAgICAgIGVsc2UgaWYgKGN1cnJDaGFyID09PSB0aGlzLl9lbnZpcm9ubWVudC5HZXREZWNpbWFsKCkgJiYgIWlzRmlyc3REZWNpbWFsKVxyXG4gICAgICB7XHJcbiAgICAgICAgY2hlY2tlZFN0ci5BcHBlbmQoTlN0cmluZy5Ub0NoYXJBcnJheShOdW1iZXJGb3JtYXRJbmZvLk51bWJlckRlY2ltYWxTZXBhcmF0b3IpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGlzRmlyc3REZWNpbWFsID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChjdXJyQ2hhciA9PT0gJy0nICYmIHRoaXMuX3ZhbERldC5nZXRJc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgY2hlY2tlZFN0ci5BcHBlbmQoTlN0cmluZy5Ub0NoYXJBcnJheShOdW1iZXJGb3JtYXRJbmZvLk5lZ2F0aXZlU2lnbikudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hlY2tlZFN0ci5Ub1N0cmluZygpLmxlbmd0aCA9PT0gMClcclxuICAgIHtcclxuICAgICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfTlVNLCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGVja2VkU3RyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGNoZWNrIGlmIG5ld3ZhbHVlIGZvcm1hdCBtYXRjaGVzIHRoZSBudW1lcmljIHBpYyBmb3JtYXQuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja051bWVyaWNJbkRlY0Zvcm1hdCgpOiBib29sZWFuIHtcclxuXHJcblxyXG4gICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBEZWM6IG51bWJlcjtcclxuICAgIGxldCBXaG9sZTogbnVtYmVyO1xyXG4gICAgbGV0IERlY1BvczogbnVtYmVyO1xyXG4gICAgbGV0IGRlY2ltYWxDaGFyOiBzdHJpbmcgPSB0aGlzLl9lbnZpcm9ubWVudC5HZXREZWNpbWFsKCk7XHJcblxyXG4gICAgLy8gQ291bnQgbnVtYmVyIG9mIGRpZ2l0cyBhbmQgcG9zaXRpb24gb2YgZGVjaW1hbCBwb2ludFxyXG5cclxuICAgIERlYyA9IDA7XHJcbiAgICBXaG9sZSA9IDA7XHJcbiAgICBEZWNQb3MgPSAtMTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICAgIGlmIChwaWMuaXNOdW1lcmljKGkpKVxyXG4gICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZVtpXSkpXHJcbiAgICAgICAgLy8gd2hlbiBkZWMgcG9zIG5vdCBmb3VuZCwgY291bnQgd2hvbGVzLCBpZiBmb3VuZCwgY291bnQgZGVjLlxyXG4gICAgICAgICAgaWYgKERlY1BvcyA+PSAwKVxyXG4gICAgICAgICAgICBEZWMrKztcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgV2hvbGUrKztcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9uZXd2YWx1ZVtpXSA9PT0gZGVjaW1hbENoYXIpXHJcbiAgICAgICAgICBEZWNQb3MgPSBpO1xyXG5cclxuICAgIC8vIGRpZCB3ZSBleGNlZWQgdGhlIG1hc2sgP1xyXG4gICAgaWYgKHBpYy5nZXRXaG9sZXMoKSA8IFdob2xlIHx8IHBpYy5nZXREZWMoKSA8IERlYylcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIERhdGUgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0RhdGVGaWVsZCgpOiBEYXRlIHtcclxuXHJcbiAgICBsZXQgbmV3RGF0ZTogRGF0ZSA9ICh0aGlzLl9uZXd2YWx1ZSA9PSBudWxsID8gbnVsbCA6IG5ldyBEYXRlKHRoaXMuX25ld3ZhbHVlKSk7XHJcbiAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5pc0RhdGVaZXJvKHRoaXMuX25ld3ZhbHVlKSkge1xyXG4gICAgICAvLyBnZXQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZmllbGRcclxuICAgICAgbGV0IGRlZmF1bHRNZ1ZhbHVlOiBzdHJpbmcgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZpZWxkKCkuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcblxyXG4gICAgICBuZXdEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZmF1bHRNZ1ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRydWUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgLy8gcmFuZ2UgZGF0ZVxyXG4gICAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPSBudWxsKVxyXG4gICAgICAgIG5ld0RhdGUgPSB0aGlzLmZpbGxEYXRlQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCksIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdEYXRlO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BZGQgZm91bmQgaW4gbmV3dmFsdWUgbnVtYmVycygyIG9yIDMgbGV0dGVycykgdG8gYnVmZmVyIGFuZCByZXR1cm5cclxuICAvLy8gbGFzdCBmb3VuZCBudW1iZXIgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJWYWx1ZVwiPmluIG5ld3ZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJidWZmZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj4tIHdoaWNoIHR5cGUgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmUsIGZvciBjaGVja2luZyB2YWxpZGl0eTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBjdXJyVmFsdWUgaW4gbmV3dmFsdWU8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhZGQyRGF0ZShjdXJyVmFsdWU6IG51bWJlciwgYnVmZmVyOiBTdHJpbmdCdWlsZGVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHN0YXJ0OiBudW1iZXIgPSBjdXJyVmFsdWU7XHJcbiAgICBsZXQgY3VyckFkZDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCk7XHJcbiAgICBsZXQgbGV0dGVyczogbnVtYmVyID0gMDtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpXHJcbiAgICB7XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ERDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REREQ6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTUQ6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWTpcclxuICAgICAgICBsZXR0ZXJzID0gMjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19EREQ6XHJcbiAgICAgICAgbGV0dGVycyA9IDM7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVlZWTpcclxuICAgICAgICBsZXR0ZXJzID0gNDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XOlxyXG4gICAgICAgIGxldHRlcnMgPSAxO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lKOiAgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgIGxldHRlcnMgPSAyO1xyXG4gICAgICAgIHR5cGUgPSBQSUNJbnRlcmZhY2UuUElDX1lZOyAvLyBQSUNfWUogd2lsbCBiZSBoYW5kbGVkIGFzIFBJQ19ZWSBpbiB0aGlzIG1ldGhvZC5cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAoc3RhcnQgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlLmNoYXJBdChzdGFydCkpKVxyXG4gICAgICBzdGFydCsrOyAvLyBmaW5kIGZpcnN0IGRpZ2l0XHJcblxyXG5cclxuICAgIGlmIChzdGFydCA9PT0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoICYmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPT09IDAgfHwgdGhpcy5fbmV3dmFsdWUgPT09IFwiMFwiKSkge1xyXG4gICAgICBmb3IgKGxldCBudWw6IG51bWJlciA9IDA7IG51bCA8IGxldHRlcnM7IG51bCA9IG51bCArIDEpIHtcclxuICAgICAgICBidWZmZXIuQXBwZW5kKCcwJykvKicwJyovO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjdXJyVmFsdWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzdGFydCA9PT0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5fbmV3dmFsdWUgKyBcIjBcIjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGxldHRlcnMgJiYgaSA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpKVxyXG4gICAgICAgIGN1cnJBZGQuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3VyckFkZC5MZW5ndGggPT09IDApIHtcclxuICAgICAgY3VyckFkZC5BcHBlbmQoJzAnKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYWRkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgLy8gYm91bmRhcnkgY29uZGl0aW9ucyBjYXNlczpcclxuICAgIGlmICgoYWRkIDwgMSAmJiB0eXBlICE9PSBQSUNJbnRlcmZhY2UuUElDX1lZWVkgJiYgdHlwZSAhPT0gUElDSW50ZXJmYWNlLlBJQ19ZWSkgfHxcclxuICAgICAgIChhZGQgPiAzMSAmJiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ERCB8fCB0eXBlID09PSAgUElDSW50ZXJmYWNlLlBJQ19EREREKSkgfHxcclxuICAgICAgKGFkZCA+IDEyICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKSB8fCAoYWRkID4gNyAmJiB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1cpKSB7XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9EQVRFKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGFuIHBpY3R1cmUgaXMgWVlZWSBhbmQgaW5zZXJ0ZWQgMC0yIG51bWJlcnMsIHVzZSBDRU5UVVJFIHZhbHVlLCBvdGhlcndpc2UgYWRkIHplcm9zIGJlZm9yZSB0aGUgeWVhclxyXG4gICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSAmJiB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpID4gOTk5ICYmIGN1cnJBZGQuTGVuZ3RoIDwgMylcclxuICAgICAgY3VyckFkZCA9IHRoaXMuY2hlY2tDZW50dXJ5KGFkZCk7XHJcblxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGxldHRlcnMgLSBjdXJyQWRkLkxlbmd0aDsgaiA9IGogKyAxKSB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoJzAnKS8qJzAnKi87XHJcbiAgICB9XHJcbiAgICBidWZmZXIuQXBwZW5kKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcbiAgICByZXR1cm4gIGk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+QWRkIGZvdW5kIGluIG5ld3ZhbHVlIGxldHRlcnMgdG8gYnVmZmVyIGFuZCByZXR1cm5cclxuICAvLy8gbGFzdCBmb3VuZCBudW1iZXIgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJWYWx1ZVwiPmluIG5ld3ZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZXR0ZXJzXCI+YW1vdW50IG9mIGxldHRlcnMgdG8gaW5zZXJ0IHRvIGJ1ZmZlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYnVmZmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGN1cnJWYWx1ZSBpbiBuZXd2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGFkZE0yRGF0ZShjdXJyVmFsdWU6IG51bWJlciwgbGV0dGVyczogbnVtYmVyLCBidWZmZXI6IFN0cmluZ0J1aWxkZXIsIHR5cGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgYXJyYXk6IHN0cmluZ1tdO1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NTSB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NRCkge1xyXG4gICAgICBpZiAodGhpcy5oZWJyZXcpIHtcclxuICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxNb250aHMoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgbWVzc2FnZVN0cmluZzogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgIGFycmF5ID0gRGF0ZVV0aWwuZ2V0TG9jYWxNb250aHMobWVzc2FnZVN0cmluZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XV1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVicmV3KSB7XHJcbiAgICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxEb3dzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGRheVN0cjogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLkRBWVNfUFRSKTtcclxuICAgICAgICAgIGFycmF5ID0gRGF0ZVV0aWwuZ2V0TG9jYWxEYXlzKGRheVN0cik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0JCKSB7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGFycmF5ID0gVXRpbERhdGVKcG4uZ2V0QXJyYXlEb3coKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTIgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPCBjdXJyVmFsdWUgKyBsZXR0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoY3VyclZhbHVlLCBsZXR0ZXJzKTtcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0ZXh0KTtcclxuICAgICAgICAgICAgcmV0dXJuIGN1cnJWYWx1ZSArIHRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gY3VyclZhbHVlICsgbGV0dGVycztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoIDwgY3VyclZhbHVlKSB7XHJcbiAgICAgIGN1cnJWYWx1ZSA9IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDtcclxuICAgIH1cclxuICAgIGxldCBtYXg6IG51bWJlciA9IHRoaXMuZ2V0TW9udGhPcldlZWsodGhpcy5fbmV3dmFsdWUuc3Vic3RyKGN1cnJWYWx1ZSksIGxldHRlcnMsIHR5cGUpO1xyXG5cclxuICAgIGlmIChhcnJheVttYXhdLnRyaW0oKS5sZW5ndGggPj0gbGV0dGVycykge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKGFycmF5W21heF0udHJpbSgpLnN1YnN0cigwLCBsZXR0ZXJzKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgYnVmZmVyLkFwcGVuZChhcnJheVttYXhdLnRyaW0oKSk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGxldHRlcnMgLSBhcnJheVttYXhdLnRyaW0oKS5sZW5ndGg7IGkgPiAwOyBpID0gaSAtIDEpIHtcclxuICAgICAgICBidWZmZXIuQXBwZW5kKCcgJykvKicgJyovO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyclZhbHVlICsgbGV0dGVycztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgZW5kIGluZGV4IG9mIGV2ZXJ5IG51bWVyaWMgYmxvY2sgaW4gdGhlIG1hc2sgZnJvbSBtYXNrW2N1cnJWYWx1ZV08L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBlbmQgb2YgbnVtZXJpYyBibG9jayBpbiBuZXdWYWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEVuZE9mTnVtZXJpY0Jsb2NrKGN1cnJWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHdoaWxlIChjdXJyVmFsdWUgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlLmNoYXJBdChjdXJyVmFsdWUpKSkge1xyXG4gICAgICBjdXJyVmFsdWUgPSBjdXJyVmFsdWUgKyAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnJWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5hZGRlZCBzdWZmaXggdG8gcmVsZXZhbnQgbnVtYmVyIG9mIHRoZSBkYXk8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhZGREYXRlU3VmZml4KGxhc3Q6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGhlbnVtYmVyOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGxhc3QpO1xyXG4gICAgaWYgKHRoZW51bWJlciA9PT0gMSB8fCB0aGVudW1iZXIgPT09IDIxIHx8IHRoZW51bWJlciA9PT0gMzEpXHJcbiAgICAgIHJldHVybiBcInN0XCI7XHJcbiAgICBlbHNlIGlmICh0aGVudW1iZXIgPT09IDIgfHwgdGhlbnVtYmVyID09PSAyMilcclxuICAgICAgcmV0dXJuIFwibmRcIjtcclxuICAgIGVsc2UgaWYgKHRoZW51bWJlciA9PT0gMyB8fCB0aGVudW1iZXIgPT09IDIzKVxyXG4gICAgICByZXR1cm4gXCJyZFwiO1xyXG4gICAgcmV0dXJuIFwidGhcIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgc2l6ZSBvZiBibG9jayBsZXR0ZXJzIG9mIHR5cGUgJ3R5cGUnLCB3aGljaCBzdGFydCBhdCAnc3RhcnQnPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0U2l6ZU9mQmxvY2soc3RhcnQ6IG51bWJlciwgdHlwZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXIgPSBzdGFydCArIDE7XHJcbiAgICB3aGlsZSAobGV0dGVycyA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoICYmIHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChsZXR0ZXJzKSA9PT0gdHlwZSlcclxuICAgIGxldHRlcnMrKztcclxuICAgIHJldHVybiBsZXR0ZXJzIC0gc3RhcnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Z2V0IFN0cmluZyBwYXJ0L2Z1bGwgbmFtZSBvZiBtb250aC9kYXkgb2Ygd2Vlazwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb250aFwiPnBhcnQvZnVsbCBuYW1lIG9mIG1vbnRoL2RheSBvZiB3ZWVrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYXhcIj5vZiBwb3NzaWJsZSBsZXR0ZXJzIGluIG1vbnRoL2RheSBvZiB3ZWVrLCBzaXplIG9mIGJsb2NrIGluIHBpY3R1cmUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGU6XCI+UElDXyAgd2Vla3xtb250aDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBudW1iZXIgb2YgbW9udGggMS0xMiwgb3IgZGF5IG9mIHdlZWsgMS03PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TW9udGhPcldlZWsobW9udGhfc3RyOiBzdHJpbmcsIGxldHRlcnM6IG51bWJlciwgdHlwZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogc3RyaW5nW107XHJcblxyXG4gICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKSB7XHJcbiAgICAgIC8vIE1vbnRoXHJcbiAgICAgICAgaWYgKHRoaXMuaGVicmV3KVxyXG4gICAgICAgICAgYXJyYXkgPSBIZWJyZXdEYXRlLkdldExvY2FsTW9udGhzKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBtb250aFN0cjogU3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtb250aFN0ci50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfV1dXIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfVylcclxuICAgICAgLy8gV2Vla1xyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVicmV3KVxyXG4gICAgICAgICAgYXJyYXkgPSBIZWJyZXdEYXRlLkdldExvY2FsRG93cygpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgZGF5U3RyOiBTdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbERheXMoZGF5U3RyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0JCKVxyXG4gICAgICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgIHtcclxuICAgICAgICBhcnJheSA9IFV0aWxEYXRlSnBuLmdldEFycmF5RG93KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgd2VlayBvciBtb250aCBwb3NzaWJsZSAtPiBkaWZmYXVsdCAxLlxyXG4gICAgICB9XHJcblxyXG4gICAgaWYgKGxldHRlcnMgPiBtb250aF9zdHIubGVuZ3RoKVxyXG4gICAgLy8gY3V0IGxldHRlciBpZiBpdCdzICBlbmQgb2Ygc3RyaW5nXHJcbiAgICAgIGxldHRlcnMgPSBtb250aF9zdHIubGVuZ3RoO1xyXG5cclxuICAgIGlmICh0aGlzLmhlYnJldylcclxuICAgIHtcclxuICAgICAgbGV0IGhzdHI6IHN0cmluZyA9IE5TdHJpbmcuVHJpbVN0YXJ0KG1vbnRoX3N0cikuc3Vic3RyKDAsIGxldHRlcnMpLnRyaW0oKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcclxuICAgICAgLy8gc3RhcnQgY2hlY2tpbmcgZnJvbSAxc3QgbWVtYmVyLCBiZWNhdXNlIDAgPSBcIlwiXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoYXJyYXlbaV0udHJpbSgpID09PSBoc3RyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChpID09PSAxNClcclxuICAgICAgICAgICAgaSA9IDY7XHJcbiAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyB0aGUgbnVtYmVyIGluc2VydGVkIGFuZCBub3Qgc3RyaW5nIC0+IGZpbmQgbW91bnRoL2RheSBvZiB3ZWVrIGJ5IG51bWJlciAxLTEyfDEtN1xyXG5cclxuICAgICAgICBsZXQgc3RyOiBzdHJpbmcgPSBtb250aF9zdHIuc3Vic3RyKDAsIGxldHRlcnMpLnRyaW0oKTtcclxuICAgICAgICBsZXQgbnVtQnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltpXSkpXHJcbiAgICAgICAgICAgIG51bUJ1ZmZlci5BcHBlbmQoc3RyW2ldKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGhlTnVtYmVyOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKG51bUJ1ZmZlci5Ub1N0cmluZygpKTtcclxuICAgICAgICBpZiAodGhlTnVtYmVyIDwgMSlcclxuICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NTSB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NRClcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAodGhlTnVtYmVyID4gMTIpXHJcbiAgICAgICAgICAgIHJldHVybiAxMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XV1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgaWYgKHRoZU51bWJlciA+IDcpXHJcbiAgICAgICAgICAgIHJldHVybiA3O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhlTnVtYmVyO1xyXG4gICAgICAgIH1cclxuICAgIGNhdGNoIChleF8yMUEpIHtcclxuICAgICAgICAgIC8vIGRvTm90aGluZ19TdHJpbmdJbnNlcnRlZFxyXG4gICAgICB9XHJcblxyXG4gICAgLy8gaW5zZXJ0ZWQgc3RyaW5nIC0gbmFtZSBvZiBtb250aHxkYXkgb2Ygd2VlayAtPnRyeSBpZGVudHlmeSBpdFxyXG4gICAgbGV0IGZvdW5kOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KGFycmF5Lmxlbmd0aCk7XHJcbiAgICBsZXQgZnJvbTogbnVtYmVyO1xyXG4gICAgbGV0IG1heDogbnVtYmVyID0gLTE7IC8vIG51bWJlciBvZiBmb3VuZCBtb250aC9kYXkgb2Ygd2Vla1xyXG5cclxuXHJcbiAgICBmb3IgKGxldCB0bXA6IG51bWJlciA9IDE7IHRtcCA8IGFycmF5Lmxlbmd0aDsgdG1wKyspXHJcbiAgICAvLyBzdGFydCBjaGVja2luZyBmcm9tIDFzdCBtZW1iZXIsIGJlY2F1c2UgMCA9IFwiXCJcclxuICAgIHtcclxuICAgICAgZm91bmRbdG1wXSA9IDA7XHJcbiAgICAgIGZyb20gPSAwO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXlbdG1wXS5sZW5ndGggJiYgZnJvbSA8IG1vbnRoX3N0ci5sZW5ndGggJiYgaSA8IGxldHRlcnM7IGkrKywgZnJvbSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGFycmF5W3RtcF0udG9Mb3dlckNhc2UoKVtpXSA9PT0gbW9udGhfc3RyLnRvTG93ZXJDYXNlKClbZnJvbV0pXHJcbiAgICAgICAgICBmb3VuZFt0bXBdKys7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmcm9tID09PSBsZXR0ZXJzIHx8IGZyb20gPT09IGFycmF5W3RtcF0ubGVuZ3RoKVxyXG4gICAgICAvLyBhbGwgbGV0dGVycyBmb3VuZFxyXG4gICAgICB7XHJcbiAgICAgICAgbWF4ID0gdG1wO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1heCA9PT0gLTEpXHJcbiAgICAgIG1heCA9IHRoaXMuZmluZE1heChmb3VuZCk7XHJcbiAgICByZXR1cm4gbWF4O1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pcyBudW1lcmljIGRhdGEgYWxsb3dlZCBpbiBkYXRlXHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIGl0IGlzIGFsbG93ZWQsIG90aGVyd2lzZSBmYWxzZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzTnVtYmVyQWxsb3dlZEluRGF0ZSgpOiBib29sZWFuIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5pc0RhdGVQb3NpdGlvbmFsTnVtZXJpY0RpcmVjdGl2ZSh0aGlzLl9waWN0dXJlW2ldKSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5maW5kIGlmIGFsbCBudW1iZXJzIG9mIHRoZSBuZXcgdXNlciBpbnNlcnRlZCB2YWx1ZSBhcmUgMFxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBpZiBhbGwgbnVtYmVycyBpbiB0aGUgaW5wdXQgYXJlIDAsIG90aGVyd2lzZSB0cnVlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNBbGxOdW1iZXJzMCgpOiBib29sZWFuIHtcclxuICAgIGxldCBjdXJyQ2hyOiBzdHJpbmc7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGN1cnJDaHIgPSB0aGlzLl9uZXd2YWx1ZVtpXTtcclxuXHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChjdXJyQ2hyKSAmJiBjdXJyQ2hyICE9PSAnMCcpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIHZhbGlkaXR5IG9mIFllYXIgZm9yIFlZWVkgcGFydCBvZiB0aGUgbWFzazwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5ZWFySW5cIj5pbnNlcnRlZCBieSB1c2VyPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGNhbGN1bGF0ZWQgYnkgZW52aXJvbm1lbnQuY2VudHVyeSByaWdodCB2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrQ2VudHVyeSh5ZWFySW46IG51bWJlcik6IFN0cmluZ0J1aWxkZXIge1xyXG4gICAgbGV0IG91dFZhbDogbnVtYmVyO1xyXG4gICAgbGV0IHN0YXJ0X2NlbnR1cnk6IG51bWJlciA9IHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICBsZXQgY2VudHVyeTogbnVtYmVyID0gTWF0aC5mbG9vcihzdGFydF9jZW50dXJ5IC8gMTAwKTtcclxuICAgIGxldCB5ZWFyczogbnVtYmVyID0gc3RhcnRfY2VudHVyeSAlIDEwMDtcclxuICAgIGlmICh5ZWFySW4gPj0geWVhcnMgJiYgeWVhckluICE9PSAwKVxyXG4gICAgICBvdXRWYWwgPSAoY2VudHVyeSAqIDEwMCArIHllYXJJbik7XHJcbiAgICBlbHNlXHJcbiAgICAgIG91dFZhbCA9ICgoKytjZW50dXJ5KSAqIDEwMCArIHllYXJJbik7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKG91dFZhbC50b1N0cmluZygpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiB0aGUgZGF0ZSBsZWdhbCBmb3IgcGljdHVyZSByYW5nZSwgdXNlZCBmb3IgdmFsaWRhdGlvbiBkYXRlIDA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiQ29udGludW91c1JhbmdlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJEaXNjcmV0ZVJhbmdlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+aW50ZWdlciAtIG1hZ2ljIGRhdGUgbnVtYmVyIG9mIGRheXMgZnJvbSAwMS4wMS4wMDAwPC9wYXJhbT5cclxuICBwcml2YXRlIGlzRGF0ZUxlZ2FsNFJhbmdlKENvbnRpbnVvdXNSYW5nZTogTGlzdDxzdHJpbmc+LCBEaXNjcmV0ZVJhbmdlOiBMaXN0PHN0cmluZz4sIGN1cnJEYXRlOiBudW1iZXIpOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IGRvd25EYXRlOiBudW1iZXI7XHJcbiAgICBsZXQgdG9wRGF0ZTogbnVtYmVyO1xyXG5cclxuICAgIGlmIChDb250aW51b3VzUmFuZ2UgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZS5sZW5ndGggLSAxOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBkb3duRGF0ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbShpKSwgcGljLCBwaWMuZ2V0TWFzaygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICB0b3BEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZV9waWMoQ29udGludW91c1JhbmdlLmdldF9JdGVtKCsraSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID49IGRvd25EYXRlICYmIGN1cnJEYXRlIDw9IHRvcERhdGUpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEaXNjcmV0ZVJhbmdlICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBEaXNjcmV0ZVJhbmdlLmxlbmd0aDsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID09PSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhEaXNjcmV0ZVJhbmdlLmdldF9JdGVtKGkpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpKVxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoZSBkYXRlIGlzIG5vdCBpbiB0aGUgcmFuZ2VcclxuICAgIC8vIHJldHVybiBmYWxzZTtcclxuICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGFuZCBmaWxsIERBVEUgdHlwZSBieSByYW5nZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbGxEYXRlQnlSYW5nZShDb250aW51b3VzUmFuZ2U6IExpc3Q8c3RyaW5nPiwgRGlzY3JldGVSYW5nZTogTGlzdDxzdHJpbmc+LCBidWZmZXI6IERhdGUpOiBEYXRlIHtcclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZG93bkRhdGU6IG51bWJlcjtcclxuICAgIGxldCB0b3BEYXRlOiBudW1iZXI7XHJcblxyXG4gICAgbGV0IGN1cnJEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5mcm9tTmF0aXZlRGF0ZVRvTWdEYXRlTnVtYmVyKGJ1ZmZlciwgcGljLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQoZmFsc2UpO1xyXG4gICAgaWYgKENvbnRpbnVvdXNSYW5nZSAhPSBudWxsKSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBDb250aW51b3VzUmFuZ2UubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgZG93bkRhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhDb250aW51b3VzUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgdG9wRGF0ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbSgrK2kpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgIGlmIChjdXJyRGF0ZSA+PSBkb3duRGF0ZSAmJiBjdXJyRGF0ZSA8PSB0b3BEYXRlKVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGJ1ZmZlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoRGlzY3JldGVSYW5nZSAhPSBudWxsKSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBEaXNjcmV0ZVJhbmdlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID09PSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhEaXNjcmV0ZVJhbmdlLmdldF9JdGVtKGkpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYnVmZmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoZSBkYXRlIGlzIG5vdCBpbiB0aGUgcmFuZ2VcclxuICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiBkYXkgc3VpdGFibGUgKG5vdCBiaWdnZXIgdGhhbiBtYXgpIGZvciBZZWFyIGFuZCBNb250aDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+dXNlciBpbnNlcnRlZCBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzRG95XCI+aXMgcGljdHVyZSBvZiBuZWVkZWQgZGF5IGlzIERERCAtIGRheSBvZiB5ZWFyPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrRGF5KGRhdGU6IHN0cmluZywgaXNEb3k6IGJvb2xlYW4pOiBTdHJpbmdCdWlsZGVyIHtcclxuXHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSB0aGlzLmdldERhdGVFbGVtZW50KGRhdGUsIERhdGVFbGVtZW50LkRBWSk7XHJcbiAgICBpZiAoZGF5IDwgMjkgJiYgIWlzRG95KVxyXG4gICAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoZGF0ZSk7XHJcblxyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuWUVBUik7XHJcblxyXG4gICAgaWYgKCFpc0RveSlcclxuICAgIHtcclxuICAgICAgaWYgKHllYXIudG9TdHJpbmcoKS5sZW5ndGggPCAzKVxyXG4gICAgICAgIHllYXIgPSBOTnVtYmVyLlBhcnNlKHRoaXMuY2hlY2tDZW50dXJ5KHllYXIpLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2Vudmlyb25tZW50LkdldERhdGVNb2RlKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpID09PSAnQicpXHJcbiAgICAgICAgeWVhciAtPSBQSUNJbnRlcmZhY2UuREFURV9CVURESElTVF9HQVA7XHJcblxyXG4gICAgICBsZXQgbW9udGg6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuTU9OVEgpO1xyXG5cclxuICAgICAgLy8gaWYgZGF5IG5vdCBjb25zaXN0YWluZWQgdG8geWVhciAmIG1vbnRoIC0gY2hhbmdlIGRheVxyXG4gICAgICBsZXQgZGF5TWF4OiBudW1iZXIgPSB0aGlzLmdldE1heERheUluTW9udGgoeWVhciwgbW9udGgpO1xyXG4gICAgICBpZiAoZGF5ID4gZGF5TWF4KVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIC8vIGlmIG1vbnRoIG5vdCBjb25zaXN0YWluZWQgdG8gZGF5KERERCkgLSBjaGFuZ2UgbW9udGhcclxuICAgICAgbGV0IG1vbnRoUmVhbDogbnVtYmVyID0gdGhpcy5nZXRNb250aEJ5RGF5KHllYXIsIGRheSk7XHJcblxyXG4gICAgICBpZiAobW9udGhSZWFsIDwgMSB8fCBtb250aFJlYWwgPiAxMilcclxuICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfREFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIGRheSBvZiB3ZWVrIHN1aXRhYmxlIChyaWdodCkgZm9yIFllYXIsIE1vbnRoIGFuZCBEYXk8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGF0ZVwiPnVzZXIgaW5zZXJ0ZWQgc3RyaW5nPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrV2VlayhkYXRlOiBzdHJpbmcpOiBTdHJpbmdCdWlsZGVyIHtcclxuXHJcbiAgICBsZXQgZG93OiBudW1iZXIgPSB0aGlzLmdldERhdGVFbGVtZW50KGRhdGUsIERhdGVFbGVtZW50LkRPVyk7XHJcblxyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXMgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmdldE5ld0RhdGVCcmVha1BhcmFtcygpO1xyXG5cclxuICAgIGxldCBkYXRlTWFnaWM6IG51bWJlciA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGUoZGF0ZSwgdGhpcy5fcGljdHVyZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcblxyXG4gICAgRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kYXRlX2JyZWFrX2RhdGVtb2RlKGJyZWFrUGFyYW1zLCBkYXRlTWFnaWMsIHRydWUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIGxldCBkb3dSZWFsOiBudW1iZXIgPSBicmVha1BhcmFtcy5kb3c7XHJcbiAgICBpZiAoZG93UmVhbCAhPT0gZG93UmVhbClcclxuICAgICAgZGF0ZSA9IHRoaXMuY2hhbmdlRG93KGRhdGUsIGRvd1JlYWwpO1xyXG5cclxuICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihkYXRlKTtcclxuICB9XHJcblxyXG5cclxuICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIHRoZSBjb21iaW5hdGlvbiBvZiBKYXBhbmVzZSBlcmEgYW5kIHllYXIgaXMgdmFsaWQuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0ckRhdGVcIj51c2VyIGluc2VydGVkIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBkYXRlIHN0cmluZyBvZiBwcm9wZXJseSBKYXBhbmVzZSBlcmE8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0pwbkVyYVllYXIoc3RyRGF0ZTogc3RyaW5nKTogU3RyaW5nQnVpbGRlciB7XHJcblxyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXMgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmdldE5ld0RhdGVCcmVha1BhcmFtcygpO1xyXG4gICAgbGV0IGRhdGVNYWdpYzogbnVtYmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZShzdHJEYXRlLCB0aGlzLl9waWN0dXJlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGVNYWdpYywgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcblxyXG4gICAgbGV0IGludFllYXJBRDogbnVtYmVyID0gYnJlYWtQYXJhbXMueWVhcjtcclxuICAgIGxldCBpbnREb3k6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRveTtcclxuXHJcbiAgICAvLyBnZXQgdGhlIG5hbWUgYW5kIGEgeWVhciBvZiB0aGUgZXJhXHJcbiAgICBsZXQgc3RyRXJhQWxwaGE6IHN0cmluZztcclxuICAgIGxldCBzdHJFcmFLYW5qaTogc3RyaW5nO1xyXG5cclxuICAgIHN0ckVyYUFscGhhID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95cl8yX2EoaW50WWVhckFELCBpbnREb3ksIGZhbHNlKTtcclxuICAgIHN0ckVyYUthbmppID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95cl8yX2EoaW50WWVhckFELCBpbnREb3ksIHRydWUpO1xyXG5cclxuICAgIGxldCBzdHJZZWFySnBuRXJhOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBudW06IG51bWJlciA9IFV0aWxEYXRlSnBuLmdldEluc3RhbmNlKCkuZGF0ZV9qcG5feWVhcl9vZnMoaW50WWVhckFELCBpbnREb3kpO1xyXG4gICAgaWYgKG51bSA8PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9EQVRFKTtcclxuICAgIH1cclxuICAgIGlmIChudW0gPD0gOSkge1xyXG4gICAgICBzdHJZZWFySnBuRXJhLkFwcGVuZChcIjBcIik7XHJcbiAgICB9XHJcbiAgICBzdHJZZWFySnBuRXJhLkFwcGVuZChudW0udG9TdHJpbmcoKSk7XHJcblxyXG4gICAgLy8gYnVpbGQgYSBwcm9wZXJseSB5ZWFyIG9mIHRoZSBlcmFcclxuXHJcbiAgICAvLyBBIERCQ1MgY2hhcmFjdGVyIGluIFwic3RyXCIgY29uc3VtZXMgdHdvIGNoYXJhY3RlcnMgaW4gXCJtYXNrXCIuXHJcbiAgICAvLyBJZiBcInN0clwiIGNvbnRhaW5zIERCQ1MsIHRoZSBwb3NpdGlvbiBvZiBcIm1hc2tcIiBoYXMgdG8gc2tpcCBuZXh0IGluZGV4LlxyXG4gICAgLy8gVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBza2lwcGVkIGluZGV4ZXMuXHJcbiAgICBsZXQgaW50UGljSWR4T2ZzOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaW50Q250OiBudW1iZXIgPSAwOyBpbnRDbnQgKyBpbnRQaWNJZHhPZnMgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgaW50Q250KyspXHJcbiAgICB7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGludENudCArIGludFBpY0lkeE9mcykpXHJcbiAgICAgIHtcclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0pZMSk6XHJcbiAgICAgICAgICBzdHJEYXRlID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEMoc3RyRGF0ZSwgc3RyRXJhQWxwaGEsIGludENudCArIDEsIDEpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSlkyKTpcclxuICAgICAgICAgIHN0ckRhdGUgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQyhzdHJEYXRlLCBzdHJFcmFLYW5qaSwgaW50Q250ICsgMSwgMSk7XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMrKzsgLy8gUElDX0pZMiBjb25zdW1lcyAyIGNoYXJhY3RlcnMgb2YgcGljdHVyZSAoMSBtb3JlIHRoYW4gc3RyRGF0ZSlcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0pZNCk6XHJcbiAgICAgICAgICBzdHJEYXRlID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEMoc3RyRGF0ZSwgc3RyRXJhS2FuamksIGludENudCArIDEsIDIpO1xyXG4gICAgICAgICAgaW50Q250Kys7IC8vIFBJQ19KWTQgY29uc3VtZXMgMiBjaGFyYWN0ZXJzIG9mIHN0ckRhdGVcclxuICAgICAgICAgIGludFBpY0lkeE9mcyArPSAyOyAvLyBQSUNfSlk0IGNvbnN1bWVzIDQgY2hhcmFjdGVycyBvZiBwaWN0dXJlICgyIG1vcmUgdGhhbiBzdHJEYXRlKVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfWUopOlxyXG4gICAgICAgICAgc3RyRGF0ZSA9IFV0aWxTdHJCeXRlTW9kZS5yZXBDKHN0ckRhdGUsIHN0clllYXJKcG5FcmEudG9TdHJpbmcoKSwgaW50Q250ICsgMSwgMik7XHJcbiAgICAgICAgICBpbnRDbnQrKzsgLy8gUElDX1lKIGNvbnN1bWVzIDIgY2hhcmFjdGVycyBvZiBzdHJEYXRlXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChpbnRDbnQgPCBzdHJEYXRlLmxlbmd0aClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy8gaWYgXCJzdHJEYXRlXCIgY29udGFpbnMgREJDUywgdGhlIG5leHQgaW5kZXggb2YgXCJwaWN0dXJlXCIgaGFzIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoc3RyRGF0ZVtpbnRDbnRdKSA9PT0gZmFsc2UgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHRoaXMuX3BpY3R1cmVbaW50Q250ICsgaW50UGljSWR4T2ZzXSkgPT09IHRydWUpXHJcbiAgICAgICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihzdHJEYXRlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgbWF4IG51bWJlciBvZiBkYXkgaW4gbW9udGg8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwieWVhclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW9udGhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbWF4IGRheXMgWzI4LTMxXSBudW1iZXI8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRNYXhEYXlJbk1vbnRoKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgYXJyYXk6IG51bWJlcltdID0gW1xyXG4gICAgICAwLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXHJcbiAgICBdO1xyXG4gICAgbGV0IGxlYXB5ZWFyOiBib29sZWFuID0geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XHJcblxyXG4gICAgaWYgKGxlYXB5ZWFyICYmIG1vbnRoID09PSAyKVxyXG4gICAgICByZXR1cm4gYXJyYXlbbW9udGhdICsgMTtcclxuXHJcbiAgICAgcmV0dXJuIGFycmF5W21vbnRoXTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgbW9udGggZm9yIGRheSwgdGhhbiBkYXkgaGF2ZSBtYXNrIERERDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5ZWFyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXlcIj5bMC0zNjVdPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG51bWJlciBvZiBtb250aDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldE1vbnRoQnlEYXkoeWVhcjogbnVtYmVyLCBkYXk6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IExlYXBZZWFyOiBib29sZWFuO1xyXG5cclxuICAgIExlYXBZZWFyID0gKHllYXIgJSA0ID09PSAwKSAmJiAoKHllYXIgJSAxMDAgIT09IDApIHx8ICh5ZWFyICUgNDAwID09PSAwKSk7XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWIubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICghTGVhcFllYXIpXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYltpXSA+PSBkYXkpXHJcbiAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgICAvLyBpcyBMZWFwIFllYXJcclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGkgPCAzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChQSUNJbnRlcmZhY2UuZGF0ZV9kYXlfdGFiW2ldID49IGRheSlcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGFkZCAxIGRheSBhZnRlciBzZWNvbmQgbW9udGhcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbaV0gKyAxID49IGRheSlcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IC8vIGZvciBsb29wXHJcbiAgICByZXR1cm4gaTsgLy8gdGhlIGZ1bmN0aW9uIGNhbm4ndCBjYW1lIHRvIHRoZSBzdGF0ZW1lbnQgYW55dGltZVxyXG4gIH1cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5nZXQgWWVhcnxNb250aHxEYXl8RG93IG9mIGRhdGVcclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+ZGF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZWxlbWVudFwiPnJlcXVpcmVkIGRhdGUgZWxlbWVudCAoeWVhci9tb250aC9kYXkvZG93KSA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5ZZWFyfE1vbnRofERheXxEb3cgb2YgZGF0ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldERhdGVFbGVtZW50KGRhdGU6IHN0cmluZywgZWxlbWVudDogRGF0ZUVsZW1lbnQpOiBudW1iZXIge1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGV4aXRMb29wOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcGljV2Vla1R5cGU6IG51bWJlciA9IFBJQ0ludGVyZmFjZS5QSUNfV1dXOyAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICBsZXQgaXNKcG5FcmFZZWFyOiBib29sZWFuID0gZmFsc2U7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgIGxldCBlcmFfeWVhcjogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBBIERCQ1MgY2hhcmFjdGVyIGluIFwiZGF0ZVwiIGNvbnN1bWVzIHR3byBjaGFyYWN0ZXJzIGluIFwicGljdHVyZVwiLlxyXG4gICAgLy8gSWYgXCJkYXRlXCIgY29udGFpbnMgREJDUywgdGhlIHBvc2l0aW9uIG9mIFwicGljdHVyZVwiIGhhcyB0byBza2lwIG5leHQgaW5kZXguXHJcbiAgICAvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNraXBwZWQgaW5kZXhlcy5cclxuICAgIGxldCBpbnRQaWNJZHhPZnM6IG51bWJlciA9IDA7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuXHJcbiAgICBsZXQgbWluTGVuOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpXHJcbiAgICAgIG1pbkxlbiA9IFV0aWxTdHJCeXRlTW9kZS5nZXRNaW5MZW5QaWN0dXJlKGRhdGUsIHRoaXMuX3BpY3R1cmUpO1xyXG4gICAgZWxzZVxyXG4gICAgICBtaW5MZW4gPSBNYXRoLm1pbihkYXRlLmxlbmd0aCwgdGhpcy5fcGljdHVyZS5sZW5ndGgpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgKyBpbnRQaWNJZHhPZnMgPCBtaW5MZW4gJiYgIWV4aXRMb29wOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLmlzRGF0YVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZVtpICsgaW50UGljSWR4T2ZzXSkpXHJcbiAgICAgIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChpICsgaW50UGljSWR4T2ZzKSlcclxuICAgICAgICB7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ERDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5EQVkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19EREQ6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuREFZKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCAzKTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkgKz0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfRERERDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5EQVkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpOyAvLyBub3QgKzQgbmVlZCBub3Qgc3VmZml4IG9mICduZCcsICdyZCcsICdzdCdcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSAzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTUQ6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuTU9OVEgpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NTTpcclxuICAgICAgICAgIC8vIGdldCBzaXplIG9mIFBJQ19NTU0gYmxvY2tcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfTU1NKTtcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5NT05USClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgbGV0dGVycyk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpICs9IGxldHRlcnMgLSAxO1xyXG4gICAgICAgICAgbGV0dGVycyA9IDA7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lZOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LllFQVIpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lZWVk6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUilcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgNCk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkgKz0gMztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVzpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ET1cpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDEpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1dXVzpcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfV1dXKTtcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ET1cpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIGxldHRlcnMpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSBsZXR0ZXJzIC0gMTtcclxuICAgICAgICAgIGxldHRlcnMgPSAwO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IWVlZWVk6XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hMOlxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IREQ6XHJcbiAgICAgICAgICAvLyBub3QgaW1wbGVtZW50ZWQgZm9yIGhlYnJldyB5ZXRcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfQkI6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRTaXplT2ZCbG9jayhpICsgaW50UGljSWR4T2ZzLCBQSUNJbnRlcmZhY2UuUElDX0JCKTtcclxuXHJcbiAgICAgICAgICBpZiAoaSArIE1hdGguZmxvb3IobGV0dGVycyAvIDIpIDwgZGF0ZS5sZW5ndGgpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIE1hdGguZmxvb3IobGV0dGVycyAvIDIpKTtcclxuICAgICAgICAgICAgLy8gaWYgZGF0ZSBjb250YWlucyBEQkNTLCBzb21lIGluZGV4ZXMgb2YgcGljdHVyZSBoYXZlIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgICAgIGludFBpY0lkeE9mcyArPSBsZXR0ZXJzIC0gYnVmZmVyLmxlbmd0aDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuRE9XKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIHBpY1dlZWtUeXBlID0gUElDSW50ZXJmYWNlLlBJQ19CQjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpICs9IGxldHRlcnMgLSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTE6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpc0pwbkVyYVllYXIgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTI6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpc0pwbkVyYVllYXIgPSB0cnVlO1xyXG4gICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZNDogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlzSnBuRXJhWWVhciA9IHRydWU7XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMgKz0gMjtcclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWUo6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUilcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gLy8gc3dpdGNoIG9mIHBvc2l0aW9uYWwgZGlyZWN0aXZlc1xyXG4gICAgICAgIH0gLy8gaWYgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmVzXHJcbiAgICB9IC8vIGZvciBsb29wIGluIHBpY3R1cmVcclxuXHJcbiAgICBpZiAoYnVmZmVyID09IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSKVxyXG4gICAgICAgIHJldHVybiBEYXRlVGltZS5Ob3cuWWVhcjtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1ZmZlciA9IGJ1ZmZlci50cmltKCk7XHJcblxyXG4gICAgaWYgKGxldHRlcnMgPiAwKVxyXG4gICAgLy8gaXQncyBQSUNfV1dXIG9yIFBJQ19NTU1cclxuICAgIHtcclxuICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50Lk1PTlRIKVxyXG4gICAgICAgIGxldHRlcnMgPSB0aGlzLmdldE1vbnRoT3JXZWVrKGJ1ZmZlci50b1N0cmluZygpLCBsZXR0ZXJzLCBQSUNJbnRlcmZhY2UuUElDX01NTSk7XHJcbiAgICAgIGVsc2UgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRPVylcclxuICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRNb250aE9yV2VlayhidWZmZXIudG9TdHJpbmcoKSwgbGV0dGVycywgcGljV2Vla1R5cGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICB3aGlsZSAoYnVmZmVyLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIjBcIikgfHwgYnVmZmVyLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIiBcIikpXHJcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnRvU3RyaW5nKCkuc3Vic3RyKDEpO1xyXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMClcclxuICAgICAgICBsZXR0ZXJzID0gMDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGxldHRlcnMgPSBOTnVtYmVyLlBhcnNlKGJ1ZmZlci50b1N0cmluZygpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUiAmJiBpc0pwbkVyYVllYXIpXHJcbiAgICB7XHJcbiAgICAgIC8vIGdldCB0aGUgc3RhcnQgeWVhciBvZiB0aGUgZXJhXHJcbiAgICAgIGVyYV95ZWFyID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5nZXRTdGFydFllYXJPZkVyYShkYXRlLCB0aGlzLl9waWN0dXJlKTtcclxuICAgICAgaWYgKGVyYV95ZWFyID09PSAwKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICBsZXR0ZXJzICs9IGVyYV95ZWFyIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbGV0dGVycztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGFuZ2UgZGF5IG51bWJlciBpbiBkYXRlIGZpZWxkIHRvIGRheU1heDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+dG8gY2hhbmdlIGRheSBpbnRvPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXlNYXhcIj50aGUgbmV3IGRheSB2YWx1ZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjaGFuZ2VEb3coZGF0ZTogc3RyaW5nLCBkb3c6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgaXNEYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbGV0dGVyczogbnVtYmVyO1xyXG4gICAgbGV0IHN0YXJ0UGFydDogc3RyaW5nO1xyXG4gICAgbGV0IGZpbmlzaFBhcnQ6IHN0cmluZztcclxuICAgIGxldCBudW1iZXIxOiBzdHJpbmc7XHJcblxyXG4gICAgbnVtYmVyMSA9IFwiXCIgKyBkb3c7IC8vIFwiIFwiXHJcblxyXG4gICAgLy8gQSBEQkNTIGNoYXJhY3RlciBpbiBcImRhdGVcIiBjb25zdW1lcyB0d28gY2hhcmFjdGVycyBpbiBcInBpY3R1cmVcIi5cclxuICAgIC8vIElmIFwiZGF0ZVwiIGNvbnRhaW5zIERCQ1MsIHRoZSBwb3NpdGlvbiBvZiBcInBpY3R1cmVcIiBoYXMgdG8gc2tpcCBuZXh0IGluZGV4LlxyXG4gICAgLy8gVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBza2lwcGVkIGluZGV4ZXMuIChKUE46IERCQ1Mgc3VwcG9ydClcclxuICAgIGxldCBpbnRQaWNJZHhPZnM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSArIGludFBpY0lkeE9mcyA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoICYmICFpc0RhdGU7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKHRoaXMuaXNEYXRhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSlcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpKVxyXG4gICAgICAgIHtcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1c6XHJcbiAgICAgICAgICBzdGFydFBhcnQgPSBkYXRlLnN1YnN0cigwLCBpKTtcclxuICAgICAgICAgIGZpbmlzaFBhcnQgPSBkYXRlLnN1YnN0cihpICsgMSk7XHJcbiAgICAgICAgICBkYXRlID0gc3RhcnRQYXJ0ICsgbnVtYmVyMSArIGZpbmlzaFBhcnQ7XHJcbiAgICAgICAgICBpc0RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XV1c6XHJcbiAgICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRTaXplT2ZCbG9jayhpICsgaW50UGljSWR4T2ZzLCBQSUNJbnRlcmZhY2UuUElDX1dXVyk7XHJcbiAgICAgICAgICBzdGFydFBhcnQgPSBkYXRlLnN1YnN0cigwLCBpKTtcclxuICAgICAgICAgIGZpbmlzaFBhcnQgPSBkYXRlLnN1YnN0cihpICsgbGV0dGVycyk7XHJcbiAgICAgICAgICBsZXQgZGF5U3RyOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgbGV0IGRheU5hbWVzOiBzdHJpbmdbXSA9IERhdGVVdGlsLmdldExvY2FsRGF5cyhkYXlTdHIpO1xyXG4gICAgICAgICAgbnVtYmVyMSA9IGRheU5hbWVzW2Rvd107XHJcblxyXG4gICAgICAgICAgaWYgKG51bWJlcjEubGVuZ3RoID4gbGV0dGVycylcclxuICAgICAgICAgICAgbnVtYmVyMSA9IG51bWJlcjEuc3Vic3RyKDAsIGxldHRlcnMpO1xyXG4gICAgICAgICAgZWxzZSBpZiAobnVtYmVyMS5sZW5ndGggPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICB3aGlsZSAobnVtYmVyMS5sZW5ndGggPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICAgIG51bWJlcjEgPSBudW1iZXIxICsgJyAnO1xyXG4gICAgICAgICAgZGF0ZSA9IHN0YXJ0UGFydCArIG51bWJlcjEgKyBmaW5pc2hQYXJ0O1xyXG4gICAgICAgICAgaXNEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfQkI6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRTaXplT2ZCbG9jayhpICsgaW50UGljSWR4T2ZzLCBQSUNJbnRlcmZhY2UuUElDX0JCKTtcclxuICAgICAgICAgIC8vIFwibGV0dGVyc1wiIG1lYW5zIGEgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gXCJwaWN0dXJlXCJcclxuXHJcbiAgICAgICAgICBzdGFydFBhcnQgPSBkYXRlLnN1YnN0cigwLCBpKTtcclxuICAgICAgICAgIGZpbmlzaFBhcnQgPSBkYXRlLnN1YnN0cihpICsgTWF0aC5mbG9vcihsZXR0ZXJzIC8gMikpO1xyXG4gICAgICAgICAgLy8gXCJsZXR0ZXJzIC8gMlwiIG1lYW5zIGEgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gXCJkYXRlXCJcclxuXHJcbiAgICAgICAgICBudW1iZXIxID0gVXRpbERhdGVKcG4uZ2V0U3RyRG93KGRvdyk7XHJcblxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKG51bWJlcjEpID4gbGV0dGVycylcclxuICAgICAgICAgICAgbnVtYmVyMSA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihudW1iZXIxLCBsZXR0ZXJzKTtcclxuICAgICAgICAgIGVsc2UgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKG51bWJlcjEpIDwgbGV0dGVycylcclxuICAgICAgICAgICAgd2hpbGUgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKG51bWJlcjEpIDwgbGV0dGVycylcclxuICAgICAgICAgICAgICBudW1iZXIxID0gbnVtYmVyMSArICcgJztcclxuICAgICAgICAgIGRhdGUgPSBzdGFydFBhcnQgKyBudW1iZXIxICsgZmluaXNoUGFydDtcclxuICAgICAgICAgIGlzRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpKVxyXG4gICAgICAgICAgLy8gSlBOOiBEQkNTIHN1cHBvcnRcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGkgPCBkYXRlLmxlbmd0aClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC8vIGlmIFwiZGF0ZVwiIGNvbnRhaW5zIERCQ1MsIHRoZSBuZXh0IGluZGV4IG9mIFwicGljdHVyZVwiIGhhcyB0byBiZSBza2lwcGVkLlxyXG4gICAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoZGF0ZVtpXSkgPT09IGZhbHNlICYmIFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aCh0aGlzLl9waWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgICAgIGludFBpY0lkeE9mcysrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfSAvLyBzd2l0Y2hcclxuICAgICAgICB9IC8vIGlmIG9mIHBvc2l0aW9uYWwgZGlyZWN0aXZlc1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgJiB2YWxpZGF0ZSBUaW1lIGZpZWxkIGJ5IGhpcyBvbGQvbmV3IHZhbHVlIGFuZCAyIHBpY3R1cmVzOlxyXG4gIC8vLyBSZWFsIGFuZCBFbmFibGVcclxuICAvLy8gMS5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHBpY3R1cmVzLCBvdGhlcndpc2UgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDIuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCByYW5nZVxyXG4gIC8vLyAyLjEgY29tcGxldGUgdmFsdWUsIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBTdHJpbmcgLSBuZXcgdmFsdWUgb2YgdmFsaWRhdGVkIGZpZWxkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tUaW1lRmllbGQoKTogRGF0ZSB7XHJcbiAgICBsZXQgbmV3VGltZTogRGF0ZSA9IG5ldyBEYXRlICh0aGlzLl9uZXd2YWx1ZSk7XHJcblxyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuaXNEYXRlWmVybyh0aGlzLl9uZXd2YWx1ZSkpIHtcclxuICAgICAgLy8gZ2V0IGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZpZWxkXHJcbiAgICAgIGxldCBkZWZhdWx0TWdWYWx1ZTogc3RyaW5nID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGaWVsZCgpLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICBuZXdUaW1lID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZmF1bHRNZ1ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRydWUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgLy8gcmFuZ2Ugb2YgdGhlIHRpbWVcclxuICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT0gbnVsbClcclxuICAgICAgICBuZXdUaW1lID0gdGhpcy5maWxsVGltZUJ5UmFuZ2UodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpLCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpLCB0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3VGltZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BZGQgZm91bmQgaW4gbmV3dmFsdWUgbnVtYmVycygyKG9yIDEpIGxldHRlcnMpIHRvIGJ1ZmZlciBhbmQgcmV0dXJuXHJcbiAgLy8vIGxhc3QgZm91bmQgbnVtYmVyIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyVmFsdWVcIj5pbiBuZXd2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYnVmZmVyXCI+Ly8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPndoaWNoIHR5cGUgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmUsIGZvciBjaGVja2luZyB2YWxpZGl0eTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBjdXJyVmFsdWUgaW4gbmV3dmFsdWU8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhZGQyVGltZShjdXJyVmFsdWU6IG51bWJlciwgYnVmZmVyOiBTdHJpbmdCdWlsZGVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHN0YXJ0OiBudW1iZXIgPSBjdXJyVmFsdWU7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IFNUUl8wMDogU3RyaW5nID0gXCIwMFwiO1xyXG4gICAgbGV0ICBjdXJyQWRkOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICB3aGlsZSAoc3RhcnQgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW3N0YXJ0XSkpXHJcbiAgICB7XHJcbiAgICAgIHN0YXJ0Kys7IC8vIGZpbmQgZmlyc3QgZGlnaXRcclxuICAgICAgLy8gbm9uLWRpZ2l0cyB3ZXJlIGZvdW5kIGluIGlucHV0IHN0cmluZ1xyXG4gICAgICAvLyB3ZSBkbyBub3QgdGhyb3cgU1RSX0VSUl9USU1FIGV4Y2VwdGlvbiB0byBwcmV2ZW50IGlucHV0IGRpZ2l0cyBsb3N0XHJcbiAgICAgIC8vIG9uIG5vbi1kaWdpdHMgcGxhY2UgU1RSXzAwIHdpbGwgYmUgYWRkZWRcclxuICAgICAgLy8gU2luY2UgTWFzayBFZGl0aW5nIC4gVGhpcyBlcnJvciBpcyBpcnJlbGV2YW50LiBUaW1lIG5vdywgYWx3YXlzIGNvbnRhaW5zIG5vbiBkaWdpdHMgbGlrZSA6IGFuZCBtaWdodCBjb250YWluICcgJyBmb3IgdW5maWxsZWQgY2hhcnMuXHJcbiAgICAgIC8vIFRoaXMgaXMgYSB2YWxpZCBjYXNlIGFuZCB3ZSBkbyBub3Qgd2FudCBhbiBlcnJvciBwb3BwaW5nIGFib3V0IGl0LlxyXG4gICAgICAvLyAgZ3VpTWFuYWdlci53cml0ZVRvTWVzc2FnZVBhbmUodmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLCBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldE1lc3NhZ2VTdHJpbmcoU1RSX0VSUl9USU1FKSwgU3RhdHVzQmFyTWVzc2FnZVR5cGUuU0JfUlVOVElNRV9NU0cpO1xyXG4gICAgICAvLyAgc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhcnQgPT09IHRoaXMuX25ld3ZhbHVlLmxlbmd0aClcclxuICAgIC8vIG5vdCBmb3VuZCBtb3JlIGRpZ2l0c1xyXG4gICAge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKFNUUl8wMC50b1N0cmluZygpKTtcclxuICAgICAgcmV0dXJuIGN1cnJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgMiAmJiBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZVtpXSkpXHJcbiAgICAgICAgY3VyckFkZC5BcHBlbmQodGhpcy5fbmV3dmFsdWVbaV0pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBjdXJyQWRkLkluc2VydCgwLCAnMCcpOyAvLyBvbmx5IDEgZGlnaXQgZm91bmRcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgaSA9PT0gc3RhcnQgKyAxKVxyXG4gICAgICBjdXJyQWRkLkluc2VydCgwLCAnMCcpO1xyXG4gICAgLy8gb25seSAxIGRpZ2l0IGZvdW5kXHJcbiAgICBlbHNlIGlmIChpID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgaSA9PT0gc3RhcnQpXHJcbiAgICAgIGN1cnJBZGQuQXBwZW5kKFNUUl8wMC50b1N0cmluZygpKTtcclxuXHJcbiAgICBsZXQgYWRkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgLyppZiAoYWRkIDwgMClcclxuICAgIGN1cnJBZGQ9bmV3IFN0cmluZ0J1ZmZlcihcIjAwXCIpO1xyXG4gICAgZWxzZSBpZiAoYWRkID4gNTkgJiYgdHlwZT09UElDX01NVClcclxuICAgIGN1cnJBZGQ9bmV3IFN0cmluZ0J1ZmZlcihcIjU5XCIpO1xyXG4gICAgZWxzZSBpZiAoYWRkID4gNTkgJiYgdHlwZT09UElDX1NTKVxyXG4gICAgY3VyckFkZD1uZXcgU3RyaW5nQnVmZmVyKFwiNTlcIik7Ki9cclxuICAgIGlmIChhZGQgPCAwIHx8IChhZGQgPiA1OSAmJiB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NVCkgfHwgKGFkZCA+IDU5ICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfU1MpKVxyXG4gICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfVElNRSk7XHJcbiAgICBlbHNlIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0hIKVxyXG4gICAge1xyXG4gICAgICBsZXQgUE06IGJvb2xlYW4gPSB0aGlzLmdldElzUE0oKTtcclxuICAgICAgbGV0IG5ld1N0cjogU3RyaW5nID0gbnVsbDtcclxuICAgICAgbGV0IGRpZjogbnVtYmVyO1xyXG5cclxuICAgICAgaWYgKChhZGQgPj0gMTIgfHwgYWRkID09PSAwKSAmJiBQTSlcclxuICAgICAge1xyXG4gICAgICAgIGxldCBhZGRUbXA6IG51bWJlciA9IGFkZCAlIDI0O1xyXG5cclxuICAgICAgICB0aGlzLl9pc1BtID0gKGFkZFRtcCA+PSAxMiAmJiBhZGRUbXAgPCAyNCk7XHJcblxyXG4gICAgICAgIGlmIChhZGRUbXAgPiAxMilcclxuICAgICAgICAgIGRpZiA9IGFkZFRtcCAtIDEyO1xyXG4gICAgICAgIGVsc2UgaWYgKGFkZFRtcCA9PT0gMClcclxuICAgICAgICAgIGRpZiA9IDEyO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGRpZiA9IGFkZFRtcDtcclxuXHJcbiAgICAgICAgbmV3U3RyID0gKChkaWYgPiA5ID8gXCJcIiA6IFwiMFwiKSArIGRpZik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoYWRkID4gOTkgJiYgIVBNKVxyXG4gICAgICAgIG5ld1N0ciA9IFwiOTlcIjtcclxuXHJcbiAgICAgIGlmIChuZXdTdHIgIT0gbnVsbClcclxuICAgICAge1xyXG4gICAgICAgIGN1cnJBZGQuUmVtb3ZlKDAsIGN1cnJBZGQuTGVuZ3RoKTtcclxuICAgICAgICBjdXJyQWRkLkFwcGVuZChuZXdTdHIudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBidWZmZXIuQXBwZW5kKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcbiAgICByZXR1cm4gaTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BcHBlbmQgUE0gb3IgQU0gdG8gdGltZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZFBNMlRpbWUoY3VyclZhbHVlOiBudW1iZXIsIGJ1ZmZlcjogU3RyaW5nQnVpbGRlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG5cclxuICAgIGlmICgoaSA9IHRoaXMuX25ld3ZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIkFNXCIsIGN1cnJWYWx1ZSkpICE9PSAtMSlcclxuICAgIHtcclxuICAgICAgYnVmZmVyLkFwcGVuZChcImFtXCIpO1xyXG4gICAgICByZXR1cm4gaSArIDI7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIGlmICgoaSA9IHRoaXMuX25ld3ZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIlBNXCIsIGN1cnJWYWx1ZSkpICE9PSAtMSlcclxuICAgICAge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJwbVwiKTtcclxuICAgICAgICByZXR1cm4gaSArIDI7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5faXNQbSlcclxuICAgICAge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJwbVwiKTtcclxuICAgICAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBidWZmZXIuQXBwZW5kKFwiYW1cIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrIGlmIHdoZXJlIGlzICdQTScgcG9zaXRpb25hbCBkaXJlY3RpdmUgaW4gdGhlIFRpbWUgUGljdHVyZTwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgLSB0aGVyZSBpcyBQTSwgZWxzZSBmYWxzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldElzUE0oKTogYm9vbGVhbiB7XHJcblxyXG4gICAgZm9yIChsZXQgY3VycjogbnVtYmVyID0gMDsgY3VyciA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBjdXJyKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoY3VycikgPT09IFBJQ0ludGVyZmFjZS5QSUNfUE0pXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWxsVGltZUJ5UmFuZ2UoQ29udGludW91c1JhbmdlOiBMaXN0PHN0cmluZz4sIERpc2NyZXRlUmFuZ2U6IExpc3Q8c3RyaW5nPiwgYnVmZmVyOiBEYXRlKTogRGF0ZSB7XHJcbiAgICBsZXQgIHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgbGV0ICBjdXJyVGltZTogbnVtYmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5mcm9tTmF0aXZlVGltZVRvTWdUaW1lTnVtYmVyKGJ1ZmZlciwgcGljKTtcclxuICAgIGxldCBkb3duVGltZTogbnVtYmVyLCB0b3BUaW1lOiBudW1iZXI7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICBpZiAoQ29udGludW91c1JhbmdlICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBDb250aW51b3VzUmFuZ2UubGVuZ3RoIC0gMTsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgZG93blRpbWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl90aW1lKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbShpKSwgcGljLCBmYWxzZSk7XHJcbiAgICAgICAgdG9wVGltZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX3RpbWUoQ29udGludW91c1JhbmdlLmdldF9JdGVtKCsraSksIHBpYywgZmFsc2UpO1xyXG4gICAgICAgIGlmIChjdXJyVGltZSA+PSBkb3duVGltZSAmJiBjdXJyVGltZSA8PSB0b3BUaW1lKVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGJ1ZmZlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoRGlzY3JldGVSYW5nZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgRGlzY3JldGVSYW5nZS5sZW5ndGg7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGlmIChjdXJyVGltZSA9PT0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfdGltZShEaXNjcmV0ZVJhbmdlLmdldF9JdGVtKGkpLCBwaWMsIGZhbHNlKSlcclxuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShidWZmZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyB0aGUgdGltZSBpcyBub3QgaW4gdGhlIHJhbmdlXHJcbiAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8vIFNFUlZJQ0UgZnVuY3Rpb25zXHJcbiAgLy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcHJpbnQgRVJST1IgcHJvbXB0IG1lc3NhZ2UgYWJvdXQgcmFuZ2UgdG8gc3RhdHVzIGJhcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dJZFwiPm9mIGVycm9yIE1lc3NhZ2U8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNldFZhbGlkYXRpb25GYWlsZFwiPnZhbGlkYXRpb24gZmFpbGVkPC9wYXJhbT5cclxuICBwcml2YXRlIHByaW50TWVzc2FnZShtc2dJZDogc3RyaW5nLCBzZXRWYWxpZGF0aW9uRmFpbGQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBtZXNzYWdlOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoXCJcIik7XHJcbiAgICBsZXQgY3RybFR5cGU6IE1nQ29udHJvbFR5cGU7XHJcblxyXG4gICAgaWYgKG1zZ0lkID09PSBNc2dJbnRlcmZhY2UuRURUX0VSUl9TVFJfMSlcclxuICAgIHtcclxuICAgICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgICBsZXQgdG9rZW46IHN0cmluZyA9IFwiJWRcIjtcclxuICAgICAgbGV0IG1lc3NhZ2VTdHJpbmc6IHN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKG1zZ0lkKTtcclxuICAgICAgbWVzc2FnZVN0cmluZyA9IFN0clV0aWwucmVwbGFjZVN0cmluZ1Rva2VucyhtZXNzYWdlU3RyaW5nLCB0b2tlbiwgMSwgcGljLmdldFdob2xlcygpLnRvU3RyaW5nKCkpO1xyXG4gICAgICBtZXNzYWdlU3RyaW5nID0gU3RyVXRpbC5yZXBsYWNlU3RyaW5nVG9rZW5zKG1lc3NhZ2VTdHJpbmcsIHRva2VuLCAxLCBwaWMuZ2V0RGVjKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKG1lc3NhZ2VTdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhtc2dJZCkpO1xyXG4gICAgICBpZiAobXNnSWQgPT09IE1zZ0ludGVyZmFjZS5TVFJfUk5HX1RYVCAmJiB0aGlzLl92YWxEZXQuZ2V0UmFuZ2UoKSAhPSBudWxsKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vucyh0aGlzLl92YWxEZXQuZ2V0UmFuZ2UoKSwgSFRNTF8yX1NUUikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGN0cmxUeXBlID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5UeXBlO1xyXG4gICAgICBpZiAoY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiAmJiBjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gJiYgIXRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuaXNTZWxlY3Rpb25DdHJsKCkpXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgbXNnU3RyaW5nOiBzdHJpbmcgPSBtZXNzYWdlLlRvU3RyaW5nKCk7XHJcbiAgICAgICAgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLldyaXRlVG9NZXNzYWdlUGFuZShTdHJVdGlsLm1ha2VQcmludGFibGUyKG1zZ1N0cmluZyksIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLkVycm9yT2NjdXJlZCA9ICFOU3RyaW5nLklzTnVsbE9yRW1wdHkobXNnU3RyaW5nKTtcclxuICAgICAgICB0aGlzLl92YWxEZXQuRXJyb3JNZXNzYWdlID0gbWVzc2FnZS5Ub1N0cmluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoc2V0VmFsaWRhdGlvbkZhaWxkKVxyXG4gICAgLy8gZnJvbSB0aGlzIHBvaW50IHRoZSBmb2N1cyBzZW5kIGJhY2sgdG8gY29udHJvbCBhbmQgc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKSBjYW4gbm90IHNldCBpdCB0byB0cnVlXHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5DaGFuZ2UgaW5zaWRlICduZXd2YWx1ZScgc3Vic3RyaW5nIG9uIHBvc2l0aW9uICdpbmRleCcgdG8gc3RyaW5nICd0byc8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3dmFsdWVcIj50byBjaGFuZ2UgaW5zaWRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0b1wiPnN0cmluZyB0byBjaGFuZ2UgYnkgaGltPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbmRleFwiPnRoZSBzdWJzdHJpbmcgdG8gY2hhbmdlIG9uIHRoZSBwb3NpdGlvbjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjaGFuZ2VTdHJpbmdJbnNpZGUodG86IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoMCwgaW5kZXgpICsgdG8gKyAgdGhpcy5fbmV3dmFsdWUuc3Vic3RyKGluZGV4ICsgdG8ubGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCh2YWxpZGF0aW9uRGV0YWlsczogVmFsaWRhdGlvbkRldGFpbHMpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ZhbERldCA9IHZhbGlkYXRpb25EZXRhaWxzO1xyXG4gICAgdGhpcy5fdmFsRGV0LnNldE51bGwoZmFsc2UpO1xyXG4gICAgdGhpcy5faXNQbSA9IGZhbHNlO1xyXG4gICAgbGV0IHBJQzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgdGhpcy5fb2xkdmFsdWUgPSB0aGlzLl92YWxEZXQuZ2V0T2xkVmFsdWUoKTtcclxuICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5fdmFsRGV0LmdldERpc3BWYWx1ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLl9uZXd2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICBpZiAocElDID09IG51bGwgIHx8IHBJQy5nZXRBdHRyKCkgIT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFKVxyXG4gICAgICAgIHRoaXMuX25ld3ZhbHVlID0gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fb2xkdmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fb2xkdmFsdWUgPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghKHBJQyA9PT0gbnVsbCB8fCBwSUMuZ2V0QXR0cigpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgcElDLmdldEF0dHIoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikpIHtcclxuICAgICAgdGhpcy5fcGljdHVyZSA9IHBJQy5nZXRNYXNrKCk7XHJcbiAgICAgIHRoaXMuaGVicmV3ID0gcElDLmlzSGVicmV3KCk7XHJcbiAgICAgIHRoaXMuX3BpY3R1cmUgPSB0aGlzLl9waWN0dXJlLnN1YnN0cigwLCBwSUMuZ2V0TWFza1NpemUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+UmV0dXJuIGluZGV4IG9mIE1heCBtZW1iZXIgaW4gYXJyYXk8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaW5kTWF4KGFycmF5OiBudW1iZXJbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWF4OiBudW1iZXIgPSBhcnJheVtpbmRleF07XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmIChhcnJheVtpXSA+IG1heClcclxuICAgICAge1xyXG4gICAgICAgIG1heCA9IGFycmF5W2ldO1xyXG4gICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+aXMgY2hlY2tlZCBjaGFyIERhdGEgUG9zaXRpb25hbCBEaXJlY3RpdmU8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc0RhdGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRvQ2hlY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFzY2lpOiBudW1iZXIgPSB0b0NoZWNrLmNoYXJDb2RlQXQoMCk7XHJcbiAgICByZXR1cm4gKGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1lZIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1lZWVkgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX01NTVxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19EREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfRERERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1dXVyB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IWVlZWVkgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEwgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1lKXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTIgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlk0IHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0JCKTsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiBOdW1lcmljIERhdGEgUG9zaXRpb25hbCBEaXJlY3RpdmUgZXhpc3RzPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNEYXRlUG9zaXRpb25hbE51bWVyaWNEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVkgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfRERcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfREREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0REREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfVyB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IWVlZWVlcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEwgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1lKIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMVxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTIgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlk0IHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0JCKTsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pcyBjaGVja2VkIGNoYXIgTnVtZXJpYyBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzTnVtZXJpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTik7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgY2hhciBMb2dpYyBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzTG9naWNQb3NpdGlvbmFsRGlyZWN0aXZlKHRvQ2hlY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFzY2lpOiBudW1iZXIgPSB0b0NoZWNrLmNoYXJDb2RlQXQoMCk7XHJcbiAgICByZXR1cm4gKGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1gpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5GaW5kIGlmIHRoZSBsZXR0ZXIgYXQgaW5kZXggaXMgUG9zaXRpb25hbCBEYXRlIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjaGFyXCI+dG8gY2hlY2sgaW4gcGljdHVyZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIFBvc2l0aW9uYWwgRGF0ZSBEaXJlY3RpdmU7IGZhbHNlIG90aGVyd2lzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGlzVGltZVBvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEggfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1UIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1NTIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1BNIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX01TKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+aXMgY2hlY2tlZCBzdHJpbmcgUG9zaXRpb25hbCBEaXJlY3RpdmUgb2YgYW55IHR5cGU8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZnVsbC9wYXJ0XCI+b2YgcGljdHVyZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gaW5kZXggb2YgZGlyZWN0aXZlIHBvc2l0aW9uIG9yIC0xIGlmIG5vdCBmb3VuZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGluZGV4T2ZQb3NpdGlvbmFsTm9uRGlyZWN0aXZlKHN0cjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCB0bXA6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICB0bXAgPSBzdHJbaV07XHJcbiAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRtcCkgfHwgdGhpcy5pc0RhdGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRtcCkgfHwgdGhpcy5pc051bWVyaWNQb3NpdGlvbmFsRGlyZWN0aXZlKHRtcClcclxuICAgICAgICB8fCB0aGlzLmlzTG9naWNQb3NpdGlvbmFsRGlyZWN0aXZlKHRtcCkgfHwgdGhpcy5pc1RpbWVQb3NpdGlvbmFsRGlyZWN0aXZlKHRtcCkpXHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIHJldHVybiBpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBzZXQgdGhlIFwidmFsaWRhdGlvbiBmYWlsZWRcIiBmbGFnPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPnZhbHVlIHRvIHVzZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRWYWxpZGF0aW9uRmFpbGVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5WYWxpZGF0aW9uRmFpbGVkKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX3ZhbERldC5zZXRWYWxpZGF0aW9uRmFpbGVkKHZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENvdW50IGRpZ2l0cyBpbiBzdHJpbmcgYmVmb3JlIGRlbGltZXRlcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbnB1dFN0cmluZ1wiPi0gc3RyaW5nIHRvIGxvb2sgaW50byBmb3IgZGVsaW1ldGVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZWFyY2hTdGFydFwiPi0gaW5pdGlhbCBpbmRleCBwb3NpdGlvbiBmb3Igc2VhcmNoIGluIGlucHV0U3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJcIj53ZSBhcmUgbG9va2luZyBmb3I8L3BhcmFtPlxyXG4gIHByaXZhdGUgZGlnaXRzQmVmb3JlRGVsaW1ldGVyKGlucHV0U3RyaW5nOiBzdHJpbmcsIHNlYXJjaFN0YXJ0OiBudW1iZXIsIGRlbGltZXRlcjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBjb3VudGVyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHNlYXJjaEVuZFBvczogbnVtYmVyID0gaW5wdXRTdHJpbmcuaW5kZXhPZihkZWxpbWV0ZXIsIHNlYXJjaFN0YXJ0KTtcclxuXHJcbiAgICBpZiAoc2VhcmNoRW5kUG9zIDwgMClcclxuICAgICAgc2VhcmNoRW5kUG9zID0gaW5wdXRTdHJpbmcubGVuZ3RoO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IHNlYXJjaFN0YXJ0OyBpIDwgc2VhcmNoRW5kUG9zOyBpKyspXHJcbiAgICBpZiAoTkNoYXIuSXNEaWdpdChpbnB1dFN0cmluZ1tpXSkpXHJcbiAgICAgIGNvdW50ZXIrKztcclxuXHJcbiAgICByZXR1cm4gY291bnRlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gYnkgQ3RybCtVIChTZXQgdG8gTnVsbCksIG51bGwgZGlzcGxheSB2YWx1ZSBpcyBzZXQgdG8gY3RybC4gSW4gdGhpcyBjYXNlIHdlIG5lZWQgZm9sbG93aW5nIGNoZWNraW5nICwgaW4gb3JkZXIgdG8gc2V0IGZpZWxkIHRvIG51bGwuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPi0gZW50ZXJlZCB2YWx1ZSB0byB2YWx1ZSB0byBjaGVjazwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpc051bGxEaXNwbGF5VmFsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzTnVsbERpc3BsYXlWYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBmaWVsZDogR3VpRmllbGRCYXNlID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGaWVsZCgpO1xyXG5cclxuICAgIGlmIChmaWVsZC5OdWxsQWxsb3dlZCAmJiBmaWVsZC5oYXNOdWxsRGlzcGxheVZhbHVlKCkpXHJcbiAgICB7XHJcbiAgICAgIGxldCBkaXNwRGVmVmFsdWU6IGFueSA9IGZpZWxkLmdldE51bGxEaXNwbGF5KCk7XHJcbiAgICAgIGlmIChkaXNwRGVmVmFsdWUgIT09IG51bGwpXHJcbiAgICAgICAgaXNOdWxsRGlzcGxheVZhbCA9IChkaXNwRGVmVmFsdWUudG9TdHJpbmcoKSA9PT0gdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgaXNOdWxsRGlzcGxheVZhbCA9ICh0aGlzLl9uZXd2YWx1ZSA9PT0gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzTnVsbERpc3BsYXlWYWw7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
1507
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL0ZpZWxkVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUVULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUs5QixPQUFPLEVBQW1CLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkUsT0FBTyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxXQUFXLEVBQ1gsZUFBZSxFQUNoQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE1BQU0sT0FBTyxjQUFjO0lBWXpCO1FBWFEsY0FBUyxHQUFRLElBQUksQ0FBQztRQUN0QixjQUFTLEdBQVEsSUFBSSxDQUFDO1FBQ3RCLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBQzVCLG1CQUFj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QWU7UUFDL0MsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPO2VBQ3ZJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsUUFBUSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSztlQUNsSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFVBQVUsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU07ZUFDdkssS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1SSxDQUFDO0lBR08sZ0NBQWdDLENBQUMsT0FBZTtRQUN0RCxJQUFJLEtBQUssR0FBVyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFFBQVEsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU07ZUFDdEksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxLQUFLLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxVQUFVO2VBQ3RJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTztlQUNsSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFHLENBQUM7SUFHTyw0QkFBNEIsQ0FBQyxPQUFlO1FBQ2xELElBQUksS0FBSyxHQUFXLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEMsQ0FBQztJQUdPLDBCQUEwQixDQUFDLE9BQWU7UUFDaEQsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4QyxDQUFDO0lBS08seUJBQXlCLENBQUMsT0FBZTtRQUMvQyxJQUFJLEtBQUssR0FBVyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlLLENBQUM7SUFNTyw2QkFBNkIsQ0FBQyxHQUFXO1FBQy9DLElBQUksR0FBVyxDQUFDO1FBRWhCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUMzQztZQUNFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDYixJQUFJLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDO21CQUNoSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQztnQkFDOUUsU0FBUztZQUNYLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUlPLG1CQUFtQixDQUFDLEdBQVk7UUFDdEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQjtZQUMvQixPQUFPOztZQUVQLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQU1PLHFCQUFxQixDQUFDLFdBQW1CLEVBQUUsV0FBbUIsRUFBRSxTQUFpQjtRQUN2RixJQUFJLE9BQU8sR0FBVyxDQUFDLENBQUM7UUFDeEIsSUFBSSxZQUFZLEdBQVcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFdkUsSUFBSSxZQUFZLEdBQUcsQ0FBQztZQUNsQixZQUFZLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUVwQyxLQUFLLElBQUksQ0FBQyxHQUFXLFdBQVcsRUFBRSxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRTtZQUN2RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixPQUFPLEVBQUUsQ0FBQztRQUVaLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFJTyxnQkFBZ0I7UUFDdEIsSUFBSSxnQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDdEMsSUFBSSxLQUFLLEdBQWlCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFL0QsSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUNwRDtZQUNFLElBQUksWUFBWSxHQUFRLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQyxJQUFJLFlBQVksS0FBSyxJQUFJO2dCQUN2QixnQkFBZ0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7O2dCQUVoRSxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUM7U0FDaEQ7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGF0ZVRpbWUsXHJcbiAgRXhjZXB0aW9uLFxyXG4gIExpc3QsXHJcbiAgTkNoYXIsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIE51bWJlckZvcm1hdEluZm8sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbkRldGFpbHMgfSBmcm9tICcuL1ZhbGlkYXRpb25EZXRhaWxzJztcclxuaW1wb3J0IHsgSUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vZW52L0lFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IE1nQ29udHJvbEJhc2UgfSBmcm9tICcuL01nQ29udHJvbEJhc2UnO1xyXG5pbXBvcnQgeyBHdWlGaWVsZEJhc2UgfSBmcm9tICcuLi9kYXRhL0d1aUZpZWxkQmFzZSc7XHJcbmltcG9ydCB7IERhdGVCcmVha1BhcmFtcywgRGlzcGxheUNvbnZlcnRvciB9IGZyb20gJy4vRGlzcGxheUNvbnZlcnRvcic7XHJcbmltcG9ydCB7XHJcbiAgRGF0ZVV0aWwsXHJcbiAgSFRNTF8yX1NUUixcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQSUNJbnRlcmZhY2UsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxEYXRlSnBuLFxyXG4gIFV0aWxTdHJCeXRlTW9kZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQgeyBFdmVudHMgfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQgeyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbiB9IGZyb20gJy4vV3JvbmdGb3JtYXRFeGNlcHRpb24nO1xyXG5pbXBvcnQgeyBQSUMgfSBmcm9tICcuL1BJQyc7XHJcbmltcG9ydCB7IERhdGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vR3VpRW51bXMnO1xyXG5pbXBvcnQgeyBOVU1fVFlQRSB9IGZyb20gJy4uL2RhdGEvTlVNX1RZUEUnO1xyXG5pbXBvcnQgeyBIZWJyZXdEYXRlIH0gZnJvbSAnLi9IZWJyZXdEYXRlJztcclxuaW1wb3J0IHsgQmxvYlR5cGUgfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHsgR3VpRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9HdWlFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7UHJvcEludGVyZmFjZX0gZnJvbSBcIi4vUHJvcEludGVyZmFjZVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBGaWVsZFZhbGlkYXRvciB7XHJcbiAgcHJpdmF0ZSBfbmV3dmFsdWU6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfb2xkdmFsdWU6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGljdHVyZVJlYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGljdHVyZUVuYWJsZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF92YWxEZXQ6IFZhbGlkYXRpb25EZXRhaWxzID0gbnVsbDtcclxuICBwcml2YXRlIF9pc1BtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcGljdHVyZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIGhlYnJldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2RlY2ltYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZW52aXJvbm1lbnQ6IElFbnZpcm9ubWVudCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fZW52aXJvbm1lbnQgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudDtcclxuICAgIHRoaXMuX2RlY2ltYWwgPSAodGhpcy5fZW52aXJvbm1lbnQuR2V0RGVjaW1hbCgpIHx8IFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiB0aGUgbWFpbiBtZXRob2Qgb2YgdGhpcyBjbGFzczwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxEZXRcIj5hIFZhbGlkYXRpb25EZXRhaWxzIG9iamVjdCB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nPC9wYXJhbT5cclxuICBjaGVja1ZhbCh2YWxEZXQ6IFZhbGlkYXRpb25EZXRhaWxzKTogVmFsaWRhdGlvbkRldGFpbHMge1xyXG4gICAgdGhpcy5fbmV3dmFsdWUgPSAodGhpcy5fb2xkdmFsdWUgPSAodGhpcy5fcGljdHVyZVJlYWwgPSAodGhpcy5fcGljdHVyZUVuYWJsZSA9IG51bGwpKSk7XHJcbiAgICB0aGlzLmluaXQodmFsRGV0KTtcclxuICAgIHZhbERldC5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdmFsRGV0LmdldENvbnRyb2woKTtcclxuICAgIC8vIFRPRE8gLSB1bmNvbW1lbnQgdGhpcyBsaW5lIHdoZW4gJ1BST1BfVFlQRV9NT0RJRllfSU5fUVVFUlknIGlzIHN1cHBvcnRlZCBmb3Igb3RoZXIgY29udHJvbHNcclxuICAgIGxldCBtb2RJblF1ZXV5OiBib29sZWFuID1cclxuICAgICAgY3RybC5pc1JlcGVhdGFibGUoKT8gZmFsc2UgOiAgY3RybC5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlksIGZhbHNlLCBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSk7XHJcblxyXG4gICAgbGV0IHVzZU5hdGl2ZTogYm9vbGVhbiA9IGN0cmwuaXNNb2RpZmlhYmxlKCk7XHJcblxyXG4gICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRNb2RlKCkgPT09ICdFJyAmJiAhbW9kSW5RdWV1eSkge1xyXG4gICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5fb2xkdmFsdWUpO1xyXG4gICAgICByZXR1cm4gdmFsRGV0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgfHwgY3RybC5pc1NlbGVjdGlvbkN0cmwoKSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YKSB7XHJcbiAgICAgICAgICB2YWxEZXQuc2V0TnVsbChjdHJsLmlzTnVsbFZhbHVlKHRoaXMuX25ld3ZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9uZXd2YWx1ZSAhPT0gbnVsbCAmJiBjdHJsLmlzU2VsZWN0aW9uQ3RybCgpKSB7XHJcbiAgICAgICAgICBsZXQgaWR4OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHRoaXMuX25ld3ZhbHVlKTtcclxuICAgICAgICAgIGlmIChjdHJsLmlzQ2hvaWNlTnVsbChpZHgpKSB7XHJcbiAgICAgICAgICAgIHZhbERldC5zZXROdWxsKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXhfMTExKSB7XHJcbiAgICAgICAgaWYgKGV4XzExMSBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleF8xMTE7XHJcbiAgICAgIH1cclxuICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuX25ld3ZhbHVlKTtcclxuICAgICAgcmV0dXJuIHZhbERldDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzcGFjZXxub3RoaW5nIHdhcyBpbnNlcnRlZCAgLT4gdXNlIGRlZmF1bHQgdmFsdWVcclxuICAgIGlmIChjdHJsLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIGN0cmwuRGF0YVR5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSAmJiBjdHJsLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHtcclxuICAgICAgICAgIGlmICgodHlwZW9mIHRoaXMuX25ld3ZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLl9uZXd2YWx1ZS50cmltKCkubGVuZ3RoID09PSAwKSB8fCAoY3RybC5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFICYmIChjdHJsLmlzRGF0ZVplcm8odGhpcy5fbmV3dmFsdWUpIHx8IHRoaXMuaXNOdWxsRGlzcGxheVZhbCgpKSkpIHtcclxuICAgICAgICAgICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSBjdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWU6IHN0cmluZyA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgICAgICBsZXQgdGV4dDogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGZpZWxkLmlzTnVsbERlZmF1bHQoKSkge1xyXG4gICAgICAgICAgICAgIHZhbERldC5zZXROdWxsKHRydWUpO1xyXG4gICAgICAgICAgICAgIHRleHQgPSBmaWVsZC5nZXROdWxsRGlzcGxheSgpO1xyXG4gICAgICAgICAgICAgIGlmIChOU3RyaW5nLklzTnVsbE9yRW1wdHkodGV4dCkgJiYgY3RybC5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZmF1bHRWYWx1ZSwgdmFsRGV0LmdldFJhbmdlKCksIHZhbERldC5nZXRQSUMoKSwgdXNlTmF0aXZlLCBmaWVsZC5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgdGV4dCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChkZWZhdWx0VmFsdWUsIHZhbERldC5nZXRSYW5nZSgpLCB2YWxEZXQuZ2V0UElDKCksIHVzZU5hdGl2ZSwgZmllbGQuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgoIWZpZWxkLmlzTnVsbERlZmF1bHQoKSAmJiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9PSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT09IG51bGwpKSlcclxuICAgICAgICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRleHQ7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0ZXh0KTtcclxuICAgICAgICAgICAgICByZXR1cm4gdmFsRGV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgfVxyXG5cclxuXHJcbiAgICBpZiAoKHR5cGVvZiB0aGlzLl9uZXd2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIShTdHJVdGlsLnJ0cmltKHRoaXMuX25ld3ZhbHVlKSA9PT0gU3RyVXRpbC5ydHJpbSh0aGlzLl9vbGR2YWx1ZSkpKSB8fCBjdHJsLk1vZGlmaWVkQnlVc2VyKVxyXG4gICAge1xyXG4gICAgICB0cnlcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAodmFsRGV0LmdldFR5cGUoKSlcclxuICAgICAgICB7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrQWxwaGFGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICAgIHRoaXMuX3BpY3R1cmVSZWFsID0gdmFsRGV0LmdldFBpY3R1cmVSZWFsKCk7IC8vIG9ubHkgbnVtZXJpYyB0eXBlIG5lZWQgYW5vdGhlciBwaWN0dXJlIGZvcm1hdFxyXG4gICAgICAgICAgICB0aGlzLl9waWN0dXJlRW5hYmxlID0gdmFsRGV0LmdldFBpY3R1cmVFbmFibGUoKTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja051bWVyaWNQaWN0dXJlKCk7XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrTnVtZXJpY0ZpZWxkKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuY2hlY2tMb2dpY2FsRmllbGQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja0RhdGVGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrVGltZUZpZWxkKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIHJlYWwgcGljdHVyZSB0byBCTE9CLCBkbyBub3RoaW5nXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OT05FOlxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJGaWVsZFZhbGlkYXRvci5jaGVja1ZhbDogVHlwZSBvZiB0aGUgZmllbGQgXCIgKyB2YWxEZXQuZ2V0VHlwZSgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChnb0JhY2spIHtcclxuICAgICAgICBpZiAoZ29CYWNrIGluc3RhbmNlb2YgV3JvbmdGb3JtYXRFeGNlcHRpb24pIHtcclxuICAgICAgICAgIC8vIG5lZWQgY2hhbmdlIHRvIG9sZCB2YWx1ZSwgc2V0IGZvY3VzIGJhY2sgYW5kIHdyaXRlIEVycm9yIE1lc3NhZ2VcclxuICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLl9vbGR2YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQodHJ1ZSk7XHJcbiAgICAgICAgICBpZiAoZ29CYWNrLmdldFR5cGUoKSAhPT0gTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhUKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJpbnRNZXNzYWdlKGdvQmFjay5nZXRUeXBlKCksIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbERldDtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q2hlY2sgJiB2YWxpZGF0ZSBBbHBoYSBmaWVsZCBieSBoaXMgb2xkL25ldyB2YWx1ZSBhbmQgMiBwaWN0dXJlczpcclxuICAvLy8gUmVhbCBhbmQgRW5hYmxlXHJcbiAgLy8vIDEuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCBwaWN0dXJlcywgb3RoZXJ3aXNlIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyAyLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcmFuZ2VcclxuICAvLy8gMi4xIGNvbXBsZXRlIHZhbHVlLCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlICByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gU3RyaW5nIC0gbmV3IHZhbHVlIG9mIHZhbGlkYXRlZCBmaWVsZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrQWxwaGFGaWVsZCgpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKTtcclxuXHJcbiAgICBsZXQgSXNBdHRyQWxwaGE6IGJvb2xlYW4gPSB0aGlzLl92YWxEZXQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG5cclxuICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPT09IDAgJiYgdGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpID09PSBudWxsICYmIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX25ld3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChJc0F0dHJBbHBoYSAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpKSB7XHJcbiAgICAgIGxldCBwaWNMZW5COiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQih0aGlzLl9waWN0dXJlKTtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHRoaXMuX25ld3ZhbHVlKSA+IHBpY0xlbkIpIHtcclxuICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih0aGlzLl9uZXd2YWx1ZSwgcGljTGVuQik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID4gdGhpcy5fcGljdHVyZS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cigwLCB0aGlzLl9waWN0dXJlLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBjdXJyUGljdHVyZTogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IGN1cnJQaWN0dXJlID0gMDtcclxuXHJcbiAgICBmb3IgKGN1cnJQaWN0dXJlID0gaSA9IDA7IGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgY3VyclBpY3R1cmUgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgKSB7XHJcbiAgICAgIGlmICghRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpICYmIHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSA9PT0gdGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSB7XHJcbiAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKTtcclxuICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKCFEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSkgJiYgdGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpICE9PSB0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSk7XHJcbiAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpICYmIHRoaXMuaXNQb3NzaWJsZUFscGhhTGV0dGVyKGksIGN1cnJQaWN0dXJlKSkge1xyXG4gICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdHJWYWw6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cihpLCAxKTtcclxuICAgICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIoc3RyVmFsKSA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgaWYgKElzQXR0ckFscGhhKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjdXJyUGljdHVyZSArIDEgPCB0aGlzLl9waWN0dXJlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlICsgMSkpICYmIHRoaXMuaXNQb3NzaWJsZUFscGhhTGV0dGVyKGksIGN1cnJQaWN0dXJlICsgMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpLyonICcqLztcclxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpLyonICcqLztcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgICAgICAgIGkgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpKTtcclxuICAgICAgICAgICAgICAgIGkgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgICAgICAgIGkgPSBpICsgMTtcclxuICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKCcgJykvKicgJyovO1xyXG4gICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICBsZXQgdHlwZTogTWdDb250cm9sVHlwZSA9IGNvbnRyb2wuVHlwZTtcclxuICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9OVU0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX25ld3ZhbHVlID0gc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpO1xyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5maWxsQWxwaGFCeVJhbmdlKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIHRoaXMuX25ld3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIGNoYXIgaW4gQWxwaGEgY29tcGxlYXRlIHdpdGggRGlyZWN0aXZlIENoYXJhY3RlciBmb3IgdGhlIGxldHRlcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbmRleFwiPm9mIGRpcmVjdGl2ZSBpbiBzdHJpbmcgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBjb21wbGV0ZSwgZmFsc2Ugb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaXNQb3NzaWJsZUFscGhhTGV0dGVyKGluZGV4SW5wdXQ6IG51bWJlciwgaW5kZXhQaWN0dXJlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcbiAgICBzd2l0Y2ggKHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChpbmRleFBpY3R1cmUpKSB7XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19YOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSjpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0c6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19TOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVDpcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19VOlxyXG4gICAgICAgIGxldCB1cHBlcjogc3RyaW5nID0gdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF0udG9VcHBlckNhc2UoKTtcclxuICAgICAgICBpZiAodXBwZXIgIT09IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdKVxyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdHJpbmdJbnNpZGUoXCJcIiArIHVwcGVyLCBpbmRleElucHV0KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19MOlxyXG4gICAgICAgIGxldCBsb3dlcjogc3RyaW5nID0gdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF0udG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAobG93ZXIgIT09IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdKVxyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdHJpbmdJbnNpZGUoXCJcIiArIGxvd2VyLCBpbmRleElucHV0KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19OOlxyXG4gICAgICAgIGxldCBudW1iZXIxOiBzdHJpbmcgPSB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XTtcclxuICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQobnVtYmVyMSkgfHwgTkNoYXIuSXNXaGl0ZVNwYWNlKG51bWJlcjEpIHx8IFV0aWxTdHJCeXRlTW9kZS5hc051bWVyaWMobnVtYmVyMSkpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXJyb3JUb0xvZyhcIkJhZCBBbHBoYSB2YWx1ZS4gU2hvdWxkIGJlIG51bWJlciBvbmx5IG9uIHBsYWNlIE51bS4gXCIgKyBpbmRleElucHV0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUVycm9yVG9Mb2coXCJGaWVsZFZhbGlkYXRvci5pc1Bvc3NpYmxlQWxwaGFMZXR0ZXI6IGlsbGVnYWwgQ2hhciBEaXJlY3RpdmU6IFwiICsgdGhpcy5fcGljdHVyZS5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUoaW5kZXhQaWN0dXJlKSkgKyBcIiBmb3IgXCIgKyB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlmIG5ldyB2YWx1ZSB3YXNuJ3QgZmluaXNoZWQgYW5kIHN0YXkgdW53cml0YWJsZSBwZWFjZXMgb2YgdGhlIFJlYWwgcGljdHVyZSAtIGFkZCBpdFxyXG4gIC8vLyB0byB0aGUgZW5kIG9mIHRoZSBuZXd2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaWxsQWxsQWxwaGEoKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpcy5fcGljdHVyZS5sZW5ndGgpO1xyXG4gICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fbmV3dmFsdWUpO1xyXG5cclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmIHRoaXMuX3ZhbERldC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEpIHtcclxuICAgICAgbGV0IGludE5ld3ZhbHVlTGVuQjogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIodGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgICBsZXQgc3RyQnVpZWRQaWN0dXJlOiBzdHJpbmcgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodGhpcy5fcGljdHVyZSwgaW50TmV3dmFsdWVMZW5CKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gc3RyQnVpZWRQaWN0dXJlLmxlbmd0aDsgaSA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChpKSkpIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKCcgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fcGljdHVyZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAtIDE7IGkgPCB0aGlzLl9waWN0dXJlLmxlbmd0aCAmJiBpID49IDA7IGkrKykge1xyXG4gICAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmUuY2hhckF0KGkpKSkge1xyXG4gICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fcGljdHVyZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q29tcGFyYXRpdmUgbmV3dmFsdWUgd2l0aCBwb3NzaWJsZSBSYW5nZSBpbiBDb250aW51b3VzUmFuZ2VWYWx1ZXMvRGlzY3JldGVSYW5nZVZhbHVlczwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IG5ld3ZhbHVlIGlmIGl0IHBvc3NpYmxlLCBvbGR2YWx1ZSBvdGhlcndpc2U8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmaWxsQWxwaGFCeVJhbmdlKENvbnRpbnVvdXNSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBEaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4pOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB0bXBCdWZmZXI6IHN0cmluZyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZmlsbEFscGhhQnlEaXNjcmV0ZVJhbmdlVmFsdWVzKERpc2NyZXRlUmFuZ2VWYWx1ZXMsIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICB0bXBCdWZmZXIgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZpbGxBbHBoYUJ5Q29udGludW91c1JhbmdlVmFsdWVzKENvbnRpbnVvdXNSYW5nZVZhbHVlcywgdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgaWYgKHRtcEJ1ZmZlciAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuXHJcbiAgICAgIGlmIChEaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiB0aGlzLkNvbXBsZXRlQWxwaGFCeVJhbmdlKERpc2NyZXRlUmFuZ2VWYWx1ZXMpO1xyXG5cclxuXHJcbiAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuX29sZHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlRyeSB0byBjb21wbGV0ZSB0aGUgbmV3dmFsdWUgYnkgUmFuZ2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBjb21wbGV0ZWQgdmFsdWUgaWYgaXQgcG9zc2libGUsIG90aGVyd2lzZSBvbGR2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIENvbXBsZXRlQWxwaGFCeVJhbmdlKERpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPik6IHN0cmluZyB7XHJcbiAgICBsZXQgdG1wTmV3VmFsdWU6IHN0cmluZyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuY29tcGxldGVBbHBoYUJ5UmFuZ2UoRGlzY3JldGVSYW5nZVZhbHVlcywgdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgaWYgKHRtcE5ld1ZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0bXBOZXdWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb2N1cyBiYWNrXHJcbiAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuX29sZHZhbHVlO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIExvZ2ljYWwgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0xvZ2ljYWxGaWVsZCgpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID09PSAwICYmIHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSA9PT0gbnVsbCAmJiB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpID09PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT09IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuZmlsbEFscGhhQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gIC8vIHRvZG8gOiBuZWVkIHRvIGNoZWNrIHdoYXQgaXMgdG8gaGFuZGxlIGZvciBjaGVja2luZyByYW5nZXNcclxuICAgIHJldHVybiB0aGlzLl9uZXd2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4qKioqKioqKioqKioqKioqKioqKioqKioqKk51bWVyaWMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIE51bWVyaWMgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja051bWVyaWNGaWVsZCgpOiBhbnkge1xyXG5cclxuICAgIGxldCBldmFsdWF0ZWQ6IGFueTtcclxuICAgIGlmICh0eXBlb2YgdGhpcy5fbmV3dmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IFwiMFwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZGVsaW1ldGVyUmVhbEluZGV4OiBudW1iZXIgPSB0aGlzLl9uZXd2YWx1ZS5pbmRleE9mKHRoaXMuX2RlY2ltYWwpO1xyXG4gICAgICBsZXQgZGVsaW1ldGVyUGljdEluZGV4OiBudW1iZXIgPSB0aGlzLl9waWN0dXJlUmVhbC5pbmRleE9mKHRoaXMuX2RlY2ltYWwpO1xyXG5cclxuICAgICAgZXZhbHVhdGVkID0gXCJcIjtcclxuICAgICAgbGV0IGV2YWx1YXRlZExlZnQ6IHN0cmluZztcclxuICAgICAgbGV0IGV2YWx1YXRlZFJpZ2h0OiBzdHJpbmc7XHJcblxyXG5cclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBmb3JtYXQgb2YgbmV3dmFsdWUgbWF0Y2hlcyB0aGUgbnVtZXJpYyBtYXNrLlxyXG4gICAgICBpZiAoIXRoaXMuY2hlY2tOdW1lcmljSW5EZWNGb3JtYXQoKSlcclxuICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLkVEVF9FUlJfU1RSXzEpO1xyXG5cclxuICAgICAgaWYgKGRlbGltZXRlclBpY3RJbmRleCAhPT0gLTEgJiYgZGVsaW1ldGVyUmVhbEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIGV2YWx1YXRlZExlZnQgPSB0aGlzLmNoZWNrTnVtZXJpY0xlZnQoZGVsaW1ldGVyUGljdEluZGV4LCBkZWxpbWV0ZXJSZWFsSW5kZXgpO1xyXG4gICAgICAgIGV2YWx1YXRlZFJpZ2h0ID0gdGhpcy5jaGVja051bWVyaWNSaWdodChkZWxpbWV0ZXJQaWN0SW5kZXgsIGRlbGltZXRlclJlYWxJbmRleCk7XHJcbiAgICAgICAgZXZhbHVhdGVkID0gZXZhbHVhdGVkTGVmdCArIHRoaXMuX2RlY2ltYWwgKyBldmFsdWF0ZWRSaWdodDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoZGVsaW1ldGVyUGljdEluZGV4ICE9PSAtMSAmJiBkZWxpbWV0ZXJSZWFsSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICBldmFsdWF0ZWRMZWZ0ID0gdGhpcy5jaGVja051bWVyaWNMZWZ0KGRlbGltZXRlclBpY3RJbmRleCwgTWF0aC5taW4oZGVsaW1ldGVyUGljdEluZGV4LCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGgpKTtcclxuICAgICAgICAgIGV2YWx1YXRlZFJpZ2h0ID0gdGhpcy5jaGVja051bWVyaWNSaWdodChkZWxpbWV0ZXJQaWN0SW5kZXgsIGRlbGltZXRlclBpY3RJbmRleCAtIDEpO1xyXG4gICAgICAgICAgZXZhbHVhdGVkID0gZXZhbHVhdGVkTGVmdCArIHRoaXMuX2RlY2ltYWwgKyBldmFsdWF0ZWRSaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7IC8vIGRlbGltZXRlclBpY3RJbmRleCA9PSAtMSAmJiBkZWxpbWV0ZXJSZWFsSW5kZXggIT0gLTFcclxuICAgICAgICAgIGlmIChkZWxpbWV0ZXJQaWN0SW5kZXggPT09IC0xICYmIGRlbGltZXRlclJlYWxJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5jaGVja051bWVyaWNSaWdodCgtMSwgLTEpO1xyXG4gICAgICAgICAgICBldmFsdWF0ZWRMZWZ0ID0gZXZhbHVhdGVkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChkZWxpbWV0ZXJSZWFsSW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoMCwgZGVsaW1ldGVyUmVhbEluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoLTEsIC0xKTtcclxuICAgICAgICAgICAgZXZhbHVhdGVkTGVmdCA9IGV2YWx1YXRlZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgoZXZhbHVhdGVkUmlnaHQubGVuZ3RoID09PSAwICYmIGV2YWx1YXRlZExlZnQubGVuZ3RoID09PSAwKSB8fCAoZXZhbHVhdGVkLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgIC8vIHNwYWNlfG5vdGhpbmcgd2FzIGluc2VydGVkICAtPiB1c2UgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlO1xyXG4gICAgICAgIGN0cmwgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpO1xyXG5cclxuICAgICAgICBsZXQgZmllbGQ6IEd1aUZpZWxkQmFzZSA9IGN0cmwuZ2V0RmllbGQoKTtcclxuICAgICAgICBsZXQgZGVmVmFsdWU6IHN0cmluZyA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOyAvLyBpbm5lciB2YWx1ZSBpbnNlcnRlZFxyXG4gICAgICAgIGxldCBkaXNwRGVmVmFsdWU6IGFueSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmIChmaWVsZC5pc051bGxEZWZhdWx0KCkpIHtcclxuICAgICAgICAgIHRoaXMuX3ZhbERldC5zZXROdWxsKHRydWUpO1xyXG4gICAgICAgICAgZGlzcERlZlZhbHVlID0gZmllbGQuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3BEZWZWYWx1ZSA9PSBudWxsKVxyXG4gICAgICAgICAgZGlzcERlZlZhbHVlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZlZhbHVlLCB0aGlzLl92YWxEZXQuZ2V0UmFuZ2UoKSwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0cnVlLCBmaWVsZC5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgZGlnaXQgYmVmb3JlIHRoZSBkZWxpbWl0ZXIgZG8gbm90IGV4Y2VlZCB0aGUgcGljIHdob2xlcy5cclxuICAgICAgbGV0IHdob2xlRGlnaXRkaWZmOiBudW1iZXIgPSB0aGlzLmRpZ2l0c0JlZm9yZURlbGltZXRlcihldmFsdWF0ZWQsIDAsIHRoaXMuX2RlY2ltYWwpIC0gdGhpcy5fdmFsRGV0LmdldFBJQygpLmdldFdob2xlcygpO1xyXG4gICAgICAvLyBpZiB0aGV5IGRvLCBjaGVjayBpZiB0aGUgZXhjZWVkaW5nIGNoYXJzIGFyZSB0aGUgcGFkIGNoYXJzLiBpZiBzbywgdGhlcmUgaXMgbm8gZXJyb3IuXHJcbiAgICAgIGlmICh3aG9sZURpZ2l0ZGlmZiA+IDApIHtcclxuICAgICAgICBsZXQgcGFkQ2hhck9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAvLyBpcyB0aGVyZSBhIHBhZCwgY2hlY2sgaXQuIG5vIHBhZCBpcyBhIGNlcnRhaW4gZXJyb3IuXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRJc1BhZEZpbGwoKSkge1xyXG4gICAgICAgICAgcGFkQ2hhck9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHdob2xlRGlnaXRkaWZmICYmIHBhZENoYXJPbmx5OyBpKyspXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjaGFyIGlzIG5vdCB0aGUgcGFkLCB0aGVuIHRoaXMgaXMgYW4gZXJyb3IuXHJcbiAgICAgICAgICAgIGlmIChldmFsdWF0ZWRbaV0gIT09IHRoaXMuX3ZhbERldC5nZXRQYWRGaWxsQ2hhcigpKVxyXG4gICAgICAgICAgICAgIHBhZENoYXJPbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXBhZENoYXJPbmx5KVxyXG4gICAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5FRFRfRVJSX1NUUl8xKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0SXNOZWdhdGl2ZSgpICYmICh0aGlzLl9uZXd2YWx1ZS50cmltKCkuc3RhcnRzV2l0aChcIi1cIikgfHwgKHRoaXMuX3ZhbERldC5nZXROZWdhdGl2ZVNpZ25QcmVmKCkubGVuZ3RoICE9PSAwICYmIHRoaXMuX25ld3ZhbHVlLnRyaW0oKS5zdGFydHNXaXRoKHRoaXMuX3ZhbERldC5nZXROZWdhdGl2ZVNpZ25QcmVmKCkpKSkpIHtcclxuICAgICAgICBldmFsdWF0ZWQgPSBcIi1cIiArIGV2YWx1YXRlZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZnJvbSB0aGlzIHBvaW50IGhhdmUgZXZhbHVhdGVkIHN0cmluZyAtIHRoZSB2YWx1ZSAod2l0aG91dCBtYXNrKSBvZiB0aGUgY29udHJvbFxyXG4gICAgICAvLyBuZWVkZWQgdG8gYmUgaW5zZXJ0ZWQgdG8gdGhlIHBpY3R1cmVcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKHRoaXMuX25ld3ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGV2YWx1YXRlZCwgXCJcIiwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0cnVlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCB0cnVlKTtcclxuXHJcbiAgICAgIC8vIGluIG9yZGVyIGNoZWNrIGlmIHVzZXIgaGFzIGVudGVyZWQgYSBibGFuayB2YWx1ZSAsIHRyaW0gYW5kIHRoZW4gY2hlY2sgaXQncyBsZW5ndGguXHJcbiAgICAgIGxldCB0ZW1wRGlzcFZhbDogc3RyaW5nID0gU3RyVXRpbC5sdHJpbShldmFsdWF0ZWQpO1xyXG4gICAgICBpZiAodGVtcERpc3BWYWwubGVuZ3RoID09PSAwICYmIHRoaXMuX3ZhbERldC5nZXRQSUMoKS56ZXJvRmlsbCgpICYmIHRoaXMuX3ZhbERldC5nZXRQSUMoKS5nZXRaZXJvUGFkKCkgPT09ICcgJylcclxuICAgICAgICBldmFsdWF0ZWQgPSBcIjBcIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgLy8gZnJvbSB0aGlzIHBvaW50IGhhdmUgZXZhbHVhdGVkIHN0cmluZyAtIHRoZSB2YWx1ZSAod2l0aG91dCBtYXNrKSBvZiB0aGUgY29udHJvbFxyXG4gICAgICAvLyBuZWVkZWQgdG8gYmUgaW5zZXJ0ZWQgdG8gdGhlIHBpY3R1cmVcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKHRoaXMuX25ld3ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGV2YWx1YXRlZCwgXCJcIiwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0cnVlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCB0cnVlKTtcclxuXHJcbiAgICB9XHJcbiAgICAvLyBJbnNlcnQgdGhlIG51bWJlciB0byByYW5nZVxyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgdGhpcy5fbmV3dmFsdWUgPSBldmFsdWF0ZWQ7XHJcbiAgICAgIGV2YWx1YXRlZCA9IHRoaXMuZmlsbE51bWVyaWNCeVJhbmdlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXZhbHVhdGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrIHZhbGlkaXR5IG9mIG51bWVyaWNhbCBwaWN0dXJlIGZyb20gZm91bmQgJ2RlbGltZXRlcicgdG8gbGVmdC5cclxuICAvLy8gPC0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJQaWN0SW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIHBpY3R1cmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlbGltZXRlclJlYWxJbmRleFwiPmZvdW5kIGRlbGltZXRlciBpbiB0aGUgaW5zZXJ0ZWQgYnkgdXNlciBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljTGVmdChkZWxpbWV0ZXJQaWN0SW5kZXg6IG51bWJlciwgZGVsaW1ldGVyUmVhbEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgUmVhbEluZGV4OiBudW1iZXIgPSBkZWxpbWV0ZXJSZWFsSW5kZXggLSAxO1xyXG4gICAgbGV0IFBpY3RJbmRleDogbnVtYmVyO1xyXG4gICAgbGV0IGlzRm91bmQ6IGJvb2xlYW47XHJcblxyXG4gICAgZm9yIChQaWN0SW5kZXggPSBkZWxpbWV0ZXJQaWN0SW5kZXggLSAxOyBQaWN0SW5kZXggPj0gMCAmJiBSZWFsSW5kZXggPj0gMDsgUGljdEluZGV4LS0pXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLl9waWN0dXJlRW5hYmxlW1BpY3RJbmRleF0gPT09ICcxJylcclxuICAgICAge1xyXG4gICAgICAgIGxldCB0bXBzdG9yYWdlOiBudW1iZXIgPSBSZWFsSW5kZXg7XHJcbiAgICAgICAgaXNGb3VuZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBmb3IgKDsgUmVhbEluZGV4ID49IDA7IFJlYWxJbmRleC0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmICh0aGlzLl9waWN0dXJlUmVhbFtQaWN0SW5kZXhdID09PSB0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpc0ZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgUmVhbEluZGV4LS07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFpc0ZvdW5kKVxyXG4gICAgICAgICAgUmVhbEluZGV4ID0gdG1wc3RvcmFnZTtcclxuXHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9waWN0dXJlUmVhbFtQaWN0SW5kZXhdKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBjYW4gaW5zZXJ0IG9ubHkgbnVtYmVyXHJcbiAgICAgIGVsc2VcclxuICAgICAge1xyXG4gICAgICAgIGZvciAoOyBSZWFsSW5kZXggPj0gMDsgUmVhbEluZGV4LS0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW1JlYWxJbmRleF0pKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlW1JlYWxJbmRleF0pO1xyXG4gICAgICAgICAgICBSZWFsSW5kZXgtLTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFJlYWxJbmRleCA8IDAgJiYgUGljdEluZGV4ID49IDApXHJcbiAgICAvLyB0cnkgdG8gYWRkIHVud3JpdGFibGVcclxuICAgICAgZm9yICg7IFBpY3RJbmRleCA+PSAwOyBQaWN0SW5kZXgtLSlcclxuICAgICAge1xyXG4gICAgICAgIGlmICh0aGlzLl9waWN0dXJlRW5hYmxlW1BpY3RJbmRleF0gPT09ICcxJylcclxuICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIC8vIG9ubHkgZnJvbSBsZWZ0IG5lZWQgUGFkRmlsbFxyXG4gICAgICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRJc1BhZEZpbGwoKSlcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl92YWxEZXQuZ2V0UGFkRmlsbENoYXIoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgcmV0dXJuIFN0clV0aWwuUmV2ZXJzZVN0cmluZyhidWZmZXIpLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q2hlY2sgdmFsaWRpdHkgb2YgbnVtZXJpY2FsIHBpY3R1cmUgZnJvbSBmb3VuZCAnZGVsaW1ldGVyJyB0byByaWdodC5cclxuICAvLy8gLi0+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJQaWN0SW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIHBpY3R1cmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlbGltZXRlclJlYWxJbmRleFwiPmZvdW5kIGRlbGltZXRlciBpbiB0aGUgaW5zZXJ0ZWQgYnkgdXNlciBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljUmlnaHQoZGVsaW1ldGVyUGljdEluZGV4OiBudW1iZXIsIGRlbGltZXRlclJlYWxJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBidWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IFJlYWxJbmRleDogbnVtYmVyID0gZGVsaW1ldGVyUmVhbEluZGV4ICsgMTtcclxuICAgIGxldCBQaWN0SW5kZXg6IG51bWJlcjtcclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuXHJcbiAgICBmb3IgKFBpY3RJbmRleCA9IGRlbGltZXRlclBpY3RJbmRleCArIDE7IFBpY3RJbmRleCA8IHRoaXMuX3BpY3R1cmVFbmFibGUubGVuZ3RoICYmIFJlYWxJbmRleCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDsgUGljdEluZGV4KyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLl9waWN0dXJlRW5hYmxlW1BpY3RJbmRleF0gPT09ICcxJylcclxuICAgICAge1xyXG4gICAgICAgIGlmIChSZWFsSW5kZXggPCBQaWN0SW5kZXgpXHJcbiAgICAgICAgICBSZWFsSW5kZXggPSBQaWN0SW5kZXg7XHJcblxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gY2FuIGluc2VydCBvbmx5IG51bWJlclxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBmb3IgKDsgUmVhbEluZGV4IDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBSZWFsSW5kZXgrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAvLyBBcHBlbmQgdGhlIGRpZ2l0IG9mIGFjdHVhbCBpbnB1dCBkYXRhLiBJZiBpdCBpcyBtYXNrIGNoYXIsIHNraXAgaXQuXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWVbUmVhbEluZGV4XSkgJiYgIXBpYy5waWNJc01hc2soUmVhbEluZGV4KSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKTtcclxuICAgICAgICAgICAgUmVhbEluZGV4Kys7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHJpZ2h0IHBhcnQgaGFzIGFueSBpbnB1dCBkYXRhLCB0aGVuIG9ubHkgYXBwZW5kIHVud3JpdGFibGUgY2hhcnNcclxuICAgIGlmIChidWZmZXIuTGVuZ3RoID4gMClcclxuICAgIHtcclxuICAgICAgaWYgKFJlYWxJbmRleCA+PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgUGljdEluZGV4IDwgdGhpcy5fcGljdHVyZVJlYWwubGVuZ3RoKVxyXG4gICAgICAvLyB0cnkgdG8gYWRkIHVud3JpdGFibGVcclxuICAgICAgICBmb3IgKDsgUGljdEluZGV4IDwgdGhpcy5fcGljdHVyZVJlYWwubGVuZ3RoOyBQaWN0SW5kZXgrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgICAgICAvLyBlbHNlIERvIG5vdGhpbmdcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVmZmVyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+QlVHOiA0NDI3ODhcclxuICAvLy8gQ2hhbmdpbmcgZGVjaW1hbCBzZXBhcmF0b3IgaW4gdGhldyBwaWN0dXJlUmVhbCB0byB2YWx1ZSBnb3QgZnJvbSBFbnZpcm9ubWVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjaGVja051bWVyaWNQaWN0dXJlKCk6IHZvaWQge1xyXG4gICAgbGV0IGluZGV4T2ZEZWM6IG51bWJlcjtcclxuICAgIGxldCBsYXN0RGVjOiBudW1iZXI7XHJcbiAgICBsZXQgbWF4TGVuZ3RoOiBudW1iZXI7XHJcbiAgICBsZXQgY3VyckluZHg6IG51bWJlcjtcclxuICAgIGxldCBQT0lOVF9ERUM6IHN0cmluZyA9IFwiLlwiOyAvLyB1c2VkIGluIFBJQ1RVUkUgZm9yIGRlY2ltYWwgc2VwYXJhdG9yXHJcblxyXG4gICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG5cclxuICAgIGlmICh0aGlzLl9waWN0dXJlUmVhbCA9PSBudWxsIHx8IHRoaXMuX3BpY3R1cmVFbmFibGUgPT0gbnVsbCB8fCBwaWMuZ2V0QXR0cigpICE9PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgIXBpYy53aXRoRGVjaW1hbCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGFzdERlYyA9IHRoaXMuX3BpY3R1cmVSZWFsLmxhc3RJbmRleE9mKFBPSU5UX0RFQyk7XHJcbiAgICBtYXhMZW5ndGggPSB0aGlzLl9waWN0dXJlRW5hYmxlLmxlbmd0aDtcclxuICAgIGN1cnJJbmR4ID0gMDtcclxuICAgIHdoaWxlIChjdXJySW5keCA8IGxhc3REZWMpXHJcbiAgICB7XHJcbiAgICAgIGluZGV4T2ZEZWMgPSB0aGlzLl9waWN0dXJlRW5hYmxlLmluZGV4T2YoXCIxXCIsIGN1cnJJbmR4KTtcclxuXHJcbiAgICAgIGlmIChpbmRleE9mRGVjID09PSAtMSlcclxuICAgICAgLy8gbm90IGZvdW5kXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoaW5kZXhPZkRlYyA9PT0gdGhpcy5fcGljdHVyZVJlYWwuaW5kZXhPZiggUE9JTlRfREVDLCBjdXJySW5keCkpXHJcbiAgICAgICAgLy8gaXQncyByZWFsIGRlY2ltYWwgcG9pbnQgYW5kIG5vdCBcXC4gaW50byB0aGUgcGljdHVyZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBmaXJzdDogc3RyaW5nO1xyXG4gICAgICAgICAgbGV0IHNlY29uZDogc3RyaW5nO1xyXG5cclxuICAgICAgICAgIGZpcnN0ID0gc2Vjb25kID0gXCJcIjtcclxuICAgICAgICAgIGlmIChpbmRleE9mRGVjID09PSAwKVxyXG4gICAgICAgICAgLy8gdGhlIHBvaW50IG9uIHRoZSBmaXJzdCBwbGFjZSAuIyMjXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChpbmRleE9mRGVjICsgMSA8IG1heExlbmd0aClcclxuICAgICAgICAgICAgLy8gb25seSAxIC5cclxuICAgICAgICAgICAgICBzZWNvbmQgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoaW5kZXhPZkRlYyArIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoaW5kZXhPZkRlYyA9PT0gbWF4TGVuZ3RoKVxyXG4gICAgICAgICAgLy8gdGhlIHBvaW50IG9uIHRoZSBsYXN0IHBsYWNlICMjIy5cclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmlyc3QgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoMCAsIGluZGV4T2ZEZWMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaXJzdCA9IHRoaXMuX3BpY3R1cmVSZWFsLnN1YnN0cigwICwgaW5kZXhPZkRlYyk7XHJcbiAgICAgICAgICAgIHNlY29uZCA9IHRoaXMuX3BpY3R1cmVSZWFsLnN1YnN0cihpbmRleE9mRGVjICsgMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLl9waWN0dXJlUmVhbCA9IGZpcnN0ICsgdGhpcy5fZGVjaW1hbCArIHNlY29uZDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY3VyckluZHggPSArK2luZGV4T2ZEZWM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENvbXBhcmUgbmV3dmFsdWUgd2l0aCB0aGUgcmFuZ2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXd2YWx1ZSBpZiBpdCdzIGluIHRoZSByYW5nZSwgb2xkdmFsdWUgb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZmlsbE51bWVyaWNCeVJhbmdlKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29udHJvbFBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRQSUMoKTtcclxuICAgIGxldCBjb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKTtcclxuICAgIGxldCBkaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4gPSB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpO1xyXG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICBsZXQgY2hlY2tlZFN0cjogc3RyaW5nID0gdGhpcy5zZXROdW1lcmljVmFsdWVXaXRob3V0UGljdHVyZSh0aGlzLl9uZXd2YWx1ZS50b1N0cmluZygpKTtcclxuXHJcblxyXG4gICAgaWYgKGNoZWNrZWRTdHIubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMucHJpbnRNZXNzYWdlKE1zZ0ludGVyZmFjZS5TVFJfUk5HX1RYVCwgdHJ1ZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9vbGR2YWx1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgICBsZXQgY2hlY2tlZE51bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUodGhpcy5fbmV3dmFsdWUudG9TdHJpbmcoKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRQSUMoKSwgMCk7XHJcblxyXG4gICAgICBpZiAoZGlzY3JldGVSYW5nZVZhbHVlcyAhPT0gbnVsbCkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkaXNjcmV0ZVJhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICBsZXQgcmFuZ2VJdGVtVmFsdWUxOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRShkaXNjcmV0ZVJhbmdlVmFsdWVzLmdldF9JdGVtKGkpLCBjb250cm9sUGljLCAwKTtcclxuXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoTlVNX1RZUEUubnVtX2NtcChjaGVja2VkTnVtLCByYW5nZUl0ZW1WYWx1ZTEpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25ld3ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXRjaCAoZXhfQ0MpIHtcclxuICAgICAgICAgICAgLy8gc2tpcCBub24tbnVtZXJpYyByYW5nZSB2YWx1ZXNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb250aW51b3VzUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY29udGludW91c1JhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcblxyXG4gICAgICAgICAgbGV0IHJhbmdlSXRlbVZhbHVlMTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgICAgICAgIGxldCByYW5nZUl0ZW1WYWx1ZTI6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcblxyXG4gICAgICAgICAgcmFuZ2VJdGVtVmFsdWUxLm51bV80X2Ffc3RkKGNvbnRpbnVvdXNSYW5nZVZhbHVlcy5nZXRfSXRlbShpKyspKTtcclxuICAgICAgICAgIHJhbmdlSXRlbVZhbHVlMi5udW1fNF9hX3N0ZChjb250aW51b3VzUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSkpO1xyXG5cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChOVU1fVFlQRS5udW1fY21wKGNoZWNrZWROdW0sIHJhbmdlSXRlbVZhbHVlMSkgIT09IC0xICYmIE5VTV9UWVBFLm51bV9jbXAocmFuZ2VJdGVtVmFsdWUyLCBjaGVja2VkTnVtKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmV3dmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChleF8xNUIpIHtcclxuICAgICAgICAgICAgLy8gc2tpcCBub24tbnVtZXJpYyByYW5nZSB2YWx1ZXNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybnMgYSBudW1lcmljIHZhbHVlIGV4dHJhY3RlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmdcclxuICAvLy8gb24gZmFpbHVyZSByZXR1cm5zIE5FR0FUSVZFX0lORklOSVRZXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj50aGUgc3RyaW5nIHRvIHBhcnNlPC9wYXJhbT5cclxuICBwcml2YXRlIGdldERvdWJsZVZhbCh2YWw6IHN0cmluZyk6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IGRvdEZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbWludXNGb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGRpZ2l0Rm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlbmRPZk51bTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gZmluZCB0aGUgZGVsZW1ldGluZyBub24gbnVtZXJpYyBjaGFyYWN0ZXJcclxuICAgIGZvciAoaSA9IDA7IGkgPCB2YWwubGVuZ3RoICYmICFlbmRPZk51bTsgaSsrKVxyXG4gICAge1xyXG4gICAgICBsZXQgYzogc3RyaW5nID0gdmFsW2ldO1xyXG4gICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpXHJcbiAgICAgICAgZGlnaXRGb3VuZCA9IHRydWU7XHJcbiAgICAgIGVsc2VcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAoYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXNlICctJzpcclxuICAgICAgICAgICAgaWYgKGRpZ2l0Rm91bmQgfHwgZG90Rm91bmQgfHwgbWludXNGb3VuZClcclxuICAgICAgICAgICAgICBlbmRPZk51bSA9IHRydWU7XHJcbiAgICAgICAgICAgIG1pbnVzRm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlICcuJzpcclxuICAgICAgICAgICAgaWYgKGRvdEZvdW5kIHx8IG1pbnVzRm91bmQgJiYgIWRpZ2l0Rm91bmQpXHJcbiAgICAgICAgICAgICAgZW5kT2ZOdW0gPSB0cnVlO1xyXG4gICAgICAgICAgICBkb3RGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICBpZiAoZGlnaXRGb3VuZCB8fCBkb3RGb3VuZCB8fCBtaW51c0ZvdW5kKVxyXG4gICAgICAgICAgICAgIGVuZE9mTnVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgZW5kT2ZOdW0gPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW5kT2ZOdW0pIHtcclxuICAgICAgaSA9IGkgLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpID4gMCkge1xyXG4gICAgICByZXR1cm4gTk51bWJlci5QYXJzZSh2YWwuc3Vic3RyKDAsIGkpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gLUluZmluaXR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnNldCBOdW1lcmljIHZhbHVlIFdpdGhvdXQgUGljdHVyZSwgZmlsdGVyIGlucHV0IGZyb20gdXNlcjwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBwdXJlIG51bWJlciwgd2l0aG91dCBwaWN0dXJlIG1hc2s8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzZXROdW1lcmljVmFsdWVXaXRob3V0UGljdHVyZSh2YWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY2hlY2tlZFN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHZhbC5sZW5ndGgpO1xyXG4gICAgbGV0IGlzRmlyc3REZWNpbWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY3VyckNoYXI6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcGljdHVyZVJlYWwubGVuZ3RoICYmIGkgPCB2YWwubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGN1cnJDaGFyID0gdmFsW2ldO1xyXG4gICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoY3VyckNoYXIpKVxyXG4gICAgICAgIGNoZWNrZWRTdHIuQXBwZW5kKGN1cnJDaGFyKTtcclxuICAgICAgZWxzZSBpZiAoY3VyckNoYXIgPT09IHRoaXMuX2Vudmlyb25tZW50LkdldERlY2ltYWwoKSAmJiAhaXNGaXJzdERlY2ltYWwpXHJcbiAgICAgIHtcclxuICAgICAgICBjaGVja2VkU3RyLkFwcGVuZChOU3RyaW5nLlRvQ2hhckFycmF5KE51bWJlckZvcm1hdEluZm8uTnVtYmVyRGVjaW1hbFNlcGFyYXRvcikudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgaXNGaXJzdERlY2ltYWwgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGN1cnJDaGFyID09PSAnLScgJiYgdGhpcy5fdmFsRGV0LmdldElzTmVnYXRpdmUoKSlcclxuICAgICAgICBjaGVja2VkU3RyLkFwcGVuZChOU3RyaW5nLlRvQ2hhckFycmF5KE51bWJlckZvcm1hdEluZm8uTmVnYXRpdmVTaWduKS50b1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIGlmIChjaGVja2VkU3RyLlRvU3RyaW5nKCkubGVuZ3RoID09PSAwKVxyXG4gICAge1xyXG4gICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9OVU0sIGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoZWNrZWRTdHIuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gY2hlY2sgaWYgbmV3dmFsdWUgZm9ybWF0IG1hdGNoZXMgdGhlIG51bWVyaWMgcGljIGZvcm1hdC48L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrTnVtZXJpY0luRGVjRm9ybWF0KCk6IGJvb2xlYW4ge1xyXG5cclxuXHJcbiAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IERlYzogbnVtYmVyO1xyXG4gICAgbGV0IFdob2xlOiBudW1iZXI7XHJcbiAgICBsZXQgRGVjUG9zOiBudW1iZXI7XHJcbiAgICBsZXQgZGVjaW1hbENoYXI6IHN0cmluZyA9IHRoaXMuX2Vudmlyb25tZW50LkdldERlY2ltYWwoKTtcclxuXHJcbiAgICAvLyBDb3VudCBudW1iZXIgb2YgZGlnaXRzIGFuZCBwb3NpdGlvbiBvZiBkZWNpbWFsIHBvaW50XHJcblxyXG4gICAgRGVjID0gMDtcclxuICAgIFdob2xlID0gMDtcclxuICAgIERlY1BvcyA9IC0xO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgICAgaWYgKHBpYy5pc051bWVyaWMoaSkpXHJcbiAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW2ldKSlcclxuICAgICAgICAvLyB3aGVuIGRlYyBwb3Mgbm90IGZvdW5kLCBjb3VudCB3aG9sZXMsIGlmIGZvdW5kLCBjb3VudCBkZWMuXHJcbiAgICAgICAgICBpZiAoRGVjUG9zID49IDApXHJcbiAgICAgICAgICAgIERlYysrO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBXaG9sZSsrO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX25ld3ZhbHVlW2ldID09PSBkZWNpbWFsQ2hhcilcclxuICAgICAgICAgIERlY1BvcyA9IGk7XHJcblxyXG4gICAgLy8gZGlkIHdlIGV4Y2VlZCB0aGUgbWFzayA/XHJcbiAgICBpZiAocGljLmdldFdob2xlcygpIDwgV2hvbGUgfHwgcGljLmdldERlYygpIDwgRGVjKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrICYgdmFsaWRhdGUgRGF0ZSBmaWVsZCBieSBoaXMgb2xkL25ldyB2YWx1ZSBhbmQgMiBwaWN0dXJlczpcclxuICAvLy8gUmVhbCBhbmQgRW5hYmxlXHJcbiAgLy8vIDEuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCBwaWN0dXJlcywgb3RoZXJ3aXNlIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyAyLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcmFuZ2VcclxuICAvLy8gMi4xIGNvbXBsZXRlIHZhbHVlLCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlICByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gbmV3IHZhbHVlIG9mIHZhbGlkYXRlZCBmaWVsZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrRGF0ZUZpZWxkKCk6IERhdGUge1xyXG5cclxuICAgIGxldCBuZXdEYXRlOiBEYXRlID0gKHRoaXMuX25ld3ZhbHVlID09IG51bGwgPyBudWxsIDogbmV3IERhdGUodGhpcy5fbmV3dmFsdWUpKTtcclxuICAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQoZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmlzRGF0ZVplcm8odGhpcy5fbmV3dmFsdWUpKSB7XHJcbiAgICAgIC8vIGdldCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmaWVsZFxyXG4gICAgICBsZXQgZGVmYXVsdE1nVmFsdWU6IHN0cmluZyA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0RmllbGQoKS5nZXREZWZhdWx0VmFsdWUoKTtcclxuXHJcbiAgICAgIG5ld0RhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AoZGVmYXVsdE1nVmFsdWUsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAvLyByYW5nZSBkYXRlXHJcbiAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9IG51bGwpXHJcbiAgICAgICAgbmV3RGF0ZSA9IHRoaXMuZmlsbERhdGVCeVJhbmdlKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSwgdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld0RhdGU7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkFkZCBmb3VuZCBpbiBuZXd2YWx1ZSBudW1iZXJzKDIgb3IgMyBsZXR0ZXJzKSB0byBidWZmZXIgYW5kIHJldHVyblxyXG4gIC8vLyBsYXN0IGZvdW5kIG51bWJlciBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VyclZhbHVlXCI+aW4gbmV3dmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJ1ZmZlclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPi0gd2hpY2ggdHlwZSBvZiBwb3NpdGlvbmFsIGRpcmVjdGl2ZSwgZm9yIGNoZWNraW5nIHZhbGlkaXR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGN1cnJWYWx1ZSBpbiBuZXd2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGFkZDJEYXRlKGN1cnJWYWx1ZTogbnVtYmVyLCBidWZmZXI6IFN0cmluZ0J1aWxkZXIsIHR5cGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGN1cnJWYWx1ZTtcclxuICAgIGxldCBjdXJyQWRkOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpcy5fbmV3dmFsdWUubGVuZ3RoKTtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHN3aXRjaCAodHlwZSlcclxuICAgIHtcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfRERERDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lZOlxyXG4gICAgICAgIGxldHRlcnMgPSAyO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0RERDpcclxuICAgICAgICBsZXR0ZXJzID0gMztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWVlZOlxyXG4gICAgICAgIGxldHRlcnMgPSA0O1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1c6XHJcbiAgICAgICAgbGV0dGVycyA9IDE7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWUo6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgbGV0dGVycyA9IDI7XHJcbiAgICAgICAgdHlwZSA9IFBJQ0ludGVyZmFjZS5QSUNfWVk7IC8vIFBJQ19ZSiB3aWxsIGJlIGhhbmRsZWQgYXMgUElDX1lZIGluIHRoaXMgbWV0aG9kLlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlIChzdGFydCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWUuY2hhckF0KHN0YXJ0KSkpXHJcbiAgICAgIHN0YXJ0Kys7IC8vIGZpbmQgZmlyc3QgZGlnaXRcclxuXHJcblxyXG4gICAgaWYgKHN0YXJ0ID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9uZXd2YWx1ZSA9PT0gXCIwXCIpKSB7XHJcbiAgICAgIGZvciAobGV0IG51bDogbnVtYmVyID0gMDsgbnVsIDwgbGV0dGVyczsgbnVsID0gbnVsICsgMSkge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoJzAnKS8qJzAnKi87XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGN1cnJWYWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHN0YXJ0ID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZSArIFwiMFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgbGV0dGVycyAmJiBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSkpXHJcbiAgICAgICAgY3VyckFkZC5BcHBlbmQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdXJyQWRkLkxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjdXJyQWRkLkFwcGVuZCgnMCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBhZGQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAvLyBib3VuZGFyeSBjb25kaXRpb25zIGNhc2VzOlxyXG4gICAgaWYgKChhZGQgPCAxICYmIHR5cGUgIT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSAmJiB0eXBlICE9PSBQSUNJbnRlcmZhY2UuUElDX1lZKSB8fFxyXG4gICAgICAgKGFkZCA+IDMxICYmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0REIHx8IHR5cGUgPT09ICBQSUNJbnRlcmZhY2UuUElDX0REREQpKSB8fFxyXG4gICAgICAoYWRkID4gMTIgJiYgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQpIHx8IChhZGQgPiA3ICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfVykpIHtcclxuICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoYW4gcGljdHVyZSBpcyBZWVlZIGFuZCBpbnNlcnRlZCAwLTIgbnVtYmVycywgdXNlIENFTlRVUkUgdmFsdWUsIG90aGVyd2lzZSBhZGQgemVyb3MgYmVmb3JlIHRoZSB5ZWFyXHJcbiAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWVlZICYmIHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkgPiA5OTkgJiYgY3VyckFkZC5MZW5ndGggPCAzKVxyXG4gICAgICBjdXJyQWRkID0gdGhpcy5jaGVja0NlbnR1cnkoYWRkKTtcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgbGV0dGVycyAtIGN1cnJBZGQuTGVuZ3RoOyBqID0gaiArIDEpIHtcclxuICAgICAgYnVmZmVyLkFwcGVuZCgnMCcpLyonMCcqLztcclxuICAgIH1cclxuICAgIGJ1ZmZlci5BcHBlbmQoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuICAgIHJldHVybiAgaTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BZGQgZm91bmQgaW4gbmV3dmFsdWUgbGV0dGVycyB0byBidWZmZXIgYW5kIHJldHVyblxyXG4gIC8vLyBsYXN0IGZvdW5kIG51bWJlciBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VyclZhbHVlXCI+aW4gbmV3dmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxldHRlcnNcIj5hbW91bnQgb2YgbGV0dGVycyB0byBpbnNlcnQgdG8gYnVmZmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJidWZmZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gY3VyclZhbHVlIGluIG5ld3ZhbHVlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYWRkTTJEYXRlKGN1cnJWYWx1ZTogbnVtYmVyLCBsZXR0ZXJzOiBudW1iZXIsIGJ1ZmZlcjogU3RyaW5nQnVpbGRlciwgdHlwZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogc3RyaW5nW107XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKSB7XHJcbiAgICAgIGlmICh0aGlzLmhlYnJldykge1xyXG4gICAgICAgIGFycmF5ID0gSGVicmV3RGF0ZS5HZXRMb2NhbE1vbnRocygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBtZXNzYWdlU3RyaW5nOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuTU9OVEhTX1BUUik7XHJcbiAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtZXNzYWdlU3RyaW5nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1dXVyB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1cpIHtcclxuICAgICAgICBpZiAodGhpcy5oZWJyZXcpIHtcclxuICAgICAgICAgIGFycmF5ID0gSGVicmV3RGF0ZS5HZXRMb2NhbERvd3MoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZGF5U3RyOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbERheXMoZGF5U3RyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpIHsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgYXJyYXkgPSBVdGlsRGF0ZUpwbi5nZXRBcnJheURvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMSB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMiB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0pZNClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA8IGN1cnJWYWx1ZSArIGxldHRlcnMpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfREFURSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cihjdXJyVmFsdWUsIGxldHRlcnMpO1xyXG4gICAgICAgICAgICBidWZmZXIuQXBwZW5kKHRleHQpO1xyXG4gICAgICAgICAgICByZXR1cm4gY3VyclZhbHVlICsgdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBjdXJyVmFsdWUgKyBsZXR0ZXJzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPCBjdXJyVmFsdWUpIHtcclxuICAgICAgY3VyclZhbHVlID0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgbGV0IG1heDogbnVtYmVyID0gdGhpcy5nZXRNb250aE9yV2Vlayh0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoY3VyclZhbHVlKSwgbGV0dGVycywgdHlwZSk7XHJcblxyXG4gICAgaWYgKGFycmF5W21heF0udHJpbSgpLmxlbmd0aCA+PSBsZXR0ZXJzKSB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoYXJyYXlbbWF4XS50cmltKCkuc3Vic3RyKDAsIGxldHRlcnMpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKGFycmF5W21heF0udHJpbSgpKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gbGV0dGVycyAtIGFycmF5W21heF0udHJpbSgpLmxlbmd0aDsgaSA+IDA7IGkgPSBpIC0gMSkge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyVmFsdWUgKyBsZXR0ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBlbmQgaW5kZXggb2YgZXZlcnkgbnVtZXJpYyBibG9jayBpbiB0aGUgbWFzayBmcm9tIG1hc2tbY3VyclZhbHVlXTwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGVuZCBvZiBudW1lcmljIGJsb2NrIGluIG5ld1ZhbHVlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RW5kT2ZOdW1lcmljQmxvY2soY3VyclZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgd2hpbGUgKGN1cnJWYWx1ZSA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGN1cnJWYWx1ZSkpKSB7XHJcbiAgICAgIGN1cnJWYWx1ZSA9IGN1cnJWYWx1ZSArIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmFkZGVkIHN1ZmZpeCB0byByZWxldmFudCBudW1iZXIgb2YgdGhlIGRheTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZERhdGVTdWZmaXgobGFzdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCB0aGVudW1iZXI6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UobGFzdCk7XHJcbiAgICBpZiAodGhlbnVtYmVyID09PSAxIHx8IHRoZW51bWJlciA9PT0gMjEgfHwgdGhlbnVtYmVyID09PSAzMSlcclxuICAgICAgcmV0dXJuIFwic3RcIjtcclxuICAgIGVsc2UgaWYgKHRoZW51bWJlciA9PT0gMiB8fCB0aGVudW1iZXIgPT09IDIyKVxyXG4gICAgICByZXR1cm4gXCJuZFwiO1xyXG4gICAgZWxzZSBpZiAodGhlbnVtYmVyID09PSAzIHx8IHRoZW51bWJlciA9PT0gMjMpXHJcbiAgICAgIHJldHVybiBcInJkXCI7XHJcbiAgICByZXR1cm4gXCJ0aFwiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBzaXplIG9mIGJsb2NrIGxldHRlcnMgb2YgdHlwZSAndHlwZScsIHdoaWNoIHN0YXJ0IGF0ICdzdGFydCc8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRTaXplT2ZCbG9jayhzdGFydDogbnVtYmVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGxldHRlcnM6IG51bWJlciA9IHN0YXJ0ICsgMTtcclxuICAgIHdoaWxlIChsZXR0ZXJzIDwgdGhpcy5fcGljdHVyZS5sZW5ndGggJiYgdGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGxldHRlcnMpID09PSB0eXBlKVxyXG4gICAgbGV0dGVycysrO1xyXG4gICAgcmV0dXJuIGxldHRlcnMgLSBzdGFydDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgU3RyaW5nIHBhcnQvZnVsbCBuYW1lIG9mIG1vbnRoL2RheSBvZiB3ZWVrPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vbnRoXCI+cGFydC9mdWxsIG5hbWUgb2YgbW9udGgvZGF5IG9mIHdlZWs8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1heFwiPm9mIHBvc3NpYmxlIGxldHRlcnMgaW4gbW9udGgvZGF5IG9mIHdlZWssIHNpemUgb2YgYmxvY2sgaW4gcGljdHVyZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZTpcIj5QSUNfICB3ZWVrfG1vbnRoPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG51bWJlciBvZiBtb250aCAxLTEyLCBvciBkYXkgb2Ygd2VlayAxLTc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRNb250aE9yV2Vlayhtb250aF9zdHI6IHN0cmluZywgbGV0dGVyczogbnVtYmVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXTtcclxuXHJcbiAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTU0gfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQpIHtcclxuICAgICAgLy8gTW9udGhcclxuICAgICAgICBpZiAodGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxNb250aHMoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IG1vbnRoU3RyOiBTdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuTU9OVEhTX1BUUik7XHJcbiAgICAgICAgICBhcnJheSA9IERhdGVVdGlsLmdldExvY2FsTW9udGhzKG1vbnRoU3RyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XV1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XKVxyXG4gICAgICAvLyBXZWVrXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAodGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxEb3dzKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBkYXlTdHI6IFN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKE1zZ0ludGVyZmFjZS5EQVlTX1BUUik7XHJcbiAgICAgICAgICBhcnJheSA9IERhdGVVdGlsLmdldExvY2FsRGF5cyhkYXlTdHIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpXHJcbiAgICAgIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAge1xyXG4gICAgICAgIGFycmF5ID0gVXRpbERhdGVKcG4uZ2V0QXJyYXlEb3coKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICByZXR1cm4gMTsgLy8gb25seSB3ZWVrIG9yIG1vbnRoIHBvc3NpYmxlIC0+IGRpZmZhdWx0IDEuXHJcbiAgICAgIH1cclxuXHJcbiAgICBpZiAobGV0dGVycyA+IG1vbnRoX3N0ci5sZW5ndGgpXHJcbiAgICAvLyBjdXQgbGV0dGVyIGlmIGl0J3MgIGVuZCBvZiBzdHJpbmdcclxuICAgICAgbGV0dGVycyA9IG1vbnRoX3N0ci5sZW5ndGg7XHJcblxyXG4gICAgaWYgKHRoaXMuaGVicmV3KVxyXG4gICAge1xyXG4gICAgICBsZXQgaHN0cjogc3RyaW5nID0gTlN0cmluZy5UcmltU3RhcnQobW9udGhfc3RyKS5zdWJzdHIoMCwgbGV0dGVycykudHJpbSgpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAvLyBzdGFydCBjaGVja2luZyBmcm9tIDFzdCBtZW1iZXIsIGJlY2F1c2UgMCA9IFwiXCJcclxuICAgICAge1xyXG4gICAgICAgIGlmIChhcnJheVtpXS50cmltKCkgPT09IGhzdHIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKGkgPT09IDE0KVxyXG4gICAgICAgICAgICBpID0gNjtcclxuICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIHRoZSBudW1iZXIgaW5zZXJ0ZWQgYW5kIG5vdCBzdHJpbmcgLT4gZmluZCBtb3VudGgvZGF5IG9mIHdlZWsgYnkgbnVtYmVyIDEtMTJ8MS03XHJcblxyXG4gICAgICAgIGxldCBzdHI6IHN0cmluZyA9IG1vbnRoX3N0ci5zdWJzdHIoMCwgbGV0dGVycykudHJpbSgpO1xyXG4gICAgICAgIGxldCBudW1CdWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyW2ldKSlcclxuICAgICAgICAgICAgbnVtQnVmZmVyLkFwcGVuZChzdHJbaV0pO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0aGVOdW1iZXI6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UobnVtQnVmZmVyLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGlmICh0aGVOdW1iZXIgPCAxKVxyXG4gICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmICh0aGVOdW1iZXIgPiAxMilcclxuICAgICAgICAgICAgcmV0dXJuIDEyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1dXVyB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19CQilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpZiAodGhlTnVtYmVyID4gNylcclxuICAgICAgICAgICAgcmV0dXJuIDc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGVOdW1iZXI7XHJcbiAgICAgICAgfVxyXG4gICAgY2F0Y2ggKGV4XzIxQSkge1xyXG4gICAgICAgICAgLy8gZG9Ob3RoaW5nX1N0cmluZ0luc2VydGVkXHJcbiAgICAgIH1cclxuXHJcbiAgICAvLyBpbnNlcnRlZCBzdHJpbmcgLSBuYW1lIG9mIG1vbnRofGRheSBvZiB3ZWVrIC0+dHJ5IGlkZW50eWZ5IGl0XHJcbiAgICBsZXQgZm91bmQ6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oYXJyYXkubGVuZ3RoKTtcclxuICAgIGxldCBmcm9tOiBudW1iZXI7XHJcbiAgICBsZXQgbWF4OiBudW1iZXIgPSAtMTsgLy8gbnVtYmVyIG9mIGZvdW5kIG1vbnRoL2RheSBvZiB3ZWVrXHJcblxyXG5cclxuICAgIGZvciAobGV0IHRtcDogbnVtYmVyID0gMTsgdG1wIDwgYXJyYXkubGVuZ3RoOyB0bXArKylcclxuICAgIC8vIHN0YXJ0IGNoZWNraW5nIGZyb20gMXN0IG1lbWJlciwgYmVjYXVzZSAwID0gXCJcIlxyXG4gICAge1xyXG4gICAgICBmb3VuZFt0bXBdID0gMDtcclxuICAgICAgZnJvbSA9IDA7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhcnJheVt0bXBdLmxlbmd0aCAmJiBmcm9tIDwgbW9udGhfc3RyLmxlbmd0aCAmJiBpIDwgbGV0dGVyczsgaSsrLCBmcm9tKyspXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoYXJyYXlbdG1wXS50b0xvd2VyQ2FzZSgpW2ldID09PSBtb250aF9zdHIudG9Mb3dlckNhc2UoKVtmcm9tXSlcclxuICAgICAgICAgIGZvdW5kW3RtcF0rKztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGZyb20gPT09IGxldHRlcnMgfHwgZnJvbSA9PT0gYXJyYXlbdG1wXS5sZW5ndGgpXHJcbiAgICAgIC8vIGFsbCBsZXR0ZXJzIGZvdW5kXHJcbiAgICAgIHtcclxuICAgICAgICBtYXggPSB0bXA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF4ID09PSAtMSlcclxuICAgICAgbWF4ID0gdGhpcy5maW5kTWF4KGZvdW5kKTtcclxuICAgIHJldHVybiBtYXg7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIG51bWVyaWMgZGF0YSBhbGxvd2VkIGluIGRhdGVcclxuICAvLy8gcmV0dXJuIHRydWUgaWYgaXQgaXMgYWxsb3dlZCwgb3RoZXJ3aXNlIGZhbHNlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNOdW1iZXJBbGxvd2VkSW5EYXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLmlzRGF0ZVBvc2l0aW9uYWxOdW1lcmljRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmVbaV0pKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmZpbmQgaWYgYWxsIG51bWJlcnMgb2YgdGhlIG5ldyB1c2VyIGluc2VydGVkIHZhbHVlIGFyZSAwXHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIGFsbCBudW1iZXJzIGluIHRoZSBpbnB1dCBhcmUgMCwgb3RoZXJ3aXNlIHRydWU8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc0FsbE51bWJlcnMwKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGN1cnJDaHI6IHN0cmluZztcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgY3VyckNociA9IHRoaXMuX25ld3ZhbHVlW2ldO1xyXG5cclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGN1cnJDaHIpICYmIGN1cnJDaHIgIT09ICcwJylcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgdmFsaWRpdHkgb2YgWWVhciBmb3IgWVlZWSBwYXJ0IG9mIHRoZSBtYXNrPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInllYXJJblwiPmluc2VydGVkIGJ5IHVzZXI8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gY2FsY3VsYXRlZCBieSBlbnZpcm9ubWVudC5jZW50dXJ5IHJpZ2h0IHZhbHVlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tDZW50dXJ5KHllYXJJbjogbnVtYmVyKTogU3RyaW5nQnVpbGRlciB7XHJcbiAgICBsZXQgb3V0VmFsOiBudW1iZXI7XHJcbiAgICBsZXQgc3RhcnRfY2VudHVyeTogbnVtYmVyID0gdGhpcy5fZW52aXJvbm1lbnQuR2V0Q2VudHVyeSh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgIGxldCBjZW50dXJ5OiBudW1iZXIgPSBNYXRoLmZsb29yKHN0YXJ0X2NlbnR1cnkgLyAxMDApO1xyXG4gICAgbGV0IHllYXJzOiBudW1iZXIgPSBzdGFydF9jZW50dXJ5ICUgMTAwO1xyXG4gICAgaWYgKHllYXJJbiA+PSB5ZWFycyAmJiB5ZWFySW4gIT09IDApXHJcbiAgICAgIG91dFZhbCA9IChjZW50dXJ5ICogMTAwICsgeWVhckluKTtcclxuICAgIGVsc2VcclxuICAgICAgb3V0VmFsID0gKCgrK2NlbnR1cnkpICogMTAwICsgeWVhckluKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIob3V0VmFsLnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIHRoZSBkYXRlIGxlZ2FsIGZvciBwaWN0dXJlIHJhbmdlLCB1c2VkIGZvciB2YWxpZGF0aW9uIGRhdGUgMDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJDb250aW51b3VzUmFuZ2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIkRpc2NyZXRlUmFuZ2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj5pbnRlZ2VyIC0gbWFnaWMgZGF0ZSBudW1iZXIgb2YgZGF5cyBmcm9tIDAxLjAxLjAwMDA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaXNEYXRlTGVnYWw0UmFuZ2UoQ29udGludW91c1JhbmdlOiBMaXN0PHN0cmluZz4sIERpc2NyZXRlUmFuZ2U6IExpc3Q8c3RyaW5nPiwgY3VyckRhdGU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZG93bkRhdGU6IG51bWJlcjtcclxuICAgIGxldCB0b3BEYXRlOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKENvbnRpbnVvdXNSYW5nZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgQ29udGludW91c1JhbmdlLmxlbmd0aCAtIDE7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGRvd25EYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZV9waWMoQ29udGludW91c1JhbmdlLmdldF9JdGVtKGkpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgIHRvcERhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhDb250aW51b3VzUmFuZ2UuZ2V0X0l0ZW0oKytpKSwgcGljLCBwaWMuZ2V0TWFzaygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICBpZiAoY3VyckRhdGUgPj0gZG93bkRhdGUgJiYgY3VyckRhdGUgPD0gdG9wRGF0ZSlcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKERpc2NyZXRlUmFuZ2UgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IERpc2NyZXRlUmFuZ2UubGVuZ3RoOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoY3VyckRhdGUgPT09IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKERpc2NyZXRlUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdGhlIGRhdGUgaXMgbm90IGluIHRoZSByYW5nZVxyXG4gICAgLy8gcmV0dXJuIGZhbHNlO1xyXG4gICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgYW5kIGZpbGwgREFURSB0eXBlIGJ5IHJhbmdlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmlsbERhdGVCeVJhbmdlKENvbnRpbnVvdXNSYW5nZTogTGlzdDxzdHJpbmc+LCBEaXNjcmV0ZVJhbmdlOiBMaXN0PHN0cmluZz4sIGJ1ZmZlcjogRGF0ZSk6IERhdGUge1xyXG4gICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBkb3duRGF0ZTogbnVtYmVyO1xyXG4gICAgbGV0IHRvcERhdGU6IG51bWJlcjtcclxuXHJcbiAgICBsZXQgY3VyckRhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZyb21OYXRpdmVEYXRlVG9NZ0RhdGVOdW1iZXIoYnVmZmVyLCBwaWMsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICBpZiAoQ29udGludW91c1JhbmdlICE9IG51bGwpIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZS5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICBkb3duRGF0ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbShpKSwgcGljLCBwaWMuZ2V0TWFzaygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICB0b3BEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZV9waWMoQ29udGludW91c1JhbmdlLmdldF9JdGVtKCsraSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID49IGRvd25EYXRlICYmIGN1cnJEYXRlIDw9IHRvcERhdGUpXHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYnVmZmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEaXNjcmV0ZVJhbmdlICE9IG51bGwpIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IERpc2NyZXRlUmFuZ2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoY3VyckRhdGUgPT09IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKERpc2NyZXRlUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShidWZmZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdGhlIGRhdGUgaXMgbm90IGluIHRoZSByYW5nZVxyXG4gICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIGRheSBzdWl0YWJsZSAobm90IGJpZ2dlciB0aGFuIG1heCkgZm9yIFllYXIgYW5kIE1vbnRoPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj51c2VyIGluc2VydGVkIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNEb3lcIj5pcyBwaWN0dXJlIG9mIG5lZWRlZCBkYXkgaXMgREREIC0gZGF5IG9mIHllYXI8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tEYXkoZGF0ZTogc3RyaW5nLCBpc0RveTogYm9vbGVhbik6IFN0cmluZ0J1aWxkZXIge1xyXG5cclxuICAgIGxldCBkYXk6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuREFZKTtcclxuICAgIGlmIChkYXkgPCAyOSAmJiAhaXNEb3kpXHJcbiAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihkYXRlKTtcclxuXHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gdGhpcy5nZXREYXRlRWxlbWVudChkYXRlLCBEYXRlRWxlbWVudC5ZRUFSKTtcclxuXHJcbiAgICBpZiAoIWlzRG95KVxyXG4gICAge1xyXG4gICAgICBpZiAoeWVhci50b1N0cmluZygpLmxlbmd0aCA8IDMpXHJcbiAgICAgICAgeWVhciA9IE5OdW1iZXIuUGFyc2UodGhpcy5jaGVja0NlbnR1cnkoeWVhcikuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fZW52aXJvbm1lbnQuR2V0RGF0ZU1vZGUodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkgPT09ICdCJylcclxuICAgICAgICB5ZWFyIC09IFBJQ0ludGVyZmFjZS5EQVRFX0JVRERISVNUX0dBUDtcclxuXHJcbiAgICAgIGxldCBtb250aDogbnVtYmVyID0gdGhpcy5nZXREYXRlRWxlbWVudChkYXRlLCBEYXRlRWxlbWVudC5NT05USCk7XHJcblxyXG4gICAgICAvLyBpZiBkYXkgbm90IGNvbnNpc3RhaW5lZCB0byB5ZWFyICYgbW9udGggLSBjaGFuZ2UgZGF5XHJcbiAgICAgIGxldCBkYXlNYXg6IG51bWJlciA9IHRoaXMuZ2V0TWF4RGF5SW5Nb250aCh5ZWFyLCBtb250aCk7XHJcbiAgICAgIGlmIChkYXkgPiBkYXlNYXgpXHJcbiAgICAgIHtcclxuICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfREFURSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgLy8gaWYgbW9udGggbm90IGNvbnNpc3RhaW5lZCB0byBkYXkoREREKSAtIGNoYW5nZSBtb250aFxyXG4gICAgICBsZXQgbW9udGhSZWFsOiBudW1iZXIgPSB0aGlzLmdldE1vbnRoQnlEYXkoeWVhciwgZGF5KTtcclxuXHJcbiAgICAgIGlmIChtb250aFJlYWwgPCAxIHx8IG1vbnRoUmVhbCA+IDEyKVxyXG4gICAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9EQVRFKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgaWYgZGF5IG9mIHdlZWsgc3VpdGFibGUgKHJpZ2h0KSBmb3IgWWVhciwgTW9udGggYW5kIERheTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+dXNlciBpbnNlcnRlZCBzdHJpbmc8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tXZWVrKGRhdGU6IHN0cmluZyk6IFN0cmluZ0J1aWxkZXIge1xyXG5cclxuICAgIGxldCBkb3c6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuRE9XKTtcclxuXHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZ2V0TmV3RGF0ZUJyZWFrUGFyYW1zKCk7XHJcblxyXG4gICAgbGV0IGRhdGVNYWdpYzogbnVtYmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZShkYXRlLCB0aGlzLl9waWN0dXJlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGVNYWdpYywgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcblxyXG4gICAgbGV0IGRvd1JlYWw6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRvdztcclxuICAgIGlmIChkb3dSZWFsICE9PSBkb3dSZWFsKVxyXG4gICAgICBkYXRlID0gdGhpcy5jaGFuZ2VEb3coZGF0ZSwgZG93UmVhbCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKGRhdGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgaWYgdGhlIGNvbWJpbmF0aW9uIG9mIEphcGFuZXNlIGVyYSBhbmQgeWVhciBpcyB2YWxpZC48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyRGF0ZVwiPnVzZXIgaW5zZXJ0ZWQgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGRhdGUgc3RyaW5nIG9mIHByb3Blcmx5IEphcGFuZXNlIGVyYTwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrSnBuRXJhWWVhcihzdHJEYXRlOiBzdHJpbmcpOiBTdHJpbmdCdWlsZGVyIHtcclxuXHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZ2V0TmV3RGF0ZUJyZWFrUGFyYW1zKCk7XHJcbiAgICBsZXQgZGF0ZU1hZ2ljOiBudW1iZXIgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlKHN0ckRhdGUsIHRoaXMuX3BpY3R1cmUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGF0ZV9icmVha19kYXRlbW9kZShicmVha1BhcmFtcywgZGF0ZU1hZ2ljLCB0cnVlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBsZXQgaW50WWVhckFEOiBudW1iZXIgPSBicmVha1BhcmFtcy55ZWFyO1xyXG4gICAgbGV0IGludERveTogbnVtYmVyID0gYnJlYWtQYXJhbXMuZG95O1xyXG5cclxuICAgIC8vIGdldCB0aGUgbmFtZSBhbmQgYSB5ZWFyIG9mIHRoZSBlcmFcclxuICAgIGxldCBzdHJFcmFBbHBoYTogc3RyaW5nO1xyXG4gICAgbGV0IHN0ckVyYUthbmppOiBzdHJpbmc7XHJcblxyXG4gICAgc3RyRXJhQWxwaGEgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYShpbnRZZWFyQUQsIGludERveSwgZmFsc2UpO1xyXG4gICAgc3RyRXJhS2FuamkgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYShpbnRZZWFyQUQsIGludERveSwgdHJ1ZSk7XHJcblxyXG4gICAgbGV0IHN0clllYXJKcG5FcmE6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IG51bTogbnVtYmVyID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95ZWFyX29mcyhpbnRZZWFyQUQsIGludERveSk7XHJcbiAgICBpZiAobnVtIDw9IDApIHtcclxuICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgfVxyXG4gICAgaWYgKG51bSA8PSA5KSB7XHJcbiAgICAgIHN0clllYXJKcG5FcmEuQXBwZW5kKFwiMFwiKTtcclxuICAgIH1cclxuICAgIHN0clllYXJKcG5FcmEuQXBwZW5kKG51bS50b1N0cmluZygpKTtcclxuXHJcbiAgICAvLyBidWlsZCBhIHByb3Blcmx5IHllYXIgb2YgdGhlIGVyYVxyXG5cclxuICAgIC8vIEEgREJDUyBjaGFyYWN0ZXIgaW4gXCJzdHJcIiBjb25zdW1lcyB0d28gY2hhcmFjdGVycyBpbiBcIm1hc2tcIi5cclxuICAgIC8vIElmIFwic3RyXCIgY29udGFpbnMgREJDUywgdGhlIHBvc2l0aW9uIG9mIFwibWFza1wiIGhhcyB0byBza2lwIG5leHQgaW5kZXguXHJcbiAgICAvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNraXBwZWQgaW5kZXhlcy5cclxuICAgIGxldCBpbnRQaWNJZHhPZnM6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpbnRDbnQ6IG51bWJlciA9IDA7IGludENudCArIGludFBpY0lkeE9mcyA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBpbnRDbnQrKylcclxuICAgIHtcclxuICAgICAgc3dpdGNoICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoaW50Q250ICsgaW50UGljSWR4T2ZzKSlcclxuICAgICAge1xyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSlkxKTpcclxuICAgICAgICAgIHN0ckRhdGUgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQyhzdHJEYXRlLCBzdHJFcmFBbHBoYSwgaW50Q250ICsgMSwgMSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19KWTIpOlxyXG4gICAgICAgICAgc3RyRGF0ZSA9IFV0aWxTdHJCeXRlTW9kZS5yZXBDKHN0ckRhdGUsIHN0ckVyYUthbmppLCBpbnRDbnQgKyAxLCAxKTtcclxuICAgICAgICAgIGludFBpY0lkeE9mcysrOyAvLyBQSUNfSlkyIGNvbnN1bWVzIDIgY2hhcmFjdGVycyBvZiBwaWN0dXJlICgxIG1vcmUgdGhhbiBzdHJEYXRlKVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSlk0KTpcclxuICAgICAgICAgIHN0ckRhdGUgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQyhzdHJEYXRlLCBzdHJFcmFLYW5qaSwgaW50Q250ICsgMSwgMik7XHJcbiAgICAgICAgICBpbnRDbnQrKzsgLy8gUElDX0pZNCBjb25zdW1lcyAyIGNoYXJhY3RlcnMgb2Ygc3RyRGF0ZVxyXG4gICAgICAgICAgaW50UGljSWR4T2ZzICs9IDI7IC8vIFBJQ19KWTQgY29uc3VtZXMgNCBjaGFyYWN0ZXJzIG9mIHBpY3R1cmUgKDIgbW9yZSB0aGFuIHN0ckRhdGUpXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ZSik6XHJcbiAgICAgICAgICBzdHJEYXRlID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEMoc3RyRGF0ZSwgc3RyWWVhckpwbkVyYS50b1N0cmluZygpLCBpbnRDbnQgKyAxLCAyKTtcclxuICAgICAgICAgIGludENudCsrOyAvLyBQSUNfWUogY29uc3VtZXMgMiBjaGFyYWN0ZXJzIG9mIHN0ckRhdGVcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKGludENudCA8IHN0ckRhdGUubGVuZ3RoKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBpZiBcInN0ckRhdGVcIiBjb250YWlucyBEQkNTLCB0aGUgbmV4dCBpbmRleCBvZiBcInBpY3R1cmVcIiBoYXMgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChzdHJEYXRlW2ludENudF0pID09PSBmYWxzZSAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgodGhpcy5fcGljdHVyZVtpbnRDbnQgKyBpbnRQaWNJZHhPZnNdKSA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgICBpbnRQaWNJZHhPZnMrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKHN0ckRhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBtYXggbnVtYmVyIG9mIGRheSBpbiBtb250aDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5ZWFyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb250aFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBtYXggZGF5cyBbMjgtMzFdIG51bWJlcjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldE1heERheUluTW9udGgoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogbnVtYmVyW10gPSBbXHJcbiAgICAgIDAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFcclxuICAgIF07XHJcbiAgICBsZXQgbGVhcHllYXI6IGJvb2xlYW4gPSB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcclxuXHJcbiAgICBpZiAobGVhcHllYXIgJiYgbW9udGggPT09IDIpXHJcbiAgICAgIHJldHVybiBhcnJheVttb250aF0gKyAxO1xyXG5cclxuICAgICByZXR1cm4gYXJyYXlbbW9udGhdO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBtb250aCBmb3IgZGF5LCB0aGFuIGRheSBoYXZlIG1hc2sgREREPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInllYXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRheVwiPlswLTM2NV08L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbnVtYmVyIG9mIG1vbnRoPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TW9udGhCeURheSh5ZWFyOiBudW1iZXIsIGRheTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgTGVhcFllYXI6IGJvb2xlYW47XHJcblxyXG4gICAgTGVhcFllYXIgPSAoeWVhciAlIDQgPT09IDApICYmICgoeWVhciAlIDEwMCAhPT0gMCkgfHwgKHllYXIgJSA0MDAgPT09IDApKTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYi5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKCFMZWFwWWVhcilcclxuICAgICAge1xyXG4gICAgICAgIGlmIChQSUNJbnRlcmZhY2UuZGF0ZV9kYXlfdGFiW2ldID49IGRheSlcclxuICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGlzIExlYXAgWWVhclxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoaSA8IDMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbaV0gPj0gZGF5KVxyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYWRkIDEgZGF5IGFmdGVyIHNlY29uZCBtb250aFxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYltpXSArIDEgPj0gZGF5KVxyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gLy8gZm9yIGxvb3BcclxuICAgIHJldHVybiBpOyAvLyB0aGUgZnVuY3Rpb24gY2Fubid0IGNhbWUgdG8gdGhlIHN0YXRlbWVudCBhbnl0aW1lXHJcbiAgfVxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PmdldCBZZWFyfE1vbnRofERheXxEb3cgb2YgZGF0ZVxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj5kYXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbGVtZW50XCI+cmVxdWlyZWQgZGF0ZSBlbGVtZW50ICh5ZWFyL21vbnRoL2RheS9kb3cpIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlllYXJ8TW9udGh8RGF5fERvdyBvZiBkYXRlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RGF0ZUVsZW1lbnQoZGF0ZTogc3RyaW5nLCBlbGVtZW50OiBEYXRlRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGxldHRlcnM6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZXhpdExvb3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBwaWNXZWVrVHlwZTogbnVtYmVyID0gUElDSW50ZXJmYWNlLlBJQ19XV1c7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgIGxldCBpc0pwbkVyYVllYXI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgbGV0IGVyYV95ZWFyOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIEEgREJDUyBjaGFyYWN0ZXIgaW4gXCJkYXRlXCIgY29uc3VtZXMgdHdvIGNoYXJhY3RlcnMgaW4gXCJwaWN0dXJlXCIuXHJcbiAgICAvLyBJZiBcImRhdGVcIiBjb250YWlucyBEQkNTLCB0aGUgcG9zaXRpb24gb2YgXCJwaWN0dXJlXCIgaGFzIHRvIHNraXAgbmV4dCBpbmRleC5cclxuICAgIC8vIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygc2tpcHBlZCBpbmRleGVzLlxyXG4gICAgbGV0IGludFBpY0lkeE9mczogbnVtYmVyID0gMDsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG5cclxuICAgIGxldCBtaW5MZW46IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSlcclxuICAgICAgbWluTGVuID0gVXRpbFN0ckJ5dGVNb2RlLmdldE1pbkxlblBpY3R1cmUoZGF0ZSwgdGhpcy5fcGljdHVyZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIG1pbkxlbiA9IE1hdGgubWluKGRhdGUubGVuZ3RoLCB0aGlzLl9waWN0dXJlLmxlbmd0aCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSArIGludFBpY0lkeE9mcyA8IG1pbkxlbiAmJiAhZXhpdExvb3A7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKHRoaXMuaXNEYXRhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSlcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpKVxyXG4gICAgICAgIHtcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRBWSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0RERDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5EQVkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDMpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19EREREOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRBWSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7IC8vIG5vdCArNCBuZWVkIG5vdCBzdWZmaXggb2YgJ25kJywgJ3JkJywgJ3N0J1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpICs9IDM7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5NT05USClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTU1NOlxyXG4gICAgICAgICAgLy8gZ2V0IHNpemUgb2YgUElDX01NTSBibG9ja1xyXG4gICAgICAgICAgbGV0dGVycyA9IHRoaXMuZ2V0U2l6ZU9mQmxvY2soaSArIGludFBpY0lkeE9mcywgUElDSW50ZXJmYWNlLlBJQ19NTU0pO1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50Lk1PTlRIKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCBsZXR0ZXJzKTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkgKz0gbGV0dGVycyAtIDE7XHJcbiAgICAgICAgICBsZXR0ZXJzID0gMDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVk6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUilcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVlZWTpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCA0KTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSAzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRPVylcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMSk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfV1dXOlxyXG4gICAgICAgICAgbGV0dGVycyA9IHRoaXMuZ2V0U2l6ZU9mQmxvY2soaSArIGludFBpY0lkeE9mcywgUElDSW50ZXJmYWNlLlBJQ19XV1cpO1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRPVylcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgbGV0dGVycyk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpICs9IGxldHRlcnMgLSAxO1xyXG4gICAgICAgICAgbGV0dGVycyA9IDA7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWTpcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSEw6XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hERDpcclxuICAgICAgICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBmb3IgaGVicmV3IHlldFxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19CQjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfQkIpO1xyXG5cclxuICAgICAgICAgIGlmIChpICsgTWF0aC5mbG9vcihsZXR0ZXJzIC8gMikgPCBkYXRlLmxlbmd0aClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgTWF0aC5mbG9vcihsZXR0ZXJzIC8gMikpO1xyXG4gICAgICAgICAgICAvLyBpZiBkYXRlIGNvbnRhaW5zIERCQ1MsIHNvbWUgaW5kZXhlcyBvZiBwaWN0dXJlIGhhdmUgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgICAgICAgaW50UGljSWR4T2ZzICs9IGxldHRlcnMgLSBidWZmZXIubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ET1cpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgcGljV2Vla1R5cGUgPSBQSUNJbnRlcmZhY2UuUElDX0JCO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGkgKz0gbGV0dGVycyAtIDE7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMTogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlzSnBuRXJhWWVhciA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlzSnBuRXJhWWVhciA9IHRydWU7XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSlk0OiAgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgaXNKcG5FcmFZZWFyID0gdHJ1ZTtcclxuICAgICAgICAgIGludFBpY0lkeE9mcyArPSAyO1xyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZSjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCAyKTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSAvLyBzd2l0Y2ggb2YgcG9zaXRpb25hbCBkaXJlY3RpdmVzXHJcbiAgICAgICAgfSAvLyBpZiBvZiBwb3NpdGlvbmFsIGRpcmVjdGl2ZXNcclxuICAgIH0gLy8gZm9yIGxvb3AgaW4gcGljdHVyZVxyXG5cclxuICAgIGlmIChidWZmZXIgPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LllFQVIpXHJcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lLk5vdy5ZZWFyO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcblxyXG4gICAgYnVmZmVyID0gYnVmZmVyLnRyaW0oKTtcclxuXHJcbiAgICBpZiAobGV0dGVycyA+IDApXHJcbiAgICAvLyBpdCdzIFBJQ19XV1cgb3IgUElDX01NTVxyXG4gICAge1xyXG4gICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuTU9OVEgpXHJcbiAgICAgICAgbGV0dGVycyA9IHRoaXMuZ2V0TW9udGhPcldlZWsoYnVmZmVyLnRvU3RyaW5nKCksIGxldHRlcnMsIFBJQ0ludGVyZmFjZS5QSUNfTU1NKTtcclxuICAgICAgZWxzZSBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuRE9XKVxyXG4gICAgICAgIGxldHRlcnMgPSB0aGlzLmdldE1vbnRoT3JXZWVrKGJ1ZmZlci50b1N0cmluZygpLCBsZXR0ZXJzLCBwaWNXZWVrVHlwZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIHdoaWxlIChidWZmZXIudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiMFwiKSB8fCBidWZmZXIudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiIFwiKSlcclxuICAgICAgICBidWZmZXIgPSBidWZmZXIudG9TdHJpbmcoKS5zdWJzdHIoMSk7XHJcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKVxyXG4gICAgICAgIGxldHRlcnMgPSAwO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgbGV0dGVycyA9IE5OdW1iZXIuUGFyc2UoYnVmZmVyLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSICYmIGlzSnBuRXJhWWVhcilcclxuICAgIHtcclxuICAgICAgLy8gZ2V0IHRoZSBzdGFydCB5ZWFyIG9mIHRoZSBlcmFcclxuICAgICAgZXJhX3llYXIgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmdldFN0YXJ0WWVhck9mRXJhKGRhdGUsIHRoaXMuX3BpY3R1cmUpO1xyXG4gICAgICBpZiAoZXJhX3llYXIgPT09IDApXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIGxldHRlcnMgKz0gZXJhX3llYXIgLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsZXR0ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoYW5nZSBkYXkgbnVtYmVyIGluIGRhdGUgZmllbGQgdG8gZGF5TWF4PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj50byBjaGFuZ2UgZGF5IGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRheU1heFwiPnRoZSBuZXcgZGF5IHZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGNoYW5nZURvdyhkYXRlOiBzdHJpbmcsIGRvdzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBpc0RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXI7XHJcbiAgICBsZXQgc3RhcnRQYXJ0OiBzdHJpbmc7XHJcbiAgICBsZXQgZmluaXNoUGFydDogc3RyaW5nO1xyXG4gICAgbGV0IG51bWJlcjE6IHN0cmluZztcclxuXHJcbiAgICBudW1iZXIxID0gXCJcIiArIGRvdzsgLy8gXCIgXCJcclxuXHJcbiAgICAvLyBBIERCQ1MgY2hhcmFjdGVyIGluIFwiZGF0ZVwiIGNvbnN1bWVzIHR3byBjaGFyYWN0ZXJzIGluIFwicGljdHVyZVwiLlxyXG4gICAgLy8gSWYgXCJkYXRlXCIgY29udGFpbnMgREJDUywgdGhlIHBvc2l0aW9uIG9mIFwicGljdHVyZVwiIGhhcyB0byBza2lwIG5leHQgaW5kZXguXHJcbiAgICAvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNraXBwZWQgaW5kZXhlcy4gKEpQTjogREJDUyBzdXBwb3J0KVxyXG4gICAgbGV0IGludFBpY0lkeE9mczogbnVtYmVyID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpICsgaW50UGljSWR4T2ZzIDwgdGhpcy5fcGljdHVyZS5sZW5ndGggJiYgIWlzRGF0ZTsgaSsrKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5pc0RhdGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmVbaSArIGludFBpY0lkeE9mc10pKVxyXG4gICAgICB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoaSArIGludFBpY0lkeE9mcykpXHJcbiAgICAgICAge1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVzpcclxuICAgICAgICAgIHN0YXJ0UGFydCA9IGRhdGUuc3Vic3RyKDAsIGkpO1xyXG4gICAgICAgICAgZmluaXNoUGFydCA9IGRhdGUuc3Vic3RyKGkgKyAxKTtcclxuICAgICAgICAgIGRhdGUgPSBzdGFydFBhcnQgKyBudW1iZXIxICsgZmluaXNoUGFydDtcclxuICAgICAgICAgIGlzRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1dXVzpcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfV1dXKTtcclxuICAgICAgICAgIHN0YXJ0UGFydCA9IGRhdGUuc3Vic3RyKDAsIGkpO1xyXG4gICAgICAgICAgZmluaXNoUGFydCA9IGRhdGUuc3Vic3RyKGkgKyBsZXR0ZXJzKTtcclxuICAgICAgICAgIGxldCBkYXlTdHI6IHN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKE1zZ0ludGVyZmFjZS5EQVlTX1BUUik7XHJcbiAgICAgICAgICBsZXQgZGF5TmFtZXM6IHN0cmluZ1tdID0gRGF0ZVV0aWwuZ2V0TG9jYWxEYXlzKGRheVN0cik7XHJcbiAgICAgICAgICBudW1iZXIxID0gZGF5TmFtZXNbZG93XTtcclxuXHJcbiAgICAgICAgICBpZiAobnVtYmVyMS5sZW5ndGggPiBsZXR0ZXJzKVxyXG4gICAgICAgICAgICBudW1iZXIxID0gbnVtYmVyMS5zdWJzdHIoMCwgbGV0dGVycyk7XHJcbiAgICAgICAgICBlbHNlIGlmIChudW1iZXIxLmxlbmd0aCA8IGxldHRlcnMpXHJcbiAgICAgICAgICAgIHdoaWxlIChudW1iZXIxLmxlbmd0aCA8IGxldHRlcnMpXHJcbiAgICAgICAgICAgICAgbnVtYmVyMSA9IG51bWJlcjEgKyAnICc7XHJcbiAgICAgICAgICBkYXRlID0gc3RhcnRQYXJ0ICsgbnVtYmVyMSArIGZpbmlzaFBhcnQ7XHJcbiAgICAgICAgICBpc0RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19CQjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfQkIpO1xyXG4gICAgICAgICAgLy8gXCJsZXR0ZXJzXCIgbWVhbnMgYSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBcInBpY3R1cmVcIlxyXG5cclxuICAgICAgICAgIHN0YXJ0UGFydCA9IGRhdGUuc3Vic3RyKDAsIGkpO1xyXG4gICAgICAgICAgZmluaXNoUGFydCA9IGRhdGUuc3Vic3RyKGkgKyBNYXRoLmZsb29yKGxldHRlcnMgLyAyKSk7XHJcbiAgICAgICAgICAvLyBcImxldHRlcnMgLyAyXCIgbWVhbnMgYSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBcImRhdGVcIlxyXG5cclxuICAgICAgICAgIG51bWJlcjEgPSBVdGlsRGF0ZUpwbi5nZXRTdHJEb3coZG93KTtcclxuXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIobnVtYmVyMSkgPiBsZXR0ZXJzKVxyXG4gICAgICAgICAgICBudW1iZXIxID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKG51bWJlcjEsIGxldHRlcnMpO1xyXG4gICAgICAgICAgZWxzZSBpZiAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIobnVtYmVyMSkgPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICB3aGlsZSAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIobnVtYmVyMSkgPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICAgIG51bWJlcjEgPSBudW1iZXIxICsgJyAnO1xyXG4gICAgICAgICAgZGF0ZSA9IHN0YXJ0UGFydCArIG51bWJlcjEgKyBmaW5pc2hQYXJ0O1xyXG4gICAgICAgICAgaXNEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpXHJcbiAgICAgICAgICAvLyBKUE46IERCQ1Mgc3VwcG9ydFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoaSA8IGRhdGUubGVuZ3RoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLy8gaWYgXCJkYXRlXCIgY29udGFpbnMgREJDUywgdGhlIG5leHQgaW5kZXggb2YgXCJwaWN0dXJlXCIgaGFzIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChkYXRlW2ldKSA9PT0gZmFsc2UgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHRoaXMuX3BpY3R1cmVbaSArIGludFBpY0lkeE9mc10pID09PSB0cnVlKVxyXG4gICAgICAgICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9IC8vIHN3aXRjaFxyXG4gICAgICAgIH0gLy8gaWYgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmVzXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIFRpbWUgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja1RpbWVGaWVsZCgpOiBEYXRlIHtcclxuICAgIGxldCBuZXdUaW1lOiBEYXRlID0gbmV3IERhdGUgKHRoaXMuX25ld3ZhbHVlKTtcclxuXHJcblxyXG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5pc0RhdGVaZXJvKHRoaXMuX25ld3ZhbHVlKSkge1xyXG4gICAgICAvLyBnZXQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZmllbGRcclxuICAgICAgbGV0IGRlZmF1bHRNZ1ZhbHVlOiBzdHJpbmcgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZpZWxkKCkuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgIG5ld1RpbWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AoZGVmYXVsdE1nVmFsdWUsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcblxyXG4gICAgICAvLyByYW5nZSBvZiB0aGUgdGltZVxyXG4gICAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPSBudWxsKVxyXG4gICAgICAgIG5ld1RpbWUgPSB0aGlzLmZpbGxUaW1lQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCksIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdUaW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkFkZCBmb3VuZCBpbiBuZXd2YWx1ZSBudW1iZXJzKDIob3IgMSkgbGV0dGVycykgdG8gYnVmZmVyIGFuZCByZXR1cm5cclxuICAvLy8gbGFzdCBmb3VuZCBudW1iZXIgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJWYWx1ZVwiPmluIG5ld3ZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJidWZmZXJcIj4vLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0eXBlXCI+d2hpY2ggdHlwZSBvZiBwb3NpdGlvbmFsIGRpcmVjdGl2ZSwgZm9yIGNoZWNraW5nIHZhbGlkaXR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGN1cnJWYWx1ZSBpbiBuZXd2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGFkZDJUaW1lKGN1cnJWYWx1ZTogbnVtYmVyLCBidWZmZXI6IFN0cmluZ0J1aWxkZXIsIHR5cGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGN1cnJWYWx1ZTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgU1RSXzAwOiBTdHJpbmcgPSBcIjAwXCI7XHJcbiAgICBsZXQgIGN1cnJBZGQ6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG5cclxuICAgIHdoaWxlIChzdGFydCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWVbc3RhcnRdKSlcclxuICAgIHtcclxuICAgICAgc3RhcnQrKzsgLy8gZmluZCBmaXJzdCBkaWdpdFxyXG4gICAgICAvLyBub24tZGlnaXRzIHdlcmUgZm91bmQgaW4gaW5wdXQgc3RyaW5nXHJcbiAgICAgIC8vIHdlIGRvIG5vdCB0aHJvdyBTVFJfRVJSX1RJTUUgZXhjZXB0aW9uIHRvIHByZXZlbnQgaW5wdXQgZGlnaXRzIGxvc3RcclxuICAgICAgLy8gb24gbm9uLWRpZ2l0cyBwbGFjZSBTVFJfMDAgd2lsbCBiZSBhZGRlZFxyXG4gICAgICAvLyBTaW5jZSBNYXNrIEVkaXRpbmcgLiBUaGlzIGVycm9yIGlzIGlycmVsZXZhbnQuIFRpbWUgbm93LCBhbHdheXMgY29udGFpbnMgbm9uIGRpZ2l0cyBsaWtlIDogYW5kIG1pZ2h0IGNvbnRhaW4gJyAnIGZvciB1bmZpbGxlZCBjaGFycy5cclxuICAgICAgLy8gVGhpcyBpcyBhIHZhbGlkIGNhc2UgYW5kIHdlIGRvIG5vdCB3YW50IGFuIGVycm9yIHBvcHBpbmcgYWJvdXQgaXQuXHJcbiAgICAgIC8vICBndWlNYW5hZ2VyLndyaXRlVG9NZXNzYWdlUGFuZSh2YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCksIENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TWVzc2FnZVN0cmluZyhTVFJfRVJSX1RJTUUpLCBTdGF0dXNCYXJNZXNzYWdlVHlwZS5TQl9SVU5USU1FX01TRyk7XHJcbiAgICAgIC8vICBzZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGFydCA9PT0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoKVxyXG4gICAgLy8gbm90IGZvdW5kIG1vcmUgZGlnaXRzXHJcbiAgICB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoU1RSXzAwLnRvU3RyaW5nKCkpO1xyXG4gICAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyAyICYmIGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW2ldKSlcclxuICAgICAgICBjdXJyQWRkLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZVtpXSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAge1xyXG4gICAgICAgIGN1cnJBZGQuSW5zZXJ0KDAsICcwJyk7IC8vIG9ubHkgMSBkaWdpdCBmb3VuZFxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGkgPT09IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiBpID09PSBzdGFydCArIDEpXHJcbiAgICAgIGN1cnJBZGQuSW5zZXJ0KDAsICcwJyk7XHJcbiAgICAvLyBvbmx5IDEgZGlnaXQgZm91bmRcclxuICAgIGVsc2UgaWYgKGkgPT09IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiBpID09PSBzdGFydClcclxuICAgICAgY3VyckFkZC5BcHBlbmQoU1RSXzAwLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgIGxldCBhZGQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAvKmlmIChhZGQgPCAwKVxyXG4gICAgY3VyckFkZD1uZXcgU3RyaW5nQnVmZmVyKFwiMDBcIik7XHJcbiAgICBlbHNlIGlmIChhZGQgPiA1OSAmJiB0eXBlPT1QSUNfTU1UKVxyXG4gICAgY3VyckFkZD1uZXcgU3RyaW5nQnVmZmVyKFwiNTlcIik7XHJcbiAgICBlbHNlIGlmIChhZGQgPiA1OSAmJiB0eXBlPT1QSUNfU1MpXHJcbiAgICBjdXJyQWRkPW5ldyBTdHJpbmdCdWZmZXIoXCI1OVwiKTsqL1xyXG4gICAgaWYgKGFkZCA8IDAgfHwgKGFkZCA+IDU5ICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1UKSB8fCAoYWRkID4gNTkgJiYgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19TUykpXHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9USU1FKTtcclxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEgpXHJcbiAgICB7XHJcbiAgICAgIGxldCBQTTogYm9vbGVhbiA9IHRoaXMuZ2V0SXNQTSgpO1xyXG4gICAgICBsZXQgbmV3U3RyOiBTdHJpbmcgPSBudWxsO1xyXG4gICAgICBsZXQgZGlmOiBudW1iZXI7XHJcblxyXG4gICAgICBpZiAoKGFkZCA+PSAxMiB8fCBhZGQgPT09IDApICYmIFBNKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IGFkZFRtcDogbnVtYmVyID0gYWRkICUgMjQ7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzUG0gPSAoYWRkVG1wID49IDEyICYmIGFkZFRtcCA8IDI0KTtcclxuXHJcbiAgICAgICAgaWYgKGFkZFRtcCA+IDEyKVxyXG4gICAgICAgICAgZGlmID0gYWRkVG1wIC0gMTI7XHJcbiAgICAgICAgZWxzZSBpZiAoYWRkVG1wID09PSAwKVxyXG4gICAgICAgICAgZGlmID0gMTI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZGlmID0gYWRkVG1wO1xyXG5cclxuICAgICAgICBuZXdTdHIgPSAoKGRpZiA+IDkgPyBcIlwiIDogXCIwXCIpICsgZGlmKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChhZGQgPiA5OSAmJiAhUE0pXHJcbiAgICAgICAgbmV3U3RyID0gXCI5OVwiO1xyXG5cclxuICAgICAgaWYgKG5ld1N0ciAhPSBudWxsKVxyXG4gICAgICB7XHJcbiAgICAgICAgY3VyckFkZC5SZW1vdmUoMCwgY3VyckFkZC5MZW5ndGgpO1xyXG4gICAgICAgIGN1cnJBZGQuQXBwZW5kKG5ld1N0ci50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJ1ZmZlci5BcHBlbmQoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuICAgIHJldHVybiBpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkFwcGVuZCBQTSBvciBBTSB0byB0aW1lPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYWRkUE0yVGltZShjdXJyVmFsdWU6IG51bWJlciwgYnVmZmVyOiBTdHJpbmdCdWlsZGVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKChpID0gdGhpcy5fbmV3dmFsdWUudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiQU1cIiwgY3VyclZhbHVlKSkgIT09IC0xKVxyXG4gICAge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKFwiYW1cIik7XHJcbiAgICAgIHJldHVybiBpICsgMjtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgaWYgKChpID0gdGhpcy5fbmV3dmFsdWUudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiUE1cIiwgY3VyclZhbHVlKSkgIT09IC0xKVxyXG4gICAgICB7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcInBtXCIpO1xyXG4gICAgICAgIHJldHVybiBpICsgMjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLl9pc1BtKVxyXG4gICAgICB7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcInBtXCIpO1xyXG4gICAgICAgIHJldHVybiBjdXJyVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJhbVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q2hlY2sgaWYgd2hlcmUgaXMgJ1BNJyBwb3NpdGlvbmFsIGRpcmVjdGl2ZSBpbiB0aGUgVGltZSBQaWN0dXJlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSAtIHRoZXJlIGlzIFBNLCBlbHNlIGZhbHNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0SXNQTSgpOiBib29sZWFuIHtcclxuXHJcbiAgICBmb3IgKGxldCBjdXJyOiBudW1iZXIgPSAwOyBjdXJyIDwgdGhpcy5fcGljdHVyZS5sZW5ndGg7IGN1cnIrKylcclxuICAgIHtcclxuICAgICAgaWYgKHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChjdXJyKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19QTSlcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbGxUaW1lQnlSYW5nZShDb250aW51b3VzUmFuZ2U6IExpc3Q8c3RyaW5nPiwgRGlzY3JldGVSYW5nZTogTGlzdDxzdHJpbmc+LCBidWZmZXI6IERhdGUpOiBEYXRlIHtcclxuICAgIGxldCAgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICBsZXQgIGN1cnJUaW1lOiBudW1iZXIgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZyb21OYXRpdmVUaW1lVG9NZ1RpbWVOdW1iZXIoYnVmZmVyLCBwaWMpO1xyXG4gICAgbGV0IGRvd25UaW1lOiBudW1iZXIsIHRvcFRpbWU6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgIGlmIChDb250aW51b3VzUmFuZ2UgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZS5sZW5ndGggLSAxOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBkb3duVGltZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX3RpbWUoQ29udGludW91c1JhbmdlLmdldF9JdGVtKGkpLCBwaWMsIGZhbHNlKTtcclxuICAgICAgICB0b3BUaW1lID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfdGltZShDb250aW51b3VzUmFuZ2UuZ2V0X0l0ZW0oKytpKSwgcGljLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGN1cnJUaW1lID49IGRvd25UaW1lICYmIGN1cnJUaW1lIDw9IHRvcFRpbWUpXHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYnVmZmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEaXNjcmV0ZVJhbmdlICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBEaXNjcmV0ZVJhbmdlLmxlbmd0aDsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGN1cnJUaW1lID09PSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl90aW1lKERpc2NyZXRlUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgZmFsc2UpKVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGJ1ZmZlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoZSB0aW1lIGlzIG5vdCBpbiB0aGUgcmFuZ2VcclxuICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLy8gU0VSVklDRSBmdW5jdGlvbnNcclxuICAvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwcmludCBFUlJPUiBwcm9tcHQgbWVzc2FnZSBhYm91dCByYW5nZSB0byBzdGF0dXMgYmFyPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ0lkXCI+b2YgZXJyb3IgTWVzc2FnZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2V0VmFsaWRhdGlvbkZhaWxkXCI+dmFsaWRhdGlvbiBmYWlsZWQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgcHJpbnRNZXNzYWdlKG1zZ0lkOiBzdHJpbmcsIHNldFZhbGlkYXRpb25GYWlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihcIlwiKTtcclxuICAgIGxldCBjdHJsVHlwZTogTWdDb250cm9sVHlwZTtcclxuXHJcbiAgICBpZiAobXNnSWQgPT09IE1zZ0ludGVyZmFjZS5FRFRfRVJSX1NUUl8xKVxyXG4gICAge1xyXG4gICAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICAgIGxldCB0b2tlbjogc3RyaW5nID0gXCIlZFwiO1xyXG4gICAgICBsZXQgbWVzc2FnZVN0cmluZzogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcobXNnSWQpO1xyXG4gICAgICBtZXNzYWdlU3RyaW5nID0gU3RyVXRpbC5yZXBsYWNlU3RyaW5nVG9rZW5zKG1lc3NhZ2VTdHJpbmcsIHRva2VuLCAxLCBwaWMuZ2V0V2hvbGVzKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgIG1lc3NhZ2VTdHJpbmcgPSBTdHJVdGlsLnJlcGxhY2VTdHJpbmdUb2tlbnMobWVzc2FnZVN0cmluZywgdG9rZW4sIDEsIHBpYy5nZXREZWMoKS50b1N0cmluZygpKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQobWVzc2FnZVN0cmluZyk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKG1zZ0lkKSk7XHJcbiAgICAgIGlmIChtc2dJZCA9PT0gTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhUICYmIHRoaXMuX3ZhbERldC5nZXRSYW5nZSgpICE9IG51bGwpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoU3RyVXRpbC5tYWtlUHJpbnRhYmxlVG9rZW5zKHRoaXMuX3ZhbERldC5nZXRSYW5nZSgpLCBIVE1MXzJfU1RSKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgY3RybFR5cGUgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLlR5cGU7XHJcbiAgICAgIGlmIChjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OICYmIGN0cmxUeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyAmJiAhdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5pc1NlbGVjdGlvbkN0cmwoKSlcclxuICAgICAge1xyXG4gICAgICAgIGxldCBtc2dTdHJpbmc6IHN0cmluZyA9IG1lc3NhZ2UuVG9TdHJpbmcoKTtcclxuICAgICAgICB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuV3JpdGVUb01lc3NhZ2VQYW5lKFN0clV0aWwubWFrZVByaW50YWJsZTIobXNnU3RyaW5nKSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuRXJyb3JPY2N1cmVkID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShtc2dTdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuX3ZhbERldC5FcnJvck1lc3NhZ2UgPSBtZXNzYWdlLlRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChzZXRWYWxpZGF0aW9uRmFpbGQpXHJcbiAgICAvLyBmcm9tIHRoaXMgcG9pbnQgdGhlIGZvY3VzIHNlbmQgYmFjayB0byBjb250cm9sIGFuZCBzZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpIGNhbiBub3Qgc2V0IGl0IHRvIHRydWVcclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoYW5nZSBpbnNpZGUgJ25ld3ZhbHVlJyBzdWJzdHJpbmcgb24gcG9zaXRpb24gJ2luZGV4JyB0byBzdHJpbmcgJ3RvJzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXd2YWx1ZVwiPnRvIGNoYW5nZSBpbnNpZGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRvXCI+c3RyaW5nIHRvIGNoYW5nZSBieSBoaW08L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImluZGV4XCI+dGhlIHN1YnN0cmluZyB0byBjaGFuZ2Ugb24gdGhlIHBvc2l0aW9uPC9wYXJhbT5cclxuICBwcml2YXRlIGNoYW5nZVN0cmluZ0luc2lkZSh0bzogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cigwLCBpbmRleCkgKyB0byArICB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoaW5kZXggKyB0by5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0KHZhbGlkYXRpb25EZXRhaWxzOiBWYWxpZGF0aW9uRGV0YWlscyk6IHZvaWQge1xyXG4gICAgdGhpcy5fdmFsRGV0ID0gdmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICB0aGlzLl92YWxEZXQuc2V0TnVsbChmYWxzZSk7XHJcbiAgICB0aGlzLl9pc1BtID0gZmFsc2U7XHJcbiAgICBsZXQgcElDOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICB0aGlzLl9vbGR2YWx1ZSA9IHRoaXMuX3ZhbERldC5nZXRPbGRWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl92YWxEZXQuZ2V0RGlzcFZhbHVlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX25ld3ZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIGlmIChwSUMgPT0gbnVsbCAgfHwgcElDLmdldEF0dHIoKSAhPSBTdG9yYWdlQXR0cmlidXRlLkRBVEUpXHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9vbGR2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9vbGR2YWx1ZSA9IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEocElDID09PSBudWxsIHx8IHBJQy5nZXRBdHRyKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCBwSUMuZ2V0QXR0cigpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSkge1xyXG4gICAgICB0aGlzLl9waWN0dXJlID0gcElDLmdldE1hc2soKTtcclxuICAgICAgdGhpcy5oZWJyZXcgPSBwSUMuaXNIZWJyZXcoKTtcclxuICAgICAgdGhpcy5fcGljdHVyZSA9IHRoaXMuX3BpY3R1cmUuc3Vic3RyKDAsIHBJQy5nZXRNYXNrU2l6ZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5SZXR1cm4gaW5kZXggb2YgTWF4IG1lbWJlciBpbiBhcnJheTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbmRNYXgoYXJyYXk6IG51bWJlcltdKTogbnVtYmVyIHtcclxuICAgIGxldCBpbmRleDogbnVtYmVyID0gMDtcclxuICAgIGxldCBtYXg6IG51bWJlciA9IGFycmF5W2luZGV4XTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKGFycmF5W2ldID4gbWF4KVxyXG4gICAgICB7XHJcbiAgICAgICAgbWF4ID0gYXJyYXlbaV07XHJcbiAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5pcyBjaGVja2VkIGNoYXIgRGF0YSBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzRGF0YVBvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVkgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0REIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0RERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19EREREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1dcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfV1dXIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ITCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWUpcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkxIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpOyAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIE51bWVyaWMgRGF0YSBQb3NpdGlvbmFsIERpcmVjdGl2ZSBleGlzdHM8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc0RhdGVQb3NpdGlvbmFsTnVtZXJpY0RpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWVlZIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX01NRCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ERFxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19EREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfRERERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWVxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ITCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWUogfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkxXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpOyAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgY2hhciBOdW1lcmljIFBvc2l0aW9uYWwgRGlyZWN0aXZlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNOdW1lcmljUG9zaXRpb25hbERpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19OKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+aXMgY2hlY2tlZCBjaGFyIExvZ2ljIFBvc2l0aW9uYWwgRGlyZWN0aXZlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNMb2dpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkZpbmQgaWYgdGhlIGxldHRlciBhdCBpbmRleCBpcyBQb3NpdGlvbmFsIERhdGUgRGlyZWN0aXZlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNoYXJcIj50byBjaGVjayBpbiBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgUG9zaXRpb25hbCBEYXRlIERpcmVjdGl2ZTsgZmFsc2Ugb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaXNUaW1lUG9zaXRpb25hbERpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ISCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTVQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfU1MgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfUE0gfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTVMpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pcyBjaGVja2VkIHN0cmluZyBQb3NpdGlvbmFsIERpcmVjdGl2ZSBvZiBhbnkgdHlwZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmdWxsL3BhcnRcIj5vZiBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbmRleCBvZiBkaXJlY3RpdmUgcG9zaXRpb24gb3IgLTEgaWYgbm90IGZvdW5kPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW5kZXhPZlBvc2l0aW9uYWxOb25EaXJlY3RpdmUoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcDogc3RyaW5nO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIHRtcCA9IHN0cltpXTtcclxuICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSB8fCB0aGlzLmlzRGF0YVBvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSB8fCB0aGlzLmlzTnVtZXJpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG1wKVxyXG4gICAgICAgIHx8IHRoaXMuaXNMb2dpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSB8fCB0aGlzLmlzVGltZVBvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSlcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgcmV0dXJuIGk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHNldCB0aGUgXCJ2YWxpZGF0aW9uIGZhaWxlZFwiIGZsYWc8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+dmFsdWUgdG8gdXNlPC9wYXJhbT5cclxuICBwcml2YXRlIHNldFZhbGlkYXRpb25GYWlsZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LlZhbGlkYXRpb25GYWlsZWQpXHJcbiAgICAgIHJldHVybjtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fdmFsRGV0LnNldFZhbGlkYXRpb25GYWlsZWQodmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ291bnQgZGlnaXRzIGluIHN0cmluZyBiZWZvcmUgZGVsaW1ldGVyPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlucHV0U3RyaW5nXCI+LSBzdHJpbmcgdG8gbG9vayBpbnRvIGZvciBkZWxpbWV0ZXI8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlYXJjaFN0YXJ0XCI+LSBpbml0aWFsIGluZGV4IHBvc2l0aW9uIGZvciBzZWFyY2ggaW4gaW5wdXRTdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlbGltZXRlclwiPndlIGFyZSBsb29raW5nIGZvcjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBkaWdpdHNCZWZvcmVEZWxpbWV0ZXIoaW5wdXRTdHJpbmc6IHN0cmluZywgc2VhcmNoU3RhcnQ6IG51bWJlciwgZGVsaW1ldGVyOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IGNvdW50ZXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgc2VhcmNoRW5kUG9zOiBudW1iZXIgPSBpbnB1dFN0cmluZy5pbmRleE9mKGRlbGltZXRlciwgc2VhcmNoU3RhcnQpO1xyXG5cclxuICAgIGlmIChzZWFyY2hFbmRQb3MgPCAwKVxyXG4gICAgICBzZWFyY2hFbmRQb3MgPSBpbnB1dFN0cmluZy5sZW5ndGg7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gc2VhcmNoU3RhcnQ7IGkgPCBzZWFyY2hFbmRQb3M7IGkrKylcclxuICAgIGlmIChOQ2hhci5Jc0RpZ2l0KGlucHV0U3RyaW5nW2ldKSlcclxuICAgICAgY291bnRlcisrO1xyXG5cclxuICAgIHJldHVybiBjb3VudGVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBieSBDdHJsK1UgKFNldCB0byBOdWxsKSwgbnVsbCBkaXNwbGF5IHZhbHVlIGlzIHNldCB0byBjdHJsLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCBmb2xsb3dpbmcgY2hlY2tpbmcgLCBpbiBvcmRlciB0byBzZXQgZmllbGQgdG8gbnVsbC48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+LSBlbnRlcmVkIHZhbHVlIHRvIHZhbHVlIHRvIGNoZWNrPC9wYXJhbT5cclxuICBwcml2YXRlIGlzTnVsbERpc3BsYXlWYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNOdWxsRGlzcGxheVZhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZpZWxkKCk7XHJcblxyXG4gICAgaWYgKGZpZWxkLk51bGxBbGxvd2VkICYmIGZpZWxkLmhhc051bGxEaXNwbGF5VmFsdWUoKSlcclxuICAgIHtcclxuICAgICAgbGV0IGRpc3BEZWZWYWx1ZTogYW55ID0gZmllbGQuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgaWYgKGRpc3BEZWZWYWx1ZSAhPT0gbnVsbClcclxuICAgICAgICBpc051bGxEaXNwbGF5VmFsID0gKGRpc3BEZWZWYWx1ZS50b1N0cmluZygpID09PSB0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBpc051bGxEaXNwbGF5VmFsID0gKHRoaXMuX25ld3ZhbHVlID09PSBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNOdWxsRGlzcGxheVZhbDtcclxuICB9XHJcbn1cclxuIl19
|