@magic-xpa/gui 4.1100.0-dev4110.99 → 4.1100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +7 -7
  2. package/{esm2020 → esm2022}/index.mjs +71 -71
  3. package/{esm2020 → esm2022}/magic-xpa-gui.mjs +1 -1
  4. package/esm2022/src/Commands.mjs +184 -0
  5. package/esm2022/src/Events.mjs +425 -0
  6. package/{esm2020 → esm2022}/src/EventsProcessor.mjs +66 -66
  7. package/{esm2020 → esm2022}/src/FocusManager.mjs +33 -33
  8. package/esm2022/src/GuiConstants.mjs +68 -0
  9. package/{esm2020 → esm2022}/src/GuiEnums.mjs +301 -300
  10. package/esm2022/src/GuiEnvironment.mjs +4 -0
  11. package/{esm2020 → esm2022}/src/IFlowMonitorQueue.mjs +1 -1
  12. package/esm2022/src/Manager.mjs +91 -0
  13. package/esm2022/src/UIBridge.mjs +33 -0
  14. package/{esm2020 → esm2022}/src/env/IEnvironment.mjs +1 -1
  15. package/{esm2020 → esm2022}/src/gui/ControlBase.mjs +2 -2
  16. package/esm2022/src/gui/GuiMgControl.mjs +123 -0
  17. package/{esm2020 → esm2022}/src/gui/GuiMgForm.mjs +3 -3
  18. package/esm2022/src/gui/KeyboardItem.mjs +135 -0
  19. package/esm2022/src/gui/LastFocusedVal.mjs +11 -0
  20. package/esm2022/src/gui/MgValue.mjs +16 -0
  21. package/{esm2020 → esm2022}/src/gui/PropParentInterface.mjs +1 -1
  22. package/{esm2020 → esm2022}/src/gui/low/DialogHandler.mjs +6 -6
  23. package/esm2022/src/gui/low/GuiCommand.mjs +68 -0
  24. package/esm2022/src/gui/low/GuiCommandQueue.mjs +35 -0
  25. package/esm2022/src/gui/low/GuiInteractive.mjs +178 -0
  26. package/esm2022/src/gui/low/Style.mjs +20 -0
  27. package/esm2022/src/management/RuntimeContextBase.mjs +42 -0
  28. package/esm2022/src/management/data/BlobType.mjs +281 -0
  29. package/esm2022/src/management/data/DcValues.mjs +214 -0
  30. package/{esm2020 → esm2022}/src/management/data/DcValuesBuilderBase.mjs +95 -95
  31. package/esm2022/src/management/data/FieldDef.mjs +331 -0
  32. package/{esm2020 → esm2022}/src/management/data/FieldsTable.mjs +54 -54
  33. package/esm2022/src/management/data/GuiDataViewBase.mjs +88 -0
  34. package/esm2022/src/management/data/GuiFieldBase.mjs +82 -0
  35. package/{esm2020 → esm2022}/src/management/data/IRecord.mjs +1 -1
  36. package/{esm2020 → esm2022}/src/management/data/IReferencedObject.mjs +1 -1
  37. package/esm2022/src/management/data/NUM_TYPE.mjs +1739 -0
  38. package/esm2022/src/management/data/ObjectReferenceBase.mjs +48 -0
  39. package/esm2022/src/management/data/ObjectReferencesCollection.mjs +27 -0
  40. package/{esm2020 → esm2022}/src/management/data/RecordUtils.mjs +360 -360
  41. package/esm2022/src/management/data/VectorType.mjs +612 -0
  42. package/esm2022/src/management/data/VectorTypeBase.mjs +88 -0
  43. package/{esm2020 → esm2022}/src/management/events/IActionManager.mjs +1 -1
  44. package/{esm2020 → esm2022}/src/management/events/IGuiEventsManager.mjs +1 -1
  45. package/esm2022/src/management/exp/ExpressionInterface.mjs +244 -0
  46. package/esm2022/src/management/exp/GuiExpressionEvaluator.mjs +305 -0
  47. package/esm2022/src/management/gui/ControlTable.mjs +118 -0
  48. package/esm2022/src/management/gui/DisplayConvertor.mjs +1649 -0
  49. package/esm2022/src/management/gui/FieldValidator.mjs +711 -0
  50. package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +24 -0
  51. package/{esm2020 → esm2022}/src/management/gui/GuiFormPropertyAdapter.mjs +10 -10
  52. package/esm2022/src/management/gui/HebrewDate.mjs +278 -0
  53. package/esm2022/src/management/gui/Helps.mjs +237 -0
  54. package/esm2022/src/management/gui/MgControlBase.mjs +1869 -0
  55. package/esm2022/src/management/gui/MgFormBase.mjs +741 -0
  56. package/esm2022/src/management/gui/PIC.mjs +1185 -0
  57. package/{esm2020 → esm2022}/src/management/gui/PropDefaults.mjs +229 -229
  58. package/{esm2020 → esm2022}/src/management/gui/PropInterface.mjs +246 -245
  59. package/esm2022/src/management/gui/PropTable.mjs +221 -0
  60. package/esm2022/src/management/gui/Property.mjs +1362 -0
  61. package/esm2022/src/management/gui/ValidationDetails.mjs +248 -0
  62. package/{esm2020 → esm2022}/src/management/gui/ValidationDetailsBase.mjs +93 -93
  63. package/{esm2020 → esm2022}/src/management/gui/WrongFormatException.mjs +29 -29
  64. package/esm2022/src/management/tasks/GuiDataCollection.mjs +4 -0
  65. package/esm2022/src/management/tasks/GuiTaskBase.mjs +511 -0
  66. package/{esm2020 → esm2022}/src/management/tasks/IMGDataTable.mjs +1 -1
  67. package/{esm2020 → esm2022}/src/management/tasks/ITask.mjs +1 -1
  68. package/esm2022/src/management/tasks/MgTimer.mjs +21 -0
  69. package/esm2022/src/management/tasks/TaskDefinitionId.mjs +54 -0
  70. package/{esm2020 → esm2022}/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -41
  71. package/{esm2020 → esm2022}/src/util/MemoryUtil.mjs +34 -34
  72. package/esm2022/src/util/ObjectReference.mjs +36 -0
  73. package/esm2022/src/util/UsernamePasswordCredentials.mjs +52 -0
  74. package/{fesm2020 → fesm2022}/magic-xpa-gui.mjs +16086 -16095
  75. package/fesm2022/magic-xpa-gui.mjs.map +1 -0
  76. package/index.d.ts +70 -70
  77. package/package.json +6 -12
  78. package/src/Commands.d.ts +40 -40
  79. package/src/Events.d.ts +157 -155
  80. package/src/EventsProcessor.d.ts +13 -13
  81. package/src/FocusManager.d.ts +8 -8
  82. package/src/GuiConstants.d.ts +65 -65
  83. package/src/GuiEnums.d.ts +283 -282
  84. package/src/GuiEnvironment.d.ts +4 -4
  85. package/src/IFlowMonitorQueue.d.ts +3 -3
  86. package/src/Manager.d.ts +26 -26
  87. package/src/UIBridge.d.ts +16 -16
  88. package/src/env/IEnvironment.d.ts +31 -31
  89. package/src/gui/ControlBase.d.ts +4 -4
  90. package/src/gui/GuiMgControl.d.ts +38 -38
  91. package/src/gui/GuiMgForm.d.ts +3 -3
  92. package/src/gui/KeyboardItem.d.ts +18 -18
  93. package/src/gui/LastFocusedVal.d.ts +7 -7
  94. package/src/gui/MgValue.d.ts +15 -15
  95. package/src/gui/PropParentInterface.d.ts +13 -13
  96. package/src/gui/low/DialogHandler.d.ts +4 -4
  97. package/src/gui/low/GuiCommand.d.ts +37 -37
  98. package/src/gui/low/GuiCommandQueue.d.ts +13 -13
  99. package/src/gui/low/GuiInteractive.d.ts +55 -55
  100. package/src/gui/low/Style.d.ts +19 -19
  101. package/src/management/RuntimeContextBase.d.ts +23 -23
  102. package/src/management/data/BlobType.d.ts +29 -29
  103. package/src/management/data/DcValues.d.ts +33 -33
  104. package/src/management/data/DcValuesBuilderBase.d.ts +17 -17
  105. package/src/management/data/FieldDef.d.ts +53 -53
  106. package/src/management/data/FieldsTable.d.ts +16 -16
  107. package/src/management/data/GuiDataViewBase.d.ts +27 -27
  108. package/src/management/data/GuiFieldBase.d.ts +17 -17
  109. package/src/management/data/IRecord.d.ts +12 -12
  110. package/src/management/data/IReferencedObject.d.ts +5 -5
  111. package/src/management/data/NUM_TYPE.d.ts +103 -103
  112. package/src/management/data/ObjectReferenceBase.d.ts +16 -16
  113. package/src/management/data/ObjectReferencesCollection.d.ts +10 -10
  114. package/src/management/data/RecordUtils.d.ts +21 -21
  115. package/src/management/data/VectorType.d.ts +52 -52
  116. package/src/management/data/VectorTypeBase.d.ts +8 -8
  117. package/src/management/events/IActionManager.d.ts +7 -7
  118. package/src/management/events/IGuiEventsManager.d.ts +20 -20
  119. package/src/management/exp/ExpressionInterface.d.ts +242 -242
  120. package/src/management/exp/GuiExpressionEvaluator.d.ts +47 -47
  121. package/src/management/gui/ControlTable.d.ts +28 -28
  122. package/src/management/gui/DisplayConvertor.d.ts +103 -103
  123. package/src/management/gui/FieldValidator.d.ts +35 -35
  124. package/src/management/gui/GuiControlPropertyAdapter.d.ts +40 -40
  125. package/src/management/gui/GuiFormPropertyAdapter.d.ts +17 -17
  126. package/src/management/gui/HebrewDate.d.ts +46 -46
  127. package/src/management/gui/Helps.d.ts +51 -51
  128. package/src/management/gui/MgControlBase.d.ts +225 -223
  129. package/src/management/gui/MgFormBase.d.ts +160 -160
  130. package/src/management/gui/PIC.d.ts +108 -108
  131. package/src/management/gui/PropDefaults.d.ts +7 -7
  132. package/src/management/gui/PropInterface.d.ts +244 -243
  133. package/src/management/gui/PropTable.d.ts +33 -33
  134. package/src/management/gui/Property.d.ts +121 -121
  135. package/src/management/gui/ValidationDetails.d.ts +52 -52
  136. package/src/management/gui/ValidationDetailsBase.d.ts +14 -14
  137. package/src/management/gui/WrongFormatException.d.ts +9 -9
  138. package/src/management/tasks/GuiDataCollection.d.ts +4 -4
  139. package/src/management/tasks/GuiTaskBase.d.ts +150 -150
  140. package/src/management/tasks/IMGDataTable.d.ts +10 -10
  141. package/src/management/tasks/ITask.d.ts +6 -6
  142. package/src/management/tasks/MgTimer.d.ts +8 -8
  143. package/src/management/tasks/TaskDefinitionId.d.ts +16 -16
  144. package/src/management/tasks/TaskDefinitionIdTableSaxHandler.d.ts +7 -7
  145. package/src/util/MemoryUtil.d.ts +6 -6
  146. package/src/util/ObjectReference.d.ts +9 -9
  147. package/src/util/UsernamePasswordCredentials.d.ts +18 -18
  148. package/esm2020/src/Commands.mjs +0 -184
  149. package/esm2020/src/Events.mjs +0 -420
  150. package/esm2020/src/GuiConstants.mjs +0 -68
  151. package/esm2020/src/GuiEnvironment.mjs +0 -4
  152. package/esm2020/src/Manager.mjs +0 -91
  153. package/esm2020/src/UIBridge.mjs +0 -32
  154. package/esm2020/src/gui/GuiMgControl.mjs +0 -125
  155. package/esm2020/src/gui/KeyboardItem.mjs +0 -135
  156. package/esm2020/src/gui/LastFocusedVal.mjs +0 -11
  157. package/esm2020/src/gui/MgValue.mjs +0 -16
  158. package/esm2020/src/gui/low/GuiCommand.mjs +0 -66
  159. package/esm2020/src/gui/low/GuiCommandQueue.mjs +0 -35
  160. package/esm2020/src/gui/low/GuiInteractive.mjs +0 -176
  161. package/esm2020/src/gui/low/Style.mjs +0 -20
  162. package/esm2020/src/management/RuntimeContextBase.mjs +0 -43
  163. package/esm2020/src/management/data/BlobType.mjs +0 -281
  164. package/esm2020/src/management/data/DcValues.mjs +0 -214
  165. package/esm2020/src/management/data/FieldDef.mjs +0 -331
  166. package/esm2020/src/management/data/GuiDataViewBase.mjs +0 -90
  167. package/esm2020/src/management/data/GuiFieldBase.mjs +0 -82
  168. package/esm2020/src/management/data/NUM_TYPE.mjs +0 -1741
  169. package/esm2020/src/management/data/ObjectReferenceBase.mjs +0 -48
  170. package/esm2020/src/management/data/ObjectReferencesCollection.mjs +0 -29
  171. package/esm2020/src/management/data/VectorType.mjs +0 -612
  172. package/esm2020/src/management/data/VectorTypeBase.mjs +0 -88
  173. package/esm2020/src/management/exp/ExpressionInterface.mjs +0 -244
  174. package/esm2020/src/management/exp/GuiExpressionEvaluator.mjs +0 -307
  175. package/esm2020/src/management/gui/ControlTable.mjs +0 -118
  176. package/esm2020/src/management/gui/DisplayConvertor.mjs +0 -1679
  177. package/esm2020/src/management/gui/FieldValidator.mjs +0 -711
  178. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +0 -22
  179. package/esm2020/src/management/gui/HebrewDate.mjs +0 -278
  180. package/esm2020/src/management/gui/Helps.mjs +0 -237
  181. package/esm2020/src/management/gui/MgControlBase.mjs +0 -1858
  182. package/esm2020/src/management/gui/MgFormBase.mjs +0 -741
  183. package/esm2020/src/management/gui/PIC.mjs +0 -1185
  184. package/esm2020/src/management/gui/PropTable.mjs +0 -221
  185. package/esm2020/src/management/gui/Property.mjs +0 -1356
  186. package/esm2020/src/management/gui/ValidationDetails.mjs +0 -248
  187. package/esm2020/src/management/tasks/GuiDataCollection.mjs +0 -4
  188. package/esm2020/src/management/tasks/GuiTaskBase.mjs +0 -510
  189. package/esm2020/src/management/tasks/MgTimer.mjs +0 -21
  190. package/esm2020/src/management/tasks/TaskDefinitionId.mjs +0 -54
  191. package/esm2020/src/util/ObjectReference.mjs +0 -36
  192. package/esm2020/src/util/UsernamePasswordCredentials.mjs +0 -52
  193. package/fesm2015/magic-xpa-gui.mjs +0 -16391
  194. package/fesm2015/magic-xpa-gui.mjs.map +0 -1
  195. package/fesm2020/magic-xpa-gui.mjs.map +0 -1
