@magic-xpa/gui 4.800.0 → 4.801.0-dev000.0
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/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/{esm2015/magic-xpa-gui.js → esm2020/magic-xpa-gui.mjs} +0 -0
- package/esm2020/src/Commands.mjs +186 -0
- package/esm2020/src/Events.mjs +420 -0
- package/esm2020/src/EventsProcessor.mjs +67 -0
- package/esm2020/src/FocusManager.mjs +34 -0
- package/{esm2015/src/GuiConstants.js → esm2020/src/GuiConstants.mjs} +0 -0
- package/{esm2015/src/GuiEnums.js → esm2020/src/GuiEnums.mjs} +0 -0
- package/{esm2015/src/GuiEnvironment.js → esm2020/src/GuiEnvironment.mjs} +0 -0
- package/{esm2015/src/IFlowMonitorQueue.js → esm2020/src/IFlowMonitorQueue.mjs} +2 -1
- package/esm2020/src/Manager.mjs +192 -0
- package/{esm2015/src/UIBridge.js → esm2020/src/UIBridge.mjs} +0 -0
- package/{esm2015/src/env/IEnvironment.js → esm2020/src/env/IEnvironment.mjs} +1 -0
- package/{esm2015/src/gui/ControlBase.js → esm2020/src/gui/ControlBase.mjs} +0 -0
- package/{esm2015/src/gui/GuiMgControl.js → esm2020/src/gui/GuiMgControl.mjs} +0 -0
- package/{esm2015/src/gui/GuiMgForm.js → esm2020/src/gui/GuiMgForm.mjs} +0 -0
- package/{esm2015/src/gui/KeyboardItem.js → esm2020/src/gui/KeyboardItem.mjs} +0 -0
- package/{esm2015/src/gui/LastFocusedVal.js → esm2020/src/gui/LastFocusedVal.mjs} +0 -0
- package/{esm2015/src/gui/MgValue.js → esm2020/src/gui/MgValue.mjs} +0 -0
- package/{esm2015/src/gui/PropParentInterface.js → esm2020/src/gui/PropParentInterface.mjs} +1 -0
- package/{esm2015/src/gui/low/DialogHandler.js → esm2020/src/gui/low/DialogHandler.mjs} +0 -0
- package/{esm2015/src/gui/low/GuiCommand.js → esm2020/src/gui/low/GuiCommand.mjs} +0 -0
- package/{esm2015/src/gui/low/GuiCommandQueue.js → esm2020/src/gui/low/GuiCommandQueue.mjs} +0 -0
- package/esm2020/src/gui/low/GuiInteractive.mjs +545 -0
- package/{esm2015/src/gui/low/Style.js → esm2020/src/gui/low/Style.mjs} +0 -0
- package/{esm2015/src/management/RuntimeContextBase.js → esm2020/src/management/RuntimeContextBase.mjs} +0 -0
- package/{esm2015/src/management/data/BlobType.js → esm2020/src/management/data/BlobType.mjs} +0 -0
- package/esm2020/src/management/data/DcValues.mjs +214 -0
- package/esm2020/src/management/data/DcValuesBuilderBase.mjs +97 -0
- package/{esm2015/src/management/data/FieldDef.js → esm2020/src/management/data/FieldDef.mjs} +0 -0
- package/{esm2015/src/management/data/FieldsTable.js → esm2020/src/management/data/FieldsTable.mjs} +0 -0
- package/esm2020/src/management/data/GuiDataViewBase.mjs +90 -0
- package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
- package/{esm2015/src/management/data/IRecord.js → esm2020/src/management/data/IRecord.mjs} +1 -0
- package/{esm2015/src/management/data/IReferencedObject.js → esm2020/src/management/data/IReferencedObject.mjs} +1 -0
- package/{esm2015/src/management/data/NUM_TYPE.js → esm2020/src/management/data/NUM_TYPE.mjs} +0 -0
- package/esm2020/src/management/data/ObjectReferenceBase.mjs +48 -0
- package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
- package/esm2020/src/management/data/RecordUtils.mjs +361 -0
- package/{esm2015/src/management/data/VectorType.js → esm2020/src/management/data/VectorType.mjs} +0 -0
- package/{esm2015/src/management/data/VectorTypeBase.js → esm2020/src/management/data/VectorTypeBase.mjs} +0 -0
- package/{esm2015/src/management/events/IActionManager.js → esm2020/src/management/events/IActionManager.mjs} +1 -0
- package/esm2020/src/management/events/IGuiEventsManager.mjs +2 -0
- package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +0 -0
- package/esm2020/src/management/exp/GuiExpressionEvaluator.mjs +333 -0
- package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
- package/esm2020/src/management/gui/DisplayConvertor.mjs +1706 -0
- package/esm2020/src/management/gui/FieldValidator.mjs +1507 -0
- package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
- package/{esm2015/src/management/gui/GuiFormPropertyAdapter.js → esm2020/src/management/gui/GuiFormPropertyAdapter.mjs} +0 -0
- package/{esm2015/src/management/gui/HebrewDate.js → esm2020/src/management/gui/HebrewDate.mjs} +0 -0
- package/{esm2015/src/management/gui/Helps.js → esm2020/src/management/gui/Helps.mjs} +0 -0
- package/esm2020/src/management/gui/MgControlBase.mjs +1873 -0
- package/esm2020/src/management/gui/MgFormBase.mjs +748 -0
- package/{esm2015/src/management/gui/PIC.js → esm2020/src/management/gui/PIC.mjs} +0 -0
- package/esm2020/src/management/gui/PropDefaults.mjs +230 -0
- package/{esm2015/src/management/gui/PropInterface.js → esm2020/src/management/gui/PropInterface.mjs} +0 -0
- package/esm2020/src/management/gui/PropTable.mjs +221 -0
- package/esm2020/src/management/gui/Property.mjs +1382 -0
- package/{esm2015/src/management/gui/ValidationDetails.js → esm2020/src/management/gui/ValidationDetails.mjs} +0 -0
- package/{esm2015/src/management/gui/ValidationDetailsBase.js → esm2020/src/management/gui/ValidationDetailsBase.mjs} +0 -0
- package/{esm2015/src/management/gui/WrongFormatException.js → esm2020/src/management/gui/WrongFormatException.mjs} +0 -0
- package/{esm2015/src/management/tasks/GuiDataCollection.js → esm2020/src/management/tasks/GuiDataCollection.mjs} +0 -0
- package/esm2020/src/management/tasks/GuiTaskBase.mjs +502 -0
- package/{esm2015/src/management/tasks/IMGDataTable.js → esm2020/src/management/tasks/IMGDataTable.mjs} +1 -0
- package/{esm2015/src/management/tasks/ITask.js → esm2020/src/management/tasks/ITask.mjs} +1 -0
- package/esm2020/src/management/tasks/MgTimer.mjs +21 -0
- package/{esm2015/src/management/tasks/TaskDefinitionId.js → esm2020/src/management/tasks/TaskDefinitionId.mjs} +0 -0
- package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
- package/{esm2015/src/util/AuthenticationDialogHandler.js → esm2020/src/util/AuthenticationDialogHandler.mjs} +0 -0
- package/{esm2015/src/util/MemoryUtil.js → esm2020/src/util/MemoryUtil.mjs} +0 -0
- package/{esm2015/src/util/ObjectReference.js → esm2020/src/util/ObjectReference.mjs} +0 -0
- package/esm2020/src/util/ProcessLauncher.mjs +32 -0
- package/esm2020/src/util/UsernamePasswordCredentials.mjs +52 -0
- package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +133 -175
- package/fesm2015/magic-xpa-gui.mjs.map +1 -0
- package/fesm2020/magic-xpa-gui.mjs +17805 -0
- package/fesm2020/magic-xpa-gui.mjs.map +1 -0
- package/package.json +27 -14
- package/src/Events.d.ts +2 -2
- package/src/EventsProcessor.d.ts +1 -1
- package/src/IFlowMonitorQueue.d.ts +1 -1
- package/src/Manager.d.ts +2 -3
- package/src/management/data/DcValues.d.ts +1 -1
- package/src/management/data/DcValuesBuilderBase.d.ts +1 -1
- package/src/management/data/RecordUtils.d.ts +0 -3
- package/src/management/events/IGuiEventsManager.d.ts +5 -5
- package/src/management/exp/GuiExpressionEvaluator.d.ts +2 -2
- package/src/management/gui/DisplayConvertor.d.ts +6 -6
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
- package/src/management/gui/MgControlBase.d.ts +2 -4
- package/src/management/gui/MgFormBase.d.ts +1 -1
- package/src/management/gui/PropTable.d.ts +1 -1
- package/src/management/gui/Property.d.ts +2 -2
- package/src/management/tasks/GuiTaskBase.d.ts +3 -3
- package/src/util/ProcessLauncher.d.ts +1 -3
- package/bundles/magic-xpa-gui.umd.js +0 -19431
- package/bundles/magic-xpa-gui.umd.js.map +0 -1
- package/bundles/magic-xpa-gui.umd.min.js +0 -16
- package/bundles/magic-xpa-gui.umd.min.js.map +0 -1
- package/esm2015/src/Commands.js +0 -189
- package/esm2015/src/Events.js +0 -420
- package/esm2015/src/EventsProcessor.js +0 -68
- package/esm2015/src/FocusManager.js +0 -41
- package/esm2015/src/Manager.js +0 -197
- package/esm2015/src/gui/low/GuiInteractive.js +0 -545
- package/esm2015/src/management/data/DcValues.js +0 -214
- package/esm2015/src/management/data/DcValuesBuilderBase.js +0 -97
- package/esm2015/src/management/data/GuiDataViewBase.js +0 -90
- package/esm2015/src/management/data/GuiFieldBase.js +0 -85
- package/esm2015/src/management/data/ObjectReferenceBase.js +0 -48
- package/esm2015/src/management/data/RecordUtils.js +0 -447
- package/esm2015/src/management/events/IGuiEventsManager.js +0 -1
- package/esm2015/src/management/exp/GuiExpressionEvaluator.js +0 -333
- package/esm2015/src/management/gui/DisplayConvertor.js +0 -1706
- package/esm2015/src/management/gui/FieldValidator.js +0 -1507
- package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
- package/esm2015/src/management/gui/MgControlBase.js +0 -1981
- package/esm2015/src/management/gui/MgFormBase.js +0 -763
- package/esm2015/src/management/gui/PropDefaults.js +0 -230
- package/esm2015/src/management/gui/PropTable.js +0 -224
- package/esm2015/src/management/gui/Property.js +0 -1402
- package/esm2015/src/management/tasks/GuiTaskBase.js +0 -506
- package/esm2015/src/management/tasks/MgTimer.js +0 -21
- package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +0 -41
- package/esm2015/src/util/ProcessLauncher.js +0 -32
- package/esm2015/src/util/UsernamePasswordCredentials.js +0 -52
- package/fesm2015/magic-xpa-gui.js.map +0 -1
|
@@ -1,1981 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { ApplicationException, Debug, Exception, List, NNumber, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
|
|
3
|
-
import { GuiFieldBase } from '../data/GuiFieldBase';
|
|
4
|
-
import { ChoiceUtils, Constants, InternalInterface, MagicProperties, MgControlType, Misc, SEQ_2_STR, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
|
5
|
-
import { PIC } from './PIC';
|
|
6
|
-
import { PropTable } from './PropTable';
|
|
7
|
-
import { ValidationDetails } from './ValidationDetails';
|
|
8
|
-
import { FieldDef } from '../data/FieldDef';
|
|
9
|
-
import { Property } from './Property';
|
|
10
|
-
import { Manager } from '../../Manager';
|
|
11
|
-
import { CommandType, HtmlProperties } from '../../GuiEnums';
|
|
12
|
-
import { Commands } from '../../Commands';
|
|
13
|
-
import { NUM_TYPE } from '../data/NUM_TYPE';
|
|
14
|
-
import { PropInterface } from './PropInterface';
|
|
15
|
-
import { Events } from '../../Events';
|
|
16
|
-
import { EMPTY_DCREF } from '../data/DcValues';
|
|
17
|
-
import { DisplayConvertor } from './DisplayConvertor';
|
|
18
|
-
import { BlobType } from '../data/BlobType';
|
|
19
|
-
import { VectorType } from '../data/VectorType';
|
|
20
|
-
import { ObjectReference } from '../../util/ObjectReference';
|
|
21
|
-
import { GuiConstants } from '../../GuiConstants';
|
|
22
|
-
import { isNullOrUndefined } from 'util';
|
|
23
|
-
import { GuiControlPropertyAdapter } from './GuiControlPropertyAdapter';
|
|
24
|
-
import { FocusManager } from '../../FocusManager';
|
|
25
|
-
export class MgControlBase extends GuiControlPropertyAdapter {
|
|
26
|
-
constructor(type, parentMgForm, parentControl) {
|
|
27
|
-
super();
|
|
28
|
-
this._ditIdx = 0;
|
|
29
|
-
this._linkedControls = null;
|
|
30
|
-
this._field = null;
|
|
31
|
-
this._nodeIdField = null;
|
|
32
|
-
this._nodeParentIdField = null;
|
|
33
|
-
this._picStr = null;
|
|
34
|
-
this._choiceDisps = null;
|
|
35
|
-
this._choiceLayerList = null;
|
|
36
|
-
this._choiceLinks = null;
|
|
37
|
-
this._choiceNums = null;
|
|
38
|
-
this._containerDitIdx = -1;
|
|
39
|
-
this._currReadOnly = null;
|
|
40
|
-
this._dataCtrl = false;
|
|
41
|
-
this._dcTableRefs = null;
|
|
42
|
-
this._firstRefreshProperties = true;
|
|
43
|
-
this._form = null;
|
|
44
|
-
this._hasValidItmAndDispVal = false;
|
|
45
|
-
this._id = -1;
|
|
46
|
-
this._controlIsn = -1;
|
|
47
|
-
this._linkedParentDitIdx = -1;
|
|
48
|
-
this._orgChoiceDisps = null;
|
|
49
|
-
this._parentTable = null;
|
|
50
|
-
this._pic = null;
|
|
51
|
-
this._picExpExists = false;
|
|
52
|
-
this._prevIsNulls = null;
|
|
53
|
-
this._prevPicExpResult = null;
|
|
54
|
-
this._prevValues = null;
|
|
55
|
-
this._propTab = null;
|
|
56
|
-
this._range = null;
|
|
57
|
-
this._rangeChanged = false;
|
|
58
|
-
this._rtfVal = NString.Empty;
|
|
59
|
-
this._valExpId = 0;
|
|
60
|
-
this._vd = null;
|
|
61
|
-
this._dcValId = -2;
|
|
62
|
-
this.parent = 0;
|
|
63
|
-
this.veeIndx = 0;
|
|
64
|
-
this.DNObjectReferenceField = null;
|
|
65
|
-
this.SourceTableReference = null;
|
|
66
|
-
this.ClipBoardDataExists = false;
|
|
67
|
-
this.DataType = StorageAttribute.NONE;
|
|
68
|
-
this.KeyStrokeOn = false;
|
|
69
|
-
this.ModifiedByUser = false;
|
|
70
|
-
this.Value = null;
|
|
71
|
-
this.IsNull = false;
|
|
72
|
-
this.forceRefresh = false;
|
|
73
|
-
this.RefreshOnVisible = false;
|
|
74
|
-
this.InControl = false;
|
|
75
|
-
this.ValidateControl = false;
|
|
76
|
-
this.PromptHelp = null;
|
|
77
|
-
if (arguments.length === 0) {
|
|
78
|
-
this.constructor_0();
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
this.constructor_1(type, parentMgForm, parentControl);
|
|
82
|
-
}
|
|
83
|
-
set Form(value) {
|
|
84
|
-
this._form = value;
|
|
85
|
-
this.GuiMgForm = value;
|
|
86
|
-
}
|
|
87
|
-
get Form() {
|
|
88
|
-
return this._form;
|
|
89
|
-
}
|
|
90
|
-
get Id() {
|
|
91
|
-
return this._id;
|
|
92
|
-
}
|
|
93
|
-
get ControlIsn() {
|
|
94
|
-
return this._controlIsn;
|
|
95
|
-
}
|
|
96
|
-
constructor_0() {
|
|
97
|
-
this._linkedControls = new List();
|
|
98
|
-
this.DataType = StorageAttribute.NONE;
|
|
99
|
-
}
|
|
100
|
-
constructor_1(type, parentMgForm, parentControl) {
|
|
101
|
-
this.constructor_0();
|
|
102
|
-
this.initReferences(parentMgForm);
|
|
103
|
-
this.Type = type;
|
|
104
|
-
this._containerDitIdx = parentControl;
|
|
105
|
-
this._linkedParentDitIdx = parentControl;
|
|
106
|
-
this._propTab = new PropTable(this);
|
|
107
|
-
this.createArrays(false);
|
|
108
|
-
}
|
|
109
|
-
get UniqueName() {
|
|
110
|
-
return this.Name;
|
|
111
|
-
}
|
|
112
|
-
get TaskTag() {
|
|
113
|
-
return this.Form.getTask().getTaskTag();
|
|
114
|
-
}
|
|
115
|
-
checkIfExistProp(propId) {
|
|
116
|
-
let exist = false;
|
|
117
|
-
if (this._propTab !== null) {
|
|
118
|
-
let propById = this._propTab.getPropById(propId);
|
|
119
|
-
exist = (propById !== null);
|
|
120
|
-
}
|
|
121
|
-
return exist;
|
|
122
|
-
}
|
|
123
|
-
getProp(propId) {
|
|
124
|
-
let prop = null;
|
|
125
|
-
if (this._propTab !== null) {
|
|
126
|
-
prop = this._propTab.getPropById(propId);
|
|
127
|
-
if (prop === null) {
|
|
128
|
-
prop = Property.getDefaultProp(propId, 'C', this);
|
|
129
|
-
if (prop !== null) {
|
|
130
|
-
this._propTab.addProp(prop);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
return prop;
|
|
135
|
-
}
|
|
136
|
-
getForm() {
|
|
137
|
-
return this.Form;
|
|
138
|
-
}
|
|
139
|
-
getCompIdx() {
|
|
140
|
-
return this.getForm().getTask().getCompIdx();
|
|
141
|
-
}
|
|
142
|
-
IsFirstRefreshOfProps() {
|
|
143
|
-
return this._firstRefreshProperties;
|
|
144
|
-
}
|
|
145
|
-
EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
|
|
146
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
147
|
-
return yield this.getForm().getTask().EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated);
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
GetExpressionStorage(expId) {
|
|
151
|
-
return this.getForm().getTask().GetExpressionStorage(expId);
|
|
152
|
-
}
|
|
153
|
-
GetComputedProperty(propId) {
|
|
154
|
-
let prop = null;
|
|
155
|
-
if (this._propTab !== null)
|
|
156
|
-
prop = this._propTab.getPropById(propId);
|
|
157
|
-
return prop;
|
|
158
|
-
}
|
|
159
|
-
initReferences(mgForm) {
|
|
160
|
-
this.Form = mgForm;
|
|
161
|
-
}
|
|
162
|
-
createArrays(forceCreateArrays) {
|
|
163
|
-
if (this._firstRefreshProperties || forceCreateArrays) {
|
|
164
|
-
if (this.SupportsDataSource()) {
|
|
165
|
-
this._dcTableRefs = new List();
|
|
166
|
-
}
|
|
167
|
-
this._prevValues = new List();
|
|
168
|
-
if (!forceCreateArrays) {
|
|
169
|
-
this._currReadOnly = new List();
|
|
170
|
-
}
|
|
171
|
-
this._choiceDisps = new List();
|
|
172
|
-
this._orgChoiceDisps = new List();
|
|
173
|
-
this._choiceLinks = new List();
|
|
174
|
-
this._choiceNums = new List();
|
|
175
|
-
this._prevIsNulls = new List();
|
|
176
|
-
this._choiceLayerList = new List();
|
|
177
|
-
if (!this.IsRepeatable && !super.isTableControl()) {
|
|
178
|
-
this.updateArrays(1);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
SetFocus(ctrl, line, refreshPrompt, activateForm) {
|
|
183
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
184
|
-
yield FocusManager.SetFocus(ctrl.getForm().getTask(), ctrl, line, activateForm);
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
InsertArrays(idx, count) {
|
|
188
|
-
this._prevValues.InsertRange(idx, new Array(count));
|
|
189
|
-
this._prevIsNulls.InsertRange(idx, new Array(count));
|
|
190
|
-
this._currReadOnly.InsertRange(idx, new Array(count));
|
|
191
|
-
this._choiceDisps.InsertRange(idx, new Array(count));
|
|
192
|
-
this._orgChoiceDisps.InsertRange(idx, new Array(count));
|
|
193
|
-
this._choiceLinks.InsertRange(idx, new Array(count));
|
|
194
|
-
this._choiceLayerList.InsertRange(idx, new Array(count));
|
|
195
|
-
this._choiceNums.InsertRange(idx, new Array(count));
|
|
196
|
-
if (this.SupportsDataSource())
|
|
197
|
-
this._dcTableRefs.InsertRange(idx, new Array(count));
|
|
198
|
-
this._propTab.InsertPrevValueArray(idx, count);
|
|
199
|
-
}
|
|
200
|
-
updateArrays(newSize) {
|
|
201
|
-
this._prevValues.SetSize(newSize);
|
|
202
|
-
this._prevIsNulls.SetSize(newSize);
|
|
203
|
-
this._currReadOnly.SetSize(newSize);
|
|
204
|
-
this._choiceDisps.SetSize(newSize);
|
|
205
|
-
this._orgChoiceDisps.SetSize(newSize);
|
|
206
|
-
this._choiceLinks.SetSize(newSize);
|
|
207
|
-
this._choiceLayerList.SetSize(newSize);
|
|
208
|
-
this._choiceNums.SetSize(newSize);
|
|
209
|
-
if (this.SupportsDataSource()) {
|
|
210
|
-
this._dcTableRefs.SetSize(newSize);
|
|
211
|
-
}
|
|
212
|
-
this._propTab.updatePrevValueArray(newSize);
|
|
213
|
-
}
|
|
214
|
-
updatePrevValArrays(newSize) {
|
|
215
|
-
this._propTab.updatePrevValueArray(newSize);
|
|
216
|
-
}
|
|
217
|
-
fillData(mgForm, ditIdx, parser) {
|
|
218
|
-
if (this.Form === null) {
|
|
219
|
-
this.initReferences(mgForm);
|
|
220
|
-
}
|
|
221
|
-
this._ditIdx = ditIdx;
|
|
222
|
-
while (this.initInnerObjects(parser.getNextTag(), parser)) {
|
|
223
|
-
}
|
|
224
|
-
if (this.DataType === StorageAttribute.BLOB && this._picStr === null) {
|
|
225
|
-
this._picStr = "";
|
|
226
|
-
}
|
|
227
|
-
if (this._picStr !== null && typeof this.DataType !== "undefined") {
|
|
228
|
-
this.setPIC(this._picStr);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
switch (this.Type) {
|
|
232
|
-
case MgControlType.CTRL_TYPE_IMAGE:
|
|
233
|
-
case MgControlType.CTRL_TYPE_BROWSER:
|
|
234
|
-
case MgControlType.CTRL_TYPE_BUTTON:
|
|
235
|
-
if (this.DataType === StorageAttribute.NONE)
|
|
236
|
-
this.DataType = StorageAttribute.ALPHA;
|
|
237
|
-
break;
|
|
238
|
-
case MgControlType.CTRL_TYPE_TABLE:
|
|
239
|
-
case MgControlType.CTRL_TYPE_COLUMN:
|
|
240
|
-
case MgControlType.CTRL_TYPE_SUBFORM:
|
|
241
|
-
case MgControlType.CTRL_TYPE_GROUP:
|
|
242
|
-
case MgControlType.CTRL_TYPE_FRAME_SET:
|
|
243
|
-
case MgControlType.CTRL_TYPE_FRAME_FORM:
|
|
244
|
-
case MgControlType.CTRL_TYPE_CONTAINER:
|
|
245
|
-
case MgControlType.CTRL_TYPE_LINE:
|
|
246
|
-
break;
|
|
247
|
-
default:
|
|
248
|
-
Events.WriteExceptionToLog(NString.Format("in Control.fillData(): missing datatype or picture string for control: {0}", this.Name));
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
if (super.isTableControl()) {
|
|
253
|
-
this.Form.setTableCtrl(this);
|
|
254
|
-
}
|
|
255
|
-
this.createArrays(false);
|
|
256
|
-
}
|
|
257
|
-
initInnerObjects(foundTagName, parser) {
|
|
258
|
-
if (foundTagName === null)
|
|
259
|
-
return false;
|
|
260
|
-
if (foundTagName === XMLConstants.MG_TAG_PROP) {
|
|
261
|
-
if (this._propTab === null)
|
|
262
|
-
this._propTab = new PropTable(this);
|
|
263
|
-
this._propTab.fillData(this, 'C', parser);
|
|
264
|
-
}
|
|
265
|
-
else if (foundTagName === XMLConstants.MG_TAG_CONTROL)
|
|
266
|
-
this.parseAttributes(parser);
|
|
267
|
-
else if (foundTagName === "SourceTable")
|
|
268
|
-
this.ParseSourceTable(parser);
|
|
269
|
-
else if (foundTagName === "/" + XMLConstants.MG_TAG_CONTROL) {
|
|
270
|
-
parser.setCurrIndex2EndOfTag();
|
|
271
|
-
return false;
|
|
272
|
-
}
|
|
273
|
-
else {
|
|
274
|
-
Events.WriteExceptionToLog(NString.Format("There is no such tag in Control. Insert else if to Control.initInnerObjects for {0}", foundTagName));
|
|
275
|
-
return false;
|
|
276
|
-
}
|
|
277
|
-
return true;
|
|
278
|
-
}
|
|
279
|
-
ParseSourceTable(parser) {
|
|
280
|
-
parser.setCurrIndex2EndOfTag();
|
|
281
|
-
let objRefStr = parser.ReadToEndOfCurrentElement();
|
|
282
|
-
let sourceTableReference = ObjectReference.FromXML(objRefStr.trim());
|
|
283
|
-
this.SourceTableReference = sourceTableReference;
|
|
284
|
-
parser.setCurrIndex2EndOfTag();
|
|
285
|
-
}
|
|
286
|
-
parseAttributes(parser) {
|
|
287
|
-
let endContext = parser.getXMLdata().indexOf(">", parser.getCurrIndex());
|
|
288
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
289
|
-
let tag = parser.getXMLsubstring(endContext);
|
|
290
|
-
parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_CONTROL) + XMLConstants.MG_TAG_CONTROL.length);
|
|
291
|
-
let tokens = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
292
|
-
for (let i = 0; i < tokens.length; i = i + 2) {
|
|
293
|
-
let attribute = tokens.get_Item(i);
|
|
294
|
-
let valueStr = tokens.get_Item(i + 1);
|
|
295
|
-
this.SetAttribute(attribute, valueStr);
|
|
296
|
-
}
|
|
297
|
-
parser.setCurrIndex(endContext + 1);
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
300
|
-
Events.WriteExceptionToLog("in Control.FillName() out of string bounds");
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
SetAttribute(attribute, valueStr) {
|
|
304
|
-
let isTagProcessed = true;
|
|
305
|
-
switch (attribute) {
|
|
306
|
-
case XMLConstants.MG_ATTR_TYPE:
|
|
307
|
-
this.Type = valueStr[0];
|
|
308
|
-
break;
|
|
309
|
-
case XMLConstants.MG_ATTR_DATA_CTRL:
|
|
310
|
-
this._dataCtrl = XmlParser.getBoolean(valueStr);
|
|
311
|
-
break;
|
|
312
|
-
case XMLConstants.MG_ATTR_LINKED_PARENT:
|
|
313
|
-
this.setLinkedParentIdx(XmlParser.getInt(valueStr));
|
|
314
|
-
break;
|
|
315
|
-
case XMLConstants.MG_ATTR_CONTAINER:
|
|
316
|
-
this.setContainer(XmlParser.getInt(valueStr));
|
|
317
|
-
break;
|
|
318
|
-
case XMLConstants.MG_ATTR_ID:
|
|
319
|
-
this._id = XmlParser.getInt(valueStr);
|
|
320
|
-
break;
|
|
321
|
-
case XMLConstants.MG_ATTR_CONTROL_ISN:
|
|
322
|
-
this._controlIsn = XmlParser.getInt(valueStr);
|
|
323
|
-
break;
|
|
324
|
-
case XMLConstants.MG_ATTR_IS_MODAL:
|
|
325
|
-
this._isModal = XmlParser.getBoolean(valueStr);
|
|
326
|
-
break;
|
|
327
|
-
case XMLConstants.MG_ATTR_CONTROL_Z_ORDER:
|
|
328
|
-
break;
|
|
329
|
-
case XMLConstants.MG_HOR_ALIGMENT_IS_INHERITED:
|
|
330
|
-
break;
|
|
331
|
-
default:
|
|
332
|
-
isTagProcessed = false;
|
|
333
|
-
break;
|
|
334
|
-
}
|
|
335
|
-
return isTagProcessed;
|
|
336
|
-
}
|
|
337
|
-
setImage() {
|
|
338
|
-
let newVal = this.Value;
|
|
339
|
-
if (newVal === null || this.IsNull) {
|
|
340
|
-
newVal = "";
|
|
341
|
-
}
|
|
342
|
-
if (this.DataType === StorageAttribute.BLOB) {
|
|
343
|
-
}
|
|
344
|
-
else {
|
|
345
|
-
this.setImageWithFileName(newVal);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
setImageWithFileName(fileName) {
|
|
349
|
-
if (fileName === null) {
|
|
350
|
-
fileName = "";
|
|
351
|
-
}
|
|
352
|
-
fileName = Events.TranslateLogicalName(fileName);
|
|
353
|
-
if (!Misc.IsWebUrl(fileName))
|
|
354
|
-
fileName = "./assets/images/" + fileName;
|
|
355
|
-
if (this.IsImageButton()) {
|
|
356
|
-
Commands.addOperationWithLine(CommandType.SET_STYLE, this, 0, MagicProperties.ImageFile, fileName);
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.Image, fileName);
|
|
360
|
-
Commands.addValueWithLine(CommandType.SET_VALUE, this, this.getDisplayLine(false), fileName);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
setContainer(containerIdx) {
|
|
364
|
-
this._containerDitIdx = containerIdx;
|
|
365
|
-
let container = null;
|
|
366
|
-
if (this._containerDitIdx !== -1) {
|
|
367
|
-
container = this.Form.getCtrl(this._containerDitIdx);
|
|
368
|
-
}
|
|
369
|
-
if (container !== null && container.Type === MgControlType.CTRL_TYPE_TABLE) {
|
|
370
|
-
this._parentTable = container;
|
|
371
|
-
}
|
|
372
|
-
this.IsRepeatable = (this._parentTable !== null && !super.isColumnControl());
|
|
373
|
-
}
|
|
374
|
-
getName() {
|
|
375
|
-
return this.Name;
|
|
376
|
-
}
|
|
377
|
-
getLinkedControls() {
|
|
378
|
-
return this._linkedControls;
|
|
379
|
-
}
|
|
380
|
-
isRepeatable() {
|
|
381
|
-
return this.IsRepeatable;
|
|
382
|
-
}
|
|
383
|
-
IsModal() {
|
|
384
|
-
return this._isModal;
|
|
385
|
-
}
|
|
386
|
-
getDisplayLine(useLineForItems) {
|
|
387
|
-
let line = 0;
|
|
388
|
-
if (this.IsRepeatable || (useLineForItems && super.isTableControl())) {
|
|
389
|
-
line = this.Form.DisplayLine;
|
|
390
|
-
}
|
|
391
|
-
return line;
|
|
392
|
-
}
|
|
393
|
-
isVisible() {
|
|
394
|
-
let result = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_VISIBLE, true);
|
|
395
|
-
if (result) {
|
|
396
|
-
result = this.isParentPropValue(PropInterface.PROP_TYPE_VISIBLE);
|
|
397
|
-
}
|
|
398
|
-
return result;
|
|
399
|
-
}
|
|
400
|
-
isEnabled() {
|
|
401
|
-
return this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_ENABLED, true);
|
|
402
|
-
}
|
|
403
|
-
isModifiable() {
|
|
404
|
-
let modifiable = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFIABLE, true);
|
|
405
|
-
let taskInQuery = this.getForm().getTask().getMode() === Constants.TASK_MODE_QUERY;
|
|
406
|
-
let modifyInQuery = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false);
|
|
407
|
-
let result = modifiable && (modifyInQuery || !taskInQuery);
|
|
408
|
-
if (result && this._field != null) {
|
|
409
|
-
result = (this._field.DbModifiable || this.getForm().getTask().getMode() === Constants.TASK_MODE_CREATE);
|
|
410
|
-
}
|
|
411
|
-
return result;
|
|
412
|
-
}
|
|
413
|
-
getDcVals() {
|
|
414
|
-
let dataView = this.getForm().getTask().DataView;
|
|
415
|
-
let dcv = null;
|
|
416
|
-
if (this._dcValId === EMPTY_DCREF) {
|
|
417
|
-
dcv = ((this.DataType === StorageAttribute.BLOB_VECTOR) ? dataView.getEmptyChoiceForVectors() : dataView.getEmptyChoice());
|
|
418
|
-
}
|
|
419
|
-
else {
|
|
420
|
-
if (this._dcValId > -1) {
|
|
421
|
-
dcv = dataView.getDcValues(this._dcValId);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
return dcv;
|
|
425
|
-
}
|
|
426
|
-
getPrevIsNull() {
|
|
427
|
-
let line = this.getDisplayLine(true);
|
|
428
|
-
let currObj = this._prevIsNulls.get_Item(line);
|
|
429
|
-
let curr;
|
|
430
|
-
if (currObj === null) {
|
|
431
|
-
curr = false;
|
|
432
|
-
this._prevIsNulls.set_Item(line, curr);
|
|
433
|
-
}
|
|
434
|
-
else {
|
|
435
|
-
curr = currObj;
|
|
436
|
-
}
|
|
437
|
-
return curr;
|
|
438
|
-
}
|
|
439
|
-
setPrevIsNull(newValue) {
|
|
440
|
-
this._prevIsNulls.set_Item(this.getDisplayLine(true), newValue);
|
|
441
|
-
}
|
|
442
|
-
setPIC(picStr) {
|
|
443
|
-
if (super.isButton()) {
|
|
444
|
-
this._picStr = (super.IsImageButton() ? "" + XMLConstants.FILE_NAME_SIZE.toString() : Events.Translate(picStr));
|
|
445
|
-
}
|
|
446
|
-
else {
|
|
447
|
-
this._picStr = picStr;
|
|
448
|
-
}
|
|
449
|
-
this._pic = new PIC(this._picStr, this.DataType, this.getForm().getTask().getCompIdx());
|
|
450
|
-
if (this._dataCtrl && this._picStr.indexOf('H') > -1) {
|
|
451
|
-
this._pic.setHebrew();
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
getPIC() {
|
|
455
|
-
return this._pic;
|
|
456
|
-
}
|
|
457
|
-
getParent() {
|
|
458
|
-
let retParent = this.Form;
|
|
459
|
-
if (this._containerDitIdx !== -1) {
|
|
460
|
-
retParent = this.Form.getCtrl(this._containerDitIdx);
|
|
461
|
-
}
|
|
462
|
-
else {
|
|
463
|
-
if (this.Form.isSubForm()) {
|
|
464
|
-
retParent = this.Form.getSubFormCtrl();
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
return retParent;
|
|
468
|
-
}
|
|
469
|
-
getField() {
|
|
470
|
-
return this._field;
|
|
471
|
-
}
|
|
472
|
-
setField(fieldOrFieldStrID) {
|
|
473
|
-
if (fieldOrFieldStrID === null || fieldOrFieldStrID instanceof GuiFieldBase) {
|
|
474
|
-
this.setField_0(fieldOrFieldStrID);
|
|
475
|
-
return;
|
|
476
|
-
}
|
|
477
|
-
this.setField_1(fieldOrFieldStrID);
|
|
478
|
-
}
|
|
479
|
-
setField_0(field) {
|
|
480
|
-
this._field = field;
|
|
481
|
-
if (field !== null) {
|
|
482
|
-
this._field.SetControl(this);
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
setField_1(fieldStrID) {
|
|
486
|
-
let returnField = this.getFieldByValueStr(fieldStrID);
|
|
487
|
-
if (returnField !== null) {
|
|
488
|
-
this._field = returnField;
|
|
489
|
-
this._field.SetControl(this);
|
|
490
|
-
return;
|
|
491
|
-
}
|
|
492
|
-
throw new ApplicationException("in Control.setField(): illegal field identifier: " + fieldStrID);
|
|
493
|
-
}
|
|
494
|
-
setPicStr(format, expId) {
|
|
495
|
-
this._picStr = format;
|
|
496
|
-
if (expId > 0) {
|
|
497
|
-
this._picExpExists = true;
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
setRange(newRange) {
|
|
501
|
-
this._range = newRange;
|
|
502
|
-
this._vd = null;
|
|
503
|
-
}
|
|
504
|
-
setValExp(expId) {
|
|
505
|
-
this._valExpId = expId;
|
|
506
|
-
}
|
|
507
|
-
buildCopyPicture(oldVal, newVal) {
|
|
508
|
-
if (super.isTableControl() || super.isColumnControl()) {
|
|
509
|
-
return null;
|
|
510
|
-
}
|
|
511
|
-
else {
|
|
512
|
-
let copyVD = this.getCopyOfVD();
|
|
513
|
-
copyVD.setValue(newVal);
|
|
514
|
-
copyVD.setOldValue(oldVal);
|
|
515
|
-
return copyVD;
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
getCopyOfVD() {
|
|
519
|
-
let result;
|
|
520
|
-
if (this._vd === null) {
|
|
521
|
-
result = new ValidationDetails(this.Value, this.Value, this._range, this._pic, this);
|
|
522
|
-
}
|
|
523
|
-
else {
|
|
524
|
-
result = new ValidationDetails(this._vd);
|
|
525
|
-
}
|
|
526
|
-
return result;
|
|
527
|
-
}
|
|
528
|
-
getRanges() {
|
|
529
|
-
return this._range;
|
|
530
|
-
}
|
|
531
|
-
getRangedValue(newVal) {
|
|
532
|
-
let vd;
|
|
533
|
-
vd = this.buildCopyPicture(this.Value, newVal);
|
|
534
|
-
vd.evaluate();
|
|
535
|
-
let val = vd.getDispValue();
|
|
536
|
-
return (val.toString());
|
|
537
|
-
}
|
|
538
|
-
validate(newVal) {
|
|
539
|
-
let vd;
|
|
540
|
-
let modified = this.ModifiedByUser;
|
|
541
|
-
this.ModifiedByUser = true;
|
|
542
|
-
vd = this.buildCopyPicture(this.Value, newVal);
|
|
543
|
-
vd.evaluate();
|
|
544
|
-
this.ModifiedByUser = modified;
|
|
545
|
-
if (vd.ValidationFailed)
|
|
546
|
-
return vd.ErrorMessage;
|
|
547
|
-
else
|
|
548
|
-
return null;
|
|
549
|
-
}
|
|
550
|
-
getFieldByValueStr(valueStr) {
|
|
551
|
-
let refParent = new RefParam(this.parent);
|
|
552
|
-
let refVeeIndx = new RefParam(this.veeIndx);
|
|
553
|
-
let ret = this.getForm().getTask().getFieldByValueStr(valueStr, refParent, refVeeIndx);
|
|
554
|
-
this.parent = refParent.value;
|
|
555
|
-
this.veeIndx = refVeeIndx.value;
|
|
556
|
-
return ret;
|
|
557
|
-
}
|
|
558
|
-
hasContainer() {
|
|
559
|
-
return this._containerDitIdx !== -1;
|
|
560
|
-
}
|
|
561
|
-
getLayer() {
|
|
562
|
-
return this.Layer;
|
|
563
|
-
}
|
|
564
|
-
computePIC(picExpResult) {
|
|
565
|
-
let picResult = (picExpResult !== null && super.isButton()) ? Events.Translate(picExpResult) : picExpResult;
|
|
566
|
-
if (this._prevPicExpResult === null || !(this._prevPicExpResult === picResult)) {
|
|
567
|
-
this._pic = new PIC(picResult, this.DataType, this.getForm().getTask().getCompIdx());
|
|
568
|
-
this._prevPicExpResult = picResult;
|
|
569
|
-
}
|
|
570
|
-
return this._pic;
|
|
571
|
-
}
|
|
572
|
-
getCurrentIndexOfChoice() {
|
|
573
|
-
let selectedIndice = [-1];
|
|
574
|
-
let val = this.Value;
|
|
575
|
-
if (!NString.IsNullOrEmpty(val)) {
|
|
576
|
-
let array2 = val.split(',');
|
|
577
|
-
selectedIndice = new Array(array2.length);
|
|
578
|
-
for (let iCtr = 0; iCtr < array2.length; iCtr = iCtr + 1) {
|
|
579
|
-
let num = NNumber.Parse(array2[iCtr]);
|
|
580
|
-
selectedIndice[iCtr] = ((num >= 0) ? num : -1);
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
return selectedIndice;
|
|
584
|
-
}
|
|
585
|
-
IsMultipleSelectionListBox() {
|
|
586
|
-
return super.isListBox();
|
|
587
|
-
}
|
|
588
|
-
IsDateTimePicture() {
|
|
589
|
-
return this._pic.getAttr() === StorageAttribute.DATE || this._pic.getAttr() === StorageAttribute.TIME;
|
|
590
|
-
}
|
|
591
|
-
SupportsDataSource() {
|
|
592
|
-
return super.isSelectionCtrl() || super.isTabControl() || super.isRadio() || this.HasAutocomplete();
|
|
593
|
-
}
|
|
594
|
-
HasAutocomplete() {
|
|
595
|
-
if (super.isTextControl())
|
|
596
|
-
return this.getProp(PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC).GetComputedValueBoolean();
|
|
597
|
-
return false;
|
|
598
|
-
}
|
|
599
|
-
getIndexOfChoice(mgVal, line, isNull) {
|
|
600
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
601
|
-
let splitCommaSeperatedVals = this.IsMultipleSelectionListBox();
|
|
602
|
-
yield this.computeChoice(line);
|
|
603
|
-
let isVectorValue = this.getField() !== null && this.getField().getType() === StorageAttribute.BLOB_VECTOR;
|
|
604
|
-
return this.getDcVals().getIndexOf(mgVal, isVectorValue, isNull, this._choiceLinks.get_Item(line), this._choiceNums.get_Item(line), splitCommaSeperatedVals);
|
|
605
|
-
});
|
|
606
|
-
}
|
|
607
|
-
getDispVals(line, execComputeChoice) {
|
|
608
|
-
const _super = Object.create(null, {
|
|
609
|
-
isTabControl: { get: () => super.isTabControl }
|
|
610
|
-
});
|
|
611
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
612
|
-
if (execComputeChoice) {
|
|
613
|
-
yield this.computeChoice(line);
|
|
614
|
-
}
|
|
615
|
-
if (_super.isTabControl.call(this)) {
|
|
616
|
-
return this._orgChoiceDisps.get_Item(line);
|
|
617
|
-
}
|
|
618
|
-
else {
|
|
619
|
-
return this._choiceDisps.get_Item(line);
|
|
620
|
-
}
|
|
621
|
-
});
|
|
622
|
-
}
|
|
623
|
-
emptyChoice(line) {
|
|
624
|
-
let value = new Array(0);
|
|
625
|
-
this._choiceDisps.set_Item(line, value);
|
|
626
|
-
this._orgChoiceDisps.set_Item(line, value);
|
|
627
|
-
this._choiceLinks.set_Item(line, value);
|
|
628
|
-
this._choiceLayerList.set_Item(line, value);
|
|
629
|
-
}
|
|
630
|
-
computeChoice(line) {
|
|
631
|
-
const _super = Object.create(null, {
|
|
632
|
-
isSelectionCtrl: { get: () => super.isSelectionCtrl },
|
|
633
|
-
isTabControl: { get: () => super.isTabControl }
|
|
634
|
-
});
|
|
635
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
636
|
-
let fromHelp = [
|
|
637
|
-
"\\\\", "\\-", "\\,"
|
|
638
|
-
];
|
|
639
|
-
let toHelp = [
|
|
640
|
-
"XX", "XX", "XX"
|
|
641
|
-
];
|
|
642
|
-
let task = this.getForm().getTask();
|
|
643
|
-
let dataView = task.DataView;
|
|
644
|
-
let dcv = dataView.getDcValues(this._dcValId);
|
|
645
|
-
let currDcId = this.getDcRef();
|
|
646
|
-
let choiceDispStr = null;
|
|
647
|
-
let choiceLinkStr = "";
|
|
648
|
-
let optionsValid = true;
|
|
649
|
-
let trimToLength = -1;
|
|
650
|
-
let dataType = this.DataType;
|
|
651
|
-
let isItemsListTreatedAsDisplayList = false;
|
|
652
|
-
try {
|
|
653
|
-
if (this._choiceLinks.get_Item(line) === null || (this.isDataCtrl() && currDcId !== this._dcValId)) {
|
|
654
|
-
if (dataType === StorageAttribute.BLOB_VECTOR) {
|
|
655
|
-
dataType = this.getField().getCellsType();
|
|
656
|
-
}
|
|
657
|
-
let dispVals = dcv.getDispVals();
|
|
658
|
-
let dispProp = this.getProp(PropInterface.PROP_TYPE_DISPLAY_LIST);
|
|
659
|
-
let linkProp = this.getProp(PropInterface.PROP_TYPE_LABEL);
|
|
660
|
-
if (dispProp !== null) {
|
|
661
|
-
choiceDispStr = yield dispProp.getValue();
|
|
662
|
-
}
|
|
663
|
-
if (linkProp !== null) {
|
|
664
|
-
choiceLinkStr = yield linkProp.getValue();
|
|
665
|
-
}
|
|
666
|
-
if (choiceLinkStr === null || StrUtil.rtrim(choiceLinkStr).length === 0) {
|
|
667
|
-
choiceLinkStr = "";
|
|
668
|
-
}
|
|
669
|
-
if (choiceDispStr === null || StrUtil.rtrim(choiceDispStr).length === 0) {
|
|
670
|
-
if (!this.isDataCtrl() || dispVals === null || dispVals.length === 0) {
|
|
671
|
-
choiceDispStr = choiceLinkStr;
|
|
672
|
-
}
|
|
673
|
-
else {
|
|
674
|
-
choiceDispStr = (choiceLinkStr = "");
|
|
675
|
-
}
|
|
676
|
-
isItemsListTreatedAsDisplayList = true;
|
|
677
|
-
}
|
|
678
|
-
choiceDispStr = Events.Translate(choiceDispStr);
|
|
679
|
-
if (dataType === StorageAttribute.NUMERIC) {
|
|
680
|
-
choiceLinkStr = StrUtil.searchAndReplace(choiceLinkStr, "\\-", "-");
|
|
681
|
-
}
|
|
682
|
-
let helpStr = StrUtil.searchAndReplace(choiceLinkStr, fromHelp, toHelp);
|
|
683
|
-
let sTok = StrUtil.tokenize(helpStr, ",");
|
|
684
|
-
let linkSize = (helpStr !== "") ? sTok.length : 0;
|
|
685
|
-
let helpStrDisp = StrUtil.searchAndReplace(choiceDispStr, fromHelp, toHelp);
|
|
686
|
-
sTok = StrUtil.tokenize(helpStrDisp, ",");
|
|
687
|
-
let displaySize = (helpStrDisp !== "") ? sTok.length : 0;
|
|
688
|
-
if (linkSize !== displaySize && displaySize > 0) {
|
|
689
|
-
choiceDispStr = choiceLinkStr;
|
|
690
|
-
isItemsListTreatedAsDisplayList = true;
|
|
691
|
-
}
|
|
692
|
-
let size = linkSize;
|
|
693
|
-
let choiceLink = new Array(size);
|
|
694
|
-
this._choiceLinks.set_Item(line, choiceLink);
|
|
695
|
-
if (dataType === StorageAttribute.NUMERIC || dataType === StorageAttribute.DATE || dataType === StorageAttribute.TIME) {
|
|
696
|
-
this._choiceNums.set_Item(line, new Array(size));
|
|
697
|
-
}
|
|
698
|
-
let orgChoiceDisp = ChoiceUtils.GetDisplayListFromString(choiceDispStr, false, true, !isItemsListTreatedAsDisplayList);
|
|
699
|
-
this._orgChoiceDisps.set_Item(line, orgChoiceDisp);
|
|
700
|
-
let choiceDisp = ChoiceUtils.GetDisplayListFromString(choiceDispStr, _super.isSelectionCtrl.call(this) || _super.isTabControl.call(this), true, !isItemsListTreatedAsDisplayList);
|
|
701
|
-
this._choiceDisps.set_Item(line, choiceDisp);
|
|
702
|
-
if (this.getField() !== null) {
|
|
703
|
-
trimToLength = this.getField().getSize();
|
|
704
|
-
}
|
|
705
|
-
let token = null;
|
|
706
|
-
let helpToken = null;
|
|
707
|
-
let tokenBuffer;
|
|
708
|
-
for (let i = 0, currPos = 0, nextPos = 0; i < size && optionsValid; i++) {
|
|
709
|
-
nextPos = currPos;
|
|
710
|
-
nextPos = helpStr.indexOf(',', nextPos);
|
|
711
|
-
if (nextPos === currPos)
|
|
712
|
-
token = helpToken = "";
|
|
713
|
-
else if (nextPos === -1) {
|
|
714
|
-
token = choiceLinkStr.substr(currPos);
|
|
715
|
-
helpToken = helpStr.substr(currPos);
|
|
716
|
-
}
|
|
717
|
-
else {
|
|
718
|
-
token = choiceLinkStr.substr(currPos, (nextPos) - (currPos));
|
|
719
|
-
helpToken = helpStr.substr(currPos, (nextPos) - (currPos));
|
|
720
|
-
}
|
|
721
|
-
currPos = nextPos + 1;
|
|
722
|
-
switch (dataType) {
|
|
723
|
-
case StorageAttribute.ALPHA:
|
|
724
|
-
case StorageAttribute.MEMO:
|
|
725
|
-
case StorageAttribute.UNICODE:
|
|
726
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
727
|
-
token = StrUtil.ltrim(token);
|
|
728
|
-
helpToken = StrUtil.ltrim(helpToken);
|
|
729
|
-
if (helpToken.indexOf('\\') >= 0) {
|
|
730
|
-
tokenBuffer = new StringBuilder();
|
|
731
|
-
for (let tokenPos = 0; tokenPos < helpToken.length; tokenPos++)
|
|
732
|
-
if (helpToken[tokenPos] !== '\\')
|
|
733
|
-
tokenBuffer.Append(token[tokenPos]);
|
|
734
|
-
else if (tokenPos === helpToken.length - 1)
|
|
735
|
-
tokenBuffer.Append(' ');
|
|
736
|
-
token = tokenBuffer.ToString();
|
|
737
|
-
}
|
|
738
|
-
token = StrUtil.makePrintableTokens(token, SEQ_2_STR);
|
|
739
|
-
if (this.isSelectionCtrl() || this.isTabControl())
|
|
740
|
-
token = ChoiceUtils.RemoveAcclCharFromOptions(new StringBuilder(token));
|
|
741
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS() && dataType === StorageAttribute.ALPHA) {
|
|
742
|
-
if (trimToLength !== -1 && UtilStrByteMode.lenB(token) > trimToLength)
|
|
743
|
-
token = UtilStrByteMode.leftB(token, trimToLength);
|
|
744
|
-
}
|
|
745
|
-
else {
|
|
746
|
-
if (trimToLength !== -1 && token.length > trimToLength)
|
|
747
|
-
token = token.substr(0, trimToLength);
|
|
748
|
-
}
|
|
749
|
-
choiceLink[i] = token;
|
|
750
|
-
break;
|
|
751
|
-
case StorageAttribute.NUMERIC:
|
|
752
|
-
case StorageAttribute.DATE:
|
|
753
|
-
case StorageAttribute.TIME:
|
|
754
|
-
let picture = PIC.buildPicture(dataType, token, task.getCompIdx(), false);
|
|
755
|
-
optionsValid = this.optionIsValid(token);
|
|
756
|
-
choiceLink[i] = DisplayConvertor.Instance.disp2mg(token.trim(), choiceLinkStr, picture, task.getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
|
|
757
|
-
((this._choiceNums.get_Item(line)))[i] = new NUM_TYPE(choiceLink[i]);
|
|
758
|
-
break;
|
|
759
|
-
case StorageAttribute.BOOLEAN:
|
|
760
|
-
choiceLink[i] = (1 - i).toString();
|
|
761
|
-
break;
|
|
762
|
-
default:
|
|
763
|
-
break;
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
|
-
if (!optionsValid)
|
|
767
|
-
this.emptyChoice(line);
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
catch (ex) {
|
|
771
|
-
if (ex instanceof Exception) {
|
|
772
|
-
optionsValid = false;
|
|
773
|
-
this.emptyChoice(line);
|
|
774
|
-
Events.WriteExceptionToLog(NString.Format("{0} : {1}", ex.GetType(), ex.Message));
|
|
775
|
-
}
|
|
776
|
-
else
|
|
777
|
-
throw ex;
|
|
778
|
-
}
|
|
779
|
-
this._hasValidItmAndDispVal = optionsValid;
|
|
780
|
-
});
|
|
781
|
-
}
|
|
782
|
-
getTopMostForm() {
|
|
783
|
-
return this.getForm().getTopMostForm();
|
|
784
|
-
}
|
|
785
|
-
setUrl() {
|
|
786
|
-
Commands.addValueWithLine(CommandType.SET_VALUE, this, 0, this.Value);
|
|
787
|
-
}
|
|
788
|
-
getMgValue(dispVal) {
|
|
789
|
-
const _super = Object.create(null, {
|
|
790
|
-
isCheckBox: { get: () => super.isCheckBox },
|
|
791
|
-
isSelectionCtrl: { get: () => super.isSelectionCtrl },
|
|
792
|
-
isTabControl: { get: () => super.isTabControl },
|
|
793
|
-
isRadio: { get: () => super.isRadio }
|
|
794
|
-
});
|
|
795
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
796
|
-
let mgVal = null;
|
|
797
|
-
if (_super.isCheckBox.call(this)) {
|
|
798
|
-
mgVal = dispVal ? "1" : "0";
|
|
799
|
-
}
|
|
800
|
-
else {
|
|
801
|
-
if (_super.isSelectionCtrl.call(this) || _super.isTabControl.call(this) || _super.isRadio.call(this)) {
|
|
802
|
-
let line = this.getDisplayLine(true);
|
|
803
|
-
if (line < 0)
|
|
804
|
-
line = 0;
|
|
805
|
-
if (typeof dispVal === "number")
|
|
806
|
-
dispVal = dispVal.toString();
|
|
807
|
-
if (Array.isArray(dispVal))
|
|
808
|
-
dispVal = dispVal.join(',').toString();
|
|
809
|
-
if (dispVal === "") {
|
|
810
|
-
mgVal = dispVal;
|
|
811
|
-
}
|
|
812
|
-
else {
|
|
813
|
-
mgVal = yield this.getLinkValue(dispVal, line);
|
|
814
|
-
}
|
|
815
|
-
if (mgVal === null) {
|
|
816
|
-
let isNull = false;
|
|
817
|
-
let refMgVal = new RefParam(mgVal);
|
|
818
|
-
let refIsNull = new RefParam(isNull);
|
|
819
|
-
if (this._field !== null) {
|
|
820
|
-
mgVal = refMgVal.value;
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
}
|
|
824
|
-
else {
|
|
825
|
-
let blobContentType = (this._field !== null) ? this._field.getContentType() : BlobType.CONTENT_TYPE_UNKNOWN;
|
|
826
|
-
mgVal = DisplayConvertor.Instance.disp2mg(dispVal, this._range, this._pic, this.getForm().getTask().getCompIdx(), blobContentType);
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
return mgVal;
|
|
830
|
-
});
|
|
831
|
-
}
|
|
832
|
-
getLinkValue(selectedIndice, line) {
|
|
833
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
834
|
-
let size = 0;
|
|
835
|
-
let result = NString.Empty;
|
|
836
|
-
let temp = new List();
|
|
837
|
-
yield this.computeChoice(line);
|
|
838
|
-
let choiceLink = this._choiceLinks.get_Item(line);
|
|
839
|
-
if (choiceLink !== null) {
|
|
840
|
-
size = choiceLink.length;
|
|
841
|
-
}
|
|
842
|
-
let linkIndice = this.getLinkIdxFromLayer(Misc.GetIntArray(selectedIndice));
|
|
843
|
-
let array2 = linkIndice;
|
|
844
|
-
for (let i = 0; i < array2.length; i = i + 1) {
|
|
845
|
-
let idx = array2[i];
|
|
846
|
-
if (idx >= size) {
|
|
847
|
-
let dcVals = this.getDcVals();
|
|
848
|
-
temp.push(dcVals.getLinkValue(idx - size));
|
|
849
|
-
}
|
|
850
|
-
else {
|
|
851
|
-
if (idx >= 0 && idx < choiceLink.length) {
|
|
852
|
-
temp.push(choiceLink[idx]);
|
|
853
|
-
}
|
|
854
|
-
else {
|
|
855
|
-
temp.push(null);
|
|
856
|
-
}
|
|
857
|
-
}
|
|
858
|
-
}
|
|
859
|
-
if (this.DataType === StorageAttribute.BLOB_VECTOR) {
|
|
860
|
-
let vectorType = new VectorType(this.getField());
|
|
861
|
-
for (let indx = 0; indx < temp.length; indx = indx + 1) {
|
|
862
|
-
vectorType.setVecCell(indx + 1, temp.get_Item(indx), temp.get_Item(indx) === null);
|
|
863
|
-
}
|
|
864
|
-
result = vectorType.toString();
|
|
865
|
-
}
|
|
866
|
-
else {
|
|
867
|
-
if (temp.length > 1) {
|
|
868
|
-
result = temp.join(",");
|
|
869
|
-
}
|
|
870
|
-
else {
|
|
871
|
-
result = temp.get_Item(0);
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
return result;
|
|
875
|
-
});
|
|
876
|
-
}
|
|
877
|
-
setText() {
|
|
878
|
-
let displayLine = this.getDisplayLine(true);
|
|
879
|
-
let mlsTranslatedValue = this.Value;
|
|
880
|
-
if (super.isButton()) {
|
|
881
|
-
mlsTranslatedValue = Events.Translate(this.Value);
|
|
882
|
-
}
|
|
883
|
-
if (this.isTextControl() || this.isButton())
|
|
884
|
-
Commands.addValueWithLine(CommandType.SET_VALUE, this, displayLine, mlsTranslatedValue);
|
|
885
|
-
else
|
|
886
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, displayLine, HtmlProperties.Text, mlsTranslatedValue);
|
|
887
|
-
}
|
|
888
|
-
setRadioChecked(index) {
|
|
889
|
-
Commands.addValueWithLine(CommandType.SET_VALUE, this, this.getDisplayLine(false), index);
|
|
890
|
-
Commands.beginInvoke();
|
|
891
|
-
if (index !== GuiConstants.DEFAULT_VALUE_INT) {
|
|
892
|
-
this.setControlToFocus();
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
setControlToFocus() {
|
|
896
|
-
if (this.getField() !== null) {
|
|
897
|
-
this.getField().ControlToFocus = this;
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
setCheckBoxValue(line, mgVal) {
|
|
901
|
-
let checkState = DisplayConvertor.toBoolean(mgVal);
|
|
902
|
-
Commands.addValueWithLine(CommandType.SET_VALUE, this, line, checkState);
|
|
903
|
-
}
|
|
904
|
-
refreshAndSetItemListByDataSource(line, valueChanged) {
|
|
905
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
906
|
-
if (this.SupportsDataSource()) {
|
|
907
|
-
let currDcId = this.getDcRef();
|
|
908
|
-
if (this._rangeChanged) {
|
|
909
|
-
valueChanged = true;
|
|
910
|
-
}
|
|
911
|
-
this._rangeChanged = false;
|
|
912
|
-
if (this.isDataCtrl() && currDcId !== this._dcValId) {
|
|
913
|
-
valueChanged = true;
|
|
914
|
-
yield this.refreshAndSetItemsList(line, true);
|
|
915
|
-
this.setDcRef(this._dcValId);
|
|
916
|
-
}
|
|
917
|
-
}
|
|
918
|
-
return valueChanged;
|
|
919
|
-
});
|
|
920
|
-
}
|
|
921
|
-
setDcRef(dcId) {
|
|
922
|
-
this._dcTableRefs.set_Item(this.getDcLineNum(), dcId);
|
|
923
|
-
}
|
|
924
|
-
setImageList(url) {
|
|
925
|
-
}
|
|
926
|
-
updatePropertyLogicNesting(propId, commandType, val, updateThis) {
|
|
927
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
928
|
-
if (updateThis) {
|
|
929
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), commandType === CommandType.PROP_SET_VISIBLE ? HtmlProperties.Visible : HtmlProperties.Enabled, val);
|
|
930
|
-
}
|
|
931
|
-
yield this.updateChildrenPropValue(propId, commandType, val);
|
|
932
|
-
});
|
|
933
|
-
}
|
|
934
|
-
SetEnabled(val) {
|
|
935
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.Enabled, val);
|
|
936
|
-
}
|
|
937
|
-
updateChildrenPropValue(propId, commandType, val) {
|
|
938
|
-
const _super = Object.create(null, {
|
|
939
|
-
isTableControl: { get: () => super.isTableControl },
|
|
940
|
-
isSubform: { get: () => super.isSubform }
|
|
941
|
-
});
|
|
942
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
943
|
-
if (!_super.isTableControl.call(this)) {
|
|
944
|
-
for (let i = 0; i < this._linkedControls.length; i = i + 1) {
|
|
945
|
-
let child = this._linkedControls.get_Item(i);
|
|
946
|
-
if (child.IsFirstRefreshOfProps())
|
|
947
|
-
continue;
|
|
948
|
-
let childValue = (child.GetComputedBooleanProperty(propId, true));
|
|
949
|
-
childValue = childValue && val;
|
|
950
|
-
let childOnCurrentLayer = this.isChildOnCurrentLayer(child);
|
|
951
|
-
if (commandType === CommandType.PROP_SET_VISIBLE) {
|
|
952
|
-
if (childValue) {
|
|
953
|
-
childValue = childOnCurrentLayer;
|
|
954
|
-
}
|
|
955
|
-
yield child.updateChildrenPropValue(propId, commandType, childValue);
|
|
956
|
-
}
|
|
957
|
-
}
|
|
958
|
-
if (_super.isSubform.call(this)) {
|
|
959
|
-
yield this.updateSubformChildrenPropValue(propId, commandType, val);
|
|
960
|
-
}
|
|
961
|
-
}
|
|
962
|
-
});
|
|
963
|
-
}
|
|
964
|
-
isDescendentOfControl(control) {
|
|
965
|
-
let isContained = false;
|
|
966
|
-
if (control !== null) {
|
|
967
|
-
let parent = this.getParent();
|
|
968
|
-
if (parent instanceof MgControlBase) {
|
|
969
|
-
if (parent === control) {
|
|
970
|
-
isContained = true;
|
|
971
|
-
}
|
|
972
|
-
else {
|
|
973
|
-
let parentControl = ((parent instanceof MgControlBase) ? parent : null);
|
|
974
|
-
if (control.Type === MgControlType.CTRL_TYPE_COLUMN && parentControl !== null && parentControl.Type === MgControlType.CTRL_TYPE_TABLE && control.Layer === this.Layer)
|
|
975
|
-
isContained = true;
|
|
976
|
-
else
|
|
977
|
-
isContained = (parent.isDescendentOfControl(control));
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
return isContained;
|
|
982
|
-
}
|
|
983
|
-
updateSubformChildrenPropValue(propId, commandType, val) {
|
|
984
|
-
}
|
|
985
|
-
isChildOnCurrentLayer(child) {
|
|
986
|
-
let ret = true;
|
|
987
|
-
if (super.isChoiceControl()) {
|
|
988
|
-
let parentLayer = 0;
|
|
989
|
-
if (this.Value !== null) {
|
|
990
|
-
parentLayer = this.getCurrentLinkIdx() + 1;
|
|
991
|
-
}
|
|
992
|
-
let layer = child.getLayer();
|
|
993
|
-
if (parentLayer !== layer && layer > 0) {
|
|
994
|
-
ret = false;
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
return ret;
|
|
998
|
-
}
|
|
999
|
-
getCurrentLinkIdx() {
|
|
1000
|
-
let currLinkIdx = 0;
|
|
1001
|
-
if (super.isChoiceControl() || this.HasAutocomplete()) {
|
|
1002
|
-
let currentLayers = this.getCurrentIndexOfChoice();
|
|
1003
|
-
let currLinkIndice = this.getLinkIdxFromLayer(currentLayers);
|
|
1004
|
-
currLinkIdx = currLinkIndice[0];
|
|
1005
|
-
}
|
|
1006
|
-
return currLinkIdx;
|
|
1007
|
-
}
|
|
1008
|
-
getLayerFromLinkIdx(indice) {
|
|
1009
|
-
let layers = new Array(indice.length);
|
|
1010
|
-
for (let iCtr = 0; iCtr < indice.length; iCtr = iCtr + 1) {
|
|
1011
|
-
let idx = indice[iCtr];
|
|
1012
|
-
layers[iCtr] = idx;
|
|
1013
|
-
if (super.isTabControl() && idx >= 0) {
|
|
1014
|
-
let line = this.getDisplayLine(false);
|
|
1015
|
-
if (line < 0) {
|
|
1016
|
-
line = 0;
|
|
1017
|
-
}
|
|
1018
|
-
let layerList = this._choiceLayerList.get_Item(line);
|
|
1019
|
-
if (layerList !== null && layerList.length > 0) {
|
|
1020
|
-
layers[iCtr] = layerList.indexOf((idx + 1).toString());
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
}
|
|
1024
|
-
return layers;
|
|
1025
|
-
}
|
|
1026
|
-
getLinkIdxFromLayer(layers) {
|
|
1027
|
-
let linkIndice = new Array(layers.length);
|
|
1028
|
-
for (let iCtr = 0; iCtr < layers.length; iCtr = iCtr + 1) {
|
|
1029
|
-
let layer = layers[iCtr];
|
|
1030
|
-
linkIndice[iCtr] = layer;
|
|
1031
|
-
if (super.isTabControl()) {
|
|
1032
|
-
if (layer < 0) {
|
|
1033
|
-
linkIndice[iCtr] = 0;
|
|
1034
|
-
}
|
|
1035
|
-
else {
|
|
1036
|
-
let line = this.getDisplayLine(false);
|
|
1037
|
-
if (line < 0) {
|
|
1038
|
-
line = 0;
|
|
1039
|
-
}
|
|
1040
|
-
let layerList = this._choiceLayerList.get_Item(line);
|
|
1041
|
-
if (layerList !== null && typeof layerList !== "undefined" && layerList.length !== 0 && layer < layerList.length) {
|
|
1042
|
-
linkIndice[iCtr] = NNumber.Parse(layerList[layer]) - 1;
|
|
1043
|
-
}
|
|
1044
|
-
}
|
|
1045
|
-
}
|
|
1046
|
-
}
|
|
1047
|
-
return linkIndice;
|
|
1048
|
-
}
|
|
1049
|
-
isParentPropValue(propId) {
|
|
1050
|
-
let column = this.Form.getControlColumn(this);
|
|
1051
|
-
let parent = this.getLinkedParent(true);
|
|
1052
|
-
let result;
|
|
1053
|
-
if (parent === null) {
|
|
1054
|
-
result = true;
|
|
1055
|
-
}
|
|
1056
|
-
else {
|
|
1057
|
-
if (!parent.GetComputedBooleanProperty(propId, true)) {
|
|
1058
|
-
result = false;
|
|
1059
|
-
}
|
|
1060
|
-
else {
|
|
1061
|
-
if (!parent.isChildOnCurrentLayer(this)) {
|
|
1062
|
-
result = false;
|
|
1063
|
-
}
|
|
1064
|
-
else {
|
|
1065
|
-
result = (!(column !== null && !column.GetComputedBooleanProperty(propId, true)) && parent.isParentPropValue(propId));
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1069
|
-
return result;
|
|
1070
|
-
}
|
|
1071
|
-
getLinkedParent(checkSubformFather) {
|
|
1072
|
-
if (this._linkedParentDitIdx !== -1) {
|
|
1073
|
-
return this.Form.getCtrl(this._linkedParentDitIdx);
|
|
1074
|
-
}
|
|
1075
|
-
else {
|
|
1076
|
-
if (checkSubformFather && this.Form.isSubForm()) {
|
|
1077
|
-
return this.Form.getSubFormCtrl();
|
|
1078
|
-
}
|
|
1079
|
-
else {
|
|
1080
|
-
return null;
|
|
1081
|
-
}
|
|
1082
|
-
}
|
|
1083
|
-
}
|
|
1084
|
-
SetCurrReadOnly(newVal) {
|
|
1085
|
-
this._currReadOnly.set_Item(this.getDisplayLine(true), newVal);
|
|
1086
|
-
}
|
|
1087
|
-
GetCurrReadOnly() {
|
|
1088
|
-
let line = super.isTableControl() ? 0 : this.getDisplayLine(true);
|
|
1089
|
-
let currObj = this._currReadOnly.get_Item(line);
|
|
1090
|
-
let curr;
|
|
1091
|
-
if (currObj === null) {
|
|
1092
|
-
curr = false;
|
|
1093
|
-
this._currReadOnly.set_Item(line, curr);
|
|
1094
|
-
}
|
|
1095
|
-
else {
|
|
1096
|
-
curr = currObj;
|
|
1097
|
-
}
|
|
1098
|
-
return curr;
|
|
1099
|
-
}
|
|
1100
|
-
isDataCtrl() {
|
|
1101
|
-
return this._dataCtrl;
|
|
1102
|
-
}
|
|
1103
|
-
getDcRef() {
|
|
1104
|
-
let line = this.getDcLineNum();
|
|
1105
|
-
let obj = this._dcTableRefs.get_Item(this.getDcLineNum());
|
|
1106
|
-
let dcId;
|
|
1107
|
-
if (obj === null) {
|
|
1108
|
-
dcId = -2;
|
|
1109
|
-
this._dcTableRefs.set_Item(line, dcId);
|
|
1110
|
-
}
|
|
1111
|
-
else {
|
|
1112
|
-
dcId = obj;
|
|
1113
|
-
}
|
|
1114
|
-
return dcId;
|
|
1115
|
-
}
|
|
1116
|
-
getDcLineNum() {
|
|
1117
|
-
return this.IsRepeatable ? this.Form.DisplayLine : 0;
|
|
1118
|
-
}
|
|
1119
|
-
optionIsValid(option) {
|
|
1120
|
-
let isValid = true;
|
|
1121
|
-
if (this.DataType === StorageAttribute.NUMERIC && option.length > 0 && option.indexOf('0') === -1) {
|
|
1122
|
-
let convertNum = new NUM_TYPE();
|
|
1123
|
-
convertNum.num_4_a_std(option);
|
|
1124
|
-
if (convertNum.num_is_zero()) {
|
|
1125
|
-
isValid = false;
|
|
1126
|
-
}
|
|
1127
|
-
}
|
|
1128
|
-
return isValid;
|
|
1129
|
-
}
|
|
1130
|
-
getOrderedDispList(choiceDispList, line) {
|
|
1131
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1132
|
-
let choiceLayerStr = "";
|
|
1133
|
-
let dispArryList = new List();
|
|
1134
|
-
let layerArryList = new List();
|
|
1135
|
-
let layerProp = this.getProp(PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST);
|
|
1136
|
-
if (layerProp !== null) {
|
|
1137
|
-
choiceLayerStr = yield layerProp.getValue();
|
|
1138
|
-
}
|
|
1139
|
-
if (choiceLayerStr === null || StrUtil.rtrim(choiceLayerStr).length === 0) {
|
|
1140
|
-
choiceLayerStr = "";
|
|
1141
|
-
}
|
|
1142
|
-
if (choiceLayerStr.length > 0 && choiceDispList.length > 0) {
|
|
1143
|
-
let layerList = choiceLayerStr.split(",");
|
|
1144
|
-
let posCopyIndex = -1;
|
|
1145
|
-
for (let index = 0; index < layerList.length; index = index + 1) {
|
|
1146
|
-
let currLayerListVal = layerList[index].trim();
|
|
1147
|
-
if (!(layerArryList.indexOf(currLayerListVal) !== -1)) {
|
|
1148
|
-
let refPosCopyIndex = new RefParam(posCopyIndex);
|
|
1149
|
-
let isNumber = NNumber.TryParse(currLayerListVal, refPosCopyIndex);
|
|
1150
|
-
posCopyIndex = refPosCopyIndex.value;
|
|
1151
|
-
if (isNumber && posCopyIndex > 0 && posCopyIndex <= choiceDispList.length) {
|
|
1152
|
-
dispArryList.push((choiceDispList[posCopyIndex - 1]).trim());
|
|
1153
|
-
layerArryList.push(currLayerListVal);
|
|
1154
|
-
}
|
|
1155
|
-
}
|
|
1156
|
-
}
|
|
1157
|
-
}
|
|
1158
|
-
let result;
|
|
1159
|
-
if (dispArryList.length === 0) {
|
|
1160
|
-
result = choiceDispList;
|
|
1161
|
-
this._choiceLayerList.set_Item(line, new Array(0));
|
|
1162
|
-
}
|
|
1163
|
-
else {
|
|
1164
|
-
result = new Array(dispArryList.length);
|
|
1165
|
-
for (let _ai = 0; _ai < result.length; ++_ai)
|
|
1166
|
-
result[_ai] = null;
|
|
1167
|
-
result = dispArryList.ToArray();
|
|
1168
|
-
this._choiceLayerList.set_Item(line, layerArryList.ToArray());
|
|
1169
|
-
}
|
|
1170
|
-
return result;
|
|
1171
|
-
});
|
|
1172
|
-
}
|
|
1173
|
-
resetPrevVal() {
|
|
1174
|
-
let line = this.getDisplayLine(true);
|
|
1175
|
-
if (line < 0) {
|
|
1176
|
-
line = 0;
|
|
1177
|
-
}
|
|
1178
|
-
this._prevValues.set_Item(line, null);
|
|
1179
|
-
this.setPrevIsNull_ToNull();
|
|
1180
|
-
}
|
|
1181
|
-
setPrevIsNull_ToNull() {
|
|
1182
|
-
this._prevIsNulls.set_Item(this.getDisplayLine(true), null);
|
|
1183
|
-
}
|
|
1184
|
-
expressionSetAsData() {
|
|
1185
|
-
return this._valExpId > 0;
|
|
1186
|
-
}
|
|
1187
|
-
clearRange(line) {
|
|
1188
|
-
this._orgChoiceDisps.set_Item(line, null);
|
|
1189
|
-
this._choiceDisps.set_Item(line, null);
|
|
1190
|
-
this._choiceLinks.set_Item(line, null);
|
|
1191
|
-
this._choiceLayerList.set_Item(line, null);
|
|
1192
|
-
}
|
|
1193
|
-
haveToCheckParentValue() {
|
|
1194
|
-
let ret = false;
|
|
1195
|
-
if (this._linkedParentDitIdx !== -1) {
|
|
1196
|
-
if (!this.isContainedInLinkedParent()) {
|
|
1197
|
-
ret = true;
|
|
1198
|
-
}
|
|
1199
|
-
else {
|
|
1200
|
-
if (this.Form.getCtrl(this._linkedParentDitIdx).isTabControl() || this.Form.getCtrl(this._linkedParentDitIdx).isGroup()) {
|
|
1201
|
-
ret = true;
|
|
1202
|
-
}
|
|
1203
|
-
}
|
|
1204
|
-
}
|
|
1205
|
-
else {
|
|
1206
|
-
if (this.Form.isSubForm()) {
|
|
1207
|
-
ret = true;
|
|
1208
|
-
}
|
|
1209
|
-
}
|
|
1210
|
-
return ret;
|
|
1211
|
-
}
|
|
1212
|
-
isContainedInLinkedParent() {
|
|
1213
|
-
return this._containerDitIdx !== -1 && this._containerDitIdx === this._linkedParentDitIdx;
|
|
1214
|
-
}
|
|
1215
|
-
static combineStringArrays(firstStrings, lastStrings) {
|
|
1216
|
-
let result = new Array();
|
|
1217
|
-
if (firstStrings !== null)
|
|
1218
|
-
result = result.concat(firstStrings);
|
|
1219
|
-
if (lastStrings !== null)
|
|
1220
|
-
result = result.concat(lastStrings);
|
|
1221
|
-
return result;
|
|
1222
|
-
}
|
|
1223
|
-
GetComputedBooleanProperty(propId, defaultRetVal, line) {
|
|
1224
|
-
if (arguments.length === 2 && (propId === null || propId.constructor === Number) && (defaultRetVal === null || defaultRetVal.constructor === Boolean)) {
|
|
1225
|
-
return this.GetComputedBooleanProperty_0(propId, defaultRetVal);
|
|
1226
|
-
}
|
|
1227
|
-
return this.GetComputedBooleanProperty_1(propId, defaultRetVal, line);
|
|
1228
|
-
}
|
|
1229
|
-
GetComputedBooleanProperty_0(propId, defaultRetVal) {
|
|
1230
|
-
let result = defaultRetVal;
|
|
1231
|
-
let prop = this.GetComputedProperty(propId);
|
|
1232
|
-
if (prop !== null) {
|
|
1233
|
-
result = prop.GetComputedValueBoolean();
|
|
1234
|
-
}
|
|
1235
|
-
return result;
|
|
1236
|
-
}
|
|
1237
|
-
GetComputedBooleanProperty_1(propId, defaultRetVal, line) {
|
|
1238
|
-
let result = defaultRetVal;
|
|
1239
|
-
if (this.isPropertyRepeatable(propId) && this.Form.DisplayLine !== line) {
|
|
1240
|
-
let prop = this.GetComputedProperty(propId);
|
|
1241
|
-
if (prop !== null) {
|
|
1242
|
-
let val = prop.getPrevValue(line);
|
|
1243
|
-
if (val !== null) {
|
|
1244
|
-
result = DisplayConvertor.toBoolean(val);
|
|
1245
|
-
}
|
|
1246
|
-
}
|
|
1247
|
-
}
|
|
1248
|
-
else {
|
|
1249
|
-
result = this.GetComputedBooleanProperty(propId, defaultRetVal);
|
|
1250
|
-
}
|
|
1251
|
-
return result;
|
|
1252
|
-
}
|
|
1253
|
-
checkPropWithLine(propId, defaultRetVal, line) {
|
|
1254
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1255
|
-
let result = defaultRetVal;
|
|
1256
|
-
if (this.isPropertyRepeatable(propId) && this.Form.DisplayLine !== line) {
|
|
1257
|
-
let prop = this.getProp(propId);
|
|
1258
|
-
if (prop !== null) {
|
|
1259
|
-
let val = prop.getPrevValue(line);
|
|
1260
|
-
if (val !== null) {
|
|
1261
|
-
result = DisplayConvertor.toBoolean(val);
|
|
1262
|
-
}
|
|
1263
|
-
}
|
|
1264
|
-
}
|
|
1265
|
-
else {
|
|
1266
|
-
result = yield this.checkProp(propId, defaultRetVal);
|
|
1267
|
-
}
|
|
1268
|
-
return result;
|
|
1269
|
-
});
|
|
1270
|
-
}
|
|
1271
|
-
checkProp(propId, defaultRetVal) {
|
|
1272
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1273
|
-
let result = defaultRetVal;
|
|
1274
|
-
let prop = this.getProp(propId);
|
|
1275
|
-
if (prop !== null) {
|
|
1276
|
-
result = yield prop.getValueBoolean();
|
|
1277
|
-
}
|
|
1278
|
-
return result;
|
|
1279
|
-
});
|
|
1280
|
-
}
|
|
1281
|
-
isPropertyRepeatable(propId) {
|
|
1282
|
-
let isRepeatable = this.IsRepeatable;
|
|
1283
|
-
if (isRepeatable) {
|
|
1284
|
-
return true;
|
|
1285
|
-
}
|
|
1286
|
-
else {
|
|
1287
|
-
return super.isTableControl() && Property.isRepeatableInTable(propId);
|
|
1288
|
-
}
|
|
1289
|
-
}
|
|
1290
|
-
SetAndRefreshDisplayValue(mgVal, isNull) {
|
|
1291
|
-
const _super = Object.create(null, {
|
|
1292
|
-
isChoiceControl: { get: () => super.isChoiceControl },
|
|
1293
|
-
isTabControl: { get: () => super.isTabControl },
|
|
1294
|
-
isCheckBox: { get: () => super.isCheckBox },
|
|
1295
|
-
isImageControl: { get: () => super.isImageControl },
|
|
1296
|
-
IsImageButton: { get: () => super.IsImageButton },
|
|
1297
|
-
isSelectionCtrl: { get: () => super.isSelectionCtrl }
|
|
1298
|
-
});
|
|
1299
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1300
|
-
let dcRangeIsEmpty = true;
|
|
1301
|
-
if (mgVal === null) {
|
|
1302
|
-
this.Value = "";
|
|
1303
|
-
if (!isNull)
|
|
1304
|
-
mgVal = FieldDef.getMagicDefaultValue(this.DataType);
|
|
1305
|
-
}
|
|
1306
|
-
else {
|
|
1307
|
-
if (_super.isChoiceControl.call(this)) {
|
|
1308
|
-
let line = this.getDisplayLine(true);
|
|
1309
|
-
if (line < 0) {
|
|
1310
|
-
line = 0;
|
|
1311
|
-
}
|
|
1312
|
-
let layers = this.getLayerFromLinkIdx(yield this.getIndexOfChoice(mgVal, line, isNull));
|
|
1313
|
-
if (layers[0] < 0 && _super.isTabControl.call(this)) {
|
|
1314
|
-
layers[0] = 0;
|
|
1315
|
-
mgVal = yield this.getLinkValue(layers[0].toString(), line);
|
|
1316
|
-
isNull = false;
|
|
1317
|
-
if (this._field !== null && mgVal !== null) {
|
|
1318
|
-
yield this._field.getTask().UpdateFieldValueAndStartRecompute(this._field, mgVal, isNull);
|
|
1319
|
-
}
|
|
1320
|
-
}
|
|
1321
|
-
this.Value = Misc.GetCommaSeperatedString(layers);
|
|
1322
|
-
dcRangeIsEmpty = false;
|
|
1323
|
-
}
|
|
1324
|
-
}
|
|
1325
|
-
if (dcRangeIsEmpty) {
|
|
1326
|
-
if (!_super.isCheckBox.call(this) && (this._field === null || !isNull || !this._field.hasNullDisplayValue())) {
|
|
1327
|
-
try {
|
|
1328
|
-
if ((_super.isImageControl.call(this) && this.DataType === StorageAttribute.BLOB) || _super.IsImageButton.call(this)) {
|
|
1329
|
-
this.Value = mgVal;
|
|
1330
|
-
}
|
|
1331
|
-
else {
|
|
1332
|
-
if ((this._field === null && isNull) && (this.DataType === StorageAttribute.NUMERIC || this.DataType === StorageAttribute.DATE || this.DataType === StorageAttribute.TIME || this.DataType === StorageAttribute.BOOLEAN)) {
|
|
1333
|
-
this.Value = mgVal;
|
|
1334
|
-
}
|
|
1335
|
-
else {
|
|
1336
|
-
let inControl = this.InControl;
|
|
1337
|
-
this.Value = DisplayConvertor.Instance.mg2disp(mgVal, this._range, this._pic, true, _super.isSelectionCtrl.call(this), this.getForm().getTask().getCompIdx(), inControl);
|
|
1338
|
-
}
|
|
1339
|
-
}
|
|
1340
|
-
if (typeof this.Value === 'string' && (!this._pic.isAttrNumeric() || this._pic.isLeft())) {
|
|
1341
|
-
this.rtrimValue();
|
|
1342
|
-
}
|
|
1343
|
-
}
|
|
1344
|
-
catch (innerException) {
|
|
1345
|
-
if (innerException instanceof ApplicationException) {
|
|
1346
|
-
Events.WriteExceptionToLog(new ApplicationException(NString.Format("Control: '{0}', mgval: {1}", this.Name, mgVal), innerException));
|
|
1347
|
-
this.Value = "";
|
|
1348
|
-
mgVal = FieldDef.getMagicDefaultValue(this.DataType);
|
|
1349
|
-
}
|
|
1350
|
-
else
|
|
1351
|
-
throw innerException;
|
|
1352
|
-
}
|
|
1353
|
-
}
|
|
1354
|
-
else {
|
|
1355
|
-
if (this.isCheckBox())
|
|
1356
|
-
this.Value = DisplayConvertor.toBoolean(mgVal);
|
|
1357
|
-
else
|
|
1358
|
-
this.Value = mgVal;
|
|
1359
|
-
}
|
|
1360
|
-
}
|
|
1361
|
-
if ((_super.isImageControl.call(this) && this.DataType !== StorageAttribute.BLOB) || _super.IsImageButton.call(this)) {
|
|
1362
|
-
mgVal = Events.TranslateLogicalName(mgVal);
|
|
1363
|
-
}
|
|
1364
|
-
this.IsNull = isNull;
|
|
1365
|
-
yield this.RefreshDisplayValue(mgVal);
|
|
1366
|
-
});
|
|
1367
|
-
}
|
|
1368
|
-
UpdateModifiedByUser(newValue) {
|
|
1369
|
-
if (!(super.isButton() || super.isImageControl())) {
|
|
1370
|
-
let ctrlCurrIsNull = this.IsNull;
|
|
1371
|
-
let valChanged = (this.isDifferentValue(newValue, false, false));
|
|
1372
|
-
if (!valChanged) {
|
|
1373
|
-
if (this.CanGetNullFromControlValue()) {
|
|
1374
|
-
valChanged = (ctrlCurrIsNull !== this.isNullValue(newValue));
|
|
1375
|
-
}
|
|
1376
|
-
}
|
|
1377
|
-
if (valChanged || this.KeyStrokeOn) {
|
|
1378
|
-
this.ModifiedByUser = true;
|
|
1379
|
-
}
|
|
1380
|
-
}
|
|
1381
|
-
}
|
|
1382
|
-
rtrimValue() {
|
|
1383
|
-
if ((super.isImageControl() && this.DataType === StorageAttribute.BLOB) || super.IsImageButton()) {
|
|
1384
|
-
this.Value = NString.TrimEnd(this.Value);
|
|
1385
|
-
}
|
|
1386
|
-
else {
|
|
1387
|
-
let minimumValueLength = this.getMinimumValueLength();
|
|
1388
|
-
if (this.Value.length > minimumValueLength) {
|
|
1389
|
-
let str = this.Value.substr(minimumValueLength);
|
|
1390
|
-
this.Value = this.Value.substr(0, minimumValueLength);
|
|
1391
|
-
this.Value = this.Value + StrUtil.rtrimWithNull(str, true);
|
|
1392
|
-
}
|
|
1393
|
-
if (super.isTextControl() && this.DataType === StorageAttribute.NUMERIC) {
|
|
1394
|
-
this.Value = NString.TrimEnd(this.Value);
|
|
1395
|
-
}
|
|
1396
|
-
}
|
|
1397
|
-
}
|
|
1398
|
-
getMinimumValueLength() {
|
|
1399
|
-
let minLength = this._pic.getMaskLength();
|
|
1400
|
-
while (minLength > 0 && !this._pic.picIsMask(minLength - 1)) {
|
|
1401
|
-
minLength = minLength - 1;
|
|
1402
|
-
}
|
|
1403
|
-
return minLength;
|
|
1404
|
-
}
|
|
1405
|
-
isNullValue(str) {
|
|
1406
|
-
let retIsNullControl = false;
|
|
1407
|
-
if (this.CanGetNullFromControlValue() && str === "") {
|
|
1408
|
-
retIsNullControl = true;
|
|
1409
|
-
}
|
|
1410
|
-
return retIsNullControl;
|
|
1411
|
-
}
|
|
1412
|
-
CanGetNullFromControlValue() {
|
|
1413
|
-
return false;
|
|
1414
|
-
}
|
|
1415
|
-
isChoiceNull(idx) {
|
|
1416
|
-
let result;
|
|
1417
|
-
if (idx >= 0) {
|
|
1418
|
-
let dcVals = this.getDcVals();
|
|
1419
|
-
return dcVals.isNull(idx);
|
|
1420
|
-
}
|
|
1421
|
-
else {
|
|
1422
|
-
return result;
|
|
1423
|
-
}
|
|
1424
|
-
}
|
|
1425
|
-
ComputeAndRefreshDisplayValue(forceRefresh) {
|
|
1426
|
-
const _super = Object.create(null, {
|
|
1427
|
-
isTableControl: { get: () => super.isTableControl },
|
|
1428
|
-
isColumnControl: { get: () => super.isColumnControl }
|
|
1429
|
-
});
|
|
1430
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1431
|
-
if (forceRefresh) {
|
|
1432
|
-
this.resetPrevVal();
|
|
1433
|
-
}
|
|
1434
|
-
if (this._valExpId > 0) {
|
|
1435
|
-
let wasEvaluated;
|
|
1436
|
-
let refWasEvaluated = new RefParam(wasEvaluated);
|
|
1437
|
-
let retExp = yield this.EvaluateExpression(this._valExpId, this.DataType, this._pic.getSize(), true, StorageAttribute.SKIP, false, refWasEvaluated);
|
|
1438
|
-
wasEvaluated = refWasEvaluated.value;
|
|
1439
|
-
if (wasEvaluated) {
|
|
1440
|
-
yield this.SetAndRefreshDisplayValue(retExp, retExp === null);
|
|
1441
|
-
}
|
|
1442
|
-
}
|
|
1443
|
-
else {
|
|
1444
|
-
if (this._field !== null) {
|
|
1445
|
-
let value = NString.Empty;
|
|
1446
|
-
let isNull = false;
|
|
1447
|
-
let refValue = new RefParam(value);
|
|
1448
|
-
let refIsNull = new RefParam(isNull);
|
|
1449
|
-
this._field.getTask().getFieldDisplayValue(this._field, refValue, refIsNull);
|
|
1450
|
-
value = refValue.value;
|
|
1451
|
-
isNull = refIsNull.value;
|
|
1452
|
-
yield this.SetAndRefreshDisplayValue(value, isNull);
|
|
1453
|
-
}
|
|
1454
|
-
else {
|
|
1455
|
-
if (!_super.isTableControl.call(this) && !_super.isColumnControl.call(this)) {
|
|
1456
|
-
yield this.RefreshDisplayValue(this.Value);
|
|
1457
|
-
}
|
|
1458
|
-
}
|
|
1459
|
-
}
|
|
1460
|
-
});
|
|
1461
|
-
}
|
|
1462
|
-
ShouldRefreshOnControlEnter() {
|
|
1463
|
-
return this.Type === MgControlType.CTRL_TYPE_TEXT && this.getField() !== null && (this.getField().getType() === StorageAttribute.DATE ||
|
|
1464
|
-
this.getField().getType() === StorageAttribute.TIME || this.getField().getType() === StorageAttribute.NUMERIC);
|
|
1465
|
-
}
|
|
1466
|
-
RefreshDisplayValue(mgVal) {
|
|
1467
|
-
const _super = Object.create(null, {
|
|
1468
|
-
isChoiceControl: { get: () => super.isChoiceControl }
|
|
1469
|
-
});
|
|
1470
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1471
|
-
let line = this.getDisplayLine(true);
|
|
1472
|
-
let valueChanged = true;
|
|
1473
|
-
let saveValueChanged = valueChanged;
|
|
1474
|
-
if (line < 0) {
|
|
1475
|
-
line = 0;
|
|
1476
|
-
}
|
|
1477
|
-
try {
|
|
1478
|
-
let prevValue = this._prevValues.get_Item(line);
|
|
1479
|
-
let prevNull = this.getPrevIsNull();
|
|
1480
|
-
if (StorageAttributeCheck.IsTypeAlphaOrUnicode(this.DataType)) {
|
|
1481
|
-
if (StrUtil.rtrim(mgVal) === StrUtil.rtrim(prevValue) ||
|
|
1482
|
-
(mgVal !== null && StrUtil.rtrim(mgVal) === StrUtil.rtrim(prevValue))) {
|
|
1483
|
-
valueChanged = false;
|
|
1484
|
-
}
|
|
1485
|
-
if (prevNull !== this.IsNull) {
|
|
1486
|
-
valueChanged = true;
|
|
1487
|
-
}
|
|
1488
|
-
}
|
|
1489
|
-
else {
|
|
1490
|
-
;
|
|
1491
|
-
if (mgVal === prevValue || (mgVal !== null && mgVal === prevValue))
|
|
1492
|
-
valueChanged = false;
|
|
1493
|
-
if (prevNull !== this.IsNull)
|
|
1494
|
-
valueChanged = true;
|
|
1495
|
-
}
|
|
1496
|
-
this._prevValues.set_Item(line, mgVal);
|
|
1497
|
-
this.setPrevIsNull(this.IsNull);
|
|
1498
|
-
switch (this.Type) {
|
|
1499
|
-
case MgControlType.CTRL_TYPE_TABLE:
|
|
1500
|
-
case MgControlType.CTRL_TYPE_COLUMN:
|
|
1501
|
-
case MgControlType.CTRL_TYPE_LABEL:
|
|
1502
|
-
case MgControlType.CTRL_TYPE_SUBFORM:
|
|
1503
|
-
case MgControlType.CTRL_TYPE_GROUP:
|
|
1504
|
-
case MgControlType.CTRL_TYPE_STATUS_BAR:
|
|
1505
|
-
case MgControlType.CTRL_TYPE_FRAME_SET:
|
|
1506
|
-
case MgControlType.CTRL_TYPE_CONTAINER:
|
|
1507
|
-
case MgControlType.CTRL_TYPE_FRAME_FORM:
|
|
1508
|
-
case MgControlType.CTRL_TYPE_SB_LABEL:
|
|
1509
|
-
case MgControlType.CTRL_TYPE_LINE:
|
|
1510
|
-
return;
|
|
1511
|
-
case MgControlType.CTRL_TYPE_BROWSER:
|
|
1512
|
-
if (valueChanged && this.Value != null)
|
|
1513
|
-
this.setUrl();
|
|
1514
|
-
return;
|
|
1515
|
-
case MgControlType.CTRL_TYPE_IMAGE:
|
|
1516
|
-
case MgControlType.CTRL_TYPE_SB_IMAGE:
|
|
1517
|
-
if (valueChanged && this.Value != null)
|
|
1518
|
-
this.setImage();
|
|
1519
|
-
return;
|
|
1520
|
-
case MgControlType.CTRL_TYPE_CHECKBOX:
|
|
1521
|
-
if (valueChanged || this.forceRefresh)
|
|
1522
|
-
this.setCheckBoxValue(line, mgVal);
|
|
1523
|
-
return;
|
|
1524
|
-
case MgControlType.CTRL_TYPE_TAB:
|
|
1525
|
-
case MgControlType.CTRL_TYPE_COMBO:
|
|
1526
|
-
case MgControlType.CTRL_TYPE_LIST:
|
|
1527
|
-
saveValueChanged = valueChanged;
|
|
1528
|
-
valueChanged = yield this.refreshAndSetItemListByDataSource(line, valueChanged);
|
|
1529
|
-
if (valueChanged) {
|
|
1530
|
-
let prevDisplayValue = null;
|
|
1531
|
-
if (saveValueChanged === valueChanged) {
|
|
1532
|
-
if (prevValue !== null) {
|
|
1533
|
-
prevDisplayValue = this.getLayerFromLinkIdx(yield this.getIndexOfChoice(prevValue, line, prevNull));
|
|
1534
|
-
for (let i = 0; i < prevDisplayValue.length; i = i + 1) {
|
|
1535
|
-
if (prevDisplayValue[i] === GuiConstants.DEFAULT_VALUE_INT) {
|
|
1536
|
-
prevDisplayValue[i] = GuiConstants.DEFAULT_LIST_VALUE;
|
|
1537
|
-
}
|
|
1538
|
-
}
|
|
1539
|
-
}
|
|
1540
|
-
}
|
|
1541
|
-
let indice = Misc.GetIntArray(this.Value);
|
|
1542
|
-
if (this.isTabControl()) {
|
|
1543
|
-
let currentLayer = this.getCurrentLinkIdx();
|
|
1544
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.SelectedValue, indice[0].toString());
|
|
1545
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.SelectedLayer, currentLayer.toString());
|
|
1546
|
-
}
|
|
1547
|
-
if (this.IsMultipleSelectionListBox()) {
|
|
1548
|
-
Commands.addValueWithLine(CommandType.SET_VALUE, this, line, indice);
|
|
1549
|
-
}
|
|
1550
|
-
else
|
|
1551
|
-
Commands.addValueWithLine(CommandType.SET_VALUE, this, line, +this.Value);
|
|
1552
|
-
}
|
|
1553
|
-
break;
|
|
1554
|
-
case MgControlType.CTRL_TYPE_BUTTON:
|
|
1555
|
-
case MgControlType.CTRL_TYPE_TEXT:
|
|
1556
|
-
if (this.HasAutocomplete())
|
|
1557
|
-
yield this.refreshAndSetItemListByDataSource(line, valueChanged);
|
|
1558
|
-
if (valueChanged) {
|
|
1559
|
-
if (this.IsImageButton()) {
|
|
1560
|
-
this.setImageWithFileName(this.Value);
|
|
1561
|
-
}
|
|
1562
|
-
else
|
|
1563
|
-
this.setText();
|
|
1564
|
-
}
|
|
1565
|
-
else
|
|
1566
|
-
return;
|
|
1567
|
-
break;
|
|
1568
|
-
case MgControlType.CTRL_TYPE_RADIO:
|
|
1569
|
-
valueChanged = yield this.refreshAndSetItemListByDataSource(line, valueChanged);
|
|
1570
|
-
if (!valueChanged)
|
|
1571
|
-
return;
|
|
1572
|
-
this.setRadioChecked(this.Value);
|
|
1573
|
-
break;
|
|
1574
|
-
default:
|
|
1575
|
-
Events.WriteExceptionToLog(NString.Format("in Control.RefreshDisplayValue() unknown type: {0}", this.Type));
|
|
1576
|
-
return;
|
|
1577
|
-
}
|
|
1578
|
-
if (_super.isChoiceControl.call(this) && valueChanged)
|
|
1579
|
-
yield this.updatePropertyLogicNesting(PropInterface.PROP_TYPE_VISIBLE, CommandType.PROP_SET_VISIBLE, yield this.checkProp(PropInterface.PROP_TYPE_VISIBLE, true), false);
|
|
1580
|
-
}
|
|
1581
|
-
catch (ex_360) {
|
|
1582
|
-
if (ex_360 instanceof Exception) {
|
|
1583
|
-
Events.WriteExceptionToLog(NString.Format("in Control.RefreshDisplayValue() for control: {0}", this.Name));
|
|
1584
|
-
}
|
|
1585
|
-
else
|
|
1586
|
-
throw ex_360;
|
|
1587
|
-
}
|
|
1588
|
-
});
|
|
1589
|
-
}
|
|
1590
|
-
RefreshDisplay(onlyRepeatableProps) {
|
|
1591
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1592
|
-
if (isNullOrUndefined(onlyRepeatableProps))
|
|
1593
|
-
onlyRepeatableProps = false;
|
|
1594
|
-
yield this.RefreshDisplay_1(onlyRepeatableProps);
|
|
1595
|
-
});
|
|
1596
|
-
}
|
|
1597
|
-
RefreshDisplay_1(onlyRepeatableProps) {
|
|
1598
|
-
const _super = Object.create(null, {
|
|
1599
|
-
isSubform: { get: () => super.isSubform }
|
|
1600
|
-
});
|
|
1601
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1602
|
-
if (!(_super.isSubform.call(this) && this.GetSubformMgForm() !== null && this.GetSubformMgForm().inRefreshDisplay())) {
|
|
1603
|
-
yield this.refreshProperties(onlyRepeatableProps);
|
|
1604
|
-
if (this.ShouldComputeAndRefreshOnClosedForm()) {
|
|
1605
|
-
yield this.ComputeAndRefreshDisplayValue(false);
|
|
1606
|
-
}
|
|
1607
|
-
let isParkableCtrl = !(yield this.isParkable(false)) || !(yield this.isModifiable());
|
|
1608
|
-
if (this.GetCurrReadOnly() !== isParkableCtrl) {
|
|
1609
|
-
this.SetCurrReadOnly(isParkableCtrl);
|
|
1610
|
-
yield Manager.SetReadOnlyControl(this, isParkableCtrl);
|
|
1611
|
-
}
|
|
1612
|
-
let mustInputProperty = this.GetComputedProperty(PropInterface.PROP_TYPE_MUST_INPUT);
|
|
1613
|
-
if (mustInputProperty != null && mustInputProperty.isExpression()) {
|
|
1614
|
-
let prevMustInput = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MUST_INPUT, false);
|
|
1615
|
-
if (prevMustInput !== (yield this.checkProp(PropInterface.PROP_TYPE_MUST_INPUT, false)))
|
|
1616
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.MustInput, !prevMustInput);
|
|
1617
|
-
}
|
|
1618
|
-
if (!this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_TAB_IN, true))
|
|
1619
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.TabIndex, -1);
|
|
1620
|
-
}
|
|
1621
|
-
});
|
|
1622
|
-
}
|
|
1623
|
-
ShouldComputeAndRefreshOnClosedForm() {
|
|
1624
|
-
return true;
|
|
1625
|
-
}
|
|
1626
|
-
refreshProperties(onlyRepeatableProps) {
|
|
1627
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1628
|
-
if (this._field !== null && this.DataType !== StorageAttribute.NONE && this._firstRefreshProperties)
|
|
1629
|
-
Commands.addWithNumber(CommandType.SET_ATTRIBUTE, this, this.DataType.charCodeAt(0));
|
|
1630
|
-
if (this._propTab !== null) {
|
|
1631
|
-
try {
|
|
1632
|
-
if (this._firstRefreshProperties) {
|
|
1633
|
-
this.createDefaultProps();
|
|
1634
|
-
yield this.ZoomButtonInitialization();
|
|
1635
|
-
}
|
|
1636
|
-
if (!(yield this._propTab.RefreshDisplay(false, onlyRepeatableProps))) {
|
|
1637
|
-
Events.WriteExceptionToLog(NString.Format("Control '{0}': Not all properties could be set", this.getName()));
|
|
1638
|
-
}
|
|
1639
|
-
if (this._firstRefreshProperties) {
|
|
1640
|
-
if (!onlyRepeatableProps) {
|
|
1641
|
-
this._firstRefreshProperties = false;
|
|
1642
|
-
}
|
|
1643
|
-
}
|
|
1644
|
-
}
|
|
1645
|
-
catch (ex) {
|
|
1646
|
-
if (ex instanceof Exception) {
|
|
1647
|
-
let msg = new StringBuilder(NString.Format("Control '{0}': {1}", this.getName(), ex.Message));
|
|
1648
|
-
Events.WriteExceptionToLog(msg.ToString());
|
|
1649
|
-
}
|
|
1650
|
-
else
|
|
1651
|
-
throw ex;
|
|
1652
|
-
}
|
|
1653
|
-
}
|
|
1654
|
-
});
|
|
1655
|
-
}
|
|
1656
|
-
refreshTabForLayerList(line) {
|
|
1657
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1658
|
-
let currentLinkValue = null;
|
|
1659
|
-
if (this.getForm().Opened) {
|
|
1660
|
-
let indice = this.getCurrentIndexOfChoice();
|
|
1661
|
-
let currentLayer = indice[0];
|
|
1662
|
-
currentLinkValue = yield this.getLinkValue(currentLayer.toString(), line);
|
|
1663
|
-
}
|
|
1664
|
-
yield this.refreshAndSetItemsList(line, false);
|
|
1665
|
-
if (this.getForm().Opened) {
|
|
1666
|
-
yield this.SetAndRefreshDisplayValue(currentLinkValue, this.IsNull);
|
|
1667
|
-
}
|
|
1668
|
-
});
|
|
1669
|
-
}
|
|
1670
|
-
refreshAndSetItemsListForRadioButton(line, execComputeChoice) {
|
|
1671
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1672
|
-
let displayList = yield this.refreshDispRange(execComputeChoice);
|
|
1673
|
-
let options = displayList.map((displayValue, counter, arr) => {
|
|
1674
|
-
let index = counter.toString();
|
|
1675
|
-
return { index, displayValue };
|
|
1676
|
-
});
|
|
1677
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.ItemsList, options);
|
|
1678
|
-
});
|
|
1679
|
-
}
|
|
1680
|
-
refreshAndSetItemsList(line, execComputeChoice) {
|
|
1681
|
-
const _super = Object.create(null, {
|
|
1682
|
-
isSelectionCtrl: { get: () => super.isSelectionCtrl },
|
|
1683
|
-
isTabControl: { get: () => super.isTabControl },
|
|
1684
|
-
isRadio: { get: () => super.isRadio }
|
|
1685
|
-
});
|
|
1686
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1687
|
-
if (execComputeChoice) {
|
|
1688
|
-
this.clearRange(line);
|
|
1689
|
-
}
|
|
1690
|
-
let optionsStrings = yield this.refreshDispRange(execComputeChoice);
|
|
1691
|
-
if (_super.isSelectionCtrl.call(this) || _super.isTabControl.call(this) || this.HasAutocomplete()) {
|
|
1692
|
-
let options = optionsStrings.map((displayValue, index, arr) => {
|
|
1693
|
-
return { index, displayValue };
|
|
1694
|
-
});
|
|
1695
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.ItemsList, options);
|
|
1696
|
-
}
|
|
1697
|
-
else {
|
|
1698
|
-
if (_super.isRadio.call(this)) {
|
|
1699
|
-
yield this.refreshAndSetItemsListForRadioButton(line, execComputeChoice);
|
|
1700
|
-
}
|
|
1701
|
-
}
|
|
1702
|
-
});
|
|
1703
|
-
}
|
|
1704
|
-
refreshDispRange(execComputeChoice) {
|
|
1705
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1706
|
-
let selectCmd = new Array(0);
|
|
1707
|
-
let line = this.getDisplayLine(true);
|
|
1708
|
-
if (line < 0) {
|
|
1709
|
-
line = 0;
|
|
1710
|
-
}
|
|
1711
|
-
if (this.SupportsDataSource()) {
|
|
1712
|
-
let dataView = this.getForm().getTask().DataView;
|
|
1713
|
-
let dcv = dataView.getDcValues(this._dcValId);
|
|
1714
|
-
let dispVals = yield this.getDispVals(line, execComputeChoice);
|
|
1715
|
-
if (this._hasValidItmAndDispVal) {
|
|
1716
|
-
selectCmd = MgControlBase.combineStringArrays(dispVals, dcv.getDispVals());
|
|
1717
|
-
}
|
|
1718
|
-
}
|
|
1719
|
-
else {
|
|
1720
|
-
selectCmd = yield this.getDispVals(line, execComputeChoice);
|
|
1721
|
-
}
|
|
1722
|
-
this._rangeChanged = true;
|
|
1723
|
-
return yield this.getOrderedDispList(selectCmd, line);
|
|
1724
|
-
});
|
|
1725
|
-
}
|
|
1726
|
-
refreshItmRange(execComputeChoice) {
|
|
1727
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1728
|
-
Debug.Assert(this.SupportsDataSource());
|
|
1729
|
-
let orderedItmList = new Array(0);
|
|
1730
|
-
let line = this.getDisplayLine(false);
|
|
1731
|
-
if (line < 0) {
|
|
1732
|
-
line = 0;
|
|
1733
|
-
}
|
|
1734
|
-
if (execComputeChoice) {
|
|
1735
|
-
yield this.computeChoice(line);
|
|
1736
|
-
}
|
|
1737
|
-
let linkVals = this._choiceLinks.get_Item(line);
|
|
1738
|
-
let dataView = this.getForm().getTask().DataView;
|
|
1739
|
-
let dcv = dataView.getDcValues(this._dcValId);
|
|
1740
|
-
if (this._hasValidItmAndDispVal) {
|
|
1741
|
-
orderedItmList = MgControlBase.combineStringArrays(linkVals, dcv.GetLinkVals());
|
|
1742
|
-
}
|
|
1743
|
-
return yield this.getOrderedDispList(orderedItmList, line);
|
|
1744
|
-
});
|
|
1745
|
-
}
|
|
1746
|
-
GetItemsRange() {
|
|
1747
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1748
|
-
return yield this.refreshItmRange(false);
|
|
1749
|
-
});
|
|
1750
|
-
}
|
|
1751
|
-
GetDisplayRange() {
|
|
1752
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1753
|
-
return yield this.refreshDispRange(false);
|
|
1754
|
-
});
|
|
1755
|
-
}
|
|
1756
|
-
createDefaultProps() {
|
|
1757
|
-
this.getProp(PropInterface.PROP_TYPE_VISIBLE);
|
|
1758
|
-
this.getProp(PropInterface.PROP_TYPE_ENABLED);
|
|
1759
|
-
if (super.isTableControl()) {
|
|
1760
|
-
this.getProp(PropInterface.PROP_TYPE_SCROLL_BAR);
|
|
1761
|
-
}
|
|
1762
|
-
}
|
|
1763
|
-
setLinkedParentIdx(linkedParentDitIdx) {
|
|
1764
|
-
this._linkedParentDitIdx = linkedParentDitIdx;
|
|
1765
|
-
}
|
|
1766
|
-
buildPicture(oldVal, val) {
|
|
1767
|
-
if (super.isTableControl() || super.isColumnControl())
|
|
1768
|
-
return null;
|
|
1769
|
-
if (this._picExpExists) {
|
|
1770
|
-
this._vd = null;
|
|
1771
|
-
}
|
|
1772
|
-
if (this._vd === null) {
|
|
1773
|
-
this._vd = new ValidationDetails(oldVal, val, this._range, this._pic, this);
|
|
1774
|
-
}
|
|
1775
|
-
else {
|
|
1776
|
-
this._vd.setValue(val);
|
|
1777
|
-
this._vd.setOldValue(oldVal);
|
|
1778
|
-
}
|
|
1779
|
-
return this._vd;
|
|
1780
|
-
}
|
|
1781
|
-
isDifferentValue(newValue, isNull, checkNullValue) {
|
|
1782
|
-
let ctrlCurrValue = this.Value;
|
|
1783
|
-
let valChanged = false;
|
|
1784
|
-
if (newValue instanceof Date) {
|
|
1785
|
-
if (this.DataType === StorageAttribute.DATE)
|
|
1786
|
-
valChanged = !this.CompareDate(newValue, ctrlCurrValue);
|
|
1787
|
-
else
|
|
1788
|
-
valChanged = !this.CompareTime(newValue, ctrlCurrValue);
|
|
1789
|
-
}
|
|
1790
|
-
if (typeof newValue === 'boolean' || typeof newValue === 'number') {
|
|
1791
|
-
if (this.isSelectionCtrl() && typeof ctrlCurrValue === 'string') {
|
|
1792
|
-
let newValuestr = newValue.toString();
|
|
1793
|
-
valChanged = (newValuestr !== ctrlCurrValue);
|
|
1794
|
-
}
|
|
1795
|
-
else {
|
|
1796
|
-
valChanged = (newValue !== ctrlCurrValue);
|
|
1797
|
-
}
|
|
1798
|
-
}
|
|
1799
|
-
else {
|
|
1800
|
-
if (this.isSelectionCtrl() && typeof ctrlCurrValue === 'string' && Array.isArray(newValue)) {
|
|
1801
|
-
let newValueStr = newValue.join(',').toString();
|
|
1802
|
-
valChanged = !(StrUtil.rtrim(newValueStr) === StrUtil.rtrim(ctrlCurrValue));
|
|
1803
|
-
}
|
|
1804
|
-
else {
|
|
1805
|
-
let ctrlCurrIsNull = this.IsNull;
|
|
1806
|
-
valChanged = !(StrUtil.rtrim(newValue) === StrUtil.rtrim(ctrlCurrValue));
|
|
1807
|
-
if (!valChanged && checkNullValue) {
|
|
1808
|
-
valChanged = (isNull !== ctrlCurrIsNull);
|
|
1809
|
-
}
|
|
1810
|
-
}
|
|
1811
|
-
}
|
|
1812
|
-
return valChanged;
|
|
1813
|
-
}
|
|
1814
|
-
CompareDate(d1, d2) {
|
|
1815
|
-
let retval;
|
|
1816
|
-
if (d1 === null && d2 === null)
|
|
1817
|
-
retval = true;
|
|
1818
|
-
else if ((d1 === null && d2 !== null) || (d1 !== null && d2 === null))
|
|
1819
|
-
retval = false;
|
|
1820
|
-
else if (d1.getFullYear() === d2.getFullYear()
|
|
1821
|
-
&& d1.getDate() === d2.getDate()
|
|
1822
|
-
&& d1.getMonth() === d2.getMonth())
|
|
1823
|
-
retval = true;
|
|
1824
|
-
return retval;
|
|
1825
|
-
}
|
|
1826
|
-
CompareTime(d1, d2) {
|
|
1827
|
-
let retval;
|
|
1828
|
-
if (d1 === null && d2 === null)
|
|
1829
|
-
retval = true;
|
|
1830
|
-
else if ((d1 === null && d2 !== null) || (d1 !== null && d2 === null))
|
|
1831
|
-
retval = false;
|
|
1832
|
-
else if (d1.getHours() === d2.getHours()
|
|
1833
|
-
&& d1.getMinutes() === d2.getMinutes()
|
|
1834
|
-
&& d1.getSeconds() === d2.getSeconds())
|
|
1835
|
-
retval = true;
|
|
1836
|
-
return retval;
|
|
1837
|
-
}
|
|
1838
|
-
isColumnSortable() {
|
|
1839
|
-
let isSortable = false;
|
|
1840
|
-
if (this.Type === MgControlType.CTRL_TYPE_COLUMN && this._propTab.propExists(PropInterface.PROP_TYPE_SORT_COLUMN)) {
|
|
1841
|
-
isSortable = this.GetComputedProperty(PropInterface.PROP_TYPE_SORT_COLUMN).GetComputedValueBoolean();
|
|
1842
|
-
}
|
|
1843
|
-
return isSortable;
|
|
1844
|
-
}
|
|
1845
|
-
getColumnChildControl() {
|
|
1846
|
-
if (this.Type !== MgControlType.CTRL_TYPE_COLUMN)
|
|
1847
|
-
return null;
|
|
1848
|
-
let linkedControls = this._parentTable.getLinkedControls();
|
|
1849
|
-
return linkedControls.find((control) => (control.getLayer() === this.getLayer() && control.Type !== MgControlType.CTRL_TYPE_COLUMN && !control.IsTableHeaderChild));
|
|
1850
|
-
}
|
|
1851
|
-
getControlNameForHandlerSearch() {
|
|
1852
|
-
let childControl = this.getColumnChildControl();
|
|
1853
|
-
let name;
|
|
1854
|
-
if (childControl !== null) {
|
|
1855
|
-
return childControl.Name;
|
|
1856
|
-
}
|
|
1857
|
-
else
|
|
1858
|
-
return this.Name;
|
|
1859
|
-
}
|
|
1860
|
-
linkCtrl(ctrl) {
|
|
1861
|
-
this._linkedControls.push(ctrl);
|
|
1862
|
-
}
|
|
1863
|
-
removeRefFromField() {
|
|
1864
|
-
if (this._field !== null) {
|
|
1865
|
-
this._field.RemoveControl(this);
|
|
1866
|
-
}
|
|
1867
|
-
}
|
|
1868
|
-
getDitIdx() {
|
|
1869
|
-
return this._ditIdx;
|
|
1870
|
-
}
|
|
1871
|
-
setDcValId(dcValId) {
|
|
1872
|
-
this._dcValId = dcValId;
|
|
1873
|
-
}
|
|
1874
|
-
SetKeyboardLanguage(restoreLang) {
|
|
1875
|
-
Commands.beginInvoke();
|
|
1876
|
-
}
|
|
1877
|
-
Init() {
|
|
1878
|
-
}
|
|
1879
|
-
IsParkable() {
|
|
1880
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1881
|
-
return yield this.isParkable(true);
|
|
1882
|
-
});
|
|
1883
|
-
}
|
|
1884
|
-
HasExpOrParentTaskField() {
|
|
1885
|
-
let task = this.getForm().getTask();
|
|
1886
|
-
return (this.getField() === null || this.getField().getTask() !== task);
|
|
1887
|
-
}
|
|
1888
|
-
isParkable(checkEnabledAndVisible) {
|
|
1889
|
-
const _super = Object.create(null, {
|
|
1890
|
-
isTableControl: { get: () => super.isTableControl },
|
|
1891
|
-
isColumnControl: { get: () => super.isColumnControl },
|
|
1892
|
-
isSubform: { get: () => super.isSubform },
|
|
1893
|
-
isBrowserControl: { get: () => super.isBrowserControl }
|
|
1894
|
-
});
|
|
1895
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1896
|
-
let result;
|
|
1897
|
-
result = !_super.isTableControl.call(this) && !_super.isColumnControl.call(this);
|
|
1898
|
-
let task = this.getForm().getTask();
|
|
1899
|
-
if (result) {
|
|
1900
|
-
result = task.IsInteractive;
|
|
1901
|
-
}
|
|
1902
|
-
if (result && task.DataView.isEmptyDataview() && this._field !== null && this._field.PartOfDataview) {
|
|
1903
|
-
result = false;
|
|
1904
|
-
}
|
|
1905
|
-
if (result) {
|
|
1906
|
-
if (!_super.isSubform.call(this)) {
|
|
1907
|
-
result = ((this._field !== null && this._field.getTask() === task) || this.isButton() || _super.isBrowserControl.call(this));
|
|
1908
|
-
}
|
|
1909
|
-
if (result && checkEnabledAndVisible) {
|
|
1910
|
-
result = (this.isEnabled() && this.isVisible());
|
|
1911
|
-
}
|
|
1912
|
-
if ((result && this._parentTable !== null) && checkEnabledAndVisible) {
|
|
1913
|
-
result = (this._parentTable.GetComputedBooleanProperty(PropInterface.PROP_TYPE_ENABLED, true) && this._parentTable.GetComputedBooleanProperty(PropInterface.PROP_TYPE_VISIBLE, true));
|
|
1914
|
-
}
|
|
1915
|
-
}
|
|
1916
|
-
return result;
|
|
1917
|
-
});
|
|
1918
|
-
}
|
|
1919
|
-
RaiseControlHitOnLeftClickOfMouseDown() {
|
|
1920
|
-
let raiseCtrlHit = false;
|
|
1921
|
-
if (!super.IsHyperTextButton() && !super.isRadio() && !super.isTabControl()) {
|
|
1922
|
-
raiseCtrlHit = true;
|
|
1923
|
-
}
|
|
1924
|
-
return raiseCtrlHit;
|
|
1925
|
-
}
|
|
1926
|
-
GetVarIndex() {
|
|
1927
|
-
return 0;
|
|
1928
|
-
}
|
|
1929
|
-
RaiseControlHitOnMouseDown(leftClickWasPressed) {
|
|
1930
|
-
let raiseCtrlHit = false;
|
|
1931
|
-
if (leftClickWasPressed) {
|
|
1932
|
-
if (this.RaiseControlHitOnLeftClickOfMouseDown()) {
|
|
1933
|
-
raiseCtrlHit = true;
|
|
1934
|
-
}
|
|
1935
|
-
}
|
|
1936
|
-
return raiseCtrlHit;
|
|
1937
|
-
}
|
|
1938
|
-
OnSubformClick() {
|
|
1939
|
-
Manager.EventsManager.addGuiTriggeredEventWithTaskAndCode(this.getForm().getTask(), InternalInterface.MG_ACT_HIT);
|
|
1940
|
-
}
|
|
1941
|
-
GetSubformMgForm() {
|
|
1942
|
-
return null;
|
|
1943
|
-
}
|
|
1944
|
-
PropertyExists(id) {
|
|
1945
|
-
return this._propTab.propExists(id);
|
|
1946
|
-
}
|
|
1947
|
-
toString() {
|
|
1948
|
-
return "{" + this.constructor.name + ": " + MgControlType[this.Type] + "}";
|
|
1949
|
-
}
|
|
1950
|
-
isDateZero(val) {
|
|
1951
|
-
let zeroDate = false;
|
|
1952
|
-
if (val instanceof Date) {
|
|
1953
|
-
if (val.getMonth() === 0 && val.getFullYear() === 0 && val.getDay() === 0)
|
|
1954
|
-
zeroDate = true;
|
|
1955
|
-
}
|
|
1956
|
-
return zeroDate;
|
|
1957
|
-
}
|
|
1958
|
-
IsDefaultRouterOutlet() {
|
|
1959
|
-
return (this.Type === MgControlType.CTRL_TYPE_SUBFORM && this.GetComputedBooleanProperty_0(PropInterface.PROP_TYPE_DEFAULT_OUTLET, false));
|
|
1960
|
-
}
|
|
1961
|
-
IsRouterOutlet() {
|
|
1962
|
-
return (this.Type === MgControlType.CTRL_TYPE_SUBFORM && this.GetComputedBooleanProperty_0(PropInterface.PROP_TYPE_IS_ROUTER_OUTLET, false));
|
|
1963
|
-
}
|
|
1964
|
-
ZoomButtonInitialization() {
|
|
1965
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1966
|
-
if (this.isTextControl() && this.checkIfExistProp(PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL)) {
|
|
1967
|
-
let connectedButton = this.Form.CtrlTab.GetControlByIsn((yield (yield this.getProp(PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL)).getValueInt()));
|
|
1968
|
-
let imageFileName = null;
|
|
1969
|
-
if (connectedButton.IsImageButton() && connectedButton.PropertyExists(PropInterface.PROP_TYPE_IMAGE_FILENAME)) {
|
|
1970
|
-
imageFileName = yield (yield connectedButton.getProp(PropInterface.PROP_TYPE_IMAGE_FILENAME)).getValue();
|
|
1971
|
-
if (!Misc.IsWebUrl(imageFileName))
|
|
1972
|
-
imageFileName = "./assets/images/" + imageFileName;
|
|
1973
|
-
Commands.addOperationWithLine(CommandType.SET_STYLE, this, 0, MagicProperties.ImageFile, imageFileName);
|
|
1974
|
-
}
|
|
1975
|
-
this.ConnectedControl = connectedButton;
|
|
1976
|
-
connectedButton.ConnectedControl = this;
|
|
1977
|
-
}
|
|
1978
|
-
});
|
|
1979
|
-
}
|
|
1980
|
-
}
|
|
1981
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdDb250cm9sQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdDb250cm9sQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsU0FBUyxFQUNULElBQUksRUFDSixPQUFPLEVBQ1AsT0FBTyxFQUNQLFFBQVEsRUFDUixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsSUFBSSxFQUNKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUs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R0FBRyxrQkFBa0IsR0FBRyxhQUFhLENBQUM7b0JBQ3BELFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztpQkFFMUc7Z0JBR0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztnQkFDeEMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzthQUN6QztRQUNILENBQUM7S0FBQTtDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBFeGNlcHRpb24sXHJcbiAgTGlzdCxcclxuICBOTnVtYmVyLFxyXG4gIE5TdHJpbmcsXHJcbiAgUmVmUGFyYW0sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHsgR3VpTWdDb250cm9sIH0gZnJvbSAnLi4vLi4vZ3VpL0d1aU1nQ29udHJvbCc7XHJcbmltcG9ydCB7IFByb3BQYXJlbnRJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9ndWkvUHJvcFBhcmVudEludGVyZmFjZSc7XHJcbmltcG9ydCB7IEd1aUZpZWxkQmFzZSB9IGZyb20gJy4uL2RhdGEvR3VpRmllbGRCYXNlJztcclxuaW1wb3J0IHtcclxuICBDaG9pY2VVdGlscyxcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTWFnaWNQcm9wZXJ0aWVzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTWlzYyxcclxuICBTRVFfMl9TVFIsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdG9yYWdlQXR0cmlidXRlQ2hlY2ssXHJcbiAgU3RyVXRpbCxcclxuICBVdGlsU3RyQnl0ZU1vZGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQgeyBNZ0Zvcm1CYXNlIH0gZnJvbSAnLi9NZ0Zvcm1CYXNlJztcclxuaW1wb3J0IHsgUElDIH0gZnJvbSAnLi9QSUMnO1xyXG5pbXBvcnQgeyBQcm9wVGFibGUgfSBmcm9tICcuL1Byb3BUYWJsZSc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25EZXRhaWxzIH0gZnJvbSAnLi9WYWxpZGF0aW9uRGV0YWlscyc7XHJcbmltcG9ydCB7IEZpZWxkRGVmIH0gZnJvbSAnLi4vZGF0YS9GaWVsZERlZic7XHJcbmltcG9ydCB7IFByb3BlcnR5IH0gZnJvbSAnLi9Qcm9wZXJ0eSc7XHJcbmltcG9ydCB7IEd1aVRhc2tCYXNlIH0gZnJvbSAnLi4vdGFza3MvR3VpVGFza0Jhc2UnO1xyXG5pbXBvcnQgeyBNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vTWFuYWdlcic7XHJcbmltcG9ydCB7IENvbW1hbmRUeXBlLCBIdG1sUHJvcGVydGllcyB9IGZyb20gJy4uLy4uL0d1aUVudW1zJztcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICcuLi8uLi9Db21tYW5kcyc7XHJcbmltcG9ydCB7IE5VTV9UWVBFIH0gZnJvbSAnLi4vZGF0YS9OVU1fVFlQRSc7XHJcbmltcG9ydCB7IFByb3BJbnRlcmZhY2UgfSBmcm9tICcuL1Byb3BJbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBFdmVudHMgfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQgeyBEY1ZhbHVlcywgRU1QVFlfRENSRUYgfSBmcm9tICcuLi9kYXRhL0RjVmFsdWVzJztcclxuaW1wb3J0IHsgR3VpRGF0YVZpZXdCYXNlIH0gZnJvbSAnLi4vZGF0YS9HdWlEYXRhVmlld0Jhc2UnO1xyXG5pbXBvcnQgeyBEaXNwbGF5Q29udmVydG9yIH0gZnJvbSAnLi9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHsgQmxvYlR5cGUgfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHsgVmVjdG9yVHlwZSB9IGZyb20gJy4uL2RhdGEvVmVjdG9yVHlwZSc7XHJcbmltcG9ydCB7IE9iamVjdFJlZmVyZW5jZSB9IGZyb20gJy4uLy4uL3V0aWwvT2JqZWN0UmVmZXJlbmNlJztcclxuaW1wb3J0IHsgR3VpQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICd1dGlsJztcclxuaW1wb3J0IHsgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB9IGZyb20gJy4vR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcic7XHJcbmltcG9ydCB7IEZvY3VzTWFuYWdlciB9IGZyb20gJy4uLy4uL0ZvY3VzTWFuYWdlcic7XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBkYXRhIGZvciA8Y29udHJvbD4gLi4uPC9jb250cm9sPiB0YWdcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1nQ29udHJvbEJhc2UgZXh0ZW5kcyBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIGltcGxlbWVudHMgUHJvcFBhcmVudEludGVyZmFjZSB7XHJcblxyXG4gIC8vIGZpeGVkIGRlZmVjdCAjOjgxNDk4LCB3aGlsZSBSVCBpcyBzZXQgZGVmYXVsdCB2YWx1ZSB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGNvbnRyb2xcclxuICAvLyB0byB0aGUgdmFsdWUgd2lsbCBzZXQgdG8gdGhlIGNvbnRyb2xcclxuXHJcbiAgX2RpdElkeDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9saW5rZWRDb250cm9sczogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7IC8vIGFycmF5IG9mIGNvbnRyb2xzIHRoYXQgYXJlIGxpbmtlZCB0byB0aGlzIGNvbnRyb2xcclxuICBfZmllbGQ6IEd1aUZpZWxkQmFzZSA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgb2YgdGhlIGNvbnRyb2xcclxuICBfbm9kZUlkRmllbGQ6IEd1aUZpZWxkQmFzZSA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgb2YgdGhlIG5vZGUgaWRcclxuICBfbm9kZVBhcmVudElkRmllbGQ6IEd1aUZpZWxkQmFzZSA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgb2YgdGhlIHBhcmVudCBub2RlIGlkXHJcbiAgcHJpdmF0ZSBfcGljU3RyOiBzdHJpbmcgPSBudWxsO1xyXG4gIF9jaG9pY2VEaXNwczogTGlzdDxzdHJpbmdbXT4gPSBudWxsOyAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCBob2xkcyB0aGVcclxuICBfY2hvaWNlTGF5ZXJMaXN0OiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7IC8vIHRoZSBvcmRlciBvbiB3aGljaCB0YWJzIHRvIGJlIGRpc3BsYXllZFxyXG4gIF9jaG9pY2VMaW5rczogTGlzdDxzdHJpbmdbXT4gPSBudWxsOyAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCBob2xkcyB0aGVcclxuICBfY2hvaWNlTnVtczogTGlzdDxOVU1fVFlQRVtdPiA9IG51bGw7ICAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCB3aXRoIG51bWVyaWNcclxuICBwcml2YXRlIF9jb250YWluZXJEaXRJZHg6IG51bWJlciA9IC0xO1xyXG4gIF9jdXJyUmVhZE9ubHk6IExpc3Q8Ym9vbGVhbj4gPSBudWxsOyAvLyBhIGhpc3RvcnkgYXJyYXkgZm9yIHJlYWRvbmx5IHBhcmFtXHJcbiAgcHJpdmF0ZSBfZGF0YUN0cmw6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVGhlIGRhdGEgY29udHJvbCBmbGFnIHN0YXRlcyB0aGF0IHRoaXNcclxuICBfZGNUYWJsZVJlZnM6IExpc3Q8bnVtYmVyPiA9IG51bGw7IC8vIHJlZmVyZW5jZXMgdG8gZGNWYWxzIGZvciBlYWNoIGxpbmUgb2YgYSBjb250cm9sIGlzIGEgZGF0YSBjb250cm9sXHJcbiAgcHJpdmF0ZSBfZmlyc3RSZWZyZXNoUHJvcGVydGllczogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfZm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaGFzVmFsaWRJdG1BbmREaXNwVmFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaWQ6IG51bWJlciA9IC0xOyAvLyBDb250cm9sSXNuIG9mIHRoZSBjb250cm9sIChmb3Igc3ViZm9ybSlcclxuICBwcml2YXRlIF9jb250cm9sSXNuOiBudW1iZXIgPSAtMTsgLy8gZm9yIGN1cnJlbnQgaXNuXHJcblxyXG4gIHByaXZhdGUgX2xpbmtlZFBhcmVudERpdElkeDogbnVtYmVyID0gLTE7IC8vIG5vdCB0cmlnZ2VyIGFueSBldmVudCBoYW5kbGVyLCB3aGlsZSBwYXJraW5nIGluIHRoaXMgY29udHJvbFxyXG4gIF9vcmdDaG9pY2VEaXNwczogTGlzdDxzdHJpbmdbXT4gPSBudWxsOyAvLyBmb3IgVEFCIENvbnRyb2wgc2F2ZSB0aGUgb3JnIG9wdGlvbiAod2l0aCB0aGUgJilcclxuICBfcGFyZW50VGFibGU6IE1nQ29udHJvbEJhc2UgPSBudWxsOyAvLyByZWZlcmVuY2UgdG8gcGFyZW50IE1hZ2ljIFRhYmxlIGZvclxyXG4gIF9waWM6IFBJQyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGljRXhwRXhpc3RzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgX3ByZXZJc051bGxzOiBMaXN0PGJvb2xlYW4+ID0gbnVsbDsgLy8gZm9yIE5VTExcclxuICBwcml2YXRlIF9wcmV2UGljRXhwUmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gIF9wcmV2VmFsdWVzOiBMaXN0PHN0cmluZz4gPSBudWxsOyAvLyByZWZlcmVuY2VzIHRvIHByZXZpb3VzIHZhbHVlcyBvZiB0aGVcclxuICBfcHJvcFRhYjogUHJvcFRhYmxlID0gbnVsbDtcclxuICBwcml2YXRlIF9yYW5nZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9yYW5nZUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gZm9yIFNFTEVDVCBjb250cm9scywgdHJ1ZSBpZiB0aGVpciByYW5nZVxyXG4gIHByaXZhdGUgX3J0ZlZhbDogc3RyaW5nID0gTlN0cmluZy5FbXB0eTsgLy8gZmllbGQgdG8gc3RvcmUgdGhlIHJ0ZiB0ZXh0IG9mIHJpY2ggZWRpdCBjb250cm9sXHJcbiAgX3ZhbEV4cElkOiBudW1iZXIgPSAwOyAvLyByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIGV4cHJlc3Npb25cclxuICBwcml2YXRlIF92ZDogVmFsaWRhdGlvbkRldGFpbHMgPSBudWxsO1xyXG4gIHByaXZhdGUgX2RjVmFsSWQ6IG51bWJlciA9IC0yO1xyXG4gIHBhcmVudDogbnVtYmVyID0gMDtcclxuICB2ZWVJbmR4OiBudW1iZXIgPSAwO1xyXG4gIEROT2JqZWN0UmVmZXJlbmNlRmllbGQ6IEZpZWxkRGVmID0gbnVsbDtcclxuICBTb3VyY2VUYWJsZVJlZmVyZW5jZTogT2JqZWN0UmVmZXJlbmNlID0gbnVsbDtcclxuICBDbGlwQm9hcmREYXRhRXhpc3RzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgRGF0YVR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBTdG9yYWdlQXR0cmlidXRlLk5PTkU7XHJcbiAgS2V5U3Ryb2tlT246IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSBpZiB0aGUgdXNlciBwcmVzc2VkIGEga2V5XHJcbiAgTW9kaWZpZWRCeVVzZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBWYWx1ZTogYW55ID0gbnVsbDtcclxuICBJc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb3JjZVJlZnJlc2ggOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNNb2RhbCA6IGJvb2xlYW47IC8vYXBwbGljYWJsZSBmb3Igc3ViZm9ybSwgaWYgc3ViZm9ybSBpcyBNb2RhbFxyXG5cclxuICBwcm90ZWN0ZWQgc2V0IEZvcm0odmFsdWU6IE1nRm9ybUJhc2UpIHtcclxuICAgIHRoaXMuX2Zvcm0gPSB2YWx1ZTtcclxuICAgIHRoaXMuR3VpTWdGb3JtID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9ybTtcclxuICB9XHJcblxyXG4gIGdldCBJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IENvbnRyb2xJc24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250cm9sSXNuO1xyXG4gIH1cclxuXHJcbiAgUmVmcmVzaE9uVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlLCBpZiB0aGUgc3ViZm9ybSBtdXN0IGJlIHJlZnJlc2hlZCBvbiBiZWNvbWUgdmlzaWJsZVxyXG4gIEluQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFZhbGlkYXRlQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFByb21wdEhlbHA6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vIHRoZSBwcm9tcHQgaGVscCB0ZXh0IGFzc2lnbmVkIHRvIGNvbnRyb2xcclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3Rvcih0eXBlOiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm06IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik7XHJcbiAgY29uc3RydWN0b3IodHlwZT86IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybT86IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2w/OiBudW1iZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHR5cGUsIHBhcmVudE1nRm9ybSwgcGFyZW50Q29udHJvbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9saW5rZWRDb250cm9scyA9IG5ldyBMaXN0PE1nQ29udHJvbEJhc2U+KCk7XHJcbiAgICB0aGlzLkRhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgIHRoaXMuaW5pdFJlZmVyZW5jZXMocGFyZW50TWdGb3JtKTtcclxuICAgIHRoaXMuVHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLl9jb250YWluZXJEaXRJZHggPSBwYXJlbnRDb250cm9sO1xyXG4gICAgdGhpcy5fbGlua2VkUGFyZW50RGl0SWR4ID0gcGFyZW50Q29udHJvbDtcclxuICAgIHRoaXMuX3Byb3BUYWIgPSBuZXcgUHJvcFRhYmxlKHRoaXMpO1xyXG4gICAgdGhpcy5jcmVhdGVBcnJheXMoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFVuaXF1ZU5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVGFza1RhZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuRm9ybS5nZXRUYXNrKCkuZ2V0VGFza1RhZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGNoZWNrSWZFeGlzdFByb3AocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBleGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpIHtcclxuICAgICAgbGV0IHByb3BCeUlkOiBQcm9wZXJ0eSA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgICAgZXhpc3QgPSAocHJvcEJ5SWQgIT09IG51bGwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGV4aXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBJZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIGdldFByb3AocHJvcElkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICAgIGlmIChwcm9wID09PSBudWxsKSB7XHJcbiAgICAgICAgcHJvcCA9IFByb3BlcnR5LmdldERlZmF1bHRQcm9wKHByb3BJZCwgJ0MnLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QgdGhlbiBjcmVhdGUgYSBuZXcgcHJvcGVydHkgYW5kIGdpdmUgaXQgdGhlIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICAvLyBpbiBhZGRpdGlvbiBhZGQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgcHJvcGVydGllcyB0YWJsZVxyXG4gICAgICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLl9wcm9wVGFiLmFkZFByb3AocHJvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBmb3JtIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q29tcElkeCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBmaXJzdCByZWZyZXNoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIElzRmlyc3RSZWZyZXNoT2ZQcm9wcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4cElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW5ndGhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlVW5pY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzQ2VsbFR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImFsd2F5c0V2YWx1YXRlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ3YXNFdmFsdWF0ZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRXZhbHVhdGVFeHByZXNzaW9uKGV4cElkOiBudW1iZXIsIHJlc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGxlbmd0aDogbnVtYmVyLCBjb250ZW50VHlwZVVuaWNvZGU6IGJvb2xlYW4sIHJlc0NlbGxUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBhbHdheXNFdmFsdWF0ZTogYm9vbGVhbiwgd2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkV2YWx1YXRlRXhwcmVzc2lvbihleHBJZCwgcmVzVHlwZSwgbGVuZ3RoLCBjb250ZW50VHlwZVVuaWNvZGUsIHJlc0NlbGxUeXBlLCBhbHdheXNFdmFsdWF0ZSwgd2FzRXZhbHVhdGVkKTtcclxuICB9XHJcblxyXG4gIEdldEV4cHJlc3Npb25TdG9yYWdlKGV4cElkOiBudW1iZXIpOiBTdG9yYWdlQXR0cmlidXRlIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbCB0aGF0IGFscmVhZHkgd2FzIGNvbXB1dGVkXHJcbiAgLy8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNyZWF0ZSBhIHByb3BlcnR5IGlmIGl0IGlzbid0IGV4aXN0LlxyXG4gIC8vLyBNYXkgd2UgbmVlZCB0byBjcmVhdGUgYSBwcm9wZXJ0eSBhbmQgdXNlIGl0cyBkZWZhdWx0IHZhbHVlLlxyXG4gIC8vLyBJbiBQaGFzZSAyIGluIFJlZnJlc2hQcm9wZXJ0aWVzIG1ldGhvZCB3ZSdsbCBjcmVhdGUgYW5kIGNvbXB1dGUgcHJvcGVydGllcyxcclxuICAvLy8gcGVyaGFwcyB3ZSBuZWVkIGNyZWF0ZSBhbGwgcHJvcGVydGllcyBub3Qgb25seSB0aG9zZSB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgSWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBHZXRDb21wdXRlZFByb3BlcnR5KHByb3BJZDogbnVtYmVyKTogUHJvcGVydHkge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbClcclxuICAgICAgcHJvcCA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgIHJldHVybiBwcm9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluaXRpYWxpemluZyBvZiBpbm5lciByZWZlcmVuY2UgdG8gdGhlIHRhc2sgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPnJlZmVyZW5jZSB0byB0aGUgdGFzayBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0UmVmZXJlbmNlcyhtZ0Zvcm06IE1nRm9ybUJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuRm9ybSA9IG1nRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbiB0aGUgZmlyc3QgdGltZSB0aGF0IHdlIHJlZnJlc2ggdGhlIGNvbnRyb2wgbmVlZCB0byBjcmVhdGUgYXJyYXlzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlQ3JlYXRlQXJyYXlzXCI+Y3JlYXRlIGFycmF5cyBpbiBhbnkgY2FzZTwvcGFyYW0+XHJcbiAgY3JlYXRlQXJyYXlzKGZvcmNlQ3JlYXRlQXJyYXlzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcyB8fCBmb3JjZUNyZWF0ZUFycmF5cykge1xyXG5cclxuICAgICAgLy8gZm9yIFNFTEVDVCBjb250cm9scywgYWx3YXlzIGluaXRpYWxpemUgREMgdGFibGUgc2luY2Ugd2UgdXNlIGl0IHRvIG1lcmdlIGNob2ljZXMgZnJvbSB0aGVcclxuICAgICAgLy8gcHJvcCBsaXN0IHdpdGggY2hvaWNlcyBmcm9tIHRoZSBEQVRBIENPTlRST0wuXHJcbiAgICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKSB7XHJcbiAgICAgICAgdGhpcy5fZGNUYWJsZVJlZnMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZXMgPSBuZXcgTGlzdCgpO1xyXG5cclxuICAgICAgLy8gVGhlIHByb3BlcnR5IFBST1BfU0VUX1JFQURfT05MWSBpcyBzZXQgb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEJ5IGRlZmF1bHRcclxuICAgICAgLy8gdGhpcyBwcm9wZXJ0eSBpcyBmYWxzZSwgc28gd2UgZG8gbm90IHNldCBpdC5cclxuICAgICAgLy8gQnV0IGZvciB0aGUgcGhhbnRvbSB0YXNrIGlmIHRoaXMgcHJvcGVydHkgd2FzIHRydWUsIGFuZCB3ZSBleGl0IHRoZSBwaGFudG9tIGFuZCBhZ2FpbiBlbnRlciBpbnRvXHJcbiAgICAgIC8vIHRoaXMgcGhhbnRvbSB0aGUgcHJvcGVydHkgYmVjb21lcyBmYWxzZS5cclxuICAgICAgLy8gU28gd2UgbmVlZCB0byBzYXZlIHRoZSBwcmV2aW91cyBfY3VyclJlYWRPbmx5IHZhbHVlIGZvciB0aGUgcGhhbnRvbSB0YXNrLlxyXG4gICAgICBpZiAoIWZvcmNlQ3JlYXRlQXJyYXlzKSB7XHJcbiAgICAgICAgdGhpcy5fY3VyclJlYWRPbmx5ID0gbmV3IExpc3QoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9jaG9pY2VEaXNwcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTGlua3MgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9jaG9pY2VOdW1zID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fcHJldklzTnVsbHMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9jaG9pY2VMYXllckxpc3QgPSBuZXcgTGlzdCgpO1xyXG4gICAgICBpZiAoIXRoaXMuSXNSZXBlYXRhYmxlICYmICFzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBcnJheXMoMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBjb250cm9sIGFuZCByZWZyZXNoZXMgcHJvbXB0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPkNvbnRyb2wgdG8gaGF2ZSBmb2N1czwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPmxpbmUgbnVtYmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWZyZXNoUHJvbXB0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhY3RpdmF0ZUZvcm1cIj53aGV0aGVyIHRvIGFjdGl2YXRlIGEgZm9ybSBhZnRlciBzZXRmb2N1cyBvciBub3Q8L3BhcmFtPlxyXG4gIGFzeW5jIFNldEZvY3VzKGN0cmw6IE1nQ29udHJvbEJhc2UsIGxpbmU6IG51bWJlciwgcmVmcmVzaFByb21wdDogYm9vbGVhbiwgYWN0aXZhdGVGb3JtOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLCBjdHJsLCBsaW5lLCBhY3RpdmF0ZUZvcm0pO1xyXG4gIH1cclxuXHJcbiAgSW5zZXJ0QXJyYXlzKGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLkluc2VydFJhbmdlKGlkeCwgbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5JbnNlcnRSYW5nZShpZHgsIG5ldyBBcnJheShjb3VudCkpO1xyXG5cclxuICAgIHRoaXMuX2N1cnJSZWFkT25seS5JbnNlcnRSYW5nZShpZHgsIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuSW5zZXJ0UmFuZ2UoaWR4LCBuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLkluc2VydFJhbmdlKGlkeCwgbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5JbnNlcnRSYW5nZShpZHgsIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0Lkluc2VydFJhbmdlKGlkeCwgbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VOdW1zLkluc2VydFJhbmdlKGlkeCwgbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSlcclxuICAgICAgdGhpcy5fZGNUYWJsZVJlZnMuSW5zZXJ0UmFuZ2UoaWR4LCBuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX3Byb3BUYWIuSW5zZXJ0UHJldlZhbHVlQXJyYXkoaWR4LCBjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIGFycmF5J3Mgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIG5ld1NpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3U2l6ZVwiPjwvcGFyYW0+XHJcbiAgdXBkYXRlQXJyYXlzKG5ld1NpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fcHJldklzTnVsbHMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2N1cnJSZWFkT25seS5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VOdW1zLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICB0aGlzLl9kY1RhYmxlUmVmcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcHJvcFRhYi51cGRhdGVQcmV2VmFsdWVBcnJheShuZXdTaXplKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1NpemVcIj48L3BhcmFtPlxyXG4gIHVwZGF0ZVByZXZWYWxBcnJheXMobmV3U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9wVGFiLnVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUbyBwYXJzZSBpbnB1dCBzdHJpbmcgYW5kIGZpbGwgaW5uZXIgZGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+dG8gcGFyZW50IHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGl0aWR4XCI+bnVtYmVyIG9mIHRoZSBDb250cm9sIGluIENvbnRyb2wgVGFibGU8L3BhcmFtPlxyXG4gIGZpbGxEYXRhKG1nRm9ybTogTWdGb3JtQmFzZSwgZGl0SWR4OiBudW1iZXIsIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5Gb3JtID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuaW5pdFJlZmVyZW5jZXMobWdGb3JtKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2RpdElkeCA9IGRpdElkeDtcclxuICAgIHdoaWxlICh0aGlzLmluaXRJbm5lck9iamVjdHMocGFyc2VyLmdldE5leHRUYWcoKSwgcGFyc2VyKSkge1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZSBkYXRhdHlwZSBpcyBCTE9CLCBpdHMgcGljdHVyZSB3b3VsZCBiZSBibGFuay4gQnV0IGFmdGVyIHZlcnNpb24gIzk3XHJcbiAgICAvLyBvZiBBcHBTZXJpYWxpemVyLmNzIChjaGFuZ2VkIGZvciAjNDg1NzIyKSwgYmxhbmsgcGljdHVyZSBpcyBub3Qgc2VyaWFsaXplZC5cclxuICAgIC8vIFNvLCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGl0IHRvIGJsYW5rIGhlcmUuXHJcbiAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CICYmIHRoaXMuX3BpY1N0ciA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9waWNTdHIgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3BpY1N0ciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5EYXRhVHlwZSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICB0aGlzLnNldFBJQyh0aGlzLl9waWNTdHIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcblxyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLlR5cGUpIHtcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTjpcclxuICAgICAgICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5PTkUpXHJcbiAgICAgICAgICAgIHRoaXMuRGF0YVR5cGUgPSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9HUk9VUDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX1NFVDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX0ZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT05UQUlORVI6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSU5FOlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gQ29udHJvbC5maWxsRGF0YSgpOiBtaXNzaW5nIGRhdGF0eXBlIG9yIHBpY3R1cmUgc3RyaW5nIGZvciBjb250cm9sOiB7MH1cIiwgdGhpcy5OYW1lKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgIHRoaXMuRm9ybS5zZXRUYWJsZUN0cmwodGhpcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNyZWF0ZUFycmF5cyhmYWxzZSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUbyBhbGxvY2F0ZSBhbmQgZmlsbCBpbm5lciBvYmplY3RzIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj5uYW1lIG9mIHRhZywgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIGlmIG5leHQgdGFnIGlzIGlubmVyIHRhZzwvcmV0dXJucz5cclxuICBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nLCBwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApIHtcclxuICAgICAgaWYgKHRoaXMuX3Byb3BUYWIgPT09IG51bGwpXHJcbiAgICAgICAgdGhpcy5fcHJvcFRhYiA9IG5ldyBQcm9wVGFibGUodGhpcyk7XHJcblxyXG4gICAgICB0aGlzLl9wcm9wVGFiLmZpbGxEYXRhKHRoaXMsICdDJywgcGFyc2VyKTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTClcclxuICAgICAgdGhpcy5wYXJzZUF0dHJpYnV0ZXMocGFyc2VyKTtcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gXCJTb3VyY2VUYWJsZVwiKVxyXG4gICAgICB0aGlzLlBhcnNlU291cmNlVGFibGUocGFyc2VyKTtcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gXCIvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBDb250cm9sLiBJbnNlcnQgZWxzZSBpZiB0byBDb250cm9sLmluaXRJbm5lck9iamVjdHMgZm9yIHswfVwiLCBmb3VuZFRhZ05hbWUpKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBQYXJzZVNvdXJjZVRhYmxlKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICBsZXQgb2JqUmVmU3RyOiBzdHJpbmcgPSBwYXJzZXIuUmVhZFRvRW5kT2ZDdXJyZW50RWxlbWVudCgpO1xyXG4gICAgbGV0IHNvdXJjZVRhYmxlUmVmZXJlbmNlOiBPYmplY3RSZWZlcmVuY2UgPSBPYmplY3RSZWZlcmVuY2UuRnJvbVhNTChvYmpSZWZTdHIudHJpbSgpKTtcclxuXHJcbiAgICB0aGlzLlNvdXJjZVRhYmxlUmVmZXJlbmNlID0gc291cmNlVGFibGVSZWZlcmVuY2U7XHJcbiAgICAvLyBTa2lwIHRoZSBjbG9zaW5nIDwvcHJvcD4gdGFnXHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBjb250cm9sIGZyb20gdGhlIFhNTFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBwYXJzZUF0dHJpYnV0ZXMocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoXCI+XCIsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG5cclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkgKyBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnM6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKS8qJ1wiJyovO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkgPSBpICsgMikge1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShpKTtcclxuICAgICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShpICsgMSk7XHJcblxyXG4gICAgICAgIHRoaXMuU2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgICB9XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIDEpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJpbiBDb250cm9sLkZpbGxOYW1lKCkgb3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCB0aGUgY29udHJvbCBhdHRyaWJ1dGVzIGluIHBhcnNpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFnUHJvY2Vzc2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1RZUEU6XHJcbiAgICAgICAgdGhpcy5UeXBlID0gdmFsdWVTdHJbMF0gYXMgTWdDb250cm9sVHlwZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9EQVRBX0NUUkw6XHJcbiAgICAgICAgdGhpcy5fZGF0YUN0cmwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTElOS0VEX1BBUkVOVDpcclxuICAgICAgICB0aGlzLnNldExpbmtlZFBhcmVudElkeChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ09OVEFJTkVSOlxyXG4gICAgICAgIHRoaXMuc2V0Q29udGFpbmVyKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICB0aGlzLl9pZCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NPTlRST0xfSVNOOlxyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xJc24gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU19NT0RBTDpcclxuICAgICAgICB0aGlzLl9pc01vZGFsID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NPTlRST0xfWl9PUkRFUjpcclxuICAgICAgICAvL1RPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0hPUl9BTElHTUVOVF9JU19JTkhFUklURUQ6XHJcbiAgICAgICAgLy9UT0RPIC0gbm90IHRvIHNlcmlhbGl6ZSBbU3RvcnkgMTU0NTQ3XVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlzVGFnUHJvY2Vzc2VkID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzVGFnUHJvY2Vzc2VkO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gc2V0IHRoZSBpbWFnZSBvbiB0aGUgY29udHJvbCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmlsZU5hbWVcIj48L3BhcmFtPlxyXG4gIHNldEltYWdlKCk6IHZvaWQge1xyXG4gICAgbGV0IG5ld1ZhbDogc3RyaW5nID0gdGhpcy5WYWx1ZTtcclxuICAgIGlmIChuZXdWYWwgPT09IG51bGwgfHwgdGhpcy5Jc051bGwpIHtcclxuICAgICAgbmV3VmFsID0gXCJcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHtcclxuICAgICAgLy8gVE9ETyAtIGNoZWNrIGlmIHNob3VsZCBiZSBzdXBwb3J0ZWQgLlxyXG4gICAgICAvLyBDb21tYW5kcy5hZGRBc3luYyhDb21tYW5kVHlwZS5QUk9QX1NFVF9JTUFHRV9EQVRBLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgQmxvYlR5cGUuZ2V0Qnl0ZXMobmV3VmFsKSwgcHJvcC5nZXRWYWx1ZUludCgpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNldEltYWdlV2l0aEZpbGVOYW1lKG5ld1ZhbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRJbWFnZVdpdGhGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZmlsZU5hbWUgPT09IG51bGwpIHtcclxuICAgICAgZmlsZU5hbWUgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgZmlsZU5hbWUgPSBFdmVudHMuVHJhbnNsYXRlTG9naWNhbE5hbWUoZmlsZU5hbWUpO1xyXG5cclxuICAgIGlmICghTWlzYy5Jc1dlYlVybChmaWxlTmFtZSkpXHJcbiAgICAgIGZpbGVOYW1lID0gXCIuL2Fzc2V0cy9pbWFnZXMvXCIgKyBmaWxlTmFtZTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1NUWUxFLCB0aGlzLCAwLCBNYWdpY1Byb3BlcnRpZXMuSW1hZ2VGaWxlLCBmaWxlTmFtZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuSW1hZ2UsIGZpbGVOYW1lKTtcclxuICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBmaWxlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSBsYXlvdXQgb25seSBpZiB0aGUgcmFkaW8gaXMgbm90IG9uIHRhYmxlLiBmb3IgdGFibGUsIGl0IGlzIGRvbmVcclxuICAgIC8vIGZyb20gTGdSYWRpb0NvbnRhaW5lci5zZXRTcGVjaWZpY0NvbnRyb2xQcm9wZXJ0aWVzKCkuXHJcblxyXG4gICAgLy8gaWYgKHN1cGVyLmlzUmFkaW8oKSAmJiAhdGhpcy5Jc1JlcGVhdGFibGUpIHtcclxuICAgIC8vICAgQ29tbWFuZHMuYWRkQXN5bmMoQ29tbWFuZFR5cGUuRVhFQ1VURV9MQVlPVVQsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBmYWxzZSk7XHJcbiAgICAvL31cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgY29udGFpbmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbnRhaW5lcklkeFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRDb250YWluZXIoY29udGFpbmVySWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbnRhaW5lckRpdElkeCA9IGNvbnRhaW5lcklkeDtcclxuICAgIGxldCBjb250YWluZXI6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lckRpdElkeCAhPT0gLTEpIHtcclxuICAgICAgY29udGFpbmVyID0gdGhpcy5Gb3JtLmdldEN0cmwodGhpcy5fY29udGFpbmVyRGl0SWR4KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29udGFpbmVyICE9PSBudWxsICYmIGNvbnRhaW5lci5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSkge1xyXG4gICAgICB0aGlzLl9wYXJlbnRUYWJsZSA9IGNvbnRhaW5lcjtcclxuICAgIH1cclxuICAgIHRoaXMuSXNSZXBlYXRhYmxlID0gKHRoaXMuX3BhcmVudFRhYmxlICE9PSBudWxsICYmICFzdXBlci5pc0NvbHVtbkNvbnRyb2woKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBuYW1lIG9mIHRoZSBDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICAvLyBpZiAodGhpcy5pc1JlcGVhdGFibGUoKSkge1xyXG4gICAgLy8gICByZXR1cm4gc3VwZXIuZ2V0TmFtZSh0aGlzLkZvcm0uRGlzcGxheUxpbmUpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldExpbmtlZENvbnRyb2xzKCk6IExpc3Q8TWdDb250cm9sQmFzZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xpbmtlZENvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoZSBjb250cm9sIGlzIHJlcGVhdGFibGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1JlcGVhdGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5Jc1JlcGVhdGFibGU7XHJcbiAgfVxyXG5cclxuICBJc01vZGFsKCkgOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc01vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm5zIGN1cnJlbnQgZGlzcGxheSBsaW5lIG9mIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidXNlTGluZUZvckl0ZW1zXCI+aWYgdHJ1ZSwgdXNlIGN1cnJlbnQgbGluZSBmb3IgdHJlZTwvcGFyYW0+XHJcbiAgZ2V0RGlzcGxheUxpbmUodXNlTGluZUZvckl0ZW1zOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuSXNSZXBlYXRhYmxlIHx8ICh1c2VMaW5lRm9ySXRlbXMgJiYgc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkpIHtcclxuICAgICAgbGluZSA9IHRoaXMuRm9ybS5EaXNwbGF5TGluZTtcclxuICAgIH1cclxuICAgIHJldHVybiBsaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyB2aXNpYmlsaXR5IGNvbnNpZGVyaW5nIHBhcmVudCB2aXNpYmlsaXR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIHRydWUpO1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICByZXN1bHQgPSB0aGlzLmlzUGFyZW50UHJvcFZhbHVlKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgZW5hYmxlZCBjb25zaWRlcmluZyBwYXJlbnQgZW5hYmxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVELCB0cnVlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBjb250cm9sIGlzIG1vZGlmaWFibGUgYW5kIHRoZSB0YXNrIG1vZGUgaXMgbm90IHF1ZXJ5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc01vZGlmaWFibGUoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IG1vZGlmaWFibGU6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGSUFCTEUsIHRydWUpO1xyXG4gICAgbGV0IHRhc2tJblF1ZXJ5OiBib29sZWFuID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWTtcclxuICAgIGxldCBtb2RpZnlJblF1ZXJ5OiBib29sZWFuID0gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlksIGZhbHNlKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gbW9kaWZpYWJsZSAmJiAobW9kaWZ5SW5RdWVyeSB8fCAhdGFza0luUXVlcnkpO1xyXG4gICAgaWYgKHJlc3VsdCAmJiB0aGlzLl9maWVsZCAhPSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9ICh0aGlzLl9maWVsZC5EYk1vZGlmaWFibGUgfHwgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCBkYyB2YWx1ZXMgb2YgdGhpcyBkYXRhIGNvbnRyb2wgZnJvbSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERjVmFscygpOiBEY1ZhbHVlcyB7XHJcbiAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5EYXRhVmlldztcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzID0gbnVsbDtcclxuICAgIGlmICh0aGlzLl9kY1ZhbElkID09PSBFTVBUWV9EQ1JFRikge1xyXG4gICAgICBkY3YgPSAoKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpID8gZGF0YVZpZXcuZ2V0RW1wdHlDaG9pY2VGb3JWZWN0b3JzKCkgOiBkYXRhVmlldy5nZXRFbXB0eUNob2ljZSgpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fZGNWYWxJZCA+IC0xKSB7XHJcbiAgICAgICAgZGN2ID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkY3Y7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBjdXJyZW50IGlzTnVsbCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wncyBjdXJyZW50IGxpbmUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBQcmV2SXNOdWxsIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldFByZXZJc051bGwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGxldCBjdXJyT2JqOiBhbnkgPSB0aGlzLl9wcmV2SXNOdWxscy5nZXRfSXRlbShsaW5lKTtcclxuICAgIGxldCBjdXJyOiBib29sZWFuO1xyXG4gICAgaWYgKGN1cnJPYmogPT09IG51bGwpIHtcclxuICAgICAgY3VyciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9wcmV2SXNOdWxscy5zZXRfSXRlbShsaW5lLCBjdXJyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjdXJyID0gPGJvb2xlYW4+Y3Vyck9iajtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHByZXZJc051bGwgdmFsdWUgb2YgdGhlIHByZXZJc051bGwgYXJyYXlcclxuICAvLy8gICB0aGUgbmV3VmFsdWUgY2FuIGJlIE5VTEwgb3IgYm9vbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWx1ZVwiPnRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0PC9wYXJhbT5cclxuICBzZXRQcmV2SXNOdWxsKG5ld1ZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5zZXRfSXRlbSh0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpLCBuZXdWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPjwvcGFyYW0+XHJcbiAgc2V0UElDKHBpY1N0cjogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gZm9yIHB1c2ggYnV0dG9uLCB0cmFuc2xhdGUgdGhlIGZvcm1hdC5cclxuICAgIGlmIChzdXBlci5pc0J1dHRvbigpKSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IChzdXBlci5Jc0ltYWdlQnV0dG9uKCkgPyBcIlwiICsgWE1MQ29uc3RhbnRzLkZJTEVfTkFNRV9TSVpFLnRvU3RyaW5nKCkgOiBFdmVudHMuVHJhbnNsYXRlKHBpY1N0cikpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IHBpY1N0cjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BpYyA9IG5ldyBQSUModGhpcy5fcGljU3RyLCB0aGlzLkRhdGFUeXBlLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBpZiAodGhpcy5fZGF0YUN0cmwgJiYgdGhpcy5fcGljU3RyLmluZGV4T2YoJ0gnKSA+IC0xKSB7XHJcbiAgICAgIHRoaXMuX3BpYy5zZXRIZWJyZXcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHBpY3R1cmUgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gUElDIHJlZmVyZW5jZTwvcmV0dXJucz5cclxuICBnZXRQSUMoKTogUElDIHtcclxuICAgIHJldHVybiB0aGlzLl9waWM7XHJcbiAgfVxyXG5cclxuXHJcbi8vLyA8cmV0dXJucz4gdGhlIHBhcmVudCBvZiB0aGUgY29udHJvbCBjYW4gYmUgVGFibGVcXFRhYlxcQ2hvaWNlIGNvbnRyb2xcXEZvcm08L3JldHVybnM+XHJcbiAgZ2V0UGFyZW50KCk6IGFueSB7XHJcbiAgICBsZXQgcmV0UGFyZW50OiBhbnkgPSB0aGlzLkZvcm07XHJcbiAgICBpZiAodGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMSkge1xyXG4gICAgICByZXRQYXJlbnQgPSB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9jb250YWluZXJEaXRJZHgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICByZXRQYXJlbnQgPSB0aGlzLkZvcm0uZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldFBhcmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBmaWVsZCBhdHRhY2hlZCB0byB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RmllbGQoKTogR3VpRmllbGRCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9maWVsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIGZpZWxkIG9mIHRoZSBjb250cm9sIGJ5IHRoZSBmaWVsZCBvYmplY3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmllbGRcIj48L3BhcmFtPlxyXG4gIHNldEZpZWxkKGZpZWxkT3JGaWVsZFN0cklEOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChmaWVsZE9yRmllbGRTdHJJRCA9PT0gbnVsbCB8fCBmaWVsZE9yRmllbGRTdHJJRCBpbnN0YW5jZW9mIEd1aUZpZWxkQmFzZSkge1xyXG4gICAgICB0aGlzLnNldEZpZWxkXzAoZmllbGRPckZpZWxkU3RySUQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEZpZWxkXzEoZmllbGRPckZpZWxkU3RySUQpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc2V0RmllbGRfMChmaWVsZDogR3VpRmllbGRCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maWVsZCA9IGZpZWxkO1xyXG4gICAgaWYgKGZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkLlNldENvbnRyb2wodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU2V0IHRoZSBmaWVsZCBvZiB0aGUgY29udHJvbCBieSBhIHN0cmluZyBmaWVsZCBpZGVudGlmaWVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+dGhlIGZpZWxkIGlkZW50aWZpZXI6IFwicGFyZW50SWQsZmllbGRJZHhcIi9wYXJhbT5cclxuICBwcml2YXRlIHNldEZpZWxkXzEoZmllbGRTdHJJRDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgcmV0dXJuRmllbGQ6IEd1aUZpZWxkQmFzZSA9IHRoaXMuZ2V0RmllbGRCeVZhbHVlU3RyKGZpZWxkU3RySUQpO1xyXG4gICAgaWYgKHJldHVybkZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkID0gcmV0dXJuRmllbGQ7XHJcbiAgICAgIHRoaXMuX2ZpZWxkLlNldENvbnRyb2wodGhpcyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIENvbnRyb2wuc2V0RmllbGQoKTogaWxsZWdhbCBmaWVsZCBpZGVudGlmaWVyOiBcIiArIGZpZWxkU3RySUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcGljdHVyZSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JtYXRcIj50aGUgZm9ybWF0IHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJleHBJZFwiPmFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm1hdDwvcGFyYW0+XHJcbiAgc2V0UGljU3RyKGZvcm1hdDogc3RyaW5nLCBleHBJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9waWNTdHIgPSBmb3JtYXQ7XHJcbiAgICBpZiAoZXhwSWQgPiAwKSB7XHJcbiAgICAgIHRoaXMuX3BpY0V4cEV4aXN0cyA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcmFuZ2Ugb2YgdGhlIGNvbnRyb2wgYW5kIGNsZWFycyB0aGUgbWFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdSYW5nZVwiPmlzIHRoZSBuZXcgcmFuZ2U8L3BhcmFtPlxyXG4gIHNldFJhbmdlKG5ld1JhbmdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JhbmdlID0gbmV3UmFuZ2U7XHJcbiAgICB0aGlzLl92ZCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV4cElkXCI+YSByZWZlcmVuY2UgdG8gdGhlIGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIHNldFZhbEV4cChleHBJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl92YWxFeHBJZCA9IGV4cElkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBjb3B5IG9mIHZhbGlkYXRpb24gZGV0YWlscyB3aXRoIG5ldyAmIG9sZCB2YWx1ZSB3aXRob3V0IGNoYW5naW5nIHJlYWwgdmFsaWRhdGlvbiBkZXRhaWxzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9sZFZhbFwiPnZhbHVlIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbFwiPnZhbHVlIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICBidWlsZENvcHlQaWN0dXJlKG9sZFZhbDogc3RyaW5nLCBuZXdWYWw6IHN0cmluZyk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpIHx8IHN1cGVyLmlzQ29sdW1uQ29udHJvbCgpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBjb3B5VkQ6IFZhbGlkYXRpb25EZXRhaWxzID0gdGhpcy5nZXRDb3B5T2ZWRCgpO1xyXG4gICAgICBjb3B5VkQuc2V0VmFsdWUobmV3VmFsKTtcclxuICAgICAgY29weVZELnNldE9sZFZhbHVlKG9sZFZhbCk7XHJcbiAgICAgIHJldHVybiBjb3B5VkQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgY29weSBvZiB2YWxpZGF0aW9uIGRldGFpbHMsIHdpdGhvdXQgaW5mbHVlbmNlIHRvIHRoZSByZWFsIHZhbGlkYXRpb24gZGV0YWlsc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRDb3B5T2ZWRCgpOiBWYWxpZGF0aW9uRGV0YWlscyB7XHJcbiAgICBsZXQgcmVzdWx0OiBWYWxpZGF0aW9uRGV0YWlscztcclxuICAgIGlmICh0aGlzLl92ZCA9PT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkRldGFpbHModGhpcy5WYWx1ZSwgdGhpcy5WYWx1ZSwgdGhpcy5fcmFuZ2UsIHRoaXMuX3BpYywgdGhpcyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25EZXRhaWxzKHRoaXMuX3ZkKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJhbmdlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UmFuZ2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmFuZ2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJhbmdlZCB2YWx1ZSBmb3IgaW5wdXQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJhbmdlZFZhbHVlKG5ld1ZhbDogYW55KTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgdmQ6IFZhbGlkYXRpb25EZXRhaWxzO1xyXG4gICAgdmQgPSB0aGlzLmJ1aWxkQ29weVBpY3R1cmUodGhpcy5WYWx1ZSwgbmV3VmFsKTtcclxuICAgIHZkLmV2YWx1YXRlKCk7XHJcblxyXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkcyB2YWx1ZSB3YXMgd3JvbmdcclxuICAgIGxldCB2YWw6IGFueSAgPSB2ZC5nZXREaXNwVmFsdWUoKVxyXG4gICAgcmV0dXJuICh2YWwudG9TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdmFsaWRhdGUgdXNlciBpbnB1dFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdmFsaWRhdGUobmV3VmFsOiBhbnkpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICBsZXQgbW9kaWZpZWQ6IGJvb2xlYW4gPSB0aGlzLk1vZGlmaWVkQnlVc2VyO1xyXG4gICAgdGhpcy5Nb2RpZmllZEJ5VXNlciA9IHRydWU7XHJcbiAgICB2ZCA9IHRoaXMuYnVpbGRDb3B5UGljdHVyZSh0aGlzLlZhbHVlLCBuZXdWYWwpO1xyXG4gICAgdmQuZXZhbHVhdGUoKTtcclxuICAgIHRoaXMuTW9kaWZpZWRCeVVzZXIgPSBtb2RpZmllZDtcclxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBmaWVsZHMgdmFsdWUgd2FzIHdyb25nXHJcbiAgICBpZiAodmQuVmFsaWRhdGlvbkZhaWxlZClcclxuICAgICAgcmV0dXJuIHZkLkVycm9yTWVzc2FnZTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZVN0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEZpZWxkQnlWYWx1ZVN0cih2YWx1ZVN0cjogc3RyaW5nKTogR3VpRmllbGRCYXNlIHtcclxuXHJcbiAgICBsZXQgcmVmUGFyZW50OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4odGhpcy5wYXJlbnQpO1xyXG4gICAgbGV0IHJlZlZlZUluZHg6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPih0aGlzLnZlZUluZHgpO1xyXG4gICAgbGV0IHJldDogR3VpRmllbGRCYXNlID0gPEd1aUZpZWxkQmFzZT50aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0RmllbGRCeVZhbHVlU3RyKHZhbHVlU3RyLCByZWZQYXJlbnQsIHJlZlZlZUluZHgpO1xyXG4gICAgdGhpcy5wYXJlbnQgPSByZWZQYXJlbnQudmFsdWU7XHJcbiAgICB0aGlzLnZlZUluZHggPSByZWZWZWVJbmR4LnZhbHVlO1xyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgaGFzIGNvbnRhaW5lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBoYXNDb250YWluZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXRzIGxheWVyIG9mIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TGF5ZXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkxheWVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGVzIHRoZSBwaWMgdXNpbmcgdGhlIHJlc3VsdCBvZiB0aGUgZm9ybWF0IGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljRXhwUmVzdWx0XCI+dGhlIHJlc3VsdCBvZiB0aGUgZm9ybWF0IGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gUElDIHJlZmVyZW5jZSA8L3JldHVybnM+XHJcbiAgY29tcHV0ZVBJQyhwaWNFeHBSZXN1bHQ6IHN0cmluZyk6IFBJQyB7XHJcbiAgICAvLyBmb3IgcHVzaCBidXR0b24sIHRyYW5zbGF0ZSB0aGUgZm9ybWF0LlxyXG4gICAgbGV0IHBpY1Jlc3VsdDogc3RyaW5nID0gKHBpY0V4cFJlc3VsdCAhPT0gbnVsbCAmJiBzdXBlci5pc0J1dHRvbigpKSA/IEV2ZW50cy5UcmFuc2xhdGUocGljRXhwUmVzdWx0KSA6IHBpY0V4cFJlc3VsdDtcclxuXHJcbiAgICAvLyBjb25zdHJ1Y3QgYSBuZXcgcGljdHVyZSBvbmx5IGlmIHRoZSBleHByZXNzaW9uIHJlc3VsdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgcHJldmlvdXMgcmVzdWx0XHJcbiAgICBpZiAodGhpcy5fcHJldlBpY0V4cFJlc3VsdCA9PT0gbnVsbCB8fCAhKHRoaXMuX3ByZXZQaWNFeHBSZXN1bHQgPT09IHBpY1Jlc3VsdCkpIHtcclxuICAgICAgdGhpcy5fcGljID0gbmV3IFBJQyhwaWNSZXN1bHQsIHRoaXMuRGF0YVR5cGUsIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICB0aGlzLl9wcmV2UGljRXhwUmVzdWx0ID0gcGljUmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3BpYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0cyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hvaWNlIGluIHRoZSBjaG9pY2UgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmluZGV4IG9mIHRoZSBjdXJyZW50IGNob2ljZTwvcmV0dXJucz5cclxuICBnZXRDdXJyZW50SW5kZXhPZkNob2ljZSgpOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgc2VsZWN0ZWRJbmRpY2U6IG51bWJlcltdID0gWy0xXTtcclxuXHJcbiAgICBsZXQgdmFsOiBzdHJpbmcgPSB0aGlzLlZhbHVlO1xyXG5cclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHZhbCkpIHtcclxuICAgICAgbGV0IGFycmF5Mjogc3RyaW5nW10gPSB2YWwuc3BsaXQoJywnLyonLCcqLyk7XHJcbiAgICAgIHNlbGVjdGVkSW5kaWNlID0gbmV3IEFycmF5PG51bWJlcj4oYXJyYXkyLmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGlDdHI6IG51bWJlciA9IDA7IGlDdHIgPCBhcnJheTIubGVuZ3RoOyBpQ3RyID0gaUN0ciArIDEpIHtcclxuICAgICAgICBsZXQgbnVtOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGFycmF5MltpQ3RyXSk7XHJcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VbaUN0cl0gPSAoKG51bSA+PSAwKSA/IG51bSA6IC0xKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGVkSW5kaWNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgaXMgbXVsdGkgc2VsZWN0aW9uIGxpc3QgYm94IGVsc2UgZmFsc2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIElzTXVsdGlwbGVTZWxlY3Rpb25MaXN0Qm94KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHN1cGVyLmlzTGlzdEJveCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgaWYgY29udHJvbCBwaWN0dXJlIGlzIGRhdGUgb3IgdGltZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc0RhdGVUaW1lUGljdHVyZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9waWMuZ2V0QXR0cigpID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fcGljLmdldEF0dHIoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRoaXMgY29udHJvbCBzdXBwb3J0IGRhdGEgc291cmNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFN1cHBvcnRzRGF0YVNvdXJjZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSB8fCBzdXBlci5pc1JhZGlvKCkgfHwgdGhpcy5IYXNBdXRvY29tcGxldGUoKSA7XHJcbiAgfVxyXG5cclxuICBIYXNBdXRvY29tcGxldGUoKSB7XHJcbiAgICBpZiAoc3VwZXIuaXNUZXh0Q29udHJvbCgpKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fQ09NUExFVEVfTU9ERV9XQykuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgYXJyYXkgb2YgaW5kaWNlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgc3BlY2lmaWMgbGluayB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbFwiPnRoZSByZXF1ZXN0ZWQgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNOdWxsXCI+dHJ1ZSBpZiBtZ1ZhbCByZXByZXNlbnRzIGEgbnVsbCB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBhcnJheSBvZiBpbmRpY2U8L3JldHVybnM+XHJcbiAgYXN5bmMgZ2V0SW5kZXhPZkNob2ljZShtZ1ZhbDogc3RyaW5nLCBsaW5lOiBudW1iZXIsIGlzTnVsbDogYm9vbGVhbik6IFByb21pc2U8bnVtYmVyW10+IHtcclxuXHJcbiAgICAvLyBpZiB0aGUgY29udHJvbCBpcyBsaXN0Ym94IHdpdGggc2luZ2xlIHNlbGVjdGlvbiBtb2RlLCBhbmQgdGhlIHZhbHVlIGlzIGNvbW1hIHNlcGFyYXRlZCwgdGhlbiB3ZSBzaG91bGQgbm90IHNwbGl0IHZhbHVlIG9uIGNvbW1hLlxyXG4gICAgbGV0IHNwbGl0Q29tbWFTZXBlcmF0ZWRWYWxzOiBib29sZWFuID0gdGhpcy5Jc011bHRpcGxlU2VsZWN0aW9uTGlzdEJveCgpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuY29tcHV0ZUNob2ljZShsaW5lKTtcclxuXHJcbiAgICBsZXQgaXNWZWN0b3JWYWx1ZTogYm9vbGVhbiA9IHRoaXMuZ2V0RmllbGQoKSAhPT0gbnVsbCAmJiB0aGlzLmdldEZpZWxkKCkuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGNWYWxzKCkuZ2V0SW5kZXhPZihtZ1ZhbCwgaXNWZWN0b3JWYWx1ZSwgaXNOdWxsLCB0aGlzLl9jaG9pY2VMaW5rcy5nZXRfSXRlbShsaW5lKSwgdGhpcy5fY2hvaWNlTnVtcy5nZXRfSXRlbShsaW5lKSwgc3BsaXRDb21tYVNlcGVyYXRlZFZhbHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBwYXJzZWQgY29udGVudCBvZiBQUk9QX1RZUEVfRElTUExBWV9MSVNUPC9yZXR1cm5zPlxyXG4gIGFzeW5jIGdldERpc3BWYWxzKGxpbmU6IG51bWJlciwgZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICBpZiAoZXhlY0NvbXB1dGVDaG9pY2UpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21wdXRlQ2hvaWNlKGxpbmUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHN1cGVyLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9vcmdDaG9pY2VEaXNwcy5nZXRfSXRlbShsaW5lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY2hvaWNlRGlzcHMuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZW1wdHlDaG9pY2UobGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgdmFsdWU6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMCk7XHJcbiAgICB0aGlzLl9jaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCB2YWx1ZSk7XHJcbiAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCB2YWx1ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5zZXRfSXRlbShsaW5lLCB2YWx1ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMYXllckxpc3Quc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGVzIHRoZSBjaG9pY2VzIG9mIGEgU0VMRUNUIGNvbnRyb2wgdGhhdCBvcmlnaW5hdGUgZnJvbSB0aGUgY29udHJvbCdzIHByb3BlcnRpZXMgKGluIGNvbnRyYXN0IHRvXHJcbiAgLy8vICAgdGhlIG9uZXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgdW5kZXJsYXlpbmcgdGFibGUgb2YgYSBkYXRhIGNvbnRyb2wpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGNvbXB1dGVDaG9pY2UobGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZnJvbUhlbHA6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlxcXFxcXFxcXCIsIFwiXFxcXC1cIiwgXCJcXFxcLFwiXHJcbiAgICBdO1xyXG4gICAgbGV0IHRvSGVscDogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiWFhcIiwgXCJYWFwiLCBcIlhYXCJcclxuICAgIF07XHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgZGN2OiBEY1ZhbHVlcyA9IGRhdGFWaWV3LmdldERjVmFsdWVzKHRoaXMuX2RjVmFsSWQpO1xyXG4gICAgbGV0IGN1cnJEY0lkOiBudW1iZXIgPSB0aGlzLmdldERjUmVmKCk7XHJcbiAgICBsZXQgY2hvaWNlRGlzcFN0cjogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBjaG9pY2VMaW5rU3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IG9wdGlvbnNWYWxpZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgdHJpbVRvTGVuZ3RoOiBudW1iZXIgPSAtMTtcclxuICAgIGxldCBkYXRhVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuRGF0YVR5cGU7XHJcbiAgICBsZXQgaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICAvLyByZS1jb21wdXRlIHZhbHVlcyBvbmx5IGlmIHRoZXkgYXJlIG5vdCB2YWxpZCBvciB0aGUgREMgd2FzIGNoYW5nZWQgKGR1ZSB0b0hlbHAgcmVjb21wdXRlKVxyXG4gICAgICBpZiAodGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSkgPT09IG51bGwgfHwgKHRoaXMuaXNEYXRhQ3RybCgpICYmIGN1cnJEY0lkICE9PSB0aGlzLl9kY1ZhbElkKSkge1xyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgZGF0YVR5cGUgPSB0aGlzLmdldEZpZWxkKCkuZ2V0Q2VsbHNUeXBlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkaXNwVmFsczogc3RyaW5nW10gPSBkY3YuZ2V0RGlzcFZhbHMoKTtcclxuICAgICAgICBsZXQgZGlzcFByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfTElTVCk7XHJcbiAgICAgICAgbGV0IGxpbmtQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTCk7XHJcbiAgICAgICAgaWYgKGRpc3BQcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjaG9pY2VEaXNwU3RyID0gYXdhaXQgZGlzcFByb3AuZ2V0VmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxpbmtQcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjaG9pY2VMaW5rU3RyID0gYXdhaXQgbGlua1Byb3AuZ2V0VmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNob2ljZUxpbmtTdHIgPT09IG51bGwgfHwgU3RyVXRpbC5ydHJpbShjaG9pY2VMaW5rU3RyKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGNob2ljZUxpbmtTdHIgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2hvaWNlRGlzcFN0ciA9PT0gbnVsbCB8fCBTdHJVdGlsLnJ0cmltKGNob2ljZURpc3BTdHIpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzRGF0YUN0cmwoKSB8fCBkaXNwVmFscyA9PT0gbnVsbCB8fCBkaXNwVmFscy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY2hvaWNlRGlzcFN0ciA9IGNob2ljZUxpbmtTdHI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY2hvaWNlRGlzcFN0ciA9IChjaG9pY2VMaW5rU3RyID0gXCJcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2hvaWNlRGlzcFN0ciA9IEV2ZW50cy5UcmFuc2xhdGUoY2hvaWNlRGlzcFN0cik7XHJcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMpIHtcclxuICAgICAgICAgIGNob2ljZUxpbmtTdHIgPSBTdHJVdGlsLnNlYXJjaEFuZFJlcGxhY2UoY2hvaWNlTGlua1N0ciwgXCJcXFxcLVwiLCBcIi1cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBoZWxwU3RyOiBzdHJpbmcgPSBTdHJVdGlsLnNlYXJjaEFuZFJlcGxhY2UoY2hvaWNlTGlua1N0ciwgZnJvbUhlbHAsIHRvSGVscCk7XHJcbiAgICAgICAgbGV0IHNUb2s6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShoZWxwU3RyLCBcIixcIik7XHJcbiAgICAgICAgbGV0IGxpbmtTaXplOiBudW1iZXIgPSAoaGVscFN0ciAhPT0gXCJcIikgPyBzVG9rLmxlbmd0aCA6IDA7XHJcbiAgICAgICAgbGV0IGhlbHBTdHJEaXNwOiBzdHJpbmcgPSBTdHJVdGlsLnNlYXJjaEFuZFJlcGxhY2UoY2hvaWNlRGlzcFN0ciwgZnJvbUhlbHAsIHRvSGVscCk7XHJcbiAgICAgICAgc1RvayA9IFN0clV0aWwudG9rZW5pemUoaGVscFN0ckRpc3AsIFwiLFwiKTtcclxuICAgICAgICBsZXQgZGlzcGxheVNpemU6IG51bWJlciA9IChoZWxwU3RyRGlzcCAhPT0gXCJcIikgPyBzVG9rLmxlbmd0aCA6IDA7XHJcblxyXG4gICAgICAgIGlmIChsaW5rU2l6ZSAhPT0gZGlzcGxheVNpemUgJiYgZGlzcGxheVNpemUgPiAwKSB7XHJcbiAgICAgICAgICBjaG9pY2VEaXNwU3RyID0gY2hvaWNlTGlua1N0cjtcclxuICAgICAgICAgIGlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3QgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2l6ZTogbnVtYmVyID0gbGlua1NpemU7XHJcbiAgICAgICAgbGV0IGNob2ljZUxpbms6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oc2l6ZSk7XHJcbiAgICAgICAgdGhpcy5fY2hvaWNlTGlua3Muc2V0X0l0ZW0obGluZSwgY2hvaWNlTGluayk7XHJcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCBkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FKSB7XHJcbiAgICAgICAgICB0aGlzLl9jaG9pY2VOdW1zLnNldF9JdGVtKGxpbmUsIG5ldyBBcnJheTxOVU1fVFlQRT4oc2l6ZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQWRkIGRpc3BsYXkgdmFsdWVzXHJcbiAgICAgICAgbGV0IG9yZ0Nob2ljZURpc3A6IHN0cmluZ1tdID0gQ2hvaWNlVXRpbHMuR2V0RGlzcGxheUxpc3RGcm9tU3RyaW5nKGNob2ljZURpc3BTdHIsIGZhbHNlLCB0cnVlLCAhaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdCk7XHJcbiAgICAgICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgb3JnQ2hvaWNlRGlzcCk7XHJcbiAgICAgICAgbGV0IGNob2ljZURpc3A6IHN0cmluZ1tdID0gQ2hvaWNlVXRpbHMuR2V0RGlzcGxheUxpc3RGcm9tU3RyaW5nKGNob2ljZURpc3BTdHIsIHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpIHx8IHN1cGVyLmlzVGFiQ29udHJvbCgpLCB0cnVlLCAhaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdCk7XHJcbiAgICAgICAgdGhpcy5fY2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgY2hvaWNlRGlzcCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGQoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdHJpbVRvTGVuZ3RoID0gdGhpcy5nZXRGaWVsZCgpLmdldFNpemUoKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBsZXQgdG9rZW46IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgbGV0IGhlbHBUb2tlbjogc3RyaW5nID0gbnVsbDtcclxuICAgICAgICBsZXQgdG9rZW5CdWZmZXI6IFN0cmluZ0J1aWxkZXI7XHJcbiAgICAgICAgLy8gQWRkIGxpbmsgdmFsdWVzLlxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGN1cnJQb3M6IG51bWJlciA9IDAsIG5leHRQb3MgPSAwOyBpIDwgc2l6ZSAmJiBvcHRpb25zVmFsaWQ7IGkrKykge1xyXG4gICAgICAgICAgbmV4dFBvcyA9IGN1cnJQb3M7XHJcbiAgICAgICAgICBuZXh0UG9zID0gaGVscFN0ci5pbmRleE9mKCcsJywgbmV4dFBvcyk7XHJcblxyXG4gICAgICAgICAgaWYgKG5leHRQb3MgPT09IGN1cnJQb3MpXHJcbiAgICAgICAgICAgIHRva2VuID0gaGVscFRva2VuID0gXCJcIjtcclxuICAgICAgICAgIGVsc2UgaWYgKG5leHRQb3MgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRva2VuID0gY2hvaWNlTGlua1N0ci5zdWJzdHIoY3VyclBvcyk7XHJcbiAgICAgICAgICAgIGhlbHBUb2tlbiA9IGhlbHBTdHIuc3Vic3RyKGN1cnJQb3MpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRva2VuID0gY2hvaWNlTGlua1N0ci5zdWJzdHIoY3VyclBvcywgKG5leHRQb3MpIC0gKGN1cnJQb3MpKTtcclxuICAgICAgICAgICAgaGVscFRva2VuID0gaGVscFN0ci5zdWJzdHIoY3VyclBvcywgKG5leHRQb3MpIC0gKGN1cnJQb3MpKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjdXJyUG9zID0gbmV4dFBvcyArIDE7XHJcblxyXG4gICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5NRU1POlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgICAgICAgIHRva2VuID0gU3RyVXRpbC5sdHJpbSh0b2tlbik7XHJcbiAgICAgICAgICAgICAgaGVscFRva2VuID0gU3RyVXRpbC5sdHJpbShoZWxwVG9rZW4pO1xyXG4gICAgICAgICAgICAgIGlmIChoZWxwVG9rZW4uaW5kZXhPZignXFxcXCcpID49IDApIHtcclxuICAgICAgICAgICAgICAgIHRva2VuQnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRva2VuUG9zOiBudW1iZXIgPSAwOyB0b2tlblBvcyA8IGhlbHBUb2tlbi5sZW5ndGg7IHRva2VuUG9zKyspXHJcbiAgICAgICAgICAgICAgICAgIGlmIChoZWxwVG9rZW5bdG9rZW5Qb3NdICE9PSAnXFxcXCcpXHJcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5CdWZmZXIuQXBwZW5kKHRva2VuW3Rva2VuUG9zXSk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuUG9zID09PSBoZWxwVG9rZW4ubGVuZ3RoIC0gMSlcclxuICAgICAgICAgICAgICAgICAgICB0b2tlbkJ1ZmZlci5BcHBlbmQoJyAnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuQnVmZmVyLlRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRva2VuID0gU3RyVXRpbC5tYWtlUHJpbnRhYmxlVG9rZW5zKHRva2VuLCBTRVFfMl9TVFIpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uQ3RybCgpIHx8IHRoaXMuaXNUYWJDb250cm9sKCkpXHJcbiAgICAgICAgICAgICAgICB0b2tlbiA9IENob2ljZVV0aWxzLlJlbW92ZUFjY2xDaGFyRnJvbU9wdGlvbnMobmV3IFN0cmluZ0J1aWxkZXIodG9rZW4pKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gY2hvaWNlTGluayBzaXplIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gc2l6ZSBvZiB0aGUgZmllbGQsIHNvIHRyaW0gaXQuXHJcbiAgICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0cmltVG9MZW5ndGggIT09IC0xICYmIFV0aWxTdHJCeXRlTW9kZS5sZW5CKHRva2VuKSA+IHRyaW1Ub0xlbmd0aClcclxuICAgICAgICAgICAgICAgICAgdG9rZW4gPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodG9rZW4sIHRyaW1Ub0xlbmd0aCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyaW1Ub0xlbmd0aCAhPT0gLTEgJiYgdG9rZW4ubGVuZ3RoID4gdHJpbVRvTGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0cigwLCB0cmltVG9MZW5ndGgpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY2hvaWNlTGlua1tpXSA9IHRva2VuO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICAgICAgICBsZXQgcGljdHVyZTogUElDID0gUElDLmJ1aWxkUGljdHVyZShkYXRhVHlwZSwgdG9rZW4sIHRhc2suZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgb3B0aW9uc1ZhbGlkID0gdGhpcy5vcHRpb25Jc1ZhbGlkKHRva2VuKTtcclxuICAgICAgICAgICAgICBjaG9pY2VMaW5rW2ldID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKHRva2VuLnRyaW0oKSwgY2hvaWNlTGlua1N0ciwgcGljdHVyZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0Q29tcElkeCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOS05PV04pO1xyXG4gICAgICAgICAgICAgICgodGhpcy5fY2hvaWNlTnVtcy5nZXRfSXRlbShsaW5lKSkpW2ldID0gbmV3IE5VTV9UWVBFKGNob2ljZUxpbmtbaV0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgICAgICAgY2hvaWNlTGlua1tpXSA9ICgxIC0gaSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW9wdGlvbnNWYWxpZClcclxuICAgICAgICAgIHRoaXMuZW1wdHlDaG9pY2UobGluZSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgIG9wdGlvbnNWYWxpZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZW1wdHlDaG9pY2UobGluZSk7XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gOiB7MX1cIiwgZXguR2V0VHlwZSgpLCBleC5NZXNzYWdlKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgdGhpcy5faGFzVmFsaWRJdG1BbmREaXNwVmFsID0gb3B0aW9uc1ZhbGlkO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSB0b3Btb3N0IGZvcm0gb2YgdGhlIHN1YmZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VG9wTW9zdEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGb3JtKCkuZ2V0VG9wTW9zdEZvcm0oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXBsYWNlIHRoZSB1cmwgb24gYnJvd3NlciBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFVybCgpOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCAwLCB0aGlzLlZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBpbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB3aXRob3V0IGNoYW5naW5nIHRoZSBjb250cm9sIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWxcIj50aGUgZGlzcGxheWVkIHZhbHVlIHdpdGggdGhlIG1hc2tpbmcgY2hhcmFjdGVyczwvcGFyYW0+XHJcbiAgYXN5bmMgZ2V0TWdWYWx1ZShkaXNwVmFsOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IG1nVmFsOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmIChzdXBlci5pc0NoZWNrQm94KCkpIHtcclxuICAgICAgbWdWYWwgPSBkaXNwVmFsID8gXCIxXCIgOiBcIjBcIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoc3VwZXIuaXNTZWxlY3Rpb25DdHJsKCkgfHwgc3VwZXIuaXNUYWJDb250cm9sKCkgfHwgc3VwZXIuaXNSYWRpbygpKSB7XHJcblxyXG4gICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG5cclxuICAgICAgICBpZiAobGluZSA8IDApXHJcbiAgICAgICAgICBsaW5lID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwVmFsID09PSBcIm51bWJlclwiKVxyXG4gICAgICAgICAgZGlzcFZhbCA9IGRpc3BWYWwudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGlzcFZhbCkpXHJcbiAgICAgICAgICBkaXNwVmFsID0gZGlzcFZhbC5qb2luKCcsJykudG9TdHJpbmcoKTtcclxuXHJcblxyXG4gICAgICAgIGlmIChkaXNwVmFsID09PSBcIlwiKSB7XHJcbiAgICAgICAgICBtZ1ZhbCA9IGRpc3BWYWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbWdWYWwgPSBhd2FpdCB0aGlzLmdldExpbmtWYWx1ZShkaXNwVmFsLCBsaW5lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1nVmFsID09PSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgaXNOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAvLyBUaGUgZGF0YSBjb250cm9sIHdpbGwgbmV2ZXIgcmV0dXJuIGFuIGlsbGVnYWwgdmFsdWUgYXMgYSByZXN1bHQgb2YgYSB1c2VyIHNlbGVjdGlvblxyXG4gICAgICAgICAgLy8gYnV0IGFzIGEgcmVzdWx0IG9mIGFuIGluaXQgZXhwcmVzc2lvbiwgdXBkYXRlIG9wZXJhdGlvbiBvciB2YWx1ZXMgb2YgZGF0YSBpblxyXG4gICAgICAgICAgLy8gdGhlIHJlY29yZC4gVGhlcmVmb3JlLCB0aGUgc2FtZSBpbGxlZ2FsIHZhbHVlIHNob3VsZCBiZSB0YWtlbiBmcm9tIGl0cyBzb3VyY2UsXHJcbiAgICAgICAgICAvLyB3aGljaCBpcyBhIGZpZWxkIG9yIGFuIGV4cHJlc3Npb24uIChFaHVkIDE5LWp1bi0yMDAxKVxyXG4gICAgICAgICAgbGV0IHJlZk1nVmFsOiBSZWZQYXJhbTxzdHJpbmc+ID0gbmV3IFJlZlBhcmFtPHN0cmluZz4obWdWYWwpO1xyXG4gICAgICAgICAgbGV0IHJlZklzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW08Ym9vbGVhbj4oaXNOdWxsKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbWdWYWwgPSByZWZNZ1ZhbC52YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IGJsb2JDb250ZW50VHlwZTogc3RyaW5nID0gKHRoaXMuX2ZpZWxkICE9PSBudWxsKSA/IHRoaXMuX2ZpZWxkLmdldENvbnRlbnRUeXBlKCkgOiBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTjtcclxuICAgICAgICBtZ1ZhbCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyhkaXNwVmFsLCB0aGlzLl9yYW5nZSwgdGhpcy5fcGljLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBibG9iQ29udGVudFR5cGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWdWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyBmb3IgaW5kaWNlIHBhc3NlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlbGVjdGVkSW5kaWNlXCI+Y29tbWEgc2VwYXJhdGVkIHZhbHVlczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmNvbW1hIHNlcGFyYXRlZCB2YWx1ZXM8L3JldHVybnM+XHJcbiAgYXN5bmMgZ2V0TGlua1ZhbHVlKHNlbGVjdGVkSW5kaWNlOiBzdHJpbmcsIGxpbmU6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gMDtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7XHJcbiAgICBsZXQgdGVtcDogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuY29tcHV0ZUNob2ljZShsaW5lKTtcclxuXHJcbiAgICBsZXQgY2hvaWNlTGluazogc3RyaW5nW10gPSB0aGlzLl9jaG9pY2VMaW5rcy5nZXRfSXRlbShsaW5lKTtcclxuXHJcbiAgICBpZiAoY2hvaWNlTGluayAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBjb21wdXRlIHNpemUgb2YgZGlzcGxheWVkIHZhbHVlcyBhcnJheVxyXG4gICAgICBzaXplID0gY2hvaWNlTGluay5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBsZXQgbGlua0luZGljZTogbnVtYmVyW10gPSB0aGlzLmdldExpbmtJZHhGcm9tTGF5ZXIoTWlzYy5HZXRJbnRBcnJheShzZWxlY3RlZEluZGljZSkpO1xyXG5cclxuICAgIGxldCBhcnJheTI6IG51bWJlcltdID0gbGlua0luZGljZTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhcnJheTIubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGlkeDogbnVtYmVyID0gYXJyYXkyW2ldO1xyXG4gICAgICBpZiAoaWR4ID49IHNpemUpIHtcclxuICAgICAgICBsZXQgZGNWYWxzOiBEY1ZhbHVlcyA9IHRoaXMuZ2V0RGNWYWxzKCk7XHJcbiAgICAgICAgdGVtcC5wdXNoKGRjVmFscy5nZXRMaW5rVmFsdWUoaWR4IC0gc2l6ZSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCBjaG9pY2VMaW5rLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGVtcC5wdXNoKGNob2ljZUxpbmtbaWR4XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGVtcC5wdXNoKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIGxldCB2ZWN0b3JUeXBlOiBWZWN0b3JUeXBlID0gbmV3IFZlY3RvclR5cGUodGhpcy5nZXRGaWVsZCgpKTtcclxuICAgICAgZm9yIChsZXQgaW5keDogbnVtYmVyID0gMDsgaW5keCA8IHRlbXAubGVuZ3RoOyBpbmR4ID0gaW5keCArIDEpIHtcclxuICAgICAgICB2ZWN0b3JUeXBlLnNldFZlY0NlbGwoaW5keCArIDEsIHRlbXAuZ2V0X0l0ZW0oaW5keCksIHRlbXAuZ2V0X0l0ZW0oaW5keCkgPT09IG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCA9IHZlY3RvclR5cGUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGVtcC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGVtcC5qb2luKFwiLFwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXN1bHQgPSB0ZW1wLmdldF9JdGVtKDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0ZXh0IG9uIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFRleHQoKTogdm9pZCB7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICBsZXQgbWxzVHJhbnNsYXRlZFZhbHVlOiBhbnkgPSB0aGlzLlZhbHVlO1xyXG4gICAgaWYgKHN1cGVyLmlzQnV0dG9uKCkpIHtcclxuICAgICAgbWxzVHJhbnNsYXRlZFZhbHVlID0gRXZlbnRzLlRyYW5zbGF0ZSh0aGlzLlZhbHVlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzVGV4dENvbnRyb2woKSB8fCB0aGlzLmlzQnV0dG9uKCkpXHJcbiAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCBkaXNwbGF5TGluZSwgbWxzVHJhbnNsYXRlZFZhbHVlKTtcclxuICAgIGVsc2VcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBkaXNwbGF5TGluZSwgLypcImlubmVySFRNTFwiKi8gSHRtbFByb3BlcnRpZXMuVGV4dCwgbWxzVHJhbnNsYXRlZFZhbHVlKTtcclxuXHJcbiAgICAvLyBDb21tYW5kcy5hZGRBc3luYyhDb21tYW5kVHlwZS5QUk9QX1NFVF9URVhULCB0aGlzLCBkaXNwbGF5TGluZSwgbWxzVHJhbnNsYXRlZFZhbHVlLCAwKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSByYWRpbyBidXR0b24gY2hlY2tlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYWRpb0xpbmVcIj5pcyB0aGUgbGluZSBvZiB0aGUgcmFkaW8gdGhhdCBuZWVkIHRvIGJlIFNldDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRSYWRpb0NoZWNrZWQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgaW5kZXgpO1xyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuXHJcbiAgICAvLyBzZXQgY29udHJvbCB0byBmb2N1c1xyXG4gICAgaWYgKGluZGV4ICE9PSBHdWlDb25zdGFudHMuREVGQVVMVF9WQUxVRV9JTlQpIHtcclxuICAgICAgdGhpcy5zZXRDb250cm9sVG9Gb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q29udHJvbFRvRm9jdXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5nZXRGaWVsZCgpICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZ2V0RmllbGQoKS5Db250cm9sVG9Gb2N1cyA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IENoZWNrQm94IFZhbHVlIHRvIHRoZSBjaGVjayBib3ggY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWdWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzZXRDaGVja0JveFZhbHVlKGxpbmU6IG51bWJlciwgbWdWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGNoZWNrU3RhdGU6IGJvb2xlYW4gPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihtZ1ZhbCk7XHJcbiAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgbGluZSwgY2hlY2tTdGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVDaGFuZ2VkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmU6IG51bWJlciwgdmFsdWVDaGFuZ2VkOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICBsZXQgY3VyckRjSWQ6IG51bWJlciA9IHRoaXMuZ2V0RGNSZWYoKTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSByYW5nZSB3YXMgY2hhbmdlZCB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIHRoZSBjb3JyZWN0IGNob2ljZSBvcHRpb25cclxuICAgICAgaWYgKHRoaXMuX3JhbmdlQ2hhbmdlZCkge1xyXG4gICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcmFuZ2VDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmlzRGF0YUN0cmwoKSAmJiBjdXJyRGNJZCAhPT0gdGhpcy5fZGNWYWxJZCkge1xyXG5cclxuICAgICAgICAvLyBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudDogc2VydmVyIHdyaXRlcyBvcHRpb25MaXN0IHRvIHRoZSBIVE1MLiBObyBuZWVkIHRvIGFwcGx5XHJcbiAgICAgICAgLy8gdGhlbVxyXG4gICAgICAgIC8vIGZvciB0aGUgZmlyc3QgdGltZS5cclxuICAgICAgICAvLyBmb3JjZSB1cGRhdGUgb2YgdGhlIHZhbHVlIHdoZW5ldmVyIHRoZSBzZXQgb2Ygb3B0aW9ucyBpcyByZXBsYWNlZFxyXG4gICAgICAgIC8vIGlmIChmb3JtLmZvcm1SZWZyZXNoZWQoKSB8fCBmb3JjZVJlZnJlc2gpXHJcblxyXG4gICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0RGNSZWYodGhpcy5fZGNWYWxJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBkY3JlZiBmb3IgdGhlIGN1cnJlbnQgdGFibGUgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkY0lkXCI+dGhlIG5ldyByZWZlcmVuY2UgdG8gdGhlIGRjdmFsczwvcGFyYW0+XHJcbiAgc2V0RGNSZWYoZGNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kY1RhYmxlUmVmcy5zZXRfSXRlbSh0aGlzLmdldERjTGluZU51bSgpLCBkY0lkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXBsYWNlIHRoZSBpbWFnZSBsaXN0IG9mIGFuIGJ1dHRvbiBjb250cm9sIHdpdGggdGhlIGltYWdlIGF0IHRoZSBnaXZlbiBVUkxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEltYWdlTGlzdCh1cmw6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBVcGRhdGUgYm9vbGVhbiBwcm9wZXJ0eShleDp2aXNpYmxlXFxlbmFibGUpIG9mIGNvbnRyb2wgYW5kIGl0J3MgY2hpbGRyZW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+cHJvcGVydHkgaWQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbW1hbmRUeXBlXCI+Y29tbWFuZCB0eXBlIHRoYXQgYmVsb25nIHRvIHRoZSBwcm9wIGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ1cGRhdGVUaGlzXCI+PC9wYXJhbT5cclxuICBhc3luYyB1cGRhdGVQcm9wZXJ0eUxvZ2ljTmVzdGluZyhwcm9wSWQ6IG51bWJlciwgY29tbWFuZFR5cGU6IENvbW1hbmRUeXBlLCB2YWw6IGJvb2xlYW4sIHVwZGF0ZVRoaXM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmICh2YWwgJiYgdGhpcy5oYXZlVG9DaGVja1BhcmVudFZhbHVlKCkpIHtcclxuICAgIC8vICB2YWwgPSB0aGlzLmlzUGFyZW50UHJvcFZhbHVlKHByb3BJZCk7XHJcbiAgICAvLyB9XHJcbiAgICBpZiAodXBkYXRlVGhpcykge1xyXG5cclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFR5cGUgPT09IENvbW1hbmRUeXBlLlBST1BfU0VUX1ZJU0lCTEUgPyBIdG1sUHJvcGVydGllcy5WaXNpYmxlIDogSHRtbFByb3BlcnRpZXMuRW5hYmxlZCwgdmFsKTtcclxuXHJcbiAgICB9XHJcbiAgICAvLyB0b2RvOiBzaG91bGQgZ28gb3ZlciBvbmx5IGxpbmtlZCBjb250cm9scyAtIG5vdCBjaGlsZHJlbiBjb250cm9scywgbmVlZCB0byBjaGVjayB3aXRoIFBNIHRoaXMgYmVoYXZpb3JcclxuICAgIGF3YWl0IHRoaXMudXBkYXRlQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkLCBjb21tYW5kVHlwZSwgdmFsKTtcclxuICB9XHJcblxyXG4gIFNldEVuYWJsZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBIdG1sUHJvcGVydGllcy5FbmFibGVkLCB2YWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFVwZGF0ZXMgdmlzaWJpbGl0eSBvZiBjb250cm9scyBsaW5rZWQgdG8gdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbW1hbmRUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgdXBkYXRlQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkOiBudW1iZXIsIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZSwgdmFsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgaWYgKCFzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgIC8vIGluIHRhYmxlIGFsbCBjaGlsZHJlbiBhcmUgY29udGFpbmVkLFxyXG4gICAgICAvLyB0YWJsZSdzIHZpc2liaWxpdHlcXGVuYWJsZSB3aWxsIGFmZmVjdCB0aGVtXHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fbGlua2VkQ29udHJvbHMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuXHJcbiAgICAgICAgbGV0IGNoaWxkOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fbGlua2VkQ29udHJvbHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgLy8gRGVmZWN0IDExNzI5NC4gRG8gbm90IGNvbnRpbnVlIGZvciB0aGUgZmlyc3QgdGltZS4gSXQgYWZmZWN0cyBvbiB0aGUgcGxhY2VtZW50LlxyXG4gICAgICAgIGlmIChjaGlsZC5Jc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBsZXQgY2hpbGRWYWx1ZTogYm9vbGVhbiA9IChjaGlsZC5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQsIHRydWUpKTtcclxuXHJcbiAgICAgICAgY2hpbGRWYWx1ZSA9IGNoaWxkVmFsdWUgJiYgdmFsO1xyXG5cclxuICAgICAgICBsZXQgY2hpbGRPbkN1cnJlbnRMYXllcjogYm9vbGVhbiA9IHRoaXMuaXNDaGlsZE9uQ3VycmVudExheWVyKGNoaWxkKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbW1hbmRUeXBlID09PSBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFKSB7XHJcblxyXG4gICAgICAgICAgaWYgKGNoaWxkVmFsdWUpIHtcclxuICAgICAgICAgICAgY2hpbGRWYWx1ZSA9IGNoaWxkT25DdXJyZW50TGF5ZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBjaGlsZC51cGRhdGVDaGlsZHJlblByb3BWYWx1ZShwcm9wSWQsIGNvbW1hbmRUeXBlLCBjaGlsZFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHN1cGVyLmlzU3ViZm9ybSgpKSB7XHJcbiAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU3ViZm9ybUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZCwgY29tbWFuZFR5cGUsIHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbnRyb2wgaXMgZGVzY2VuZGFudCBvZiBzcGVjaWZpZWQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0Rlc2NlbmRlbnRPZkNvbnRyb2woY29udHJvbDogR3VpTWdDb250cm9sKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNDb250YWluZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoY29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgcGFyZW50OiBhbnkgPSB0aGlzLmdldFBhcmVudCgpO1xyXG4gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgTWdDb250cm9sQmFzZSkge1xyXG4gICAgICAgIGlmIChwYXJlbnQgPT09IGNvbnRyb2wpIHtcclxuICAgICAgICAgIGlzQ29udGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBJZiBjdXJyZW50IGNvbnRyb2wgYmVsb25ncyB0byB0YWJsZSwgdGhlbiBpdCBpcyBhbHNvIGEgZGVzY2VuZGFudCBvZiB0aGUgY29sdW1uIGNvbnRyb2wgdG9cclxuICAgICAgICAgIC8vIHdoaWNoIGl0IGJlbG9uZ3MuIEFjY29yZGluZyB0byBvdXIgaGllcmFyY2h5LCB0aGUgY29udHJvbCBpcyBkaXJlY3QgZGVzY2VuZGFudCBvZiB0YWJsZVxyXG4gICAgICAgICAgLy8gY29udHJvbDsgaGVuY2UsIHdlIG5lZWQgdG8gaGFuZGxlIGNvbHVtbiBjb250cm9sXHJcblxyXG4gICAgICAgICAgbGV0IHBhcmVudENvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSAoKHBhcmVudCBpbnN0YW5jZW9mIE1nQ29udHJvbEJhc2UpID8gPE1nQ29udHJvbEJhc2U+cGFyZW50IDogbnVsbCk7XHJcbiAgICAgICAgICBpZiAoY29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4gJiYgcGFyZW50Q29udHJvbCAhPT0gbnVsbCAmJiBwYXJlbnRDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFICYmIGNvbnRyb2wuTGF5ZXIgPT09IHRoaXMuTGF5ZXIpXHJcbiAgICAgICAgICAgIGlzQ29udGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgaXNDb250YWluZWQgPSAoKDxNZ0NvbnRyb2xCYXNlPnBhcmVudCkuaXNEZXNjZW5kZW50T2ZDb250cm9sKGNvbnRyb2wpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpc0NvbnRhaW5lZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBVcGRhdGVzIHZpc2liaWxpdHkgb3IgZW5hYmxlIHByb3BlcnR5IG9mIHN1YmZvcm0gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+SWQgb2YgdmlzaWJpbGl0eSBvciBlbmFibGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tbWFuZFR5cGVcIj50eXBlIG9mIHRoZSBHVUkgY29tbWFuZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj52YWx1ZSBmb3IgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICB1cGRhdGVTdWJmb3JtQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkOiBudW1iZXIsIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZSwgdmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGNoaWxkJ3MgbGF5ZXIgaXMgZXF1YWwgdG8gY3VycmVudCBsYXllciBvZiB0aGUgcGFyZW50LCByZWxhdmFudCBmb3IgdGFiIGNvbnRyb2wgZm9yIGFsbCBvdGhlclxyXG4gIC8vLyAgIGNvbnRyb2xzIHJldHVybnMgdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGlsZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHBhcmVudCBpcyBub3QgdGFiIGNvbnRyb2wgb3IgcGFyZW50IGlzIHRhYiBjb250cm9sIHdpdGggc2FtZSBsYXllcjwvcmV0dXJucz5cclxuICBpc0NoaWxkT25DdXJyZW50TGF5ZXIoY2hpbGQ6IE1nQ29udHJvbEJhc2UpOiBib29sZWFuIHtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gY2hlY2sgdGhhdCB0aGUgY29udHJvbCBoYXMgc2FtZSBsYXllciB0aGF0IGlzIGN1cnJlbnRseSBzZXQgb24gaXQncyBwYXJlbnQgdGFiIGNvbnRyb2xcclxuICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSkge1xyXG4gICAgICBsZXQgcGFyZW50TGF5ZXI6IG51bWJlciA9IDA7XHJcbiAgICAgIGlmICh0aGlzLlZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgcGFyZW50TGF5ZXIgPSB0aGlzLmdldEN1cnJlbnRMaW5rSWR4KCkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBsYXllcjogbnVtYmVyID0gY2hpbGQuZ2V0TGF5ZXIoKTtcclxuICAgICAgaWYgKHBhcmVudExheWVyICE9PSBsYXllciAmJiBsYXllciA+IDApIHtcclxuICAgICAgICAvLyBzb25zIG9mIGxheWVyIDAgZGlzcGxheWVkIGFsd2F5c1xyXG4gICAgICAgIHJldCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiBjdXJyZW50IGxpbmsgSWR4IG9mIGNob2ljZSBjb250cm9scywgb3IgemVybyBmb3Igb3RoZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEN1cnJlbnRMaW5rSWR4KCk6IG51bWJlciB7XHJcbiAgICBsZXQgY3VyckxpbmtJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzQ2hvaWNlQ29udHJvbCgpIHx8IHRoaXMuSGFzQXV0b2NvbXBsZXRlKCkpIHtcclxuICAgICAgbGV0IGN1cnJlbnRMYXllcnM6IG51bWJlcltdID0gdGhpcy5nZXRDdXJyZW50SW5kZXhPZkNob2ljZSgpO1xyXG4gICAgICBsZXQgY3VyckxpbmtJbmRpY2U6IG51bWJlcltdID0gdGhpcy5nZXRMaW5rSWR4RnJvbUxheWVyKGN1cnJlbnRMYXllcnMpO1xyXG4gICAgICBjdXJyTGlua0lkeCA9IGN1cnJMaW5rSW5kaWNlWzBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnJMaW5rSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXRzIGxheWVyIGZyb20gdGhlIHNlbGVjdGVkIGluZGljZSBwYXNzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5rSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+YXJyYXkgb2YgbGF5ZXIgdmFsdWVzLjwvcmV0dXJucz5cclxuICBnZXRMYXllckZyb21MaW5rSWR4KGluZGljZTogbnVtYmVyW10pOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgbGF5ZXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KGluZGljZS5sZW5ndGgpO1xyXG5cclxuICAgIGZvciAobGV0IGlDdHI6IG51bWJlciA9IDA7IGlDdHIgPCBpbmRpY2UubGVuZ3RoOyBpQ3RyID0gaUN0ciArIDEpIHtcclxuICAgICAgbGV0IGlkeDogbnVtYmVyID0gaW5kaWNlW2lDdHJdO1xyXG4gICAgICAvLyBCeSBkZWZhdWx0LCBsYXllciA9IGxpbmtJZHggdW5sZXNzIGl0IGlzIGEgVGFiIGNvbnRyb2xcclxuXHJcbiAgICAgIGxheWVyc1tpQ3RyXSA9IGlkeDtcclxuXHJcbiAgICAgIGlmIChzdXBlci5pc1RhYkNvbnRyb2woKSAmJiBpZHggPj0gMCkge1xyXG4gICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgICAgIGxpbmUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbGF5ZXJMaXN0OiBzdHJpbmdbXSA9IHRoaXMuX2Nob2ljZUxheWVyTGlzdC5nZXRfSXRlbShsaW5lKTtcclxuICAgICAgICBpZiAobGF5ZXJMaXN0ICE9PSBudWxsICYmIGxheWVyTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBsYXllcnNbaUN0cl0gPSBsYXllckxpc3QuaW5kZXhPZigoaWR4ICsgMSkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGF5ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIHRoZSBzZWxlY3RlZCBpbmRpY2UgZm9yIHNlbGVjdGVkIHZhbHVlcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxheWVyc1wiPmFuIGFycmF5IG9mIGN1cnJlbnQgbGF5ZXJzIHRhYiBjb250cm9scy4gSXQgY2FuIGJlIGFycmF5IGJlY2F1c2Ugb2YgbXVsdGlwbGUgc2VsZWN0aW9uLjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmFycmF5IG9mIGluZGljZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldExpbmtJZHhGcm9tTGF5ZXIobGF5ZXJzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcclxuICAgIGxldCBsaW5rSW5kaWNlOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KGxheWVycy5sZW5ndGgpO1xyXG4gICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IGxheWVycy5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICBsZXQgbGF5ZXI6IG51bWJlciA9IGxheWVyc1tpQ3RyXTtcclxuICAgICAgbGlua0luZGljZVtpQ3RyXSA9IGxheWVyO1xyXG4gICAgICBpZiAoc3VwZXIuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICBpZiAobGF5ZXIgPCAwKSB7XHJcbiAgICAgICAgICBsaW5rSW5kaWNlW2lDdHJdID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSk7XHJcbiAgICAgICAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgICAgICAgbGluZSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgbGF5ZXJMaXN0OiBzdHJpbmdbXSA9IHRoaXMuX2Nob2ljZUxheWVyTGlzdC5nZXRfSXRlbShsaW5lKTtcclxuICAgICAgICAgIGlmIChsYXllckxpc3QgIT09IG51bGwgJiYgdHlwZW9mIGxheWVyTGlzdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBsYXllckxpc3QubGVuZ3RoICE9PSAwICYmIGxheWVyIDwgbGF5ZXJMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsaW5rSW5kaWNlW2lDdHJdID0gTk51bWJlci5QYXJzZShsYXllckxpc3RbbGF5ZXJdKSAtIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGlua0luZGljZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWN1cnNpdmUgbWV0aG9kLCBjaGVja3MgaWYgcGFyZW50IG9mIHRoZSBjaGlsZCBpcyB2aXNpYmxlXFxlbmFibGUsIHVsdGlsIHRoZXJlIGlzIG5vIHBhcmVudCBvciBmb3VuZFxyXG4gIC8vLyAgIHBhcmVudCB0aGF0IGlzIGhpZGRlblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNQYXJlbnRQcm9wVmFsdWUocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBjb2x1bW46IE1nQ29udHJvbEJhc2UgPSB0aGlzLkZvcm0uZ2V0Q29udHJvbENvbHVtbih0aGlzKTtcclxuICAgIGxldCBwYXJlbnQ6IE1nQ29udHJvbEJhc2UgPSA8TWdDb250cm9sQmFzZT50aGlzLmdldExpbmtlZFBhcmVudCh0cnVlKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG5cclxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgLy8gbm8gbW9yZSBwYXJlbnRzXHJcbiAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gcGFyZW50IGlzIGhpZGRlblxyXG4gICAgICBpZiAoIXBhcmVudC5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQsIHRydWUpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKCFwYXJlbnQuaXNDaGlsZE9uQ3VycmVudExheWVyKHRoaXMpKSB7XHJcbiAgICAgICAgICAvLyBwYXJlbnQgaXMgdGFiIGNvbnRyb2wgd2l0aCBjdXJyZW50IGxheWVyXHJcbiAgICAgICAgICAvLyBkaWZmZXJlbnQgZnJvbSBjaGlsZCdzIGxheWVyXHJcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBmb3IgdGFibGUgY2hpbGRyZW4gY2hlY2sgaWYgY29sdW1uIHZpc2libGVcclxuICAgICAgICAgIHJlc3VsdCA9ICghKGNvbHVtbiAhPT0gbnVsbCAmJiAhY29sdW1uLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZCwgdHJ1ZSkpICYmIHBhcmVudC5pc1BhcmVudFByb3BWYWx1ZShwcm9wSWQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IGNvbnRyb2wgdG8gd2hpY2ggdGhpcyBjb250cm9sIGlzIGxpbmtlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja1N1YmZvcm1GYXRoZXJcIj5pZiB0cnVlIGNoZWNrIGZvciBTdWJmb3JtIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TGlua2VkUGFyZW50KGNoZWNrU3ViZm9ybUZhdGhlcjogYm9vbGVhbik6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIge1xyXG5cclxuICAgIGlmICh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHggIT09IC0xKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChjaGVja1N1YmZvcm1GYXRoZXIgJiYgdGhpcy5Gb3JtLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgY3VycmVudCBsaW5lIHZhbHVlIG9mIHRoZSByZWFkT25seSBoaXN0b3J5IGFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbFwiPnRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0PC9wYXJhbT5cclxuICBTZXRDdXJyUmVhZE9ubHkobmV3VmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyUmVhZE9ubHkuc2V0X0l0ZW0odGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKSwgbmV3VmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGN1cnJlbnQgcmVhZE9ubHkgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBjb250cm9sJ3MgY3VycmVudCBsaW5lIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVhZE9ubHkgdmFsdWU8L3JldHVybnM+XHJcbiAgR2V0Q3VyclJlYWRPbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHN1cGVyLmlzVGFibGVDb250cm9sKCkgPyAwIDogdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGxldCBjdXJyT2JqOiBhbnkgPSB0aGlzLl9jdXJyUmVhZE9ubHkuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICBsZXQgY3VycjogYm9vbGVhbjtcclxuICAgIGlmIChjdXJyT2JqID09PSBudWxsKSB7XHJcbiAgICAgIGN1cnIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fY3VyclJlYWRPbmx5LnNldF9JdGVtKGxpbmUsIGN1cnIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGN1cnIgPSA8Ym9vbGVhbj5jdXJyT2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgY29udHJvbCBpcyBhIERhdGEgQ29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNEYXRhQ3RybCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGRjcmVmIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsaW5lIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZGNJZDwvcmV0dXJucz5cclxuICBnZXREY1JlZigpOiBudW1iZXIge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGNMaW5lTnVtKCk7XHJcbiAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLl9kY1RhYmxlUmVmcy5nZXRfSXRlbSh0aGlzLmdldERjTGluZU51bSgpKTtcclxuICAgIGxldCBkY0lkOiBudW1iZXI7XHJcbiAgICBpZiAob2JqID09PSBudWxsKSB7XHJcbiAgICAgIGRjSWQgPSAtMjtcclxuICAgICAgdGhpcy5fZGNUYWJsZVJlZnMuc2V0X0l0ZW0obGluZSwgZGNJZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZGNJZCA9IDxudW1iZXI+b2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRjSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBmb3IgYSBkYXRhIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0RGNMaW5lTnVtKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5Jc1JlcGVhdGFibGUgPyB0aGlzLkZvcm0uRGlzcGxheUxpbmUgOiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoZSBvbmUgY2hvaWNlIG9wdGlvbiBmcm9tIGl0ZW1zIGxpc3QgaXMgdmFsaWQuIFRoZSBjaGVjayBpcyBvbmx5IGZvciBpdGVtcyBsaXN0IGFuZCBub3QgZm9yIHRoZVxyXG4gIC8vLyAgIGRhdGEgc291cmNlIG9wdGlvbnMsIChGWUk6IGZvciB0aGUgb3B0aW9uIGZyb20gdGhlIERhdGFDdHJsLCB3ZSBhcmUgbm90IGNhbGxpbmcgdGhpc1xyXG4gIC8vLyAgIG1ldGhvZCwgTk8gQ0hFQ0sgSVMgRE9ORSkgaW4gb25saW5lIDpjaV9jaGVja19yYW5nZV9zdHJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3B0aW9uOlwiPm9uZSBvcHRpb24gZnJvbSB0aGUgaXRlbXMgbGlzdDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIG9wdGlvbklzVmFsaWQob3B0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDICYmIG9wdGlvbi5sZW5ndGggPiAwICYmIG9wdGlvbi5pbmRleE9mKCcwJykgPT09IC0xKSB7XHJcbiAgICAgIGxldCBjb252ZXJ0TnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICBjb252ZXJ0TnVtLm51bV80X2Ffc3RkKG9wdGlvbik7XHJcbiAgICAgIGlmIChjb252ZXJ0TnVtLm51bV9pc196ZXJvKCkpIHtcclxuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByZXBhcmVzIGFuZCByZXR1cm5zIHRoZSBvcmRlcmVkIGxpc3QgYmFzZWQgb24gbGF5ZXJzIGluIGxheWVyTGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaG9pY2VEaXNwTGlzdFwiPnVub3JkZXJlZCBsaXN0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3JkZXJlZERpc3BMaXN0KGNob2ljZURpc3BMaXN0OiBzdHJpbmdbXSwgbGluZTogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG5cclxuICAgIGxldCBjaG9pY2VMYXllclN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBkaXNwQXJyeUxpc3Q6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuICAgIGxldCBsYXllckFycnlMaXN0OiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgbGF5ZXJQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFX0xBWUVSU19MSVNUKTtcclxuXHJcbiAgICBpZiAobGF5ZXJQcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIGNob2ljZUxheWVyU3RyID0gYXdhaXQgbGF5ZXJQcm9wLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNob2ljZUxheWVyU3RyID09PSBudWxsIHx8IFN0clV0aWwucnRyaW0oY2hvaWNlTGF5ZXJTdHIpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjaG9pY2VMYXllclN0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hvaWNlTGF5ZXJTdHIubGVuZ3RoID4gMCAmJiBjaG9pY2VEaXNwTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBsYXllckxpc3Q6IHN0cmluZ1tdID0gY2hvaWNlTGF5ZXJTdHIuc3BsaXQoXCIsXCIpO1xyXG4gICAgICBsZXQgcG9zQ29weUluZGV4OiBudW1iZXIgPSAtMTtcclxuICAgICAgZm9yIChsZXQgaW5kZXg6IG51bWJlciA9IDA7IGluZGV4IDwgbGF5ZXJMaXN0Lmxlbmd0aDsgaW5kZXggPSBpbmRleCArIDEpIHtcclxuICAgICAgICBsZXQgY3VyckxheWVyTGlzdFZhbDogc3RyaW5nID0gbGF5ZXJMaXN0W2luZGV4XS50cmltKCk7XHJcbiAgICAgICAgaWYgKCEobGF5ZXJBcnJ5TGlzdC5pbmRleE9mKGN1cnJMYXllckxpc3RWYWwpICE9PSAtMSkpIHtcclxuICAgICAgICAgIGxldCByZWZQb3NDb3B5SW5kZXg6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihwb3NDb3B5SW5kZXgpO1xyXG4gICAgICAgICAgbGV0IGlzTnVtYmVyOiBib29sZWFuID0gTk51bWJlci5UcnlQYXJzZShjdXJyTGF5ZXJMaXN0VmFsLCByZWZQb3NDb3B5SW5kZXgpO1xyXG4gICAgICAgICAgcG9zQ29weUluZGV4ID0gcmVmUG9zQ29weUluZGV4LnZhbHVlO1xyXG5cclxuICAgICAgICAgIC8vIHBvc0NvcHlJbmRleCBpcyAxQmFzZWQsIHNvIG11c3Qgbm90IGJlIHplcm8uIEFsc28sIGl0IG11c3Qgbm90IGJlXHJcbiAgICAgICAgICAvLyBncmVhdGVyIHRoYW4gbm8gb2YgZWxlbWVudHMgaW4gdGhlIERpcGxheUxpc3QuXHJcblxyXG4gICAgICAgICAgaWYgKGlzTnVtYmVyICYmIHBvc0NvcHlJbmRleCA+IDAgJiYgcG9zQ29weUluZGV4IDw9IGNob2ljZURpc3BMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBkaXNwQXJyeUxpc3QucHVzaCgoY2hvaWNlRGlzcExpc3RbcG9zQ29weUluZGV4IC0gMV0pLnRyaW0oKSk7XHJcbiAgICAgICAgICAgIGxheWVyQXJyeUxpc3QucHVzaChjdXJyTGF5ZXJMaXN0VmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmdbXTtcclxuICAgIGlmIChkaXNwQXJyeUxpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJlc3VsdCA9IGNob2ljZURpc3BMaXN0O1xyXG4gICAgICB0aGlzLl9jaG9pY2VMYXllckxpc3Quc2V0X0l0ZW0obGluZSwgbmV3IEFycmF5PHN0cmluZz4oMCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KGRpc3BBcnJ5TGlzdC5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IHJlc3VsdC5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICAgIHJlc3VsdFtfYWldID0gbnVsbDtcclxuXHJcbiAgICAgIHJlc3VsdCA9IGRpc3BBcnJ5TGlzdC5Ub0FycmF5KCk7XHJcbiAgICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCBsYXllckFycnlMaXN0LlRvQXJyYXkoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBwcmV2aW91cyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRQcmV2VmFsKCk6IHZvaWQge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgbGluZSA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gICAgdGhpcy5zZXRQcmV2SXNOdWxsX1RvTnVsbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vICAgc2V0cyB0aGUgcHJldklzTnVsbCB2YWx1ZSBvZiB0aGUgcHJldklzTnVsbCBhcnJheVxyXG4gIC8vLyAgIHRoZSBuZXdWYWx1ZSBjYW4gYmUgTlVMTCBvciBib29sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRQcmV2SXNOdWxsX1RvTnVsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZJc051bGxzLnNldF9JdGVtKHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSksIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgaWYgYW4gZXhwcmVzc2lvbiB3YXMgc2V0IGFzIHRoZSBkYXRhPC9yZXR1cm5zPlxyXG4gIGV4cHJlc3Npb25TZXRBc0RhdGEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsRXhwSWQgPiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGxlZCB3aGVuZXZlciB0aGUgY2hvaWNlIGxpc3Qgb2YgYSBTRUxFQ1QgY29udHJvbCBoYXMgY2hhbmdlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJSYW5nZShsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYXZlIHRvIGNoZWNrIHBhcmVudCB2aXNpYmlsaXR5XFxlbmFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50cnVlLCBpZiB0aGUgY29udHJvbCBpcyBjb25uZWN0ZWQgdG8gYSBjb250YWluZXIgb3IgdGhlIHRhc2sgaXMgYSBzdWJmb208L3JldHVybnM+XHJcbiAgaGF2ZVRvQ2hlY2tQYXJlbnRWYWx1ZSgpOiBib29sZWFuIHtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHggIT09IC0xKSB7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNDb250YWluZWRJbkxpbmtlZFBhcmVudCgpKSB7XHJcbiAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBjb250YWluZWQgdGFiIGNoaWxkcmVuIG9mIGFsbCBsYXllcnMgYXJlIG9uIHRoZSBzYW1lIHdpbmRvdyxcclxuICAgICAgLy8gc28gd2UgbXVzdCBoYW5kbGUgdGhlcmUgdmlzaWJpbGl0eVxcZW5hYmxlXHJcblxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmdldEN0cmwodGhpcy5fbGlua2VkUGFyZW50RGl0SWR4KS5pc1RhYkNvbnRyb2woKSB8fCB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHgpLmlzR3JvdXAoKSkge1xyXG4gICAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5Gb3JtLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgY29udHJvbCBpcyBjb250YWluIGluIGl0cyBsaW5rZWQgcGFyZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzQ29udGFpbmVkSW5MaW5rZWRQYXJlbnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMSAmJiB0aGlzLl9jb250YWluZXJEaXRJZHggPT09IHRoaXMuX2xpbmtlZFBhcmVudERpdElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb21iaW5lIHR3byBzdHJpbmdzIGFycmF5IGludG8gb25lLiBFYWNoIG9mIHRoZSBvcmlnaW5hbCBhcnJheXMgbWF5IGJlIG51bGwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZpcnN0U3RyaW5nc1wiPnRoZSBmaXJzdCBzdHJpbmdzIGFycmF5IHRoYXQgd2lsbCBhbHdheXMgb2NjdXB5IHRoZSBmaXJzdCBhcnJheSBjZWxsczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsYXN0U3RyaW5nc1wiPnRoZSBsYXN0IHN0cmluZ3MgYXJyYXkgdGhhdCB3aWxsIGFsd2F5cyBvY2N1cHkgdGhlIGxhc3QgYXJyYXkgY2VsbHM8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gY29tYmluZWQgU3RyaW5ncyBhcnJheTwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBjb21iaW5lU3RyaW5nQXJyYXlzKGZpcnN0U3RyaW5nczogc3RyaW5nW10sIGxhc3RTdHJpbmdzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuXHJcbiAgICBpZiAoZmlyc3RTdHJpbmdzICE9PSBudWxsKVxyXG4gICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGZpcnN0U3RyaW5ncyk7XHJcblxyXG4gICAgaWYgKGxhc3RTdHJpbmdzICE9PSBudWxsKVxyXG4gICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGxhc3RTdHJpbmdzKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG4gIEdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuLCBsaW5lPzogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiAocHJvcElkID09PSBudWxsIHx8IHByb3BJZC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAoZGVmYXVsdFJldFZhbCA9PT0gbnVsbCB8fCBkZWZhdWx0UmV0VmFsLmNvbnN0cnVjdG9yID09PSBCb29sZWFuKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8wKHByb3BJZCwgZGVmYXVsdFJldFZhbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8xKHByb3BJZCwgZGVmYXVsdFJldFZhbCwgbGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0aGUgYm9vbGVhbiBjb21wdXRlZCB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICBwcml2YXRlIEdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBkZWZhdWx0UmV0VmFsO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KHByb3BJZCk7XHJcbiAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBwcm9wLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbCAtIGlmIHRoZSBjb250cm9sIGlzIHJlcGVhdGFibGUgYW5kIHRoZSBsaW5lIGlzXHJcbiAgLy8vIGRpZmZlcmVudCB0aGFuIHRoZSBmb3JtcyBjdXJyZW50IGxpbmUgdGhlbiByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBjb250cm9sIHByb3BlcnR5IGF0IHRoYXQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlZmF1bHRSZXRWYWxcIj50aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgKHdoZW4gdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0KTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+dGhlIGxpbmUgbnVtYmVyIGluIHRhYmxlIGluIHdoaWNoIHRoZSBjb250cm9sIGlzIGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMShwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbiwgbGluZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZGVmYXVsdFJldFZhbDtcclxuXHJcbiAgICBpZiAodGhpcy5pc1Byb3BlcnR5UmVwZWF0YWJsZShwcm9wSWQpICYmIHRoaXMuRm9ybS5EaXNwbGF5TGluZSAhPT0gbGluZSkge1xyXG4gICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkocHJvcElkKTtcclxuICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBwcm9wLmdldFByZXZWYWx1ZShsaW5lKTtcclxuICAgICAgICBpZiAodmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbih2YWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkLCBkZWZhdWx0UmV0VmFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBib29sZWFuIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2wgLSBpZiB0aGUgY29udHJvbCBpcyByZXBlYXRhYmxlIGFuZCB0aGUgbGluZSBpc1xyXG4gIC8vLyAgIGRpZmZlcmVudCB0aGFuIHRoZSBmb3JtcyBjdXJyZW50IGxpbmUgdGhlbiByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBjb250cm9sIHByb3BlcnR5IGF0IHRoYXRcclxuICAvLy8gICBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj50aGUgbGluZSBudW1iZXIgaW4gdGFibGUgaW4gd2hpY2ggdGhlIGNvbnRyb2wgaXMgbG9jYXRlZDwvcGFyYW0+XHJcbiAgYXN5bmMgY2hlY2tQcm9wV2l0aExpbmUocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4sIGxpbmU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGRlZmF1bHRSZXRWYWw7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNQcm9wZXJ0eVJlcGVhdGFibGUocHJvcElkKSAmJiB0aGlzLkZvcm0uRGlzcGxheUxpbmUgIT09IGxpbmUpIHtcclxuICAgICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKHByb3BJZCk7XHJcbiAgICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gcHJvcC5nZXRQcmV2VmFsdWUobGluZSk7XHJcbiAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4odmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChwcm9wSWQsIGRlZmF1bHRSZXRWYWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlZmF1bHRSZXRWYWxcIj50aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgKHdoZW4gdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0KTwvcGFyYW0+XHJcbiAgYXN5bmMgY2hlY2tQcm9wKHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZGVmYXVsdFJldFZhbDtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChwcm9wSWQpO1xyXG4gICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgcHJvcC5nZXRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHByb3BJZCBwcm9wZXJ0eSBpcyByZXBlYXRhYmxlIGZvciB0aGlzIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUHJvcGVydHlSZXBlYXRhYmxlKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNSZXBlYXRhYmxlOiBib29sZWFuID0gdGhpcy5Jc1JlcGVhdGFibGU7XHJcbiAgICBpZiAoaXNSZXBlYXRhYmxlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBzdXBlci5pc1RhYmxlQ29udHJvbCgpICYmIFByb3BlcnR5LmlzUmVwZWF0YWJsZUluVGFibGUocHJvcElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBhbmQgdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+dGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGluIG1hZ2ljIGludGVybmFsIGZvcm1hdCB0byBiZSBkaXNwbGF5ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZShtZ1ZhbDogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkY1JhbmdlSXNFbXB0eTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgaWYgKG1nVmFsID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuVmFsdWUgPSBcIlwiO1xyXG4gICAgICAvLyBRQ1IgMzA4NDc1IC0gY29udHJvbHMgdGhhdCBhcmUgSW5pdGlhbGl6ZWQgd2l0aCBudWxsIHNob3VsZCBiZSBnaXZlbiBtYWdpYyBkZWZhdWx0IHZhbHVlLlxyXG4gICAgICBpZiAoIWlzTnVsbClcclxuICAgICAgICBtZ1ZhbCA9IEZpZWxkRGVmLmdldE1hZ2ljRGVmYXVsdFZhbHVlKHRoaXMuRGF0YVR5cGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSkge1xyXG4gICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICAgICAgbGluZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBsYXllcnM6IG51bWJlcltdID0gdGhpcy5nZXRMYXllckZyb21MaW5rSWR4KGF3YWl0IHRoaXMuZ2V0SW5kZXhPZkNob2ljZShtZ1ZhbCwgbGluZSwgaXNOdWxsKSk7XHJcblxyXG4gICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBubyBzZWxlY3Rpb24gZm9yIGEgdGFiIGNvbnRyb2wuXHJcbiAgICAgICAgLy8gU28sIGlmIHRoZXJlIGlzIG5vIFRhYiB0byBiZSBzZWxlY3RlZCwgc2VsZWN0IHRoZSBmaXJzdCBUYWIgYW5kXHJcbiAgICAgICAgLy8gYWxzbyB1cGRhdGUgdGhlIGZpZWxkJ3MgdmFsdWUgYWNjb3JkaW5nbHkuXHJcblxyXG4gICAgICAgIGlmIChsYXllcnNbMF0gPCAwICYmIHN1cGVyLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICBsYXllcnNbMF0gPSAwO1xyXG4gICAgICAgICAgbWdWYWwgPSBhd2FpdCB0aGlzLmdldExpbmtWYWx1ZShsYXllcnNbMF0udG9TdHJpbmcoKSwgbGluZSk7XHJcbiAgICAgICAgICBpc051bGwgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiBtZ1ZhbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhd2FpdCAoPEd1aVRhc2tCYXNlPnRoaXMuX2ZpZWxkLmdldFRhc2soKSkuVXBkYXRlRmllbGRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHRoaXMuX2ZpZWxkLCBtZ1ZhbCwgaXNOdWxsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IE1pc2MuR2V0Q29tbWFTZXBlcmF0ZWRTdHJpbmcobGF5ZXJzKTtcclxuICAgICAgICBkY1JhbmdlSXNFbXB0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSICM0NTAyNDg6IGFuIGVtcHR5IHJhbmdlIGluIHRoZSBkYXRhIGNvbnRyb2wgY2F1c2VkIGRlbGV0aW5nIHRoZSB2YWx1ZVxyXG4gICAgLy8gb2YgdGhlIGNvbnRyb2wgd2hlbiBsZWF2aW5nIGl0LiBOb3csIHRoZSByYW5nZSBvZiB0aGUgY29udHJvbCBpcyB1c2VkIHdoZW5cclxuICAgIC8vIHRoZSBkYXRhIGNvbnRyb2wgcmFuZ2UgaXMgZW1wdHkuXHJcbiAgICBpZiAoZGNSYW5nZUlzRW1wdHkpIHtcclxuICAgICAgaWYgKCFzdXBlci5pc0NoZWNrQm94KCkgJiYgKHRoaXMuX2ZpZWxkID09PSBudWxsIHx8ICFpc051bGwgfHwgIXRoaXMuX2ZpZWxkLmhhc051bGxEaXNwbGF5VmFsdWUoKSkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKChzdXBlci5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikgfHwgc3VwZXIuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmFsdWUgPSBtZ1ZhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoKHRoaXMuX2ZpZWxkID09PSBudWxsICYmIGlzTnVsbCkgJiYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FIHx8IHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTikpIHtcclxuICAgICAgICAgICAgICB0aGlzLlZhbHVlID0gbWdWYWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgbGV0IGluQ29udHJvbDogYm9vbGVhbiA9IHRoaXMuSW5Db250cm9sO1xyXG4gICAgICAgICAgICAgIHRoaXMuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AobWdWYWwsIHRoaXMuX3JhbmdlLCB0aGlzLl9waWMsIHRydWUsIHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBpbkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBEZWZlY3QgIyAxMzg4MDMgOiBGaXggdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdW5pUGFhUy4gRG8gbm90IGNhbGwgcnRyaW1WYWx1ZSgpIHdoZW4gcmVmcmVzaGluZyB0aGUgZGlzcGxheSBpZiB0aGUgZGF0YSB0eXBlXHJcbiAgICAgICAgICAvLyBpcyBub3QgbnVtZXJpYyBvciBsZWZ0IGp1c3RpZnkgcHJvcGVydHkgaXMgTm8uXHJcbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuVmFsdWUgPT09ICdzdHJpbmcnICYmICghdGhpcy5fcGljLmlzQXR0ck51bWVyaWMoKSB8fCB0aGlzLl9waWMuaXNMZWZ0KCkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucnRyaW1WYWx1ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGlubmVyRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoaW5uZXJFeGNlcHRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sOiAnezB9JywgbWd2YWw6IHsxfVwiLCB0aGlzLk5hbWUsIG1nVmFsKSwgaW5uZXJFeGNlcHRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5WYWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIG1nVmFsID0gRmllbGREZWYuZ2V0TWFnaWNEZWZhdWx0VmFsdWUodGhpcy5EYXRhVHlwZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGlubmVyRXhjZXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NoZWNrQm94KCkpXHJcbiAgICAgICAgICB0aGlzLlZhbHVlID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4obWdWYWwpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuVmFsdWUgPSBtZ1ZhbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gVHJhbnNsYXRlIGxvZ2ljYWwgbmFtZSBmb3IgaW1hZ2UgY29udHJvbC5cclxuICAgIGlmICgoc3VwZXIuaXNJbWFnZUNvbnRyb2woKSAmJiB0aGlzLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHx8IHN1cGVyLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICBtZ1ZhbCA9IEV2ZW50cy5UcmFuc2xhdGVMb2dpY2FsTmFtZShtZ1ZhbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLklzTnVsbCA9IGlzTnVsbDtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlWYWx1ZShtZ1ZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyBpZiB0aGUgY29udHJvbCdzIHZhbHVlIGlzIG1vZGlmaWVkIGFuZCBpZiBzbywgdXBkYXRlcyB0aGUgTW9kaWZpZWRCeVVzZXIgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1ZhbHVlXCI+PC9wYXJhbT5cclxuICBVcGRhdGVNb2RpZmllZEJ5VXNlcihuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gRm9yIGltYWdlIGNvbnRyb2wgYW5kIGltYWdlIGJ1dHRvbiwgdGhlIHZhbHVlIHdvdWxkIG5vdCBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyLiBCdXQsIGlmIGl0IGhhc1xyXG4gICAgLy8gYSBsb2dpY2FsIG5hbWUsIGl0IGlzIHJlcGxhY2VkLiBPciBpZiBpdCBpcyBmaWxlU2VydmVyIGdldCwgdGhlIHZhbHVlIGlzIHJlcGxhY2VkIGJ5IGEgc2VydmVyIHVybC5cclxuICAgIC8vIEluIGJvdGggdGhlc2UgY2FzZXMsIHdlIHNob3VsZCBub3QgbWFyayBpdCBhcyBtb2RpZmllZC5cclxuICAgIGlmICghKHN1cGVyLmlzQnV0dG9uKCkgfHwgc3VwZXIuaXNJbWFnZUNvbnRyb2woKSkpIHtcclxuICAgICAgbGV0IGN0cmxDdXJySXNOdWxsOiBib29sZWFuID0gdGhpcy5Jc051bGw7XHJcbiAgICAgIGxldCB2YWxDaGFuZ2VkOiBib29sZWFuID0gKHRoaXMuaXNEaWZmZXJlbnRWYWx1ZShuZXdWYWx1ZSwgZmFsc2UsIGZhbHNlKSk7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgdmFsdWUgZGlkbid0IGNoYW5nZSB0aGVuIGxldCdzIGNoZWNrIGlmIHRoZSBudWxsaXR5IGhhdmUgY2hhbmdlZFxyXG4gICAgICBpZiAoIXZhbENoYW5nZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5DYW5HZXROdWxsRnJvbUNvbnRyb2xWYWx1ZSgpKSB7XHJcbiAgICAgICAgICB2YWxDaGFuZ2VkID0gKGN0cmxDdXJySXNOdWxsICE9PSB0aGlzLmlzTnVsbFZhbHVlKG5ld1ZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWxDaGFuZ2VkIHx8IHRoaXMuS2V5U3Ryb2tlT24pIHtcclxuICAgICAgICB0aGlzLk1vZGlmaWVkQnlVc2VyID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJUcmltcyB0aGUgY29udHJvbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBydHJpbVZhbHVlKCk6IHZvaWQge1xyXG4gICAgaWYgKChzdXBlci5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikgfHwgc3VwZXIuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgIHRoaXMuVmFsdWUgPSBOU3RyaW5nLlRyaW1FbmQodGhpcy5WYWx1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG1pbmltdW1WYWx1ZUxlbmd0aDogbnVtYmVyID0gdGhpcy5nZXRNaW5pbXVtVmFsdWVMZW5ndGgoKTtcclxuICAgICAgLy8gUlRyaW0gdGhlIHZhbHVlIGJleW9uZCB0aGlzIGluZGV4XHJcbiAgICAgIGlmICh0aGlzLlZhbHVlLmxlbmd0aCA+IG1pbmltdW1WYWx1ZUxlbmd0aCkge1xyXG4gICAgICAgIGxldCBzdHI6IHN0cmluZyA9IHRoaXMuVmFsdWUuc3Vic3RyKG1pbmltdW1WYWx1ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIC8vIGNvcHkgdGhlIG1pbmltdW0gbGVuZ3RoIHZhbHVlIGFzIGlzXHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IHRoaXMuVmFsdWUuc3Vic3RyKDAsIG1pbmltdW1WYWx1ZUxlbmd0aCk7XHJcbiAgICAgICAgLy8gcnRyaW0gdGhlIHZhbHVlIGJleW9uZCBtaW5pbXVtIGxlbmd0aFxyXG4gICAgICAgIHRoaXMuVmFsdWUgPSB0aGlzLlZhbHVlICsgU3RyVXRpbC5ydHJpbVdpdGhOdWxsKHN0ciwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFsd2F5cyB0cmltIHRoZSBudW1lcmljIHZhbHVlLlxyXG4gICAgICBpZiAoc3VwZXIuaXNUZXh0Q29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQykge1xyXG4gICAgICAgIHRoaXMuVmFsdWUgPSBOU3RyaW5nLlRyaW1FbmQodGhpcy5WYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIGxlbmd0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRNaW5pbXVtVmFsdWVMZW5ndGgoKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW5MZW5ndGg6IG51bWJlciA9IHRoaXMuX3BpYy5nZXRNYXNrTGVuZ3RoKCk7XHJcblxyXG4gICAgLy8gdHJhdmVyc2UgZnJvbSByaWdodCB0aWxsIGEgdmFsaWQgbWFzayBjaGFyIGlzIGVuY291bnRlcmVkXHJcbiAgICB3aGlsZSAobWluTGVuZ3RoID4gMCAmJiAhdGhpcy5fcGljLnBpY0lzTWFzayhtaW5MZW5ndGggLSAxKSkge1xyXG4gICAgICBtaW5MZW5ndGggPSBtaW5MZW5ndGggLSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1pbkxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNOdWxsVmFsdWUoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCByZXRJc051bGxDb250cm9sOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5DYW5HZXROdWxsRnJvbUNvbnRyb2xWYWx1ZSgpICYmIHN0ciA9PT0gXCJcIikge1xyXG4gICAgICByZXRJc051bGxDb250cm9sID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRJc051bGxDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRoaXMgY29udHJvbCBjYW4gZ2V0IG51bGwgdmFsdWUgZnJvbSB0aGUgY29udHJvbCBoaW1zZWxmXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENhbkdldE51bGxGcm9tQ29udHJvbFZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIHNwZWNpZmljIGluZGV4IGNvcnJlc3BvbmRzIHRvIGEgbnVsbCB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzQ2hvaWNlTnVsbChpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbjtcclxuICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICBsZXQgZGNWYWxzOiBEY1ZhbHVlcyA9IHRoaXMuZ2V0RGNWYWxzKCk7XHJcbiAgICAgIHJldHVybiBkY1ZhbHMuaXNOdWxsKGlkeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ29tcHV0ZXMgdGhlIGNvbnRyb2wncyB2YWx1ZSBlaXRoZXIgZnJvbSBleHByZXNzaW9uIG9yIGZpZWxkIGFuZCByZWZyZXNoZXMgdGhlIEdVSSA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9yY2VSZWZyZXNoXCI+PC9wYXJhbT5cclxuICBhc3luYyBDb21wdXRlQW5kUmVmcmVzaERpc3BsYXlWYWx1ZShmb3JjZVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChmb3JjZVJlZnJlc2gpIHtcclxuICAgICAgdGhpcy5yZXNldFByZXZWYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRXhwSWQgPiAwKSB7XHJcbiAgICAgIGxldCB3YXNFdmFsdWF0ZWQ6IGJvb2xlYW47XHJcbiAgICAgIGxldCByZWZXYXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtPGJvb2xlYW4+KHdhc0V2YWx1YXRlZCk7XHJcblxyXG4gICAgICBsZXQgcmV0RXhwOiBzdHJpbmcgPVxyXG4gICAgICAgIGF3YWl0IHRoaXMuRXZhbHVhdGVFeHByZXNzaW9uKHRoaXMuX3ZhbEV4cElkLCB0aGlzLkRhdGFUeXBlLCB0aGlzLl9waWMuZ2V0U2l6ZSgpLCB0cnVlLCBTdG9yYWdlQXR0cmlidXRlLlNLSVAsIGZhbHNlLCByZWZXYXNFdmFsdWF0ZWQpO1xyXG4gICAgICB3YXNFdmFsdWF0ZWQgPSByZWZXYXNFdmFsdWF0ZWQudmFsdWU7XHJcbiAgICAgIGlmICh3YXNFdmFsdWF0ZWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLlNldEFuZFJlZnJlc2hEaXNwbGF5VmFsdWUocmV0RXhwLCByZXRFeHAgPT09IG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgPSBOU3RyaW5nLkVtcHR5O1xyXG4gICAgICAgIGxldCBpc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBsZXQgcmVmVmFsdWU6IFJlZlBhcmFtPHN0cmluZz4gPSBuZXcgUmVmUGFyYW08c3RyaW5nPih2YWx1ZSk7XHJcbiAgICAgICAgbGV0IHJlZklzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW08Ym9vbGVhbj4oaXNOdWxsKTtcclxuICAgICAgICAoPEd1aVRhc2tCYXNlPnRoaXMuX2ZpZWxkLmdldFRhc2soKSkuZ2V0RmllbGREaXNwbGF5VmFsdWUodGhpcy5fZmllbGQsIHJlZlZhbHVlLCByZWZJc051bGwpO1xyXG4gICAgICAgIHZhbHVlID0gcmVmVmFsdWUudmFsdWU7XHJcbiAgICAgICAgaXNOdWxsID0gcmVmSXNOdWxsLnZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZSh2YWx1ZSwgaXNOdWxsKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoIXN1cGVyLmlzVGFibGVDb250cm9sKCkgJiYgIXN1cGVyLmlzQ29sdW1uQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5VmFsdWUodGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIERlY2lkZXMgaWYgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIHJlZnJlc2hlZCB3aGlsZSBlbnRlcmluZyBhIGNvbnRyb2wuIFZhbHVlcyBmb3Igc29tZSBkYXRhIHR5cGVzXHJcbiAgLy8vIGFyZSBkaXNwbGF5ZWQgZGlmZmVyZW50bHkgd2hpbGUgcGFya2VkIG9uIHRoZSBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRSZWZyZXNoT25Db250cm9sRW50ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUICYmIHRoaXMuZ2V0RmllbGQoKSAhPT0gbnVsbCAmJiAodGhpcy5nZXRGaWVsZCgpLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8XHJcbiAgICAgIHRoaXMuZ2V0RmllbGQoKS5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSB8fCB0aGlzLmdldEZpZWxkKCkuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGRpc3BsYXllZCB2YWx1ZSBvbmx5ICh3aXRob3V0IHRoZSBvdGhlciBwcm9wZXJ0aWVzIG9mIHRoZSBjb250cm9sKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbFwiPmlzIHRoZSBtYWdpYyBpbnRlcm5hbCB2YWx1ZSBvZiB0aGUgcHJlc2VudGF0aW9uIHZhbHVlPC9wYXJhbT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheVZhbHVlKG1nVmFsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IHZhbHVlQ2hhbmdlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgc2F2ZVZhbHVlQ2hhbmdlZDogYm9vbGVhbiA9IHZhbHVlQ2hhbmdlZDtcclxuXHJcbiAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgbGluZSA9IDA7XHJcbiAgICB9XHJcbiAgICAvLyBBVFRFTlRJT046XHJcbiAgICAvLyB0aGUgdXNlIG9mIHRoZSBmdW5jdGlvbiBnZXROYW1lKCkgaW5zdGVhZCBvZiB1c2luZyB0aGUgbmFtZSBtZW1iZXIgdmFyaWFibGVcclxuICAgIC8vIGlzIHRvIGVuaGFuY2UgdGhlIHVzZSBvZiBjb250cm9scyB3aGljaCBhcmUgY29udGFpbmVkIGluIGEgdGFibGVcclxuICAgIC8vIHVwZGF0ZSB0aGUgZGlzcGxheVxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgIGxldCBwcmV2VmFsdWU6IHN0cmluZyA9IHRoaXMuX3ByZXZWYWx1ZXMuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICAgIGxldCBwcmV2TnVsbDogYm9vbGVhbiA9IHRoaXMuZ2V0UHJldklzTnVsbCgpO1xyXG5cclxuICAgICAgaWYgKFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5Jc1R5cGVBbHBoYU9yVW5pY29kZSh0aGlzLkRhdGFUeXBlKSkge1xyXG4gICAgICAgIGlmIChTdHJVdGlsLnJ0cmltKG1nVmFsKSA9PT0gU3RyVXRpbC5ydHJpbShwcmV2VmFsdWUpIHx8XHJcbiAgICAgICAgICAobWdWYWwgIT09IG51bGwgJiYgU3RyVXRpbC5ydHJpbShtZ1ZhbCkgPT09IFN0clV0aWwucnRyaW0ocHJldlZhbHVlKSkpIHtcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByZXZOdWxsICE9PSB0aGlzLklzTnVsbCkge1xyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgO1xyXG4gICAgICAgIGlmIChtZ1ZhbCA9PT0gcHJldlZhbHVlIHx8IChtZ1ZhbCAhPT0gbnVsbCAmJiBtZ1ZhbCA9PT0gcHJldlZhbHVlKSlcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocHJldk51bGwgIT09IHRoaXMuSXNOdWxsKVxyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5zZXRfSXRlbShsaW5lLCBtZ1ZhbCk7XHJcbiAgICAgIHRoaXMuc2V0UHJldklzTnVsbCh0aGlzLklzTnVsbCk7XHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMuVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEU6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU46XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MQUJFTDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9HUk9VUDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NUQVRVU19CQVI6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9GUkFNRV9TRVQ6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT05UQUlORVI6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9GUkFNRV9GT1JNOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU0JfTEFCRUw6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSU5FOlxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JST1dTRVI6XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkICYmIHRoaXMuVmFsdWUgIT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5zZXRVcmwoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9JTUFHRTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NCX0lNQUdFOlxyXG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZCAmJiB0aGlzLlZhbHVlICE9IG51bGwpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW1hZ2UoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWDpcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQgfHwgIHRoaXMuZm9yY2VSZWZyZXNoKVxyXG4gICAgICAgICAgICB0aGlzLnNldENoZWNrQm94VmFsdWUobGluZSwgbWdWYWwpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTUJPOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVDpcclxuICAgICAgICAgIHNhdmVWYWx1ZUNoYW5nZWQgPSB2YWx1ZUNoYW5nZWQ7XHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtTGlzdEJ5RGF0YVNvdXJjZShsaW5lLCB2YWx1ZUNoYW5nZWQpO1xyXG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAvLyBmaXhlZCBidWcjOjc3NjIxNSwgODAwNzYzLDk0MTg0MSwgdGhlIHByZXZWYWx1ZSBpcyBzYXZlIGFzIG1ndmFsIG5lZWQgdG8gY29udmVydCB0byBsYXllclxyXG4gICAgICAgICAgICBsZXQgcHJldkRpc3BsYXlWYWx1ZTogbnVtYmVyW10gPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gRml4IGJ1ZyM6Nzg0MzkxXHJcbiAgICAgICAgICAgIC8vIElmIEl0ZW1MaXN0IHdhcyB1cGRhdGUgcmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlIHRoZW4gdGhlIHZhbHVlIG11c3QgYmUgc2V0XHJcblxyXG4gICAgICAgICAgICBpZiAoc2F2ZVZhbHVlQ2hhbmdlZCA9PT0gdmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHByZXZWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcHJldkRpc3BsYXlWYWx1ZSA9IHRoaXMuZ2V0TGF5ZXJGcm9tTGlua0lkeChhd2FpdCB0aGlzLmdldEluZGV4T2ZDaG9pY2UocHJldlZhbHVlLCBsaW5lLCBwcmV2TnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHByZXZEaXNwbGF5VmFsdWUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHByZXZEaXNwbGF5VmFsdWVbaV0gPT09IEd1aUNvbnN0YW50cy5ERUZBVUxUX1ZBTFVFX0lOVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXZEaXNwbGF5VmFsdWVbaV0gPSBHdWlDb25zdGFudHMuREVGQVVMVF9MSVNUX1ZBTFVFO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBpbmRpY2UgPSBNaXNjLkdldEludEFycmF5KHRoaXMuVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgICBsZXQgY3VycmVudExheWVyID0gdGhpcy5nZXRDdXJyZW50TGlua0lkeCgpO1xyXG4gICAgICAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgbGluZSwgSHRtbFByb3BlcnRpZXMuU2VsZWN0ZWRWYWx1ZSwgaW5kaWNlWzBdLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgbGluZSwgSHRtbFByb3BlcnRpZXMuU2VsZWN0ZWRMYXllciwgY3VycmVudExheWVyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5Jc011bHRpcGxlU2VsZWN0aW9uTGlzdEJveCgpKSB7XHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGxpbmUsIGluZGljZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCBsaW5lLCArdGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT046XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUOlxyXG4gICAgICAgICAgaWYgKHRoaXMuSGFzQXV0b2NvbXBsZXRlKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmUsIHZhbHVlQ2hhbmdlZCk7XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIChmb3JtLmZvcm1SZWZyZXNoZWQoKSB8fCBmb3JjZVJlZnJlc2ggfHwgdmFsRXhwICE9IG51bGwgJiZcclxuICAgICAgICAgICAgLy8gdmFsRXhwLmNvbXB1dGVkQnlDbGllbnRPbmx5KCkpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0SW1hZ2VXaXRoRmlsZU5hbWUodGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0VGV4dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTzpcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmUsIHZhbHVlQ2hhbmdlZCk7XHJcbiAgICAgICAgICBpZiAoIXZhbHVlQ2hhbmdlZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgdGhpcy5zZXRSYWRpb0NoZWNrZWQodGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgICAvLyBzZXRSYWRpb0NoZWNrZWQodmFsdWUgLmxlbmd0aCgpID09IDAgPyBERUZBVUxUX1ZBTFVFX0lOVCA6IEludGVnZXIucGFyc2VJbnQodmFsdWUpKTtcclxuICAgICAgICAgIC8vIGlmICghdGFzay5zdGFydFByb2Nlc3MoKSlcclxuICAgICAgICAgIC8vIGd1aU1hbmFnZXIuc2V0Rm9jdXModGhpcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gQ29udHJvbC5SZWZyZXNoRGlzcGxheVZhbHVlKCkgdW5rbm93biB0eXBlOiB7MH1cIiwgdGhpcy5UeXBlKSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSAmJiB2YWx1ZUNoYW5nZWQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQcm9wZXJ0eUxvZ2ljTmVzdGluZyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFLCBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCB0cnVlKSwgZmFsc2UpO1xyXG4gICAgfSBjYXRjaCAoZXhfMzYwKSB7XHJcbiAgICAgIGlmIChleF8zNjAgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIENvbnRyb2wuUmVmcmVzaERpc3BsYXlWYWx1ZSgpIGZvciBjb250cm9sOiB7MH1cIiwgdGhpcy5OYW1lKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4XzM2MDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KG9ubHlSZXBlYXRhYmxlUHJvcHM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQob25seVJlcGVhdGFibGVQcm9wcykpXHJcbiAgICAgIG9ubHlSZXBlYXRhYmxlUHJvcHMgPSBmYWxzZTtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlfMShvbmx5UmVwZWF0YWJsZVByb3BzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGVzIHRoZSBkaXNwbGF5IG9mIHRoZSBjb250cm9sIGluY2x1ZGluZyBpdHMgdmFsdWUgYW5kIGl0cyBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlSZXBlYXRhYmxlUHJvcHNcIj5pZiBjb250cm9sIHRyZWUgLSByZWZyZXNoZXMgb25seSByZXBlYXRhYmxlIHRyZWUgcHJvcGVydGllczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBSZWZyZXNoRGlzcGxheV8xKG9ubHlSZXBlYXRhYmxlUHJvcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyAjNDIyMjUwLiBTa2lwIHRoZSByZWZyZXNoIGRpc3BsYXkgb2YgdGhlIHBhcmVudCdzIHN1YmZvcm0gY29udHJvbCBpZiB0aGUgZm9ybSBpbnNpZGUgaXQgaXMgc3RpbGwgaW4gaXRzIFJlZnJlc2hEaXNwbGF5LlxyXG4gICAgaWYgKCEoc3VwZXIuaXNTdWJmb3JtKCkgJiYgdGhpcy5HZXRTdWJmb3JtTWdGb3JtKCkgIT09IG51bGwgJiYgdGhpcy5HZXRTdWJmb3JtTWdGb3JtKCkuaW5SZWZyZXNoRGlzcGxheSgpKSkge1xyXG5cclxuICAgICAgLy8gdXBkYXRlIHRoZSBwcm9wZXJ0aWVzXHJcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFByb3BlcnRpZXMob25seVJlcGVhdGFibGVQcm9wcyk7XHJcblxyXG4gICAgICAvLyBjb21wdXRlIGFuZCBkaXNwbGF5IHRoZSB2YWx1ZS5cclxuICAgICAgaWYgKHRoaXMuU2hvdWxkQ29tcHV0ZUFuZFJlZnJlc2hPbkNsb3NlZEZvcm0oKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuQ29tcHV0ZUFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBleGVjdXRlcyB0aGUgcmVhZG9ubHkgY29tbWFuZCBvbmx5IGlmIG5lZWRlZFxyXG4gICAgICBsZXQgaXNQYXJrYWJsZUN0cmw6IGJvb2xlYW4gPSAhKGF3YWl0IHRoaXMuaXNQYXJrYWJsZShmYWxzZSkpIHx8ICEgYXdhaXQgdGhpcy5pc01vZGlmaWFibGUoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkdldEN1cnJSZWFkT25seSgpICE9PSBpc1BhcmthYmxlQ3RybCkge1xyXG4gICAgICAgIHRoaXMuU2V0Q3VyclJlYWRPbmx5KGlzUGFya2FibGVDdHJsKTtcclxuICAgICAgICBhd2FpdCBNYW5hZ2VyLlNldFJlYWRPbmx5Q29udHJvbCh0aGlzLCBpc1BhcmthYmxlQ3RybCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtdXN0SW5wdXRQcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCk7XHJcbiAgICAgIC8vIG5lZWQgdG8gY29tcHV0ZSBhbmQgcmVmcmVzaCB0aGUgZGlzcGxheSBpZiB0aGUgY29udHJvbCdzIGRhdGEgaXMgYW4gZXhwcmVzc2lvblxyXG4gICAgICAvLyBvciB0aGUgZm9ybWF0IGlzIGV4cHJlc3Npb24uIFdoZW4gdGhlIGZvcm1hdCBpcyBjaGFuZ2VkLCB0aGUgZGlzcGxheSB2YWwgbWF5IGNoYW5nZSBhcyB3ZWxsLlxyXG4gICAgICBpZiAobXVzdElucHV0UHJvcGVydHkgIT0gbnVsbCAmJiBtdXN0SW5wdXRQcm9wZXJ0eS5pc0V4cHJlc3Npb24oKSkge1xyXG5cclxuICAgICAgICBsZXQgcHJldk11c3RJbnB1dDogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAocHJldk11c3RJbnB1dCAhPT0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpKVxyXG4gICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuTXVzdElucHV0LCAhcHJldk11c3RJbnB1dCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfSU4sIHRydWUpKVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIEh0bWxQcm9wZXJ0aWVzLlRhYkluZGV4LCAtMSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3IgUmljaCBDbGllbnQgY29tcHV0ZSBhbmQgcmVmcmVzaCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgYWx3YXlzLCBhbHNvIGlmIHRoZSBmb3JtIGlzIG5vdCB5ZXQgb3BlbmVkLlxyXG4gIC8vLyBGb3IgT25saW5lIG9ubHkgZm9yIG9wZW5lZCBmb3Jtcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgU2hvdWxkQ29tcHV0ZUFuZFJlZnJlc2hPbkNsb3NlZEZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gUmVmcmVzaGVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjb250cm9sLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25seVJlcGVhdGFibGVQcm9wc1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgcmVmcmVzaFByb3BlcnRpZXMob25seVJlcGVhdGFibGVQcm9wczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLk5PTkUgJiYgdGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcylcclxuICAgICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5TRVRfQVRUUklCVVRFLCB0aGlzLCB0aGlzLkRhdGFUeXBlLmNoYXJDb2RlQXQoMCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdFByb3BzKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuWm9vbUJ1dHRvbkluaXRpYWxpemF0aW9uKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLl9wcm9wVGFiLlJlZnJlc2hEaXNwbGF5KGZhbHNlLCBvbmx5UmVwZWF0YWJsZVByb3BzKSkpIHtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiQ29udHJvbCAnezB9JzogTm90IGFsbCBwcm9wZXJ0aWVzIGNvdWxkIGJlIHNldFwiLCB0aGlzLmdldE5hbWUoKSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIGlmICghb25seVJlcGVhdGFibGVQcm9wcykge1xyXG4gICAgICAgICAgICB0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgbGV0IG1zZzogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKE5TdHJpbmcuRm9ybWF0KFwiQ29udHJvbCAnezB9JzogezF9XCIsIHRoaXMuZ2V0TmFtZSgpLCBleC5NZXNzYWdlKSk7XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhtc2cuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoVGFiRm9yTGF5ZXJMaXN0KGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN1cnJlbnRMaW5rVmFsdWU6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgLy8gSWYgdGhlIGZvcm0gaGFzIGFscmVhZHkgb3BlbmVkLCBnZXQgdGhlIGN1cnJlbnQgbGluayB2YWx1ZSBiZWZvcmVcclxuICAgIC8vIGNoYW5naW5nIHRoZSBsYXllciBsaXN0IGkuZS4gYmVmb3JlIGNhbGxpbmcgcmVmcmVzaEFuZFNldEl0ZW1zTGlzdCgpLlxyXG4gICAgLy8gQW5kIHRoZW4sIGFmdGVyIGNoYW5naW5nIHRoZSBsYXllciBsaXN0LCBzZWxlY3QgdGhlIFRBQiBjb3JyZXNwb25kaW5nXHJcbiAgICAvLyB0byB0aGUgY3VycmVudCBsaW5rIHZhbHVlLlxyXG4gICAgaWYgKHRoaXMuZ2V0Rm9ybSgpLk9wZW5lZCkge1xyXG4gICAgICBsZXQgaW5kaWNlOiBudW1iZXJbXSA9IHRoaXMuZ2V0Q3VycmVudEluZGV4T2ZDaG9pY2UoKTtcclxuICAgICAgbGV0IGN1cnJlbnRMYXllcjogbnVtYmVyID0gaW5kaWNlWzBdO1xyXG4gICAgICBjdXJyZW50TGlua1ZhbHVlID0gYXdhaXQgdGhpcy5nZXRMaW5rVmFsdWUoY3VycmVudExheWVyLnRvU3RyaW5nKCksIGxpbmUpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmUsIGZhbHNlKTtcclxuICAgIGlmICh0aGlzLmdldEZvcm0oKS5PcGVuZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5TZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKGN1cnJlbnRMaW5rVmFsdWUsIHRoaXMuSXNOdWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBpdGVtIGxpc3Qgb2YgcmFkaW8gYnV0dG9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+RGlzcGxheSBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleGVjQ29tcHV0ZUNob2ljZVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgcmVmcmVzaEFuZFNldEl0ZW1zTGlzdEZvclJhZGlvQnV0dG9uKGxpbmU6IG51bWJlciwgZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyAxLiBjcmVhdGUgdGhlIGJ1dHRvbiBmb3IgZWFjaCBpdGVtcyBsaXN0XHJcbiAgICBsZXQgZGlzcGxheUxpc3Q6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuXHJcbiAgICBsZXQgb3B0aW9ucyA9IGRpc3BsYXlMaXN0Lm1hcCgoZGlzcGxheVZhbHVlLCBjb3VudGVyLCBhcnIpID0+IHtcclxuICAgICAgbGV0IGluZGV4OiBzdHJpbmcgPSBjb3VudGVyLnRvU3RyaW5nKCk7XHJcbiAgICAgIHJldHVybiB7aW5kZXgsIGRpc3BsYXlWYWx1ZX1cclxuICAgIH0pO1xyXG4gICAgLy8gY3JlYXRlcyBuZXcgcmFkaW8gYnV0dG9ucyBmcm9tIGRpc3BsYXkgbGlzdC5cclxuXHJcbiAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLkl0ZW1zTGlzdCwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGl0ZW0gbGlzdCBhbmQgc2V0IGl0IGludG8gdGhlIGd1aSBjb250cm9sIGlmIGl0IGlzIGNvbWJvIGJveCAsIHJlZnJlc2ggYWxzbyB0aGUgdmlzaWJsZVxyXG4gIC8vLyAgIGxpbmVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmU6IG51bWJlciwgZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChleGVjQ29tcHV0ZUNob2ljZSkge1xyXG4gICAgICB0aGlzLmNsZWFyUmFuZ2UobGluZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgb3B0aW9uc1N0cmluZ3M6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuICAgIGlmIChzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSB8fCB0aGlzLkhhc0F1dG9jb21wbGV0ZSgpKSB7XHJcblxyXG4gICAgICBsZXQgb3B0aW9ucyA9IG9wdGlvbnNTdHJpbmdzLm1hcCgoZGlzcGxheVZhbHVlLCBpbmRleCwgYXJyKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtpbmRleCwgZGlzcGxheVZhbHVlfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgbGluZSwgSHRtbFByb3BlcnRpZXMuSXRlbXNMaXN0LCBvcHRpb25zKTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHN1cGVyLmlzUmFkaW8oKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1zTGlzdEZvclJhZGlvQnV0dG9uKGxpbmUsIGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGNob2ljZSBsaXN0IG9mIGEgU0VMRUNUIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hEaXNwUmFuZ2UoZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICBsZXQgc2VsZWN0Q21kOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDApO1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcblxyXG4gICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgIGxpbmUgPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuU3VwcG9ydHNEYXRhU291cmNlKCkpIHtcclxuICAgICAgbGV0IGRhdGFWaWV3OiBHdWlEYXRhVmlld0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuRGF0YVZpZXc7XHJcbiAgICAgIGxldCBkY3Y6IERjVmFsdWVzID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICAgIGxldCBkaXNwVmFsczogc3RyaW5nW10gPSBhd2FpdCB0aGlzLmdldERpc3BWYWxzKGxpbmUsIGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9oYXNWYWxpZEl0bUFuZERpc3BWYWwpIHtcclxuICAgICAgICBzZWxlY3RDbWQgPSBNZ0NvbnRyb2xCYXNlLmNvbWJpbmVTdHJpbmdBcnJheXMoZGlzcFZhbHMsIGRjdi5nZXREaXNwVmFscygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHNlbGVjdENtZCA9IGF3YWl0IHRoaXMuZ2V0RGlzcFZhbHMobGluZSwgZXhlY0NvbXB1dGVDaG9pY2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmFuZ2VDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldE9yZGVyZWREaXNwTGlzdChzZWxlY3RDbWQsIGxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZWZyZXNoIHRoZSBpdGVtcyBsaXN0IG9mIHRoZSBzZWxlY3Rpb24gY29udHJvbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4ZWNDb21wdXRlQ2hvaWNlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIHJlZnJlc2hJdG1SYW5nZShleGVjQ29tcHV0ZUNob2ljZTogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcclxuXHJcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBmb3Igc2VsZWN0aW9uIGNvbnRyb2wuXHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSk7XHJcbiAgICBsZXQgb3JkZXJlZEl0bUxpc3Q6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMCk7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSk7XHJcbiAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgbGluZSA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAoZXhlY0NvbXB1dGVDaG9pY2UpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21wdXRlQ2hvaWNlKGxpbmUpO1xyXG4gICAgfVxyXG4gICAgbGV0IGxpbmtWYWxzOiBzdHJpbmdbXSA9IHRoaXMuX2Nob2ljZUxpbmtzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgbGV0IGRhdGFWaWV3OiBHdWlEYXRhVmlld0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuRGF0YVZpZXc7XHJcbiAgICBsZXQgZGN2OiBEY1ZhbHVlcyA9IGRhdGFWaWV3LmdldERjVmFsdWVzKHRoaXMuX2RjVmFsSWQpO1xyXG4gICAgaWYgKHRoaXMuX2hhc1ZhbGlkSXRtQW5kRGlzcFZhbCkge1xyXG4gICAgICBvcmRlcmVkSXRtTGlzdCA9IE1nQ29udHJvbEJhc2UuY29tYmluZVN0cmluZ0FycmF5cyhsaW5rVmFscywgZGN2LkdldExpbmtWYWxzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldE9yZGVyZWREaXNwTGlzdChvcmRlcmVkSXRtTGlzdCwgbGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgaXRlbXMgdmFsdWVzIGZyb20gZGF0YSBzb3VyY2UgJiBpdGVtIGxpc3QgcHJvcGVydHkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldEl0ZW1zUmFuZ2UoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVmcmVzaEl0bVJhbmdlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBkaXNwbGF5IHZhbHVlcyBmcm9tIGRhdGEgc291cmNlICYgZGlzcGxheSBsaXN0IHByb3BlcnR5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBHZXREaXNwbGF5UmFuZ2UoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVmcmVzaERpc3BSYW5nZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY3JlYXRlRGVmYXVsdFByb3BzKCkge1xyXG4gICAgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpO1xyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyM6NzgxNzQxXHJcbiAgICAvLyBpbiAxLjkgLS0+XHJcbiAgICAvLyB3aGVuIGFzayBhYm91dCBhbnkgcHJvcGVydHkoUFJPUF9UWVBFX0VOQUJMRUQpIHdlIHdhcyBjcmVhdGVkIHRoZSBkZWZhdWx0IHByb3BlcnR5IHdpdGggdGhlIGRlZmF1bHQgdmFsdWUodHJ1ZSkuXHJcbiAgICAvLyBhbmQgd2hlbiBnZXQgdG8gUmVmcmVzaFByb3BzIG9mIHRoZSBwcm9wZXJ0eSBcIlBST1BfVFlQRV9FTkFCTEVEXCIgd2Ugd2FzIGFkZCBjb21tYW5kIHRvIHRoZSBxdWV1ZSBpbiBndWkgdGhyZWFkXHJcbiAgICAvLyB0aGUgY29tbWFuZCB3YXMgd2FzIHVwZGF0ZSB0aGUgVGFnRGF0YS5FbmFibGUgdG8gYmUgXCJ0cnVlXCJcclxuICAgIC8vIGluIDIuMCAtLT5cclxuICAgIC8vIHdlIHVzZWluZyBhIG5ldyBtZXRob2QgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoKSB0aGF0IG5vdCBjcmVhdGVkIGFueSBkZWZhdWx0IHByb3BlcnR5IGFuZCBubyBnZXQgdG8gcmVmcmVzaFByb3BcclxuICAgIC8vIG9uIHRoZSBwcm9wZXJ0eSBhbmQgdGhlIHZhbHVlIG9uIHRoZSBDb250cm9sLkVuYWJsZSB3YXMgd3JvbmdcclxuICAgIHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVEKTtcclxuXHJcbiAgICBpZiAoc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkge1xyXG4gICAgICB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0NST0xMX0JBUik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBMaW5rZWQgUGFyZW50IElkeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGlua2VkUGFyZW50RGl0SWR4XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldExpbmtlZFBhcmVudElkeChsaW5rZWRQYXJlbnREaXRJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fbGlua2VkUGFyZW50RGl0SWR4ID0gbGlua2VkUGFyZW50RGl0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdmFsaWRhdGlvbiBkZXRhaWxzIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBidWlsZFBpY3R1cmUob2xkVmFsOiBhbnksIHZhbDogYW55KTogVmFsaWRhdGlvbkRldGFpbHMge1xyXG5cclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpIHx8IHN1cGVyLmlzQ29sdW1uQ29udHJvbCgpKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcGljRXhwRXhpc3RzKSB7XHJcbiAgICAgIHRoaXMuX3ZkID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl92ZCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl92ZCA9IG5ldyBWYWxpZGF0aW9uRGV0YWlscyhvbGRWYWwsIHZhbCwgdGhpcy5fcmFuZ2UsIHRoaXMuX3BpYywgdGhpcyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fdmQuc2V0VmFsdWUodmFsKTtcclxuICAgICAgdGhpcy5fdmQuc2V0T2xkVmFsdWUob2xkVmFsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdmQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ2hlY2tzIGlmIHRoZSBzZW50IHZhbHVlIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjb250cm9sJ3MgZXhpc3RpbmcgdmFsdWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIk5ld1ZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNoZWNrTnVsbFZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRGlmZmVyZW50VmFsdWUobmV3VmFsdWU6IGFueSwgaXNOdWxsOiBib29sZWFuLCBjaGVja051bGxWYWx1ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBjdHJsQ3VyclZhbHVlOiBhbnkgPSB0aGlzLlZhbHVlO1xyXG4gICAgbGV0IHZhbENoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUpXHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9ICF0aGlzLkNvbXBhcmVEYXRlKG5ld1ZhbHVlLCBjdHJsQ3VyclZhbHVlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHZhbENoYW5nZWQgPSAhdGhpcy5Db21wYXJlVGltZShuZXdWYWx1ZSwgY3RybEN1cnJWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25DdHJsKCkgJiYgdHlwZW9mIGN0cmxDdXJyVmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbGV0IG5ld1ZhbHVlc3RyID0gbmV3VmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICB2YWxDaGFuZ2VkID0gKG5ld1ZhbHVlc3RyICE9PSBjdHJsQ3VyclZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB2YWxDaGFuZ2VkID0gKG5ld1ZhbHVlICE9PSBjdHJsQ3VyclZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uQ3RybCgpICYmIHR5cGVvZiBjdHJsQ3VyclZhbHVlID09PSAnc3RyaW5nJyAmJiBBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSkge1xyXG4gICAgICAgIGxldCBuZXdWYWx1ZVN0ciA9IG5ld1ZhbHVlLmpvaW4oJywnKS50b1N0cmluZygpO1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAhKFN0clV0aWwucnRyaW0obmV3VmFsdWVTdHIpID09PSBTdHJVdGlsLnJ0cmltKGN0cmxDdXJyVmFsdWUpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgY3RybEN1cnJJc051bGw6IGJvb2xlYW4gPSB0aGlzLklzTnVsbDtcclxuICAgICAgICB2YWxDaGFuZ2VkID0gIShTdHJVdGlsLnJ0cmltKG5ld1ZhbHVlKSA9PT0gU3RyVXRpbC5ydHJpbShjdHJsQ3VyclZhbHVlKSk7XHJcbiAgICAgICAgaWYgKCF2YWxDaGFuZ2VkICYmIGNoZWNrTnVsbFZhbHVlKSB7XHJcbiAgICAgICAgICB2YWxDaGFuZ2VkID0gKGlzTnVsbCAhPT0gY3RybEN1cnJJc051bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbENoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBDb21wYXJlRGF0ZShkMTogRGF0ZSwgZDI6IERhdGUpOiBib29sZWFuIHtcclxuICAgIGxldCByZXR2YWw6IGJvb2xlYW47XHJcbiAgICBpZiAoZDEgPT09IG51bGwgJiYgZDIgPT09IG51bGwpXHJcbiAgICAgIHJldHZhbCA9IHRydWU7XHJcbiAgICBlbHNlIGlmICgoZDEgPT09IG51bGwgJiYgZDIgIT09IG51bGwpIHx8IChkMSAhPT0gbnVsbCAmJiBkMiA9PT0gbnVsbCkpXHJcbiAgICAgIHJldHZhbCA9IGZhbHNlO1xyXG4gICAgZWxzZSBpZiAoZDEuZ2V0RnVsbFllYXIoKSA9PT0gZDIuZ2V0RnVsbFllYXIoKVxyXG4gICAgICAmJiBkMS5nZXREYXRlKCkgPT09IGQyLmdldERhdGUoKVxyXG4gICAgICAmJiBkMS5nZXRNb250aCgpID09PSBkMi5nZXRNb250aCgpKVxyXG4gICAgICByZXR2YWwgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHJldHZhbDtcclxuICB9XHJcblxyXG4gIENvbXBhcmVUaW1lKGQxOiBEYXRlLCBkMjogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldHZhbDogYm9vbGVhbjtcclxuICAgIGlmIChkMSA9PT0gbnVsbCAmJiBkMiA9PT0gbnVsbClcclxuICAgICAgcmV0dmFsID0gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKChkMSA9PT0gbnVsbCAmJiBkMiAhPT0gbnVsbCkgfHwgKGQxICE9PSBudWxsICYmIGQyID09PSBudWxsKSlcclxuICAgICAgcmV0dmFsID0gZmFsc2U7XHJcbiAgICBlbHNlIGlmIChkMS5nZXRIb3VycygpID09PSBkMi5nZXRIb3VycygpXHJcbiAgICAgICYmIGQxLmdldE1pbnV0ZXMoKSA9PT0gZDIuZ2V0TWludXRlcygpXHJcbiAgICAgICYmIGQxLmdldFNlY29uZHMoKSA9PT0gZDIuZ2V0U2Vjb25kcygpKVxyXG4gICAgICByZXR2YWwgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHJldHZhbDtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGNvbHVtbidzIHNvcnRhYmxlIHByb3BlcnR5IGlzIHNldCB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzQ29sdW1uU29ydGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNTb3J0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTiAmJiB0aGlzLl9wcm9wVGFiLnByb3BFeGlzdHMoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU09SVF9DT0xVTU4pKSB7XHJcbiAgICAgIGlzU29ydGFibGUgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU09SVF9DT0xVTU4pLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzU29ydGFibGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBmaXJzdCBjaGlsZCBNZ0NvbnRyb2wgb2YgY29sdW1uIGkuZS4gZmllbGQgYXR0YWNoZWQgdG8gY29sdW1uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG5cclxuICBnZXRDb2x1bW5DaGlsZENvbnRyb2woKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBpZiAodGhpcy5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGxldCBsaW5rZWRDb250cm9sczogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IHRoaXMuX3BhcmVudFRhYmxlLmdldExpbmtlZENvbnRyb2xzKCk7XHJcblxyXG4gICAgcmV0dXJuIGxpbmtlZENvbnRyb2xzLmZpbmQoKGNvbnRyb2w6IE1nQ29udHJvbEJhc2UpID0+IChjb250cm9sLmdldExheWVyKCkgPT09IHRoaXMuZ2V0TGF5ZXIoKSAmJiBjb250cm9sLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTiAmJiAhY29udHJvbC5Jc1RhYmxlSGVhZGVyQ2hpbGQpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgY29udHJvbCBuYW1lIGZvciBoYW5kbGVyIHNlYXJjaCBwcm9wb3NlLlxyXG4gIC8vLyAgIFRoZSBjb250cm9sIGl0c2VsZiwgbWF5IG5vdCBoYXZlIGEgbmFtZSBmb3IgaGFuZGxlciBzZWFyY2ggKGxpa2UgY29sdW1uIGNvbnRyb2wsIGluIHdoaWNoIHdlIG5lZWQgdG8gdXNlXHJcbiAgLy8vICAgdGhlIGNoaWxkIGNvbnRyb2wgbmFtZSBmb3IgaGFuZGxlcnMgc2VhcmNoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDb250cm9sTmFtZUZvckhhbmRsZXJTZWFyY2goKTogc3RyaW5nIHtcclxuICAgIGxldCBjaGlsZENvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSB0aGlzLmdldENvbHVtbkNoaWxkQ29udHJvbCgpO1xyXG4gICAgbGV0IG5hbWU6IHN0cmluZztcclxuICAgIGlmIChjaGlsZENvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIGNoaWxkQ29udHJvbC5OYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5OYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhIGNvbnRyb2wgdG8gdGhlIGxpc3Qgb2YgbGlua2VkIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGxpbmtDdHJsKGN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xpbmtlZENvbnRyb2xzLnB1c2goY3RybCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRvIHRoaXMgY29udHJvbCBmcm9tIHRoZSBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVtb3ZlUmVmRnJvbUZpZWxkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkLlJlbW92ZUNvbnRyb2wodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZGl0IGluZGV4IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXREaXRJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldHMgZGNWYWxJZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGNWYWxJZFwiPjwvcGFyYW0+XHJcbiAgc2V0RGNWYWxJZChkY1ZhbElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RjVmFsSWQgPSBkY1ZhbElkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGlmIHRoZSBwaWN0dXJlIGRlZmluZSBhcyBoZWJyZXcgdGhlbiBzZXQgdGhlIGxhbmcgdG8gaGVicmV3LCBvdGhlcndpc2UgcmVzdG9yZSB0aGUgbGFuZ1xyXG4gIC8vLyAgIFRoZSBzYW1lIHdlIGRvaW5nIGZvciBvbmxpbmUgOmVkdF9lZGl0LmNwcCA6IFNldEtleWJvYXJkTGFuZ3VhZ2UoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXN0b3JlTGFuZ1wiPjwvcGFyYW0+XHJcbiAgU2V0S2V5Ym9hcmRMYW5ndWFnZShyZXN0b3JlTGFuZzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5pdGlhbGl6ZSBjb250cm9sIHByb3BlcnRpZXMgZm9yIGRlcml2ZWQgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluaXQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KGludGVybmFsKVxyXG4gIC8vLyBjaGVja3MgaWYgY29udHJvbCBpcyBwYXJrYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBJc1BhcmthYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaXNQYXJrYWJsZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4oaW50ZXJuYWwpXHJcbiAgLy8vIGNoZWNrcyBpZiBjb250cm9sIGhhcyBleHByZXNzaW9uIG9yIFBhcmVudCB0YXNrIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEhhc0V4cE9yUGFyZW50VGFza0ZpZWxkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgcmV0dXJuICh0aGlzLmdldEZpZWxkKCkgPT09IG51bGwgfHwgdGhpcy5nZXRGaWVsZCgpLmdldFRhc2soKSAhPT0gdGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBjb250cm9sIGlzIHBhcmthYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrRW5hYmxlZEFuZFZpc2libGVcIj5jaGVjayBlbmFibGVkIGFuZCB2aXNpYmxlIHByb3BlcnRpZXMgdG9vPC9wYXJhbT5cclxuICBhc3luYyBpc1BhcmthYmxlKGNoZWNrRW5hYmxlZEFuZFZpc2libGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG4gICAgcmVzdWx0ID0gIXN1cGVyLmlzVGFibGVDb250cm9sKCkgJiYgIXN1cGVyLmlzQ29sdW1uQ29udHJvbCgpO1xyXG5cclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSAtPiBub3QgcGFya2FibGUuXHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIHJlc3VsdCA9IHRhc2suSXNJbnRlcmFjdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0ICYmIHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkgJiYgdGhpcy5fZmllbGQgIT09IG51bGwgJiYgdGhpcy5fZmllbGQuUGFydE9mRGF0YXZpZXcpIHtcclxuICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIC8vIFFDUiAjNDQxMTc3LiBXaGVuIHdlIGNoZWNrIHRoZSBzdWJmb3JtIHBhcmsgYWJpbGl0eSwgd2UgbmVlZCB0byBjaGVjayBhbHNvIGl0J3MgdmlzaWJpbGl0eSBhbmQgZW5hYmxlIHByb3BlcnRpZXMuXHJcbiAgICAgIGlmICghc3VwZXIuaXNTdWJmb3JtKCkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9ICgodGhpcy5fZmllbGQgIT09IG51bGwgJiYgdGhpcy5fZmllbGQuZ2V0VGFzaygpID09PSB0YXNrKSB8fCB0aGlzLmlzQnV0dG9uKCkgfHwgc3VwZXIuaXNCcm93c2VyQ29udHJvbCgpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmVzdWx0ICYmIGNoZWNrRW5hYmxlZEFuZFZpc2libGUpIHtcclxuICAgICAgICByZXN1bHQgPSAodGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmlzVmlzaWJsZSgpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKChyZXN1bHQgJiYgdGhpcy5fcGFyZW50VGFibGUgIT09IG51bGwpICYmIGNoZWNrRW5hYmxlZEFuZFZpc2libGUpIHtcclxuICAgICAgICByZXN1bHQgPSAodGhpcy5fcGFyZW50VGFibGUuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRCwgdHJ1ZSkgJiYgdGhpcy5fcGFyZW50VGFibGUuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSwgdHJ1ZSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSYWlzZSBBQ1RfQ1RSTF9ISVQgb24gbGVmdCBtb3VzZSBjbGljayBpZiBpdCBtZWV0cyBmb2xsb3dpbmcgY29uZGl0aW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBSYWlzZUNvbnRyb2xIaXRPbkxlZnRDbGlja09mTW91c2VEb3duKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJhaXNlQ3RybEhpdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKCFzdXBlci5Jc0h5cGVyVGV4dEJ1dHRvbigpICYmICFzdXBlci5pc1JhZGlvKCkgJiYgIXN1cGVyLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgIHJhaXNlQ3RybEhpdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmFpc2VDdHJsSGl0O1xyXG4gIH1cclxuXHJcbiAgR2V0VmFySW5kZXgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSAnQ29udHJvbCBIaXQnIGV2ZW50IHNob3VsZCBiZSByYWlzZWQgb24gbW91c2UgZG93bi5cclxuICAvLy8gVGhlIG1ldGhvZCB3YXMgZXh0cmFjdGVkIGZyb20gcHJvY2Vzc01vdXNlRG93biwgc2luY2Ugd2UgbWlnaHQgaGF2ZSBkaWZmZXJlbnRcclxuICAvLy8gYmVoYXZpb3JzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgdHJlZSBjb250cm9scy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlZnRDbGlja1dhc1ByZXNzZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUmFpc2VDb250cm9sSGl0T25Nb3VzZURvd24obGVmdENsaWNrV2FzUHJlc3NlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJhaXNlQ3RybEhpdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKGxlZnRDbGlja1dhc1ByZXNzZWQpIHtcclxuICAgICAgaWYgKHRoaXMuUmFpc2VDb250cm9sSGl0T25MZWZ0Q2xpY2tPZk1vdXNlRG93bigpKSB7XHJcbiAgICAgICAgcmFpc2VDdHJsSGl0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJhaXNlQ3RybEhpdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSGFuZGxlIE1HX0FDVF9ISVQgb24gdGhlIHN1YmZvcm0gY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgT25TdWJmb3JtQ2xpY2soKTogdm9pZCB7XHJcbiAgICBNYW5hZ2VyLkV2ZW50c01hbmFnZXIuYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGUodGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSElUKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyBNZ0Zvcm0gb2YgdGhlIHN1YmZvcm0gY29udHJvbCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRTdWJmb3JtTWdGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBQcm9wZXJ0eUV4aXN0cyhpZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvcFRhYi5wcm9wRXhpc3RzKGlkKTtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gXCJ7XCIgKyB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyBcIjogXCIgKyBNZ0NvbnRyb2xUeXBlW3RoaXMuVHlwZV0gKyBcIn1cIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2hlY2tzIGlmIG5ldyBkYXRlIGlzIDA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj4gVGhlIHZhbHVlIHRvIGNoZWNrPC9wYXJhbT5cclxuICBpc0RhdGVaZXJvKHZhbDogRGF0ZSkge1xyXG4gICAgbGV0IHplcm9EYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICBpZiAodmFsLmdldE1vbnRoKCkgPT09IDAgJiYgdmFsLmdldEZ1bGxZZWFyKCkgPT09IDAgJiYgdmFsLmdldERheSgpID09PSAwKVxyXG4gICAgICAgIHplcm9EYXRlID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB6ZXJvRGF0ZTtcclxuICB9XHJcblxyXG4gIElzRGVmYXVsdFJvdXRlck91dGxldCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNICYmIHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ERUZBVUxUX09VVExFVCwgZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIElzUm91dGVyT3V0bGV0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0gJiYgdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX1JPVVRFUl9PVVRMRVQsIGZhbHNlKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBab29tQnV0dG9uSW5pdGlhbGl6YXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc1RleHRDb250cm9sKCkgJiYgdGhpcy5jaGVja0lmRXhpc3RQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTk5FQ1RFRF9aT09NX0NPTlRST0wpKVxyXG4gICAge1xyXG4gICAgICBsZXQgY29ubmVjdGVkQnV0dG9uOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5Gb3JtLkN0cmxUYWIuR2V0Q29udHJvbEJ5SXNuKChhd2FpdCAoYXdhaXQgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTk5FQ1RFRF9aT09NX0NPTlRST0wpKS5nZXRWYWx1ZUludCgpKSk7XHJcblxyXG4gICAgICAvLyBpbWFnZSBidXR0b24gLSBjYWxjdWxhdGUgYWNjb3JkaW5nIHRvIGltYWdlXHJcbiAgICAgIGxldCBpbWFnZUZpbGVOYW1lIDogc3RyaW5nICA9IG51bGw7XHJcbiAgICAgIGlmIChjb25uZWN0ZWRCdXR0b24uSXNJbWFnZUJ1dHRvbigpICYmIGNvbm5lY3RlZEJ1dHRvbi5Qcm9wZXJ0eUV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9GSUxFTkFNRSkpXHJcbiAgICAgIHtcclxuICAgICAgICBpbWFnZUZpbGVOYW1lID0gYXdhaXQoYXdhaXQgY29ubmVjdGVkQnV0dG9uLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUUpKS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGlmICghTWlzYy5Jc1dlYlVybChpbWFnZUZpbGVOYW1lKSlcclxuICAgICAgICAgIGltYWdlRmlsZU5hbWUgPSBcIi4vYXNzZXRzL2ltYWdlcy9cIiArIGltYWdlRmlsZU5hbWU7XHJcbiAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9TVFlMRSwgdGhpcywgMCwgTWFnaWNQcm9wZXJ0aWVzLkltYWdlRmlsZSwgaW1hZ2VGaWxlTmFtZSk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzdG9yZSB0aGUgZWRpdCBjb250cm9sIG9uIHRoZSBidXR0b25cclxuICAgICAgdGhpcy5Db25uZWN0ZWRDb250cm9sID0gY29ubmVjdGVkQnV0dG9uO1xyXG4gICAgICBjb25uZWN0ZWRCdXR0b24uQ29ubmVjdGVkQ29udHJvbCA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|