@magic-xpa/gui 4.801.0-dev481.245 → 4.801.0-dev481.248

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