@@ -1,221 +0,0 @@
1
- import { ApplicationException, Hashtable, List, NNumber, NString } from "@magic-xpa/mscorelib";
2
- import { Property } from "./Property";
3
- import { XMLConstants, XmlParser } from "@magic-xpa/utils";
4
- import { Events } from "../../Events";
5
- import { PropInterface } from "./PropInterface";
6
- import { GuiFormPropertyAdapter } from "./GuiFormPropertyAdapter";
7
- import { GuiControlPropertyAdapter } from "./GuiControlPropertyAdapter";
8
- export class PropTable {
9
- constructor(parent_) {
10
- this._hashTab = null;
11
- this._props = null;
12
- this._parent = null;
13
- if (arguments.length === 0) {
14
- this.constructor_0();
15
- return;
16
- }
17
- this.constructor_1(parent_);
18
- }
19
- constructor_0() {
20
- this._props = new List();
21
- this._hashTab = new Hashtable(20);
22
- }
23
- constructor_1(parent_) {
24
- this.constructor_0();
25
- this._parent = parent_;
26
- }
27
- fillData(parentObj, parType, parser) {
28
- while (this.initInnerObjects(parser.getNextTag(), parentObj, parType, parser)) {
29
- }
30
- }
31
- fillDataByExists(task, parser) {
32
- while (this.fillExistInnerObjects(parser.getNextTag(), task, parser)) {
33
- }
34
- }
35
- initInnerObjects(foundTagName, parentObj, parType, parser) {
36
- if (foundTagName !== null && foundTagName === XMLConstants.MG_TAG_PROP) {
37
- let property = new Property();
38
- property.fillData(parentObj, parType, parser);
39
- this.addProp(property);
40
- }
41
- else
42
- return false;
43
- return true;
44
- }
45
- addProp(prop) {
46
- this._hashTab.set_Item(prop.getID(), prop);
47
- this._props.push(prop);
48
- }
49
- delPropById(id) {
50
- if (this._props === null)
51
- return;
52
- let existingProp = this._hashTab.get_Item(id);
53
- if (existingProp !== null) {
54
- this._props.Remove(existingProp);
55
- this._hashTab.Remove(id);
56
- }
57
- }
58
- fillExistInnerObjects(nameOfFound, task, parser) {
59
- let tokensVector = new List();
60
- let endContext = -1;
61
- if (nameOfFound == null)
62
- return false;
63
- if (nameOfFound === XMLConstants.MG_TAG_CONTROL)
64
- endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
65
- else if (nameOfFound === XMLConstants.MG_TAG_PROP)
66
- endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
67
- else if (nameOfFound === ('/' + XMLConstants.MG_TAG_CONTROL) ||
68
- GuiFormPropertyAdapter.IsEndFormTag(nameOfFound)) {
69
- parser.setCurrIndex2EndOfTag();
70
- return false;
71
- }
72
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
73
- let tag = parser.getXMLsubstring(endContext);
74
- parser.add2CurrIndex(tag.indexOf(nameOfFound) + nameOfFound.length);
75
- tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
76
- if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
77
- this._parent = task.getCtrl(NNumber.Parse(this.fillName(tokensVector)));
78
- parser.setCurrIndex(++endContext);
79
- return true;
80
- }
81
- else if (nameOfFound === XMLConstants.MG_TAG_PROP) {
82
- if (this._parent != null) {
83
- let strPropId = this.fillName(tokensVector);
84
- let propId = NNumber.Parse(strPropId);
85
- let prop = null;
86
- if (this._parent != null)
87
- prop = this._parent.getProp(propId);
88
- if (prop == null)
89
- Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() no property with id={0}", strPropId));
90
- else
91
- this.addProp(prop);
92
- parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
93
- return true;
94
- }
95
- else
96
- Events.WriteExceptionToLog("in PropTable.fillExistInnerObjects() missing control");
97
- }
98
- else {
99
- Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() illegal tag name: {0}", nameOfFound));
100
- parser.setCurrIndex(++endContext);
101
- return true;
102
- }
103
- }
104
- if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
105
- parser.setCurrIndex(++endContext);
106
- return true;
107
- }
108
- else if (GuiFormPropertyAdapter.IsFormTag(nameOfFound)) {
109
- this._parent = task.getForm();
110
- this._parent.fillName(nameOfFound);
111
- return true;
112
- }
113
- else if (nameOfFound === ('/' + XMLConstants.MG_TAG_FLD))
114
- return false;
115
- parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
116
- return true;
117
- }
118
- fillName(tokensVector) {
119
- let attribute = null;
120
- let valueStr;
121
- for (let j = 0; j < tokensVector.length; j = j + 2) {
122
- attribute = tokensVector.get_Item(j);
123
- valueStr = tokensVector.get_Item(j + 1);
124
- if (attribute === XMLConstants.MG_ATTR_DITIDX || attribute === XMLConstants.MG_ATTR_ID)
125
- return valueStr;
126
- }
127
- Events.WriteExceptionToLog(NString.Format("Unrecognized attribute: '{0}'", attribute));
128
- return null;
129
- }
130
- getSize() {
131
- return this._props.length;
132
- }
133
- getProp(idx) {
134
- if (idx < 0 || idx >= this._props.length)
135
- return null;
136
- return this._props.get_Item(idx);
137
- }
138
- getPropById(id) {
139
- return this._hashTab.get_Item(id);
140
- }
141
- propExists(id) {
142
- return this.getPropById(id) !== null;
143
- }
144
- setProp(propId, val, parent, parentType) {
145
- let prop = this.getPropById(propId);
146
- if (prop === null) {
147
- prop = new Property(propId, parent, parentType);
148
- this.addProp(prop);
149
- }
150
- prop.setValue(val);
151
- prop.setOrgValue();
152
- }
153
- async RefreshDisplay(forceRefresh, onlyRepeatableProps) {
154
- let allPropsRefreshed = true;
155
- let prop;
156
- let i = 0;
157
- let form = null;
158
- let visibleProps = new List();
159
- if (this._parent != null && this._parent instanceof GuiControlPropertyAdapter)
160
- form = this._parent.getForm();
161
- if (form != null)
162
- form.checkAndCreateRow(form.DisplayLine);
163
- for (i = 0; i < this.getSize(); i++) {
164
- prop = this.getProp(i);
165
- try {
166
- if (onlyRepeatableProps && !Property.isRepeatableInTable())
167
- continue;
168
- if (prop.getID() === PropInterface.PROP_TYPE_VISIBLE)
169
- visibleProps.push(prop);
170
- else
171
- await prop.RefreshDisplay(forceRefresh);
172
- }
173
- catch (ex) {
174
- if (ex instanceof ApplicationException) {
175
- Events.WriteExceptionToLog(ex);
176
- allPropsRefreshed = false;
177
- }
178
- else
179
- throw ex;
180
- }
181
- }
182
- for (let i = 0; i < visibleProps.length; i++) {
183
- let visibleProp = visibleProps[i];
184
- await visibleProp.RefreshDisplay(forceRefresh);
185
- }
186
- return allPropsRefreshed;
187
- }
188
- updatePrevValueArray(newSize) {
189
- for (let i = 0; i < this._props.length; i = i + 1) {
190
- let property = this._props.get_Item(i);
191
- property.updatePrevValueArray(newSize);
192
- }
193
- }
194
- resetPrevValueArray() {
195
- for (let i = 0; i < this._props.length; i = i + 1) {
196
- let property = this._props.get_Item(i);
197
- property.ResetPrevValueArray();
198
- }
199
- }
200
- resetPrevValAt(index) {
201
- for (let i = 0; i < this._props.length; i = i + 1) {
202
- let property = this._props.get_Item(i);
203
- property.resetPrevValAt(index);
204
- }
205
- }
206
- clearLabelPrevValueArray() {
207
- let labelProperty = this.getPropById(45);
208
- if (labelProperty !== null)
209
- labelProperty.clearPrevValueArray();
210
- }
211
- getCtrlRef() {
212
- return ((this._parent instanceof GuiControlPropertyAdapter) ? this._parent : null);
213
- }
214
- InsertPrevValueArray(count) {
215
- for (let i = 0; i < this._props.length; i++) {
216
- let prop = this._props[i];
217
- prop.InsertPrevValueArray(count);
218
- }
219
- }
220
- }
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcFRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L2d1aS9Qcm9wVGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsT0FBTyxFQUFDLFlBQVksRUFBRSxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUt0RSxNQUFNLE9BQU8sU0FBUztJQVlwQixZQUFZLE9BQTZCO1FBVmpDLGFBQVEsR0FBZ0MsSUFBSSxDQUFDO1FBQzdDLFdBQU0sR0FBbUIsSUFBSSxDQUFDO1FBQzlCLFlBQU8sR0FBd0IsSUFBSSxDQUFDO1FBVTFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBWSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxTQUFTLENBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxhQUFhLENB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bWJlciwgTlN0cmluZ30gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7UHJvcGVydHl9IGZyb20gXCIuL1Byb3BlcnR5XCI7XHJcbmltcG9ydCB7UHJvcFBhcmVudEludGVyZmFjZX0gZnJvbSBcIi4uLy4uL2d1aS9Qcm9wUGFyZW50SW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7WE1MQ29uc3RhbnRzLCBYbWxQYXJzZXJ9IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7R3VpVGFza0Jhc2V9IGZyb20gXCIuLi90YXNrcy9HdWlUYXNrQmFzZVwiO1xyXG5pbXBvcnQge0V2ZW50c30gZnJvbSBcIi4uLy4uL0V2ZW50c1wiO1xyXG5pbXBvcnQge1Byb3BJbnRlcmZhY2V9IGZyb20gXCIuL1Byb3BJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtHdWlGb3JtUHJvcGVydHlBZGFwdGVyfSBmcm9tIFwiLi9HdWlGb3JtUHJvcGVydHlBZGFwdGVyXCI7XHJcbmltcG9ydCB7R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcn0gZnJvbSBcIi4vR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlclwiO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBwcm9wZXJ0aWVzIHRhYmxlXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBQcm9wVGFibGUge1xyXG5cclxuICBwcml2YXRlIF9oYXNoVGFiOiBIYXNodGFibGU8bnVtYmVyLCBQcm9wZXJ0eT4gPSBudWxsOyAvLyBmb3IgZmFzdCBhY2Nlc3MgdG8gcHJvcGVydGllc1xyXG4gIHByaXZhdGUgX3Byb3BzOiBMaXN0PFByb3BlcnR5PiA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGFyZW50OiBQcm9wUGFyZW50SW50ZXJmYWNlID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmVudF86IFByb3BQYXJlbnRJbnRlcmZhY2UpO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmVudF8/OiBQcm9wUGFyZW50SW50ZXJmYWNlKSB7XHJcblxyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMShwYXJlbnRfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Byb3BzID0gbmV3IExpc3Q8UHJvcGVydHk+KCk7XHJcbiAgICB0aGlzLl9oYXNoVGFiID0gbmV3IEhhc2h0YWJsZTxudW1iZXIsIFByb3BlcnR5PigyMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEocGFyZW50XzogUHJvcFBhcmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnRfO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudE9ialwiPnJlZmVyZW5jZSB0byBwYXJlbnQgb2JqZWN0KEd1aVRhc2tCYXNlKTwvcGFyYW0+XHJcbiAgZmlsbERhdGEocGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCksIHBhcmVudE9iaiwgcGFyVHlwZSwgcGFyc2VyKSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZvciByZWNvbXB1dGU6IFBhcnNlIHRoZSBleGlzdGluZyBwcm9wZXJ0aWVzIGFuZCBjcmVhdGUgcmVmZXJlbmNlcyB0byB0aGVtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5yZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBHdWlUYXNrQmFzZTwvcGFyYW0+XHJcbiAgZmlsbERhdGFCeUV4aXN0cyh0YXNrOiBHdWlUYXNrQmFzZSwgcGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIHdoaWxlICh0aGlzLmZpbGxFeGlzdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpLCB0YXNrLCBwYXJzZXIpKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCB0aGUgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+bmFtZSBvZiB0YWcsIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50T2JqXCI+cmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgb2JqZWN0LCBuZWVkIGJlIGFkZGVkIHRvIGV2ZXJ5IFByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IE1hbmFnZXIuWG1sUGFyc2VyLmdldEN1cnJJbmRleCgpLCB0aGUgZm91bmQgb2JqZWN0IHRhZyBhbmQgQUxMIGl0cyBzdWJ0YWdzIGZpbmlzaDwvcmV0dXJucz5cclxuICBwcml2YXRlIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nLCBwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSAhPT0gbnVsbCAmJiBmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUCkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gbmV3IFByb3BlcnR5KCk7XHJcbiAgICAgIHByb3BlcnR5LmZpbGxEYXRhKHBhcmVudE9iaiwgcGFyVHlwZSwgcGFyc2VyKTtcclxuICAgICAgdGhpcy5hZGRQcm9wKHByb3BlcnR5KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkaW5nIHByb3BlcnR5IGJ5IGtleVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wXCI+PC9wYXJhbT5cclxuICBhZGRQcm9wKHByb3A6IFByb3BlcnR5KTogdm9pZCB7XHJcbiAgICB0aGlzLl9oYXNoVGFiLnNldF9JdGVtKHByb3AuZ2V0SUQoKSwgcHJvcCk7XHJcbiAgICB0aGlzLl9wcm9wcy5wdXNoKHByb3ApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPjwvcGFyYW0+XHJcbiAgZGVsUHJvcEJ5SWQoaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3Byb3BzID09PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGV4aXN0aW5nUHJvcDogUHJvcGVydHkgPSA8UHJvcGVydHk+dGhpcy5faGFzaFRhYi5nZXRfSXRlbShpZCk7XHJcbiAgICBpZiAoZXhpc3RpbmdQcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3Byb3BzLlJlbW92ZShleGlzdGluZ1Byb3ApO1xyXG4gICAgICB0aGlzLl9oYXNoVGFiLlJlbW92ZShpZCk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZvciBSZWNvbXB1dGU6IEZpbGwgUHJvcFRhYmxlIHdpdGggcmVmZXJlbmNlIHRvIGV4aXN0aW5nIFByb3BUYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+cmVmZXJlbmNlIHRvIHBhcmVudCBHdWlUYXNrQmFzZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBmaWxsRXhpc3RJbm5lck9iamVjdHMobmFtZU9mRm91bmQ6IHN0cmluZywgdGFzazogR3VpVGFza0Jhc2UsIHBhcnNlcjogWG1sUGFyc2VyKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIGlmIChuYW1lT2ZGb3VuZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpXHJcbiAgICAgIGVuZENvbnRleHQgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGVsc2UgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApXHJcbiAgICAgIGVuZENvbnRleHQgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19URVJNLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgZWxzZSBpZiAobmFtZU9mRm91bmQgPT09ICgnLycgKyBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHx8XHJcbiAgICAgIEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIuSXNFbmRGb3JtVGFnKG5hbWVPZkZvdW5kKSkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihuYW1lT2ZGb3VuZCkgKyBuYW1lT2ZGb3VuZC5sZW5ndGgpO1xyXG4gICAgICB0b2tlbnNWZWN0b3IgPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIGlmIChuYW1lT2ZGb3VuZCA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSB7XHJcbiAgICAgICAgLy8gZGl0aWR4IG9mIEV4aXN0cyBDb250cm9sXHJcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gdGFzay5nZXRDdHJsKE5OdW1iZXIuUGFyc2UodGhpcy5maWxsTmFtZSh0b2tlbnNWZWN0b3IpKSk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleCgrK2VuZENvbnRleHQpOyAvLyB0byBkZWxldGUgXCI+XCJcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChuYW1lT2ZGb3VuZCA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgc3RyUHJvcElkOiBzdHJpbmcgPSB0aGlzLmZpbGxOYW1lKHRva2Vuc1ZlY3Rvcik7XHJcbiAgICAgICAgICBsZXQgcHJvcElkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHN0clByb3BJZCk7XHJcbiAgICAgICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQgIT0gbnVsbClcclxuICAgICAgICAgICAgcHJvcCA9IHRoaXMuX3BhcmVudC5nZXRQcm9wKHByb3BJZCk7XHJcblxyXG4gICAgICAgICAgaWYgKHByb3AgPT0gbnVsbClcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBQcm9wVGFibGUuZmlsbEV4aXN0SW5uZXJPYmplY3RzKCkgbm8gcHJvcGVydHkgd2l0aCBpZD17MH1cIiwgc3RyUHJvcElkKSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuYWRkUHJvcChwcm9wKTtcclxuICAgICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpO1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiaW4gUHJvcFRhYmxlLmZpbGxFeGlzdElubmVyT2JqZWN0cygpIG1pc3NpbmcgY29udHJvbFwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIFByb3BUYWJsZS5maWxsRXhpc3RJbm5lck9iamVjdHMoKSBpbGxlZ2FsIHRhZyBuYW1lOiB7MH1cIiwgbmFtZU9mRm91bmQpKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoR3VpRm9ybVByb3BlcnR5QWRhcHRlci5Jc0Zvcm1UYWcobmFtZU9mRm91bmQpKSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudCA9IHRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAoPEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnQpLmZpbGxOYW1lKG5hbWVPZkZvdW5kKTtcclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobmFtZU9mRm91bmQgPT09ICgnLycgKyBYTUxDb25zdGFudHMuTUdfVEFHX0ZMRCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTsgLy8gZXhpdCBvZiBib3VuZHNcclxuICAgIHJldHVybiB0cnVlO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmluZCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBDb250cm9sLCBvciBvZiBhbiBleGlzdGluZyBQcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBOYW1lIG9mIGNvbnRyb2w8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmaWxsTmFtZSh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPik6IHN0cmluZyB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IHZhbHVlU3RyOiBzdHJpbmc7XHJcblxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogPSBqICsgMikge1xyXG4gICAgICBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuXHJcbiAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0RJVElEWCB8fCBhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lEKVxyXG4gICAgICAgIHJldHVybiB2YWx1ZVN0cjtcclxuICAgIH1cclxuICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJ3swfSdcIiwgYXR0cmlidXRlKSk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgc2l6ZSBvZiB0aGUgdmVjdG9yIHByb3BzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHNpemUgb2YgdGhlIHByb3BzIG1lbWJlcjwvcmV0dXJucz5cclxuICBnZXRTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvcHMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIFByb3BlcnR5IGJ5IGl0cyBpbmRleCBpbiB0aGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGluZGV4IG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiByZWZlcmVuY2UgdG8gdGhlIHJlcXVpcmVkIFByb3BlcnR5PC9yZXR1cm5zPlxyXG4gIGdldFByb3AoaWR4OiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gdGhpcy5fcHJvcHMubGVuZ3RoKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLl9wcm9wcy5nZXRfSXRlbShpZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIFByb3BlcnR5IGJ5IGl0cyBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPm9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgZ2V0UHJvcEJ5SWQoaWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIHJldHVybiA8UHJvcGVydHk+dGhpcy5faGFzaFRhYi5nZXRfSXRlbShpZCk7XHJcbiAgfVxyXG5cclxuICBwcm9wRXhpc3RzKGlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BCeUlkKGlkKSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYSBwcm9wZXJ0eSB2YWx1ZS4gaW4gY2FzZSB0aGUgdGFibGUgZG9lc24ndCBjb250YWluIHN1Y2ggcHJvcGVydHksIGNyZWF0ZXMgYSBuZXcgUHJvcGVydHkgb2JqZWN0IGFuZCBhZGQgaXQgdG8gdGhlIHRhYmxlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50XCI+YSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3Q8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50VHlwZVwiPnRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgb2JqZWN0PC9wYXJhbT5cclxuICBzZXRQcm9wKHByb3BJZDogbnVtYmVyLCB2YWw6IHN0cmluZywgcGFyZW50OiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJlbnRUeXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICBwcm9wID0gbmV3IFByb3BlcnR5KHByb3BJZCwgcGFyZW50LCBwYXJlbnRUeXBlKTtcclxuICAgICAgdGhpcy5hZGRQcm9wKHByb3ApO1xyXG4gICAgfVxyXG4gICAgcHJvcC5zZXRWYWx1ZSh2YWwpO1xyXG4gICAgcHJvcC5zZXRPcmdWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggZGlzcGxheSBvZiB0aGUgcHJvcGVydGllcyBpbiB0aGUgVGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VSZWZyZXNoXCI+aWYgdHJ1ZSwgcmVmcmVzaCBpcyBmb3JjZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJldmlvdXMgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25seVJlcGVhdGFibGVQcm9wc1wiPmlmIHRydWUsIHJlZnJlc2hlcyBvbmx5IHJlcGVhdGFibGUgdHJlZSBwcm9wZXJ0aWVzPC9wYXJhbT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheShmb3JjZVJlZnJlc2g6IGJvb2xlYW4sIG9ubHlSZXBlYXRhYmxlUHJvcHM6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHJcbiAgICBsZXQgYWxsUHJvcHNSZWZyZXNoZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5O1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZm9ybTogR3VpRm9ybVByb3BlcnR5QWRhcHRlciA9IG51bGw7XHJcbiAgICBsZXQgdmlzaWJsZVByb3BzOiBMaXN0PFByb3BlcnR5PiA9IG5ldyBMaXN0KCk7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnQgIT0gbnVsbCAmJiB0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyKVxyXG4gICAgICBmb3JtID0gKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuX3BhcmVudCkuZ2V0Rm9ybSgpO1xyXG5cclxuICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgIGZvcm0uY2hlY2tBbmRDcmVhdGVSb3coZm9ybS5EaXNwbGF5TGluZSk7XHJcblxyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLmdldFByb3AoaSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcmVwZWF0YWJsZSBpbiB0cmVlIG9yIHRhYmxlLCBhbmQgb25seVJlcGVhdGFibGVQcm9wcyB0dXJuZWQgb25cclxuICAgICAgICAvLyBkbyBub3QgcmVmcmVzaCB0aGlzIHByb3BlcnR5XHJcbiAgICAgICAgaWYgKG9ubHlSZXBlYXRhYmxlUHJvcHMgJiYgIVByb3BlcnR5LmlzUmVwZWF0YWJsZUluVGFibGUoKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvLyBSZWZyZXNoIFZpc2libGUgcHJvcCBvbmx5IGFmdGVyIHJlZnJlc2hpbmcgdGhlIG5hdmlnYXRpb24gcHJvcHMgbGlrZSBYLCBZLlxyXG4gICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGNvbnRyb2wgaXMgc2hvd24gb24gaXRzIGRlZmF1bHQgbG9jYXRpb24gZmlyc3QgYW5kXHJcbiAgICAgICAgLy8gdGhlbiBtb3ZlZCBzb21ld2hlcmUgZWxzZS4gQW5kIHRoaXMgaXMgY2xlYXJseSB2aXNpYmxlLlxyXG4gICAgICAgIGlmIChwcm9wLmdldElEKCkgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpXHJcbiAgICAgICAgICB2aXNpYmxlUHJvcHMucHVzaChwcm9wKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCBwcm9wLlJlZnJlc2hEaXNwbGF5KGZvcmNlUmVmcmVzaCk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4KTtcclxuICAgICAgICAgIGFsbFByb3BzUmVmcmVzaGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93ICBleDtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpc2libGVQcm9wcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgbGV0IHZpc2libGVQcm9wID0gdmlzaWJsZVByb3BzW2ldO1xyXG4gICAgICBhd2FpdCB2aXNpYmxlUHJvcC5SZWZyZXNoRGlzcGxheShmb3JjZVJlZnJlc2gpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhbGxQcm9wc1JlZnJlc2hlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgYWxsIHByb3BlcnRpZXMgYXJyYXkgc2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICB1cGRhdGVQcmV2VmFsdWVBcnJheShuZXdTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHByb3BlcnR5LnVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB1cGRhdGUgYWxsIHByb3BlcnRpZXMgYXJyYXkgc2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRQcmV2VmFsdWVBcnJheSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHByb3BlcnR5LlJlc2V0UHJldlZhbHVlQXJyYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVzZXQgcHJldiB2YWx1ZSBhdCBpbmRleC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0UHJldlZhbEF0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHByb3BlcnR5LnJlc2V0UHJldlZhbEF0KGluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2xlYXIgcHJldlZhbHVlIGFycmF5IG9mIExhYmVsIHByb3BlcnR5IGlmIGV4aXN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJMYWJlbFByZXZWYWx1ZUFycmF5KCk6IHZvaWQge1xyXG4gICAgbGV0IGxhYmVsUHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wQnlJZCg0NSk7XHJcbiAgICBpZiAobGFiZWxQcm9wZXJ0eSAhPT0gbnVsbClcclxuICAgICAgbGFiZWxQcm9wZXJ0eS5jbGVhclByZXZWYWx1ZUFycmF5KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEN0cmxSZWYoKTogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyKSA/IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuX3BhcmVudCA6IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEluc2VydFByZXZWYWx1ZUFycmF5KCBjb3VudDogbnVtYmVyKSB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcHJvcHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHNbaV07XHJcbiAgICAgIHByb3AuSW5zZXJ0UHJldlZhbHVlQXJyYXkoY291bnQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=