@magic-xpa/gui 4.1100.0-dev4110.25 → 4.1100.0-dev4110.252
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/{esm2020 → esm2022}/index.mjs +71 -71
- package/{esm2020 → esm2022}/magic-xpa-gui.mjs +1 -1
- package/esm2022/src/Commands.mjs +184 -0
- package/esm2022/src/Events.mjs +425 -0
- package/esm2022/src/EventsProcessor.mjs +67 -0
- package/esm2022/src/FocusManager.mjs +34 -0
- package/esm2022/src/GuiConstants.mjs +68 -0
- package/{esm2020 → esm2022}/src/GuiEnums.mjs +299 -299
- package/esm2022/src/GuiEnvironment.mjs +4 -0
- package/{esm2020 → esm2022}/src/IFlowMonitorQueue.mjs +1 -1
- package/{esm2020 → esm2022}/src/Manager.mjs +91 -91
- package/esm2022/src/UIBridge.mjs +33 -0
- package/{esm2020 → esm2022}/src/env/IEnvironment.mjs +1 -1
- package/{esm2020 → esm2022}/src/gui/ControlBase.mjs +2 -2
- package/esm2022/src/gui/GuiMgControl.mjs +123 -0
- package/{esm2020 → esm2022}/src/gui/GuiMgForm.mjs +3 -3
- package/esm2022/src/gui/KeyboardItem.mjs +135 -0
- package/esm2022/src/gui/LastFocusedVal.mjs +11 -0
- package/esm2022/src/gui/MgValue.mjs +16 -0
- package/{esm2020 → esm2022}/src/gui/PropParentInterface.mjs +1 -1
- package/{esm2020 → esm2022}/src/gui/low/DialogHandler.mjs +6 -6
- package/esm2022/src/gui/low/GuiCommand.mjs +68 -0
- package/esm2022/src/gui/low/GuiCommandQueue.mjs +35 -0
- package/esm2022/src/gui/low/GuiInteractive.mjs +177 -0
- package/esm2022/src/gui/low/Style.mjs +20 -0
- package/esm2022/src/management/RuntimeContextBase.mjs +42 -0
- package/esm2022/src/management/data/BlobType.mjs +281 -0
- package/{esm2020 → esm2022}/src/management/data/DcValues.mjs +214 -214
- package/esm2022/src/management/data/DcValuesBuilderBase.mjs +96 -0
- package/esm2022/src/management/data/FieldDef.mjs +331 -0
- package/esm2022/src/management/data/FieldsTable.mjs +54 -0
- package/esm2022/src/management/data/GuiDataViewBase.mjs +88 -0
- package/esm2022/src/management/data/GuiFieldBase.mjs +82 -0
- package/{esm2020 → esm2022}/src/management/data/IRecord.mjs +1 -1
- package/{esm2020 → esm2022}/src/management/data/IReferencedObject.mjs +1 -1
- package/esm2022/src/management/data/NUM_TYPE.mjs +1739 -0
- package/esm2022/src/management/data/ObjectReferenceBase.mjs +48 -0
- package/esm2022/src/management/data/ObjectReferencesCollection.mjs +27 -0
- package/esm2022/src/management/data/RecordUtils.mjs +361 -0
- package/esm2022/src/management/data/VectorType.mjs +612 -0
- package/esm2022/src/management/data/VectorTypeBase.mjs +88 -0
- package/{esm2020 → esm2022}/src/management/events/IActionManager.mjs +1 -1
- package/{esm2020 → esm2022}/src/management/events/IGuiEventsManager.mjs +1 -1
- package/esm2022/src/management/exp/ExpressionInterface.mjs +244 -0
- package/{esm2020 → esm2022}/src/management/exp/GuiExpressionEvaluator.mjs +305 -307
- package/esm2022/src/management/gui/ControlTable.mjs +118 -0
- package/esm2022/src/management/gui/DisplayConvertor.mjs +1649 -0
- package/esm2022/src/management/gui/FieldValidator.mjs +711 -0
- package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +24 -0
- package/{esm2020 → esm2022}/src/management/gui/GuiFormPropertyAdapter.mjs +10 -10
- package/esm2022/src/management/gui/HebrewDate.mjs +278 -0
- package/esm2022/src/management/gui/Helps.mjs +237 -0
- package/esm2022/src/management/gui/MgControlBase.mjs +1859 -0
- package/esm2022/src/management/gui/MgFormBase.mjs +741 -0
- package/esm2022/src/management/gui/PIC.mjs +1185 -0
- package/esm2022/src/management/gui/PropDefaults.mjs +230 -0
- package/{esm2020 → esm2022}/src/management/gui/PropInterface.mjs +246 -245
- package/esm2022/src/management/gui/PropTable.mjs +221 -0
- package/esm2022/src/management/gui/Property.mjs +1362 -0
- package/esm2022/src/management/gui/ValidationDetails.mjs +248 -0
- package/esm2022/src/management/gui/ValidationDetailsBase.mjs +93 -0
- package/esm2022/src/management/gui/WrongFormatException.mjs +29 -0
- package/esm2022/src/management/tasks/GuiDataCollection.mjs +4 -0
- package/esm2022/src/management/tasks/GuiTaskBase.mjs +511 -0
- package/{esm2020 → esm2022}/src/management/tasks/IMGDataTable.mjs +1 -1
- package/{esm2020 → esm2022}/src/management/tasks/ITask.mjs +1 -1
- package/esm2022/src/management/tasks/MgTimer.mjs +21 -0
- package/esm2022/src/management/tasks/TaskDefinitionId.mjs +54 -0
- package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
- package/esm2022/src/util/MemoryUtil.mjs +35 -0
- package/{esm2020 → esm2022}/src/util/ObjectReference.mjs +36 -36
- package/esm2022/src/util/UsernamePasswordCredentials.mjs +52 -0
- package/{fesm2020 → fesm2022}/magic-xpa-gui.mjs +16074 -16074
- package/fesm2022/magic-xpa-gui.mjs.map +1 -0
- package/index.d.ts +70 -70
- package/package.json +6 -12
- package/src/Commands.d.ts +40 -39
- package/src/Events.d.ts +157 -155
- package/src/EventsProcessor.d.ts +13 -13
- package/src/FocusManager.d.ts +8 -8
- package/src/GuiConstants.d.ts +65 -65
- package/src/GuiEnums.d.ts +282 -282
- package/src/GuiEnvironment.d.ts +4 -4
- package/src/IFlowMonitorQueue.d.ts +3 -3
- package/src/Manager.d.ts +26 -26
- package/src/UIBridge.d.ts +16 -16
- package/src/env/IEnvironment.d.ts +31 -31
- package/src/gui/ControlBase.d.ts +4 -4
- package/src/gui/GuiMgControl.d.ts +38 -38
- package/src/gui/GuiMgForm.d.ts +3 -3
- package/src/gui/KeyboardItem.d.ts +18 -18
- package/src/gui/LastFocusedVal.d.ts +7 -7
- package/src/gui/MgValue.d.ts +15 -15
- package/src/gui/PropParentInterface.d.ts +13 -13
- package/src/gui/low/DialogHandler.d.ts +4 -4
- package/src/gui/low/GuiCommand.d.ts +37 -37
- package/src/gui/low/GuiCommandQueue.d.ts +13 -13
- package/src/gui/low/GuiInteractive.d.ts +55 -53
- package/src/gui/low/Style.d.ts +19 -19
- package/src/management/RuntimeContextBase.d.ts +23 -23
- package/src/management/data/BlobType.d.ts +29 -29
- package/src/management/data/DcValues.d.ts +33 -33
- package/src/management/data/DcValuesBuilderBase.d.ts +17 -17
- package/src/management/data/FieldDef.d.ts +53 -53
- package/src/management/data/FieldsTable.d.ts +16 -16
- package/src/management/data/GuiDataViewBase.d.ts +27 -27
- package/src/management/data/GuiFieldBase.d.ts +17 -17
- package/src/management/data/IRecord.d.ts +12 -12
- package/src/management/data/IReferencedObject.d.ts +5 -5
- package/src/management/data/NUM_TYPE.d.ts +103 -103
- package/src/management/data/ObjectReferenceBase.d.ts +16 -16
- package/src/management/data/ObjectReferencesCollection.d.ts +10 -10
- package/src/management/data/RecordUtils.d.ts +21 -21
- package/src/management/data/VectorType.d.ts +52 -52
- package/src/management/data/VectorTypeBase.d.ts +8 -8
- package/src/management/events/IActionManager.d.ts +7 -7
- package/src/management/events/IGuiEventsManager.d.ts +20 -20
- package/src/management/exp/ExpressionInterface.d.ts +242 -242
- package/src/management/exp/GuiExpressionEvaluator.d.ts +47 -47
- package/src/management/gui/ControlTable.d.ts +28 -28
- package/src/management/gui/DisplayConvertor.d.ts +103 -103
- package/src/management/gui/FieldValidator.d.ts +35 -35
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +40 -40
- package/src/management/gui/GuiFormPropertyAdapter.d.ts +17 -17
- package/src/management/gui/HebrewDate.d.ts +46 -46
- package/src/management/gui/Helps.d.ts +51 -51
- package/src/management/gui/MgControlBase.d.ts +223 -223
- package/src/management/gui/MgFormBase.d.ts +160 -160
- package/src/management/gui/PIC.d.ts +108 -108
- package/src/management/gui/PropDefaults.d.ts +7 -7
- package/src/management/gui/PropInterface.d.ts +244 -243
- package/src/management/gui/PropTable.d.ts +33 -33
- package/src/management/gui/Property.d.ts +121 -121
- package/src/management/gui/ValidationDetails.d.ts +52 -52
- package/src/management/gui/ValidationDetailsBase.d.ts +14 -14
- package/src/management/gui/WrongFormatException.d.ts +9 -9
- package/src/management/tasks/GuiDataCollection.d.ts +4 -4
- package/src/management/tasks/GuiTaskBase.d.ts +150 -150
- package/src/management/tasks/IMGDataTable.d.ts +10 -10
- package/src/management/tasks/ITask.d.ts +6 -6
- package/src/management/tasks/MgTimer.d.ts +8 -8
- package/src/management/tasks/TaskDefinitionId.d.ts +16 -16
- package/src/management/tasks/TaskDefinitionIdTableSaxHandler.d.ts +7 -7
- package/src/util/MemoryUtil.d.ts +6 -6
- package/src/util/ObjectReference.d.ts +9 -9
- package/src/util/UsernamePasswordCredentials.d.ts +18 -18
- package/esm2020/src/Commands.mjs +0 -177
- package/esm2020/src/Events.mjs +0 -420
- package/esm2020/src/EventsProcessor.mjs +0 -67
- package/esm2020/src/FocusManager.mjs +0 -34
- package/esm2020/src/GuiConstants.mjs +0 -68
- package/esm2020/src/GuiEnvironment.mjs +0 -4
- package/esm2020/src/UIBridge.mjs +0 -32
- package/esm2020/src/gui/GuiMgControl.mjs +0 -125
- package/esm2020/src/gui/KeyboardItem.mjs +0 -135
- package/esm2020/src/gui/LastFocusedVal.mjs +0 -11
- package/esm2020/src/gui/MgValue.mjs +0 -16
- package/esm2020/src/gui/low/GuiCommand.mjs +0 -66
- package/esm2020/src/gui/low/GuiCommandQueue.mjs +0 -35
- package/esm2020/src/gui/low/GuiInteractive.mjs +0 -165
- package/esm2020/src/gui/low/Style.mjs +0 -20
- package/esm2020/src/management/RuntimeContextBase.mjs +0 -43
- package/esm2020/src/management/data/BlobType.mjs +0 -281
- package/esm2020/src/management/data/DcValuesBuilderBase.mjs +0 -96
- package/esm2020/src/management/data/FieldDef.mjs +0 -331
- package/esm2020/src/management/data/FieldsTable.mjs +0 -54
- package/esm2020/src/management/data/GuiDataViewBase.mjs +0 -90
- package/esm2020/src/management/data/GuiFieldBase.mjs +0 -82
- package/esm2020/src/management/data/NUM_TYPE.mjs +0 -1741
- package/esm2020/src/management/data/ObjectReferenceBase.mjs +0 -48
- package/esm2020/src/management/data/ObjectReferencesCollection.mjs +0 -29
- package/esm2020/src/management/data/RecordUtils.mjs +0 -361
- package/esm2020/src/management/data/VectorType.mjs +0 -612
- package/esm2020/src/management/data/VectorTypeBase.mjs +0 -88
- package/esm2020/src/management/exp/ExpressionInterface.mjs +0 -244
- package/esm2020/src/management/gui/ControlTable.mjs +0 -118
- package/esm2020/src/management/gui/DisplayConvertor.mjs +0 -1679
- package/esm2020/src/management/gui/FieldValidator.mjs +0 -711
- package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +0 -22
- package/esm2020/src/management/gui/HebrewDate.mjs +0 -278
- package/esm2020/src/management/gui/Helps.mjs +0 -237
- package/esm2020/src/management/gui/MgControlBase.mjs +0 -1858
- package/esm2020/src/management/gui/MgFormBase.mjs +0 -738
- package/esm2020/src/management/gui/PIC.mjs +0 -1185
- package/esm2020/src/management/gui/PropDefaults.mjs +0 -230
- package/esm2020/src/management/gui/PropTable.mjs +0 -221
- package/esm2020/src/management/gui/Property.mjs +0 -1356
- package/esm2020/src/management/gui/ValidationDetails.mjs +0 -248
- package/esm2020/src/management/gui/ValidationDetailsBase.mjs +0 -93
- package/esm2020/src/management/gui/WrongFormatException.mjs +0 -29
- package/esm2020/src/management/tasks/GuiDataCollection.mjs +0 -4
- package/esm2020/src/management/tasks/GuiTaskBase.mjs +0 -510
- package/esm2020/src/management/tasks/MgTimer.mjs +0 -21
- package/esm2020/src/management/tasks/TaskDefinitionId.mjs +0 -54
- package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
- package/esm2020/src/util/MemoryUtil.mjs +0 -35
- package/esm2020/src/util/UsernamePasswordCredentials.mjs +0 -52
- package/fesm2015/magic-xpa-gui.mjs +0 -16364
- package/fesm2015/magic-xpa-gui.mjs.map +0 -1
- package/fesm2020/magic-xpa-gui.mjs.map +0 -1
|
@@ -0,0 +1,1649 @@
|
|
|
1
|
+
import { PIC } from './PIC';
|
|
2
|
+
import { DateTime, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
|
|
3
|
+
import { DateUtil, HTML_2_STR, MsgInterface, PICInterface, SEQ_2_HTML, StorageAttribute, StrUtil, UtilDateJpn, UtilStrByteMode } from '@magic-xpa/utils';
|
|
4
|
+
import { BlobType } from '../data/BlobType';
|
|
5
|
+
import { ValidationDetailsBase } from './ValidationDetailsBase';
|
|
6
|
+
import { NUM_TYPE } from '../data/NUM_TYPE';
|
|
7
|
+
import { HebrewDate } from './HebrewDate';
|
|
8
|
+
import { Events } from '../../Events';
|
|
9
|
+
import { GuiEnvironment } from '../../GuiEnvironment';
|
|
10
|
+
import { MemoryUtil } from '../../util/MemoryUtil';
|
|
11
|
+
export class DisplayConvertor {
|
|
12
|
+
_environment = null;
|
|
13
|
+
DATECHAR = 0;
|
|
14
|
+
static _instance = null;
|
|
15
|
+
static get Instance() {
|
|
16
|
+
if (DisplayConvertor._instance === null) {
|
|
17
|
+
DisplayConvertor._instance = new DisplayConvertor();
|
|
18
|
+
}
|
|
19
|
+
return DisplayConvertor._instance;
|
|
20
|
+
}
|
|
21
|
+
constructor() {
|
|
22
|
+
this._environment = GuiEnvironment.Environment;
|
|
23
|
+
}
|
|
24
|
+
getNewDateBreakParams() {
|
|
25
|
+
return new DateBreakParams();
|
|
26
|
+
}
|
|
27
|
+
getNewTimeBreakParams() {
|
|
28
|
+
return new TimeBreakParams();
|
|
29
|
+
}
|
|
30
|
+
mg2disp(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx, time_date_pic_Z_edtOrConvertCase, time_date_num_pic_Z_edt) {
|
|
31
|
+
if (arguments.length === 6)
|
|
32
|
+
return this.mg2disp_0(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx);
|
|
33
|
+
else if (arguments.length === 7)
|
|
34
|
+
return this.mg2disp_1(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx, time_date_pic_Z_edtOrConvertCase);
|
|
35
|
+
else
|
|
36
|
+
return this.mg2disp_2(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx, time_date_pic_Z_edtOrConvertCase, time_date_num_pic_Z_edt);
|
|
37
|
+
}
|
|
38
|
+
mg2disp_0(mgValue, rangeStr, pic, useNative, compIdx, time_date_pic_Z_edt) {
|
|
39
|
+
return this.mg2disp(mgValue, rangeStr, pic, useNative, false, compIdx, time_date_pic_Z_edt);
|
|
40
|
+
}
|
|
41
|
+
mg2disp_1(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, time_date_pic_Z_edt) {
|
|
42
|
+
return this.mg2disp(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, false, time_date_pic_Z_edt);
|
|
43
|
+
}
|
|
44
|
+
mg2disp_2(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, convertCase, time_date_num_pic_Z_edt) {
|
|
45
|
+
let str = "";
|
|
46
|
+
let tmpRange = (rangeStr === null) ? "" : rangeStr;
|
|
47
|
+
switch (pic.getAttr()) {
|
|
48
|
+
case StorageAttribute.ALPHA:
|
|
49
|
+
case StorageAttribute.UNICODE:
|
|
50
|
+
str = this.fromAlpha(mgValue, pic, tmpRange, alwaysFill, convertCase);
|
|
51
|
+
break;
|
|
52
|
+
case StorageAttribute.NUMERIC: {
|
|
53
|
+
let newPic = pic.getUnformattedNumericPic();
|
|
54
|
+
let dec = GuiEnvironment.Environment.GetDecimal();
|
|
55
|
+
let thou = GuiEnvironment.Environment.GetThousands();
|
|
56
|
+
GuiEnvironment.Environment.setDecimalSeparator('.');
|
|
57
|
+
GuiEnvironment.Environment.setThousandsSeparator(',');
|
|
58
|
+
str = this.fromNum(mgValue, newPic);
|
|
59
|
+
GuiEnvironment.Environment.setDecimalSeparator(dec);
|
|
60
|
+
GuiEnvironment.Environment.setThousandsSeparator(thou);
|
|
61
|
+
if (newPic.getMaskChars() === 0 || !time_date_num_pic_Z_edt)
|
|
62
|
+
str = StrUtil.ltrim(str);
|
|
63
|
+
if (useNative) {
|
|
64
|
+
if (str == "")
|
|
65
|
+
return null;
|
|
66
|
+
let dbl = Number(str);
|
|
67
|
+
return dbl;
|
|
68
|
+
}
|
|
69
|
+
else
|
|
70
|
+
return str;
|
|
71
|
+
}
|
|
72
|
+
case StorageAttribute.DATE: {
|
|
73
|
+
if (useNative) {
|
|
74
|
+
let dt;
|
|
75
|
+
dt = this.fromMgDateToNativeDate(mgValue, pic, compIdx);
|
|
76
|
+
return dt;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
str = this.fromDate(mgValue, pic, compIdx, time_date_num_pic_Z_edt);
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
case StorageAttribute.TIME: {
|
|
84
|
+
if (useNative) {
|
|
85
|
+
let dt;
|
|
86
|
+
dt = this.fromMgTimeToNativeTime(mgValue, pic);
|
|
87
|
+
return dt;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
str = this.fromTime(mgValue, pic, time_date_num_pic_Z_edt);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
case StorageAttribute.BOOLEAN: {
|
|
95
|
+
let logVal;
|
|
96
|
+
logVal = this.fromMgLogicalToNativeLogical(mgValue);
|
|
97
|
+
return logVal;
|
|
98
|
+
}
|
|
99
|
+
case StorageAttribute.BLOB:
|
|
100
|
+
str = BlobType.getString(mgValue);
|
|
101
|
+
break;
|
|
102
|
+
case StorageAttribute.BLOB_VECTOR:
|
|
103
|
+
str = mgValue;
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
return str;
|
|
107
|
+
}
|
|
108
|
+
disp2mg(dispValue, pic, compIdx, blobContentType) {
|
|
109
|
+
let str = "";
|
|
110
|
+
switch (pic.getAttr()) {
|
|
111
|
+
case StorageAttribute.ALPHA:
|
|
112
|
+
case StorageAttribute.UNICODE:
|
|
113
|
+
str = this.toAlpha(dispValue, pic);
|
|
114
|
+
break;
|
|
115
|
+
case StorageAttribute.NUMERIC:
|
|
116
|
+
{
|
|
117
|
+
dispValue = String(dispValue);
|
|
118
|
+
let len = dispValue.length;
|
|
119
|
+
while (len > 0) {
|
|
120
|
+
if (!pic.picIsMask(len - 1) && dispValue[len - 1] !== (' '))
|
|
121
|
+
break;
|
|
122
|
+
len--;
|
|
123
|
+
}
|
|
124
|
+
if (dispValue.length > len)
|
|
125
|
+
dispValue = NString.Remove(dispValue, len, (dispValue.length - len));
|
|
126
|
+
if (pic.isNegative() && dispValue.trim().startsWith("-"))
|
|
127
|
+
dispValue = StrUtil.ltrim(dispValue);
|
|
128
|
+
let dec = GuiEnvironment.Environment.GetDecimal();
|
|
129
|
+
let thou = GuiEnvironment.Environment.GetThousands();
|
|
130
|
+
GuiEnvironment.Environment.setDecimalSeparator('.');
|
|
131
|
+
GuiEnvironment.Environment.setThousandsSeparator(',');
|
|
132
|
+
let newPic = pic.getUnformattedNumericPic();
|
|
133
|
+
str = this.toNum(dispValue, newPic, compIdx);
|
|
134
|
+
GuiEnvironment.Environment.setDecimalSeparator(dec);
|
|
135
|
+
GuiEnvironment.Environment.setThousandsSeparator(thou);
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
case StorageAttribute.DATE:
|
|
139
|
+
{
|
|
140
|
+
let dt;
|
|
141
|
+
if (typeof dispValue === 'string')
|
|
142
|
+
dt = new Date(dispValue);
|
|
143
|
+
else
|
|
144
|
+
dt = dispValue;
|
|
145
|
+
str = this.fromNativeDateToMgDate(dt, pic);
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
case StorageAttribute.TIME:
|
|
149
|
+
{
|
|
150
|
+
let dt;
|
|
151
|
+
if (typeof dispValue === 'string') {
|
|
152
|
+
dt = new Date();
|
|
153
|
+
if (dispValue !== null) {
|
|
154
|
+
dt.setHours(+String(dispValue).substr(0, 2));
|
|
155
|
+
dt.setMinutes(+String(dispValue).substr(0, 2));
|
|
156
|
+
if (String(dispValue).length > 5)
|
|
157
|
+
dt.setSeconds(+String(dispValue).substr(0, 2));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else
|
|
161
|
+
dt = dispValue;
|
|
162
|
+
str = this.fromNativeTimeToMgTime(dt);
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
case StorageAttribute.BOOLEAN:
|
|
166
|
+
str = this.fromNativeLogicalToMgLogical(dispValue);
|
|
167
|
+
break;
|
|
168
|
+
case StorageAttribute.BLOB:
|
|
169
|
+
str = BlobType.createFromString(dispValue, blobContentType);
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
return str;
|
|
173
|
+
}
|
|
174
|
+
fromNum(mgValue, pic) {
|
|
175
|
+
let mgNum = new NUM_TYPE(mgValue);
|
|
176
|
+
return mgNum.toDisplayValue(pic);
|
|
177
|
+
}
|
|
178
|
+
fromAlpha(dataStr, pic, rangeStr, alwaysFill, convertCase) {
|
|
179
|
+
let len = pic.getMaskSize();
|
|
180
|
+
let min_len = len;
|
|
181
|
+
let maskStr = pic.getMask();
|
|
182
|
+
let resStr;
|
|
183
|
+
if (pic.getMaskChars() > 0) {
|
|
184
|
+
resStr = this.win_data_cpy(NString.ToCharArray(maskStr), len, NString.ToCharArray(dataStr), pic.isAttrAlpha(), convertCase);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
if (UtilStrByteMode.isLocaleDefLangDBCS() && pic.isAttrAlpha()) {
|
|
188
|
+
let intDataStrLenB = UtilStrByteMode.lenB(dataStr);
|
|
189
|
+
if (min_len > intDataStrLenB) {
|
|
190
|
+
min_len = intDataStrLenB;
|
|
191
|
+
}
|
|
192
|
+
resStr = UtilStrByteMode.leftB(dataStr, min_len);
|
|
193
|
+
}
|
|
194
|
+
else if (dataStr !== null) {
|
|
195
|
+
if (min_len > dataStr.length) {
|
|
196
|
+
min_len = dataStr.length;
|
|
197
|
+
}
|
|
198
|
+
if (convertCase) {
|
|
199
|
+
resStr = this.win_data_cpy(NString.ToCharArray(maskStr), len, NString.ToCharArray(dataStr), pic.isAttrAlpha(), convertCase);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
resStr = dataStr.substr(0, min_len);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (alwaysFill || (rangeStr !== null && rangeStr.length > 0 && resStr.length < len)) {
|
|
207
|
+
let vd = new ValidationDetailsBase(rangeStr);
|
|
208
|
+
let continuousRangeValues = vd.getContinuousRangeValues();
|
|
209
|
+
let discreteRangeValues = vd.getDiscreteRangeValues();
|
|
210
|
+
if (continuousRangeValues !== null || discreteRangeValues !== null) {
|
|
211
|
+
resStr = this.fillAlphaByRange(continuousRangeValues, discreteRangeValues, resStr);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return resStr;
|
|
215
|
+
}
|
|
216
|
+
caseConvertedChar(data, mask) {
|
|
217
|
+
let ch;
|
|
218
|
+
if (mask.charCodeAt(0) === PICInterface.PIC_U) {
|
|
219
|
+
ch = data.toUpperCase();
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
if (mask.charCodeAt(0) === PICInterface.PIC_L) {
|
|
223
|
+
ch = data.toLowerCase();
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
ch = data;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return ch;
|
|
230
|
+
}
|
|
231
|
+
win_data_cpy(maskStr, maskLen, dataStr, isAttrAlpha, convertCase) {
|
|
232
|
+
if (arguments.length === 4)
|
|
233
|
+
return this.win_data_cpy_0(maskStr, maskLen, dataStr, isAttrAlpha);
|
|
234
|
+
return this.win_data_cpy_1(maskStr, maskLen, dataStr, isAttrAlpha, convertCase);
|
|
235
|
+
}
|
|
236
|
+
win_data_cpy_0(maskStr, maskLen, dataStr, isAttrAlpha) {
|
|
237
|
+
return this.win_data_cpy(maskStr, maskLen, dataStr, isAttrAlpha, false);
|
|
238
|
+
}
|
|
239
|
+
win_data_cpy_1(maskStr, maskLen, dataStr, isAttrAlpha, convertCase) {
|
|
240
|
+
let maskIdx = 0;
|
|
241
|
+
let dataIdx = 0;
|
|
242
|
+
let resStr = new Array(maskLen);
|
|
243
|
+
if (isAttrAlpha && UtilStrByteMode.isLocaleDefLangDBCS()) {
|
|
244
|
+
let num2 = 0;
|
|
245
|
+
while (maskIdx < maskLen && num2 < maskLen) {
|
|
246
|
+
if (maskStr[maskIdx].charCodeAt(0) <= PICInterface.PIC_MAX_OP) {
|
|
247
|
+
if (dataIdx < dataStr.length) {
|
|
248
|
+
let strVal = NString.FromChars(dataStr, dataIdx, 1);
|
|
249
|
+
if (UtilStrByteMode.lenB(strVal) === 2) {
|
|
250
|
+
if (maskIdx + 1 < maskLen) {
|
|
251
|
+
if (maskStr[maskIdx + 1].charCodeAt(0) <= PICInterface.PIC_MAX_OP) {
|
|
252
|
+
if (convertCase) {
|
|
253
|
+
resStr[num2++] = this.caseConvertedChar(dataStr[dataIdx++], maskStr[maskIdx + 1]);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
resStr[num2++] = dataStr[dataIdx++];
|
|
257
|
+
}
|
|
258
|
+
maskIdx = maskIdx + 1;
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
resStr[num2++] = ' ';
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
resStr[num2++] = ' ';
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
if (convertCase) {
|
|
270
|
+
resStr[num2++] = this.caseConvertedChar(dataStr[dataIdx++], maskStr[maskIdx + 1]);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
resStr[num2++] = dataStr[dataIdx++];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
resStr[num2++] = ' ';
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
resStr[num2++] = maskStr[maskIdx];
|
|
283
|
+
}
|
|
284
|
+
maskIdx = maskIdx + 1;
|
|
285
|
+
}
|
|
286
|
+
return NString.FromChars(resStr).substr(0, num2);
|
|
287
|
+
}
|
|
288
|
+
while (maskIdx < maskLen) {
|
|
289
|
+
if (maskStr[maskIdx].charCodeAt(0) <= PICInterface.PIC_MAX_OP) {
|
|
290
|
+
if (dataIdx < dataStr.length) {
|
|
291
|
+
resStr[maskIdx] = dataStr[dataIdx];
|
|
292
|
+
if (convertCase) {
|
|
293
|
+
resStr[maskIdx] = this.caseConvertedChar(dataStr[dataIdx], maskStr[maskIdx]);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
resStr[maskIdx] = dataStr[dataIdx];
|
|
297
|
+
}
|
|
298
|
+
dataIdx = dataIdx + 1;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
resStr[maskIdx] = ' ';
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
resStr[maskIdx] = maskStr[maskIdx];
|
|
306
|
+
}
|
|
307
|
+
maskIdx = maskIdx + 1;
|
|
308
|
+
}
|
|
309
|
+
return NString.FromChars(resStr);
|
|
310
|
+
}
|
|
311
|
+
fromDate(dataStr, pic, compIdx, time_date_pic_Z_edt) {
|
|
312
|
+
let mask = pic.getMask();
|
|
313
|
+
let maskSize = pic.getMaskSize();
|
|
314
|
+
let date = new NUM_TYPE(dataStr).NUM_2_ULONG();
|
|
315
|
+
return this.to_a_pic_datemode(mask, maskSize, date, pic, time_date_pic_Z_edt, false, compIdx);
|
|
316
|
+
}
|
|
317
|
+
fromTime(dataStr, pic, time_date_pic_Z_edt) {
|
|
318
|
+
let mask = pic.getMask();
|
|
319
|
+
let maskSize = pic.getMaskSize();
|
|
320
|
+
let time = new NUM_TYPE(dataStr).NUM_2_ULONG();
|
|
321
|
+
return this.time_2_a_pic(mask, maskSize, time, pic, time_date_pic_Z_edt, false);
|
|
322
|
+
}
|
|
323
|
+
fromMgDateToNativeDate(dataStr, pic, compIdx) {
|
|
324
|
+
let date = new NUM_TYPE(dataStr).NUM_2_ULONG();
|
|
325
|
+
let breakParams;
|
|
326
|
+
breakParams = new DateBreakParams();
|
|
327
|
+
this.date_break_datemode(breakParams, date, false, compIdx);
|
|
328
|
+
if (breakParams.month > 0)
|
|
329
|
+
breakParams.month = breakParams.month - 1;
|
|
330
|
+
if (breakParams.year == 0 && breakParams.month == 0 && breakParams.day == 0)
|
|
331
|
+
return null;
|
|
332
|
+
return new Date(breakParams.year, breakParams.month, breakParams.day);
|
|
333
|
+
}
|
|
334
|
+
fromNativeDateToMgDateNumber(nativeDate, pic) {
|
|
335
|
+
let numVal;
|
|
336
|
+
let dateParams;
|
|
337
|
+
let millenium = 0;
|
|
338
|
+
let year = nativeDate.getFullYear();
|
|
339
|
+
let day = nativeDate.getDate();
|
|
340
|
+
let month = nativeDate.getMonth() + 1;
|
|
341
|
+
if (pic.isHebrew()) {
|
|
342
|
+
if (year > 0) {
|
|
343
|
+
if (millenium === 0)
|
|
344
|
+
millenium = 5;
|
|
345
|
+
year += millenium * 1000;
|
|
346
|
+
}
|
|
347
|
+
numVal = (HebrewDate.dateheb_2_d(year, month, day));
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
if (year === 0) {
|
|
351
|
+
dateParams = this.date_sys();
|
|
352
|
+
year = dateParams.year;
|
|
353
|
+
}
|
|
354
|
+
numVal = this.date_4_calender(year, month, day, 0, false);
|
|
355
|
+
}
|
|
356
|
+
return numVal;
|
|
357
|
+
}
|
|
358
|
+
fromNativeDateToMgDate(nativeDate, pic) {
|
|
359
|
+
let mgNum = new NUM_TYPE();
|
|
360
|
+
let numVal = nativeDate == null ? 0 : this.fromNativeDateToMgDateNumber(nativeDate, pic);
|
|
361
|
+
mgNum.NUM_4_LONG(numVal);
|
|
362
|
+
return mgNum.toXMLrecord();
|
|
363
|
+
}
|
|
364
|
+
to_a_pic_datemode(outStr, out_len, date, pic, date_pic_Z_edt, ignore_dt_fmt, compIdx) {
|
|
365
|
+
let len;
|
|
366
|
+
let day = 0;
|
|
367
|
+
let doy = 0;
|
|
368
|
+
let dow = 0;
|
|
369
|
+
let year = 0;
|
|
370
|
+
let month = 0;
|
|
371
|
+
let hday = 0;
|
|
372
|
+
let hyear = 0;
|
|
373
|
+
let hmonth = 0;
|
|
374
|
+
let leap = false;
|
|
375
|
+
let i;
|
|
376
|
+
let p;
|
|
377
|
+
let outVal = NString.ToCharArray(outStr);
|
|
378
|
+
let breakParams;
|
|
379
|
+
let dateNameParams;
|
|
380
|
+
let outIdx = 0;
|
|
381
|
+
let strOut = null;
|
|
382
|
+
if (pic.getMaskSize() > out_len) {
|
|
383
|
+
for (; i < out_len; i++)
|
|
384
|
+
outVal[i] = '*';
|
|
385
|
+
return NString.FromChars(outVal);
|
|
386
|
+
}
|
|
387
|
+
out_len = len = pic.getMaskSize();
|
|
388
|
+
if (pic.zeroFill() && date === 0 && !date_pic_Z_edt) {
|
|
389
|
+
for (; i < out_len; i++)
|
|
390
|
+
outVal[i] = pic.getZeroPad();
|
|
391
|
+
return NString.FromChars(outVal);
|
|
392
|
+
}
|
|
393
|
+
if (pic.isHebrew() && (date === 0 || date === 1000000000)) {
|
|
394
|
+
for (; i < out_len; i++)
|
|
395
|
+
outVal[i] = ' ';
|
|
396
|
+
return NString.FromChars(outVal);
|
|
397
|
+
}
|
|
398
|
+
breakParams = new DateBreakParams(year, month, day, doy, dow);
|
|
399
|
+
this.date_break_datemode(breakParams, date, ignore_dt_fmt, compIdx);
|
|
400
|
+
if (pic.isHebrew()) {
|
|
401
|
+
let refhday = new RefParam(hday);
|
|
402
|
+
let refhmonth = new RefParam(hmonth);
|
|
403
|
+
let refhyear = new RefParam(hyear);
|
|
404
|
+
leap = HebrewDate.dateheb_4_d(date, refhday, refhmonth, refhyear);
|
|
405
|
+
hday = refhday.value;
|
|
406
|
+
hmonth = refhmonth.value;
|
|
407
|
+
hyear = refhyear.value;
|
|
408
|
+
}
|
|
409
|
+
year = breakParams.year;
|
|
410
|
+
month = breakParams.month;
|
|
411
|
+
day = breakParams.day;
|
|
412
|
+
doy = breakParams.doy;
|
|
413
|
+
dow = breakParams.dow;
|
|
414
|
+
breakParams = null;
|
|
415
|
+
while (len > 0) {
|
|
416
|
+
let refOutLen = new RefParam(out_len);
|
|
417
|
+
switch (outVal[outIdx].charCodeAt(0)) {
|
|
418
|
+
case PICInterface.PIC_YY:
|
|
419
|
+
if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
|
|
420
|
+
MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
|
|
421
|
+
else
|
|
422
|
+
this.int_2_a(outVal, outIdx, 2, year, '0');
|
|
423
|
+
outIdx += 2;
|
|
424
|
+
len -= 2;
|
|
425
|
+
break;
|
|
426
|
+
case PICInterface.PIC_HYYYYY:
|
|
427
|
+
i = HebrewDate.dateheb_2_str(outVal, outIdx, len, refOutLen, 5, hyear, pic.isTrimed(), true);
|
|
428
|
+
out_len = refOutLen.value;
|
|
429
|
+
outIdx += i;
|
|
430
|
+
len -= i;
|
|
431
|
+
break;
|
|
432
|
+
case PICInterface.PIC_HL:
|
|
433
|
+
i = HebrewDate.dateheb_i_2_h((hyear / 1000) % 10, outVal, outIdx, false, false);
|
|
434
|
+
outIdx++;
|
|
435
|
+
len--;
|
|
436
|
+
break;
|
|
437
|
+
case PICInterface.PIC_HDD:
|
|
438
|
+
i = HebrewDate.dateheb_2_str(outVal, outIdx, len, refOutLen, 2, hday, pic.isTrimed(), false);
|
|
439
|
+
out_len = refOutLen.value;
|
|
440
|
+
outIdx += i;
|
|
441
|
+
len -= i;
|
|
442
|
+
break;
|
|
443
|
+
case PICInterface.PIC_YYYY:
|
|
444
|
+
if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
|
|
445
|
+
MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 4);
|
|
446
|
+
else
|
|
447
|
+
this.int_2_a(outVal, outIdx, 4, year, '0');
|
|
448
|
+
outIdx += 4;
|
|
449
|
+
len -= 4;
|
|
450
|
+
break;
|
|
451
|
+
case PICInterface.PIC_MMD:
|
|
452
|
+
if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
|
|
453
|
+
MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
|
|
454
|
+
else
|
|
455
|
+
this.int_2_a(outVal, outIdx, 2, month, '0');
|
|
456
|
+
outIdx += 2;
|
|
457
|
+
len -= 2;
|
|
458
|
+
break;
|
|
459
|
+
case PICInterface.PIC_MMM:
|
|
460
|
+
if (pic.isHebrew()) {
|
|
461
|
+
if (leap && hmonth === 6)
|
|
462
|
+
hmonth = 14;
|
|
463
|
+
let monthNames = HebrewDate.GetLocalMonths();
|
|
464
|
+
p = NString.ToCharArray(monthNames[hmonth]);
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
let monthStr = Events.GetMessageString(MsgInterface.MONTHS_PTR);
|
|
468
|
+
let monthNames = DateUtil.getLocalMonths(monthStr);
|
|
469
|
+
p = NString.ToCharArray(monthNames[month]);
|
|
470
|
+
}
|
|
471
|
+
dateNameParams = new DateNameParams(outVal, outIdx, len);
|
|
472
|
+
out_len -= this.date_i_2_nm(dateNameParams, p, pic.isTrimed());
|
|
473
|
+
outIdx = dateNameParams.outIdx;
|
|
474
|
+
len = dateNameParams.len;
|
|
475
|
+
dateNameParams = null;
|
|
476
|
+
break;
|
|
477
|
+
case PICInterface.PIC_DD:
|
|
478
|
+
let isZero = pic.zeroFill();
|
|
479
|
+
if (isZero && date === 0 && date_pic_Z_edt)
|
|
480
|
+
MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
|
|
481
|
+
else
|
|
482
|
+
this.int_2_a(outVal, outIdx, 2, day, '0');
|
|
483
|
+
outIdx += 2;
|
|
484
|
+
len -= 2;
|
|
485
|
+
break;
|
|
486
|
+
case PICInterface.PIC_DDD:
|
|
487
|
+
if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
|
|
488
|
+
MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 3);
|
|
489
|
+
else
|
|
490
|
+
this.int_2_a(outVal, outIdx, 3, doy, '0');
|
|
491
|
+
len -= 3;
|
|
492
|
+
outIdx += 3;
|
|
493
|
+
break;
|
|
494
|
+
case PICInterface.PIC_DDDD:
|
|
495
|
+
i = this.date_2_DDDD(day, outVal, outIdx, len, pic.isTrimed());
|
|
496
|
+
outIdx += i;
|
|
497
|
+
out_len += i - 4;
|
|
498
|
+
len -= 4;
|
|
499
|
+
break;
|
|
500
|
+
case PICInterface.PIC_W:
|
|
501
|
+
if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
|
|
502
|
+
MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 1);
|
|
503
|
+
else
|
|
504
|
+
this.int_2_a(outVal, outIdx, 1, dow, '0');
|
|
505
|
+
len--;
|
|
506
|
+
outIdx++;
|
|
507
|
+
break;
|
|
508
|
+
case PICInterface.PIC_WWW:
|
|
509
|
+
if (pic.isHebrew()) {
|
|
510
|
+
let dowsNames = HebrewDate.GetLocalDows();
|
|
511
|
+
p = NString.ToCharArray(dowsNames[dow]);
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
let dayStr = Events.GetMessageString(MsgInterface.DAYS_PTR);
|
|
515
|
+
let dayNames = DateUtil.getLocalDays(dayStr);
|
|
516
|
+
p = NString.ToCharArray(dayNames[dow]);
|
|
517
|
+
}
|
|
518
|
+
dateNameParams = new DateNameParams(outVal, outIdx, len);
|
|
519
|
+
out_len -= this.date_i_2_nm(dateNameParams, p, pic.isTrimed());
|
|
520
|
+
outIdx = dateNameParams.outIdx;
|
|
521
|
+
len = dateNameParams.len;
|
|
522
|
+
dateNameParams = null;
|
|
523
|
+
break;
|
|
524
|
+
case PICInterface.PIC_BB:
|
|
525
|
+
p = NString.ToCharArray(UtilDateJpn.getStrDow(dow));
|
|
526
|
+
strOut = null;
|
|
527
|
+
dateNameParams = new DateNameParams(outVal, outIdx, len);
|
|
528
|
+
strOut = this.date_i_2_nm_bytemode(strOut, dateNameParams, NString.FromChars(p), out_len);
|
|
529
|
+
outVal = new Array(strOut.length);
|
|
530
|
+
NString.CopyTo(strOut, 0, outVal, 0, strOut.length);
|
|
531
|
+
outIdx = dateNameParams.outIdx;
|
|
532
|
+
len = dateNameParams.len;
|
|
533
|
+
strOut = null;
|
|
534
|
+
dateNameParams = null;
|
|
535
|
+
break;
|
|
536
|
+
case PICInterface.PIC_JY1:
|
|
537
|
+
case PICInterface.PIC_JY2:
|
|
538
|
+
case PICInterface.PIC_JY4:
|
|
539
|
+
let strNum = null;
|
|
540
|
+
if (outVal[outIdx].charCodeAt(0) === PICInterface.PIC_JY1)
|
|
541
|
+
strNum = UtilDateJpn.getInstance().date_jpn_yr_2_a(year, doy, false);
|
|
542
|
+
else
|
|
543
|
+
strNum = UtilDateJpn.getInstance().date_jpn_yr_2_a(year, doy, true);
|
|
544
|
+
strOut = null;
|
|
545
|
+
dateNameParams = new DateNameParams(outVal, outIdx, len);
|
|
546
|
+
strOut = this.date_i_2_nm_bytemode(strOut, dateNameParams, strNum, out_len);
|
|
547
|
+
outVal = null;
|
|
548
|
+
outVal = new Array(strOut.length);
|
|
549
|
+
NString.CopyTo(strOut, 0, outVal, 0, strOut.length);
|
|
550
|
+
outIdx = dateNameParams.outIdx;
|
|
551
|
+
len = dateNameParams.len;
|
|
552
|
+
strOut = null;
|
|
553
|
+
dateNameParams = null;
|
|
554
|
+
break;
|
|
555
|
+
case PICInterface.PIC_YJ:
|
|
556
|
+
if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
|
|
557
|
+
MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
|
|
558
|
+
else
|
|
559
|
+
this.int_2_a(outVal, outIdx, 2, UtilDateJpn.getInstance().date_jpn_year_ofs(year, doy), '0');
|
|
560
|
+
outIdx += 2;
|
|
561
|
+
len -= 2;
|
|
562
|
+
break;
|
|
563
|
+
default:
|
|
564
|
+
outIdx++;
|
|
565
|
+
len--;
|
|
566
|
+
break;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
if (out_len < outVal.length)
|
|
570
|
+
MemoryUtil.char_memset(outVal, out_len, ' ', outVal.length - out_len);
|
|
571
|
+
return NString.FromChars(outVal);
|
|
572
|
+
}
|
|
573
|
+
date_break_datemode(breakParams, date, ignore_dt_fmt, compIdx) {
|
|
574
|
+
let year = breakParams.year;
|
|
575
|
+
let month = breakParams.month;
|
|
576
|
+
let day = breakParams.day;
|
|
577
|
+
let doy = breakParams.doy;
|
|
578
|
+
let dow = breakParams.dow;
|
|
579
|
+
if (date <= 0) {
|
|
580
|
+
breakParams.day = 0;
|
|
581
|
+
breakParams.doy = 0;
|
|
582
|
+
breakParams.dow = 0;
|
|
583
|
+
breakParams.year = 0;
|
|
584
|
+
breakParams.month = 0;
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
dow = date % 7 + 1;
|
|
588
|
+
date = date - 1;
|
|
589
|
+
let cent4 = Math.floor(date / PICInterface.DAYSINFOURCENT);
|
|
590
|
+
date = date - cent4 * PICInterface.DAYSINFOURCENT;
|
|
591
|
+
let cent = Math.floor(date / PICInterface.DAYSINCENTURY);
|
|
592
|
+
if (cent > 3) {
|
|
593
|
+
cent = 3;
|
|
594
|
+
}
|
|
595
|
+
date = date - cent * PICInterface.DAYSINCENTURY;
|
|
596
|
+
let year4 = Math.floor(date / PICInterface.DAYSINFOURYEAR);
|
|
597
|
+
date = date - year4 * PICInterface.DAYSINFOURYEAR;
|
|
598
|
+
year = Math.floor(date / PICInterface.DAYSINYEAR);
|
|
599
|
+
if (year > 3) {
|
|
600
|
+
year = 3;
|
|
601
|
+
}
|
|
602
|
+
date = date - year * PICInterface.DAYSINYEAR;
|
|
603
|
+
year = cent4 * 400 + cent * 100 + year4 * 4 + year + 1;
|
|
604
|
+
let leapyear = 0;
|
|
605
|
+
if (year % 4 === 0) {
|
|
606
|
+
if (year % 100 !== 0 || year % 400 === 0) {
|
|
607
|
+
leapyear = 1;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
if (!ignore_dt_fmt && this._environment.GetDateMode(compIdx) === 'B') {
|
|
611
|
+
year = year + PICInterface.DATE_BUDDHIST_GAP;
|
|
612
|
+
}
|
|
613
|
+
month = (Math.floor(date / PICInterface.DAYSINMONTH) + 1);
|
|
614
|
+
day = PICInterface.date_day_tab[month];
|
|
615
|
+
if (leapyear > 0) {
|
|
616
|
+
if (month > 1) {
|
|
617
|
+
day = day + 1;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
if (date >= day) {
|
|
621
|
+
month = month + 1;
|
|
622
|
+
}
|
|
623
|
+
else {
|
|
624
|
+
day = PICInterface.date_day_tab[month - 1];
|
|
625
|
+
if (leapyear > 0) {
|
|
626
|
+
if (month > 2) {
|
|
627
|
+
day = day + 1;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
day = date - day + 1;
|
|
632
|
+
doy = date + 1;
|
|
633
|
+
breakParams.year = year;
|
|
634
|
+
breakParams.month = month;
|
|
635
|
+
breakParams.day = day;
|
|
636
|
+
breakParams.doy = doy;
|
|
637
|
+
breakParams.dow = dow;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
int_2_a(str, strPos, len, n, lead) {
|
|
641
|
+
let neg = n < 0;
|
|
642
|
+
if (len <= 0)
|
|
643
|
+
return;
|
|
644
|
+
n = Math.abs(n);
|
|
645
|
+
let pos = len;
|
|
646
|
+
do {
|
|
647
|
+
str[strPos + (pos = pos - 1)] = String.fromCharCode(48 + n % 10);
|
|
648
|
+
n = Math.floor(n / 10);
|
|
649
|
+
} while (pos > 0 && n > 0);
|
|
650
|
+
if (neg && pos > 0) {
|
|
651
|
+
str[strPos + (pos = pos - 1)] = '-';
|
|
652
|
+
}
|
|
653
|
+
return this.lib_a_fill(str, strPos, len, pos, lead.charCodeAt(0));
|
|
654
|
+
}
|
|
655
|
+
lib_a_fill(str, strPos, len, pos, lead) {
|
|
656
|
+
if (lead === 0) {
|
|
657
|
+
len = len - pos;
|
|
658
|
+
if (len > 0 && pos > 0) {
|
|
659
|
+
MemoryUtil.char_memcpy(str, strPos, str, pos, len);
|
|
660
|
+
MemoryUtil.char_memset(str, strPos + len, ' ', pos);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
else {
|
|
664
|
+
if (pos > 0) {
|
|
665
|
+
MemoryUtil.char_memset(str, strPos, String.fromCharCode(lead), pos);
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
return len;
|
|
669
|
+
}
|
|
670
|
+
date_i_2_nm(dateNameParams, nm, trim) {
|
|
671
|
+
let n = this.date_msk_cnt(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.len);
|
|
672
|
+
let l;
|
|
673
|
+
if (trim) {
|
|
674
|
+
l = MemoryUtil.mem_trim(nm, 0, n);
|
|
675
|
+
}
|
|
676
|
+
else {
|
|
677
|
+
l = n;
|
|
678
|
+
}
|
|
679
|
+
l = Math.min(l, dateNameParams.len);
|
|
680
|
+
MemoryUtil.char_memcpy(dateNameParams.outVal, dateNameParams.outIdx, nm, 0, l);
|
|
681
|
+
dateNameParams.outIdx = dateNameParams.outIdx + l;
|
|
682
|
+
dateNameParams.len = dateNameParams.len - n;
|
|
683
|
+
n = n - l;
|
|
684
|
+
if (n > 0) {
|
|
685
|
+
MemoryUtil.char_memcpy(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.outVal, dateNameParams.outIdx + n, dateNameParams.len);
|
|
686
|
+
}
|
|
687
|
+
return n;
|
|
688
|
+
}
|
|
689
|
+
date_i_2_nm_bytemode(strOut, dateNameParams, strNm, intOutLen) {
|
|
690
|
+
let intMskCnt = this.date_msk_cnt(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.len);
|
|
691
|
+
let strWork = NString.FromChars(dateNameParams.outVal);
|
|
692
|
+
strWork = strWork.substr(0, dateNameParams.outIdx);
|
|
693
|
+
let intOfs = UtilStrByteMode.lenB(strWork);
|
|
694
|
+
strNm = UtilStrByteMode.leftB(strNm, intMskCnt);
|
|
695
|
+
strOut = UtilStrByteMode.repB(NString.FromChars(dateNameParams.outVal), strNm, intOfs + 1, intMskCnt);
|
|
696
|
+
dateNameParams.outIdx = dateNameParams.outIdx + strNm.length;
|
|
697
|
+
dateNameParams.len = dateNameParams.len - intMskCnt;
|
|
698
|
+
intOutLen = intOutLen - intMskCnt;
|
|
699
|
+
return strOut;
|
|
700
|
+
}
|
|
701
|
+
date_msk_cnt(msk, mskPos, len) {
|
|
702
|
+
let c = msk[mskPos++];
|
|
703
|
+
let i = 1;
|
|
704
|
+
while (i < len) {
|
|
705
|
+
if (msk[mskPos] !== c) {
|
|
706
|
+
break;
|
|
707
|
+
}
|
|
708
|
+
mskPos = mskPos + 1;
|
|
709
|
+
i = i + 1;
|
|
710
|
+
}
|
|
711
|
+
return i;
|
|
712
|
+
}
|
|
713
|
+
date_2_DDDD(day, outVal, outIdx, len, trim) {
|
|
714
|
+
let ret = 4;
|
|
715
|
+
let ext;
|
|
716
|
+
if (day > 9) {
|
|
717
|
+
this.int_2_a(outVal, outIdx, 2, day, 0..toString());
|
|
718
|
+
outIdx += 2;
|
|
719
|
+
}
|
|
720
|
+
else {
|
|
721
|
+
if (trim) {
|
|
722
|
+
MemoryUtil.char_memcpy(outVal, outIdx, outVal, outIdx + 1, len - 1);
|
|
723
|
+
ret--;
|
|
724
|
+
}
|
|
725
|
+
else {
|
|
726
|
+
outVal[outIdx++] = ' ';
|
|
727
|
+
}
|
|
728
|
+
this.int_2_a(outVal, outIdx, 1, day, 0..toString());
|
|
729
|
+
outIdx++;
|
|
730
|
+
}
|
|
731
|
+
switch (day) {
|
|
732
|
+
case 1:
|
|
733
|
+
case 21:
|
|
734
|
+
case 31:
|
|
735
|
+
ext = NString.ToCharArray("st");
|
|
736
|
+
break;
|
|
737
|
+
case 2:
|
|
738
|
+
case 22:
|
|
739
|
+
ext = NString.ToCharArray("nd");
|
|
740
|
+
break;
|
|
741
|
+
case 3:
|
|
742
|
+
case 23:
|
|
743
|
+
ext = NString.ToCharArray("rd");
|
|
744
|
+
break;
|
|
745
|
+
default:
|
|
746
|
+
ext = NString.ToCharArray("th");
|
|
747
|
+
break;
|
|
748
|
+
}
|
|
749
|
+
outVal[outIdx++] = ext[0];
|
|
750
|
+
outVal[outIdx] = ext[1];
|
|
751
|
+
return (ret);
|
|
752
|
+
}
|
|
753
|
+
fromMgTimeToNativeTime(dataStr, pic) {
|
|
754
|
+
let time = new NUM_TYPE(dataStr).NUM_2_ULONG();
|
|
755
|
+
let breakParams = new TimeBreakParams();
|
|
756
|
+
DisplayConvertor.time_break(breakParams, time);
|
|
757
|
+
let nativeDt = new Date(0);
|
|
758
|
+
let maskStr = pic.getMask();
|
|
759
|
+
let outVal = NString.ToCharArray(maskStr);
|
|
760
|
+
let len = pic.getMaskSize();
|
|
761
|
+
let outIdx = 0;
|
|
762
|
+
while (len > 0) {
|
|
763
|
+
switch (outVal[outIdx].charCodeAt(0)) {
|
|
764
|
+
case (PICInterface.PIC_HH):
|
|
765
|
+
nativeDt.setHours(breakParams.hour);
|
|
766
|
+
outIdx += 2;
|
|
767
|
+
len -= 2;
|
|
768
|
+
break;
|
|
769
|
+
case (PICInterface.PIC_MMT):
|
|
770
|
+
nativeDt.setMinutes(breakParams.minute);
|
|
771
|
+
outIdx += 2;
|
|
772
|
+
len -= 2;
|
|
773
|
+
break;
|
|
774
|
+
case (PICInterface.PIC_SS):
|
|
775
|
+
nativeDt.setSeconds(breakParams.second);
|
|
776
|
+
outIdx += 2;
|
|
777
|
+
len -= 2;
|
|
778
|
+
break;
|
|
779
|
+
default:
|
|
780
|
+
outIdx++;
|
|
781
|
+
len--;
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
return nativeDt;
|
|
785
|
+
}
|
|
786
|
+
time_2_a_pic(AsciiStr, AsciiL, time, pic, time_pic_Z_edt, milliSeconds) {
|
|
787
|
+
let hour = 0;
|
|
788
|
+
let minute = 0;
|
|
789
|
+
let second = 0;
|
|
790
|
+
let millisec = 0;
|
|
791
|
+
let Ascii = NString.ToCharArray(AsciiStr);
|
|
792
|
+
let breakParams = new TimeBreakParams(hour, minute, second);
|
|
793
|
+
let timeSec;
|
|
794
|
+
if (milliSeconds) {
|
|
795
|
+
timeSec = Math.floor(time / 1000);
|
|
796
|
+
millisec = time - timeSec * 1000;
|
|
797
|
+
}
|
|
798
|
+
else {
|
|
799
|
+
timeSec = time;
|
|
800
|
+
}
|
|
801
|
+
DisplayConvertor.time_break(breakParams, timeSec);
|
|
802
|
+
hour = breakParams.hour;
|
|
803
|
+
minute = breakParams.minute;
|
|
804
|
+
second = breakParams.second;
|
|
805
|
+
let result;
|
|
806
|
+
if (pic.getMaskSize() > AsciiL) {
|
|
807
|
+
MemoryUtil.char_memset(Ascii, 0, '*', AsciiL);
|
|
808
|
+
result = NString.FromChars(Ascii);
|
|
809
|
+
}
|
|
810
|
+
else {
|
|
811
|
+
if (pic.zeroFill()) {
|
|
812
|
+
if (timeSec === 0 && (!milliSeconds || millisec === 0)) {
|
|
813
|
+
if (time_pic_Z_edt) {
|
|
814
|
+
for (let intx = 0; intx < pic.getMaskSize(); intx = intx + 1) {
|
|
815
|
+
if (Ascii[intx] <= '\u001f') {
|
|
816
|
+
Ascii[intx] = pic.getZeroPad();
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
result = NString.FromChars(Ascii);
|
|
820
|
+
return result;
|
|
821
|
+
}
|
|
822
|
+
MemoryUtil.char_memset(Ascii, 0, pic.getZeroPad(), pic.getMaskSize());
|
|
823
|
+
result = NString.FromChars(Ascii);
|
|
824
|
+
return result;
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
let I = 0;
|
|
828
|
+
let am = 0;
|
|
829
|
+
let len = pic.getMaskSize();
|
|
830
|
+
let HourI = -1;
|
|
831
|
+
while (I < len) {
|
|
832
|
+
switch (Ascii[I].charCodeAt(0)) {
|
|
833
|
+
case (PICInterface.PIC_HH):
|
|
834
|
+
HourI = I;
|
|
835
|
+
I += 2;
|
|
836
|
+
break;
|
|
837
|
+
case (PICInterface.PIC_MMT):
|
|
838
|
+
this.int_2_a(Ascii, I, 2, minute, '0');
|
|
839
|
+
I += 2;
|
|
840
|
+
break;
|
|
841
|
+
case (PICInterface.PIC_SS):
|
|
842
|
+
this.int_2_a(Ascii, I, 2, second, '0');
|
|
843
|
+
I += 2;
|
|
844
|
+
break;
|
|
845
|
+
case (PICInterface.PIC_MS):
|
|
846
|
+
this.int_2_a(Ascii, I, 3, millisec, '0');
|
|
847
|
+
I += 3;
|
|
848
|
+
break;
|
|
849
|
+
case (PICInterface.PIC_PM):
|
|
850
|
+
am = 1;
|
|
851
|
+
let tmpHour = hour % 24;
|
|
852
|
+
if (tmpHour < 12 || tmpHour === 0)
|
|
853
|
+
MemoryUtil.char_memcpy(Ascii, I, NString.ToCharArray("am"), 0, 2);
|
|
854
|
+
else
|
|
855
|
+
MemoryUtil.char_memcpy(Ascii, I, NString.ToCharArray("pm"), 0, 2);
|
|
856
|
+
I += 2;
|
|
857
|
+
break;
|
|
858
|
+
default:
|
|
859
|
+
I++;
|
|
860
|
+
break;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
if (HourI >= 0) {
|
|
864
|
+
if (am > 0) {
|
|
865
|
+
hour = hour % 24;
|
|
866
|
+
if (hour === 0) {
|
|
867
|
+
hour = 12;
|
|
868
|
+
}
|
|
869
|
+
else {
|
|
870
|
+
hour = hour % 12;
|
|
871
|
+
if (hour === 0) {
|
|
872
|
+
hour = 12;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
this.int_2_a(Ascii, HourI, 2, hour, (am !== 0 && hour < 10) ? ' ' : '0');
|
|
877
|
+
}
|
|
878
|
+
result = NString.FromChars(Ascii);
|
|
879
|
+
}
|
|
880
|
+
return result;
|
|
881
|
+
}
|
|
882
|
+
static time_break(breakParams, time) {
|
|
883
|
+
if (time <= 0) {
|
|
884
|
+
breakParams.second = 0;
|
|
885
|
+
breakParams.minute = 0;
|
|
886
|
+
breakParams.hour = 0;
|
|
887
|
+
}
|
|
888
|
+
else {
|
|
889
|
+
breakParams.hour = Math.floor(time / 3600);
|
|
890
|
+
time = time - breakParams.hour * 3600;
|
|
891
|
+
breakParams.minute = Math.floor(time / 60);
|
|
892
|
+
breakParams.second = time - breakParams.minute * 60;
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
fromMgLogicalToNativeLogical(dataStr) {
|
|
896
|
+
let nativeVal;
|
|
897
|
+
nativeVal = (dataStr.charAt(0) === '1') ? true : false;
|
|
898
|
+
return nativeVal;
|
|
899
|
+
}
|
|
900
|
+
fromNativeLogicalToMgLogical(dispVal) {
|
|
901
|
+
let mgVal;
|
|
902
|
+
mgVal = (dispVal === true) ? "1" : "0";
|
|
903
|
+
return mgVal;
|
|
904
|
+
}
|
|
905
|
+
win_rng_bool(rng) {
|
|
906
|
+
if (rng === null || rng.length === 0) {
|
|
907
|
+
rng = "True, False";
|
|
908
|
+
}
|
|
909
|
+
return rng;
|
|
910
|
+
}
|
|
911
|
+
toNum(dispValue, pic, compIdx) {
|
|
912
|
+
let mgNum = new NUM_TYPE(dispValue, pic, compIdx);
|
|
913
|
+
return mgNum.toXMLrecord();
|
|
914
|
+
}
|
|
915
|
+
a_2_date_pic_datemode(str, str_len, pic, mask, compIdx) {
|
|
916
|
+
let pos = 0;
|
|
917
|
+
let year_in_pic = false;
|
|
918
|
+
let month_in_pic = false;
|
|
919
|
+
let day_in_pic = false;
|
|
920
|
+
let inp = false;
|
|
921
|
+
let bYearIsZero = false;
|
|
922
|
+
let era_year = 0;
|
|
923
|
+
let intRef = new IntRef(0);
|
|
924
|
+
let intPicIdxOfs = 0;
|
|
925
|
+
let millenium = 0;
|
|
926
|
+
let dateParams;
|
|
927
|
+
let len = Math.min(str.length, pic.getMaskSize());
|
|
928
|
+
if (str.length < mask.length)
|
|
929
|
+
str.length = mask.length;
|
|
930
|
+
let year = 0;
|
|
931
|
+
let month = 1;
|
|
932
|
+
let day = 1;
|
|
933
|
+
let doy = 1;
|
|
934
|
+
let usedoy = false;
|
|
935
|
+
let i;
|
|
936
|
+
for (i = 0; i < str_len; i = i + 1) {
|
|
937
|
+
if (str[i] !== '0' && str[i] !== ' ') {
|
|
938
|
+
break;
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
if (i === str_len)
|
|
942
|
+
return 0;
|
|
943
|
+
while (pos < str_len && pos + intPicIdxOfs < len) {
|
|
944
|
+
switch (mask[pos + intPicIdxOfs].charCodeAt(0)) {
|
|
945
|
+
case PICInterface.PIC_YY:
|
|
946
|
+
year_in_pic = true;
|
|
947
|
+
inp = true;
|
|
948
|
+
year = this.date_a_2_i(str, 2, pos);
|
|
949
|
+
pos += 2;
|
|
950
|
+
if (year === 0)
|
|
951
|
+
bYearIsZero = true;
|
|
952
|
+
let century_year = this._environment.GetCentury(compIdx) % 100;
|
|
953
|
+
if (year < century_year)
|
|
954
|
+
year += 100;
|
|
955
|
+
year += this._environment.GetCentury(compIdx) - century_year;
|
|
956
|
+
if (this._environment.GetDateMode(compIdx) === 'B')
|
|
957
|
+
year -= PICInterface.DATE_BUDDHIST_GAP;
|
|
958
|
+
break;
|
|
959
|
+
case (PICInterface.PIC_YYYY):
|
|
960
|
+
year_in_pic = true;
|
|
961
|
+
inp = true;
|
|
962
|
+
let YearDigitsNo;
|
|
963
|
+
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
964
|
+
for (YearDigitsNo = 0; YearDigitsNo < 4 && pos + YearDigitsNo < str.length && UtilStrByteMode.isDigit(str[pos + YearDigitsNo]); YearDigitsNo++) {
|
|
965
|
+
}
|
|
966
|
+
i = YearDigitsNo;
|
|
967
|
+
}
|
|
968
|
+
else {
|
|
969
|
+
for (i = 0; pos + i < str.length && str[pos + i] !== this.DATECHAR.toString() && i < 4; i++) {
|
|
970
|
+
}
|
|
971
|
+
for (YearDigitsNo = 0; pos + YearDigitsNo < str.length && UtilStrByteMode.isDigit(str[pos + YearDigitsNo]) &&
|
|
972
|
+
YearDigitsNo < 4; YearDigitsNo++) {
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
976
|
+
if (i < 4 && str.length < mask.length)
|
|
977
|
+
this.move_date(str, pos, 4 - i, str.length);
|
|
978
|
+
}
|
|
979
|
+
else {
|
|
980
|
+
if (i < 4 && len < mask.length) {
|
|
981
|
+
this.move_date(str, pos, 4 - i, len);
|
|
982
|
+
len = len + 4 - i;
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
year = this.date_a_2_i(str, 4, pos);
|
|
986
|
+
pos += 4;
|
|
987
|
+
if (year === 0)
|
|
988
|
+
bYearIsZero = true;
|
|
989
|
+
if (YearDigitsNo <= 2) {
|
|
990
|
+
century_year = this._environment.GetCentury(compIdx) % 100;
|
|
991
|
+
if (year < century_year)
|
|
992
|
+
year += 100;
|
|
993
|
+
year += this._environment.GetCentury(compIdx) - century_year;
|
|
994
|
+
}
|
|
995
|
+
if (this._environment.GetDateMode(compIdx) === 'B')
|
|
996
|
+
year -= PICInterface.DATE_BUDDHIST_GAP;
|
|
997
|
+
break;
|
|
998
|
+
case PICInterface.PIC_HYYYYY:
|
|
999
|
+
inp = true;
|
|
1000
|
+
let quotes = 0;
|
|
1001
|
+
if (len > pos + 5 && mask[pos + 5].charCodeAt(0) === (PICInterface.PIC_HYYYYY))
|
|
1002
|
+
quotes = 1;
|
|
1003
|
+
year = HebrewDate.dateheb_h_2_i(str, 5 + quotes, pos);
|
|
1004
|
+
pos += 5 + quotes;
|
|
1005
|
+
if (year === 0)
|
|
1006
|
+
bYearIsZero = true;
|
|
1007
|
+
break;
|
|
1008
|
+
case PICInterface.PIC_HL:
|
|
1009
|
+
intPicIdxOfs = HebrewDate.dateheb_h_2_i(str, 1, pos);
|
|
1010
|
+
pos++;
|
|
1011
|
+
break;
|
|
1012
|
+
case PICInterface.PIC_HDD:
|
|
1013
|
+
inp = true;
|
|
1014
|
+
quotes = 0;
|
|
1015
|
+
if (len > pos + 2 && mask[pos + 2].charCodeAt(0) === PICInterface.PIC_HDD)
|
|
1016
|
+
quotes = 1;
|
|
1017
|
+
day = HebrewDate.dateheb_h_2_i(str, 2 + quotes, pos);
|
|
1018
|
+
pos += 2 + quotes;
|
|
1019
|
+
break;
|
|
1020
|
+
case PICInterface.PIC_MMD:
|
|
1021
|
+
inp = true;
|
|
1022
|
+
month_in_pic = true;
|
|
1023
|
+
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
1024
|
+
if ((str.length === pos + 1 || str[pos + 1].charCodeAt(0) === this.DATECHAR || !UtilStrByteMode.isDigit(str[pos + 1])) && str.length < mask.length)
|
|
1025
|
+
this.move_date(str, pos, 1, str.length);
|
|
1026
|
+
}
|
|
1027
|
+
else {
|
|
1028
|
+
if (str[pos + 1].charCodeAt(0) === this.DATECHAR && len < mask.length) {
|
|
1029
|
+
this.move_date(str, pos, 1, len);
|
|
1030
|
+
len += 1;
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
month = this.date_a_2_i(str, 2, pos);
|
|
1034
|
+
pos += 2;
|
|
1035
|
+
break;
|
|
1036
|
+
case PICInterface.PIC_MMM:
|
|
1037
|
+
inp = true;
|
|
1038
|
+
month_in_pic = true;
|
|
1039
|
+
intRef.val = pos;
|
|
1040
|
+
month = this.date_MMM_2_m(str, mask, intRef, len, pic.isHebrew());
|
|
1041
|
+
pos = intRef.val;
|
|
1042
|
+
if (pic.isHebrew() && month === 14)
|
|
1043
|
+
month = 6;
|
|
1044
|
+
break;
|
|
1045
|
+
case (PICInterface.PIC_DD):
|
|
1046
|
+
inp = true;
|
|
1047
|
+
day_in_pic = true;
|
|
1048
|
+
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
1049
|
+
if ((str.length === pos + 1 || str[pos + 1].charCodeAt(0) === this.DATECHAR || !UtilStrByteMode.isDigit(str[pos + 1])) && str.length < mask.length)
|
|
1050
|
+
this.move_date(str, pos, 1, str.length);
|
|
1051
|
+
}
|
|
1052
|
+
else {
|
|
1053
|
+
if (str[pos + 1].charCodeAt(0) === this.DATECHAR && len < mask.length) {
|
|
1054
|
+
this.move_date(str, pos, 1, len);
|
|
1055
|
+
len += 1;
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
day = this.date_a_2_i(str, 2, pos);
|
|
1059
|
+
pos += 2;
|
|
1060
|
+
break;
|
|
1061
|
+
case (PICInterface.PIC_DDD):
|
|
1062
|
+
inp = true;
|
|
1063
|
+
usedoy = true;
|
|
1064
|
+
day_in_pic = true;
|
|
1065
|
+
doy = this.date_a_2_i(str, 3, pos);
|
|
1066
|
+
pos += 3;
|
|
1067
|
+
break;
|
|
1068
|
+
case (PICInterface.PIC_DDDD):
|
|
1069
|
+
inp = true;
|
|
1070
|
+
day_in_pic = true;
|
|
1071
|
+
day = this.date_a_2_i(str, 2, pos);
|
|
1072
|
+
pos += 2 + 2;
|
|
1073
|
+
break;
|
|
1074
|
+
case (PICInterface.PIC_YJ):
|
|
1075
|
+
year_in_pic = true;
|
|
1076
|
+
inp = true;
|
|
1077
|
+
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
1078
|
+
if ((str.length === pos + 1 || str[pos + 1].charCodeAt(0) === this.DATECHAR || !UtilStrByteMode.isDigit(str[pos + 1])) && str.length < mask.length)
|
|
1079
|
+
this.move_date(str, pos, 1, str.length);
|
|
1080
|
+
}
|
|
1081
|
+
year = this.date_a_2_i(str, 2, pos);
|
|
1082
|
+
pos += 2;
|
|
1083
|
+
let str1 = NString.FromChars(str);
|
|
1084
|
+
era_year = UtilDateJpn.getInstance().getStartYearOfEra(str1, pic.getMask());
|
|
1085
|
+
if (era_year === 0)
|
|
1086
|
+
return 0;
|
|
1087
|
+
year += era_year - 1;
|
|
1088
|
+
if (year === 0)
|
|
1089
|
+
bYearIsZero = true;
|
|
1090
|
+
break;
|
|
1091
|
+
default:
|
|
1092
|
+
if (UtilStrByteMode.isLocaleDefLangDBCS()) {
|
|
1093
|
+
if (UtilStrByteMode.isHalfWidth(str[pos]) === false &&
|
|
1094
|
+
UtilStrByteMode.isHalfWidth(mask[pos + intPicIdxOfs]))
|
|
1095
|
+
intPicIdxOfs++;
|
|
1096
|
+
}
|
|
1097
|
+
pos += 1;
|
|
1098
|
+
break;
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
if (bYearIsZero) {
|
|
1102
|
+
if (!month_in_pic)
|
|
1103
|
+
month = 0;
|
|
1104
|
+
if (!day_in_pic && month === 0)
|
|
1105
|
+
day = 0;
|
|
1106
|
+
}
|
|
1107
|
+
if (day === 0 && month === 0 && (bYearIsZero || year === 0))
|
|
1108
|
+
return (0);
|
|
1109
|
+
if (!inp)
|
|
1110
|
+
return (0);
|
|
1111
|
+
if (pic.isHebrew()) {
|
|
1112
|
+
if (year > 0) {
|
|
1113
|
+
if (millenium === 0)
|
|
1114
|
+
millenium = 5;
|
|
1115
|
+
year += millenium * 1000;
|
|
1116
|
+
}
|
|
1117
|
+
return (HebrewDate.dateheb_2_d(year, month, day));
|
|
1118
|
+
}
|
|
1119
|
+
if ((year === 0) && !year_in_pic) {
|
|
1120
|
+
dateParams = this.date_sys();
|
|
1121
|
+
year = dateParams.year;
|
|
1122
|
+
}
|
|
1123
|
+
return (this.date_4_calender(year, month, day, doy, usedoy));
|
|
1124
|
+
}
|
|
1125
|
+
date_a_2_i(s, len, pos) {
|
|
1126
|
+
if (arguments.length === 3 && (s === null || s instanceof Array) && (len === null || len.constructor === Number) && (pos === null || pos.constructor === Number)) {
|
|
1127
|
+
return this.date_a_2_i_0(s, len, pos);
|
|
1128
|
+
}
|
|
1129
|
+
return this.date_a_2_i_1(s, len, pos);
|
|
1130
|
+
}
|
|
1131
|
+
date_a_2_i_0(s, len, pos) {
|
|
1132
|
+
let array = new Array(len);
|
|
1133
|
+
let mgNum = new NUM_TYPE();
|
|
1134
|
+
for (let i = 0; i < len; i = i + 1) {
|
|
1135
|
+
array[i] = s[pos + i];
|
|
1136
|
+
}
|
|
1137
|
+
return mgNum.a_2_long(NString.FromChars(array));
|
|
1138
|
+
}
|
|
1139
|
+
move_date(str, pos, moveby, len) {
|
|
1140
|
+
if (arguments.length === 4 && (str === null || str instanceof Array) && (pos === null || pos.constructor === Number) && (moveby === null || moveby.constructor === Number) && (len === null || len.constructor === Number)) {
|
|
1141
|
+
this.move_date_0(str, pos, moveby, len);
|
|
1142
|
+
return;
|
|
1143
|
+
}
|
|
1144
|
+
this.move_date_1(str, pos, moveby, len);
|
|
1145
|
+
}
|
|
1146
|
+
move_date_0(str, pos, moveby, len) {
|
|
1147
|
+
MemoryUtil.char_memmove(str, pos + moveby, str, pos, len - (pos + moveby) + 1);
|
|
1148
|
+
MemoryUtil.char_memset(str, pos, '0', moveby);
|
|
1149
|
+
}
|
|
1150
|
+
date_MMM_2_m(str, mask, pos, len, isHebrew) {
|
|
1151
|
+
let l;
|
|
1152
|
+
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
1153
|
+
let maskPos = UtilStrByteMode.convPos(NString.FromChars(str), NString.FromChars(mask), pos.val, false);
|
|
1154
|
+
l = this.date_msk_cnt(mask, maskPos, (len - maskPos));
|
|
1155
|
+
}
|
|
1156
|
+
else {
|
|
1157
|
+
l = this.date_msk_cnt(mask, pos.val, (len - pos.val));
|
|
1158
|
+
}
|
|
1159
|
+
let strPos = pos.val;
|
|
1160
|
+
pos.val = pos.val + l;
|
|
1161
|
+
len = MemoryUtil.mem_trim(str, strPos, l);
|
|
1162
|
+
if (len === 0) {
|
|
1163
|
+
return 0;
|
|
1164
|
+
}
|
|
1165
|
+
else {
|
|
1166
|
+
let strB = NString.FromChars(str, strPos, len);
|
|
1167
|
+
let monthNames;
|
|
1168
|
+
if (isHebrew) {
|
|
1169
|
+
monthNames = HebrewDate.GetLocalMonths();
|
|
1170
|
+
}
|
|
1171
|
+
else {
|
|
1172
|
+
let months = Events.GetMessageString(MsgInterface.MONTHS_PTR);
|
|
1173
|
+
monthNames = DateUtil.getLocalMonths(months);
|
|
1174
|
+
}
|
|
1175
|
+
for (let i = 1; i < monthNames.length; i = i + 1) {
|
|
1176
|
+
if (NString.Compare(monthNames[i].substr(0, len), strB, true) === 0)
|
|
1177
|
+
return i;
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
return 0;
|
|
1181
|
+
}
|
|
1182
|
+
date_sys() {
|
|
1183
|
+
let date = new DateBreakParams();
|
|
1184
|
+
let CurrDate = DateTime.Now;
|
|
1185
|
+
date.year = CurrDate.Year;
|
|
1186
|
+
date.month = CurrDate.Month;
|
|
1187
|
+
date.day = CurrDate.Day;
|
|
1188
|
+
return date;
|
|
1189
|
+
}
|
|
1190
|
+
date_magic(utcDate) {
|
|
1191
|
+
let dateTime;
|
|
1192
|
+
if (utcDate) {
|
|
1193
|
+
dateTime = DateTime.UtcNow;
|
|
1194
|
+
}
|
|
1195
|
+
else {
|
|
1196
|
+
dateTime = DateTime.Now;
|
|
1197
|
+
}
|
|
1198
|
+
let year = dateTime.Year;
|
|
1199
|
+
let month = dateTime.Month;
|
|
1200
|
+
let day = dateTime.Day;
|
|
1201
|
+
return this.date_4_calender(year, month, day, 1, false);
|
|
1202
|
+
}
|
|
1203
|
+
time_magic(utcTime) {
|
|
1204
|
+
return DateTime.GetTotalSecondsFromMidnight(utcTime, new Date());
|
|
1205
|
+
}
|
|
1206
|
+
mtime_magic(utcTime) {
|
|
1207
|
+
return DateTime.GetTotalMilliSecondsFromMidnight(utcTime, new Date());
|
|
1208
|
+
}
|
|
1209
|
+
date_4_calender(year, month, day, doy, usedoy) {
|
|
1210
|
+
let LeapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
|
|
1211
|
+
if (usedoy) {
|
|
1212
|
+
if (doy === 0) {
|
|
1213
|
+
return 0;
|
|
1214
|
+
}
|
|
1215
|
+
if (doy > 366 || (!LeapYear && doy > 365)) {
|
|
1216
|
+
return (1000000000);
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
else {
|
|
1220
|
+
if (day === 0 && month === 0 && year === 0) {
|
|
1221
|
+
return 0;
|
|
1222
|
+
}
|
|
1223
|
+
if (day === 0 || month === 0 || year === 0 || month > 12) {
|
|
1224
|
+
return 1000000000;
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
year = year - 1;
|
|
1228
|
+
let num = Math.floor(year / 400);
|
|
1229
|
+
year = year - num * 400;
|
|
1230
|
+
let num2 = Math.floor(year / 100);
|
|
1231
|
+
year = year - num2 * 100;
|
|
1232
|
+
let num3 = Math.floor(year / 4);
|
|
1233
|
+
year = year - num3 * 4;
|
|
1234
|
+
if (!usedoy) {
|
|
1235
|
+
let num4 = PICInterface.date_day_tab[month - 1];
|
|
1236
|
+
let num5 = PICInterface.date_day_tab[month];
|
|
1237
|
+
if (LeapYear) {
|
|
1238
|
+
if (month > 1) {
|
|
1239
|
+
num5 = num5 + 1;
|
|
1240
|
+
if (month > 2) {
|
|
1241
|
+
num4 = num4 + 1;
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
if (day > num5 - num4) {
|
|
1246
|
+
return 1000000000;
|
|
1247
|
+
}
|
|
1248
|
+
doy = num4 + day;
|
|
1249
|
+
}
|
|
1250
|
+
return num * 146097 + num2 * 36524 + num3 * 1461 + year * 365 + doy;
|
|
1251
|
+
}
|
|
1252
|
+
fromNativeTimeToMgTime(dispValue) {
|
|
1253
|
+
let mgNum = new NUM_TYPE();
|
|
1254
|
+
let numVal = this.fromNativeTimeToMgTimeNumber(dispValue);
|
|
1255
|
+
mgNum.NUM_4_LONG(numVal);
|
|
1256
|
+
return mgNum.toXMLrecord();
|
|
1257
|
+
}
|
|
1258
|
+
fromNativeTimeToMgTimeNumber(dispValue) {
|
|
1259
|
+
let numVal = this.time_2_int(dispValue.getHours(), dispValue.getMinutes(), dispValue.getSeconds());
|
|
1260
|
+
return numVal;
|
|
1261
|
+
}
|
|
1262
|
+
a_2_time(Ascii, picOrAsciiL, milliSecondsOrMask, milliSeconds) {
|
|
1263
|
+
if (arguments.length === 3)
|
|
1264
|
+
return this.a_2_time_0(Ascii, picOrAsciiL, milliSecondsOrMask);
|
|
1265
|
+
return this.a_2_time_1(Ascii, picOrAsciiL, milliSecondsOrMask, milliSeconds);
|
|
1266
|
+
}
|
|
1267
|
+
a_2_time_0(Ascii, pic, milliSeconds) {
|
|
1268
|
+
return this.a_2_time(Ascii, Ascii.length, NString.ToCharArray(pic.getMask()), milliSeconds);
|
|
1269
|
+
}
|
|
1270
|
+
a_2_time_1(Ascii, AsciiL, mask, milliSeconds) {
|
|
1271
|
+
let mgNum = new NUM_TYPE();
|
|
1272
|
+
let I = 0;
|
|
1273
|
+
let len = mask.length;
|
|
1274
|
+
if (len > AsciiL) {
|
|
1275
|
+
len = AsciiL;
|
|
1276
|
+
}
|
|
1277
|
+
let ampm = 0;
|
|
1278
|
+
let hour = 0;
|
|
1279
|
+
let minute = 0;
|
|
1280
|
+
let second = 0;
|
|
1281
|
+
let millisecond = 0;
|
|
1282
|
+
while (I < len) {
|
|
1283
|
+
let maskLength;
|
|
1284
|
+
let maxMaskLen;
|
|
1285
|
+
switch (mask[I].charCodeAt(0)) {
|
|
1286
|
+
case (PICInterface.PIC_HH):
|
|
1287
|
+
case (PICInterface.PIC_MMT):
|
|
1288
|
+
case (PICInterface.PIC_SS):
|
|
1289
|
+
case (PICInterface.PIC_PM):
|
|
1290
|
+
maxMaskLen = 2;
|
|
1291
|
+
break;
|
|
1292
|
+
case (PICInterface.PIC_MS):
|
|
1293
|
+
maxMaskLen = 3;
|
|
1294
|
+
break;
|
|
1295
|
+
default:
|
|
1296
|
+
maxMaskLen = 1;
|
|
1297
|
+
break;
|
|
1298
|
+
}
|
|
1299
|
+
maskLength = Math.min(maxMaskLen, len - I);
|
|
1300
|
+
switch (mask[I].charCodeAt(0)) {
|
|
1301
|
+
case (PICInterface.PIC_HH):
|
|
1302
|
+
{
|
|
1303
|
+
hour = mgNum.a_2_long(Ascii.substr(I, maskLength));
|
|
1304
|
+
}
|
|
1305
|
+
break;
|
|
1306
|
+
case (PICInterface.PIC_MMT):
|
|
1307
|
+
{
|
|
1308
|
+
minute = mgNum.a_2_long(Ascii.substr(I, maskLength));
|
|
1309
|
+
}
|
|
1310
|
+
break;
|
|
1311
|
+
case (PICInterface.PIC_SS):
|
|
1312
|
+
{
|
|
1313
|
+
second = mgNum.a_2_long(Ascii.substr(I, maskLength));
|
|
1314
|
+
}
|
|
1315
|
+
break;
|
|
1316
|
+
case (PICInterface.PIC_MS):
|
|
1317
|
+
{
|
|
1318
|
+
millisecond = mgNum.a_2_long(Ascii.substr(I, maskLength));
|
|
1319
|
+
}
|
|
1320
|
+
break;
|
|
1321
|
+
case (PICInterface.PIC_PM):
|
|
1322
|
+
ampm = 0;
|
|
1323
|
+
let c0 = Ascii[I];
|
|
1324
|
+
let c1;
|
|
1325
|
+
c0 = c0.toUpperCase();
|
|
1326
|
+
if (I + 1 < len) {
|
|
1327
|
+
c1 = Ascii[I + 1];
|
|
1328
|
+
c1 = c1.toUpperCase();
|
|
1329
|
+
if (c1 === 'M') {
|
|
1330
|
+
if (c0 === 'A')
|
|
1331
|
+
ampm = -1;
|
|
1332
|
+
if (c0 === 'P')
|
|
1333
|
+
ampm = 1;
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
break;
|
|
1337
|
+
default:
|
|
1338
|
+
break;
|
|
1339
|
+
}
|
|
1340
|
+
I += maskLength;
|
|
1341
|
+
}
|
|
1342
|
+
if (second > 59 || minute > 59)
|
|
1343
|
+
return (0);
|
|
1344
|
+
if (ampm !== 0)
|
|
1345
|
+
if (ampm === -1) {
|
|
1346
|
+
if (hour === 12)
|
|
1347
|
+
hour = 0;
|
|
1348
|
+
}
|
|
1349
|
+
else if (hour < 12)
|
|
1350
|
+
hour += 12;
|
|
1351
|
+
if (milliSeconds)
|
|
1352
|
+
return this.time_2_int(hour, minute, second) * 1000 + millisecond;
|
|
1353
|
+
else
|
|
1354
|
+
return this.time_2_int(hour, minute, second);
|
|
1355
|
+
}
|
|
1356
|
+
time_2_int(hour, minute, second) {
|
|
1357
|
+
return hour * 3600 + minute * 60 + second;
|
|
1358
|
+
}
|
|
1359
|
+
static toBoolean(boolStr) {
|
|
1360
|
+
return boolStr !== null && boolStr === "1";
|
|
1361
|
+
}
|
|
1362
|
+
a_2_date(str, Format, compIdx) {
|
|
1363
|
+
return this.a_2_date_datemode(str, Format, compIdx);
|
|
1364
|
+
}
|
|
1365
|
+
a_2_date_pic(str, pic, mask, compIdx) {
|
|
1366
|
+
if (str === null) {
|
|
1367
|
+
str = "";
|
|
1368
|
+
}
|
|
1369
|
+
return this.a_2_date_pic_datemode(NString.ToCharArray(str), str.length, pic, NString.ToCharArray(mask), compIdx);
|
|
1370
|
+
}
|
|
1371
|
+
to_a(outVal, out_len, date, Format, compIdx) {
|
|
1372
|
+
return this.to_a_datemode(outVal, out_len, date, Format, false, compIdx);
|
|
1373
|
+
}
|
|
1374
|
+
a_2_date_datemode(str, Format, compIdx) {
|
|
1375
|
+
let pIC = new PIC(Format, StorageAttribute.DATE, compIdx);
|
|
1376
|
+
if (str === null) {
|
|
1377
|
+
str = "";
|
|
1378
|
+
}
|
|
1379
|
+
return this.a_2_date_pic_datemode(NString.ToCharArray(str), str.length, pIC, NString.ToCharArray(pIC.getMask()), compIdx);
|
|
1380
|
+
}
|
|
1381
|
+
to_a_datemode(outVal, out_len, date, Format, ignore_dt_fmt, compIdx) {
|
|
1382
|
+
let pic = new PIC(Format, StorageAttribute.DATE, compIdx);
|
|
1383
|
+
if (outVal === null) {
|
|
1384
|
+
outVal = pic.getMask();
|
|
1385
|
+
}
|
|
1386
|
+
return this.to_a_pic_datemode(outVal, out_len, date, pic, true, ignore_dt_fmt, compIdx);
|
|
1387
|
+
}
|
|
1388
|
+
date_a_2_i_1(s, len, pos) {
|
|
1389
|
+
let mgNum = new NUM_TYPE();
|
|
1390
|
+
let str;
|
|
1391
|
+
str = s.substr(pos, len);
|
|
1392
|
+
return mgNum.a_2_long(str);
|
|
1393
|
+
}
|
|
1394
|
+
move_date_1(str, pos, moveby, len) {
|
|
1395
|
+
str = StrUtil.memmove(str, pos + moveby, str, pos, len - pos);
|
|
1396
|
+
str = StrUtil.memset(str, pos, '0', moveby);
|
|
1397
|
+
return str;
|
|
1398
|
+
}
|
|
1399
|
+
time_2_a(Ascii, AsciiL, time, Format, compIdx, milliSeconds) {
|
|
1400
|
+
if (StrUtil.rtrim(Format).length === 0) {
|
|
1401
|
+
Format = "HH:MM:SS";
|
|
1402
|
+
}
|
|
1403
|
+
let pic = new PIC(Format, StorageAttribute.TIME, compIdx);
|
|
1404
|
+
if (Ascii === null) {
|
|
1405
|
+
Ascii = pic.getMask();
|
|
1406
|
+
}
|
|
1407
|
+
return this.time_2_a_pic(Ascii, AsciiL, time, pic, false, milliSeconds);
|
|
1408
|
+
}
|
|
1409
|
+
toLogical(dispValue, pic, rangeStr) {
|
|
1410
|
+
dispValue = dispValue.trim();
|
|
1411
|
+
if (dispValue === null || dispValue.length === 0) {
|
|
1412
|
+
dispValue = "False";
|
|
1413
|
+
}
|
|
1414
|
+
return this.disp_2_logical(dispValue, pic.getMask(), rangeStr);
|
|
1415
|
+
}
|
|
1416
|
+
disp_2_logical(dispValue, mask, rangeStr) {
|
|
1417
|
+
let strippedValue = new StringBuilder(dispValue.length);
|
|
1418
|
+
rangeStr = this.win_rng_bool(rangeStr);
|
|
1419
|
+
rangeStr = StrUtil.makePrintableTokens(rangeStr, SEQ_2_HTML);
|
|
1420
|
+
let i = rangeStr.indexOf(',');
|
|
1421
|
+
let trueStr = rangeStr.substr(0, i);
|
|
1422
|
+
trueStr = StrUtil.makePrintableTokens(trueStr, HTML_2_STR);
|
|
1423
|
+
i = 0;
|
|
1424
|
+
for (i = 0; i < dispValue.length && i < mask.length; i++) {
|
|
1425
|
+
if (mask.charCodeAt(i) === PICInterface.PIC_X) {
|
|
1426
|
+
strippedValue.Append(dispValue.charAt(i));
|
|
1427
|
+
}
|
|
1428
|
+
}
|
|
1429
|
+
let val = strippedValue.ToString();
|
|
1430
|
+
if (trueStr.length < val.length) {
|
|
1431
|
+
val = val.substr(0, trueStr.length);
|
|
1432
|
+
}
|
|
1433
|
+
else {
|
|
1434
|
+
if (val.length < trueStr.length) {
|
|
1435
|
+
trueStr = trueStr.substr(0, val.length);
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1438
|
+
return (val.toUpperCase() === trueStr.toUpperCase()) ? "1" : "0";
|
|
1439
|
+
}
|
|
1440
|
+
toAlpha(dispValue, pic) {
|
|
1441
|
+
let picture = pic.getMask();
|
|
1442
|
+
let buffer = new StringBuilder(pic.getMaskSize());
|
|
1443
|
+
let IsAlphaDBCS = UtilStrByteMode.isLocaleDefLangDBCS() && pic.isAttrAlpha();
|
|
1444
|
+
let currPicture;
|
|
1445
|
+
let i = currPicture = 0;
|
|
1446
|
+
for (currPicture = i = 0; i < dispValue.length && currPicture < picture.length; i++, currPicture++) {
|
|
1447
|
+
if (DisplayConvertor.isAlphaPositionalDirective(picture.charAt(currPicture))) {
|
|
1448
|
+
buffer.Append(dispValue.charAt(i));
|
|
1449
|
+
if (IsAlphaDBCS) {
|
|
1450
|
+
let strDspValOneChar = dispValue.substr(i, 1);
|
|
1451
|
+
if (UtilStrByteMode.lenB(strDspValOneChar) === 2) {
|
|
1452
|
+
currPicture = currPicture + 1;
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
}
|
|
1457
|
+
return buffer.ToString();
|
|
1458
|
+
}
|
|
1459
|
+
static isAlphaPositionalDirective(toCheck) {
|
|
1460
|
+
let ascii = toCheck.charCodeAt(0);
|
|
1461
|
+
return (ascii === PICInterface.PIC_X || ascii === PICInterface.PIC_U || ascii === PICInterface.PIC_L ||
|
|
1462
|
+
ascii === PICInterface.PIC_N || ascii === PICInterface.PIC_J || ascii === PICInterface.PIC_G || ascii === PICInterface.PIC_S || ascii === PICInterface.PIC_T);
|
|
1463
|
+
}
|
|
1464
|
+
fillAlphaByRange(ContinuousRangeValues, discreteRangeValues, newValue) {
|
|
1465
|
+
let tmpBuffer = this.fillAlphaByDiscreteRangeValues(discreteRangeValues, newValue);
|
|
1466
|
+
if (tmpBuffer !== null) {
|
|
1467
|
+
return tmpBuffer;
|
|
1468
|
+
}
|
|
1469
|
+
else {
|
|
1470
|
+
tmpBuffer = this.fillAlphaByContinuousRangeValues(ContinuousRangeValues, newValue);
|
|
1471
|
+
if (tmpBuffer !== null) {
|
|
1472
|
+
return tmpBuffer;
|
|
1473
|
+
}
|
|
1474
|
+
else {
|
|
1475
|
+
if (discreteRangeValues !== null) {
|
|
1476
|
+
tmpBuffer = this.completeAlphaByRange(discreteRangeValues, newValue);
|
|
1477
|
+
if (tmpBuffer !== null) {
|
|
1478
|
+
return tmpBuffer;
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
return newValue;
|
|
1484
|
+
}
|
|
1485
|
+
fillAlphaByDiscreteRangeValues(discreteRangeValues, newValue) {
|
|
1486
|
+
if (discreteRangeValues !== null) {
|
|
1487
|
+
for (let i = 0; i < discreteRangeValues.length; i = i + 1) {
|
|
1488
|
+
let discreteValue = discreteRangeValues.get_Item(i);
|
|
1489
|
+
let truncatedValue = discreteValue.substr(0, Math.min(newValue.length, discreteValue.length));
|
|
1490
|
+
if (newValue.toUpperCase() === truncatedValue.toUpperCase()) {
|
|
1491
|
+
return discreteValue;
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
return null;
|
|
1496
|
+
}
|
|
1497
|
+
fillAlphaByContinuousRangeValues(ContinuousRangeValues, newValue) {
|
|
1498
|
+
newValue = StrUtil.rtrim(newValue);
|
|
1499
|
+
if (ContinuousRangeValues !== null) {
|
|
1500
|
+
for (let i = 0; i < ContinuousRangeValues.length; i = i + 1) {
|
|
1501
|
+
let from = ContinuousRangeValues.get_Item(i);
|
|
1502
|
+
let to = ContinuousRangeValues.get_Item(i = i + 1);
|
|
1503
|
+
if (NString.CompareOrdinal(newValue, from) >= 0 && NString.CompareOrdinal(newValue, to) <= 0) {
|
|
1504
|
+
return newValue;
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
return null;
|
|
1509
|
+
}
|
|
1510
|
+
completeAlphaByRange(discreteRangeValues, newValue) {
|
|
1511
|
+
let maxCoincide = new Array(2);
|
|
1512
|
+
for (let _ai = 0; _ai < maxCoincide.length; ++_ai)
|
|
1513
|
+
maxCoincide[_ai] = 0;
|
|
1514
|
+
let bestItem = new Array(2);
|
|
1515
|
+
for (let _ai = 0; _ai < bestItem.length; ++_ai)
|
|
1516
|
+
bestItem[_ai] = null;
|
|
1517
|
+
let CHECK_CASE = 0;
|
|
1518
|
+
let IGNORE_CASE = 1;
|
|
1519
|
+
let caseLetters = CHECK_CASE;
|
|
1520
|
+
while (caseLetters === CHECK_CASE || caseLetters === IGNORE_CASE) {
|
|
1521
|
+
let lowerValue;
|
|
1522
|
+
if (caseLetters === CHECK_CASE) {
|
|
1523
|
+
lowerValue = newValue;
|
|
1524
|
+
}
|
|
1525
|
+
else {
|
|
1526
|
+
lowerValue = newValue.toLowerCase();
|
|
1527
|
+
}
|
|
1528
|
+
lowerValue = StrUtil.rtrim(lowerValue);
|
|
1529
|
+
for (let i = 0; i < discreteRangeValues.length; i = i + 1) {
|
|
1530
|
+
let wrongLetter = false;
|
|
1531
|
+
let currCoincide = 0;
|
|
1532
|
+
let rangeItem;
|
|
1533
|
+
if (caseLetters === CHECK_CASE) {
|
|
1534
|
+
rangeItem = discreteRangeValues.get_Item(i);
|
|
1535
|
+
}
|
|
1536
|
+
else {
|
|
1537
|
+
rangeItem = discreteRangeValues.get_Item(i).toLowerCase();
|
|
1538
|
+
}
|
|
1539
|
+
let lowLength = lowerValue.length;
|
|
1540
|
+
let rangeLength = rangeItem.length;
|
|
1541
|
+
if (lowLength < rangeLength) {
|
|
1542
|
+
for (let j = 0; j < lowLength; j = j + 1) {
|
|
1543
|
+
if (!(lowerValue.charAt(j) === rangeItem.charAt(j))) {
|
|
1544
|
+
wrongLetter = true;
|
|
1545
|
+
break;
|
|
1546
|
+
}
|
|
1547
|
+
currCoincide = currCoincide + 1;
|
|
1548
|
+
}
|
|
1549
|
+
}
|
|
1550
|
+
else {
|
|
1551
|
+
wrongLetter = true;
|
|
1552
|
+
}
|
|
1553
|
+
if (currCoincide > maxCoincide[caseLetters] && !wrongLetter) {
|
|
1554
|
+
bestItem[caseLetters] = discreteRangeValues.get_Item(i);
|
|
1555
|
+
maxCoincide[caseLetters] = currCoincide;
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
caseLetters = caseLetters + 1;
|
|
1559
|
+
}
|
|
1560
|
+
if (bestItem[CHECK_CASE] !== null)
|
|
1561
|
+
return bestItem[CHECK_CASE];
|
|
1562
|
+
else {
|
|
1563
|
+
if (bestItem[IGNORE_CASE] !== null)
|
|
1564
|
+
return bestItem[IGNORE_CASE];
|
|
1565
|
+
}
|
|
1566
|
+
return null;
|
|
1567
|
+
}
|
|
1568
|
+
setDateChar(dateChar) {
|
|
1569
|
+
this.DATECHAR = dateChar;
|
|
1570
|
+
}
|
|
1571
|
+
getDateChar() {
|
|
1572
|
+
return this.DATECHAR;
|
|
1573
|
+
}
|
|
1574
|
+
static StringValueToMgValue(value, storageAttribute, filler, length) {
|
|
1575
|
+
switch (storageAttribute) {
|
|
1576
|
+
case StorageAttribute.ALPHA:
|
|
1577
|
+
case StorageAttribute.UNICODE: {
|
|
1578
|
+
let newVal = value;
|
|
1579
|
+
newVal = NString.PadRight(newVal, length, filler);
|
|
1580
|
+
return newVal;
|
|
1581
|
+
}
|
|
1582
|
+
case StorageAttribute.NUMERIC:
|
|
1583
|
+
case StorageAttribute.DATE:
|
|
1584
|
+
case StorageAttribute.TIME:
|
|
1585
|
+
return new NUM_TYPE(value);
|
|
1586
|
+
default:
|
|
1587
|
+
return value;
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
}
|
|
1591
|
+
export class TimeBreakParams {
|
|
1592
|
+
hour = 0;
|
|
1593
|
+
minute = 0;
|
|
1594
|
+
second = 0;
|
|
1595
|
+
constructor(hour_, minute_, second_) {
|
|
1596
|
+
if (arguments.length === 0) {
|
|
1597
|
+
this.constructor_0();
|
|
1598
|
+
return;
|
|
1599
|
+
}
|
|
1600
|
+
this.constructor_1(hour_, minute_, second_);
|
|
1601
|
+
}
|
|
1602
|
+
constructor_0() {
|
|
1603
|
+
}
|
|
1604
|
+
constructor_1(hour_, minute_, second_) {
|
|
1605
|
+
this.hour = hour_;
|
|
1606
|
+
this.minute = minute_;
|
|
1607
|
+
this.second = second_;
|
|
1608
|
+
}
|
|
1609
|
+
}
|
|
1610
|
+
class IntRef {
|
|
1611
|
+
val = 0;
|
|
1612
|
+
constructor(val_) {
|
|
1613
|
+
this.val = val_;
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
class DateNameParams {
|
|
1617
|
+
outVal = null;
|
|
1618
|
+
len = 0;
|
|
1619
|
+
outIdx = 0;
|
|
1620
|
+
constructor(out_, outIdx_, len_) {
|
|
1621
|
+
this.outVal = out_;
|
|
1622
|
+
this.outIdx = outIdx_;
|
|
1623
|
+
this.len = len_;
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
export class DateBreakParams {
|
|
1627
|
+
day = 0;
|
|
1628
|
+
dow = 0;
|
|
1629
|
+
doy = 0;
|
|
1630
|
+
month = 0;
|
|
1631
|
+
year = 0;
|
|
1632
|
+
constructor(year_, month_, day_, doy_, dow_) {
|
|
1633
|
+
if (arguments.length === 0) {
|
|
1634
|
+
this.constructor_0();
|
|
1635
|
+
return;
|
|
1636
|
+
}
|
|
1637
|
+
this.constructor_1(year_, month_, day_, doy_, dow_);
|
|
1638
|
+
}
|
|
1639
|
+
constructor_0() {
|
|
1640
|
+
}
|
|
1641
|
+
constructor_1(year_, month_, day_, doy_, dow_) {
|
|
1642
|
+
this.year = year_;
|
|
1643
|
+
this.month = month_;
|
|
1644
|
+
this.day = day_;
|
|
1645
|
+
this.doy = doy_;
|
|
1646
|
+
this.dow = dow_;
|
|
1647
|
+
}
|
|
1648
|
+
}
|
|
1649
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlzcGxheUNvbnZlcnRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvRGlzcGxheUNvbnZlcnRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxRQUFRLEVBQVEsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RixPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFdBQVcsRUFDWCxlQUFlLEVBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdqRCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLFlBQVksR0FBaUIsSUFBSSxDQUFDO0lBQ2xDLFFBQVEsR0FBVyxDQUFDLENBQUM7SUFDckIsTUFBTSxDQUFDLFNBQVMsR0FBcUIsSUFBSSxDQUFDO0lBRWxELE1BQU0sS0FBSyxRQUFRO1FBQ2pCLElBQUksZ0JBQWdCLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hDLGdCQUFn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SUVudmlyb25tZW50JztcclxuaW1wb3J0IHtQSUN9IGZyb20gJy4vUElDJztcclxuaW1wb3J0IHtEYXRlVGltZSwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0cmluZ0J1aWxkZXJ9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtcclxuICBEYXRlVXRpbCxcclxuICBIVE1MXzJfU1RSLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQSUNJbnRlcmZhY2UsXHJcbiAgU0VRXzJfSFRNTCxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbERhdGVKcG4sXHJcbiAgVXRpbFN0ckJ5dGVNb2RlXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7QmxvYlR5cGV9IGZyb20gJy4uL2RhdGEvQmxvYlR5cGUnO1xyXG5pbXBvcnQge1ZhbGlkYXRpb25EZXRhaWxzQmFzZX0gZnJvbSAnLi9WYWxpZGF0aW9uRGV0YWlsc0Jhc2UnO1xyXG5pbXBvcnQge05VTV9UWVBFfSBmcm9tICcuLi9kYXRhL05VTV9UWVBFJztcclxuaW1wb3J0IHtIZWJyZXdEYXRlfSBmcm9tICcuL0hlYnJld0RhdGUnO1xyXG5pbXBvcnQge0V2ZW50c30gZnJvbSAnLi4vLi4vRXZlbnRzJztcclxuaW1wb3J0IHtHdWlFbnZpcm9ubWVudH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge01lbW9yeVV0aWx9IGZyb20gJy4uLy4uL3V0aWwvTWVtb3J5VXRpbCc7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgRGlzcGxheUNvbnZlcnRvciB7XHJcbiAgcHJpdmF0ZSBfZW52aXJvbm1lbnQ6IElFbnZpcm9ubWVudCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBEQVRFQ0hBUjogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IERpc3BsYXlDb252ZXJ0b3IgPSBudWxsO1xyXG5cclxuICBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IERpc3BsYXlDb252ZXJ0b3Ige1xyXG4gICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuX2luc3RhbmNlID09PSBudWxsKSB7XHJcbiAgICAgIERpc3BsYXlDb252ZXJ0b3IuX2luc3RhbmNlID0gbmV3IERpc3BsYXlDb252ZXJ0b3IoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBEaXNwbGF5Q29udmVydG9yLl9pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fZW52aXJvbm1lbnQgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudDtcclxuICB9XHJcblxyXG4gIGdldE5ld0RhdGVCcmVha1BhcmFtcygpOiBEYXRlQnJlYWtQYXJhbXMge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlQnJlYWtQYXJhbXMoKTtcclxuICB9XHJcblxyXG4gIGdldE5ld1RpbWVCcmVha1BhcmFtcygpOiBUaW1lQnJlYWtQYXJhbXMge1xyXG4gICAgcmV0dXJuIG5ldyBUaW1lQnJlYWtQYXJhbXMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIG9mIGEgdmFsdWUgZnJvbSBpdHMgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWx1ZVwiPiAgdGhlIGludGVybmFsIHZhbHVlIChhcyBzZW50IGluIHRoZSBYTUwpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPiB2YWx1ZSByYW5nZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICAgICAgdGhlIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmcgdG8gZGlzcGxheVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgbWcyZGlzcChtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlciwgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IGFueTtcclxuICBtZzJkaXNwKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgYWx3YXlzRmlsbDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCB0aW1lX2RhdGVfcGljX1pfZWR0OiBib29sZWFuKTogYW55O1xyXG4gIG1nMmRpc3AobWdWYWx1ZTogc3RyaW5nLCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdXNlTmF0aXZlOiBib29sZWFuLCBhbHdheXNGaWxsOiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIsIGNvbnZlcnRDYXNlOiBib29sZWFuLCB0aW1lX2RhdGVfbnVtX3BpY19aX2VkdDogYm9vbGVhbik6IGFueTtcclxuICBtZzJkaXNwKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgY29tcElkeE9yQWx3YXlzRmlsbDogYW55LCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb21wSWR4OiBhbnksIHRpbWVfZGF0ZV9waWNfWl9lZHRPckNvbnZlcnRDYXNlPzogYm9vbGVhbiwgdGltZV9kYXRlX251bV9waWNfWl9lZHQ/OiBib29sZWFuKTogYW55IHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA2KVxyXG4gICAgICByZXR1cm4gdGhpcy5tZzJkaXNwXzAobWdWYWx1ZSwgcmFuZ2VTdHIsIHBpYywgdXNlTmF0aXZlLCBjb21wSWR4T3JBbHdheXNGaWxsLCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb21wSWR4KTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA3KVxyXG4gICAgICByZXR1cm4gdGhpcy5tZzJkaXNwXzEobWdWYWx1ZSwgcmFuZ2VTdHIsIHBpYywgdXNlTmF0aXZlLCBjb21wSWR4T3JBbHdheXNGaWxsLCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb21wSWR4LCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb252ZXJ0Q2FzZSk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5tZzJkaXNwXzIobWdWYWx1ZSwgcmFuZ2VTdHIsIHBpYywgdXNlTmF0aXZlLCBjb21wSWR4T3JBbHdheXNGaWxsLCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb21wSWR4LCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb252ZXJ0Q2FzZSwgdGltZV9kYXRlX251bV9waWNfWl9lZHQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZzJkaXNwXzAobWdWYWx1ZTogc3RyaW5nLCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdXNlTmF0aXZlOiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIsIHRpbWVfZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMubWcyZGlzcChtZ1ZhbHVlLCByYW5nZVN0ciwgcGljLCB1c2VOYXRpdmUsIGZhbHNlLCBjb21wSWR4LCB0aW1lX2RhdGVfcGljX1pfZWR0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWcyZGlzcF8xKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgYWx3YXlzRmlsbDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCB0aW1lX2RhdGVfcGljX1pfZWR0OiBib29sZWFuKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm1nMmRpc3AobWdWYWx1ZSwgcmFuZ2VTdHIsIHBpYywgdXNlTmF0aXZlLCBhbHdheXNGaWxsLCBjb21wSWR4LCBmYWxzZSwgdGltZV9kYXRlX3BpY19aX2VkdCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgb2YgYSB2YWx1ZSBmcm9tIGl0cyBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbHVlXCI+dGhlIGludGVybmFsIHZhbHVlIChhcyBzZW50IGluIHRoZSBYTUwpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPnZhbHVlIHJhbmdlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj50aGUgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFsd2F5c0ZpbGxcIj5BbHdheXMgYXV0byBmaWxsIGFscGhhIG92ZXIgaXRzIHBpY3R1cmUgKHVzZWQgZm9yIHNlbGVjdCBjb250cm9scylcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHN0cmluZyB0byBkaXNwbGF5XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwdWJsaWMgbWcyZGlzcF8yKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgYWx3YXlzRmlsbDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCBjb252ZXJ0Q2FzZTogYm9vbGVhbiwgdGltZV9kYXRlX251bV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgbGV0IHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCB0bXBSYW5nZTogc3RyaW5nID0gKHJhbmdlU3RyID09PSBudWxsKSA/IFwiXCIgOiByYW5nZVN0cjtcclxuXHJcbiAgICBzd2l0Y2ggKHBpYy5nZXRBdHRyKCkpIHtcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tQWxwaGEobWdWYWx1ZSwgcGljLCB0bXBSYW5nZSwgYWx3YXlzRmlsbCwgY29udmVydENhc2UpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6IHtcclxuXHJcbiAgICAgICAgLy8gTm93LCBjdXJyZWN5IGRpcmVjdGl2ZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIHdpbGwgYmUgaGFuZGxlZCBieSBhbmd1bGFyIHBhY2thZ2VzIGxpa2UgbmctY3VycmVuY3lcclxuICAgICAgICAvLyBoZXJlIGl0IHNob3VsZCBzaW1wbHkgcGFzcyB0aGUgYWN0dWFsIG5hdGl2ZSB2YWx1ZSBvZiBudW1iZXIgYW5kIG1hc2tzIHNob3VsZCBub3QgYmUgYXBwbGllZFxyXG4gICAgICAgIC8vIFNvLCBwcmVwYXJlIHRlbXBvcmFyeSBwaWN0dXJlIHRvIGdlbmVyYXRlIG5hdGl2ZSB2YWx1ZS5cclxuICAgICAgICBsZXQgIG5ld1BpYyA9IHBpYy5nZXRVbmZvcm1hdHRlZE51bWVyaWNQaWMoKTtcclxuXHJcbiAgICAgICAgLy9zdG9yZSBhbmQgcmVzdG9yZSBkZWNpbWFsIHNlcCBhbmQgdGhvdS4gc2VwXHJcbiAgICAgICAgbGV0ICBkZWM6IHN0cmluZyA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERlY2ltYWwoKTtcclxuICAgICAgICBsZXQgdGhvdTpzdHJpbmcgID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0VGhvdXNhbmRzKCk7XHJcblxyXG4gICAgICAgIC8vc2V0IGRlZmF1bHQgdmFsdWVzXHJcbiAgICAgICAgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuc2V0RGVjaW1hbFNlcGFyYXRvcignLicpO1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldFRob3VzYW5kc1NlcGFyYXRvcignLCcpO1xyXG5cclxuICAgICAgICBzdHIgPSB0aGlzLmZyb21OdW0obWdWYWx1ZSwgbmV3UGljKTtcclxuICAgICAgICBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5zZXREZWNpbWFsU2VwYXJhdG9yKGRlYyk7XHJcbiAgICAgICAgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuc2V0VGhvdXNhbmRzU2VwYXJhdG9yKHRob3UpO1xyXG4gICAgICAgIC8vIFZhbHVlIHNob3VsZCBiZSB0cmltbWVkIHdoZW4gd2UgYXJlIGRpc3BsYXlpbmcgY29udHJvbCBpbiBvcmRlciB0byBkaXNwbGF5IGFsaWdubWVudCBwcm9wZXJseS4gQnV0IHdoaWxlIGVudGVyaW5nIGNvbnRyb2wsIGl0IHNob3VsZCBub3QgYmUgdHJpbW1lZFxyXG4gICAgICAgIC8vIGluIG9yZGVyIHRvIHJlYWQgaXQgcHJvcGVybHkuXHJcbiAgICAgICAgaWYgKG5ld1BpYy5nZXRNYXNrQ2hhcnMoKSA9PT0gMCB8fCAhdGltZV9kYXRlX251bV9waWNfWl9lZHQpXHJcbiAgICAgICAgICBzdHIgPSBTdHJVdGlsLmx0cmltKHN0cik7XHJcblxyXG4gICAgICAgIGlmICh1c2VOYXRpdmUpIHtcclxuICAgICAgICAgIGlmIChzdHIgPT0gXCJcIilcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgICAgbGV0IGRibDogbnVtYmVyID0gTnVtYmVyKHN0cik7XHJcbiAgICAgICAgICByZXR1cm4gZGJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOiB7XHJcbiAgICAgICAgaWYgKHVzZU5hdGl2ZSkge1xyXG4gICAgICAgICAgbGV0IGR0OiBEYXRlO1xyXG4gICAgICAgICAgZHQgPSB0aGlzLmZyb21NZ0RhdGVUb05hdGl2ZURhdGUobWdWYWx1ZSwgcGljLCBjb21wSWR4KTtcclxuICAgICAgICAgIHJldHVybiBkdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBzdHIgPSB0aGlzLmZyb21EYXRlKG1nVmFsdWUsIHBpYywgY29tcElkeCwgdGltZV9kYXRlX251bV9waWNfWl9lZHQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOiB7XHJcbiAgICAgICAgaWYgKHVzZU5hdGl2ZSkge1xyXG4gICAgICAgICAgbGV0IGR0OiBEYXRlO1xyXG4gICAgICAgICAgZHQgPSB0aGlzLmZyb21NZ1RpbWVUb05hdGl2ZVRpbWUobWdWYWx1ZSwgcGljKTtcclxuICAgICAgICAgIHJldHVybiBkdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBzdHIgPSB0aGlzLmZyb21UaW1lKG1nVmFsdWUsIHBpYywgdGltZV9kYXRlX251bV9waWNfWl9lZHQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOiB7XHJcbiAgICAgICAgbGV0IGxvZ1ZhbDogYm9vbGVhbjtcclxuICAgICAgICBsb2dWYWwgPSB0aGlzLmZyb21NZ0xvZ2ljYWxUb05hdGl2ZUxvZ2ljYWwobWdWYWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIGxvZ1ZhbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgc3RyID0gQmxvYlR5cGUuZ2V0U3RyaW5nKG1nVmFsdWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgc3RyID0gbWdWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBkaXNwbGF5IHZhbHVlIGZyb20gaXRzIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPnRoZSB2YWx1ZSBhcyBlbnRlcmVkIGJ5IHVzZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+dmFsdWUgcmFuZ2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPnRoZSBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYkNvbnRlbnRUeXBlXCI+aWYgdGhlIGF0dHJpYnV0ZSBpcyBibG9iLCBpdHMgY29udGVudCB0eXBlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbnRlcm5hbCBmb3JtIG9mIGRhdGEgKGFzIHVzZWQgaW4gdGhlIFhNTClcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGRpc3AybWcoZGlzcFZhbHVlOiBhbnksIHBpYzogUElDLCBjb21wSWR4OiBudW1iZXIsIGJsb2JDb250ZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgc3dpdGNoIChwaWMuZ2V0QXR0cigpKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgc3RyID0gdGhpcy50b0FscGhhKGRpc3BWYWx1ZSwgcGljKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzoge1xyXG4gICAgICAgIGRpc3BWYWx1ZSA9IFN0cmluZyhkaXNwVmFsdWUpO1xyXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgbWFzayBmcm9tIGRpc3BsYXkgdmFsdWUuXHJcbiAgICAgICAgbGV0IGxlbjogbnVtYmVyID0gZGlzcFZhbHVlLmxlbmd0aDtcclxuICAgICAgICB3aGlsZSAobGVuID4gMCkge1xyXG4gICAgICAgICAgaWYgKCFwaWMucGljSXNNYXNrKGxlbiAtIDEpICYmIGRpc3BWYWx1ZVtsZW4gLSAxXSAhPT0gKCcgJykpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgbGVuLS07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwVmFsdWUubGVuZ3RoID4gbGVuKVxyXG4gICAgICAgICAgZGlzcFZhbHVlID0gTlN0cmluZy5SZW1vdmUoZGlzcFZhbHVlLCBsZW4sIChkaXNwVmFsdWUubGVuZ3RoIC0gbGVuKSk7XHJcblxyXG4gICAgICAgIGlmIChwaWMuaXNOZWdhdGl2ZSgpICYmIGRpc3BWYWx1ZS50cmltKCkuc3RhcnRzV2l0aChcIi1cIikpXHJcbiAgICAgICAgICBkaXNwVmFsdWUgPSBTdHJVdGlsLmx0cmltKGRpc3BWYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vc3RvcmUgYW5kIHJlc3RvcmUgZGVjaW1hbCBzZXAgYW5kIHRob3UuIHNlcFxyXG4gICAgICAgIGxldCAgZGVjOiBzdHJpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXREZWNpbWFsKCk7XHJcbiAgICAgICAgbGV0IHRob3U6c3RyaW5nICA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFRob3VzYW5kcygpO1xyXG5cclxuICAgICAgICAvL3NldCBkZWZhdWx0IHZhbHVlc1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldERlY2ltYWxTZXBhcmF0b3IoJy4nKTtcclxuICAgICAgICBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5zZXRUaG91c2FuZHNTZXBhcmF0b3IoJywnKTtcclxuXHJcbiAgICAgICAgLy8gTm93LCBjdXJyZWN5IGRpcmVjdGl2ZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIHdpbGwgYmUgaGFuZGxlZCBieSBhbmd1bGFyIHBhY2thZ2VzIGxpa2UgbmctY3VycmVuY3lcclxuICAgICAgICAvLyBoZXJlIGl0IHNob3VsZCBzaW1wbHkgcGFzcyB0aGUgYWN0dWFsIG5hdGl2ZSB2YWx1ZSBvZiBudW1iZXIgYW5kIG1hc2tzIHNob3VsZCBub3QgYmUgYXBwbGllZFxyXG4gICAgICAgIC8vIFNvLCBwcmVwYXJlIHRlbXBvcmFyeSBwaWN0dXJlIHRvIGdlbmVyYXRlIG5hdGl2ZSB2YWx1ZS5cclxuICAgICAgICBsZXQgIG5ld1BpYyA9IHBpYy5nZXRVbmZvcm1hdHRlZE51bWVyaWNQaWMoKTtcclxuXHJcbiAgICAgICAgc3RyID0gdGhpcy50b051bShkaXNwVmFsdWUsIG5ld1BpYywgY29tcElkeCk7XHJcblxyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldERlY2ltYWxTZXBhcmF0b3IoZGVjKTtcclxuICAgICAgICBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5zZXRUaG91c2FuZHNTZXBhcmF0b3IodGhvdSk7XHJcbiAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAge1xyXG4gICAgICAgIGxldCBkdDogRGF0ZTtcclxuICAgICAgICAvL3doZW4gZGF0ZSBpcyBpbiBpdGVtIGxpc3QgZm9yIGNob2ljZSBjdHJsLCBpdCB3aWxsIGNvbWUgaGVyZSBhcyBzdHJpbmcuIHNvIGNvbnZlcnQgaXQgdG8gRGF0ZS5cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3BWYWx1ZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICBkdCA9IG5ldyBEYXRlIChkaXNwVmFsdWUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGR0ID0gZGlzcFZhbHVlO1xyXG4gICAgICAgIHN0ciA9IHRoaXMuZnJvbU5hdGl2ZURhdGVUb01nRGF0ZShkdCwgcGljKTtcclxuICAgICAgfVxyXG4gICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRToge1xyXG4gICAgICAgIGxldCBkdDogRGF0ZTtcclxuXHJcbiAgICAgICAgLy93aGVuIGRhdGUgaXMgaW4gaXRlbSBsaXN0IGZvciBjaG9pY2UgY3RybCwgaXQgd2lsbCBjb21lIGhlcmUgYXMgc3RyaW5nLiBzbyBjb252ZXJ0IGl0IHRvIERhdGUuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwVmFsdWUgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGR0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgIGlmIChkaXNwVmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZHQuc2V0SG91cnMoK1N0cmluZyhkaXNwVmFsdWUpLnN1YnN0cigwLCAyKSk7XHJcbiAgICAgICAgICAgIGR0LnNldE1pbnV0ZXMoK1N0cmluZyhkaXNwVmFsdWUpLnN1YnN0cigwLCAyKSk7XHJcbiAgICAgICAgICAgIGlmIChTdHJpbmcoZGlzcFZhbHVlKS5sZW5ndGggPiA1KVxyXG4gICAgICAgICAgICAgIGR0LnNldFNlY29uZHMoK1N0cmluZyhkaXNwVmFsdWUpLnN1YnN0cigwLCAyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBkdCA9IGRpc3BWYWx1ZTtcclxuXHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tTmF0aXZlVGltZVRvTWdUaW1lKGR0KTtcclxuICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgIHN0ciA9IHRoaXMuZnJvbU5hdGl2ZUxvZ2ljYWxUb01nTG9naWNhbChkaXNwVmFsdWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICAgIHN0ciA9IEJsb2JUeXBlLmNyZWF0ZUZyb21TdHJpbmcoZGlzcFZhbHVlLCBibG9iQ29udGVudFR5cGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cjtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gIE1ldGhvZHMgZm9yIGNvdmVydGluZyBJTlRFUk5BTCAtLS0+IERJUExBWVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGVzIG1hZ2ljIG51bWJlciB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ051bVwiPiAgIEEgTWFnaWMgTnVtYmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgVGhlIHBpY3R1cmUgdG8gdXNlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBmcm9tTnVtKG1nVmFsdWU6IHN0cmluZywgcGljOiBQSUMpOiBzdHJpbmcge1xyXG4gICAgbGV0IG1nTnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRShtZ1ZhbHVlKTtcclxuICAgIHJldHVybiBtZ051bS50b0Rpc3BsYXlWYWx1ZShwaWMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIGFscGhhIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmFuZ2VTdHJcIj4gIFRoZSByYW5nZSBvZiB2YWx1ZXMgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFsd2F5c0ZpbGxcIj5BbHdheXMgYXV0byBmaWxsIGFscGhhIG92ZXIgaXRzIHBpY3R1cmUgKHVzZWQgZm9yIHNlbGVjdCBjb250cm9scylcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGZyb21BbHBoYShkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDLCByYW5nZVN0cjogc3RyaW5nLCBhbHdheXNGaWxsOiBib29sZWFuLCBjb252ZXJ0Q2FzZTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgbGVuOiBudW1iZXIgPSBwaWMuZ2V0TWFza1NpemUoKTtcclxuICAgIGxldCBtaW5fbGVuOiBudW1iZXIgPSBsZW47XHJcbiAgICBsZXQgbWFza1N0cjogc3RyaW5nID0gcGljLmdldE1hc2soKTtcclxuICAgIGxldCByZXNTdHI6IHN0cmluZztcclxuXHJcbiAgICBpZiAocGljLmdldE1hc2tDaGFycygpID4gMCkge1xyXG4gICAgICByZXNTdHIgPSB0aGlzLndpbl9kYXRhX2NweShOU3RyaW5nLlRvQ2hhckFycmF5KG1hc2tTdHIpLCBsZW4sIE5TdHJpbmcuVG9DaGFyQXJyYXkoZGF0YVN0ciksIHBpYy5pc0F0dHJBbHBoYSgpLCBjb252ZXJ0Q2FzZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgcGljLmlzQXR0ckFscGhhKCkpXHJcbiAgICAgIC8vIEpQTjogREJDUyBzdXBwb3J0XHJcbiAgICAgIHtcclxuICAgICAgICAvLyBzdWJzdHJpbmcgYnkgdGhlIG51bWJlciBvZiBieXRlc1xyXG4gICAgICAgIGxldCBpbnREYXRhU3RyTGVuQjogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIoZGF0YVN0cik7XHJcbiAgICAgICAgaWYgKG1pbl9sZW4gPiBpbnREYXRhU3RyTGVuQikge1xyXG4gICAgICAgICAgbWluX2xlbiA9IGludERhdGFTdHJMZW5CO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNTdHIgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIoZGF0YVN0ciwgbWluX2xlbik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoZGF0YVN0ciAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChtaW5fbGVuID4gZGF0YVN0ci5sZW5ndGgpIHtcclxuICAgICAgICAgIG1pbl9sZW4gPSBkYXRhU3RyLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnZlcnRDYXNlKSB7XHJcbiAgICAgICAgICByZXNTdHIgPSB0aGlzLndpbl9kYXRhX2NweShOU3RyaW5nLlRvQ2hhckFycmF5KG1hc2tTdHIpLCBsZW4sIE5TdHJpbmcuVG9DaGFyQXJyYXkoZGF0YVN0ciksIHBpYy5pc0F0dHJBbHBoYSgpLCBjb252ZXJ0Q2FzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVzU3RyID0gZGF0YVN0ci5zdWJzdHIoMCwgbWluX2xlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2UgZG8gbm90IGZpbGwgQWxwaGEgZmlsZWQgb3ZlciBjb250cm9sJ3MgcGljdHVyZSBsZW5ndGggUUNSICMgMjk1NDA4XHJcbiAgICBpZiAoYWx3YXlzRmlsbCB8fCAocmFuZ2VTdHIgIT09IG51bGwgJiYgcmFuZ2VTdHIubGVuZ3RoID4gMCAmJiByZXNTdHIubGVuZ3RoIDwgbGVuKSkge1xyXG4gICAgICBsZXQgdmQ6IFZhbGlkYXRpb25EZXRhaWxzQmFzZSA9IG5ldyBWYWxpZGF0aW9uRGV0YWlsc0Jhc2UocmFuZ2VTdHIpO1xyXG4gICAgICBsZXQgY29udGludW91c1JhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4gPSB2ZC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKTtcclxuICAgICAgbGV0IGRpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IHZkLmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKTtcclxuICAgICAgaWYgKGNvbnRpbnVvdXNSYW5nZVZhbHVlcyAhPT0gbnVsbCB8fCBkaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmVzU3RyID0gdGhpcy5maWxsQWxwaGFCeVJhbmdlKGNvbnRpbnVvdXNSYW5nZVZhbHVlcywgZGlzY3JldGVSYW5nZVZhbHVlcywgcmVzU3RyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc1N0cjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FzZUNvbnZlcnRlZENoYXIoZGF0YTogc3RyaW5nLCBtYXNrOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBjaDogc3RyaW5nO1xyXG4gICAgaWYgKG1hc2suY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19VKSB7XHJcbiAgICAgIGNoID0gZGF0YS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChtYXNrLmNoYXJDb2RlQXQoMCkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTCkge1xyXG4gICAgICAgIGNoID0gZGF0YS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNoID0gZGF0YTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3aW5fZGF0YV9jcHkobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuKTogc3RyaW5nO1xyXG4gIHByaXZhdGUgd2luX2RhdGFfY3B5KG1hc2tTdHI6IHN0cmluZ1tdLCBtYXNrTGVuOiBudW1iZXIsIGRhdGFTdHI6IHN0cmluZ1tdLCBpc0F0dHJBbHBoYTogYm9vbGVhbiwgY29udmVydENhc2U6IGJvb2xlYW4pOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSB3aW5fZGF0YV9jcHkobWFza1N0cjogYW55LCBtYXNrTGVuOiBudW1iZXIsIGRhdGFTdHI6IGFueSwgaXNBdHRyQWxwaGE6IGJvb2xlYW4sIGNvbnZlcnRDYXNlPzogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNClcclxuICAgICAgcmV0dXJuIHRoaXMud2luX2RhdGFfY3B5XzAobWFza1N0ciwgbWFza0xlbiwgZGF0YVN0ciwgaXNBdHRyQWxwaGEpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLndpbl9kYXRhX2NweV8xKG1hc2tTdHIsIG1hc2tMZW4sIGRhdGFTdHIsIGlzQXR0ckFscGhhLCBjb252ZXJ0Q2FzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdpbl9kYXRhX2NweV8wKG1hc2tTdHI6IHN0cmluZ1tdLCBtYXNrTGVuOiBudW1iZXIsIGRhdGFTdHI6IHN0cmluZ1tdLCBpc0F0dHJBbHBoYTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy53aW5fZGF0YV9jcHkobWFza1N0ciwgbWFza0xlbiwgZGF0YVN0ciwgaXNBdHRyQWxwaGEsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGVzIGFscGhhIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1hc2tTdHJcIj4gICBUaGUgbWFzayB0byBiZSB1c2VkIGluIG9yZGVyIHRvIGJ1aWxkIHRoZSBzdHJpbmdcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHdpbl9kYXRhX2NweV8xKG1hc2tTdHI6IHN0cmluZ1tdLCBtYXNrTGVuOiBudW1iZXIsIGRhdGFTdHI6IHN0cmluZ1tdLCBpc0F0dHJBbHBoYTogYm9vbGVhbiwgY29udmVydENhc2U6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IG1hc2tJZHg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZGF0YUlkeDogbnVtYmVyID0gMDtcclxuICAgIGxldCByZXNTdHI6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4obWFza0xlbik7XHJcblxyXG4gICAgaWYgKGlzQXR0ckFscGhhICYmIFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgbGV0IG51bTI6IG51bWJlciA9IDA7XHJcbiAgICAgIHdoaWxlIChtYXNrSWR4IDwgbWFza0xlbiAmJiBudW0yIDwgbWFza0xlbikge1xyXG4gICAgICAgIGlmIChtYXNrU3RyW21hc2tJZHhdLmNoYXJDb2RlQXQoMCkgPD0gUElDSW50ZXJmYWNlLlBJQ19NQVhfT1ApIHtcclxuICAgICAgICAgIGlmIChkYXRhSWR4IDwgZGF0YVN0ci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0IHN0clZhbDogc3RyaW5nID0gTlN0cmluZy5Gcm9tQ2hhcnMoZGF0YVN0ciwgZGF0YUlkeCwgMSk7XHJcbiAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUubGVuQihzdHJWYWwpID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG1hc2tJZHggKyAxIDwgbWFza0xlbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hc2tTdHJbbWFza0lkeCArIDFdLmNoYXJDb2RlQXQoMCkgPD0gUElDSW50ZXJmYWNlLlBJQ19NQVhfT1ApIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRDYXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzU3RyW251bTIrK10gPSB0aGlzLmNhc2VDb252ZXJ0ZWRDaGFyKGRhdGFTdHJbZGF0YUlkeCsrXSwgbWFza1N0clttYXNrSWR4ICsgMV0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gZGF0YVN0cltkYXRhSWR4KytdO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIG1hc2tJZHggPSBtYXNrSWR4ICsgMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9ICcgJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9ICcgJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbnZlcnRDYXNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9IHRoaXMuY2FzZUNvbnZlcnRlZENoYXIoZGF0YVN0cltkYXRhSWR4KytdLCBtYXNrU3RyW21hc2tJZHggKyAxXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzU3RyW251bTIrK10gPSBkYXRhU3RyW2RhdGFJZHgrK107XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVzU3RyW251bTIrK10gPSAnICcvKicgJyovO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJlc1N0cltudW0yKytdID0gbWFza1N0clttYXNrSWR4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFza0lkeCA9IG1hc2tJZHggKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyhyZXNTdHIpLnN1YnN0cigwLCBudW0yKTtcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAobWFza0lkeCA8IG1hc2tMZW4pIHtcclxuICAgICAgaWYgKG1hc2tTdHJbbWFza0lkeF0uY2hhckNvZGVBdCgwKSA8PSBQSUNJbnRlcmZhY2UuUElDX01BWF9PUCkge1xyXG4gICAgICAgIGlmIChkYXRhSWR4IDwgZGF0YVN0ci5sZW5ndGgpIHtcclxuICAgICAgICAgIHJlc1N0clttYXNrSWR4XSA9IGRhdGFTdHJbZGF0YUlkeF07XHJcbiAgICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gdGhpcy5jYXNlQ29udmVydGVkQ2hhcihkYXRhU3RyW2RhdGFJZHhdLCBtYXNrU3RyW21hc2tJZHhdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXNTdHJbbWFza0lkeF0gPSBkYXRhU3RyW2RhdGFJZHhdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0YUlkeCA9IGRhdGFJZHggKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJlc1N0clttYXNrSWR4XSA9ICcgJy8qJyAnKi87XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlc1N0clttYXNrSWR4XSA9IG1hc2tTdHJbbWFza0lkeF07XHJcbiAgICAgIH1cclxuICAgICAgbWFza0lkeCA9IG1hc2tJZHggKyAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKHJlc1N0cik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gZGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tRGF0ZShkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDLCBjb21wSWR4OiBudW1iZXIsIHRpbWVfZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IG1hc2s6IHN0cmluZyA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICBsZXQgbWFza1NpemU6IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgbGV0IGRhdGU6IG51bWJlciA9IG5ldyBOVU1fVFlQRShkYXRhU3RyKS5OVU1fMl9VTE9ORygpO1xyXG4gICAgcmV0dXJuIHRoaXMudG9fYV9waWNfZGF0ZW1vZGUobWFzaywgbWFza1NpemUsIGRhdGUsIHBpYywgdGltZV9kYXRlX3BpY19aX2VkdCwgZmFsc2UsIGNvbXBJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIHRpbWUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgZnJvbVRpbWUoZGF0YVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFzazogc3RyaW5nID0gcGljLmdldE1hc2soKTtcclxuICAgIGxldCBtYXNrU2l6ZTogbnVtYmVyID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICBsZXQgdGltZTogbnVtYmVyID0gbmV3IE5VTV9UWVBFKGRhdGFTdHIpLk5VTV8yX1VMT05HKCk7XHJcbiAgICByZXR1cm4gdGhpcy50aW1lXzJfYV9waWMobWFzaywgbWFza1NpemUsIHRpbWUsIHBpYywgdGltZV9kYXRlX3BpY19aX2VkdCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIHRoZSBkYXRlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIGZyb21NZ0RhdGVUb05hdGl2ZURhdGUoZGF0YVN0cjogc3RyaW5nLCBwaWM6IFBJQywgY29tcElkeDogbnVtYmVyKTogRGF0ZSB7XHJcblxyXG4gICAgbGV0IGRhdGU6IG51bWJlciA9IG5ldyBOVU1fVFlQRShkYXRhU3RyKS5OVU1fMl9VTE9ORygpO1xyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcbiAgICAvLyBCcmVhayBkYXRhIGludG8gaXRzIGNvbXBvbmVudHNcclxuICAgIGJyZWFrUGFyYW1zID0gbmV3IERhdGVCcmVha1BhcmFtcygpO1xyXG4gICAgdGhpcy5kYXRlX2JyZWFrX2RhdGVtb2RlKGJyZWFrUGFyYW1zLCBkYXRlLCBmYWxzZSwgY29tcElkeCk7XHJcbiAgICBpZiAoYnJlYWtQYXJhbXMubW9udGggPiAwKVxyXG4gICAgICBicmVha1BhcmFtcy5tb250aCA9IGJyZWFrUGFyYW1zLm1vbnRoIC0gMTsgLy9tb250aCBpcyAwIGJhc2VkIGluIERhdGUgY2xhc3NcclxuXHJcbiAgICBpZiAoYnJlYWtQYXJhbXMueWVhciA9PSAwICYmIGJyZWFrUGFyYW1zLm1vbnRoID09IDAgJiYgYnJlYWtQYXJhbXMuZGF5ID09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIHJldHVybiBuZXcgRGF0ZShicmVha1BhcmFtcy55ZWFyLCBicmVha1BhcmFtcy5tb250aCwgYnJlYWtQYXJhbXMuZGF5KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIGRhdGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgZnJvbU5hdGl2ZURhdGVUb01nRGF0ZU51bWJlcihuYXRpdmVEYXRlOiBEYXRlLCBwaWM6IFBJQyk6IG51bWJlciB7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXI7XHJcbiAgICBsZXQgZGF0ZVBhcmFtczogRGF0ZUJyZWFrUGFyYW1zO1xyXG4gICAgbGV0IG1pbGxlbml1bTogbnVtYmVyID0gMDtcclxuICAgIGxldCB5ZWFyOiBudW1iZXIgPSBuYXRpdmVEYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSBuYXRpdmVEYXRlLmdldERhdGUoKTtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gbmF0aXZlRGF0ZS5nZXRNb250aCgpICsgMTtcclxuXHJcbiAgICAvLyBIZWJyZXcgWWVhclxyXG4gICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgIGlmICh5ZWFyID4gMCkge1xyXG4gICAgICAgIGlmIChtaWxsZW5pdW0gPT09IDApXHJcbiAgICAgICAgICBtaWxsZW5pdW0gPSA1O1xyXG4gICAgICAgIHllYXIgKz0gbWlsbGVuaXVtICogMTAwMDtcclxuICAgICAgfVxyXG4gICAgICBudW1WYWwgPSAoSGVicmV3RGF0ZS5kYXRlaGViXzJfZCh5ZWFyLCBtb250aCwgZGF5KSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gdGhlIG5leHQgMiBsaW5lcyBzdXBwb3J0IDQueHggREQvTU0gcGljdHVyZXNcclxuICAgICAgaWYgKHllYXIgPT09IDApIHtcclxuICAgICAgICBkYXRlUGFyYW1zID0gdGhpcy5kYXRlX3N5cygpO1xyXG4gICAgICAgIHllYXIgPSBkYXRlUGFyYW1zLnllYXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG51bVZhbCA9IHRoaXMuZGF0ZV80X2NhbGVuZGVyKHllYXIsIG1vbnRoLCBkYXksIDAsIGZhbHNlKTsgICAgLy8gd2UgYXJlIGFkZGluZyBhIGxpdHRsZSBlbXB0eSBzcGFjZSB0byB0aGUgdmFyaWFibGUsIGJlY2F1c2Ugd2UgbWlnaHQgbGF0ZXJcclxuICAgIH1cclxuICAgIHJldHVybiBudW1WYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gZGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tTmF0aXZlRGF0ZVRvTWdEYXRlKG5hdGl2ZURhdGU6IERhdGUsIHBpYzogUElDKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXIgPSBuYXRpdmVEYXRlID09IG51bGwgPyAwIDogdGhpcy5mcm9tTmF0aXZlRGF0ZVRvTWdEYXRlTnVtYmVyKG5hdGl2ZURhdGUsIHBpYyk7XHJcbiAgICBtZ051bS5OVU1fNF9MT05HKG51bVZhbCk7XHJcblxyXG4gICAgcmV0dXJuIG1nTnVtLnRvWE1McmVjb3JkKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIGRhdGUgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3V0U3RyXCI+ICAgICAgICAgIFRoZSBtYXNrIHRvIGJlIHVzZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm91dF9sZW5cIj4gICAgICAgICBNYXNrIGxlbmd0aFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICAgICAgICAgICAgIFRoZSBwaWN1cmUgaW5mb3JtYXRpb25cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGVfcGljX1pfZWR0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZ25vcmVfZHRfZm10XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgdG9fYV9waWNfZGF0ZW1vZGUob3V0U3RyOiBzdHJpbmcsIG91dF9sZW46IG51bWJlciwgZGF0ZTogbnVtYmVyLCBwaWM6IFBJQywgZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4sIGlnbm9yZV9kdF9mbXQ6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgbGVuOiBudW1iZXI7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGRveTogbnVtYmVyID0gMDtcclxuICAgIGxldCBkb3c6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gMDtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gMDtcclxuICAgIGxldCBoZGF5OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGh5ZWFyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGhtb250aDogbnVtYmVyID0gMDtcclxuICAgIGxldCBsZWFwOiBCb29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHA6IHN0cmluZ1tdO1xyXG4gICAgbGV0IG91dFZhbDogc3RyaW5nW10gPSBOU3RyaW5nLlRvQ2hhckFycmF5KG91dFN0cik7XHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcztcclxuICAgIGxldCBkYXRlTmFtZVBhcmFtczogRGF0ZU5hbWVQYXJhbXM7XHJcbiAgICBsZXQgb3V0SWR4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHN0ck91dDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICAvLyBJZiByZXN1bHQgb3ZlcmZsb3dzIHJldHVybiBidWZmZXIsIGZpbGwgd2l0aCBhc3Rlcml4cyBhbmQgYmFpbCBvdXRcclxuICAgIGlmIChwaWMuZ2V0TWFza1NpemUoKSA+IG91dF9sZW4pIHtcclxuICAgICAgZm9yICg7IGkgPCBvdXRfbGVuOyBpKyspXHJcbiAgICAgICAgb3V0VmFsW2ldID0gJyonO1xyXG4gICAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMob3V0VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB6ZXJvIGZpbGwgcmVxdWVzdGVkIGFuZCBkYXRlIHZhbHVlIGlzIHplcm8sIGZpbGwgaXQgYW5kIGJhaWwgb3V0XHJcbiAgICBvdXRfbGVuID0gbGVuID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiAhZGF0ZV9waWNfWl9lZHQpIHtcclxuICAgICAgZm9yICg7IGkgPCBvdXRfbGVuOyBpKyspXHJcbiAgICAgICAgb3V0VmFsW2ldID0gcGljLmdldFplcm9QYWQoKTtcclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKG91dFZhbCk7XHJcbiAgICB9XHJcbiAgICBpZiAocGljLmlzSGVicmV3KCkgJiYgKGRhdGUgPT09IDAgfHwgZGF0ZSA9PT0gMTAwMDAwMDAwMCkpIHtcclxuICAgICAgZm9yICg7IGkgPCBvdXRfbGVuOyBpKyspXHJcbiAgICAgICAgb3V0VmFsW2ldID0gJyAnO1xyXG4gICAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMob3V0VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCcmVhayBkYXRhIGludG8gaXRzIGNvbXBvbmVudHNcclxuICAgIGJyZWFrUGFyYW1zID0gbmV3IERhdGVCcmVha1BhcmFtcyh5ZWFyLCBtb250aCwgZGF5LCBkb3ksIGRvdyk7XHJcbiAgICB0aGlzLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGUsIGlnbm9yZV9kdF9mbXQsIGNvbXBJZHgpO1xyXG4gICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgIGxldCByZWZoZGF5OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4oaGRheSk7XHJcbiAgICAgIGxldCByZWZobW9udGg6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihobW9udGgpO1xyXG4gICAgICBsZXQgcmVmaHllYXI6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihoeWVhcik7XHJcbiAgICAgIGxlYXAgPSBIZWJyZXdEYXRlLmRhdGVoZWJfNF9kKGRhdGUsIHJlZmhkYXksIHJlZmhtb250aCwgcmVmaHllYXIpO1xyXG5cclxuICAgICAgaGRheSA9IHJlZmhkYXkudmFsdWU7XHJcbiAgICAgIGhtb250aCA9IHJlZmhtb250aC52YWx1ZTtcclxuICAgICAgaHllYXIgPSByZWZoeWVhci52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICB5ZWFyID0gYnJlYWtQYXJhbXMueWVhcjtcclxuICAgIG1vbnRoID0gYnJlYWtQYXJhbXMubW9udGg7XHJcbiAgICBkYXkgPSBicmVha1BhcmFtcy5kYXk7XHJcbiAgICBkb3kgPSBicmVha1BhcmFtcy5kb3k7XHJcbiAgICBkb3cgPSBicmVha1BhcmFtcy5kb3c7XHJcbiAgICBicmVha1BhcmFtcyA9IG51bGw7XHJcbiAgICB3aGlsZSAobGVuID4gMCkge1xyXG4gICAgICBsZXQgcmVmT3V0TGVuOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4ob3V0X2xlbik7XHJcbiAgICAgIHN3aXRjaCAob3V0VmFsW291dElkeF0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWTpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAyKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAyLCB5ZWFyLCAnMCcpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICAgICAgICBsZW4gLT0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IWVlZWVk6XHJcbiAgICAgICAgICBpID0gSGVicmV3RGF0ZS5kYXRlaGViXzJfc3RyKG91dFZhbCwgb3V0SWR4LCBsZW4sIHJlZk91dExlbiwgNSwgaHllYXIsIHBpYy5pc1RyaW1lZCgpLCB0cnVlKTtcclxuICAgICAgICAgIG91dF9sZW4gPSByZWZPdXRMZW4udmFsdWU7XHJcbiAgICAgICAgICBvdXRJZHggKz0gaTtcclxuICAgICAgICAgIGxlbiAtPSBpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hMOlxyXG4gICAgICAgICAgaSA9IEhlYnJld0RhdGUuZGF0ZWhlYl9pXzJfaCgoaHllYXIgLyAxMDAwKSAlIDEwLCBvdXRWYWwsIG91dElkeCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIG91dElkeCsrO1xyXG4gICAgICAgICAgbGVuLS07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSEREOlxyXG4gICAgICAgICAgaSA9IEhlYnJld0RhdGUuZGF0ZWhlYl8yX3N0cihvdXRWYWwsIG91dElkeCwgbGVuLCByZWZPdXRMZW4sIDIsIGhkYXksIHBpYy5pc1RyaW1lZCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICBvdXRfbGVuID0gcmVmT3V0TGVuLnZhbHVlO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IGk7XHJcbiAgICAgICAgICBsZW4gLT0gaTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWVlZOlxyXG4gICAgICAgICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDQpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDQsIHllYXIsICcwJyk7XHJcbiAgICAgICAgICBvdXRJZHggKz0gNDtcclxuICAgICAgICAgIGxlbiAtPSA0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAyKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAyLCBtb250aCwgJzAnKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTU1NOlxyXG4gICAgICAgICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgICAgICAgIGlmIChsZWFwICYmIGhtb250aCA9PT0gNilcclxuICAgICAgICAgICAgICBobW9udGggPSAxNDtcclxuICAgICAgICAgICAgbGV0IG1vbnRoTmFtZXM6IHN0cmluZ1tdID0gSGVicmV3RGF0ZS5HZXRMb2NhbE1vbnRocygpO1xyXG4gICAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShtb250aE5hbWVzW2htb250aF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBtb250aFN0cjogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgICAgICBsZXQgbW9udGhOYW1lczogc3RyaW5nW10gPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtb250aFN0cik7XHJcbiAgICAgICAgICAgIHAgPSBOU3RyaW5nLlRvQ2hhckFycmF5KG1vbnRoTmFtZXNbbW9udGhdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbmV3IERhdGVOYW1lUGFyYW1zKG91dFZhbCwgb3V0SWR4LCBsZW4pO1xyXG4gICAgICAgICAgb3V0X2xlbiAtPSB0aGlzLmRhdGVfaV8yX25tKGRhdGVOYW1lUGFyYW1zLCBwLCBwaWMuaXNUcmltZWQoKSk7XHJcbiAgICAgICAgICBvdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHg7XHJcbiAgICAgICAgICBsZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW47XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfREQ6XHJcbiAgICAgICAgICBsZXQgaXNaZXJvOiBib29sZWFuID0gcGljLnplcm9GaWxsKCk7XHJcbiAgICAgICAgICBpZiAoaXNaZXJvICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDIpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDIsIGRheSwgJzAnKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfREREOlxyXG4gICAgICAgICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDMpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDMsIGRveSwgJzAnKTtcclxuICAgICAgICAgIGxlbiAtPSAzO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfRERERDpcclxuICAgICAgICAgIGkgPSB0aGlzLmRhdGVfMl9EREREKGRheSwgb3V0VmFsLCBvdXRJZHgsIGxlbiwgcGljLmlzVHJpbWVkKCkpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IGk7XHJcbiAgICAgICAgICBvdXRfbGVuICs9IGkgLSA0O1xyXG4gICAgICAgICAgbGVuIC09IDQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVzpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAxKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAxLCBkb3csICcwJyk7XHJcbiAgICAgICAgICBsZW4tLTtcclxuICAgICAgICAgIG91dElkeCsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1dXVzpcclxuICAgICAgICAgIGlmIChwaWMuaXNIZWJyZXcoKSkge1xyXG4gICAgICAgICAgICBsZXQgZG93c05hbWVzOiBzdHJpbmdbXSA9IEhlYnJld0RhdGUuR2V0TG9jYWxEb3dzKCk7XHJcbiAgICAgICAgICAgIHAgPSBOU3RyaW5nLlRvQ2hhckFycmF5KGRvd3NOYW1lc1tkb3ddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgZGF5U3RyOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgICBsZXQgZGF5TmFtZXM6IHN0cmluZ1tdID0gRGF0ZVV0aWwuZ2V0TG9jYWxEYXlzKGRheVN0cik7XHJcbiAgICAgICAgICAgIHAgPSBOU3RyaW5nLlRvQ2hhckFycmF5KGRheU5hbWVzW2Rvd10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBuZXcgRGF0ZU5hbWVQYXJhbXMob3V0VmFsLCBvdXRJZHgsIGxlbik7XHJcbiAgICAgICAgICBvdXRfbGVuIC09IHRoaXMuZGF0ZV9pXzJfbm0oZGF0ZU5hbWVQYXJhbXMsIHAsIHBpYy5pc1RyaW1lZCgpKTtcclxuICAgICAgICAgIG91dElkeCA9IGRhdGVOYW1lUGFyYW1zLm91dElkeDtcclxuICAgICAgICAgIGxlbiA9IGRhdGVOYW1lUGFyYW1zLmxlbjtcclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbnVsbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19CQjogLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgLy8gSmFwYW5lc2UgZGF5IG9mIHRoZSB3ZWVrXHJcbiAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShVdGlsRGF0ZUpwbi5nZXRTdHJEb3coZG93KSk7XHJcbiAgICAgICAgICBzdHJPdXQgPSBudWxsO1xyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBuZXcgRGF0ZU5hbWVQYXJhbXMob3V0VmFsLCBvdXRJZHgsIGxlbik7XHJcbiAgICAgICAgICBzdHJPdXQgPSB0aGlzLmRhdGVfaV8yX25tX2J5dGVtb2RlKHN0ck91dCwgZGF0ZU5hbWVQYXJhbXMsIE5TdHJpbmcuRnJvbUNoYXJzKHApLCBvdXRfbGVuKTtcclxuICAgICAgICAgIG91dFZhbCA9IG5ldyBBcnJheShzdHJPdXQubGVuZ3RoKTtcclxuICAgICAgICAgIE5TdHJpbmcuQ29weVRvKHN0ck91dCwgMCwgb3V0VmFsLCAwLCBzdHJPdXQubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBvdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHg7XHJcbiAgICAgICAgICBsZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW47XHJcbiAgICAgICAgICBzdHJPdXQgPSBudWxsO1xyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMTpcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSlkyOlxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTQ6XHJcbiAgICAgICAgICAvLyBKYXBhbmVzZSB0aGUgbmFtZSBvZiBhbiBlcmFcclxuICAgICAgICAgIGxldCBzdHJOdW06IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgICBpZiAob3V0VmFsW291dElkeF0uY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEpXHJcbiAgICAgICAgICAgIHN0ck51bSA9IFV0aWxEYXRlSnBuLmdldEluc3RhbmNlKCkuZGF0ZV9qcG5feXJfMl9hKHllYXIsIGRveSwgZmFsc2UpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBzdHJOdW0gPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYSh5ZWFyLCBkb3ksIHRydWUpO1xyXG4gICAgICAgICAgc3RyT3V0ID0gbnVsbDtcclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbmV3IERhdGVOYW1lUGFyYW1zKG91dFZhbCwgb3V0SWR4LCBsZW4pO1xyXG4gICAgICAgICAgc3RyT3V0ID0gdGhpcy5kYXRlX2lfMl9ubV9ieXRlbW9kZShzdHJPdXQsIGRhdGVOYW1lUGFyYW1zLCBzdHJOdW0sIG91dF9sZW4pO1xyXG4gICAgICAgICAgb3V0VmFsID0gbnVsbDtcclxuICAgICAgICAgIG91dFZhbCA9IG5ldyBBcnJheShzdHJPdXQubGVuZ3RoKTtcclxuICAgICAgICAgIE5TdHJpbmcuQ29weVRvKHN0ck91dCwgMCwgb3V0VmFsLCAwLCBzdHJPdXQubGVuZ3RoKTtcclxuICAgICAgICAgIG91dElkeCA9IGRhdGVOYW1lUGFyYW1zLm91dElkeDtcclxuICAgICAgICAgIGxlbiA9IGRhdGVOYW1lUGFyYW1zLmxlbjtcclxuICAgICAgICAgIHN0ck91dCA9IG51bGw7XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWUo6XHJcbiAgICAgICAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiBkYXRlX3BpY19aX2VkdClcclxuICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dElkeCwgcGljLmdldFplcm9QYWQoKSwgMik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMiwgVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95ZWFyX29mcyh5ZWFyLCBkb3kpLCAnMCcpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICAgICAgICBsZW4gLT0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBvdXRJZHgrKztcclxuICAgICAgICAgIGxlbi0tO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChvdXRfbGVuIDwgb3V0VmFsLmxlbmd0aClcclxuICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dF9sZW4sICcgJywgb3V0VmFsLmxlbmd0aCAtIG91dF9sZW4pO1xyXG5cclxuICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyhvdXRWYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJyZWFrIGEgZGF0ZSBpbnRvIFllYXIsIE1vbnRoLCBEYXkgaW4gbW9udGgsIERheSBpbiB5ZWFyIGFuZCBEYXkgaW4gd2Vla1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZGF0ZV9icmVha19kYXRlbW9kZShicmVha1BhcmFtczogRGF0ZUJyZWFrUGFyYW1zLCBkYXRlOiBudW1iZXIsIGlnbm9yZV9kdF9mbXQ6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGxldCB5ZWFyOiBudW1iZXIgPSBicmVha1BhcmFtcy55ZWFyO1xyXG4gICAgbGV0IG1vbnRoOiBudW1iZXIgPSBicmVha1BhcmFtcy5tb250aDtcclxuICAgIGxldCBkYXk6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRheTtcclxuICAgIGxldCBkb3k6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRveTtcclxuICAgIGxldCBkb3c6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRvdztcclxuXHJcbiAgICBpZiAoZGF0ZSA8PSAwKSB7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRheSA9IDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRveSA9IDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRvdyA9IDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLnllYXIgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5tb250aCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZG93ID0gZGF0ZSAlIDcgKyAxO1xyXG4gICAgICBkYXRlID0gZGF0ZSAtIDE7XHJcbiAgICAgIGxldCBjZW50NDogbnVtYmVyID0gTWF0aC5mbG9vcihkYXRlIC8gUElDSW50ZXJmYWNlLkRBWVNJTkZPVVJDRU5UKTtcclxuICAgICAgZGF0ZSA9IGRhdGUgLSBjZW50NCAqIFBJQ0ludGVyZmFjZS5EQVlTSU5GT1VSQ0VOVDtcclxuICAgICAgbGV0IGNlbnQ6IG51bWJlciA9IE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5DRU5UVVJZKTtcclxuICAgICAgaWYgKGNlbnQgPiAzKSB7XHJcbiAgICAgICAgY2VudCA9IDM7XHJcbiAgICAgIH1cclxuICAgICAgZGF0ZSA9IGRhdGUgLSBjZW50ICogUElDSW50ZXJmYWNlLkRBWVNJTkNFTlRVUlk7XHJcbiAgICAgIGxldCB5ZWFyNDogbnVtYmVyID0gTWF0aC5mbG9vcihkYXRlIC8gUElDSW50ZXJmYWNlLkRBWVNJTkZPVVJZRUFSKTtcclxuICAgICAgZGF0ZSA9IGRhdGUgLSB5ZWFyNCAqIFBJQ0ludGVyZmFjZS5EQVlTSU5GT1VSWUVBUjtcclxuICAgICAgeWVhciA9IE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5ZRUFSKTtcclxuICAgICAgaWYgKHllYXIgPiAzKSB7XHJcbiAgICAgICAgeWVhciA9IDM7XHJcbiAgICAgIH1cclxuICAgICAgZGF0ZSA9IGRhdGUgLSB5ZWFyICogUElDSW50ZXJmYWNlLkRBWVNJTllFQVI7XHJcbiAgICAgIHllYXIgPSBjZW50NCAqIDQwMCArIGNlbnQgKiAxMDAgKyB5ZWFyNCAqIDQgKyB5ZWFyICsgMTtcclxuICAgICAgbGV0IGxlYXB5ZWFyOiBudW1iZXIgPSAwO1xyXG4gICAgICBpZiAoeWVhciAlIDQgPT09IDApIHtcclxuICAgICAgICBpZiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKSB7XHJcbiAgICAgICAgICBsZWFweWVhciA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWlnbm9yZV9kdF9mbXQgJiYgdGhpcy5fZW52aXJvbm1lbnQuR2V0RGF0ZU1vZGUoY29tcElkeCkgPT09ICdCJykge1xyXG4gICAgICAgIHllYXIgPSB5ZWFyICsgUElDSW50ZXJmYWNlLkRBVEVfQlVEREhJU1RfR0FQO1xyXG4gICAgICB9XHJcbiAgICAgIG1vbnRoID0gKE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5NT05USCkgKyAxKTtcclxuICAgICAgZGF5ID0gUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYlttb250aF07XHJcbiAgICAgIGlmIChsZWFweWVhciA+IDApIHtcclxuICAgICAgICBpZiAobW9udGggPiAxKSB7XHJcbiAgICAgICAgICBkYXkgPSBkYXkgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGUgPj0gZGF5KSB7XHJcbiAgICAgICAgbW9udGggPSBtb250aCArIDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZGF5ID0gUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYlttb250aCAtIDFdO1xyXG4gICAgICAgIGlmIChsZWFweWVhciA+IDApIHtcclxuICAgICAgICAgIGlmIChtb250aCA+IDIpIHtcclxuICAgICAgICAgICAgZGF5ID0gZGF5ICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZGF5ID0gZGF0ZSAtIGRheSArIDE7XHJcbiAgICAgIGRveSA9IGRhdGUgKyAxO1xyXG4gICAgICBicmVha1BhcmFtcy55ZWFyID0geWVhcjtcclxuICAgICAgYnJlYWtQYXJhbXMubW9udGggPSBtb250aDtcclxuICAgICAgYnJlYWtQYXJhbXMuZGF5ID0gZGF5O1xyXG4gICAgICBicmVha1BhcmFtcy5kb3kgPSBkb3k7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRvdyA9IGRvdztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYWxwaGEgc3RyaW5nIGZyb20gaW50IHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clwiPiAgICAgdGhlIG91dHB1dCBzdHJpbmcgKGFzIGFuIGNoYXIgYXJyYXkpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQb3NcIj4gIHN0YXJ0aW5nIHBvc2l0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZW5cIj4gICAgIHN0cmluZyBsZW5ndGhcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5cIj4gICAgICAgdGhlIG51bWJlciB0byBjb252ZXJ0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZWFkXCI+ICAgIGxlYWRpbmcgY2hhcmFjdGVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVzdWx0IHN0cmluZyBsZW5ndGhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW50XzJfYShzdHI6IHN0cmluZ1tdLCBzdHJQb3M6IG51bWJlciwgbGVuOiBudW1iZXIsIG46IG51bWJlciwgbGVhZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBuZWc6IGJvb2xlYW4gPSBuIDwgMDtcclxuXHJcbiAgICBpZiAobGVuIDw9IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBuID0gTWF0aC5hYnMobik7XHJcbiAgICBsZXQgcG9zOiBudW1iZXIgPSBsZW47XHJcblxyXG4gICAgZG8ge1xyXG4gICAgICBzdHJbc3RyUG9zICsgKHBvcyA9IHBvcyAtIDEpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNDggKyBuICUgMTApO1xyXG4gICAgICBuID0gTWF0aC5mbG9vcihuIC8gMTApO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKHBvcyA+IDAgJiYgbiA+IDApO1xyXG5cclxuICAgIGlmIChuZWcgJiYgcG9zID4gMCkge1xyXG4gICAgICBzdHJbc3RyUG9zICsgKHBvcyA9IHBvcyAtIDEpXSA9ICctJy8qJy0nKi87XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5saWJfYV9maWxsKHN0ciwgc3RyUG9zLCBsZW4sIHBvcywgbGVhZC5jaGFyQ29kZUF0KDApKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmlsbCB0aGUgY2hhciBhcnJheSBmb3IgdGhlIGNvbnZlcnRpbmcgb2YgaW50LT5zdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyXCI+ICAgICB0aGUgb3V0cHV0IHN0cmluZyAoYXMgYW4gY2hhciBhcnJheSlcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clBvc1wiPiAgc3RhcnRpbmcgcG9zaXRpb25cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxlblwiPiAgICAgc3RyaW5nIGxlbmd0aFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGVhZFwiPiAgICBsZWFkaW5nIGNoYXJhY3RlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlc3VsdCBzdHJpbmcgbGVuZ3RoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGxpYl9hX2ZpbGwoc3RyOiBzdHJpbmdbXSwgc3RyUG9zOiBudW1iZXIsIGxlbjogbnVtYmVyLCBwb3M6IG51bWJlciwgbGVhZDogbnVtYmVyKTogbnVtYmVyIHtcclxuXHJcbiAgICBpZiAobGVhZCA9PT0gMCkge1xyXG4gICAgICBsZW4gPSBsZW4gLSBwb3M7XHJcblxyXG4gICAgICBpZiAobGVuID4gMCAmJiBwb3MgPiAwKSB7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbWNweShzdHIsIHN0clBvcywgc3RyLCBwb3MsIGxlbik7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChzdHIsIHN0clBvcyArIGxlbiwgJyAnLCAvKicgJyovcG9zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChwb3MgPiAwKSB7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChzdHIsIHN0clBvcywgU3RyaW5nLmZyb21DaGFyQ29kZShsZWFkKSwgcG9zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxlbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IGluZGV4IHRvIE5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0ZU5hbWVQYXJhbXNcIj4gIG91dHB1dCBzdGluZyBkZXRhaWxzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJubVwiPiAgICAgICAgICAgICAgbmFtZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidHJpbVwiPiAgICAgICAgICAgIG91dHB1dCBzdHJpbmcgc2hvdWxkIGJlIHRyaW1lZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGRhdGVfaV8yX25tKGRhdGVOYW1lUGFyYW1zOiBEYXRlTmFtZVBhcmFtcywgbm06IHN0cmluZ1tdLCB0cmltOiBib29sZWFuKTogbnVtYmVyIHtcclxuXHJcbiAgICBsZXQgbjogbnVtYmVyID0gdGhpcy5kYXRlX21za19jbnQoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIDxudW1iZXI+ZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIGxldCBsOiBudW1iZXI7XHJcbiAgICBpZiAodHJpbSkge1xyXG4gICAgICBsID0gTWVtb3J5VXRpbC5tZW1fdHJpbShubSwgMCwgbik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbCA9IG47XHJcbiAgICB9XHJcbiAgICBsID0gTWF0aC5taW4obCwgZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIG5tLCAwLCBsKTtcclxuICAgIGRhdGVOYW1lUGFyYW1zLm91dElkeCA9IGRhdGVOYW1lUGFyYW1zLm91dElkeCArIGw7XHJcbiAgICBkYXRlTmFtZVBhcmFtcy5sZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW4gLSBuO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBUcmltZWQgPyBKdW1wIG90aGVyIHRyaW1lZCBtYXNrIDogbm90aGluZ1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICBuID0gbiAtIGw7XHJcblxyXG4gICAgaWYgKG4gPiAwKSB7XHJcbiAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4ICsgbiwgZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIH1cclxuICAgIHJldHVybiA8bnVtYmVyPm47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gIC8vLyAgIENvbnZlcnQgaW5kZXggdG8gTmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJPdXRcIj4gICAgICAgICAgb3V0cHV0IHN0aW5nIChvcmlnaW5hbClcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGVOYW1lUGFyYW1zXCI+ICBvdXRwdXQgc3RpbmcgZGV0YWlsc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyTm1cIj4gICAgICAgICAgIG5hbWUgd2hpY2ggd2lsbCBiZSBlbWJlZGRlZCBpbiBvdXRwdXQgc3RyaW5nXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRPdXRMZW5cIj4gICAgICAgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgdGhlIG91dHB1dCBzdHJpbmdcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+ICAgICAgICAgICAgICAgICBvdXRwdXQgc3RpbmcgKHByb2Nlc3NlZClcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZGF0ZV9pXzJfbm1fYnl0ZW1vZGUoc3RyT3V0OiBzdHJpbmcsIGRhdGVOYW1lUGFyYW1zOiBEYXRlTmFtZVBhcmFtcywgc3RyTm06IHN0cmluZywgaW50T3V0TGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGludE1za0NudDogbnVtYmVyID0gdGhpcy5kYXRlX21za19jbnQoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIDxudW1iZXI+ZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIGxldCBzdHJXb3JrOiBzdHJpbmcgPSBOU3RyaW5nLkZyb21DaGFycyhkYXRlTmFtZVBhcmFtcy5vdXRWYWwpO1xyXG5cclxuICAgIHN0cldvcmsgPSBzdHJXb3JrLnN1YnN0cigwLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgpO1xyXG5cclxuICAgIGxldCBpbnRPZnM6IG51bWJlciA9IFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0cldvcmspO1xyXG4gICAgc3RyTm0gPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIoc3RyTm0sIGludE1za0NudCk7XHJcbiAgICBzdHJPdXQgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQihOU3RyaW5nLkZyb21DaGFycyhkYXRlTmFtZVBhcmFtcy5vdXRWYWwpLCBzdHJObSwgaW50T2ZzICsgMSwgaW50TXNrQ250KTtcclxuXHJcbiAgICBkYXRlTmFtZVBhcmFtcy5vdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHggKyBzdHJObS5sZW5ndGg7XHJcbiAgICBkYXRlTmFtZVBhcmFtcy5sZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW4gLSBpbnRNc2tDbnQ7XHJcbiAgICBpbnRPdXRMZW4gPSBpbnRPdXRMZW4gLSBpbnRNc2tDbnQ7XHJcbiAgICByZXR1cm4gc3RyT3V0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiBOIG9mIGNvbnNlY3V0aXZlIE1hc2sgY2hhcmFjdGVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtc2tcIj4gICAgIHRoZSBtYXNrIHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtc2tQb3NcIj4gIGluZGV4IG9mIGZpcnN0IGNoYXIgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxlblwiPiAgICAgbGVuZ3RoIG9mIHRoZSBtYXNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBudW1iZXIgb2YgY29uc2VjdXRpdmUgTWFzayBjaGFyYWN0ZXJzXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGRhdGVfbXNrX2NudChtc2s6IHN0cmluZ1tdLCBtc2tQb3M6IG51bWJlciwgbGVuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGM6IHN0cmluZyA9IG1za1ttc2tQb3MrK107XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMTtcclxuICAgIHdoaWxlICg8bnVtYmVyPmkgPCBsZW4pIHtcclxuICAgICAgaWYgKG1za1ttc2tQb3NdICE9PSBjKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgbXNrUG9zID0gbXNrUG9zICsgMTtcclxuICAgICAgaSA9IGkgKyAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcHV0ZSBEYXkgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBkYXRlXzJfRERERChkYXk6IG51bWJlciwgb3V0VmFsOiBzdHJpbmdbXSwgb3V0SWR4OiBudW1iZXIsIGxlbjogbnVtYmVyLCB0cmltOiBib29sZWFuKTogbnVtYmVyIHtcclxuXHJcblxyXG4gICAgbGV0IHJldDogbnVtYmVyID0gNDtcclxuICAgIGxldCBleHQ6IHN0cmluZ1tdO1xyXG5cclxuICAgIGlmIChkYXkgPiA5KSB7XHJcbiAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMiwgZGF5LCAoPG51bWJlcj4wKS50b1N0cmluZygpKTtcclxuICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRyaW0pIHtcclxuICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KG91dFZhbCwgb3V0SWR4LCBvdXRWYWwsIG91dElkeCArIDEsIGxlbiAtIDEpO1xyXG4gICAgICAgIC8qMTctTWF5LTkwKi9cclxuICAgICAgICByZXQtLTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyAqKG91dCsrKSA9ICcgJzsgLy8gT3JpZ2luYWwgTGluZVxyXG4gICAgICAgIG91dFZhbFtvdXRJZHgrK10gPSAnICc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAxLCBkYXksICg8bnVtYmVyPjApLnRvU3RyaW5nKCkpO1xyXG4gICAgICBvdXRJZHgrKztcclxuICAgIH1cclxuICAgIHN3aXRjaCAoZGF5KSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgY2FzZSAyMTpcclxuICAgICAgY2FzZSAzMTpcclxuICAgICAgICBleHQgPSBOU3RyaW5nLlRvQ2hhckFycmF5KFwic3RcIik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgIGNhc2UgMjI6XHJcbiAgICAgICAgZXh0ID0gTlN0cmluZy5Ub0NoYXJBcnJheShcIm5kXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAzOlxyXG4gICAgICBjYXNlIDIzOlxyXG4gICAgICAgIGV4dCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoXCJyZFwiKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZXh0ID0gTlN0cmluZy5Ub0NoYXJBcnJheShcInRoXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgb3V0VmFsW291dElkeCsrXSA9IGV4dFswXTtcclxuICAgIG91dFZhbFtvdXRJZHhdID0gZXh0WzFdO1xyXG5cclxuICAgIHJldHVybiAocmV0KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIHRpbWUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgZnJvbU1nVGltZVRvTmF0aXZlVGltZShkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDKTogRGF0ZSB7XHJcbiAgICBsZXQgdGltZTogbnVtYmVyID0gbmV3IE5VTV9UWVBFKGRhdGFTdHIpLk5VTV8yX1VMT05HKCk7XHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IFRpbWVCcmVha1BhcmFtcyA9IG5ldyBUaW1lQnJlYWtQYXJhbXMoKTtcclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLnRpbWVfYnJlYWsoYnJlYWtQYXJhbXMsIHRpbWUpO1xyXG5cclxuICAgIGxldCBuYXRpdmVEdDogRGF0ZSA9IG5ldyBEYXRlKDApO1xyXG5cclxuICAgIGxldCBtYXNrU3RyID0gcGljLmdldE1hc2soKTtcclxuICAgIGxldCBvdXRWYWw6IHN0cmluZ1tdID0gTlN0cmluZy5Ub0NoYXJBcnJheShtYXNrU3RyKTtcclxuICAgIGxldCBsZW4gPSBwaWMuZ2V0TWFza1NpemUoKTtcclxuICAgIGxldCBvdXRJZHggPSAwO1xyXG5cclxuICAgIHdoaWxlIChsZW4gPiAwKSB7XHJcbiAgICAgIHN3aXRjaCAob3V0VmFsW291dElkeF0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSEgpOlxyXG4gICAgICAgICAgbmF0aXZlRHQuc2V0SG91cnMoYnJlYWtQYXJhbXMuaG91cik7XHJcbiAgICAgICAgICBvdXRJZHggKz0gMjtcclxuICAgICAgICAgIGxlbiAtPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOlxyXG4gICAgICAgICAgbmF0aXZlRHQuc2V0TWludXRlcyhicmVha1BhcmFtcy5taW51dGUpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICAgICAgICBsZW4gLT0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1NTKTpcclxuICAgICAgICAgIG5hdGl2ZUR0LnNldFNlY29uZHMoYnJlYWtQYXJhbXMuc2Vjb25kKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgb3V0SWR4ICsrO1xyXG4gICAgICAgICAgbGVuIC0tO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5hdGl2ZUR0OyAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHRpbWUgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQXNjaWlTdHJcIj4gICAgICAgIFRoZSBtYXNrIHRvIGJlIHVzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQXNjaWlMXCI+ICAgICAgICAgIE1hc2sgbGVuZ3RoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPiAgICAgICAgICAgICBUaGUgcGljdXJlIGluZm9ybWF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRpbWVfcGljX1pfZWR0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlY29uZHNcIj4vIG1pbGxpU2Vjb25kcyBmbGFnPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHRpbWVfMl9hX3BpYyhBc2NpaVN0cjogc3RyaW5nLCBBc2NpaUw6IG51bWJlciwgdGltZTogbnVtYmVyLCBwaWM6IFBJQywgdGltZV9waWNfWl9lZHQ6IGJvb2xlYW4sIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IHN0cmluZyB7XHJcblxyXG4gICAgLy8gT3JpZ2luYWwgdmFyc1xyXG4gICAgbGV0IGhvdXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWludXRlOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHNlY29uZDogbnVtYmVyID0gMDtcclxuICAgIGxldCBtaWxsaXNlYzogbnVtYmVyID0gMDtcclxuXHJcbiAgICBsZXQgQXNjaWk6IHN0cmluZ1tdID0gTlN0cmluZy5Ub0NoYXJBcnJheShBc2NpaVN0cik7XHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IFRpbWVCcmVha1BhcmFtcyA9IG5ldyBUaW1lQnJlYWtQYXJhbXMoaG91ciwgbWludXRlLCBzZWNvbmQpO1xyXG4gICAgbGV0IHRpbWVTZWM6IG51bWJlcjtcclxuICAgIGlmIChtaWxsaVNlY29uZHMpIHtcclxuICAgICAgdGltZVNlYyA9IE1hdGguZmxvb3IodGltZSAvIDEwMDApO1xyXG4gICAgICBtaWxsaXNlYyA9IHRpbWUgLSB0aW1lU2VjICogMTAwMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aW1lU2VjID0gdGltZTtcclxuICAgIH1cclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLnRpbWVfYnJlYWsoYnJlYWtQYXJhbXMsIHRpbWVTZWMpO1xyXG4gICAgaG91ciA9IGJyZWFrUGFyYW1zLmhvdXI7XHJcbiAgICBtaW51dGUgPSBicmVha1BhcmFtcy5taW51dGU7XHJcbiAgICBzZWNvbmQgPSBicmVha1BhcmFtcy5zZWNvbmQ7XHJcblxyXG4gICAgLy8gSWYgYXNjaWkgcmVwcmVzZW50YXRpb24gb3ZlcmZsb3dzIG91dHB1dCBidWZmZXJcclxuICAgIC8vIGZpbGwgd2l0aCAnKicgYW5kIGJhaWwgb3V0XHJcblxyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgaWYgKHBpYy5nZXRNYXNrU2l6ZSgpID4gQXNjaWlMKSB7XHJcbiAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoQXNjaWksIDAsICcqJywgLyonKicqL0FzY2lpTCk7XHJcbiAgICAgIHJlc3VsdCA9IE5TdHJpbmcuRnJvbUNoYXJzKEFzY2lpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAocGljLnplcm9GaWxsKCkpIHtcclxuICAgICAgICBpZiAodGltZVNlYyA9PT0gMCAmJiAoIW1pbGxpU2Vjb25kcyB8fCBtaWxsaXNlYyA9PT0gMCkpIHtcclxuICAgICAgICAgIGlmICh0aW1lX3BpY19aX2VkdCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbnR4OiBudW1iZXIgPSAwOyBpbnR4IDwgcGljLmdldE1hc2tTaXplKCk7IGludHggPSBpbnR4ICsgMSkge1xyXG4gICAgICAgICAgICAgIGlmIChBc2NpaVtpbnR4XSA8PSAnXFx1MDAxZicpIHtcclxuICAgICAgICAgICAgICAgIEFzY2lpW2ludHhdID0gcGljLmdldFplcm9QYWQoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0ID0gTlN0cmluZy5Gcm9tQ2hhcnMoQXNjaWkpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChBc2NpaSwgMCwgcGljLmdldFplcm9QYWQoKSwgcGljLmdldE1hc2tTaXplKCkpO1xyXG4gICAgICAgICAgcmVzdWx0ID0gTlN0cmluZy5Gcm9tQ2hhcnMoQXNjaWkpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IEk6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBhbTogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGxlbjogbnVtYmVyID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICAgIGxldCBIb3VySTogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgICB3aGlsZSAoSSA8IGxlbikge1xyXG4gICAgICAgIHN3aXRjaCAoQXNjaWlbSV0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ISCk6XHJcbiAgICAgICAgICAgIEhvdXJJID0gSTtcclxuICAgICAgICAgICAgSSArPSAyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOlxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2EoQXNjaWksIEksIDIsIG1pbnV0ZSwgJzAnKTtcclxuICAgICAgICAgICAgSSArPSAyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1NTKTpcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKEFzY2lpLCBJLCAyLCBzZWNvbmQsICcwJyk7XHJcbiAgICAgICAgICAgIEkgKz0gMjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6XHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShBc2NpaSwgSSwgMywgbWlsbGlzZWMsICcwJyk7XHJcbiAgICAgICAgICAgIEkgKz0gMztcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19QTSk6XHJcbiAgICAgICAgICAgIGFtID0gMTtcclxuICAgICAgICAgICAgbGV0IHRtcEhvdXI6IG51bWJlciA9IGhvdXIgJSAyNDtcclxuICAgICAgICAgICAgaWYgKHRtcEhvdXIgPCAxMiB8fCB0bXBIb3VyID09PSAwKVxyXG4gICAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoQXNjaWksIEksIE5TdHJpbmcuVG9DaGFyQXJyYXkoXCJhbVwiKSwgMCwgMik7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KEFzY2lpLCBJLCBOU3RyaW5nLlRvQ2hhckFycmF5KFwicG1cIiksIDAsIDIpO1xyXG4gICAgICAgICAgICBJICs9IDI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIEkrKztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChIb3VySSA+PSAwKSB7XHJcbiAgICAgICAgaWYgKGFtID4gMCkge1xyXG4gICAgICAgICAgaG91ciA9IGhvdXIgJSAyNDtcclxuICAgICAgICAgIGlmIChob3VyID09PSAwKSB7XHJcbiAgICAgICAgICAgIGhvdXIgPSAxMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBob3VyID0gaG91ciAlIDEyO1xyXG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIGhvdXIgPSAxMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmludF8yX2EoQXNjaWksIEhvdXJJLCAyLCBob3VyLCAoYW0gIT09IDAgJiYgaG91ciA8IDEwKSA/ICcgJyA6IC8qJyAnKi8nMCcvKicwJyovKTtcclxuICAgICAgfVxyXG4gICAgICByZXN1bHQgPSBOU3RyaW5nLkZyb21DaGFycyhBc2NpaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJyZWFrIHRpbWUgaW50byBpdHMgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIHRpbWVfYnJlYWsoYnJlYWtQYXJhbXM6IFRpbWVCcmVha1BhcmFtcywgdGltZTogbnVtYmVyKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRpbWUgPD0gMCkge1xyXG4gICAgICBicmVha1BhcmFtcy5zZWNvbmQgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5taW51dGUgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5ob3VyID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBicmVha1BhcmFtcy5ob3VyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgIHRpbWUgPSB0aW1lIC0gYnJlYWtQYXJhbXMuaG91ciAqIDM2MDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLm1pbnV0ZSA9IE1hdGguZmxvb3IodGltZSAvIDYwKTtcclxuICAgICAgYnJlYWtQYXJhbXMuc2Vjb25kID0gdGltZSAtIGJyZWFrUGFyYW1zLm1pbnV0ZSAqIDYwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGEgbG9naWNhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFwiMFwiIGZvciBmYWxzZSBvciBcIjFcIiBmb3IgdHJ1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhblxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmcm9tTWdMb2dpY2FsVG9OYXRpdmVMb2dpY2FsKGRhdGFTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBuYXRpdmVWYWw6IGJvb2xlYW47XHJcbiAgICBuYXRpdmVWYWwgPSAoZGF0YVN0ci5jaGFyQXQoMCkgPT09ICcxJykgPyB0cnVlIDogZmFsc2U7XHJcbiAgICByZXR1cm4gbmF0aXZlVmFsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIG1nIHN0cmluZyBmb3IgYSBsb2dpY2FsIHZhbHVlIGFjY29yZGluZyB0byB0aGUgYm9vbGVhbiB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsXCI+ICBib29sZWFuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmdcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZnJvbU5hdGl2ZUxvZ2ljYWxUb01nTG9naWNhbChkaXNwVmFsOiBib29sZWFuKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZztcclxuICAgIG1nVmFsID0gKGRpc3BWYWwgPT09IHRydWUpID8gXCIxXCIgOiBcIjBcIjtcclxuXHJcbiAgICByZXR1cm4gbWdWYWw7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIGRlZmF1bHQgcmFuZ2UgZm9yIGxvZ2ljYWwgdmFsdWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJuZ1wiPiAgY3VycmVudCByYW5nZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZGVmYXVsdCByYW5nZSBpZiB0aGUgaW5wdXQgcmFuZ2UgaXMgZW1wdHk8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSB3aW5fcm5nX2Jvb2wocm5nOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIGlmIChybmcgPT09IG51bGwgfHwgcm5nLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBybmcgPSBcIlRydWUsIEZhbHNlXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcm5nO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gTWV0aG9kcyBmb3IgY292ZXJ0aW5nIERJUExBWSAtLS0+IElOVEVSTkFMXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyYW5zbGF0ZXMgYSBzdHJpbmcgbnVtYmVyIHRvIG1hZ2ljIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsdWVcIj4gICBBIHN0cmluZyBudW1iZXI8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgICAgVGhlIHBpY3R1cmUgdG8gdXNlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBtYWdpYyBudW1iZXI8L3JldHVybnM+XHJcbiAgdG9OdW0oZGlzcFZhbHVlOiBzdHJpbmcsIHBpYzogUElDLCBjb21wSWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IG1nTnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRShkaXNwVmFsdWUsIHBpYywgY29tcElkeCk7XHJcbiAgICByZXR1cm4gbWdOdW0udG9YTUxyZWNvcmQoKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGRzIHRoZSBkYXRlIG1hZ2ljIG51bWJlciBmcm9tIHRoZSBzdHJpbmcgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyXCI+ICAgICAgICAgICAgdGhlIGRhdGUgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0cl9sZW5cIj4gICAgICAgIGxlbmd0aCBvZiBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICAgICAgICAgICAgdGhlIHBpY3R1cmUgaW5mbzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtYXNrXCI+ICAgICAgICAgICB0aGUgbWFzayBvZiB0aGUgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlnbm9yZV9kdF9mbXRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIG1hZ2ljIG51bWJlcjwvcmV0dXJucz5cclxuICBhXzJfZGF0ZV9waWNfZGF0ZW1vZGUoc3RyOiBzdHJpbmdbXSwgc3RyX2xlbjogbnVtYmVyLCBwaWM6IFBJQywgbWFzazogc3RyaW5nW10sIGNvbXBJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcG9zOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHllYXJfaW5fcGljOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbW9udGhfaW5fcGljOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZGF5X2luX3BpYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGlucDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGJZZWFySXNaZXJvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZXJhX3llYXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgaW50UmVmOiBJbnRSZWYgPSBuZXcgSW50UmVmKDApO1xyXG4gICAgbGV0IGludFBpY0lkeE9mczogbnVtYmVyID0gMDtcclxuICAgIGxldCBtaWxsZW5pdW06IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZGF0ZVBhcmFtczogRGF0ZUJyZWFrUGFyYW1zO1xyXG5cclxuICAgIGxldCBsZW46IG51bWJlciA9IE1hdGgubWluKHN0ci5sZW5ndGgsIHBpYy5nZXRNYXNrU2l6ZSgpKTtcclxuXHJcbiAgICBpZiAoc3RyLmxlbmd0aCA8IG1hc2subGVuZ3RoKVxyXG4gICAgICBzdHIubGVuZ3RoID0gbWFzay5sZW5ndGg7XHJcblxyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbW9udGg6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSAxO1xyXG4gICAgbGV0IGRveTogbnVtYmVyID0gMTtcclxuICAgIGxldCB1c2Vkb3k6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHN0cl9sZW47IGkgPSBpICsgMSkge1xyXG4gICAgICBpZiAoc3RyW2ldICE9PSAnMCcgJiYgc3RyW2ldICE9PSAnICcpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpID09PSBzdHJfbGVuKVxyXG4gICAgICByZXR1cm4gMDtcclxuXHJcbiAgICB3aGlsZSAocG9zIDwgc3RyX2xlbiAmJiBwb3MgKyBpbnRQaWNJZHhPZnMgPCBsZW4pIHtcclxuXHJcbiAgICAgIHN3aXRjaCAobWFza1twb3MgKyBpbnRQaWNJZHhPZnNdLmNoYXJDb2RlQXQoMCkpIHtcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVk6XHJcbiAgICAgICAgICB5ZWFyX2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgeWVhciA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDIsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMjtcclxuICAgICAgICAgIC8vIEhlbiAxNi8xMS85NyA6IEZpeCAjNzY4NDQyXHJcbiAgICAgICAgICBpZiAoeWVhciA9PT0gMClcclxuICAgICAgICAgICAgYlllYXJJc1plcm8gPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IGNlbnR1cnlfeWVhcjogbnVtYmVyID0gdGhpcy5fZW52aXJvbm1lbnQuR2V0Q2VudHVyeShjb21wSWR4KSAlIDEwMDsgLy8gREVGX2NlbnR1cnlcclxuICAgICAgICAgIGlmICh5ZWFyIDwgY2VudHVyeV95ZWFyKVxyXG4gICAgICAgICAgICB5ZWFyICs9IDEwMDtcclxuICAgICAgICAgIHllYXIgKz0gdGhpcy5fZW52aXJvbm1lbnQuR2V0Q2VudHVyeShjb21wSWR4KSAtIGNlbnR1cnlfeWVhcjsgLy8gREVGX2NlbnR1cnlcclxuICAgICAgICAgIGlmICh0aGlzLl9lbnZpcm9ubWVudC5HZXREYXRlTW9kZShjb21wSWR4KSA9PT0gJ0InKVxyXG4gICAgICAgICAgLy8gREVGX2RhdGVfbW9kZVxyXG4gICAgICAgICAgICB5ZWFyIC09IFBJQ0ludGVyZmFjZS5EQVRFX0JVRERISVNUX0dBUDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ZWVlZKTpcclxuICAgICAgICAgIHllYXJfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgWWVhckRpZ2l0c05vOiBudW1iZXI7XHJcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgNCB5ZWFyIGRpZ2l0LiBJZiBub3QsIGFkanVzdCBpdFxyXG4gICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSAnY2VudHVyeSB5ZWFyJ1xyXG4gICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgZm9yIChZZWFyRGlnaXRzTm8gPSAwOyBZZWFyRGlnaXRzTm8gPCA0ICYmIHBvcyArIFllYXJEaWdpdHNObyA8IHN0ci5sZW5ndGggJiYgVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyW3BvcyArIFllYXJEaWdpdHNOb10pOyBZZWFyRGlnaXRzTm8rKykge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGkgPSBZZWFyRGlnaXRzTm87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgcG9zICsgaSA8IHN0ci5sZW5ndGggJiYgc3RyW3BvcyArIGldICE9PSB0aGlzLkRBVEVDSEFSLnRvU3RyaW5nKCkgJiYgaSA8IDQ7IGkrKykge1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKFllYXJEaWdpdHNObyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgcG9zICsgWWVhckRpZ2l0c05vIDwgc3RyLmxlbmd0aCAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChzdHJbcG9zICsgWWVhckRpZ2l0c05vXSkgJiZcclxuICAgICAgICAgICAgICAgICBZZWFyRGlnaXRzTm8gPCA0O1xyXG4gICAgICAgICAgICAgICAgIFllYXJEaWdpdHNObysrKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpKSB7XHJcbiAgICAgICAgICAgIGlmIChpIDwgNCAmJiBzdHIubGVuZ3RoIDwgbWFzay5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDQgLSBpLCBzdHIubGVuZ3RoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaSA8IDQgJiYgbGVuIDwgbWFzay5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgNCAtIGksIGxlbik7XHJcbiAgICAgICAgICAgICAgbGVuID0gbGVuICsgNCAtIGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB5ZWFyID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgNCwgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSA0O1xyXG5cclxuICAgICAgICAgIC8vIEhlbiAxNi8xMS85NyA6IEZpeCAjNzY4NDQyXHJcbiAgICAgICAgICBpZiAoeWVhciA9PT0gMClcclxuICAgICAgICAgICAgYlllYXJJc1plcm8gPSB0cnVlO1xyXG5cclxuICAgICAgICAgIGlmIChZZWFyRGlnaXRzTm8gPD0gMikge1xyXG4gICAgICAgICAgICBjZW50dXJ5X3llYXIgPSB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KGNvbXBJZHgpICUgMTAwOyAvLyBERUZfY2VudHVyeVxyXG4gICAgICAgICAgICBpZiAoeWVhciA8IGNlbnR1cnlfeWVhcilcclxuICAgICAgICAgICAgICB5ZWFyICs9IDEwMDtcclxuICAgICAgICAgICAgeWVhciArPSB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KGNvbXBJZHgpIC0gY2VudHVyeV95ZWFyOyAvLyBERUZfY2VudHVyeVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9lbnZpcm9ubWVudC5HZXREYXRlTW9kZShjb21wSWR4KSA9PT0gJ0InKVxyXG4gICAgICAgICAgLy8gREVGX2RhdGVfbW9kZVxyXG4gICAgICAgICAgICB5ZWFyIC09IFBJQ0ludGVyZmFjZS5EQVRFX0JVRERISVNUX0dBUDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWTpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgcXVvdGVzOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgaWYgKGxlbiA+IHBvcyArIDUgJiYgbWFza1twb3MgKyA1XS5jaGFyQ29kZUF0KDApID09PSAoUElDSW50ZXJmYWNlLlBJQ19IWVlZWVkpKVxyXG4gICAgICAgICAgICBxdW90ZXMgPSAxO1xyXG4gICAgICAgICAgeWVhciA9IEhlYnJld0RhdGUuZGF0ZWhlYl9oXzJfaShzdHIsIDUgKyBxdW90ZXMsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gNSArIHF1b3RlcztcclxuICAgICAgICAgIGlmICh5ZWFyID09PSAwKVxyXG4gICAgICAgICAgICBiWWVhcklzWmVybyA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hMOlxyXG4gICAgICAgICAgaW50UGljSWR4T2ZzID0gSGVicmV3RGF0ZS5kYXRlaGViX2hfMl9pKHN0ciwgMSwgcG9zKTtcclxuICAgICAgICAgIHBvcysrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IREQ6XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgcXVvdGVzID0gMDtcclxuICAgICAgICAgIGlmIChsZW4gPiBwb3MgKyAyICYmIG1hc2tbcG9zICsgMl0uY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IREQpXHJcbiAgICAgICAgICAgIHF1b3RlcyA9IDE7XHJcbiAgICAgICAgICBkYXkgPSBIZWJyZXdEYXRlLmRhdGVoZWJfaF8yX2koc3RyLCAyICsgcXVvdGVzLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDIgKyBxdW90ZXM7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBtb250aF9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBpZiAoKHN0ci5sZW5ndGggPT09IHBvcyArIDEgfHwgc3RyW3BvcyArIDFdLmNoYXJDb2RlQXQoMCkgPT09IHRoaXMuREFURUNIQVIgfHwgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltwb3MgKyAxXSkpICYmIHN0ci5sZW5ndGggPCBtYXNrLmxlbmd0aClcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgMSwgc3RyLmxlbmd0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHN0cltwb3MgKyAxXS5jaGFyQ29kZUF0KDApID09PSB0aGlzLkRBVEVDSEFSICYmIGxlbiA8IG1hc2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDEsIGxlbik7XHJcbiAgICAgICAgICAgICAgbGVuICs9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG1vbnRoID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgMiwgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTU1NOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIG1vbnRoX2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBpbnRSZWYudmFsID0gcG9zO1xyXG4gICAgICAgICAgbW9udGggPSB0aGlzLmRhdGVfTU1NXzJfbShzdHIsIG1hc2ssIGludFJlZiwgbGVuLCBwaWMuaXNIZWJyZXcoKSk7XHJcbiAgICAgICAgICBwb3MgPSBpbnRSZWYudmFsO1xyXG4gICAgICAgICAgaWYgKHBpYy5pc0hlYnJldygpICYmIG1vbnRoID09PSAxNClcclxuICAgICAgICAgICAgbW9udGggPSA2O1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0REKTpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBkYXlfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgaWYgKChzdHIubGVuZ3RoID09PSBwb3MgKyAxIHx8IHN0cltwb3MgKyAxXS5jaGFyQ29kZUF0KDApID09PSB0aGlzLkRBVEVDSEFSIHx8ICFVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChzdHJbcG9zICsgMV0pKSAmJiBzdHIubGVuZ3RoIDwgbWFzay5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDEsIHN0ci5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzdHJbcG9zICsgMV0uY2hhckNvZGVBdCgwKSA9PT0gdGhpcy5EQVRFQ0hBUiAmJiBsZW4gPCBtYXNrLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIHRoaXMubW92ZV9kYXRlKHN0ciwgcG9zLCAxLCBsZW4pO1xyXG4gICAgICAgICAgICAgIGxlbiArPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXkgPSB0aGlzLmRhdGVfYV8yX2koc3RyLCAyLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfREREKTpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICB1c2Vkb3kgPSB0cnVlO1xyXG4gICAgICAgICAgZGF5X2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBkb3kgPSB0aGlzLmRhdGVfYV8yX2koc3RyLCAzLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDM7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfRERERCk6XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgZGF5X2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBkYXkgPSB0aGlzLmRhdGVfYV8yX2koc3RyLCAyLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDIgKyAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1lKKTogLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgeWVhcl9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgaWYgKChzdHIubGVuZ3RoID09PSBwb3MgKyAxIHx8IHN0cltwb3MgKyAxXS5jaGFyQ29kZUF0KDApID09PSB0aGlzLkRBVEVDSEFSIHx8ICFVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChzdHJbcG9zICsgMV0pKSAmJiBzdHIubGVuZ3RoIDwgbWFzay5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDEsIHN0ci5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgeWVhciA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDIsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMjtcclxuXHJcbiAgICAgICAgICBsZXQgc3RyMTogc3RyaW5nID0gTlN0cmluZy5Gcm9tQ2hhcnMoc3RyKTtcclxuICAgICAgICAgIGVyYV95ZWFyID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5nZXRTdGFydFllYXJPZkVyYShzdHIxLCBwaWMuZ2V0TWFzaygpKTtcclxuXHJcbiAgICAgICAgICBpZiAoZXJhX3llYXIgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgeWVhciArPSBlcmFfeWVhciAtIDE7XHJcblxyXG4gICAgICAgICAgaWYgKHllYXIgPT09IDApXHJcbiAgICAgICAgICAgIGJZZWFySXNaZXJvID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIFwic3RyW3Bvc11cIiBjb250YWlucyBEQkNTLCB0aGUgbmV4dCBpbmRleCBvZiBcIm1hc2tcIiBoYXMgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChzdHJbcG9zXSkgPT09IGZhbHNlICYmXHJcbiAgICAgICAgICAgICAgVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKG1hc2tbcG9zICsgaW50UGljSWR4T2ZzXSkpXHJcbiAgICAgICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcG9zICs9IDE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChiWWVhcklzWmVybykge1xyXG4gICAgICBpZiAoIW1vbnRoX2luX3BpYylcclxuICAgICAgICBtb250aCA9IDA7XHJcbiAgICAgIGlmICghZGF5X2luX3BpYyAmJiBtb250aCA9PT0gMClcclxuICAgICAgICBkYXkgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhlbiAxNi8xMS85NyA6IEZpeCAjNzY4NDQyXHJcbiAgICAvLyBaZXJvIGRhdGUgaXMgdmFsaWQgYW5kIHNob3VsZCByZXR1cm4gMEwuIFRoaXMgY2hlY2sgbXVzdCBiZSBoZXJlXHJcbiAgICAvLyBiZWNhdXNlIHRoZSB5ZWFyIHZhbHVlIG1heSBiZSBjaGFuZ2VkIGJlY2F1c2Ugb2YgY2VudHVyeSB5ZWFyLlxyXG4gICAgaWYgKGRheSA9PT0gMCAmJiBtb250aCA9PT0gMCAmJiAoYlllYXJJc1plcm8gfHwgeWVhciA9PT0gMCkpXHJcbiAgICAgIHJldHVybiAoMCk7XHJcblxyXG4gICAgaWYgKCFpbnApXHJcbiAgICAgIHJldHVybiAoMCk7XHJcblxyXG4gICAgLy8gSGVicmV3IFllYXJcclxuICAgIGlmIChwaWMuaXNIZWJyZXcoKSkge1xyXG4gICAgICBpZiAoeWVhciA+IDApIHtcclxuICAgICAgICBpZiAobWlsbGVuaXVtID09PSAwKVxyXG4gICAgICAgICAgbWlsbGVuaXVtID0gNTtcclxuICAgICAgICB5ZWFyICs9IG1pbGxlbml1bSAqIDEwMDA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIChIZWJyZXdEYXRlLmRhdGVoZWJfMl9kKHllYXIsIG1vbnRoLCBkYXkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGUgbmV4dCAyIGxpbmVzIHN1cHBvcnQgNC54eCBERC9NTSBwaWN0dXJlc1xyXG4gICAgaWYgKCh5ZWFyID09PSAwKSAmJiAheWVhcl9pbl9waWMpIHtcclxuICAgICAgZGF0ZVBhcmFtcyA9IHRoaXMuZGF0ZV9zeXMoKTtcclxuICAgICAgeWVhciA9IGRhdGVQYXJhbXMueWVhcjtcclxuICAgIH1cclxuICAgIHJldHVybiAodGhpcy5kYXRlXzRfY2FsZW5kZXIoeWVhciwgbW9udGgsIGRheSwgZG95LCB1c2Vkb3kpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBEZWNvZGUgZGlnaXRzIGZyb20gYSBkYXRlIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBkYXRlX2FfMl9pKHM6IHN0cmluZ1tdLCBsZW46IG51bWJlciwgcG9zOiBudW1iZXIpOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBkYXRlX2FfMl9pKHM6IHN0cmluZywgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyO1xyXG4gIHByaXZhdGUgZGF0ZV9hXzJfaShzOiBhbnksIGxlbjogbnVtYmVyLCBwb3M6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiAocyA9PT0gbnVsbCB8fCBzIGluc3RhbmNlb2YgQXJyYXkpICYmIChsZW4gPT09IG51bGwgfHwgbGVuLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmIChwb3MgPT09IG51bGwgfHwgcG9zLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGVfYV8yX2lfMChzLCBsZW4sIHBvcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRlX2FfMl9pXzEocywgbGVuLCBwb3MpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIERlY29kZSBkaWdpdHMgZnJvbSBhIGRhdGUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGRhdGVfYV8yX2lfMChzOiBzdHJpbmdbXSwgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPihsZW4pO1xyXG4gICAgbGV0IG1nTnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGFycmF5W2ldID0gc1twb3MgKyBpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZ051bS5hXzJfbG9uZyhOU3RyaW5nLkZyb21DaGFycyhhcnJheSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1vdmluZyBwYXJ0IG9mIHRoZSBkYXRlIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBtb3ZlX2RhdGUoc3RyOiBzdHJpbmdbXSwgcG9zOiBudW1iZXIsIG1vdmVieTogbnVtYmVyLCBsZW46IG51bWJlcik6IHZvaWQ7XHJcbiAgcHJpdmF0ZSBtb3ZlX2RhdGUoc3RyOiBzdHJpbmcsIHBvczogbnVtYmVyLCBtb3ZlYnk6IG51bWJlciwgbGVuOiBudW1iZXIpOiB2b2lkO1xyXG4gIHByaXZhdGUgbW92ZV9kYXRlKHN0cjogYW55LCBwb3M6IG51bWJlciwgbW92ZWJ5OiBudW1iZXIsIGxlbjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiAoc3RyID09PSBudWxsIHx8IHN0ciBpbnN0YW5jZW9mIEFycmF5KSAmJiAocG9zID09PSBudWxsIHx8IHBvcy5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAobW92ZWJ5ID09PSBudWxsIHx8IG1vdmVieS5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAobGVuID09PSBudWxsIHx8IGxlbi5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICB0aGlzLm1vdmVfZGF0ZV8wKHN0ciwgcG9zLCBtb3ZlYnksIGxlbik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubW92ZV9kYXRlXzEoc3RyLCBwb3MsIG1vdmVieSwgbGVuKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZpbmcgcGFydCBvZiB0aGUgZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgbW92ZV9kYXRlXzAoc3RyOiBzdHJpbmdbXSwgcG9zOiBudW1iZXIsIG1vdmVieTogbnVtYmVyLCBsZW46IG51bWJlcik6IHZvaWQge1xyXG4gICAgTWVtb3J5VXRpbC5jaGFyX21lbW1vdmUoc3RyLCBwb3MgKyBtb3ZlYnksIHN0ciwgcG9zLCBsZW4gLSAocG9zICsgbW92ZWJ5KSArIDEpO1xyXG4gICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChzdHIsIHBvcywgJzAnLCAvKicwJyovbW92ZWJ5KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUcmFuc2xhdGUgYSBtb250aCBuYW1lIC0+IG1vbnRoIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0cmluZ1wiPnRvIGV2YWx1YXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWN0dXJlXCI+bWFza1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicG9zXCI+Y3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nIHRoZSBpbnRSZWYgbm90IGV4YWN0bHkgdGhlIHNhbWUgcmVmZXJlbmNlIHRvIGludGVnZXIgLCBsaWtlIGluIEMrKyxcclxuICAvLy8gICBzbyB0aGUgZ2xvYmFsIHBvcyBNVVNUIGJlIHVwZGF0ZWQgYnkgdGhlIHBvcy52YWx1ZSBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJucy5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGRhdGVfTU1NXzJfbShzdHI6IHN0cmluZ1tdLCBtYXNrOiBzdHJpbmdbXSwgcG9zOiBJbnRSZWYsIGxlbjogbnVtYmVyLCBpc0hlYnJldzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgbDogbnVtYmVyO1xyXG5cclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgbGV0IG1hc2tQb3M6IG51bWJlciA9IFV0aWxTdHJCeXRlTW9kZS5jb252UG9zKE5TdHJpbmcuRnJvbUNoYXJzKHN0ciksIE5TdHJpbmcuRnJvbUNoYXJzKG1hc2spLCBwb3MudmFsLCBmYWxzZSk7XHJcbiAgICAgIGwgPSB0aGlzLmRhdGVfbXNrX2NudChtYXNrLCBtYXNrUG9zLCA8bnVtYmVyPihsZW4gLSBtYXNrUG9zKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbCA9IHRoaXMuZGF0ZV9tc2tfY250KG1hc2ssIHBvcy52YWwsIDxudW1iZXI+KGxlbiAtIHBvcy52YWwpKTtcclxuICAgIH1cclxuICAgIGxldCBzdHJQb3M6IG51bWJlciA9IHBvcy52YWw7XHJcbiAgICBwb3MudmFsID0gcG9zLnZhbCArIGw7XHJcbiAgICBsZW4gPSBNZW1vcnlVdGlsLm1lbV90cmltKHN0ciwgc3RyUG9zLCBsKTtcclxuXHJcbiAgICBpZiAobGVuID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBzdHJCOiBzdHJpbmcgPSBOU3RyaW5nLkZyb21DaGFycyhzdHIsIHN0clBvcywgbGVuKTtcclxuICAgICAgbGV0IG1vbnRoTmFtZXM6IHN0cmluZ1tdO1xyXG4gICAgICBpZiAoaXNIZWJyZXcpIHtcclxuICAgICAgICBtb250aE5hbWVzID0gSGVicmV3RGF0ZS5HZXRMb2NhbE1vbnRocygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBtb250aHM6IHN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKE1zZ0ludGVyZmFjZS5NT05USFNfUFRSKTtcclxuICAgICAgICBtb250aE5hbWVzID0gRGF0ZVV0aWwuZ2V0TG9jYWxNb250aHMobW9udGhzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IG1vbnRoTmFtZXMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAoTlN0cmluZy5Db21wYXJlKG1vbnRoTmFtZXNbaV0uc3Vic3RyKDAsIGxlbiksIHN0ckIsIHRydWUpID09PSAwKVxyXG4gICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgY3VycmV0IGRheWUgc2VwZXJhdGVkIHRvIHllYXIsIG1vbnRoLCBkYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGRhdGVfc3lzKCk6IERhdGVCcmVha1BhcmFtcyB7XHJcbiAgICBsZXQgZGF0ZTogRGF0ZUJyZWFrUGFyYW1zID0gbmV3IERhdGVCcmVha1BhcmFtcygpO1xyXG4gICAgbGV0IEN1cnJEYXRlOiBEYXRlVGltZSA9IERhdGVUaW1lLk5vdztcclxuXHJcbiAgICBkYXRlLnllYXIgPSBDdXJyRGF0ZS5ZZWFyO1xyXG4gICAgZGF0ZS5tb250aCA9IEN1cnJEYXRlLk1vbnRoO1xyXG4gICAgZGF0ZS5kYXkgPSBDdXJyRGF0ZS5EYXk7XHJcblxyXG4gICAgcmV0dXJuIGRhdGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdG8gZ2V0IGN1cnJlbnQgZGF0ZSBpbiBtYWdpYyByZXByZXNlbnRhdGlvbiBRdWVyeSBNYWdpYydzIERhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlICdNYWdpYycgY3VycmVudCBkYXRlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBkYXRlX21hZ2ljKHV0Y0RhdGU6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IGRhdGVUaW1lOiBEYXRlVGltZTtcclxuICAgIGlmICh1dGNEYXRlKSB7XHJcbiAgICAgIGRhdGVUaW1lID0gRGF0ZVRpbWUuVXRjTm93O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGRhdGVUaW1lID0gRGF0ZVRpbWUuTm93O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB5ZWFyOiBudW1iZXIgPSBkYXRlVGltZS5ZZWFyO1xyXG4gICAgbGV0IG1vbnRoOiBudW1iZXIgPSBkYXRlVGltZS5Nb250aDtcclxuICAgIGxldCBkYXk6IG51bWJlciA9IGRhdGVUaW1lLkRheTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kYXRlXzRfY2FsZW5kZXIoeWVhciwgbW9udGgsIGRheSwgMSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRvIGdldCAgdGhlIHN5c3RlbSB0aW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSAnTWFnaWMnIGN1cnJlbnQgdGltZVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgdGltZV9tYWdpYyh1dGNUaW1lOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBEYXRlVGltZS5HZXRUb3RhbFNlY29uZHNGcm9tTWlkbmlnaHQodXRjVGltZSwgbmV3IERhdGUoKSk7XHJcbiAgfVxyXG5cclxuICBtdGltZV9tYWdpYyh1dGNUaW1lOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBEYXRlVGltZS5HZXRUb3RhbE1pbGxpU2Vjb25kc0Zyb21NaWRuaWdodCh1dGNUaW1lLCBuZXcgRGF0ZSgpKSA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcHV0ZSBNQUdJQyBkYXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBkYXRlXzRfY2FsZW5kZXIoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlciwgZG95OiBudW1iZXIsIHVzZWRveTogYm9vbGVhbik6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IExlYXBZZWFyOiBib29sZWFuID0geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XHJcblxyXG4gICAgLy8gMy4xMS45NyAtIEhlbiAoRml4ZWQgYnVnICM3NjQyNjUgYW5kICM4MTg2KSA6XHJcbiAgICAvLyBJZiB0aGUgZGF0ZSBpcyAwIHRoZW4gcmV0dXJuIDBMICh6ZXJvIHZhbHVlIGlzIHZhbGlkKSwgZWxzZSBpZiB0aGUgZGF0ZVxyXG4gICAgLy8gaXMgaWxsZWdhbCB0aGVuIHJldHVybiAxMDAwMDAwMDAwTCAod3JvbmcgZGF0ZSkuXHJcbiAgICBpZiAodXNlZG95KSB7XHJcbiAgICAgIGlmIChkb3kgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZG95ID4gMzY2IHx8ICghTGVhcFllYXIgJiYgZG95ID4gMzY1KSkge1xyXG4gICAgICAgIHJldHVybiAoMTAwMDAwMDAwMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoZGF5ID09PSAwICYmIG1vbnRoID09PSAwICYmIHllYXIgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGF5ID09PSAwIHx8IG1vbnRoID09PSAwIHx8IHllYXIgPT09IDAgfHwgbW9udGggPiAxMikge1xyXG4gICAgICAgIHJldHVybiAxMDAwMDAwMDAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB5ZWFyID0geWVhciAtIDE7XHJcbiAgICBsZXQgbnVtOiBudW1iZXIgPSBNYXRoLmZsb29yKHllYXIgLyA0MDApO1xyXG4gICAgeWVhciA9IHllYXIgLSBudW0gKiA0MDA7XHJcbiAgICBsZXQgbnVtMjogbnVtYmVyID0gTWF0aC5mbG9vcih5ZWFyIC8gMTAwKTtcclxuICAgIHllYXIgPSB5ZWFyIC0gbnVtMiAqIDEwMDtcclxuICAgIGxldCBudW0zOiBudW1iZXIgPSBNYXRoLmZsb29yKHllYXIgLyA0KTtcclxuICAgIHllYXIgPSB5ZWFyIC0gbnVtMyAqIDQ7XHJcblxyXG4gICAgaWYgKCF1c2Vkb3kpIHtcclxuICAgICAgbGV0IG51bTQ6IG51bWJlciA9IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbbW9udGggLSAxXTtcclxuICAgICAgbGV0IG51bTU6IG51bWJlciA9IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbbW9udGhdO1xyXG5cclxuICAgICAgaWYgKExlYXBZZWFyKSB7XHJcbiAgICAgICAgaWYgKG1vbnRoID4gMSkge1xyXG4gICAgICAgICAgbnVtNSA9IG51bTUgKyAxO1xyXG4gICAgICAgICAgaWYgKG1vbnRoID4gMikge1xyXG4gICAgICAgICAgICBudW00ID0gbnVtNCArIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGF5ID4gbnVtNSAtIG51bTQpIHtcclxuICAgICAgICByZXR1cm4gMTAwMDAwMDAwMDtcclxuICAgICAgfVxyXG4gICAgICBkb3kgPSBudW00ICsgZGF5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bSAqIDE0NjA5NyArIG51bTIgKiAzNjUyNCArIG51bTMgKiAxNDYxICsgeWVhciAqIDM2NSArIGRveTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUcmFuc2xhdGVzIGEgc3RyaW5nIHRpbWUgdG8gbWFnaWMgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPiAgIEEgc3RyaW5nIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICAgIFRoZSBwaWN0dXJlIHRvIHVzZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbWFnaWMgbnVtYmVyPC9yZXR1cm5zPlxyXG4gIGZyb21OYXRpdmVUaW1lVG9NZ1RpbWUoZGlzcFZhbHVlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBudW1WYWw6IG51bWJlciA9IHRoaXMuZnJvbU5hdGl2ZVRpbWVUb01nVGltZU51bWJlcihkaXNwVmFsdWUpO1xyXG4gICAgbWdOdW0uTlVNXzRfTE9ORyhudW1WYWwpO1xyXG4gICAgcmV0dXJuIG1nTnVtLnRvWE1McmVjb3JkKCk7XHJcbiAgfVxyXG5cclxuICBmcm9tTmF0aXZlVGltZVRvTWdUaW1lTnVtYmVyKGRpc3BWYWx1ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXIgPSB0aGlzLnRpbWVfMl9pbnQoZGlzcFZhbHVlLmdldEhvdXJzKCksIGRpc3BWYWx1ZS5nZXRNaW51dGVzKCksIGRpc3BWYWx1ZS5nZXRTZWNvbmRzKCkpO1xyXG4gICAgcmV0dXJuIG51bVZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IEFscGhhIGludG8gYSBUaW1lIGFjY29yZGluZyB0byBhIGdpdmVuIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFfMl90aW1lKEFzY2lpOiBzdHJpbmcsIHBpYzogUElDLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBudW1iZXI7XHJcbiAgYV8yX3RpbWUoQXNjaWk6IHN0cmluZywgQXNjaWlMOiBudW1iZXIsIG1hc2s6IHN0cmluZ1tdLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBudW1iZXI7XHJcbiAgYV8yX3RpbWUoQXNjaWk6IGFueSwgcGljT3JBc2NpaUw6IGFueSwgbWlsbGlTZWNvbmRzT3JNYXNrOiBhbnksIG1pbGxpU2Vjb25kcz86IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpXHJcbiAgICAgIHJldHVybiB0aGlzLmFfMl90aW1lXzAoQXNjaWksIHBpY09yQXNjaWlMLCBtaWxsaVNlY29uZHNPck1hc2spO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmFfMl90aW1lXzEoQXNjaWksIHBpY09yQXNjaWlMLCBtaWxsaVNlY29uZHNPck1hc2ssIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBBbHBoYSBpbnRvIGEgVGltZSBhY2NvcmRpbmcgdG8gYSBnaXZlbiBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFfMl90aW1lXzAoQXNjaWk6IHN0cmluZywgcGljOiBQSUMsIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5hXzJfdGltZShBc2NpaSwgQXNjaWkubGVuZ3RoLCBOU3RyaW5nLlRvQ2hhckFycmF5KHBpYy5nZXRNYXNrKCkpLCBtaWxsaVNlY29uZHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbnZlcnQgQWxwaGEgaW50byBhIFRpbWUgYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhXzJfdGltZV8xKEFzY2lpOiBzdHJpbmcsIEFzY2lpTDogbnVtYmVyLCBtYXNrOiBzdHJpbmdbXSwgbWlsbGlTZWNvbmRzOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBJOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gbWFzay5sZW5ndGg7IC8vIExlbmd0aCBvZiBtYXNrIG9yIHN0cmluZyB0byBzY2FuXHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBjb3VudGVycyBhbmQgZmxhZ3NcclxuICAgIGlmIChsZW4gPiBBc2NpaUwpIHtcclxuICAgICAgbGVuID0gQXNjaWlMO1xyXG4gICAgfVxyXG4gICAgbGV0IGFtcG06IG51bWJlciA9IDA7IC8vIEFNL1BNIGluZGljYXRvclxyXG4gICAgbGV0IGhvdXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWludXRlOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHNlY29uZDogbnVtYmVyID0gMDtcclxuICAgIGxldCBtaWxsaXNlY29uZDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB3aGlsZSAoSSA8IGxlbikge1xyXG4gICAgICBsZXQgbWFza0xlbmd0aDogbnVtYmVyO1xyXG4gICAgICBsZXQgbWF4TWFza0xlbjogbnVtYmVyO1xyXG5cclxuICAgICAgLy8gVG8gZ2V0IHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aCBvZiB0aGUgY29uc3RhbnRzIGluIHRoZSBtYXNrXHJcbiAgICAgIHN3aXRjaCAobWFza1tJXS5jaGFyQ29kZUF0KDApKSB7XHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ISCk6XHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOlxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfU1MpOlxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfUE0pOlxyXG4gICAgICAgICAgbWF4TWFza0xlbiA9IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6XHJcbiAgICAgICAgICBtYXhNYXNrTGVuID0gMztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgbWF4TWFza0xlbiA9IDE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLyogVG8gZ2V0IHRoZSBtaW5pbXVtIG9mIG1heE1hc2tMZW4gJiBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1haW5lZCBpbiBzdHJpbmdcclxuICAgICAgYmVjYXVzZSBpZiB0aGUgQXNjaWkgaXMgc2hvcnRlcihoYXMgbGVzcyBjaGFyYWN0ZXJzKXRoZW4gY3JlYXRlIFN0cmluZyBvbmx5XHJcbiAgICAgIG9mIHRoYXQgbm8uIG9mIGNoYXJhY3RlcnMgKG1hc2tMZW5ndGgpLCBub3Qgb2YgbWF4TWFza0xlbmd0aCAqL1xyXG4gICAgICBtYXNrTGVuZ3RoID0gTWF0aC5taW4obWF4TWFza0xlbiwgbGVuIC0gSSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKG1hc2tbSV0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSEgpOiB7XHJcbiAgICAgICAgICBob3VyID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOiB7XHJcbiAgICAgICAgICBtaW51dGUgPSBtZ051bS5hXzJfbG9uZyhBc2NpaS5zdWJzdHIoSSwgbWFza0xlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1NTKToge1xyXG4gICAgICAgICAgc2Vjb25kID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6IHtcclxuICAgICAgICAgIG1pbGxpc2Vjb25kID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19QTSk6XHJcbiAgICAgICAgICBhbXBtID0gMDtcclxuICAgICAgICAgIGxldCBjMDogc3RyaW5nID0gQXNjaWlbSV07XHJcbiAgICAgICAgICBsZXQgYzE6IHN0cmluZztcclxuICAgICAgICAgIGMwID0gYzAudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgIGlmIChJICsgMSA8IGxlbikge1xyXG4gICAgICAgICAgICBjMSA9IEFzY2lpW0kgKyAxXTtcclxuICAgICAgICAgICAgYzEgPSBjMS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGMxID09PSAnTScpIHtcclxuICAgICAgICAgICAgICBpZiAoYzAgPT09ICdBJylcclxuICAgICAgICAgICAgICAgIGFtcG0gPSAtMTtcclxuICAgICAgICAgICAgICBpZiAoYzAgPT09ICdQJylcclxuICAgICAgICAgICAgICAgIGFtcG0gPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIEkgKz0gbWFza0xlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayB2YWxpZGl0eSBvZiBtaW51dGVzIGFuZCBzZWNvbmRzXHJcbiAgICBpZiAoc2Vjb25kID4gNTkgfHwgbWludXRlID4gNTkpXHJcbiAgICAgIHJldHVybiAoMCk7XHJcblxyXG4gICAgLy8gQ29udmVydCBob3VyIHRvIFBNIGlmIHNwZWNpZmllZCBhcyBBTVxyXG4gICAgaWYgKGFtcG0gIT09IDApXHJcbiAgICAgIGlmIChhbXBtID09PSAtMSlcclxuICAgICAgLy8gQU1cclxuICAgICAge1xyXG4gICAgICAgIGlmIChob3VyID09PSAxMilcclxuICAgICAgICAgIGhvdXIgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGhvdXIgPCAxMilcclxuICAgICAgLy8gUE1cclxuICAgICAgICBob3VyICs9IDEyO1xyXG4gICAgaWYgKG1pbGxpU2Vjb25kcylcclxuICAgICAgcmV0dXJuIHRoaXMudGltZV8yX2ludChob3VyLCBtaW51dGUsIHNlY29uZCkgKiAxMDAwICsgbWlsbGlzZWNvbmQ7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLnRpbWVfMl9pbnQoaG91ciwgbWludXRlLCBzZWNvbmQpO1xyXG4gIH1cclxuXHJcbiAgdGltZV8yX2ludChob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyLCBzZWNvbmQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gaG91ciAqIDM2MDAgKyBtaW51dGUgKiA2MCArIHNlY29uZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IFwiMFwiL1wiMVwiIHRvIGZhbHNlL3RydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYm9vbFN0clwiPiAgXCIwXCIvXCIxXCJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgXCIxXCIgb3IgZmFsc2UgaWYgb3RoZXJzXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgdG9Cb29sZWFuKGJvb2xTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGJvb2xTdHIgIT09IG51bGwgJiYgYm9vbFN0ciA9PT0gXCIxXCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU3RyaW5nIHRvIERhdGUgZnVuY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFfMl9kYXRlKHN0cjogc3RyaW5nLCBGb3JtYXQ6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmFfMl9kYXRlX2RhdGVtb2RlKHN0ciwgRm9ybWF0LCBjb21wSWR4KTtcclxuICB9XHJcblxyXG4gIGFfMl9kYXRlX3BpYyhzdHI6IHN0cmluZywgcGljOiBQSUMsIG1hc2s6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChzdHIgPT09IG51bGwpIHtcclxuICAgICAgc3RyID0gXCJcIjtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmFfMl9kYXRlX3BpY19kYXRlbW9kZShOU3RyaW5nLlRvQ2hhckFycmF5KHN0ciksIHN0ci5sZW5ndGgsIHBpYywgTlN0cmluZy5Ub0NoYXJBcnJheShtYXNrKSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICB0b19hKG91dFZhbDogc3RyaW5nLCBvdXRfbGVuOiBudW1iZXIsIGRhdGU6IG51bWJlciwgRm9ybWF0OiBzdHJpbmcsIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b19hX2RhdGVtb2RlKG91dFZhbCwgb3V0X2xlbiwgZGF0ZSwgRm9ybWF0LCBmYWxzZSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBzdHJpbmcgLT4gZGF0ZSB1c2luZyBhIGZvcm1hdCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYV8yX2RhdGVfZGF0ZW1vZGUoc3RyOiBzdHJpbmcsIEZvcm1hdDogc3RyaW5nLCBjb21wSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHBJQzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuREFURSwgY29tcElkeCk7XHJcbiAgICBpZiAoc3RyID09PSBudWxsKSB7XHJcbiAgICAgIHN0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5hXzJfZGF0ZV9waWNfZGF0ZW1vZGUoTlN0cmluZy5Ub0NoYXJBcnJheShzdHIpLCBzdHIubGVuZ3RoLCBwSUMsIE5TdHJpbmcuVG9DaGFyQXJyYXkocElDLmdldE1hc2soKSksIGNvbXBJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFN0cmluZyB0byBhIGRhdGVtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHRvX2FfZGF0ZW1vZGUob3V0VmFsOiBzdHJpbmcsIG91dF9sZW46IG51bWJlciwgZGF0ZTogbnVtYmVyLCBGb3JtYXQ6IHN0cmluZywgaWdub3JlX2R0X2ZtdDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuXHJcbiAgICAvLyBQYXJzZSB0aGUgcGljdHVyZVxyXG4gICAgbGV0IHBpYzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuREFURSwgY29tcElkeCk7XHJcblxyXG4gICAgLy8gQ29udmVydCB0aGUgIGRhdGUgLT4gc3RyaW5nXHJcbiAgICBpZiAob3V0VmFsID09PSBudWxsKSB7XHJcbiAgICAgIG91dFZhbCA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50b19hX3BpY19kYXRlbW9kZShvdXRWYWwsIG91dF9sZW4sIGRhdGUsIHBpYywgdHJ1ZSwgaWdub3JlX2R0X2ZtdCwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRGVjb2RlIGRpZ2l0cyBmcm9tIGEgZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZGF0ZV9hXzJfaV8xKHM6IHN0cmluZywgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyIHtcclxuXHJcbiAgICAvLyBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZSAncG9zKz1sZW4nIGFmdGVyIHRoZSB1c2luZyBvZiB0aGUgZnVuY3Rpb25cclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBzdHI6IHN0cmluZztcclxuXHJcbiAgICBzdHIgPSBzLnN1YnN0cihwb3MsIGxlbik7XHJcbiAgICByZXR1cm4gbWdOdW0uYV8yX2xvbmcoc3RyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbW92ZV9kYXRlXzEoc3RyOiBzdHJpbmcsIHBvczogbnVtYmVyLCBtb3ZlYnk6IG51bWJlciwgbGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgc3RyID0gU3RyVXRpbC5tZW1tb3ZlKHN0ciwgcG9zICsgbW92ZWJ5LCBzdHIsIHBvcywgbGVuIC0gcG9zKTtcclxuXHJcbiAgICBzdHIgPSBTdHJVdGlsLm1lbXNldChzdHIsIHBvcywgJzAnLCBtb3ZlYnkpO1xyXG4gICAgcmV0dXJuIHN0cjtcclxuICB9XHJcblxyXG4gIHRpbWVfMl9hKEFzY2lpOiBzdHJpbmcsIEFzY2lpTDogbnVtYmVyLCB0aW1lOiBudW1iZXIsIEZvcm1hdDogc3RyaW5nLCBjb21wSWR4OiBudW1iZXIsIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IHN0cmluZyB7XHJcblxyXG4gICAgaWYgKFN0clV0aWwucnRyaW0oRm9ybWF0KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgRm9ybWF0ID0gXCJISDpNTTpTU1wiO1xyXG4gICAgfVxyXG4gICAgbGV0IHBpYzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSwgY29tcElkeCk7XHJcbiAgICBpZiAoQXNjaWkgPT09IG51bGwpIHtcclxuICAgICAgQXNjaWkgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudGltZV8yX2FfcGljKEFzY2lpLCBBc2NpaUwsIHRpbWUsIHBpYywgZmFsc2UsIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJhbnNsYXRlcyBhIHN0cmluZyB0byBtYWdpYyBsb2dpY2FsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPiAgIEEgc3RyaW5nIHZhbHVlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgICAgICBUaGUgcGljdHVyZSB0byB1c2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+ICAgIFRoZSByYW5nZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxvZ2ljYWwgdmFsdWVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHRvTG9naWNhbChkaXNwVmFsdWU6IHN0cmluZywgcGljOiBQSUMsIHJhbmdlU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgZGlzcFZhbHVlID0gZGlzcFZhbHVlLnRyaW0oKTtcclxuICAgIGlmIChkaXNwVmFsdWUgPT09IG51bGwgfHwgZGlzcFZhbHVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBkaXNwVmFsdWUgPSBcIkZhbHNlXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwXzJfbG9naWNhbChkaXNwVmFsdWUsIHBpYy5nZXRNYXNrKCksIHJhbmdlU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgdGhlIGRpc3BsYXllZCB2YWx1ZSB0byBhIG1hZ2ljIGxvZ2ljYWwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcFZhbHVlXCI+dGhlIGRpc3BsYXllZCB2YWx1ZSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWFza1wiPnRoZSBtYXNrIG9mIHRoZSBkaXNwbGF5ZWQgdmFsdWUgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+dGhlIHJhbmdlIHN0cmluZyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgZGlzcF8yX2xvZ2ljYWwoZGlzcFZhbHVlOiBzdHJpbmcsIG1hc2s6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHN0cmlwcGVkVmFsdWU6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihkaXNwVmFsdWUubGVuZ3RoKTtcclxuXHJcbiAgICByYW5nZVN0ciA9IHRoaXMud2luX3JuZ19ib29sKHJhbmdlU3RyKTtcclxuICAgIHJhbmdlU3RyID0gU3RyVXRpbC5tYWtlUHJpbnRhYmxlVG9rZW5zKHJhbmdlU3RyLCBTRVFfMl9IVE1MKTtcclxuICAgIGxldCBpOiBudW1iZXIgPSByYW5nZVN0ci5pbmRleE9mKCcsJyk7XHJcbiAgICBsZXQgdHJ1ZVN0cjogc3RyaW5nID0gcmFuZ2VTdHIuc3Vic3RyKDAsIGkpO1xyXG4gICAgdHJ1ZVN0ciA9IFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vucyh0cnVlU3RyLCBIVE1MXzJfU1RSKTtcclxuICAgIGkgPSAwO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBkaXNwVmFsdWUubGVuZ3RoICYmIGkgPCBtYXNrLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChtYXNrLmNoYXJDb2RlQXQoaSkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCkge1xyXG4gICAgICAgIHN0cmlwcGVkVmFsdWUuQXBwZW5kKGRpc3BWYWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsOiBzdHJpbmcgPSBzdHJpcHBlZFZhbHVlLlRvU3RyaW5nKCk7XHJcbiAgICBpZiAodHJ1ZVN0ci5sZW5ndGggPCB2YWwubGVuZ3RoKSB7XHJcbiAgICAgIHZhbCA9IHZhbC5zdWJzdHIoMCwgdHJ1ZVN0ci5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh2YWwubGVuZ3RoIDwgdHJ1ZVN0ci5sZW5ndGgpIHtcclxuICAgICAgICB0cnVlU3RyID0gdHJ1ZVN0ci5zdWJzdHIoMCwgdmFsLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAodmFsLnRvVXBwZXJDYXNlKCkgPT09IHRydWVTdHIudG9VcHBlckNhc2UoKSkgPyBcIjFcIiA6IFwiMFwiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbnZlcnRpbmcgdGhlIGRpc3BsYXllZCB2YWx1ZSBvZiBhIHN0cmluZyB0byBpbnRlcm5hbFxyXG4gIC8vLyAgIHJlcHJlc2VudGF0aW9uIG11c3QgcmVtb3ZlIHRoZSBtYXNraW5nIGNoYXJhY3RlcnMgZnJvbSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSB0b0FscGhhKGRpc3BWYWx1ZTogc3RyaW5nLCBwaWM6IFBJQyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHBpY3R1cmU6IHN0cmluZyA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIocGljLmdldE1hc2tTaXplKCkpO1xyXG4gICAgbGV0IElzQWxwaGFEQkNTOiBib29sZWFuID0gVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBwaWMuaXNBdHRyQWxwaGEoKTtcclxuICAgIGxldCBjdXJyUGljdHVyZTogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IGN1cnJQaWN0dXJlID0gMDtcclxuXHJcbiAgICBmb3IgKGN1cnJQaWN0dXJlID0gaSA9IDA7IGkgPCBkaXNwVmFsdWUubGVuZ3RoICYmIGN1cnJQaWN0dXJlIDwgcGljdHVyZS5sZW5ndGg7IGkrKywgY3VyclBpY3R1cmUrKykge1xyXG4gICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZShwaWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpKSB7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChkaXNwVmFsdWUuY2hhckF0KGkpKTtcclxuXHJcbiAgICAgICAgaWYgKElzQWxwaGFEQkNTKSB7XHJcbiAgICAgICAgICAvLyBhIERCQ1MgY2hhcmFjdGVyIGluIFwiZGlzcFZhbHVlXCIgY29uc3VtZXMgdHdvIGNoYXJhY3RlcnMgaW4gXCJwaWN0dXJlXCJcclxuICAgICAgICAgIGxldCBzdHJEc3BWYWxPbmVDaGFyOiBzdHJpbmcgPSBkaXNwVmFsdWUuc3Vic3RyKGksIDEpO1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0ckRzcFZhbE9uZUNoYXIpID09PSAyKSB7XHJcbiAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgY2hhciBBbHBoYSBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBzdGF0aWMgaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19VIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0wgfHxcclxuICAgICAgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0cgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfUyB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19UKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcGFyYXRpdmUgbmV3VmFsdWUgd2l0aCBwb3NzaWJsZSBSYW5nZSBpbiBDb250aW51b3VzUmFuZ2VWYWx1ZXMvZGlzY3JldGVSYW5nZVZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXdWYWx1ZSBpZiBpdCBwb3NzaWJsZSwgb2xkIHZhbHVlIG93ZXJ2aXNlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGZpbGxBbHBoYUJ5UmFuZ2UoQ29udGludW91c1JhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4sIGRpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHRtcEJ1ZmZlcjogc3RyaW5nID0gdGhpcy5maWxsQWxwaGFCeURpc2NyZXRlUmFuZ2VWYWx1ZXMoZGlzY3JldGVSYW5nZVZhbHVlcywgbmV3VmFsdWUpO1xyXG4gICAgaWYgKHRtcEJ1ZmZlciAhPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdG1wQnVmZmVyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRtcEJ1ZmZlciA9IHRoaXMuZmlsbEFscGhhQnlDb250aW51b3VzUmFuZ2VWYWx1ZXMoQ29udGludW91c1JhbmdlVmFsdWVzLCBuZXdWYWx1ZSk7XHJcbiAgICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gdG1wQnVmZmVyO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChkaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0bXBCdWZmZXIgPSB0aGlzLmNvbXBsZXRlQWxwaGFCeVJhbmdlKGRpc2NyZXRlUmFuZ2VWYWx1ZXMsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHVucG9zc2libGUgdG8gZmluZCBpdCBpbiB0aGUgcmFuZ2UgcmV0dXJuIG5vdCBjaGFuZ2VkIG9sZHZhbHVlXHJcbiAgICByZXR1cm4gbmV3VmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCBBbHBoYSBzdHJpbmcgYnkgZGlzY3JldGUgcmFuZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzY3JldGVSYW5nZVZhbHVlc1wiPnZlY3RvciBvZiBkaXNjcmV0ZSByYW5nZSB2YWx1ZXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+dmFsdWUsIHRyeSBmb3VuZCBpbiB0aGUgdmVjdG9yIG9mIGRpc2NyZXRlIHJhbmdlc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZm91bmQgdmFsdWUgb3IgbnVsbChub3QgZm91bmQpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBmaWxsQWxwaGFCeURpc2NyZXRlUmFuZ2VWYWx1ZXMoZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBuZXdWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmIChkaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkaXNjcmV0ZVJhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGRpc2NyZXRlVmFsdWU6IHN0cmluZyA9IGRpc2NyZXRlUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgbGV0IHRydW5jYXRlZFZhbHVlOiBzdHJpbmcgPSBkaXNjcmV0ZVZhbHVlLnN1YnN0cigwLCBNYXRoLm1pbihuZXdWYWx1ZS5sZW5ndGgsIGRpc2NyZXRlVmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgaWYgKG5ld1ZhbHVlLnRvVXBwZXJDYXNlKCkgPT09IHRydW5jYXRlZFZhbHVlLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgIHJldHVybiBkaXNjcmV0ZVZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCBBbHBoYSBzdHJpbmcgYnkgY29udGludW91cyByYW5nZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJDb250aW51b3VzUmFuZ2VWYWx1ZXNcIj52ZWN0b3Igb2YgY29udGludW91cyByYW5nZSB2YWx1ZXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+dmFsdWUsIHRyeSBmb3VuZCBpbiB0aGUgdmVjdG9yIG9mIGNvbnRpbnVvdXMgcmFuZ2VzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBmb3VuZCB2YWx1ZSBvciBudWxsKG5vdCBmb3VuZClcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGZpbGxBbHBoYUJ5Q29udGludW91c1JhbmdlVmFsdWVzKENvbnRpbnVvdXNSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBuZXdWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIG5ld1ZhbHVlID0gU3RyVXRpbC5ydHJpbShuZXdWYWx1ZSk7XHJcblxyXG5cclxuICAgIGlmIChDb250aW51b3VzUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBmcm9tOiBzdHJpbmcgPSBDb250aW51b3VzUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgbGV0IHRvOiBzdHJpbmcgPSBDb250aW51b3VzUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSA9IGkgKyAxKTtcclxuICAgICAgICBpZiAoTlN0cmluZy5Db21wYXJlT3JkaW5hbChuZXdWYWx1ZSwgZnJvbSkgPj0gMCAmJiBOU3RyaW5nLkNvbXBhcmVPcmRpbmFsKG5ld1ZhbHVlLCB0bykgPD0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyeSB0byBjb21wbGV0ZSB0aGUgbmV3VmFsdWUgdXNpbmcgdGhlIFJhbmdlXHJcbiAgLy8vICAgZmlyc3QgdHJ5IHRvIGNvbWxldGUgdGhlIHZhbHVlIGZvciBjYXNlIG1lYW5pbmcgYW5kIGFmdGVyIHRoYXQgZm9yIGlnbm9yZSBjYXNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZlY3RvclwiPm9mIHJhbmdlc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hlY2tlZFwiPnZhbHVlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB2YWx1ZSBjb21wbGV0ZWQgYnkgcmFuZ2VcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGNvbXBsZXRlQWxwaGFCeVJhbmdlKGRpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IG1heENvaW5jaWRlOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KDIpO1xyXG4gICAgZm9yIChsZXQgX2FpOiBudW1iZXIgPSAwOyBfYWkgPCBtYXhDb2luY2lkZS5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICBtYXhDb2luY2lkZVtfYWldID0gMDtcclxuXHJcbiAgICBsZXQgYmVzdEl0ZW06IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMik7XHJcbiAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IGJlc3RJdGVtLmxlbmd0aDsgKytfYWkpXHJcbiAgICAgIGJlc3RJdGVtW19haV0gPSBudWxsO1xyXG5cclxuICAgIGxldCBDSEVDS19DQVNFOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IElHTk9SRV9DQVNFOiBudW1iZXIgPSAxO1xyXG5cclxuICAgIGxldCBjYXNlTGV0dGVyczogbnVtYmVyID0gQ0hFQ0tfQ0FTRTtcclxuXHJcbiAgICB3aGlsZSAoY2FzZUxldHRlcnMgPT09IENIRUNLX0NBU0UgfHwgY2FzZUxldHRlcnMgPT09IElHTk9SRV9DQVNFKSB7XHJcbiAgICAgIGxldCBsb3dlclZhbHVlOiBzdHJpbmc7XHJcbiAgICAgIGlmIChjYXNlTGV0dGVycyA9PT0gQ0hFQ0tfQ0FTRSkge1xyXG4gICAgICAgIGxvd2VyVmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsb3dlclZhbHVlID0gbmV3VmFsdWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgfVxyXG4gICAgICBsb3dlclZhbHVlID0gU3RyVXRpbC5ydHJpbShsb3dlclZhbHVlKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRpc2NyZXRlUmFuZ2VWYWx1ZXMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgd3JvbmdMZXR0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBsZXQgY3VyckNvaW5jaWRlOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxldCByYW5nZUl0ZW06IHN0cmluZztcclxuICAgICAgICBpZiAoY2FzZUxldHRlcnMgPT09IENIRUNLX0NBU0UpIHtcclxuICAgICAgICAgIHJhbmdlSXRlbSA9IGRpc2NyZXRlUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmFuZ2VJdGVtID0gZGlzY3JldGVSYW5nZVZhbHVlcy5nZXRfSXRlbShpKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbG93TGVuZ3RoOiBudW1iZXIgPSBsb3dlclZhbHVlLmxlbmd0aDtcclxuICAgICAgICBsZXQgcmFuZ2VMZW5ndGg6IG51bWJlciA9IHJhbmdlSXRlbS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxvd0xlbmd0aCA8IHJhbmdlTGVuZ3RoKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgbG93TGVuZ3RoOyBqID0gaiArIDEpIHtcclxuICAgICAgICAgICAgaWYgKCEobG93ZXJWYWx1ZS5jaGFyQXQoaikgPT09IHJhbmdlSXRlbS5jaGFyQXQoaikpKSB7XHJcbiAgICAgICAgICAgICAgd3JvbmdMZXR0ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJDb2luY2lkZSA9IGN1cnJDb2luY2lkZSArIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgd3JvbmdMZXR0ZXIgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN1cnJDb2luY2lkZSA+IG1heENvaW5jaWRlW2Nhc2VMZXR0ZXJzXSAmJiAhd3JvbmdMZXR0ZXIpIHtcclxuICAgICAgICAgIGJlc3RJdGVtW2Nhc2VMZXR0ZXJzXSA9IGRpc2NyZXRlUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgICBtYXhDb2luY2lkZVtjYXNlTGV0dGVyc10gPSBjdXJyQ29pbmNpZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhc2VMZXR0ZXJzID0gY2FzZUxldHRlcnMgKyAxO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpZiAoYmVzdEl0ZW1bQ0hFQ0tfQ0FTRV0gIT09IG51bGwpXHJcbiAgICAgIHJldHVybiBiZXN0SXRlbVtDSEVDS19DQVNFXTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoYmVzdEl0ZW1bSUdOT1JFX0NBU0VdICE9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiBiZXN0SXRlbVtJR05PUkVfQ0FTRV07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXREYXRlQ2hhcihkYXRlQ2hhcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLkRBVEVDSEFSID0gZGF0ZUNoYXI7XHJcbiAgfVxyXG5cclxuICBnZXREYXRlQ2hhcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuREFURUNIQVI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RvcmFnZUF0dHJpYnV0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgU3RyaW5nVmFsdWVUb01nVmFsdWUodmFsdWU6IHN0cmluZywgc3RvcmFnZUF0dHJpYnV0ZTogU3RvcmFnZUF0dHJpYnV0ZSwgZmlsbGVyOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyKTogYW55IHtcclxuICAgIHN3aXRjaCAoc3RvcmFnZUF0dHJpYnV0ZSkge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOiB7XHJcbiAgICAgICAgbGV0IG5ld1ZhbDogc3RyaW5nID0gdmFsdWU7XHJcbiAgICAgICAgbmV3VmFsID0gTlN0cmluZy5QYWRSaWdodChuZXdWYWwsIGxlbmd0aCwgZmlsbGVyKTtcclxuICAgICAgICByZXR1cm4gbmV3VmFsO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBOVU1fVFlQRSh2YWx1ZSk7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBCZWluZyB1c2VkIHRvIHNlbmQgcGFyYW1ldGVycyB0byB0aGUgJ3RpbWVfYnJlYWsnIG1ldGhvZFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgVGltZUJyZWFrUGFyYW1zIHtcclxuICBob3VyOiBudW1iZXIgPSAwO1xyXG4gIG1pbnV0ZTogbnVtYmVyID0gMDtcclxuICBzZWNvbmQ6IG51bWJlciA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IoaG91cl86IG51bWJlciwgbWludXRlXzogbnVtYmVyLCBzZWNvbmRfOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKGhvdXJfPzogbnVtYmVyLCBtaW51dGVfPzogbnVtYmVyLCBzZWNvbmRfPzogbnVtYmVyKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGhvdXJfLCBtaW51dGVfLCBzZWNvbmRfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShob3VyXzogbnVtYmVyLCBtaW51dGVfOiBudW1iZXIsIHNlY29uZF86IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5ob3VyID0gaG91cl87XHJcbiAgICB0aGlzLm1pbnV0ZSA9IG1pbnV0ZV87XHJcbiAgICB0aGlzLnNlY29uZCA9IHNlY29uZF87XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIEJlaW5nIHVzZWQgdG8gc2VuZCBpbnQgYnkgUmVmXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmNsYXNzIEludFJlZiB7XHJcbiAgdmFsOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2YWxfOiBudW1iZXIpIHtcclxuICAgIHRoaXMudmFsID0gdmFsXztcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgQmVpbmcgdXNlZCB0byBzZW5kIHBhcmFtZXRlcnMgdG8gdGhlICdkYXRlX2lfMl9ubScgbWV0aG9kXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmNsYXNzIERhdGVOYW1lUGFyYW1zIHtcclxuICBvdXRWYWw6IHN0cmluZ1tdID0gbnVsbDtcclxuICBsZW46IG51bWJlciA9IDA7XHJcbiAgb3V0SWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvdXRfOiBzdHJpbmdbXSwgb3V0SWR4XzogbnVtYmVyLCBsZW5fOiBudW1iZXIpIHtcclxuICAgIHRoaXMub3V0VmFsID0gb3V0XztcclxuICAgIHRoaXMub3V0SWR4ID0gb3V0SWR4XztcclxuICAgIHRoaXMubGVuID0gbGVuXztcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgQmVpbmcgdXNlZCB0byBzZW5kIHBhcmFtZXRlcnMgdG8gdGhlICdkYXRlX2JyZWFrX2RhdGVtb2RlJyBtZXRob2RcclxuLy8vICAgaXQncyBzdHJ1Y3RcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIERhdGVCcmVha1BhcmFtcyB7XHJcbiAgZGF5OiBudW1iZXIgPSAwO1xyXG4gIGRvdzogbnVtYmVyID0gMDtcclxuICBkb3k6IG51bWJlciA9IDA7XHJcbiAgbW9udGg6IG51bWJlciA9IDA7XHJcbiAgeWVhcjogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3Rvcih5ZWFyXzogbnVtYmVyLCBtb250aF86IG51bWJlciwgZGF5XzogbnVtYmVyLCBkb3lfOiBudW1iZXIsIGRvd186IG51bWJlcik7XHJcbiAgY29uc3RydWN0b3IoeWVhcl8/OiBudW1iZXIsIG1vbnRoXz86IG51bWJlciwgZGF5Xz86IG51bWJlciwgZG95Xz86IG51bWJlciwgZG93Xz86IG51bWJlcikge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMSh5ZWFyXywgbW9udGhfLCBkYXlfLCBkb3lfLCBkb3dfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMSh5ZWFyXzogbnVtYmVyLCBtb250aF86IG51bWJlciwgZGF5XzogbnVtYmVyLCBkb3lfOiBudW1iZXIsIGRvd186IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy55ZWFyID0geWVhcl87XHJcbiAgICB0aGlzLm1vbnRoID0gbW9udGhfO1xyXG4gICAgdGhpcy5kYXkgPSBkYXlfO1xyXG4gICAgdGhpcy5kb3kgPSBkb3lfO1xyXG4gICAgdGhpcy5kb3cgPSBkb3dfO1xyXG4gIH1cclxufVxyXG4iXX0=
|