@sapui5/sap.fe.templates 1.109.0 → 1.110.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 (83) hide show
  1. package/README.md +5 -1
  2. package/package.json +11 -8
  3. package/src/sap/fe/templates/.library +26 -27
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.js +1 -7
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +1 -4
  6. package/src/sap/fe/templates/ListComponent.js +45 -62
  7. package/src/sap/fe/templates/ListComponent.ts +43 -43
  8. package/src/sap/fe/templates/ListReport/Component.js +11 -19
  9. package/src/sap/fe/templates/ListReport/Component.ts +6 -0
  10. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +11 -37
  11. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +1 -1
  12. package/src/sap/fe/templates/ListReport/LRMessageStrip.js +196 -0
  13. package/src/sap/fe/templates/ListReport/LRMessageStrip.ts +216 -0
  14. package/src/sap/fe/templates/ListReport/ListReport.view.xml +31 -0
  15. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +140 -247
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +49 -14
  17. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +2 -7
  18. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +21 -108
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +9 -17
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -25
  21. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +51 -122
  22. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +1 -23
  23. package/src/sap/fe/templates/ObjectPage/Component.js +19 -40
  24. package/src/sap/fe/templates/ObjectPage/Component.ts +9 -2
  25. package/src/sap/fe/templates/ObjectPage/ExtendPageDefinition.js +64 -0
  26. package/src/sap/fe/templates/ObjectPage/ExtendPageDefinition.ts +80 -0
  27. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +21 -58
  28. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +4 -4
  29. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +2 -1
  30. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +173 -459
  31. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +13 -18
  32. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +129 -208
  33. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +62 -14
  34. package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.js +1 -32
  35. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +9 -37
  36. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +1 -7
  37. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +9 -31
  38. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +1 -1
  39. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +2 -4
  40. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
  41. package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.js +4 -5
  42. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +4 -4
  43. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +3 -3
  44. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +4 -4
  45. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +3 -3
  46. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +16 -21
  47. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +1 -1
  48. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +19 -1
  49. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +21 -0
  50. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
  51. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +4 -5
  52. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +19 -69
  53. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +1 -1
  54. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +5 -20
  55. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +6 -6
  56. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +4 -3
  57. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +3 -3
  58. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -1
  59. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderContent.fragment.xml +1 -1
  60. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -1
  61. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +4 -3
  62. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacetCustomContainer.fragment.xml +7 -5
  63. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingAvatar.fragment.xml +1 -1
  64. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +3 -2
  65. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +2 -1
  66. package/src/sap/fe/templates/ObjectPage/view/fragments/SideContentCustomContainer.fragment.xml +7 -7
  67. package/src/sap/fe/templates/TableScroller.js +1 -6
  68. package/src/sap/fe/templates/library.js +4 -7
  69. package/src/sap/fe/templates/library.ts +1 -2
  70. package/src/sap/fe/templates/messagebundle.properties +30 -29
  71. package/src/sap/fe/templates/messagebundle_bg.properties +2 -2
  72. package/src/sap/fe/templates/messagebundle_cs.properties +1 -1
  73. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +1 -1
  74. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +1 -1
  75. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +1 -1
  76. package/src/sap/fe/templates/messagebundle_no.properties +3 -3
  77. package/src/sap/fe/templates/messagebundle_sl.properties +7 -7
  78. package/ui5.yaml +0 -1
  79. package/src/sap/fe/templates/Feedback.js +0 -80
  80. package/src/sap/fe/templates/Feedback.ts +0 -64
  81. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +0 -82
  82. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +0 -20
  83. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +0 -20
@@ -22,21 +22,13 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
22
22
  var UI = BindingHelper.UI;
23
23
  var Entity = BindingHelper.Entity;
24
24
  var Draft = BindingHelper.Draft;
25
-
26
25
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
27
-
28
26
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
29
-
30
27
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
31
-
32
28
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
33
-
34
29
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
35
-
36
30
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
37
-
38
31
  var ButtonType = mLibrary.ButtonType;
39
-
40
32
  //```mermaid
41
33
  // graph TD
42
34
  // A[Object Page Title] -->|Get DataField Value| C{Evaluate Create Mode}
@@ -51,7 +43,6 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
51
43
  // D -->|No| E
52
44
  // C -->|Not in create mode| E[Show DataField Value]
53
45
  // ```
54
-
55
46
  /**
56
47
  * Compute the title for the object page.
57
48
  *
@@ -63,43 +54,39 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
63
54
  */
64
55
  var getExpressionForTitle = function (oHeaderInfo, oViewData, fullContextPath, oDraftRoot) {
65
56
  var _oHeaderInfo$Title, _oHeaderInfo$Title2, _oHeaderInfo$Title5, _oHeaderInfo$Title6;
66
-
67
57
  var titleNoHeaderInfo = CommonUtils.getTranslatedText("T_NEW_OBJECT", oViewData.resourceBundle, undefined, oViewData.entitySet);
68
58
  var titleWithHeaderInfo = CommonUtils.getTranslatedText("T_ANNOTATION_HELPER_DEFAULT_OBJECT_PAGE_HEADER_TITLE", oViewData.resourceBundle, undefined, oViewData.entitySet);
69
59
  var oEmptyHeaderInfoTitle = (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Title) === undefined || (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Title) === "" || (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title = oHeaderInfo.Title) === null || _oHeaderInfo$Title === void 0 ? void 0 : _oHeaderInfo$Title.Value) === "";
70
60
  var titleForActiveHeaderNoHeaderInfo = !oEmptyHeaderInfoTitle ? CommonUtils.getTranslatedText("T_ANNOTATION_HELPER_DEFAULT_OBJECT_PAGE_HEADER_TITLE_NO_HEADER_INFO", oViewData.resourceBundle) : "";
71
61
  var titleValueExpression,
72
- connectedFieldsPath,
73
- titleIsEmpty = constant(true),
74
- titleBooleanExpression;
75
-
62
+ connectedFieldsPath,
63
+ titleIsEmpty = constant(true),
64
+ titleBooleanExpression;
76
65
  if ((oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title2 = oHeaderInfo.Title) === null || _oHeaderInfo$Title2 === void 0 ? void 0 : _oHeaderInfo$Title2.$Type) === "com.sap.vocabularies.UI.v1.DataField") {
77
66
  var _oHeaderInfo$Title3, _oHeaderInfo$Title4, _oHeaderInfo$Title4$V, _oHeaderInfo$Title4$V2, _oHeaderInfo$Title4$V3, _oHeaderInfo$Title4$V4, _oHeaderInfo$Title4$V5, _oHeaderInfo$Title4$V6, _oHeaderInfo$Title4$V7, _titleValueExpression, _titleValueExpression2;
78
-
79
67
  titleValueExpression = getExpressionFromAnnotation(oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title3 = oHeaderInfo.Title) === null || _oHeaderInfo$Title3 === void 0 ? void 0 : _oHeaderInfo$Title3.Value);
80
-
81
68
  if (oHeaderInfo !== null && oHeaderInfo !== void 0 && (_oHeaderInfo$Title4 = oHeaderInfo.Title) !== null && _oHeaderInfo$Title4 !== void 0 && (_oHeaderInfo$Title4$V = _oHeaderInfo$Title4.Value) !== null && _oHeaderInfo$Title4$V !== void 0 && (_oHeaderInfo$Title4$V2 = _oHeaderInfo$Title4$V.$target) !== null && _oHeaderInfo$Title4$V2 !== void 0 && (_oHeaderInfo$Title4$V3 = _oHeaderInfo$Title4$V2.annotations) !== null && _oHeaderInfo$Title4$V3 !== void 0 && (_oHeaderInfo$Title4$V4 = _oHeaderInfo$Title4$V3.Common) !== null && _oHeaderInfo$Title4$V4 !== void 0 && (_oHeaderInfo$Title4$V5 = _oHeaderInfo$Title4$V4.Text) !== null && _oHeaderInfo$Title4$V5 !== void 0 && (_oHeaderInfo$Title4$V6 = _oHeaderInfo$Title4$V5.annotations) !== null && _oHeaderInfo$Title4$V6 !== void 0 && (_oHeaderInfo$Title4$V7 = _oHeaderInfo$Title4$V6.UI) !== null && _oHeaderInfo$Title4$V7 !== void 0 && _oHeaderInfo$Title4$V7.TextArrangement) {
82
69
  // In case an explicit text arrangement was set we make use of it in the description as well
83
70
  titleValueExpression = addTextArrangementToBindingExpression(titleValueExpression, fullContextPath);
84
71
  }
85
-
86
72
  titleValueExpression = formatValueRecursively(titleValueExpression, fullContextPath);
87
73
  titleIsEmpty = ((_titleValueExpression = titleValueExpression) === null || _titleValueExpression === void 0 ? void 0 : _titleValueExpression._type) === "Constant" ? constant(!((_titleValueExpression2 = titleValueExpression) !== null && _titleValueExpression2 !== void 0 && _titleValueExpression2.value)) : isEmpty(titleValueExpression);
88
74
  } else if ((oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title5 = oHeaderInfo.Title) === null || _oHeaderInfo$Title5 === void 0 ? void 0 : _oHeaderInfo$Title5.$Type) === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title6 = oHeaderInfo.Title) === null || _oHeaderInfo$Title6 === void 0 ? void 0 : _oHeaderInfo$Title6.Target.$target.$Type) === "com.sap.vocabularies.UI.v1.ConnectedFieldsType") {
89
75
  var _titleValueExpression3, _titleValueExpression4;
90
-
91
76
  connectedFieldsPath = enhanceDataModelPath(fullContextPath, "$Type/@UI.HeaderInfo/Title/Target/$AnnotationPath");
92
77
  titleValueExpression = getLabelForConnectedFields(connectedFieldsPath, false);
93
78
  titleBooleanExpression = ((_titleValueExpression3 = titleValueExpression) === null || _titleValueExpression3 === void 0 ? void 0 : _titleValueExpression3._type) === "Constant" ? constant(!((_titleValueExpression4 = titleValueExpression) !== null && _titleValueExpression4 !== void 0 && _titleValueExpression4.value)) : isEmpty(titleValueExpression);
94
79
  titleIsEmpty = titleValueExpression ? titleBooleanExpression : constant(true);
95
- } // If there is a TypeName defined, show the default title 'New + TypeName', otherwise show the custom title or the default 'New object'
96
-
80
+ }
97
81
 
82
+ // If there is a TypeName defined, show the default title 'New + TypeName', otherwise show the custom title or the default 'New object'
98
83
  var createModeTitle = oHeaderInfo !== null && oHeaderInfo !== void 0 && oHeaderInfo.TypeName ? concat(titleWithHeaderInfo, ": ", resolveBindingString(oHeaderInfo.TypeName.toString())) : titleNoHeaderInfo;
99
84
  var activeExpression = oDraftRoot ? Entity.IsActive : true;
100
- return compileExpression(ifElse(and(or(UI.IsCreateModeSticky, UI.IsCreateMode), titleIsEmpty), createModeTitle, // Otherwise show the default expression
85
+ return compileExpression(ifElse(and(UI.IsCreateMode, titleIsEmpty), createModeTitle,
86
+ // Otherwise show the default expression
101
87
  ifElse(and(activeExpression, titleIsEmpty), titleForActiveHeaderNoHeaderInfo, titleValueExpression)));
102
88
  };
89
+
103
90
  /**
104
91
  * Retrieves the expression for the description of an object page.
105
92
  *
@@ -107,22 +94,17 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
107
94
  * @param fullContextPath The full context path used to reach that object page
108
95
  * @returns The binding expression for the object page description
109
96
  */
110
-
111
-
112
97
  _exports.getExpressionForTitle = getExpressionForTitle;
113
-
114
98
  var getExpressionForDescription = function (oHeaderInfo, fullContextPath) {
115
99
  var _oHeaderInfo$Descript, _oHeaderInfo$Descript2, _oHeaderInfo$Descript3, _oHeaderInfo$Descript4, _oHeaderInfo$Descript5, _oHeaderInfo$Descript6, _oHeaderInfo$Descript7, _oHeaderInfo$Descript8, _oHeaderInfo$Descript9;
116
-
117
100
  var pathInModel = getExpressionFromAnnotation(oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Descript = oHeaderInfo.Description) === null || _oHeaderInfo$Descript === void 0 ? void 0 : _oHeaderInfo$Descript.Value);
118
-
119
101
  if (oHeaderInfo !== null && oHeaderInfo !== void 0 && (_oHeaderInfo$Descript2 = oHeaderInfo.Description) !== null && _oHeaderInfo$Descript2 !== void 0 && (_oHeaderInfo$Descript3 = _oHeaderInfo$Descript2.Value) !== null && _oHeaderInfo$Descript3 !== void 0 && (_oHeaderInfo$Descript4 = _oHeaderInfo$Descript3.$target) !== null && _oHeaderInfo$Descript4 !== void 0 && (_oHeaderInfo$Descript5 = _oHeaderInfo$Descript4.annotations) !== null && _oHeaderInfo$Descript5 !== void 0 && (_oHeaderInfo$Descript6 = _oHeaderInfo$Descript5.Common) !== null && _oHeaderInfo$Descript6 !== void 0 && (_oHeaderInfo$Descript7 = _oHeaderInfo$Descript6.Text) !== null && _oHeaderInfo$Descript7 !== void 0 && (_oHeaderInfo$Descript8 = _oHeaderInfo$Descript7.annotations) !== null && _oHeaderInfo$Descript8 !== void 0 && (_oHeaderInfo$Descript9 = _oHeaderInfo$Descript8.UI) !== null && _oHeaderInfo$Descript9 !== void 0 && _oHeaderInfo$Descript9.TextArrangement) {
120
102
  // In case an explicit text arrangement was set we make use of it in the description as well
121
103
  pathInModel = addTextArrangementToBindingExpression(pathInModel, fullContextPath);
122
104
  }
123
-
124
105
  return compileExpression(formatValueRecursively(pathInModel, fullContextPath));
125
106
  };
107
+
126
108
  /**
127
109
  * Return the expression for the save button.
128
110
  *
@@ -130,27 +112,22 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
130
112
  * @param fullContextPath The path used up until here
131
113
  * @returns The binding expression that shows the right save button text
132
114
  */
133
-
134
-
135
115
  _exports.getExpressionForDescription = getExpressionForDescription;
136
-
137
116
  var getExpressionForSaveButton = function (oViewData, fullContextPath) {
138
117
  var _annotations$Session;
139
-
140
118
  var saveButtonText = CommonUtils.getTranslatedText("T_OP_OBJECT_PAGE_SAVE", oViewData.resourceBundle);
141
119
  var createButtonText = CommonUtils.getTranslatedText("T_OP_OBJECT_PAGE_CREATE", oViewData.resourceBundle);
142
120
  var saveExpression;
143
-
144
121
  if ((_annotations$Session = fullContextPath.startingEntitySet.annotations.Session) !== null && _annotations$Session !== void 0 && _annotations$Session.StickySessionSupported) {
145
122
  // If we're in sticky mode AND the ui is in create mode, show Create, else show Save
146
- saveExpression = ifElse(UI.IsCreateModeSticky, createButtonText, saveButtonText);
123
+ saveExpression = ifElse(UI.IsCreateMode, createButtonText, saveButtonText);
147
124
  } else {
148
125
  // If we're in draft AND the draft is a new object (!IsActiveEntity && !HasActiveEntity), show create, else show save
149
126
  saveExpression = ifElse(Draft.IsNewObject, createButtonText, saveButtonText);
150
127
  }
151
-
152
128
  return compileExpression(saveExpression);
153
129
  };
130
+
154
131
  /**
155
132
  * Method returns whether footer is visible or not on object / subobject page.
156
133
  *
@@ -160,31 +137,27 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
160
137
  * @param dataFields Data field array for normal footer visibility processing
161
138
  * @returns `true` if any action is true, otherwise compiled Binding or `false`
162
139
  */
163
-
164
-
165
140
  _exports.getExpressionForSaveButton = getExpressionForSaveButton;
166
-
167
141
  var getFooterVisible = function (footerActions, dataFields) {
168
142
  var manifestActions = footerActions.filter(function (action) {
169
143
  return isManifestAction(action);
170
144
  });
171
145
  var customActionVisibility;
172
-
173
146
  if (manifestActions.length) {
174
147
  // If we have manifest actions
175
148
  var customActionIndividualVisibility = manifestActions.map(function (action) {
176
149
  return resolveBindingString(action.visible, "boolean");
177
- }); // construct the footer's visibility-binding out of all actions' visibility-bindings, first the binding of all custom actions ...
178
-
179
- customActionVisibility = or.apply(void 0, _toConsumableArray(customActionIndividualVisibility)); // and then the binding of all annotation actions inside the footer ...
180
-
181
- var annotationActionVisibility = getDataFieldBasedFooterVisibility(dataFields, true); // finally, return everything.
182
-
150
+ });
151
+ // construct the footer's visibility-binding out of all actions' visibility-bindings, first the binding of all custom actions ...
152
+ customActionVisibility = or.apply(void 0, _toConsumableArray(customActionIndividualVisibility));
153
+ // and then the binding of all annotation actions inside the footer ...
154
+ var annotationActionVisibility = getDataFieldBasedFooterVisibility(dataFields, true);
155
+ // finally, return everything.
183
156
  return compileExpression(or(customActionVisibility, resolveBindingString(annotationActionVisibility, "boolean")));
184
157
  }
185
-
186
158
  return getDataFieldBasedFooterVisibility(dataFields, true);
187
159
  };
160
+
188
161
  /**
189
162
  * Checks if the footer is visible or not.
190
163
  *
@@ -198,21 +171,15 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
198
171
  * @private
199
172
  * @ui5-restricted
200
173
  */
201
-
202
-
203
174
  _exports.getFooterVisible = getFooterVisible;
204
-
205
175
  var getDataFieldBasedFooterVisibility = function (aDataFields, bConsiderEditable) {
206
176
  var sHiddenExpression = "";
207
177
  var sSemiHiddenExpression;
208
178
  var aHiddenActionPath = [];
209
-
210
179
  for (var i in aDataFields) {
211
180
  var oDataField = aDataFields[i];
212
-
213
181
  if (oDataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && oDataField.Determining === true) {
214
182
  var hiddenExpression = oDataField["@".concat("com.sap.vocabularies.UI.v1.Hidden")];
215
-
216
183
  if (!hiddenExpression) {
217
184
  return true;
218
185
  } else if (hiddenExpression.$Path) {
@@ -222,25 +189,23 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
222
189
  }
223
190
  }
224
191
  }
225
-
226
192
  if (aHiddenActionPath.length) {
227
193
  for (var index = 0; index < aHiddenActionPath.length; index++) {
228
194
  if (aHiddenActionPath[index]) {
229
195
  sSemiHiddenExpression = "(%{" + aHiddenActionPath[index] + "} === true ? false : true )";
230
196
  }
231
-
232
197
  if (index == aHiddenActionPath.length - 1) {
233
198
  sHiddenExpression = sHiddenExpression + sSemiHiddenExpression;
234
199
  } else {
235
200
  sHiddenExpression = sHiddenExpression + sSemiHiddenExpression + "||";
236
201
  }
237
202
  }
238
-
239
203
  return "{= " + (bConsiderEditable ? "(" : "") + sHiddenExpression + (bConsiderEditable ? " || ${ui>/isEditable}) " : " ") + "&& ${internal>isCreateDialogOpen} !== true}";
240
204
  } else {
241
205
  return "{= " + (bConsiderEditable ? "${ui>/isEditable} && " : "") + "${internal>isCreateDialogOpen} !== true}";
242
206
  }
243
207
  };
208
+
244
209
  /**
245
210
  * Method returns Whether the action type is manifest or not.
246
211
  *
@@ -249,14 +214,12 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
249
214
  * @param oAction The action object
250
215
  * @returns `true` if action is coming from manifest, `false` otherwise
251
216
  */
252
-
253
-
254
217
  _exports.getDataFieldBasedFooterVisibility = getDataFieldBasedFooterVisibility;
255
-
256
218
  var isManifestAction = function (oAction) {
257
219
  var aActions = ["Primary", "DefaultApply", "Secondary", "ForAction", "ForNavigation", "SwitchToActiveObject", "SwitchToDraftObject", "DraftActions"];
258
220
  return aActions.indexOf(oAction.type) < 0;
259
221
  };
222
+
260
223
  /**
261
224
  * Returns an expression to determine Emphasized button type based on Criticality across all actions
262
225
  * If critical action is rendered, its considered to be the primary action. Hence template's default primary action is set back to Default.
@@ -270,42 +233,33 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
270
233
  * @private
271
234
  * @ui5-restricted
272
235
  */
273
-
274
-
275
236
  _exports.isManifestAction = isManifestAction;
276
-
277
237
  var buildEmphasizedButtonExpression = function (aIdentification) {
278
238
  if (!aIdentification) {
279
239
  return ButtonType.Emphasized;
280
240
  }
281
-
282
241
  var sFormatEmphasizedExpression;
283
242
  var bIsAlwaysDefault,
284
- sHiddenSimplePath,
285
- sHiddenExpression = "";
243
+ sHiddenSimplePath,
244
+ sHiddenExpression = "";
286
245
  aIdentification.forEach(function (oDataField) {
287
246
  var oCriticalityProperty = oDataField.Criticality;
288
247
  var oDataFieldHidden = oDataField["@com.sap.vocabularies.UI.v1.Hidden"];
289
-
290
248
  if (oDataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && !bIsAlwaysDefault && oCriticalityProperty) {
291
249
  if (!sFormatEmphasizedExpression && oDataFieldHidden === true) {
292
250
  // if DataField is set to hidden, we can skip other checks and return Default button type
293
251
  sFormatEmphasizedExpression = ButtonType.Emphasized;
294
252
  return;
295
253
  }
296
-
297
254
  if (oDataFieldHidden && oDataFieldHidden.$Path) {
298
255
  // when visibility of critical button is based on path, collect all paths for expression
299
256
  sHiddenSimplePath = oDataFieldHidden.$Path;
300
-
301
257
  if (sHiddenExpression) {
302
258
  sHiddenExpression = sHiddenExpression + " && ";
303
259
  }
304
-
305
260
  sHiddenExpression = sHiddenExpression + "%{" + sHiddenSimplePath + "} === true";
306
261
  sFormatEmphasizedExpression = "{= (" + sHiddenExpression + ") ? 'Emphasized' : 'Default' }";
307
262
  }
308
-
309
263
  switch (oCriticalityProperty.$EnumMember) {
310
264
  // supported criticality are [Positive/3/'3'] and [Negative/1/'1']
311
265
  case "com.sap.vocabularies.UI.v1.CriticalityType/Negative":
@@ -318,14 +272,11 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
318
272
  sFormatEmphasizedExpression = ButtonType.Default;
319
273
  bIsAlwaysDefault = true;
320
274
  }
321
-
322
275
  sFormatEmphasizedExpression = sFormatEmphasizedExpression || ButtonType.Default;
323
276
  break;
324
-
325
277
  default:
326
278
  sFormatEmphasizedExpression = ButtonType.Emphasized;
327
279
  }
328
-
329
280
  if (oCriticalityProperty.$Path) {
330
281
  // when Criticality is set using a path, use the path for deducing the Emphsized type for default Primary Action
331
282
  var sCombinedHiddenExpression = sHiddenExpression ? "!(" + sHiddenExpression + ") && " : "";
@@ -335,12 +286,9 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
335
286
  });
336
287
  return sFormatEmphasizedExpression || ButtonType.Emphasized;
337
288
  };
338
-
339
289
  _exports.buildEmphasizedButtonExpression = buildEmphasizedButtonExpression;
340
-
341
290
  var getElementBinding = function (sPath) {
342
291
  var sNavigationPath = ODataModelAnnotationHelper.getNavigationPath(sPath);
343
-
344
292
  if (sNavigationPath) {
345
293
  return "{path:'" + sNavigationPath + "'}";
346
294
  } else {
@@ -348,16 +296,14 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
348
296
  return "{path: ''}";
349
297
  }
350
298
  };
299
+
351
300
  /**
352
301
  * Function to check if draft pattern is supported.
353
302
  *
354
303
  * @param oAnnotations Annotations of the current entity set.
355
304
  * @returns Returns the Boolean value based on draft state
356
305
  */
357
-
358
-
359
306
  _exports.getElementBinding = getElementBinding;
360
-
361
307
  var checkDraftState = function (oAnnotations) {
362
308
  if (oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"] && oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"]["EditAction"]) {
363
309
  return true;
@@ -365,16 +311,14 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
365
311
  return false;
366
312
  }
367
313
  };
314
+
368
315
  /**
369
316
  * Function to get the visibility for the SwitchToActive button in the object page or subobject page.
370
317
  *
371
318
  * @param oAnnotations Annotations of the current entity set.
372
319
  * @returns Returns expression binding or Boolean value based on the draft state
373
320
  */
374
-
375
-
376
321
  _exports.checkDraftState = checkDraftState;
377
-
378
322
  var getSwitchToActiveVisibility = function (oAnnotations) {
379
323
  if (checkDraftState(oAnnotations)) {
380
324
  return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( ${ui>/isEditable} && !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
@@ -382,16 +326,14 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
382
326
  return false;
383
327
  }
384
328
  };
329
+
385
330
  /**
386
331
  * Function to get the visibility for the SwitchToDraft button in the object page or subobject page.
387
332
  *
388
333
  * @param oAnnotations Annotations of the current entity set.
389
334
  * @returns Returns expression binding or Boolean value based on the draft state
390
335
  */
391
-
392
-
393
336
  _exports.getSwitchToActiveVisibility = getSwitchToActiveVisibility;
394
-
395
337
  var getSwitchToDraftVisibility = function (oAnnotations) {
396
338
  if (checkDraftState(oAnnotations)) {
397
339
  return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !(${ui>/isEditable}) && !${ui>createMode} && ${HasDraftEntity} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
@@ -399,16 +341,14 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
399
341
  return false;
400
342
  }
401
343
  };
344
+
402
345
  /**
403
346
  * Function to get the visibility for the SwitchDraftAndActive button in the object page or subobject page.
404
347
  *
405
348
  * @param oAnnotations Annotations of the current entity set.
406
349
  * @returns Returns expression binding or Boolean value based on the draft state
407
350
  */
408
-
409
-
410
351
  _exports.getSwitchToDraftVisibility = getSwitchToDraftVisibility;
411
-
412
352
  var getSwitchDraftAndActiveVisibility = function (oAnnotations) {
413
353
  if (checkDraftState(oAnnotations)) {
414
354
  return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
@@ -416,6 +356,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
416
356
  return false;
417
357
  }
418
358
  };
359
+
419
360
  /**
420
361
  * Function to find an action from the array of header actions in the converter context.
421
362
  *
@@ -424,150 +365,125 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
424
365
  * @returns The action with the matching action type
425
366
  * @private
426
367
  */
427
-
428
-
429
368
  _exports.getSwitchDraftAndActiveVisibility = getSwitchDraftAndActiveVisibility;
430
-
431
369
  var _findAction = function (aConverterContextHeaderActions, sActionType) {
432
370
  var oAction;
433
-
434
371
  if (aConverterContextHeaderActions && aConverterContextHeaderActions.length) {
435
372
  oAction = aConverterContextHeaderActions.find(function (oHeaderAction) {
436
373
  return oHeaderAction.type === sActionType;
437
374
  });
438
375
  }
439
-
440
376
  return oAction;
441
377
  };
378
+
442
379
  /**
443
380
  * Function to format the 'enabled' property for the Delete button on the object page or subobject page in case of a Command Execution.
444
381
  *
445
382
  * @param aConverterContextHeaderActions Array of header actions on the object page
446
383
  * @returns Returns expression binding or Boolean value from the converter output
447
384
  */
448
-
449
-
450
385
  _exports._findAction = _findAction;
451
-
452
386
  var getDeleteCommandExecutionEnabled = function (aConverterContextHeaderActions) {
453
387
  var oDeleteAction = _findAction(aConverterContextHeaderActions, "Secondary");
454
-
455
388
  return oDeleteAction ? oDeleteAction.enabled : "true";
456
389
  };
390
+
457
391
  /**
458
392
  * Function to format the 'visible' property for the Delete button on the object page or subobject page in case of a Command Execution.
459
393
  *
460
394
  * @param aConverterContextHeaderActions Array of header actions on the object page
461
395
  * @returns Returns expression binding or Boolean value from the converter output
462
396
  */
463
-
464
-
465
397
  _exports.getDeleteCommandExecutionEnabled = getDeleteCommandExecutionEnabled;
466
-
467
398
  var getDeleteCommandExecutionVisible = function (aConverterContextHeaderActions) {
468
399
  var oDeleteAction = _findAction(aConverterContextHeaderActions, "Secondary");
469
-
470
400
  return oDeleteAction ? oDeleteAction.visible : "true";
471
401
  };
402
+
472
403
  /**
473
404
  * Function to format the 'visible' property for the Edit button on the object page or subobject page in case of a Command Execution.
474
405
  *
475
406
  * @param aConverterContextHeaderActions Array of header actions on the object page
476
407
  * @returns Returns expression binding or Boolean value from the converter output
477
408
  */
478
-
479
-
480
409
  _exports.getDeleteCommandExecutionVisible = getDeleteCommandExecutionVisible;
481
-
482
410
  var getEditCommandExecutionVisible = function (aConverterContextHeaderActions) {
483
411
  var oEditAction = _findAction(aConverterContextHeaderActions, "Primary");
484
-
485
- return oEditAction ? oEditAction.visible : "true";
412
+ return oEditAction ? oEditAction.visible : "false";
486
413
  };
414
+
487
415
  /**
488
416
  * Function to format the 'enabled' property for the Edit button on the object page or subobject page in case of a Command Execution.
489
417
  *
490
418
  * @param aConverterContextHeaderActions Array of header actions on the object page
491
419
  * @returns Returns expression binding or Boolean value from the converter output
492
420
  */
493
-
494
-
495
421
  _exports.getEditCommandExecutionVisible = getEditCommandExecutionVisible;
496
-
497
422
  var getEditCommandExecutionEnabled = function (aConverterContextHeaderActions) {
498
423
  var oEditAction = _findAction(aConverterContextHeaderActions, "Primary");
499
-
500
- return oEditAction ? oEditAction.enabled : "true";
424
+ return oEditAction ? oEditAction.enabled : "false";
501
425
  };
426
+
502
427
  /**
503
- * Function to get the EditAction from the Entityset based on Draft or sticky based application.
428
+ * Function to get the EditAction from the based on a draft-enabled application or a sticky application.
504
429
  *
505
430
  * @param [oEntitySet] The value from the expression.
506
- * @returns Returns expression binding or boolean value based on vRawValue & oDraftNode
431
+ * @returns Returns expression binding or Boolean value based on vRawValue & oDraftNode
507
432
  */
508
-
509
-
510
433
  _exports.getEditCommandExecutionEnabled = getEditCommandExecutionEnabled;
511
-
512
434
  var getEditAction = function (oEntitySet) {
513
- var sPath = oEntitySet.getPath(),
514
- oAnnotations = oEntitySet.getObject("".concat(sPath, "@"));
515
- var bDraftRoot = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Common.v1.DraftRoot");
516
- var bStickySession = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Session.v1.StickySessionSupported");
435
+ var sPath = oEntitySet.getPath();
436
+ var aPaths = sPath.split("/");
437
+ var rootEntitySetPath = "/" + aPaths[1];
438
+ // get the edit action from root entity sets
439
+ var rootEntitySetAnnnotations = oEntitySet.getObject(rootEntitySetPath + "@");
440
+ var bDraftRoot = rootEntitySetAnnnotations.hasOwnProperty("@com.sap.vocabularies.Common.v1.DraftRoot");
441
+ var bDraftNode = rootEntitySetAnnnotations.hasOwnProperty("@com.sap.vocabularies.Common.v1.DraftNode");
442
+ var bStickySession = rootEntitySetAnnnotations.hasOwnProperty("@com.sap.vocabularies.Session.v1.StickySessionSupported");
517
443
  var sActionName;
518
-
519
444
  if (bDraftRoot) {
520
- sActionName = oEntitySet.getObject("".concat(sPath, "@com.sap.vocabularies.Common.v1.DraftRoot/EditAction"));
445
+ sActionName = oEntitySet.getObject("".concat(rootEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot/EditAction"));
446
+ } else if (bDraftNode) {
447
+ sActionName = oEntitySet.getObject("".concat(rootEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftNode/EditAction"));
521
448
  } else if (bStickySession) {
522
- sActionName = oEntitySet.getObject("".concat(sPath, "@com.sap.vocabularies.Session.v1.StickySessionSupported/EditAction"));
449
+ sActionName = oEntitySet.getObject("".concat(rootEntitySetPath, "@com.sap.vocabularies.Session.v1.StickySessionSupported/EditAction"));
523
450
  }
524
-
525
- return !sActionName ? sActionName : "".concat(sPath, "/").concat(sActionName);
451
+ return !sActionName ? sActionName : "".concat(rootEntitySetPath, "/").concat(sActionName);
526
452
  };
527
-
528
453
  _exports.getEditAction = getEditAction;
529
-
530
454
  var isReadOnlyFromStaticAnnotations = function (oAnnotations, oFieldControl) {
531
455
  var bComputed, bImmutable, bReadOnly;
532
-
533
456
  if (oAnnotations && oAnnotations["@Org.OData.Core.V1.Computed"]) {
534
457
  bComputed = oAnnotations["@Org.OData.Core.V1.Computed"].Bool ? oAnnotations["@Org.OData.Core.V1.Computed"].Bool == "true" : true;
535
458
  }
536
-
537
459
  if (oAnnotations && oAnnotations["@Org.OData.Core.V1.Immutable"]) {
538
460
  bImmutable = oAnnotations["@Org.OData.Core.V1.Immutable"].Bool ? oAnnotations["@Org.OData.Core.V1.Immutable"].Bool == "true" : true;
539
461
  }
540
-
541
462
  bReadOnly = bComputed || bImmutable;
542
-
543
463
  if (oFieldControl) {
544
464
  bReadOnly = bReadOnly || oFieldControl == "com.sap.vocabularies.Common.v1.FieldControlType/ReadOnly";
545
465
  }
546
-
547
466
  if (bReadOnly) {
548
467
  return true;
549
468
  } else {
550
469
  return false;
551
470
  }
552
471
  };
553
-
554
472
  _exports.isReadOnlyFromStaticAnnotations = isReadOnlyFromStaticAnnotations;
555
-
556
473
  var readOnlyExpressionFromDynamicAnnotations = function (oFieldControl) {
557
474
  var sIsFieldControlPathReadOnly;
558
-
559
475
  if (oFieldControl) {
560
476
  if (ManagedObject.bindingParser(oFieldControl)) {
561
477
  sIsFieldControlPathReadOnly = "%" + oFieldControl + " === 1 ";
562
478
  }
563
479
  }
564
-
565
480
  if (sIsFieldControlPathReadOnly) {
566
481
  return "{= " + sIsFieldControlPathReadOnly + "? false : true }";
567
482
  } else {
568
483
  return undefined;
569
484
  }
570
485
  };
486
+
571
487
  /*
572
488
  * Function to get the expression for chart Title Press
573
489
  *
@@ -579,10 +495,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
579
495
  * returns {String} [Expression] Handler Expression for the title press
580
496
  *
581
497
  */
582
-
583
-
584
498
  _exports.readOnlyExpressionFromDynamicAnnotations = readOnlyExpressionFromDynamicAnnotations;
585
-
586
499
  var getExpressionForMicroChartTitlePress = function (oConfiguration, oManifestOutbound, sCollectionName) {
587
500
  if (oConfiguration) {
588
501
  if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"] || oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"] && oConfiguration["targetSections"]) {
@@ -594,6 +507,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
594
507
  }
595
508
  }
596
509
  };
510
+
597
511
  /*
598
512
  * Function to render Chart Title as Link
599
513
  *
@@ -602,10 +516,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
602
516
  * returns {String} [sKey] For the TargetOutbound and TargetSection
603
517
  *
604
518
  */
605
-
606
-
607
519
  _exports.getExpressionForMicroChartTitlePress = getExpressionForMicroChartTitlePress;
608
-
609
520
  var getMicroChartTitleAsLink = function (oControlConfiguration) {
610
521
  if (oControlConfiguration && (oControlConfiguration["targetOutbound"] || oControlConfiguration["targetOutbound"] && oControlConfiguration["targetSections"])) {
611
522
  return "External";
@@ -615,6 +526,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
615
526
  return "None";
616
527
  }
617
528
  };
529
+
618
530
  /* Get groupId from control configuration
619
531
  *
620
532
  * @function
@@ -623,23 +535,19 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
623
535
  * @description Used to get the groupId for DataPoints and MicroCharts in the Header.
624
536
  *
625
537
  */
626
-
627
-
628
538
  _exports.getMicroChartTitleAsLink = getMicroChartTitleAsLink;
629
-
630
539
  var getGroupIdFromConfig = function (oConfigurations, sAnnotationPath, sDefaultGroupId) {
631
540
  var oConfiguration = oConfigurations[sAnnotationPath],
632
- aAutoPatterns = ["Heroes", "Decoration", "Workers", "LongRunners"];
541
+ aAutoPatterns = ["Heroes", "Decoration", "Workers", "LongRunners"];
633
542
  var sGroupId = sDefaultGroupId;
634
-
635
543
  if (oConfiguration && oConfiguration.requestGroupId && aAutoPatterns.some(function (autoPattern) {
636
544
  return autoPattern === oConfiguration.requestGroupId;
637
545
  })) {
638
546
  sGroupId = "$auto." + oConfiguration.requestGroupId;
639
547
  }
640
-
641
548
  return sGroupId;
642
549
  };
550
+
643
551
  /*
644
552
  * Get Context Binding with groupId from control configuration
645
553
  *
@@ -649,33 +557,27 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
649
557
  * @description Used to get the binding for DataPoints in the Header.
650
558
  *
651
559
  */
652
-
653
-
654
560
  _exports.getGroupIdFromConfig = getGroupIdFromConfig;
655
-
656
561
  var getBindingWithGroupIdFromConfig = function (oConfigurations, sKey) {
657
562
  var sGroupId = getGroupIdFromConfig(oConfigurations, sKey);
658
563
  var sBinding;
659
-
660
564
  if (sGroupId) {
661
565
  sBinding = "{ path : '', parameters : { $$groupId : '" + sGroupId + "' } }";
662
566
  }
663
-
664
567
  return sBinding;
665
568
  };
569
+
666
570
  /**
667
571
  * Method to check whether a FieldGroup consists of only 1 DataField with MultiLine Text annotation.
668
572
  *
669
573
  * @param aFormElements A collection of form elements used in the current field group
670
574
  * @returns Returns true if only 1 data field with Multiline Text annotation exists.
671
575
  */
672
-
673
-
674
576
  _exports.getBindingWithGroupIdFromConfig = getBindingWithGroupIdFromConfig;
675
-
676
577
  var doesFieldGroupContainOnlyOneMultiLineDataField = function (aFormElements) {
677
578
  return aFormElements && aFormElements.length === 1 && !!aFormElements[0].isValueMultilineText;
678
579
  };
580
+
679
581
  /*
680
582
  * Get Visiblity of breadcrumbs.
681
583
  *
@@ -683,25 +585,19 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
683
585
  * @param {Object} [oViewData] ViewData model
684
586
  * returns {*} Expression or boolean
685
587
  */
686
-
687
-
688
588
  _exports.doesFieldGroupContainOnlyOneMultiLineDataField = doesFieldGroupContainOnlyOneMultiLineDataField;
689
-
690
589
  var getVisibleExpressionForBreadcrumbs = function (oViewData) {
691
590
  return oViewData.showBreadCrumbs && oViewData.fclEnabled !== undefined ? "{fclhelper>/breadCrumbIsVisible}" : oViewData.showBreadCrumbs;
692
591
  };
693
-
694
592
  _exports.getVisibleExpressionForBreadcrumbs = getVisibleExpressionForBreadcrumbs;
695
-
696
593
  var getShareButtonVisibility = function (viewData) {
697
594
  var sShareButtonVisibilityExp = "!${ui>createMode}";
698
-
699
595
  if (viewData.fclEnabled) {
700
596
  sShareButtonVisibilityExp = "${fclhelper>/showShareIcon} && " + sShareButtonVisibilityExp;
701
597
  }
702
-
703
598
  return "{= " + sShareButtonVisibilityExp + " }";
704
599
  };
600
+
705
601
  /*
706
602
  * Gets the visibility of the header info in edit mode
707
603
  *
@@ -713,35 +609,32 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
713
609
  * @param {object} [oFieldControl] field control
714
610
  * returns {*} binding expression or boolean value resolved form funcitons isReadOnlyFromStaticAnnotations and isReadOnlyFromDynamicAnnotations
715
611
  */
716
-
717
-
718
612
  _exports.getShareButtonVisibility = getShareButtonVisibility;
719
-
720
613
  var getVisiblityOfHeaderInfo = function (oTitleAnnotations, oDescriptionAnnotations, oFieldTitleFieldControl, oFieldDescriptionFieldControl) {
721
614
  // Check Annotations for Title Field
722
615
  // Set to true and don't take into account, if there are no annotations, i.e. no title exists
723
616
  var bIsTitleReadOnly = oTitleAnnotations ? isReadOnlyFromStaticAnnotations(oTitleAnnotations, oFieldTitleFieldControl) : true;
724
- var titleExpression = readOnlyExpressionFromDynamicAnnotations(oFieldTitleFieldControl); // There is no expression and the title is not ready only, this is sufficient for an editable header
725
-
617
+ var titleExpression = readOnlyExpressionFromDynamicAnnotations(oFieldTitleFieldControl);
618
+ // There is no expression and the title is not ready only, this is sufficient for an editable header
726
619
  if (!bIsTitleReadOnly && !titleExpression) {
727
620
  return true;
728
- } // Check Annotations for Description Field
729
- // Set to true and don't take into account, if there are no annotations, i.e. no description exists
730
-
621
+ }
731
622
 
623
+ // Check Annotations for Description Field
624
+ // Set to true and don't take into account, if there are no annotations, i.e. no description exists
732
625
  var bIsDescriptionReadOnly = oDescriptionAnnotations ? isReadOnlyFromStaticAnnotations(oDescriptionAnnotations, oFieldDescriptionFieldControl) : true;
733
- var descriptionExpression = readOnlyExpressionFromDynamicAnnotations(oFieldDescriptionFieldControl); // There is no expression and the description is not ready only, this is sufficient for an editable header
734
-
626
+ var descriptionExpression = readOnlyExpressionFromDynamicAnnotations(oFieldDescriptionFieldControl);
627
+ // There is no expression and the description is not ready only, this is sufficient for an editable header
735
628
  if (!bIsDescriptionReadOnly && !descriptionExpression) {
736
629
  return true;
737
- } // Both title and description are not editable and there are no dynamic annotations
738
-
630
+ }
739
631
 
632
+ // Both title and description are not editable and there are no dynamic annotations
740
633
  if (bIsTitleReadOnly && bIsDescriptionReadOnly && !titleExpression && !descriptionExpression) {
741
634
  return false;
742
- } // Now combine expressions
743
-
635
+ }
744
636
 
637
+ // Now combine expressions
745
638
  if (titleExpression && !descriptionExpression) {
746
639
  return titleExpression;
747
640
  } else if (!titleExpression && descriptionExpression) {
@@ -750,14 +643,13 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
750
643
  return combineTitleAndDescriptionExpression(oFieldTitleFieldControl, oFieldDescriptionFieldControl);
751
644
  }
752
645
  };
753
-
754
646
  _exports.getVisiblityOfHeaderInfo = getVisiblityOfHeaderInfo;
755
-
756
647
  var combineTitleAndDescriptionExpression = function (oTitleFieldControl, oDescriptionFieldControl) {
757
648
  // If both header and title field are based on dynmaic field control, the editable header
758
649
  // is visible if at least one of these is not ready only
759
650
  return "{= %" + oTitleFieldControl + " === 1 ? ( %" + oDescriptionFieldControl + " === 1 ? false : true ) : true }";
760
651
  };
652
+
761
653
  /*
762
654
  * Get Expression of press event of delete button.
763
655
  *
@@ -765,14 +657,11 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
765
657
  * @param {string} [sEntitySetName] Entity set name
766
658
  * returns {string} binding expression / function string generated from commanhelper's function generateFunction
767
659
  */
768
-
769
-
770
660
  _exports.combineTitleAndDescriptionExpression = combineTitleAndDescriptionExpression;
771
-
772
661
  var getPressExpressionForDelete = function (sEntitySetName) {
773
662
  var sDeletableContexts = "${$view>/getBindingContext}",
774
- sTitle = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedHeading/getItems/1/getText}",
775
- sDescription = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedContent/0/getItems/0/getText}";
663
+ sTitle = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedHeading/getItems/1/getText}",
664
+ sDescription = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedContent/0/getItems/0/getText}";
776
665
  var oParams = {
777
666
  title: sTitle,
778
667
  entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
@@ -780,6 +669,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
780
669
  };
781
670
  return CommonHelper.generateFunction(".editFlow.deleteDocument", sDeletableContexts, CommonHelper.objectToString(oParams));
782
671
  };
672
+
783
673
  /*
784
674
  * Get Expression of press event of Edit button.
785
675
  *
@@ -789,14 +679,11 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
789
679
  * @param {object} [oHeaderAction] Header action object
790
680
  * returns {string} binding expression / function string generated from commanhelper's function generateFunction
791
681
  */
792
-
793
-
794
682
  _exports.getPressExpressionForDelete = getPressExpressionForDelete;
795
-
796
683
  var getPressExpressionForEdit = function (oDataField, sEntitySetName, oHeaderAction) {
797
684
  var sEditableContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
798
- sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
799
- sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
685
+ sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
686
+ sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
800
687
  var oParams = {
801
688
  contexts: "${$view>/getBindingContext}",
802
689
  entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
@@ -808,6 +695,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
808
695
  };
809
696
  return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sEditableContexts, CommonHelper.objectToString(oParams));
810
697
  };
698
+
811
699
  /*
812
700
  * Method to get the expression for the 'press' event for footer annotation actions
813
701
  *
@@ -817,14 +705,11 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
817
705
  * @param {object} [oHeaderAction] Header action object
818
706
  * returns {string} Binding expression or function string that is generated from the Commonhelper's function generateFunction
819
707
  */
820
-
821
-
822
708
  _exports.getPressExpressionForEdit = getPressExpressionForEdit;
823
-
824
709
  var getPressExpressionForFooterAnnotationAction = function (oDataField, sEntitySetName, oHeaderAction) {
825
710
  var sActionContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
826
- sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
827
- sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
711
+ sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
712
+ sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
828
713
  var oParams = {
829
714
  contexts: "${$view>/#fe::ObjectPage/}.getBindingContext()",
830
715
  entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
@@ -836,6 +721,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
836
721
  };
837
722
  return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sActionContexts, CommonHelper.objectToString(oParams));
838
723
  };
724
+
839
725
  /*
840
726
  * Get Expression of execute event expression of primary action.
841
727
  *
@@ -849,14 +735,11 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
849
735
  * @param {CompiledBindingToolkitExpression | string} The enablement of Edit button
850
736
  * returns {string} binding expression / function string generated from commanhelper's function generateFunction
851
737
  */
852
-
853
-
854
738
  _exports.getPressExpressionForFooterAnnotationAction = getPressExpressionForFooterAnnotationAction;
855
-
856
739
  var getPressExpressionForPrimaryAction = function (oDataField, sEntitySetName, oHeaderAction, positiveActionVisible, positiveActionEnabled, editActionVisible, editActionEnabled) {
857
740
  var sActionContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
858
- sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
859
- sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
741
+ sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
742
+ sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
860
743
  var oParams = {
861
744
  contexts: "${$view>/#fe::ObjectPage/}.getBindingContext()",
862
745
  entitySetName: sEntitySetName ? CommonHelper.addSingleQuotes(sEntitySetName) : "",
@@ -874,6 +757,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
874
757
  };
875
758
  return CommonHelper.generateFunction(".handlers.onPrimaryAction", "$controller", "${$view>/}", "${$view>/getBindingContext}", sActionContexts, CommonHelper.objectToString(oParams), CommonHelper.objectToString(oConditions));
876
759
  };
760
+
877
761
  /*
878
762
  * Gets the binding of the container HBox for the header facet.
879
763
  *
@@ -882,15 +766,13 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
882
766
  * @param {object} [oHeaderFacet] The object of the header facet
883
767
  * returns {*} The binding expression from function getBindingWithGroupIdFromConfig or undefined.
884
768
  */
885
-
886
-
887
769
  _exports.getPressExpressionForPrimaryAction = getPressExpressionForPrimaryAction;
888
-
889
770
  var getStashableHBoxBinding = function (oControlConfiguration, oHeaderFacet) {
890
771
  if (oHeaderFacet && oHeaderFacet.Facet && oHeaderFacet.Facet.targetAnnotationType === "DataPoint") {
891
772
  return getBindingWithGroupIdFromConfig(oControlConfiguration, oHeaderFacet.Facet.targetAnnotationValue);
892
773
  }
893
774
  };
775
+
894
776
  /*
895
777
  * Gets the 'Press' event expression for the external and internal data point link.
896
778
  *
@@ -899,10 +781,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
899
781
  * @param {object} [oManifestOutbound] Outbounds from manifest
900
782
  * returns {string} The runtime binding of the 'Press' event
901
783
  */
902
-
903
-
904
784
  _exports.getStashableHBoxBinding = getStashableHBoxBinding;
905
-
906
785
  var getPressExpressionForLink = function (oConfiguration, oManifestOutbound) {
907
786
  if (oConfiguration) {
908
787
  if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"]) {
@@ -914,20 +793,62 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/Bindin
914
793
  }
915
794
  }
916
795
  };
917
-
918
796
  _exports.getPressExpressionForLink = getPressExpressionForLink;
919
-
920
797
  var getHeaderFormHboxRenderType = function (dataField) {
921
798
  var _dataField$targetObje;
922
-
923
799
  if ((dataField === null || dataField === void 0 ? void 0 : (_dataField$targetObje = dataField.targetObject) === null || _dataField$targetObje === void 0 ? void 0 : _dataField$targetObje.$Type) === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") {
924
800
  return undefined;
925
801
  }
926
-
927
802
  return "Bare";
928
803
  };
929
804
 
805
+ /**
806
+ * The default action group handler that is invoked when adding the menu button handling appropriately.
807
+ *
808
+ * @param oCtx The current context in which the handler is called
809
+ * @param oAction The current action context
810
+ * @param oDataFieldForDefaultAction The current dataField for the default action
811
+ * @param defaultActionContextOrEntitySet The current context for the default action
812
+ * @returns The appropriate expression string
813
+ */
930
814
  _exports.getHeaderFormHboxRenderType = getHeaderFormHboxRenderType;
815
+ function getDefaultActionHandler(oCtx, oAction, oDataFieldForDefaultAction, defaultActionContextOrEntitySet) {
816
+ if (oAction.defaultAction) {
817
+ try {
818
+ switch (oAction.defaultAction.type) {
819
+ case "ForAction":
820
+ {
821
+ return getPressExpressionForEdit(oDataFieldForDefaultAction, defaultActionContextOrEntitySet, oAction.defaultAction);
822
+ }
823
+ case "ForNavigation":
824
+ {
825
+ if (oAction.defaultAction.command) {
826
+ return "cmd:" + oAction.defaultAction.command;
827
+ } else {
828
+ return oAction.defaultAction.press;
829
+ }
830
+ }
831
+ default:
832
+ {
833
+ if (oAction.defaultAction.command) {
834
+ return "cmd:" + oAction.defaultAction.command;
835
+ }
836
+ if (oAction.defaultAction.noWrap) {
837
+ return oAction.defaultAction.press;
838
+ } else {
839
+ return CommonHelper.buildActionWrapper(oAction.defaultAction, {
840
+ id: "forTheObjectPage"
841
+ });
842
+ }
843
+ }
844
+ }
845
+ } catch (ioEx) {
846
+ return "binding for the default action is not working as expected";
847
+ }
848
+ }
849
+ return undefined;
850
+ }
851
+ _exports.getDefaultActionHandler = getDefaultActionHandler;
931
852
  return _exports;
932
853
  }, false);
933
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwibUxpYnJhcnkiLCJnZXRFeHByZXNzaW9uRm9yVGl0bGUiLCJvSGVhZGVySW5mbyIsIm9WaWV3RGF0YSIsImZ1bGxDb250ZXh0UGF0aCIsIm9EcmFmdFJvb3QiLCJ0aXRsZU5vSGVhZGVySW5mbyIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJyZXNvdXJjZUJ1bmRsZSIsInVuZGVmaW5lZCIsImVudGl0eVNldCIsInRpdGxlV2l0aEhlYWRlckluZm8iLCJvRW1wdHlIZWFkZXJJbmZvVGl0bGUiLCJUaXRsZSIsIlZhbHVlIiwidGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8iLCJ0aXRsZVZhbHVlRXhwcmVzc2lvbiIsImNvbm5lY3RlZEZpZWxkc1BhdGgiLCJ0aXRsZUlzRW1wdHkiLCJjb25zdGFudCIsInRpdGxlQm9vbGVhbkV4cHJlc3Npb24iLCIkVHlwZSIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIiR0YXJnZXQiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJVSSIsIlRleHRBcnJhbmdlbWVudCIsImFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24iLCJmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5IiwiX3R5cGUiLCJ2YWx1ZSIsImlzRW1wdHkiLCJUYXJnZXQiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsImdldExhYmVsRm9yQ29ubmVjdGVkRmllbGRzIiwiY3JlYXRlTW9kZVRpdGxlIiwiVHlwZU5hbWUiLCJjb25jYXQiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRvU3RyaW5nIiwiYWN0aXZlRXhwcmVzc2lvbiIsIkVudGl0eSIsIklzQWN0aXZlIiwiY29tcGlsZUV4cHJlc3Npb24iLCJpZkVsc2UiLCJhbmQiLCJvciIsIklzQ3JlYXRlTW9kZVN0aWNreSIsIklzQ3JlYXRlTW9kZSIsImdldEV4cHJlc3Npb25Gb3JEZXNjcmlwdGlvbiIsInBhdGhJbk1vZGVsIiwiRGVzY3JpcHRpb24iLCJnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiIsInNhdmVCdXR0b25UZXh0IiwiY3JlYXRlQnV0dG9uVGV4dCIsInNhdmVFeHByZXNzaW9uIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIkRyYWZ0IiwiSXNOZXdPYmplY3QiLCJnZXRGb290ZXJWaXNpYmxlIiwiZm9vdGVyQWN0aW9ucyIsImRhdGFGaWVsZHMiLCJtYW5pZmVzdEFjdGlvbnMiLCJmaWx0ZXIiLCJhY3Rpb24iLCJpc01hbmlmZXN0QWN0aW9uIiwiY3VzdG9tQWN0aW9uVmlzaWJpbGl0eSIsImxlbmd0aCIsImN1c3RvbUFjdGlvbkluZGl2aWR1YWxWaXNpYmlsaXR5IiwibWFwIiwidmlzaWJsZSIsImFubm90YXRpb25BY3Rpb25WaXNpYmlsaXR5IiwiZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5IiwiYURhdGFGaWVsZHMiLCJiQ29uc2lkZXJFZGl0YWJsZSIsInNIaWRkZW5FeHByZXNzaW9uIiwic1NlbWlIaWRkZW5FeHByZXNzaW9uIiwiYUhpZGRlbkFjdGlvblBhdGgiLCJpIiwib0RhdGFGaWVsZCIsIkRldGVybWluaW5nIiwiaGlkZGVuRXhwcmVzc2lvbiIsIiRQYXRoIiwiaW5kZXhPZiIsInB1c2giLCJpbmRleCIsIm9BY3Rpb24iLCJhQWN0aW9ucyIsInR5cGUiLCJidWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uIiwiYUlkZW50aWZpY2F0aW9uIiwiRW1waGFzaXplZCIsInNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiIsImJJc0Fsd2F5c0RlZmF1bHQiLCJzSGlkZGVuU2ltcGxlUGF0aCIsImZvckVhY2giLCJvQ3JpdGljYWxpdHlQcm9wZXJ0eSIsIkNyaXRpY2FsaXR5Iiwib0RhdGFGaWVsZEhpZGRlbiIsIiRFbnVtTWVtYmVyIiwiRGVmYXVsdCIsInNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24iLCJnZXRFbGVtZW50QmluZGluZyIsInNQYXRoIiwic05hdmlnYXRpb25QYXRoIiwiT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIiLCJnZXROYXZpZ2F0aW9uUGF0aCIsImNoZWNrRHJhZnRTdGF0ZSIsIm9Bbm5vdGF0aW9ucyIsImdldFN3aXRjaFRvQWN0aXZlVmlzaWJpbGl0eSIsImdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5IiwiZ2V0U3dpdGNoRHJhZnRBbmRBY3RpdmVWaXNpYmlsaXR5IiwiX2ZpbmRBY3Rpb24iLCJhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMiLCJzQWN0aW9uVHlwZSIsImZpbmQiLCJvSGVhZGVyQWN0aW9uIiwiZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJvRGVsZXRlQWN0aW9uIiwiZW5hYmxlZCIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwiZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwib0VkaXRBY3Rpb24iLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJnZXRFZGl0QWN0aW9uIiwib0VudGl0eVNldCIsImdldFBhdGgiLCJnZXRPYmplY3QiLCJiRHJhZnRSb290IiwiaGFzT3duUHJvcGVydHkiLCJiU3RpY2t5U2Vzc2lvbiIsInNBY3Rpb25OYW1lIiwiaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyIsIm9GaWVsZENvbnRyb2wiLCJiQ29tcHV0ZWQiLCJiSW1tdXRhYmxlIiwiYlJlYWRPbmx5IiwiQm9vbCIsInJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMiLCJzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkiLCJNYW5hZ2VkT2JqZWN0IiwiYmluZGluZ1BhcnNlciIsImdldEV4cHJlc3Npb25Gb3JNaWNyb0NoYXJ0VGl0bGVQcmVzcyIsIm9Db25maWd1cmF0aW9uIiwib01hbmlmZXN0T3V0Ym91bmQiLCJzQ29sbGVjdGlvbk5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0TWljcm9DaGFydFRpdGxlQXNMaW5rIiwib0NvbnRyb2xDb25maWd1cmF0aW9uIiwiZ2V0R3JvdXBJZEZyb21Db25maWciLCJvQ29uZmlndXJhdGlvbnMiLCJzQW5ub3RhdGlvblBhdGgiLCJzRGVmYXVsdEdyb3VwSWQiLCJhQXV0b1BhdHRlcm5zIiwic0dyb3VwSWQiLCJyZXF1ZXN0R3JvdXBJZCIsInNvbWUiLCJhdXRvUGF0dGVybiIsImdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWciLCJzS2V5Iiwic0JpbmRpbmciLCJkb2VzRmllbGRHcm91cENvbnRhaW5Pbmx5T25lTXVsdGlMaW5lRGF0YUZpZWxkIiwiYUZvcm1FbGVtZW50cyIsImlzVmFsdWVNdWx0aWxpbmVUZXh0IiwiZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyIsInNob3dCcmVhZENydW1icyIsImZjbEVuYWJsZWQiLCJnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkiLCJ2aWV3RGF0YSIsInNTaGFyZUJ1dHRvblZpc2liaWxpdHlFeHAiLCJnZXRWaXNpYmxpdHlPZkhlYWRlckluZm8iLCJvVGl0bGVBbm5vdGF0aW9ucyIsIm9EZXNjcmlwdGlvbkFubm90YXRpb25zIiwib0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wiLCJvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImJJc1RpdGxlUmVhZE9ubHkiLCJ0aXRsZUV4cHJlc3Npb24iLCJiSXNEZXNjcmlwdGlvblJlYWRPbmx5IiwiZGVzY3JpcHRpb25FeHByZXNzaW9uIiwiY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uIiwib1RpdGxlRmllbGRDb250cm9sIiwib0Rlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlIiwic0VudGl0eVNldE5hbWUiLCJzRGVsZXRhYmxlQ29udGV4dHMiLCJzVGl0bGUiLCJzRGVzY3JpcHRpb24iLCJvUGFyYW1zIiwidGl0bGUiLCJlbnRpdHlTZXROYW1lIiwiQ29tbW9uSGVscGVyIiwiYWRkU2luZ2xlUXVvdGVzIiwiZGVzY3JpcHRpb24iLCJnZW5lcmF0ZUZ1bmN0aW9uIiwib2JqZWN0VG9TdHJpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0Iiwic0VkaXRhYmxlQ29udGV4dHMiLCJBY3Rpb24iLCJzRGF0YUZpZWxkRW51bU1lbWJlciIsIkludm9jYXRpb25Hcm91cGluZyIsInNJbnZvY2F0aW9uR3JvdXAiLCJjb250ZXh0cyIsImludm9jYXRpb25Hcm91cGluZyIsIm1vZGVsIiwibGFiZWwiLCJMYWJlbCIsImlzTmF2aWdhYmxlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiIsInNBY3Rpb25Db250ZXh0cyIsImdldFByZXNzRXhwcmVzc2lvbkZvclByaW1hcnlBY3Rpb24iLCJwb3NpdGl2ZUFjdGlvblZpc2libGUiLCJwb3NpdGl2ZUFjdGlvbkVuYWJsZWQiLCJlZGl0QWN0aW9uVmlzaWJsZSIsImVkaXRBY3Rpb25FbmFibGVkIiwib0NvbmRpdGlvbnMiLCJnZXRTdGFzaGFibGVIQm94QmluZGluZyIsIm9IZWFkZXJGYWNldCIsIkZhY2V0IiwidGFyZ2V0QW5ub3RhdGlvblR5cGUiLCJ0YXJnZXRBbm5vdGF0aW9uVmFsdWUiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rIiwiZ2V0SGVhZGVyRm9ybUhib3hSZW5kZXJUeXBlIiwiZGF0YUZpZWxkIiwidGFyZ2V0T2JqZWN0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJPYmplY3RQYWdlVGVtcGxhdGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGb3JtYXR0ZXJzIGZvciB0aGUgT2JqZWN0IFBhZ2VcbmltcG9ydCB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhRmllbGQsIERhdGFGaWVsZFR5cGVzLCBIZWFkZXJJbmZvVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblRlcm1zLCBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBY3Rpb24sIENvbnZlcnRlckFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB7IERyYWZ0LCBFbnRpdHksIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0QWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uY2F0LFxuXHRjb25zdGFudCxcblx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLFxuXHRpZkVsc2UsXG5cdGlzRW1wdHksXG5cdG9yLFxuXHRyZXNvbHZlQmluZGluZ1N0cmluZ1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IHsgYWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbiwgZm9ybWF0VmFsdWVSZWN1cnNpdmVseSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHsgZ2V0TGFiZWxGb3JDb25uZWN0ZWRGaWVsZHMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9mb3JtL0Zvcm1UZW1wbGF0aW5nXCI7XG5pbXBvcnQgbUxpYnJhcnkgZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBCdXR0b25UeXBlID0gbUxpYnJhcnkuQnV0dG9uVHlwZTtcblxudHlwZSBWaWV3RGF0YSA9IHtcblx0cmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlO1xuXHRlbnRpdHlTZXQ6IHN0cmluZztcbn07XG5cbi8vYGBgbWVybWFpZFxuLy8gZ3JhcGggVERcbi8vIEFbT2JqZWN0IFBhZ2UgVGl0bGVdIC0tPnxHZXQgRGF0YUZpZWxkIFZhbHVlfCBDe0V2YWx1YXRlIENyZWF0ZSBNb2RlfVxuLy8gQyAtLT58SW4gQ3JlYXRlIE1vZGV8IER7SXMgRGF0YUZpZWxkIFZhbHVlIGVtcHR5fVxuLy8gRCAtLT58WWVzfCBGe0lzIHRoZXJlIGEgVHlwZU5hbWV9XG4vLyBGIC0tPnxZZXN8IEdbSXMgdGhlcmUgYW4gY3VzdG9tIHRpdGxlXVxuLy8gRyAtLT58WWVzfCBHMVtTaG93IHRoZSBjdXN0b20gdGl0bGUgKyAnVHlwZU5hbWUnXVxuLy8gRyAtLT58Tm98IEcyW0Rpc3BsYXkgdGhlIGRlZmF1bHQgdGl0bGUgJ05ldyArIFR5cGVOYW1lJ11cbi8vIEYgLS0+fE5vfCBIW0lzIHRoZXJlIGEgY3VzdG9tIHRpdGxlXVxuLy8gSCAtLT58WWVzfCBJW1Nob3cgdGhlIGN1c3RvbSB0aXRsZV1cbi8vIEggLS0+fE5vfCBKW1Nob3cgdGhlIGRlZmF1bHQgJ1VuYW1uZWQgT2JqZWN0J11cbi8vIEQgLS0+fE5vfCBFXG4vLyBDIC0tPnxOb3QgaW4gY3JlYXRlIG1vZGV8IEVbU2hvdyBEYXRhRmllbGQgVmFsdWVdXG4vLyBgYGBcbi8qKlxuICogQ29tcHV0ZSB0aGUgdGl0bGUgZm9yIHRoZSBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0hlYWRlckluZm8gVGhlIEBVSS5IZWFkZXJJbmZvIGFubm90YXRpb24gY29udGVudFxuICogQHBhcmFtIG9WaWV3RGF0YSBUaGUgdmlldyBkYXRhIG9iamVjdCB3ZSdyZSBjdXJyZW50bHkgb25cbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIGZ1bGwgY29udGV4dCBwYXRoIHVzZWQgdG8gcmVhY2ggdGhhdCBvYmplY3QgcGFnZVxuICogQHBhcmFtIG9EcmFmdFJvb3RcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvYmplY3QgcGFnZSB0aXRsZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvclRpdGxlID0gZnVuY3Rpb24gKFxuXHRvSGVhZGVySW5mbzogSGVhZGVySW5mb1R5cGUgfCB1bmRlZmluZWQsXG5cdG9WaWV3RGF0YTogVmlld0RhdGEsXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0b0RyYWZ0Um9vdDogT2JqZWN0IHwgdW5kZWZpbmVkXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IHRpdGxlTm9IZWFkZXJJbmZvID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX05FV19PQkpFQ1RcIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlLCB1bmRlZmluZWQsIG9WaWV3RGF0YS5lbnRpdHlTZXQpO1xuXG5cdGNvbnN0IHRpdGxlV2l0aEhlYWRlckluZm8gPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcIlRfQU5OT1RBVElPTl9IRUxQRVJfREVGQVVMVF9PQkpFQ1RfUEFHRV9IRUFERVJfVElUTEVcIixcblx0XHRvVmlld0RhdGEucmVzb3VyY2VCdW5kbGUsXG5cdFx0dW5kZWZpbmVkLFxuXHRcdG9WaWV3RGF0YS5lbnRpdHlTZXRcblx0KTtcblxuXHRjb25zdCBvRW1wdHlIZWFkZXJJbmZvVGl0bGUgPVxuXHRcdG9IZWFkZXJJbmZvPy5UaXRsZSA9PT0gdW5kZWZpbmVkIHx8IChvSGVhZGVySW5mbz8uVGl0bGUgYXMgYW55KSA9PT0gXCJcIiB8fCAob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUgPT09IFwiXCI7XG5cblx0Y29uc3QgdGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8gPSAhb0VtcHR5SGVhZGVySW5mb1RpdGxlXG5cdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfQU5OT1RBVElPTl9IRUxQRVJfREVGQVVMVF9PQkpFQ1RfUEFHRV9IRUFERVJfVElUTEVfTk9fSEVBREVSX0lORk9cIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKVxuXHRcdDogXCJcIjtcblx0bGV0IHRpdGxlVmFsdWVFeHByZXNzaW9uLFxuXHRcdGNvbm5lY3RlZEZpZWxkc1BhdGgsXG5cdFx0dGl0bGVJc0VtcHR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKSxcblx0XHR0aXRsZUJvb2xlYW5FeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gfCBib29sZWFuO1xuXHRpZiAob0hlYWRlckluZm8/LlRpdGxlPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIikge1xuXHRcdHRpdGxlVmFsdWVFeHByZXNzaW9uID0gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKChvSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZSk7XG5cdFx0aWYgKChvSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dD8uYW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpIHtcblx0XHRcdC8vIEluIGNhc2UgYW4gZXhwbGljaXQgdGV4dCBhcnJhbmdlbWVudCB3YXMgc2V0IHdlIG1ha2UgdXNlIG9mIGl0IGluIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsXG5cdFx0XHR0aXRsZVZhbHVlRXhwcmVzc2lvbiA9IGFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24odGl0bGVWYWx1ZUV4cHJlc3Npb24sIGZ1bGxDb250ZXh0UGF0aCk7XG5cdFx0fVxuXHRcdHRpdGxlVmFsdWVFeHByZXNzaW9uID0gZm9ybWF0VmFsdWVSZWN1cnNpdmVseSh0aXRsZVZhbHVlRXhwcmVzc2lvbiwgZnVsbENvbnRleHRQYXRoKTtcblx0XHR0aXRsZUlzRW1wdHkgPSB0aXRsZVZhbHVlRXhwcmVzc2lvbj8uX3R5cGUgPT09IFwiQ29uc3RhbnRcIiA/IGNvbnN0YW50KCF0aXRsZVZhbHVlRXhwcmVzc2lvbj8udmFsdWUpIDogaXNFbXB0eSh0aXRsZVZhbHVlRXhwcmVzc2lvbik7XG5cdH0gZWxzZSBpZiAoXG5cdFx0b0hlYWRlckluZm8/LlRpdGxlPy4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRvSGVhZGVySW5mbz8uVGl0bGU/LlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNvbm5lY3RlZEZpZWxkc1R5cGVcIlxuXHQpIHtcblx0XHRjb25uZWN0ZWRGaWVsZHNQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoZnVsbENvbnRleHRQYXRoLCBcIiRUeXBlL0BVSS5IZWFkZXJJbmZvL1RpdGxlL1RhcmdldC8kQW5ub3RhdGlvblBhdGhcIik7XG5cdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb24gPSBnZXRMYWJlbEZvckNvbm5lY3RlZEZpZWxkcyhjb25uZWN0ZWRGaWVsZHNQYXRoLCBmYWxzZSkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz47XG5cdFx0dGl0bGVCb29sZWFuRXhwcmVzc2lvbiA9IHRpdGxlVmFsdWVFeHByZXNzaW9uPy5fdHlwZSA9PT0gXCJDb25zdGFudFwiID8gY29uc3RhbnQoIXRpdGxlVmFsdWVFeHByZXNzaW9uPy52YWx1ZSkgOiBpc0VtcHR5KHRpdGxlVmFsdWVFeHByZXNzaW9uKTtcblx0XHR0aXRsZUlzRW1wdHkgPSB0aXRsZVZhbHVlRXhwcmVzc2lvbiA/IHRpdGxlQm9vbGVhbkV4cHJlc3Npb24gOiBjb25zdGFudCh0cnVlKTtcblx0fVxuXG5cdC8vIElmIHRoZXJlIGlzIGEgVHlwZU5hbWUgZGVmaW5lZCwgc2hvdyB0aGUgZGVmYXVsdCB0aXRsZSAnTmV3ICsgVHlwZU5hbWUnLCBvdGhlcndpc2Ugc2hvdyB0aGUgY3VzdG9tIHRpdGxlIG9yIHRoZSBkZWZhdWx0ICdOZXcgb2JqZWN0J1xuXHRjb25zdCBjcmVhdGVNb2RlVGl0bGUgPSBvSGVhZGVySW5mbz8uVHlwZU5hbWVcblx0XHQ/IGNvbmNhdCh0aXRsZVdpdGhIZWFkZXJJbmZvLCBcIjogXCIsIHJlc29sdmVCaW5kaW5nU3RyaW5nKG9IZWFkZXJJbmZvLlR5cGVOYW1lLnRvU3RyaW5nKCkpKVxuXHRcdDogdGl0bGVOb0hlYWRlckluZm87XG5cdGNvbnN0IGFjdGl2ZUV4cHJlc3Npb24gPSBvRHJhZnRSb290ID8gRW50aXR5LklzQWN0aXZlIDogdHJ1ZTtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdGlmRWxzZShcblx0XHRcdGFuZChvcihVSS5Jc0NyZWF0ZU1vZGVTdGlja3ksIFVJLklzQ3JlYXRlTW9kZSksIHRpdGxlSXNFbXB0eSksXG5cdFx0XHRjcmVhdGVNb2RlVGl0bGUsXG5cblx0XHRcdC8vIE90aGVyd2lzZSBzaG93IHRoZSBkZWZhdWx0IGV4cHJlc3Npb25cblx0XHRcdGlmRWxzZShhbmQoYWN0aXZlRXhwcmVzc2lvbiwgdGl0bGVJc0VtcHR5KSwgdGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8sIHRpdGxlVmFsdWVFeHByZXNzaW9uKVxuXHRcdClcblx0KTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBleHByZXNzaW9uIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgYW4gb2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9IZWFkZXJJbmZvIFRoZSBAVUkuSGVhZGVySW5mbyBhbm5vdGF0aW9uIGNvbnRlbnRcbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIGZ1bGwgY29udGV4dCBwYXRoIHVzZWQgdG8gcmVhY2ggdGhhdCBvYmplY3QgcGFnZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9iamVjdCBwYWdlIGRlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yRGVzY3JpcHRpb24gPSBmdW5jdGlvbiAoXG5cdG9IZWFkZXJJbmZvOiBIZWFkZXJJbmZvVHlwZSB8IHVuZGVmaW5lZCxcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGxldCBwYXRoSW5Nb2RlbCA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigob0hlYWRlckluZm8/LkRlc2NyaXB0aW9uIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpO1xuXHRpZiAoKG9IZWFkZXJJbmZvPy5EZXNjcmlwdGlvbiBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0Py5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkge1xuXHRcdC8vIEluIGNhc2UgYW4gZXhwbGljaXQgdGV4dCBhcnJhbmdlbWVudCB3YXMgc2V0IHdlIG1ha2UgdXNlIG9mIGl0IGluIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsXG5cdFx0cGF0aEluTW9kZWwgPSBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uKHBhdGhJbk1vZGVsLCBmdWxsQ29udGV4dFBhdGgpO1xuXHR9XG5cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkocGF0aEluTW9kZWwsIGZ1bGxDb250ZXh0UGF0aCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBzYXZlIGJ1dHRvbi5cbiAqXG4gKiBAcGFyYW0gb1ZpZXdEYXRhIFRoZSBjdXJyZW50IHZpZXcgZGF0YVxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgcGF0aCB1c2VkIHVwIHVudGlsIGhlcmVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdGhhdCBzaG93cyB0aGUgcmlnaHQgc2F2ZSBidXR0b24gdGV4dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvclNhdmVCdXR0b24gPSBmdW5jdGlvbiAoXG5cdG9WaWV3RGF0YTogVmlld0RhdGEsXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aFxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBzYXZlQnV0dG9uVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9TQVZFXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSk7XG5cdGNvbnN0IGNyZWF0ZUJ1dHRvblRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfT1BfT0JKRUNUX1BBR0VfQ1JFQVRFXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSk7XG5cdGxldCBzYXZlRXhwcmVzc2lvbjtcblxuXHRpZiAoKGZ1bGxDb250ZXh0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpLmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQpIHtcblx0XHQvLyBJZiB3ZSdyZSBpbiBzdGlja3kgbW9kZSBBTkQgdGhlIHVpIGlzIGluIGNyZWF0ZSBtb2RlLCBzaG93IENyZWF0ZSwgZWxzZSBzaG93IFNhdmVcblx0XHRzYXZlRXhwcmVzc2lvbiA9IGlmRWxzZShVSS5Jc0NyZWF0ZU1vZGVTdGlja3ksIGNyZWF0ZUJ1dHRvblRleHQsIHNhdmVCdXR0b25UZXh0KTtcblx0fSBlbHNlIHtcblx0XHQvLyBJZiB3ZSdyZSBpbiBkcmFmdCBBTkQgdGhlIGRyYWZ0IGlzIGEgbmV3IG9iamVjdCAoIUlzQWN0aXZlRW50aXR5ICYmICFIYXNBY3RpdmVFbnRpdHkpLCBzaG93IGNyZWF0ZSwgZWxzZSBzaG93IHNhdmVcblx0XHRzYXZlRXhwcmVzc2lvbiA9IGlmRWxzZShEcmFmdC5Jc05ld09iamVjdCwgY3JlYXRlQnV0dG9uVGV4dCwgc2F2ZUJ1dHRvblRleHQpO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihzYXZlRXhwcmVzc2lvbik7XG59O1xuXG4vKipcbiAqIE1ldGhvZCByZXR1cm5zIHdoZXRoZXIgZm9vdGVyIGlzIHZpc2libGUgb3Igbm90IG9uIG9iamVjdCAvIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgZ2V0Rm9vdGVyVmlzaWJsZVxuICogQHBhcmFtIGZvb3RlckFjdGlvbnMgVGhlIGZvb3RlciBhY3Rpb24gb2JqZWN0IGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSBkYXRhRmllbGRzIERhdGEgZmllbGQgYXJyYXkgZm9yIG5vcm1hbCBmb290ZXIgdmlzaWJpbGl0eSBwcm9jZXNzaW5nXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYW55IGFjdGlvbiBpcyB0cnVlLCBvdGhlcndpc2UgY29tcGlsZWQgQmluZGluZyBvciBgZmFsc2VgXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb290ZXJWaXNpYmxlID0gZnVuY3Rpb24gKFxuXHRmb290ZXJBY3Rpb25zOiBDb252ZXJ0ZXJBY3Rpb25bXSxcblx0ZGF0YUZpZWxkczogRGF0YUZpZWxkW11cbik6IGJvb2xlYW4gfCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGZvb3RlckFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGlzTWFuaWZlc3RBY3Rpb24oYWN0aW9uKSkgYXMgTWFuaWZlc3RBY3Rpb25bXTtcblx0bGV0IGN1c3RvbUFjdGlvblZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0aWYgKG1hbmlmZXN0QWN0aW9ucy5sZW5ndGgpIHtcblx0XHQvLyBJZiB3ZSBoYXZlIG1hbmlmZXN0IGFjdGlvbnNcblx0XHRjb25zdCBjdXN0b21BY3Rpb25JbmRpdmlkdWFsVmlzaWJpbGl0eSA9IG1hbmlmZXN0QWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuXHRcdFx0cmV0dXJuIHJlc29sdmVCaW5kaW5nU3RyaW5nPGJvb2xlYW4+KGFjdGlvbi52aXNpYmxlIGFzIHN0cmluZyB8IGJvb2xlYW4sIFwiYm9vbGVhblwiKTtcblx0XHR9KTtcblx0XHQvLyBjb25zdHJ1Y3QgdGhlIGZvb3RlcidzIHZpc2liaWxpdHktYmluZGluZyBvdXQgb2YgYWxsIGFjdGlvbnMnIHZpc2liaWxpdHktYmluZGluZ3MsIGZpcnN0IHRoZSBiaW5kaW5nIG9mIGFsbCBjdXN0b20gYWN0aW9ucyAuLi5cblx0XHRjdXN0b21BY3Rpb25WaXNpYmlsaXR5ID0gb3IoLi4uY3VzdG9tQWN0aW9uSW5kaXZpZHVhbFZpc2liaWxpdHkpO1xuXHRcdC8vIGFuZCB0aGVuIHRoZSBiaW5kaW5nIG9mIGFsbCBhbm5vdGF0aW9uIGFjdGlvbnMgaW5zaWRlIHRoZSBmb290ZXIgLi4uXG5cdFx0Y29uc3QgYW5ub3RhdGlvbkFjdGlvblZpc2liaWxpdHkgPSBnZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHkoZGF0YUZpZWxkcywgdHJ1ZSk7XG5cdFx0Ly8gZmluYWxseSwgcmV0dXJuIGV2ZXJ5dGhpbmcuXG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG9yKGN1c3RvbUFjdGlvblZpc2liaWxpdHksIHJlc29sdmVCaW5kaW5nU3RyaW5nPGJvb2xlYW4+KGFubm90YXRpb25BY3Rpb25WaXNpYmlsaXR5LCBcImJvb2xlYW5cIikpKTtcblx0fVxuXHRyZXR1cm4gZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5KGRhdGFGaWVsZHMsIHRydWUpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGZvb3RlciBpcyB2aXNpYmxlIG9yIG5vdC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZy5nZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHlcbiAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZVRlbXBsYXRpbmdcbiAqIEBwYXJhbSBhRGF0YUZpZWxkcyBBcnJheSBvZiBEYXRhRmllbGRzIGluIHRoZSBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIGJDb25zaWRlckVkaXRhYmxlIFdoZXRoZXIgdGhlIGVkaXQgbW9kZSBiaW5kaW5nIGlzIHJlcXVpcmVkIG9yIG5vdFxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbiBpZiBhbGwgdGhlIGFjdGlvbnMgYXJlIHVpLmhpZGRlbiwgdHJ1ZSBvdGhlcndpc2VcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZEJhc2VkRm9vdGVyVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIChhRGF0YUZpZWxkczogYW55W10sIGJDb25zaWRlckVkaXRhYmxlOiBib29sZWFuKSB7XG5cdGxldCBzSGlkZGVuRXhwcmVzc2lvbiA9IFwiXCI7XG5cdGxldCBzU2VtaUhpZGRlbkV4cHJlc3Npb247XG5cdGNvbnN0IGFIaWRkZW5BY3Rpb25QYXRoID0gW107XG5cblx0Zm9yIChjb25zdCBpIGluIGFEYXRhRmllbGRzKSB7XG5cdFx0Y29uc3Qgb0RhdGFGaWVsZCA9IGFEYXRhRmllbGRzW2ldO1xuXHRcdGlmIChvRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiYgb0RhdGFGaWVsZC5EZXRlcm1pbmluZyA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgaGlkZGVuRXhwcmVzc2lvbiA9IG9EYXRhRmllbGRbYEAke1VJQW5ub3RhdGlvblRlcm1zLkhpZGRlbn1gXTtcblx0XHRcdGlmICghaGlkZGVuRXhwcmVzc2lvbikge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaGlkZGVuRXhwcmVzc2lvbi4kUGF0aCkge1xuXHRcdFx0XHRpZiAoYUhpZGRlbkFjdGlvblBhdGguaW5kZXhPZihoaWRkZW5FeHByZXNzaW9uLiRQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhSGlkZGVuQWN0aW9uUGF0aC5wdXNoKGhpZGRlbkV4cHJlc3Npb24uJFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFIaWRkZW5BY3Rpb25QYXRoLmxlbmd0aCkge1xuXHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhSGlkZGVuQWN0aW9uUGF0aC5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGlmIChhSGlkZGVuQWN0aW9uUGF0aFtpbmRleF0pIHtcblx0XHRcdFx0c1NlbWlIaWRkZW5FeHByZXNzaW9uID0gXCIoJXtcIiArIGFIaWRkZW5BY3Rpb25QYXRoW2luZGV4XSArIFwifSA9PT0gdHJ1ZSA/IGZhbHNlIDogdHJ1ZSApXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5kZXggPT0gYUhpZGRlbkFjdGlvblBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uICsgc1NlbWlIaWRkZW5FeHByZXNzaW9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIHNTZW1pSGlkZGVuRXhwcmVzc2lvbiArIFwifHxcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdFwiez0gXCIgK1xuXHRcdFx0KGJDb25zaWRlckVkaXRhYmxlID8gXCIoXCIgOiBcIlwiKSArXG5cdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiArXG5cdFx0XHQoYkNvbnNpZGVyRWRpdGFibGUgPyBcIiB8fCAke3VpPi9pc0VkaXRhYmxlfSkgXCIgOiBcIiBcIikgK1xuXHRcdFx0XCImJiAke2ludGVybmFsPmlzQ3JlYXRlRGlhbG9nT3Blbn0gIT09IHRydWV9XCJcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIns9IFwiICsgKGJDb25zaWRlckVkaXRhYmxlID8gXCIke3VpPi9pc0VkaXRhYmxlfSAmJiBcIiA6IFwiXCIpICsgXCIke2ludGVybmFsPmlzQ3JlYXRlRGlhbG9nT3Blbn0gIT09IHRydWV9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogTWV0aG9kIHJldHVybnMgV2hldGhlciB0aGUgYWN0aW9uIHR5cGUgaXMgbWFuaWZlc3Qgb3Igbm90LlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgaXNNYW5pZmVzdEFjdGlvblZpc2libGVcbiAqIEBwYXJhbSBvQWN0aW9uIFRoZSBhY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aW9uIGlzIGNvbWluZyBmcm9tIG1hbmlmZXN0LCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgaXNNYW5pZmVzdEFjdGlvbiA9IGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0Y29uc3QgYUFjdGlvbnMgPSBbXG5cdFx0XCJQcmltYXJ5XCIsXG5cdFx0XCJEZWZhdWx0QXBwbHlcIixcblx0XHRcIlNlY29uZGFyeVwiLFxuXHRcdFwiRm9yQWN0aW9uXCIsXG5cdFx0XCJGb3JOYXZpZ2F0aW9uXCIsXG5cdFx0XCJTd2l0Y2hUb0FjdGl2ZU9iamVjdFwiLFxuXHRcdFwiU3dpdGNoVG9EcmFmdE9iamVjdFwiLFxuXHRcdFwiRHJhZnRBY3Rpb25zXCJcblx0XTtcblx0cmV0dXJuIGFBY3Rpb25zLmluZGV4T2Yob0FjdGlvbi50eXBlKSA8IDA7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgRW1waGFzaXplZCAgYnV0dG9uIHR5cGUgYmFzZWQgb24gQ3JpdGljYWxpdHkgYWNyb3NzIGFsbCBhY3Rpb25zXG4gKiBJZiBjcml0aWNhbCBhY3Rpb24gaXMgcmVuZGVyZWQsIGl0cyBjb25zaWRlcmVkIHRvIGJlIHRoZSBwcmltYXJ5IGFjdGlvbi4gSGVuY2UgdGVtcGxhdGUncyBkZWZhdWx0IHByaW1hcnkgYWN0aW9uIGlzIHNldCBiYWNrIHRvIERlZmF1bHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZVRlbXBsYXRpbmcuYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvblxuICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZ1xuICogQHBhcmFtIGFJZGVudGlmaWNhdGlvbiBBcnJheSBvZiBhbGwgdGhlIERhdGFGaWVsZHMgaW4gSWRlbnRpZmljYXRpb25cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gdG8gZGVkdWNlIGlmIGJ1dHRvbiB0eXBlIGlzIERlZmF1bHQgb3IgRW1waGFzaXplZFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5leHBvcnQgY29uc3QgYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChhSWRlbnRpZmljYXRpb24/OiBhbnlbXSkge1xuXHRpZiAoIWFJZGVudGlmaWNhdGlvbikge1xuXHRcdHJldHVybiBCdXR0b25UeXBlLkVtcGhhc2l6ZWQ7XG5cdH1cblx0bGV0IHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRsZXQgYklzQWx3YXlzRGVmYXVsdDogYm9vbGVhbixcblx0XHRzSGlkZGVuU2ltcGxlUGF0aCxcblx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IFwiXCI7XG5cdGFJZGVudGlmaWNhdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnkpIHtcblx0XHRjb25zdCBvQ3JpdGljYWxpdHlQcm9wZXJ0eSA9IG9EYXRhRmllbGQuQ3JpdGljYWxpdHk7XG5cdFx0Y29uc3Qgb0RhdGFGaWVsZEhpZGRlbiA9IG9EYXRhRmllbGRbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdO1xuXHRcdGlmIChvRGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiICYmICFiSXNBbHdheXNEZWZhdWx0ICYmIG9Dcml0aWNhbGl0eVByb3BlcnR5KSB7XG5cdFx0XHRpZiAoIXNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiAmJiBvRGF0YUZpZWxkSGlkZGVuID09PSB0cnVlKSB7XG5cdFx0XHRcdC8vIGlmIERhdGFGaWVsZCBpcyBzZXQgdG8gaGlkZGVuLCB3ZSBjYW4gc2tpcCBvdGhlciBjaGVja3MgYW5kIHJldHVybiBEZWZhdWx0IGJ1dHRvbiB0eXBlXG5cdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhRmllbGRIaWRkZW4gJiYgb0RhdGFGaWVsZEhpZGRlbi4kUGF0aCkge1xuXHRcdFx0XHQvLyB3aGVuIHZpc2liaWxpdHkgb2YgY3JpdGljYWwgYnV0dG9uIGlzIGJhc2VkIG9uIHBhdGgsIGNvbGxlY3QgYWxsIHBhdGhzIGZvciBleHByZXNzaW9uXG5cdFx0XHRcdHNIaWRkZW5TaW1wbGVQYXRoID0gb0RhdGFGaWVsZEhpZGRlbi4kUGF0aDtcblx0XHRcdFx0aWYgKHNIaWRkZW5FeHByZXNzaW9uKSB7XG5cdFx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIFwiICYmIFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gKyBcIiV7XCIgKyBzSGlkZGVuU2ltcGxlUGF0aCArIFwifSA9PT0gdHJ1ZVwiO1xuXHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPSBcIns9IChcIiArIHNIaWRkZW5FeHByZXNzaW9uICsgXCIpID8gJ0VtcGhhc2l6ZWQnIDogJ0RlZmF1bHQnIH1cIjtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAob0NyaXRpY2FsaXR5UHJvcGVydHkuJEVudW1NZW1iZXIpIHtcblx0XHRcdFx0Ly8gc3VwcG9ydGVkIGNyaXRpY2FsaXR5IGFyZSBbUG9zaXRpdmUvMy8nMyddIGFuZCBbTmVnYXRpdmUvMS8nMSddXG5cdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUvTmVnYXRpdmVcIjpcblx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZVwiOlxuXHRcdFx0XHRjYXNlIFwiMVwiOlxuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdGNhc2UgXCIzXCI6XG5cdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRpZiAoIW9EYXRhRmllbGRIaWRkZW4pIHtcblx0XHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRGVmYXVsdDtcblx0XHRcdFx0XHRcdGJJc0Fsd2F5c0RlZmF1bHQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPSBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5EZWZhdWx0O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0XHRcdH1cblx0XHRcdGlmIChvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCkge1xuXHRcdFx0XHQvLyB3aGVuIENyaXRpY2FsaXR5IGlzIHNldCB1c2luZyBhIHBhdGgsIHVzZSB0aGUgcGF0aCBmb3IgZGVkdWNpbmcgdGhlIEVtcGhzaXplZCB0eXBlIGZvciBkZWZhdWx0IFByaW1hcnkgQWN0aW9uXG5cdFx0XHRcdGNvbnN0IHNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiA/IFwiIShcIiArIHNIaWRkZW5FeHByZXNzaW9uICsgXCIpICYmIFwiIDogXCJcIjtcblx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID1cblx0XHRcdFx0XHRcIns9IFwiICtcblx0XHRcdFx0XHRzQ29tYmluZWRIaWRkZW5FeHByZXNzaW9uICtcblx0XHRcdFx0XHRcIigoJHtcIiArXG5cdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9OZWdhdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnMScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAxKSBcIiArXG5cdFx0XHRcdFx0XCJ8fCAoJHtcIiArXG5cdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnMycpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAzKSkgPyBcIiArXG5cdFx0XHRcdFx0XCInRGVmYXVsdCdcIiArXG5cdFx0XHRcdFx0XCIgOiBcIiArXG5cdFx0XHRcdFx0XCInRW1waGFzaXplZCdcIiArXG5cdFx0XHRcdFx0XCIgfVwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRCaW5kaW5nID0gZnVuY3Rpb24gKHNQYXRoOiBhbnkpIHtcblx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgoc1BhdGgpO1xuXHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIFwie3BhdGg6J1wiICsgc05hdmlnYXRpb25QYXRoICsgXCInfVwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRyZXR1cm4gXCJ7cGF0aDogJyd9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgZHJhZnQgcGF0dGVybiBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMgUmV0dXJucyB0aGUgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgY2hlY2tEcmFmdFN0YXRlID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KSB7XG5cdGlmIChcblx0XHRvQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiXSAmJlxuXHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdW1wiRWRpdEFjdGlvblwiXVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IHRoZSB2aXNpYmlsaXR5IGZvciB0aGUgU3dpdGNoVG9BY3RpdmUgYnV0dG9uIGluIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIHRoZSBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0U3dpdGNoVG9BY3RpdmVWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0aWYgKGNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICR7dWk+L2lzRWRpdGFibGV9ICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0RyYWZ0IGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0aWYgKGNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICEoJHt1aT4vaXNFZGl0YWJsZX0pICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICR7SGFzRHJhZnRFbnRpdHl9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hEcmFmdEFuZEFjdGl2ZSBidXR0b24gaW4gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdGhlIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTd2l0Y2hEcmFmdEFuZEFjdGl2ZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRpZiAoY2hlY2tEcmFmdFN0YXRlKG9Bbm5vdGF0aW9ucykpIHtcblx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISR7dWk+Y3JlYXRlTW9kZX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGZpbmQgYW4gYWN0aW9uIGZyb20gdGhlIGFycmF5IG9mIGhlYWRlciBhY3Rpb25zIGluIHRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mICdoZWFkZXInIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlLlxuICogQHBhcmFtIHNBY3Rpb25UeXBlIFRoZSBhY3Rpb24gdHlwZVxuICogQHJldHVybnMgVGhlIGFjdGlvbiB3aXRoIHRoZSBtYXRjaGluZyBhY3Rpb24gdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF9maW5kQWN0aW9uID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10sIHNBY3Rpb25UeXBlOiBzdHJpbmcpIHtcblx0bGV0IG9BY3Rpb247XG5cdGlmIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgJiYgYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLmxlbmd0aCkge1xuXHRcdG9BY3Rpb24gPSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMuZmluZChmdW5jdGlvbiAob0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4gb0hlYWRlckFjdGlvbi50eXBlID09PSBzQWN0aW9uVHlwZTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gb0FjdGlvbjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgZm9yIHRoZSBEZWxldGUgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRjb25zdCBvRGVsZXRlQWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBEZWxldGUgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvblZpc2libGUgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRjb25zdCBvRGVsZXRlQWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLnZpc2libGUgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9FZGl0QWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlByaW1hcnlcIik7XG5cdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLnZpc2libGUgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9FZGl0QWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlByaW1hcnlcIik7XG5cdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBFZGl0QWN0aW9uIGZyb20gdGhlIEVudGl0eXNldCBiYXNlZCBvbiBEcmFmdCBvciBzdGlja3kgYmFzZWQgYXBwbGljYXRpb24uXG4gKlxuICogQHBhcmFtIFtvRW50aXR5U2V0XSBUaGUgdmFsdWUgZnJvbSB0aGUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdlJhd1ZhbHVlICYgb0RyYWZ0Tm9kZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdEFjdGlvbiA9IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KSB7XG5cdGNvbnN0IHNQYXRoID0gb0VudGl0eVNldC5nZXRQYXRoKCksXG5cdFx0b0Fubm90YXRpb25zID0gb0VudGl0eVNldC5nZXRPYmplY3QoYCR7c1BhdGh9QGApO1xuXHRjb25zdCBiRHJhZnRSb290ID0gb0Fubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIik7XG5cdGNvbnN0IGJTdGlja3lTZXNzaW9uID0gb0Fubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFwiKTtcblx0bGV0IHNBY3Rpb25OYW1lO1xuXHRpZiAoYkRyYWZ0Um9vdCkge1xuXHRcdHNBY3Rpb25OYW1lID0gb0VudGl0eVNldC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvRWRpdEFjdGlvbmApO1xuXHR9IGVsc2UgaWYgKGJTdGlja3lTZXNzaW9uKSB7XG5cdFx0c0FjdGlvbk5hbWUgPSBvRW50aXR5U2V0LmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL0VkaXRBY3Rpb25gKTtcblx0fVxuXHRyZXR1cm4gIXNBY3Rpb25OYW1lID8gc0FjdGlvbk5hbWUgOiBgJHtzUGF0aH0vJHtzQWN0aW9uTmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnksIG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRsZXQgYkNvbXB1dGVkLCBiSW1tdXRhYmxlLCBiUmVhZE9ubHk7XG5cdGlmIChvQW5ub3RhdGlvbnMgJiYgb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdKSB7XG5cdFx0YkNvbXB1dGVkID0gb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdLkJvb2wgPyBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbCA9PSBcInRydWVcIiA6IHRydWU7XG5cdH1cblx0aWYgKG9Bbm5vdGF0aW9ucyAmJiBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdKSB7XG5cdFx0YkltbXV0YWJsZSA9IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0uQm9vbCA/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0uQm9vbCA9PSBcInRydWVcIiA6IHRydWU7XG5cdH1cblx0YlJlYWRPbmx5ID0gYkNvbXB1dGVkIHx8IGJJbW11dGFibGU7XG5cblx0aWYgKG9GaWVsZENvbnRyb2wpIHtcblx0XHRiUmVhZE9ubHkgPSBiUmVhZE9ubHkgfHwgb0ZpZWxkQ29udHJvbCA9PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCI7XG5cdH1cblx0aWYgKGJSZWFkT25seSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0ZpZWxkQ29udHJvbDogYW55KSB7XG5cdGxldCBzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHk7XG5cdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0aWYgKChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihvRmllbGRDb250cm9sKSkge1xuXHRcdFx0c0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5ID0gXCIlXCIgKyBvRmllbGRDb250cm9sICsgXCIgPT09IDEgXCI7XG5cdFx0fVxuXHR9XG5cdGlmIChzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkpIHtcblx0XHRyZXR1cm4gXCJ7PSBcIiArIHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSArIFwiPyBmYWxzZSA6IHRydWUgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIGNoYXJ0IFRpdGxlIFByZXNzXG4gKlxuICogQGZ1bmN0aW9ud1xuICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqICBAcGFyYW0ge29NYW5pZmVzdH0gW29NYW5pZmVzdF0gT3V0Ym91bmRzIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NDb2xsZWN0aW9uTmFtZV0gQ29sbGVjdGlvbiBOYW1lIG9mIHRoZSBNaWNybyBDaGFydFxuICpcbiAqIHJldHVybnMge1N0cmluZ30gW0V4cHJlc3Npb25dIEhhbmRsZXIgRXhwcmVzc2lvbiBmb3IgdGhlIHRpdGxlIHByZXNzXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb2xsZWN0aW9uTmFtZTogYW55KSB7XG5cdGlmIChvQ29uZmlndXJhdGlvbikge1xuXHRcdGlmIChcblx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgfHxcblx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XCIuaGFuZGxlcnMub25EYXRhUG9pbnRUaXRsZVByZXNzZWQoJGNvbnRyb2xsZXIsICR7JHNvdXJjZT4vfSwnXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0b0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICtcblx0XHRcdFx0XCInLCdcIiArXG5cdFx0XHRcdHNDb2xsZWN0aW9uTmFtZSArXG5cdFx0XHRcdFwiJyApXCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCIuaGFuZGxlcnMubmF2aWdhdGVUb1N1YlNlY3Rpb24oJGNvbnRyb2xsZXIsICdcIiArIEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pICsgXCInKVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxufTtcblxuLypcbiAqIEZ1bmN0aW9uIHRvIHJlbmRlciBDaGFydCBUaXRsZSBhcyBMaW5rXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29Db250cm9sQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NLZXldIEZvciB0aGUgVGFyZ2V0T3V0Ym91bmQgYW5kIFRhcmdldFNlY3Rpb25cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbmsgPSBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnkpIHtcblx0aWYgKFxuXHRcdG9Db250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSB8fCAob0NvbnRyb2xDb25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbnRyb2xDb25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pKVxuXHQpIHtcblx0XHRyZXR1cm4gXCJFeHRlcm5hbFwiO1xuXHR9IGVsc2UgaWYgKG9Db250cm9sQ29uZmlndXJhdGlvbiAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkge1xuXHRcdHJldHVybiBcIkluUGFnZVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxufTtcblxuLyogR2V0IGdyb3VwSWQgZnJvbSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogQHBhcmFtIHtTdHJpbmd9IFtzQW5ub3RhdGlvblBhdGhdIEFubm90YXRpb24gUGF0aCBmb3IgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRHcm91cElkRnJvbUNvbmZpZyA9IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0Fubm90YXRpb25QYXRoOiBhbnksIHNEZWZhdWx0R3JvdXBJZD86IGFueSkge1xuXHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzQW5ub3RhdGlvblBhdGhdLFxuXHRcdGFBdXRvUGF0dGVybnMgPSBbXCJIZXJvZXNcIiwgXCJEZWNvcmF0aW9uXCIsIFwiV29ya2Vyc1wiLCBcIkxvbmdSdW5uZXJzXCJdO1xuXHRsZXQgc0dyb3VwSWQgPSBzRGVmYXVsdEdyb3VwSWQ7XG5cdGlmIChcblx0XHRvQ29uZmlndXJhdGlvbiAmJlxuXHRcdG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkICYmXG5cdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gYXV0b1BhdHRlcm4gPT09IG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHRcdH0pXG5cdCkge1xuXHRcdHNHcm91cElkID0gXCIkYXV0by5cIiArIG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHR9XG5cdHJldHVybiBzR3JvdXBJZDtcbn07XG5cbi8qXG4gKiBHZXQgQ29udGV4dCBCaW5kaW5nIHdpdGggZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gW3NLZXldIEFubm90YXRpb24gUGF0aCBmb3Igb2YgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgYmluZGluZyBmb3IgRGF0YVBvaW50cyBpbiB0aGUgSGVhZGVyLlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb25zOiBhbnksIHNLZXk6IGFueSkge1xuXHRjb25zdCBzR3JvdXBJZCA9IGdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db25maWd1cmF0aW9ucywgc0tleSk7XG5cdGxldCBzQmluZGluZztcblx0aWYgKHNHcm91cElkKSB7XG5cdFx0c0JpbmRpbmcgPSBcInsgcGF0aCA6ICcnLCBwYXJhbWV0ZXJzIDogeyAkJGdyb3VwSWQgOiAnXCIgKyBzR3JvdXBJZCArIFwiJyB9IH1cIjtcblx0fVxuXHRyZXR1cm4gc0JpbmRpbmc7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGEgRmllbGRHcm91cCBjb25zaXN0cyBvZiBvbmx5IDEgRGF0YUZpZWxkIHdpdGggTXVsdGlMaW5lIFRleHQgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gYUZvcm1FbGVtZW50cyBBIGNvbGxlY3Rpb24gb2YgZm9ybSBlbGVtZW50cyB1c2VkIGluIHRoZSBjdXJyZW50IGZpZWxkIGdyb3VwXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgb25seSAxIGRhdGEgZmllbGQgd2l0aCBNdWx0aWxpbmUgVGV4dCBhbm5vdGF0aW9uIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQgPSBmdW5jdGlvbiAoYUZvcm1FbGVtZW50czogYW55W10pIHtcblx0cmV0dXJuIGFGb3JtRWxlbWVudHMgJiYgYUZvcm1FbGVtZW50cy5sZW5ndGggPT09IDEgJiYgISFhRm9ybUVsZW1lbnRzWzBdLmlzVmFsdWVNdWx0aWxpbmVUZXh0O1xufTtcblxuLypcbiAqIEdldCBWaXNpYmxpdHkgb2YgYnJlYWRjcnVtYnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29WaWV3RGF0YV0gVmlld0RhdGEgbW9kZWxcbiAqIHJldHVybnMgeyp9IEV4cHJlc3Npb24gb3IgYm9vbGVhblxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyA9IGZ1bmN0aW9uIChvVmlld0RhdGE6IGFueSkge1xuXHRyZXR1cm4gb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icyAmJiBvVmlld0RhdGEuZmNsRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gXCJ7ZmNsaGVscGVyPi9icmVhZENydW1iSXNWaXNpYmxlfVwiIDogb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkgPSBmdW5jdGlvbiAodmlld0RhdGE6IGFueSkge1xuXHRsZXQgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiISR7dWk+Y3JlYXRlTW9kZX1cIjtcblx0aWYgKHZpZXdEYXRhLmZjbEVuYWJsZWQpIHtcblx0XHRzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwID0gXCIke2ZjbGhlbHBlcj4vc2hvd1NoYXJlSWNvbn0gJiYgXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwO1xuXHR9XG5cdHJldHVybiBcIns9IFwiICsgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCArIFwiIH1cIjtcbn07XG5cbi8qXG4gKiBHZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBoZWFkZXIgaW5mbyBpbiBlZGl0IG1vZGVcbiAqXG4gKiBJZiBlaXRoZXIgdGhlIHRpdGxlIG9yIGRlc2NyaXB0aW9uIGZpZWxkIGZyb20gdGhlIGhlYWRlciBhbm5vdGF0aW9ucyBhcmUgZWRpdGFibGUsIHRoZW4gdGhlXG4gKiBlZGl0YWJsZSBoZWFkZXIgaW5mbyBpcyB2aXNpYmxlLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQW5ub3RhdGlvbnNdIEFubm90YXRpb25zIG9iamVjdCBmb3IgZ2l2ZW4gZW50aXR5IHNldFxuICogQHBhcmFtIHtvYmplY3R9IFtvRmllbGRDb250cm9sXSBmaWVsZCBjb250cm9sXG4gKiByZXR1cm5zIHsqfSAgYmluZGluZyBleHByZXNzaW9uIG9yIGJvb2xlYW4gdmFsdWUgcmVzb2x2ZWQgZm9ybSBmdW5jaXRvbnMgaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyBhbmQgaXNSZWFkT25seUZyb21EeW5hbWljQW5ub3RhdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFZpc2libGl0eU9mSGVhZGVySW5mbyA9IGZ1bmN0aW9uIChcblx0b1RpdGxlQW5ub3RhdGlvbnM6IGFueSxcblx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnM6IGFueSxcblx0b0ZpZWxkVGl0bGVGaWVsZENvbnRyb2w6IGFueSxcblx0b0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueVxuKSB7XG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBUaXRsZSBGaWVsZFxuXHQvLyBTZXQgdG8gdHJ1ZSBhbmQgZG9uJ3QgdGFrZSBpbnRvIGFjY291bnQsIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucywgaS5lLiBubyB0aXRsZSBleGlzdHNcblx0Y29uc3QgYklzVGl0bGVSZWFkT25seSA9IG9UaXRsZUFubm90YXRpb25zID8gaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyhvVGl0bGVBbm5vdGF0aW9ucywgb0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wpIDogdHJ1ZTtcblx0Y29uc3QgdGl0bGVFeHByZXNzaW9uID0gcmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGRUaXRsZUZpZWxkQ29udHJvbCk7XG5cdC8vIFRoZXJlIGlzIG5vIGV4cHJlc3Npb24gYW5kIHRoZSB0aXRsZSBpcyBub3QgcmVhZHkgb25seSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhbiBlZGl0YWJsZSBoZWFkZXJcblx0aWYgKCFiSXNUaXRsZVJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBEZXNjcmlwdGlvbiBGaWVsZFxuXHQvLyBTZXQgdG8gdHJ1ZSBhbmQgZG9uJ3QgdGFrZSBpbnRvIGFjY291bnQsIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucywgaS5lLiBubyBkZXNjcmlwdGlvbiBleGlzdHNcblx0Y29uc3QgYklzRGVzY3JpcHRpb25SZWFkT25seSA9IG9EZXNjcmlwdGlvbkFubm90YXRpb25zXG5cdFx0PyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKG9EZXNjcmlwdGlvbkFubm90YXRpb25zLCBvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbClcblx0XHQ6IHRydWU7XG5cdGNvbnN0IGRlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMob0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wpO1xuXHQvLyBUaGVyZSBpcyBubyBleHByZXNzaW9uIGFuZCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IHJlYWR5IG9ubHksIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYW4gZWRpdGFibGUgaGVhZGVyXG5cdGlmICghYklzRGVzY3JpcHRpb25SZWFkT25seSAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBCb3RoIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBhcmUgbm90IGVkaXRhYmxlIGFuZCB0aGVyZSBhcmUgbm8gZHluYW1pYyBhbm5vdGF0aW9uc1xuXHRpZiAoYklzVGl0bGVSZWFkT25seSAmJiBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE5vdyBjb21iaW5lIGV4cHJlc3Npb25zXG5cdGlmICh0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiB0aXRsZUV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAoIXRpdGxlRXhwcmVzc2lvbiAmJiBkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gZGVzY3JpcHRpb25FeHByZXNzaW9uO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24ob0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChvVGl0bGVGaWVsZENvbnRyb2w6IGFueSwgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sOiBhbnkpIHtcblx0Ly8gSWYgYm90aCBoZWFkZXIgYW5kIHRpdGxlIGZpZWxkIGFyZSBiYXNlZCBvbiBkeW5tYWljIGZpZWxkIGNvbnRyb2wsIHRoZSBlZGl0YWJsZSBoZWFkZXJcblx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0cmV0dXJuIFwiez0gJVwiICsgb1RpdGxlRmllbGRDb250cm9sICsgXCIgPT09IDEgPyAoICVcIiArIG9EZXNjcmlwdGlvbkZpZWxkQ29udHJvbCArIFwiID09PSAxID8gZmFsc2UgOiB0cnVlICkgOiB0cnVlIH1cIjtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBkZWxldGUgYnV0dG9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlID0gZnVuY3Rpb24gKHNFbnRpdHlTZXROYW1lOiBhbnkpIHtcblx0Y29uc3Qgc0RlbGV0YWJsZUNvbnRleHRzID0gXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRzVGl0bGUgPSBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS9nZXRIZWFkZXJUaXRsZS9nZXRFeHBhbmRlZEhlYWRpbmcvZ2V0SXRlbXMvMS9nZXRUZXh0fVwiLFxuXHRcdHNEZXNjcmlwdGlvbiA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkQ29udGVudC8wL2dldEl0ZW1zLzAvZ2V0VGV4dH1cIjtcblx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHR0aXRsZTogc1RpdGxlLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25cblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmVkaXRGbG93LmRlbGV0ZURvY3VtZW50XCIsIHNEZWxldGFibGVDb250ZXh0cywgQ29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpKTtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBFZGl0IGJ1dHRvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0RhdGFGaWVsZF0gRGF0YSBmaWVsZCBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuICogcmV0dXJucyB7c3RyaW5nfSAgYmluZGluZyBleHByZXNzaW9uIC8gZnVuY3Rpb24gc3RyaW5nIGdlbmVyYXRlZCBmcm9tIGNvbW1hbmhlbHBlcidzIGZ1bmN0aW9uIGdlbmVyYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckVkaXQgPSBmdW5jdGlvbiAob0RhdGFGaWVsZDogYW55LCBzRW50aXR5U2V0TmFtZTogYW55LCBvSGVhZGVyQWN0aW9uOiBhbnkpIHtcblx0Y29uc3Qgc0VkaXRhYmxlQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+L2dldEJpbmRpbmdDb250ZXh0fVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSksXG5cdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5pc05hdmlnYWJsZSxcblx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246XG5cdFx0XHRvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uID8gYCcke29IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9ufSdgIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcIi5oYW5kbGVycy5vbkNhbGxBY3Rpb25cIiwgXCIkeyR2aWV3Pi99XCIsIHNFZGl0YWJsZUNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xufTtcblxuLypcbiAqIE1ldGhvZCB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSAncHJlc3MnIGV2ZW50IGZvciBmb290ZXIgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIHJldHVybnMge3N0cmluZ30gIEJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmcgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29tbW9uaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiA9IGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnksIHNFbnRpdHlTZXROYW1lOiBhbnksIG9IZWFkZXJBY3Rpb246IGFueSkge1xuXHRjb25zdCBzQWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0ludm9jYXRpb25Hcm91cCksXG5cdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiA/IGAnJHtvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYCA6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXCIuaGFuZGxlcnMub25DYWxsQWN0aW9uXCIsIFwiJHskdmlldz4vfVwiLCBzQWN0aW9uQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0IEV4cHJlc3Npb24gb2YgZXhlY3V0ZSBldmVudCBleHByZXNzaW9uIG9mIHByaW1hcnkgYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvRGF0YUZpZWxkXSBEYXRhIGZpZWxkIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJBY3Rpb25dIEhlYWRlciBhY3Rpb24gb2JqZWN0XG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgdmlzaWJpbGl0eSBvZiBzZW1hdGljIHBvc2l0aXZlIGFjdGlvblxuICogQHBhcmFtIHtDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ30gVGhlIGVuYWJsZW1lbnQgb2Ygc2VtYW50aWMgcG9zaXRpdmUgYWN0aW9uXG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgRWRpdCBidXR0b24gdmlzaWJpbGl0eVxuICogQHBhcmFtIHtDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ30gVGhlIGVuYWJsZW1lbnQgb2YgRWRpdCBidXR0b25cbiAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JQcmltYXJ5QWN0aW9uID0gZnVuY3Rpb24gKFxuXHRvRGF0YUZpZWxkOiBhbnksXG5cdHNFbnRpdHlTZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG9IZWFkZXJBY3Rpb246IEJhc2VBY3Rpb24gfCBudWxsLFxuXHRwb3NpdGl2ZUFjdGlvblZpc2libGU6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nLFxuXHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQ6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nLFxuXHRlZGl0QWN0aW9uVmlzaWJsZTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmcsXG5cdGVkaXRBY3Rpb25FbmFibGVkOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ1xuKSB7XG5cdGNvbnN0IHNBY3Rpb25Db250ZXh0cyA9IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMob0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkFjdGlvbiksXG5cdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPSBvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nW1wiJEVudW1NZW1iZXJcIl0sXG5cdFx0c0ludm9jYXRpb25Hcm91cCA9IHNEYXRhRmllbGRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9wZXJhdGlvbkdyb3VwaW5nVHlwZS9DaGFuZ2VTZXRcIiA/IFwiQ2hhbmdlU2V0XCIgOiBcIklzb2xhdGVkXCI7XG5cdGNvbnN0IG9QYXJhbXMgPSB7XG5cdFx0Y29udGV4dHM6IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IHNFbnRpdHlTZXROYW1lID8gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzRW50aXR5U2V0TmFtZSkgOiBcIlwiLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQ/LkxhYmVsLCB0cnVlKSxcblx0XHRpc05hdmlnYWJsZTogb0hlYWRlckFjdGlvbj8uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBvSGVhZGVyQWN0aW9uPy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdD8gYCcke29IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9ufSdgXG5cdFx0XHQ6IHVuZGVmaW5lZFxuXHR9O1xuXHRjb25zdCBvQ29uZGl0aW9ucyA9IHtcblx0XHRwb3NpdGl2ZUFjdGlvblZpc2libGUsXG5cdFx0cG9zaXRpdmVBY3Rpb25FbmFibGVkLFxuXHRcdGVkaXRBY3Rpb25WaXNpYmxlLFxuXHRcdGVkaXRBY3Rpb25FbmFibGVkXG5cdH07XG5cdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcblx0XHRcIi5oYW5kbGVycy5vblByaW1hcnlBY3Rpb25cIixcblx0XHRcIiRjb250cm9sbGVyXCIsXG5cdFx0XCIkeyR2aWV3Pi99XCIsXG5cdFx0XCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRzQWN0aW9uQ29udGV4dHMsXG5cdFx0Q29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpLFxuXHRcdENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvQ29uZGl0aW9ucylcblx0KTtcbn07XG5cbi8qXG4gKiBHZXRzIHRoZSBiaW5kaW5nIG9mIHRoZSBjb250YWluZXIgSEJveCBmb3IgdGhlIGhlYWRlciBmYWNldC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbnRyb2xDb25maWd1cmF0aW9uXSBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvcm0gb2YgdGhlIHZpZXdEYXRhIG1vZGVsXG4gKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJGYWNldF0gVGhlIG9iamVjdCBvZiB0aGUgaGVhZGVyIGZhY2V0XG4gKiByZXR1cm5zIHsqfSAgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmcm9tIGZ1bmN0aW9uIGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcgb3IgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0U3Rhc2hhYmxlSEJveEJpbmRpbmcgPSBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnksIG9IZWFkZXJGYWNldDogYW55KSB7XG5cdGlmIChvSGVhZGVyRmFjZXQgJiYgb0hlYWRlckZhY2V0LkZhY2V0ICYmIG9IZWFkZXJGYWNldC5GYWNldC50YXJnZXRBbm5vdGF0aW9uVHlwZSA9PT0gXCJEYXRhUG9pbnRcIikge1xuXHRcdHJldHVybiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnKG9Db250cm9sQ29uZmlndXJhdGlvbiwgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25WYWx1ZSk7XG5cdH1cbn07XG5cbi8qXG4gKiBHZXRzIHRoZSAnUHJlc3MnIGV2ZW50IGV4cHJlc3Npb24gZm9yIHRoZSBleHRlcm5hbCBhbmQgaW50ZXJuYWwgZGF0YSBwb2ludCBsaW5rLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQ29uZmlndXJhdGlvbl0gQ29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb01hbmlmZXN0T3V0Ym91bmRdIE91dGJvdW5kcyBmcm9tIG1hbmlmZXN0XG4gKiByZXR1cm5zIHtzdHJpbmd9IFRoZSBydW50aW1lIGJpbmRpbmcgb2YgdGhlICdQcmVzcycgZXZlbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckxpbmsgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb246IGFueSwgb01hbmlmZXN0T3V0Ym91bmQ6IGFueSkge1xuXHRpZiAob0NvbmZpZ3VyYXRpb24pIHtcblx0XHRpZiAob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFwiLmhhbmRsZXJzLm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkKCRjb250cm9sbGVyLCAkeyRzb3VyY2U+fSwgXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcIixcIiArXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgK1xuXHRcdFx0XHRcIilcIlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pIHtcblx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGVhZGVyRm9ybUhib3hSZW5kZXJUeXBlID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChkYXRhRmllbGQ/LnRhcmdldE9iamVjdD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBcIkJhcmVcIjtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFnQ0EsSUFBTUEsVUFBVSxHQUFHQyxRQUFRLENBQUNELFVBQTVCOztFQU9BO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sSUFBTUUscUJBQXFCLEdBQUcsVUFDcENDLFdBRG9DLEVBRXBDQyxTQUZvQyxFQUdwQ0MsZUFIb0MsRUFJcENDLFVBSm9DLEVBS0Q7SUFBQTs7SUFDbkMsSUFBTUMsaUJBQWlCLEdBQUdDLFdBQVcsQ0FBQ0MsaUJBQVosQ0FBOEIsY0FBOUIsRUFBOENMLFNBQVMsQ0FBQ00sY0FBeEQsRUFBd0VDLFNBQXhFLEVBQW1GUCxTQUFTLENBQUNRLFNBQTdGLENBQTFCO0lBRUEsSUFBTUMsbUJBQW1CLEdBQUdMLFdBQVcsQ0FBQ0MsaUJBQVosQ0FDM0Isc0RBRDJCLEVBRTNCTCxTQUFTLENBQUNNLGNBRmlCLEVBRzNCQyxTQUgyQixFQUkzQlAsU0FBUyxDQUFDUSxTQUppQixDQUE1QjtJQU9BLElBQU1FLHFCQUFxQixHQUMxQixDQUFBWCxXQUFXLFNBQVgsSUFBQUEsV0FBVyxX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
854
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwibUxpYnJhcnkiLCJnZXRFeHByZXNzaW9uRm9yVGl0bGUiLCJvSGVhZGVySW5mbyIsIm9WaWV3RGF0YSIsImZ1bGxDb250ZXh0UGF0aCIsIm9EcmFmdFJvb3QiLCJ0aXRsZU5vSGVhZGVySW5mbyIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJyZXNvdXJjZUJ1bmRsZSIsInVuZGVmaW5lZCIsImVudGl0eVNldCIsInRpdGxlV2l0aEhlYWRlckluZm8iLCJvRW1wdHlIZWFkZXJJbmZvVGl0bGUiLCJUaXRsZSIsIlZhbHVlIiwidGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8iLCJ0aXRsZVZhbHVlRXhwcmVzc2lvbiIsImNvbm5lY3RlZEZpZWxkc1BhdGgiLCJ0aXRsZUlzRW1wdHkiLCJjb25zdGFudCIsInRpdGxlQm9vbGVhbkV4cHJlc3Npb24iLCIkVHlwZSIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIiR0YXJnZXQiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJVSSIsIlRleHRBcnJhbmdlbWVudCIsImFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24iLCJmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5IiwiX3R5cGUiLCJ2YWx1ZSIsImlzRW1wdHkiLCJUYXJnZXQiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsImdldExhYmVsRm9yQ29ubmVjdGVkRmllbGRzIiwiY3JlYXRlTW9kZVRpdGxlIiwiVHlwZU5hbWUiLCJjb25jYXQiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRvU3RyaW5nIiwiYWN0aXZlRXhwcmVzc2lvbiIsIkVudGl0eSIsIklzQWN0aXZlIiwiY29tcGlsZUV4cHJlc3Npb24iLCJpZkVsc2UiLCJhbmQiLCJJc0NyZWF0ZU1vZGUiLCJnZXRFeHByZXNzaW9uRm9yRGVzY3JpcHRpb24iLCJwYXRoSW5Nb2RlbCIsIkRlc2NyaXB0aW9uIiwiZ2V0RXhwcmVzc2lvbkZvclNhdmVCdXR0b24iLCJzYXZlQnV0dG9uVGV4dCIsImNyZWF0ZUJ1dHRvblRleHQiLCJzYXZlRXhwcmVzc2lvbiIsInN0YXJ0aW5nRW50aXR5U2V0IiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJEcmFmdCIsIklzTmV3T2JqZWN0IiwiZ2V0Rm9vdGVyVmlzaWJsZSIsImZvb3RlckFjdGlvbnMiLCJkYXRhRmllbGRzIiwibWFuaWZlc3RBY3Rpb25zIiwiZmlsdGVyIiwiYWN0aW9uIiwiaXNNYW5pZmVzdEFjdGlvbiIsImN1c3RvbUFjdGlvblZpc2liaWxpdHkiLCJsZW5ndGgiLCJjdXN0b21BY3Rpb25JbmRpdmlkdWFsVmlzaWJpbGl0eSIsIm1hcCIsInZpc2libGUiLCJvciIsImFubm90YXRpb25BY3Rpb25WaXNpYmlsaXR5IiwiZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5IiwiYURhdGFGaWVsZHMiLCJiQ29uc2lkZXJFZGl0YWJsZSIsInNIaWRkZW5FeHByZXNzaW9uIiwic1NlbWlIaWRkZW5FeHByZXNzaW9uIiwiYUhpZGRlbkFjdGlvblBhdGgiLCJpIiwib0RhdGFGaWVsZCIsIkRldGVybWluaW5nIiwiaGlkZGVuRXhwcmVzc2lvbiIsIiRQYXRoIiwiaW5kZXhPZiIsInB1c2giLCJpbmRleCIsIm9BY3Rpb24iLCJhQWN0aW9ucyIsInR5cGUiLCJidWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uIiwiYUlkZW50aWZpY2F0aW9uIiwiRW1waGFzaXplZCIsInNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiIsImJJc0Fsd2F5c0RlZmF1bHQiLCJzSGlkZGVuU2ltcGxlUGF0aCIsImZvckVhY2giLCJvQ3JpdGljYWxpdHlQcm9wZXJ0eSIsIkNyaXRpY2FsaXR5Iiwib0RhdGFGaWVsZEhpZGRlbiIsIiRFbnVtTWVtYmVyIiwiRGVmYXVsdCIsInNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24iLCJnZXRFbGVtZW50QmluZGluZyIsInNQYXRoIiwic05hdmlnYXRpb25QYXRoIiwiT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIiLCJnZXROYXZpZ2F0aW9uUGF0aCIsImNoZWNrRHJhZnRTdGF0ZSIsIm9Bbm5vdGF0aW9ucyIsImdldFN3aXRjaFRvQWN0aXZlVmlzaWJpbGl0eSIsImdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5IiwiZ2V0U3dpdGNoRHJhZnRBbmRBY3RpdmVWaXNpYmlsaXR5IiwiX2ZpbmRBY3Rpb24iLCJhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMiLCJzQWN0aW9uVHlwZSIsImZpbmQiLCJvSGVhZGVyQWN0aW9uIiwiZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJvRGVsZXRlQWN0aW9uIiwiZW5hYmxlZCIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwiZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwib0VkaXRBY3Rpb24iLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJnZXRFZGl0QWN0aW9uIiwib0VudGl0eVNldCIsImdldFBhdGgiLCJhUGF0aHMiLCJzcGxpdCIsInJvb3RFbnRpdHlTZXRQYXRoIiwicm9vdEVudGl0eVNldEFubm5vdGF0aW9ucyIsImdldE9iamVjdCIsImJEcmFmdFJvb3QiLCJoYXNPd25Qcm9wZXJ0eSIsImJEcmFmdE5vZGUiLCJiU3RpY2t5U2Vzc2lvbiIsInNBY3Rpb25OYW1lIiwiaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyIsIm9GaWVsZENvbnRyb2wiLCJiQ29tcHV0ZWQiLCJiSW1tdXRhYmxlIiwiYlJlYWRPbmx5IiwiQm9vbCIsInJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMiLCJzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkiLCJNYW5hZ2VkT2JqZWN0IiwiYmluZGluZ1BhcnNlciIsImdldEV4cHJlc3Npb25Gb3JNaWNyb0NoYXJ0VGl0bGVQcmVzcyIsIm9Db25maWd1cmF0aW9uIiwib01hbmlmZXN0T3V0Ym91bmQiLCJzQ29sbGVjdGlvbk5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0TWljcm9DaGFydFRpdGxlQXNMaW5rIiwib0NvbnRyb2xDb25maWd1cmF0aW9uIiwiZ2V0R3JvdXBJZEZyb21Db25maWciLCJvQ29uZmlndXJhdGlvbnMiLCJzQW5ub3RhdGlvblBhdGgiLCJzRGVmYXVsdEdyb3VwSWQiLCJhQXV0b1BhdHRlcm5zIiwic0dyb3VwSWQiLCJyZXF1ZXN0R3JvdXBJZCIsInNvbWUiLCJhdXRvUGF0dGVybiIsImdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWciLCJzS2V5Iiwic0JpbmRpbmciLCJkb2VzRmllbGRHcm91cENvbnRhaW5Pbmx5T25lTXVsdGlMaW5lRGF0YUZpZWxkIiwiYUZvcm1FbGVtZW50cyIsImlzVmFsdWVNdWx0aWxpbmVUZXh0IiwiZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyIsInNob3dCcmVhZENydW1icyIsImZjbEVuYWJsZWQiLCJnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkiLCJ2aWV3RGF0YSIsInNTaGFyZUJ1dHRvblZpc2liaWxpdHlFeHAiLCJnZXRWaXNpYmxpdHlPZkhlYWRlckluZm8iLCJvVGl0bGVBbm5vdGF0aW9ucyIsIm9EZXNjcmlwdGlvbkFubm90YXRpb25zIiwib0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wiLCJvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImJJc1RpdGxlUmVhZE9ubHkiLCJ0aXRsZUV4cHJlc3Npb24iLCJiSXNEZXNjcmlwdGlvblJlYWRPbmx5IiwiZGVzY3JpcHRpb25FeHByZXNzaW9uIiwiY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uIiwib1RpdGxlRmllbGRDb250cm9sIiwib0Rlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlIiwic0VudGl0eVNldE5hbWUiLCJzRGVsZXRhYmxlQ29udGV4dHMiLCJzVGl0bGUiLCJzRGVzY3JpcHRpb24iLCJvUGFyYW1zIiwidGl0bGUiLCJlbnRpdHlTZXROYW1lIiwiQ29tbW9uSGVscGVyIiwiYWRkU2luZ2xlUXVvdGVzIiwiZGVzY3JpcHRpb24iLCJnZW5lcmF0ZUZ1bmN0aW9uIiwib2JqZWN0VG9TdHJpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0Iiwic0VkaXRhYmxlQ29udGV4dHMiLCJBY3Rpb24iLCJzRGF0YUZpZWxkRW51bU1lbWJlciIsIkludm9jYXRpb25Hcm91cGluZyIsInNJbnZvY2F0aW9uR3JvdXAiLCJjb250ZXh0cyIsImludm9jYXRpb25Hcm91cGluZyIsIm1vZGVsIiwibGFiZWwiLCJMYWJlbCIsImlzTmF2aWdhYmxlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiIsInNBY3Rpb25Db250ZXh0cyIsImdldFByZXNzRXhwcmVzc2lvbkZvclByaW1hcnlBY3Rpb24iLCJwb3NpdGl2ZUFjdGlvblZpc2libGUiLCJwb3NpdGl2ZUFjdGlvbkVuYWJsZWQiLCJlZGl0QWN0aW9uVmlzaWJsZSIsImVkaXRBY3Rpb25FbmFibGVkIiwib0NvbmRpdGlvbnMiLCJnZXRTdGFzaGFibGVIQm94QmluZGluZyIsIm9IZWFkZXJGYWNldCIsIkZhY2V0IiwidGFyZ2V0QW5ub3RhdGlvblR5cGUiLCJ0YXJnZXRBbm5vdGF0aW9uVmFsdWUiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rIiwiZ2V0SGVhZGVyRm9ybUhib3hSZW5kZXJUeXBlIiwiZGF0YUZpZWxkIiwidGFyZ2V0T2JqZWN0IiwiZ2V0RGVmYXVsdEFjdGlvbkhhbmRsZXIiLCJvQ3R4Iiwib0RhdGFGaWVsZEZvckRlZmF1bHRBY3Rpb24iLCJkZWZhdWx0QWN0aW9uQ29udGV4dE9yRW50aXR5U2V0IiwiZGVmYXVsdEFjdGlvbiIsImNvbW1hbmQiLCJwcmVzcyIsIm5vV3JhcCIsImJ1aWxkQWN0aW9uV3JhcHBlciIsImlkIiwiaW9FeCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiT2JqZWN0UGFnZVRlbXBsYXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRm9ybWF0dGVycyBmb3IgdGhlIE9iamVjdCBQYWdlXG5pbXBvcnQgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YUZpZWxkLCBEYXRhRmllbGRUeXBlcywgSGVhZGVySW5mb1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcywgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBCYXNlQWN0aW9uLCBDb252ZXJ0ZXJBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQWN0aW9uXCI7XG5pbXBvcnQgeyBEcmFmdCwgRW50aXR5LCBVSSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbmNhdCxcblx0Y29uc3RhbnQsXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0aWZFbHNlLFxuXHRpc0VtcHR5LFxuXHRvcixcblx0cmVzb2x2ZUJpbmRpbmdTdHJpbmdcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCB7IGFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24sIGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB7IGdldExhYmVsRm9yQ29ubmVjdGVkRmllbGRzIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvZm9ybS9Gb3JtVGVtcGxhdGluZ1wiO1xuaW1wb3J0IG1MaWJyYXJ5IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IE9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcblxuY29uc3QgQnV0dG9uVHlwZSA9IG1MaWJyYXJ5LkJ1dHRvblR5cGU7XG5cbnR5cGUgVmlld0RhdGEgPSB7XG5cdHJlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZTtcblx0ZW50aXR5U2V0OiBzdHJpbmc7XG59O1xuXG4vL2BgYG1lcm1haWRcbi8vIGdyYXBoIFREXG4vLyBBW09iamVjdCBQYWdlIFRpdGxlXSAtLT58R2V0IERhdGFGaWVsZCBWYWx1ZXwgQ3tFdmFsdWF0ZSBDcmVhdGUgTW9kZX1cbi8vIEMgLS0+fEluIENyZWF0ZSBNb2RlfCBEe0lzIERhdGFGaWVsZCBWYWx1ZSBlbXB0eX1cbi8vIEQgLS0+fFllc3wgRntJcyB0aGVyZSBhIFR5cGVOYW1lfVxuLy8gRiAtLT58WWVzfCBHW0lzIHRoZXJlIGFuIGN1c3RvbSB0aXRsZV1cbi8vIEcgLS0+fFllc3wgRzFbU2hvdyB0aGUgY3VzdG9tIHRpdGxlICsgJ1R5cGVOYW1lJ11cbi8vIEcgLS0+fE5vfCBHMltEaXNwbGF5IHRoZSBkZWZhdWx0IHRpdGxlICdOZXcgKyBUeXBlTmFtZSddXG4vLyBGIC0tPnxOb3wgSFtJcyB0aGVyZSBhIGN1c3RvbSB0aXRsZV1cbi8vIEggLS0+fFllc3wgSVtTaG93IHRoZSBjdXN0b20gdGl0bGVdXG4vLyBIIC0tPnxOb3wgSltTaG93IHRoZSBkZWZhdWx0ICdVbmFtbmVkIE9iamVjdCddXG4vLyBEIC0tPnxOb3wgRVxuLy8gQyAtLT58Tm90IGluIGNyZWF0ZSBtb2RlfCBFW1Nob3cgRGF0YUZpZWxkIFZhbHVlXVxuLy8gYGBgXG4vKipcbiAqIENvbXB1dGUgdGhlIHRpdGxlIGZvciB0aGUgb2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9IZWFkZXJJbmZvIFRoZSBAVUkuSGVhZGVySW5mbyBhbm5vdGF0aW9uIGNvbnRlbnRcbiAqIEBwYXJhbSBvVmlld0RhdGEgVGhlIHZpZXcgZGF0YSBvYmplY3Qgd2UncmUgY3VycmVudGx5IG9uXG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBmdWxsIGNvbnRleHQgcGF0aCB1c2VkIHRvIHJlYWNoIHRoYXQgb2JqZWN0IHBhZ2VcbiAqIEBwYXJhbSBvRHJhZnRSb290XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgb2JqZWN0IHBhZ2UgdGl0bGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV4cHJlc3Npb25Gb3JUaXRsZSA9IGZ1bmN0aW9uIChcblx0b0hlYWRlckluZm86IEhlYWRlckluZm9UeXBlIHwgdW5kZWZpbmVkLFxuXHRvVmlld0RhdGE6IFZpZXdEYXRhLFxuXHRmdWxsQ29udGV4dFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdG9EcmFmdFJvb3Q6IE9iamVjdCB8IHVuZGVmaW5lZFxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCB0aXRsZU5vSGVhZGVySW5mbyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9ORVdfT0JKRUNUXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSwgdW5kZWZpbmVkLCBvVmlld0RhdGEuZW50aXR5U2V0KTtcblxuXHRjb25zdCB0aXRsZVdpdGhIZWFkZXJJbmZvID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XCJUX0FOTk9UQVRJT05fSEVMUEVSX0RFRkFVTFRfT0JKRUNUX1BBR0VfSEVBREVSX1RJVExFXCIsXG5cdFx0b1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlLFxuXHRcdHVuZGVmaW5lZCxcblx0XHRvVmlld0RhdGEuZW50aXR5U2V0XG5cdCk7XG5cblx0Y29uc3Qgb0VtcHR5SGVhZGVySW5mb1RpdGxlID1cblx0XHRvSGVhZGVySW5mbz8uVGl0bGUgPT09IHVuZGVmaW5lZCB8fCAob0hlYWRlckluZm8/LlRpdGxlIGFzIGFueSkgPT09IFwiXCIgfHwgKG9IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlID09PSBcIlwiO1xuXG5cdGNvbnN0IHRpdGxlRm9yQWN0aXZlSGVhZGVyTm9IZWFkZXJJbmZvID0gIW9FbXB0eUhlYWRlckluZm9UaXRsZVxuXHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX0FOTk9UQVRJT05fSEVMUEVSX0RFRkFVTFRfT0JKRUNUX1BBR0VfSEVBREVSX1RJVExFX05PX0hFQURFUl9JTkZPXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSlcblx0XHQ6IFwiXCI7XG5cdGxldCB0aXRsZVZhbHVlRXhwcmVzc2lvbixcblx0XHRjb25uZWN0ZWRGaWVsZHNQYXRoLFxuXHRcdHRpdGxlSXNFbXB0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSksXG5cdFx0dGl0bGVCb29sZWFuRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHwgYm9vbGVhbjtcblx0aWYgKG9IZWFkZXJJbmZvPy5UaXRsZT8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkXCIpIHtcblx0XHR0aXRsZVZhbHVlRXhwcmVzc2lvbiA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpO1xuXHRcdGlmICgob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQ/LmFubm90YXRpb25zPy5VST8uVGV4dEFycmFuZ2VtZW50KSB7XG5cdFx0XHQvLyBJbiBjYXNlIGFuIGV4cGxpY2l0IHRleHQgYXJyYW5nZW1lbnQgd2FzIHNldCB3ZSBtYWtlIHVzZSBvZiBpdCBpbiB0aGUgZGVzY3JpcHRpb24gYXMgd2VsbFxuXHRcdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb24gPSBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uKHRpdGxlVmFsdWVFeHByZXNzaW9uLCBmdWxsQ29udGV4dFBhdGgpO1xuXHRcdH1cblx0XHR0aXRsZVZhbHVlRXhwcmVzc2lvbiA9IGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkodGl0bGVWYWx1ZUV4cHJlc3Npb24sIGZ1bGxDb250ZXh0UGF0aCk7XG5cdFx0dGl0bGVJc0VtcHR5ID0gdGl0bGVWYWx1ZUV4cHJlc3Npb24/Ll90eXBlID09PSBcIkNvbnN0YW50XCIgPyBjb25zdGFudCghdGl0bGVWYWx1ZUV4cHJlc3Npb24/LnZhbHVlKSA6IGlzRW1wdHkodGl0bGVWYWx1ZUV4cHJlc3Npb24pO1xuXHR9IGVsc2UgaWYgKFxuXHRcdG9IZWFkZXJJbmZvPy5UaXRsZT8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiICYmXG5cdFx0b0hlYWRlckluZm8/LlRpdGxlPy5UYXJnZXQuJHRhcmdldC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db25uZWN0ZWRGaWVsZHNUeXBlXCJcblx0KSB7XG5cdFx0Y29ubmVjdGVkRmllbGRzUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGZ1bGxDb250ZXh0UGF0aCwgXCIkVHlwZS9AVUkuSGVhZGVySW5mby9UaXRsZS9UYXJnZXQvJEFubm90YXRpb25QYXRoXCIpO1xuXHRcdHRpdGxlVmFsdWVFeHByZXNzaW9uID0gZ2V0TGFiZWxGb3JDb25uZWN0ZWRGaWVsZHMoY29ubmVjdGVkRmllbGRzUGF0aCwgZmFsc2UpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRcdHRpdGxlQm9vbGVhbkV4cHJlc3Npb24gPVxuXHRcdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb24/Ll90eXBlID09PSBcIkNvbnN0YW50XCIgPyBjb25zdGFudCghdGl0bGVWYWx1ZUV4cHJlc3Npb24/LnZhbHVlKSA6IGlzRW1wdHkodGl0bGVWYWx1ZUV4cHJlc3Npb24pO1xuXHRcdHRpdGxlSXNFbXB0eSA9IHRpdGxlVmFsdWVFeHByZXNzaW9uID8gdGl0bGVCb29sZWFuRXhwcmVzc2lvbiA6IGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0Ly8gSWYgdGhlcmUgaXMgYSBUeXBlTmFtZSBkZWZpbmVkLCBzaG93IHRoZSBkZWZhdWx0IHRpdGxlICdOZXcgKyBUeXBlTmFtZScsIG90aGVyd2lzZSBzaG93IHRoZSBjdXN0b20gdGl0bGUgb3IgdGhlIGRlZmF1bHQgJ05ldyBvYmplY3QnXG5cdGNvbnN0IGNyZWF0ZU1vZGVUaXRsZSA9IG9IZWFkZXJJbmZvPy5UeXBlTmFtZVxuXHRcdD8gY29uY2F0KHRpdGxlV2l0aEhlYWRlckluZm8sIFwiOiBcIiwgcmVzb2x2ZUJpbmRpbmdTdHJpbmcob0hlYWRlckluZm8uVHlwZU5hbWUudG9TdHJpbmcoKSkpXG5cdFx0OiB0aXRsZU5vSGVhZGVySW5mbztcblx0Y29uc3QgYWN0aXZlRXhwcmVzc2lvbiA9IG9EcmFmdFJvb3QgPyBFbnRpdHkuSXNBY3RpdmUgOiB0cnVlO1xuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0aWZFbHNlKFxuXHRcdFx0YW5kKFVJLklzQ3JlYXRlTW9kZSwgdGl0bGVJc0VtcHR5KSxcblx0XHRcdGNyZWF0ZU1vZGVUaXRsZSxcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHNob3cgdGhlIGRlZmF1bHQgZXhwcmVzc2lvblxuXHRcdFx0aWZFbHNlKGFuZChhY3RpdmVFeHByZXNzaW9uLCB0aXRsZUlzRW1wdHkpLCB0aXRsZUZvckFjdGl2ZUhlYWRlck5vSGVhZGVySW5mbywgdGl0bGVWYWx1ZUV4cHJlc3Npb24pXG5cdFx0KVxuXHQpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0hlYWRlckluZm8gVGhlIEBVSS5IZWFkZXJJbmZvIGFubm90YXRpb24gY29udGVudFxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgZnVsbCBjb250ZXh0IHBhdGggdXNlZCB0byByZWFjaCB0aGF0IG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgb2JqZWN0IHBhZ2UgZGVzY3JpcHRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV4cHJlc3Npb25Gb3JEZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIChcblx0b0hlYWRlckluZm86IEhlYWRlckluZm9UeXBlIHwgdW5kZWZpbmVkLFxuXHRmdWxsQ29udGV4dFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0bGV0IHBhdGhJbk1vZGVsID0gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKChvSGVhZGVySW5mbz8uRGVzY3JpcHRpb24gYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZSk7XG5cdGlmICgob0hlYWRlckluZm8/LkRlc2NyaXB0aW9uIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQ/LmFubm90YXRpb25zPy5VST8uVGV4dEFycmFuZ2VtZW50KSB7XG5cdFx0Ly8gSW4gY2FzZSBhbiBleHBsaWNpdCB0ZXh0IGFycmFuZ2VtZW50IHdhcyBzZXQgd2UgbWFrZSB1c2Ugb2YgaXQgaW4gdGhlIGRlc2NyaXB0aW9uIGFzIHdlbGxcblx0XHRwYXRoSW5Nb2RlbCA9IGFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24ocGF0aEluTW9kZWwsIGZ1bGxDb250ZXh0UGF0aCk7XG5cdH1cblxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oZm9ybWF0VmFsdWVSZWN1cnNpdmVseShwYXRoSW5Nb2RlbCwgZnVsbENvbnRleHRQYXRoKSk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIHNhdmUgYnV0dG9uLlxuICpcbiAqIEBwYXJhbSBvVmlld0RhdGEgVGhlIGN1cnJlbnQgdmlldyBkYXRhXG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBwYXRoIHVzZWQgdXAgdW50aWwgaGVyZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGF0IHNob3dzIHRoZSByaWdodCBzYXZlIGJ1dHRvbiB0ZXh0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiA9IGZ1bmN0aW9uIChcblx0b1ZpZXdEYXRhOiBWaWV3RGF0YSxcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IHNhdmVCdXR0b25UZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX09QX09CSkVDVF9QQUdFX1NBVkVcIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKTtcblx0Y29uc3QgY3JlYXRlQnV0dG9uVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9DUkVBVEVcIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKTtcblx0bGV0IHNhdmVFeHByZXNzaW9uO1xuXG5cdGlmICgoZnVsbENvbnRleHRQYXRoLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldCkuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCkge1xuXHRcdC8vIElmIHdlJ3JlIGluIHN0aWNreSBtb2RlIEFORCB0aGUgdWkgaXMgaW4gY3JlYXRlIG1vZGUsIHNob3cgQ3JlYXRlLCBlbHNlIHNob3cgU2F2ZVxuXHRcdHNhdmVFeHByZXNzaW9uID0gaWZFbHNlKFVJLklzQ3JlYXRlTW9kZSwgY3JlYXRlQnV0dG9uVGV4dCwgc2F2ZUJ1dHRvblRleHQpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHdlJ3JlIGluIGRyYWZ0IEFORCB0aGUgZHJhZnQgaXMgYSBuZXcgb2JqZWN0ICghSXNBY3RpdmVFbnRpdHkgJiYgIUhhc0FjdGl2ZUVudGl0eSksIHNob3cgY3JlYXRlLCBlbHNlIHNob3cgc2F2ZVxuXHRcdHNhdmVFeHByZXNzaW9uID0gaWZFbHNlKERyYWZ0LklzTmV3T2JqZWN0LCBjcmVhdGVCdXR0b25UZXh0LCBzYXZlQnV0dG9uVGV4dCk7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHNhdmVFeHByZXNzaW9uKTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHJldHVybnMgd2hldGhlciBmb290ZXIgaXMgdmlzaWJsZSBvciBub3Qgb24gb2JqZWN0IC8gc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBnZXRGb290ZXJWaXNpYmxlXG4gKiBAcGFyYW0gZm9vdGVyQWN0aW9ucyBUaGUgZm9vdGVyIGFjdGlvbiBvYmplY3QgY29taW5nIGZyb20gdGhlIGNvbnZlcnRlclxuICogQHBhcmFtIGRhdGFGaWVsZHMgRGF0YSBmaWVsZCBhcnJheSBmb3Igbm9ybWFsIGZvb3RlciB2aXNpYmlsaXR5IHByb2Nlc3NpbmdcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhbnkgYWN0aW9uIGlzIHRydWUsIG90aGVyd2lzZSBjb21waWxlZCBCaW5kaW5nIG9yIGBmYWxzZWBcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RlclZpc2libGUgPSBmdW5jdGlvbiAoXG5cdGZvb3RlckFjdGlvbnM6IENvbnZlcnRlckFjdGlvbltdLFxuXHRkYXRhRmllbGRzOiBEYXRhRmllbGRbXVxuKTogYm9vbGVhbiB8IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgbWFuaWZlc3RBY3Rpb25zID0gZm9vdGVyQWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gaXNNYW5pZmVzdEFjdGlvbihhY3Rpb24pKSBhcyBNYW5pZmVzdEFjdGlvbltdO1xuXHRsZXQgY3VzdG9tQWN0aW9uVmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRpZiAobWFuaWZlc3RBY3Rpb25zLmxlbmd0aCkge1xuXHRcdC8vIElmIHdlIGhhdmUgbWFuaWZlc3QgYWN0aW9uc1xuXHRcdGNvbnN0IGN1c3RvbUFjdGlvbkluZGl2aWR1YWxWaXNpYmlsaXR5ID0gbWFuaWZlc3RBY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVzb2x2ZUJpbmRpbmdTdHJpbmc8Ym9vbGVhbj4oYWN0aW9uLnZpc2libGUgYXMgc3RyaW5nIHwgYm9vbGVhbiwgXCJib29sZWFuXCIpO1xuXHRcdH0pO1xuXHRcdC8vIGNvbnN0cnVjdCB0aGUgZm9vdGVyJ3MgdmlzaWJpbGl0eS1iaW5kaW5nIG91dCBvZiBhbGwgYWN0aW9ucycgdmlzaWJpbGl0eS1iaW5kaW5ncywgZmlyc3QgdGhlIGJpbmRpbmcgb2YgYWxsIGN1c3RvbSBhY3Rpb25zIC4uLlxuXHRcdGN1c3RvbUFjdGlvblZpc2liaWxpdHkgPSBvciguLi5jdXN0b21BY3Rpb25JbmRpdmlkdWFsVmlzaWJpbGl0eSk7XG5cdFx0Ly8gYW5kIHRoZW4gdGhlIGJpbmRpbmcgb2YgYWxsIGFubm90YXRpb24gYWN0aW9ucyBpbnNpZGUgdGhlIGZvb3RlciAuLi5cblx0XHRjb25zdCBhbm5vdGF0aW9uQWN0aW9uVmlzaWJpbGl0eSA9IGdldERhdGFGaWVsZEJhc2VkRm9vdGVyVmlzaWJpbGl0eShkYXRhRmllbGRzLCB0cnVlKTtcblx0XHQvLyBmaW5hbGx5LCByZXR1cm4gZXZlcnl0aGluZy5cblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ob3IoY3VzdG9tQWN0aW9uVmlzaWJpbGl0eSwgcmVzb2x2ZUJpbmRpbmdTdHJpbmc8Ym9vbGVhbj4oYW5ub3RhdGlvbkFjdGlvblZpc2liaWxpdHksIFwiYm9vbGVhblwiKSkpO1xuXHR9XG5cdHJldHVybiBnZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHkoZGF0YUZpZWxkcywgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZm9vdGVyIGlzIHZpc2libGUgb3Igbm90LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VUZW1wbGF0aW5nLmdldERhdGFGaWVsZEJhc2VkRm9vdGVyVmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZ1xuICogQHBhcmFtIGFEYXRhRmllbGRzIEFycmF5IG9mIERhdGFGaWVsZHMgaW4gdGhlIGlkZW50aWZpY2F0aW9uXG4gKiBAcGFyYW0gYkNvbnNpZGVyRWRpdGFibGUgV2hldGhlciB0aGUgZWRpdCBtb2RlIGJpbmRpbmcgaXMgcmVxdWlyZWQgb3Igbm90XG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uIGlmIGFsbCB0aGUgYWN0aW9ucyBhcmUgdWkuaGlkZGVuLCB0cnVlIG90aGVyd2lzZVxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKGFEYXRhRmllbGRzOiBhbnlbXSwgYkNvbnNpZGVyRWRpdGFibGU6IGJvb2xlYW4pIHtcblx0bGV0IHNIaWRkZW5FeHByZXNzaW9uID0gXCJcIjtcblx0bGV0IHNTZW1pSGlkZGVuRXhwcmVzc2lvbjtcblx0Y29uc3QgYUhpZGRlbkFjdGlvblBhdGggPSBbXTtcblxuXHRmb3IgKGNvbnN0IGkgaW4gYURhdGFGaWVsZHMpIHtcblx0XHRjb25zdCBvRGF0YUZpZWxkID0gYURhdGFGaWVsZHNbaV07XG5cdFx0aWYgKG9EYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiAmJiBvRGF0YUZpZWxkLkRldGVybWluaW5nID09PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBoaWRkZW5FeHByZXNzaW9uID0gb0RhdGFGaWVsZFtgQCR7VUlBbm5vdGF0aW9uVGVybXMuSGlkZGVufWBdO1xuXHRcdFx0aWYgKCFoaWRkZW5FeHByZXNzaW9uKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChoaWRkZW5FeHByZXNzaW9uLiRQYXRoKSB7XG5cdFx0XHRcdGlmIChhSGlkZGVuQWN0aW9uUGF0aC5pbmRleE9mKGhpZGRlbkV4cHJlc3Npb24uJFBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFIaWRkZW5BY3Rpb25QYXRoLnB1c2goaGlkZGVuRXhwcmVzc2lvbi4kUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoYUhpZGRlbkFjdGlvblBhdGgubGVuZ3RoKSB7XG5cdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFIaWRkZW5BY3Rpb25QYXRoLmxlbmd0aDsgaW5kZXgrKykge1xuXHRcdFx0aWYgKGFIaWRkZW5BY3Rpb25QYXRoW2luZGV4XSkge1xuXHRcdFx0XHRzU2VtaUhpZGRlbkV4cHJlc3Npb24gPSBcIigle1wiICsgYUhpZGRlbkFjdGlvblBhdGhbaW5kZXhdICsgXCJ9ID09PSB0cnVlID8gZmFsc2UgOiB0cnVlIClcIjtcblx0XHRcdH1cblx0XHRcdGlmIChpbmRleCA9PSBhSGlkZGVuQWN0aW9uUGF0aC5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdHNIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gKyBzU2VtaUhpZGRlbkV4cHJlc3Npb247XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uICsgc1NlbWlIaWRkZW5FeHByZXNzaW9uICsgXCJ8fFwiO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gKFxuXHRcdFx0XCJ7PSBcIiArXG5cdFx0XHQoYkNvbnNpZGVyRWRpdGFibGUgPyBcIihcIiA6IFwiXCIpICtcblx0XHRcdHNIaWRkZW5FeHByZXNzaW9uICtcblx0XHRcdChiQ29uc2lkZXJFZGl0YWJsZSA/IFwiIHx8ICR7dWk+L2lzRWRpdGFibGV9KSBcIiA6IFwiIFwiKSArXG5cdFx0XHRcIiYmICR7aW50ZXJuYWw+aXNDcmVhdGVEaWFsb2dPcGVufSAhPT0gdHJ1ZX1cIlxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiez0gXCIgKyAoYkNvbnNpZGVyRWRpdGFibGUgPyBcIiR7dWk+L2lzRWRpdGFibGV9ICYmIFwiIDogXCJcIikgKyBcIiR7aW50ZXJuYWw+aXNDcmVhdGVEaWFsb2dPcGVufSAhPT0gdHJ1ZX1cIjtcblx0fVxufTtcblxuLyoqXG4gKiBNZXRob2QgcmV0dXJucyBXaGV0aGVyIHRoZSBhY3Rpb24gdHlwZSBpcyBtYW5pZmVzdCBvciBub3QuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBpc01hbmlmZXN0QWN0aW9uVmlzaWJsZVxuICogQHBhcmFtIG9BY3Rpb24gVGhlIGFjdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhY3Rpb24gaXMgY29taW5nIGZyb20gbWFuaWZlc3QsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCBpc01hbmlmZXN0QWN0aW9uID0gZnVuY3Rpb24gKG9BY3Rpb246IGFueSkge1xuXHRjb25zdCBhQWN0aW9ucyA9IFtcblx0XHRcIlByaW1hcnlcIixcblx0XHRcIkRlZmF1bHRBcHBseVwiLFxuXHRcdFwiU2Vjb25kYXJ5XCIsXG5cdFx0XCJGb3JBY3Rpb25cIixcblx0XHRcIkZvck5hdmlnYXRpb25cIixcblx0XHRcIlN3aXRjaFRvQWN0aXZlT2JqZWN0XCIsXG5cdFx0XCJTd2l0Y2hUb0RyYWZ0T2JqZWN0XCIsXG5cdFx0XCJEcmFmdEFjdGlvbnNcIlxuXHRdO1xuXHRyZXR1cm4gYUFjdGlvbnMuaW5kZXhPZihvQWN0aW9uLnR5cGUpIDwgMDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBleHByZXNzaW9uIHRvIGRldGVybWluZSBFbXBoYXNpemVkICBidXR0b24gdHlwZSBiYXNlZCBvbiBDcml0aWNhbGl0eSBhY3Jvc3MgYWxsIGFjdGlvbnNcbiAqIElmIGNyaXRpY2FsIGFjdGlvbiBpcyByZW5kZXJlZCwgaXRzIGNvbnNpZGVyZWQgdG8gYmUgdGhlIHByaW1hcnkgYWN0aW9uLiBIZW5jZSB0ZW1wbGF0ZSdzIGRlZmF1bHQgcHJpbWFyeSBhY3Rpb24gaXMgc2V0IGJhY2sgdG8gRGVmYXVsdC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZy5idWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uXG4gKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VUZW1wbGF0aW5nXG4gKiBAcGFyYW0gYUlkZW50aWZpY2F0aW9uIEFycmF5IG9mIGFsbCB0aGUgRGF0YUZpZWxkcyBpbiBJZGVudGlmaWNhdGlvblxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbiB0byBkZWR1Y2UgaWYgYnV0dG9uIHR5cGUgaXMgRGVmYXVsdCBvciBFbXBoYXNpemVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uID0gZnVuY3Rpb24gKGFJZGVudGlmaWNhdGlvbj86IGFueVtdKSB7XG5cdGlmICghYUlkZW50aWZpY2F0aW9uKSB7XG5cdFx0cmV0dXJuIEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0fVxuXHRsZXQgc0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGxldCBiSXNBbHdheXNEZWZhdWx0OiBib29sZWFuLFxuXHRcdHNIaWRkZW5TaW1wbGVQYXRoLFxuXHRcdHNIaWRkZW5FeHByZXNzaW9uID0gXCJcIjtcblx0YUlkZW50aWZpY2F0aW9uLmZvckVhY2goZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSkge1xuXHRcdGNvbnN0IG9Dcml0aWNhbGl0eVByb3BlcnR5ID0gb0RhdGFGaWVsZC5Dcml0aWNhbGl0eTtcblx0XHRjb25zdCBvRGF0YUZpZWxkSGlkZGVuID0gb0RhdGFGaWVsZFtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl07XG5cdFx0aWYgKG9EYXRhRmllbGQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCIgJiYgIWJJc0Fsd2F5c0RlZmF1bHQgJiYgb0NyaXRpY2FsaXR5UHJvcGVydHkpIHtcblx0XHRcdGlmICghc0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uICYmIG9EYXRhRmllbGRIaWRkZW4gPT09IHRydWUpIHtcblx0XHRcdFx0Ly8gaWYgRGF0YUZpZWxkIGlzIHNldCB0byBoaWRkZW4sIHdlIGNhbiBza2lwIG90aGVyIGNoZWNrcyBhbmQgcmV0dXJuIERlZmF1bHQgYnV0dG9uIHR5cGVcblx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID0gQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAob0RhdGFGaWVsZEhpZGRlbiAmJiBvRGF0YUZpZWxkSGlkZGVuLiRQYXRoKSB7XG5cdFx0XHRcdC8vIHdoZW4gdmlzaWJpbGl0eSBvZiBjcml0aWNhbCBidXR0b24gaXMgYmFzZWQgb24gcGF0aCwgY29sbGVjdCBhbGwgcGF0aHMgZm9yIGV4cHJlc3Npb25cblx0XHRcdFx0c0hpZGRlblNpbXBsZVBhdGggPSBvRGF0YUZpZWxkSGlkZGVuLiRQYXRoO1xuXHRcdFx0XHRpZiAoc0hpZGRlbkV4cHJlc3Npb24pIHtcblx0XHRcdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uICsgXCIgJiYgXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIFwiJXtcIiArIHNIaWRkZW5TaW1wbGVQYXRoICsgXCJ9ID09PSB0cnVlXCI7XG5cdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IFwiez0gKFwiICsgc0hpZGRlbkV4cHJlc3Npb24gKyBcIikgPyAnRW1waGFzaXplZCcgOiAnRGVmYXVsdCcgfVwiO1xuXHRcdFx0fVxuXHRcdFx0c3dpdGNoIChvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kRW51bU1lbWJlcikge1xuXHRcdFx0XHQvLyBzdXBwb3J0ZWQgY3JpdGljYWxpdHkgYXJlIFtQb3NpdGl2ZS8zLyczJ10gYW5kIFtOZWdhdGl2ZS8xLycxJ11cblx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9OZWdhdGl2ZVwiOlxuXHRcdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlUeXBlL1Bvc2l0aXZlXCI6XG5cdFx0XHRcdGNhc2UgXCIxXCI6XG5cdFx0XHRcdGNhc2UgMTpcblx0XHRcdFx0Y2FzZSBcIjNcIjpcblx0XHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHRcdGlmICghb0RhdGFGaWVsZEhpZGRlbikge1xuXHRcdFx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID0gQnV0dG9uVHlwZS5EZWZhdWx0O1xuXHRcdFx0XHRcdFx0YklzQWx3YXlzRGVmYXVsdCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiB8fCBCdXR0b25UeXBlLkRlZmF1bHQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID0gQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoKSB7XG5cdFx0XHRcdC8vIHdoZW4gQ3JpdGljYWxpdHkgaXMgc2V0IHVzaW5nIGEgcGF0aCwgdXNlIHRoZSBwYXRoIGZvciBkZWR1Y2luZyB0aGUgRW1waHNpemVkIHR5cGUgZm9yIGRlZmF1bHQgUHJpbWFyeSBBY3Rpb25cblx0XHRcdFx0Y29uc3Qgc0NvbWJpbmVkSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uID8gXCIhKFwiICsgc0hpZGRlbkV4cHJlc3Npb24gKyBcIikgJiYgXCIgOiBcIlwiO1xuXHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPVxuXHRcdFx0XHRcdFwiez0gXCIgK1xuXHRcdFx0XHRcdHNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24gK1xuXHRcdFx0XHRcdFwiKCgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlUeXBlL05lZ2F0aXZlJykgfHwgKCR7XCIgK1xuXHRcdFx0XHRcdG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPT09ICcxJykgfHwgKCR7XCIgK1xuXHRcdFx0XHRcdG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPT09IDEpIFwiICtcblx0XHRcdFx0XHRcInx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlUeXBlL1Bvc2l0aXZlJykgfHwgKCR7XCIgK1xuXHRcdFx0XHRcdG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPT09ICczJykgfHwgKCR7XCIgK1xuXHRcdFx0XHRcdG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPT09IDMpKSA/IFwiICtcblx0XHRcdFx0XHRcIidEZWZhdWx0J1wiICtcblx0XHRcdFx0XHRcIiA6IFwiICtcblx0XHRcdFx0XHRcIidFbXBoYXNpemVkJ1wiICtcblx0XHRcdFx0XHRcIiB9XCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiB8fCBCdXR0b25UeXBlLkVtcGhhc2l6ZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudEJpbmRpbmcgPSBmdW5jdGlvbiAoc1BhdGg6IGFueSkge1xuXHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlci5nZXROYXZpZ2F0aW9uUGF0aChzUGF0aCk7XG5cdGlmIChzTmF2aWdhdGlvblBhdGgpIHtcblx0XHRyZXR1cm4gXCJ7cGF0aDonXCIgKyBzTmF2aWdhdGlvblBhdGggKyBcIid9XCI7XG5cdH0gZWxzZSB7XG5cdFx0Ly9ubyBuYXZpZ2F0aW9uIHByb3BlcnR5IG5lZWRzIGVtcHR5IG9iamVjdFxuXHRcdHJldHVybiBcIntwYXRoOiAnJ31cIjtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjaGVjayBpZiBkcmFmdCBwYXR0ZXJuIGlzIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBjaGVja0RyYWZ0U3RhdGUgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpIHtcblx0aWYgKFxuXHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdICYmXG5cdFx0b0Fubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIl1bXCJFZGl0QWN0aW9uXCJdXG5cdCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0FjdGl2ZSBidXR0b24gaW4gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdGhlIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTd2l0Y2hUb0FjdGl2ZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRpZiAoY2hlY2tEcmFmdFN0YXRlKG9Bbm5vdGF0aW9ucykpIHtcblx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggJHt1aT4vaXNFZGl0YWJsZX0gJiYgISR7dWk+Y3JlYXRlTW9kZX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaFRvRHJhZnQgYnV0dG9uIGluIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIHRoZSBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0U3dpdGNoVG9EcmFmdFZpc2liaWxpdHkgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRpZiAoY2hlY2tEcmFmdFN0YXRlKG9Bbm5vdGF0aW9ucykpIHtcblx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISgke3VpPi9pc0VkaXRhYmxlfSkgJiYgISR7dWk+Y3JlYXRlTW9kZX0gJiYgJHtIYXNEcmFmdEVudGl0eX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaERyYWZ0QW5kQWN0aXZlIGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFN3aXRjaERyYWZ0QW5kQWN0aXZlVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIChvQW5ub3RhdGlvbnM6IGFueSk6IGFueSB7XG5cdGlmIChjaGVja0RyYWZ0U3RhdGUob0Fubm90YXRpb25zKSkge1xuXHRcdHJldHVybiBcIns9ICgle0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0SXNDcmVhdGVkQnlNZX0pID8gKCAhJHt1aT5jcmVhdGVNb2RlfSAmJiAle0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0SXNDcmVhdGVkQnlNZX0gKSA6IGZhbHNlIH1cIjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZmluZCBhbiBhY3Rpb24gZnJvbSB0aGUgYXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgaW4gdGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgJ2hlYWRlcicgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2UuXG4gKiBAcGFyYW0gc0FjdGlvblR5cGUgVGhlIGFjdGlvbiB0eXBlXG4gKiBAcmV0dXJucyBUaGUgYWN0aW9uIHdpdGggdGhlIG1hdGNoaW5nIGFjdGlvbiB0eXBlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgX2ZpbmRBY3Rpb24gPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSwgc0FjdGlvblR5cGU6IHN0cmluZykge1xuXHRsZXQgb0FjdGlvbjtcblx0aWYgKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyAmJiBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0b0FjdGlvbiA9IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucy5maW5kKGZ1bmN0aW9uIChvSGVhZGVyQWN0aW9uOiBhbnkpIHtcblx0XHRcdHJldHVybiBvSGVhZGVyQWN0aW9uLnR5cGUgPT09IHNBY3Rpb25UeXBlO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBvQWN0aW9uO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9EZWxldGVBY3Rpb24gPSBfZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiU2Vjb25kYXJ5XCIpO1xuXHRyZXR1cm4gb0RlbGV0ZUFjdGlvbiA/IG9EZWxldGVBY3Rpb24uZW5hYmxlZCA6IFwidHJ1ZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9EZWxldGVBY3Rpb24gPSBfZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiU2Vjb25kYXJ5XCIpO1xuXHRyZXR1cm4gb0RlbGV0ZUFjdGlvbiA/IG9EZWxldGVBY3Rpb24udmlzaWJsZSA6IFwidHJ1ZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10pIHtcblx0Y29uc3Qgb0VkaXRBY3Rpb24gPSBfZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiUHJpbWFyeVwiKTtcblx0cmV0dXJuIG9FZGl0QWN0aW9uID8gb0VkaXRBY3Rpb24udmlzaWJsZSA6IFwiZmFsc2VcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCA9IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdGNvbnN0IG9FZGl0QWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlByaW1hcnlcIik7XG5cdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLmVuYWJsZWQgOiBcImZhbHNlXCI7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgRWRpdEFjdGlvbiBmcm9tIHRoZSBiYXNlZCBvbiBhIGRyYWZ0LWVuYWJsZWQgYXBwbGljYXRpb24gb3IgYSBzdGlja3kgYXBwbGljYXRpb24uXG4gKlxuICogQHBhcmFtIFtvRW50aXR5U2V0XSBUaGUgdmFsdWUgZnJvbSB0aGUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdlJhd1ZhbHVlICYgb0RyYWZ0Tm9kZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdEFjdGlvbiA9IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KSB7XG5cdGNvbnN0IHNQYXRoID0gb0VudGl0eVNldC5nZXRQYXRoKCk7XG5cdGNvbnN0IGFQYXRocyA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0Y29uc3Qgcm9vdEVudGl0eVNldFBhdGggPSBcIi9cIiArIGFQYXRoc1sxXTtcblx0Ly8gZ2V0IHRoZSBlZGl0IGFjdGlvbiBmcm9tIHJvb3QgZW50aXR5IHNldHNcblx0Y29uc3Qgcm9vdEVudGl0eVNldEFubm5vdGF0aW9ucyA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHJvb3RFbnRpdHlTZXRQYXRoICsgXCJAXCIpO1xuXHRjb25zdCBiRHJhZnRSb290ID0gcm9vdEVudGl0eVNldEFubm5vdGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIpO1xuXHRjb25zdCBiRHJhZnROb2RlID0gcm9vdEVudGl0eVNldEFubm5vdGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlXCIpO1xuXHRjb25zdCBiU3RpY2t5U2Vzc2lvbiA9IHJvb3RFbnRpdHlTZXRBbm5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXCIpO1xuXHRsZXQgc0FjdGlvbk5hbWU7XG5cdGlmIChiRHJhZnRSb290KSB7XG5cdFx0c0FjdGlvbk5hbWUgPSBvRW50aXR5U2V0LmdldE9iamVjdChgJHtyb290RW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9FZGl0QWN0aW9uYCk7XG5cdH0gZWxzZSBpZiAoYkRyYWZ0Tm9kZSkge1xuXHRcdHNBY3Rpb25OYW1lID0gb0VudGl0eVNldC5nZXRPYmplY3QoYCR7cm9vdEVudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGUvRWRpdEFjdGlvbmApO1xuXHR9IGVsc2UgaWYgKGJTdGlja3lTZXNzaW9uKSB7XG5cdFx0c0FjdGlvbk5hbWUgPSBvRW50aXR5U2V0LmdldE9iamVjdChgJHtyb290RW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL0VkaXRBY3Rpb25gKTtcblx0fVxuXHRyZXR1cm4gIXNBY3Rpb25OYW1lID8gc0FjdGlvbk5hbWUgOiBgJHtyb290RW50aXR5U2V0UGF0aH0vJHtzQWN0aW9uTmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnksIG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRsZXQgYkNvbXB1dGVkLCBiSW1tdXRhYmxlLCBiUmVhZE9ubHk7XG5cdGlmIChvQW5ub3RhdGlvbnMgJiYgb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdKSB7XG5cdFx0YkNvbXB1dGVkID0gb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdLkJvb2wgPyBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbCA9PSBcInRydWVcIiA6IHRydWU7XG5cdH1cblx0aWYgKG9Bbm5vdGF0aW9ucyAmJiBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdKSB7XG5cdFx0YkltbXV0YWJsZSA9IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0uQm9vbCA/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0uQm9vbCA9PSBcInRydWVcIiA6IHRydWU7XG5cdH1cblx0YlJlYWRPbmx5ID0gYkNvbXB1dGVkIHx8IGJJbW11dGFibGU7XG5cblx0aWYgKG9GaWVsZENvbnRyb2wpIHtcblx0XHRiUmVhZE9ubHkgPSBiUmVhZE9ubHkgfHwgb0ZpZWxkQ29udHJvbCA9PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCI7XG5cdH1cblx0aWYgKGJSZWFkT25seSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0ZpZWxkQ29udHJvbDogYW55KSB7XG5cdGxldCBzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHk7XG5cdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0aWYgKChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihvRmllbGRDb250cm9sKSkge1xuXHRcdFx0c0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5ID0gXCIlXCIgKyBvRmllbGRDb250cm9sICsgXCIgPT09IDEgXCI7XG5cdFx0fVxuXHR9XG5cdGlmIChzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkpIHtcblx0XHRyZXR1cm4gXCJ7PSBcIiArIHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSArIFwiPyBmYWxzZSA6IHRydWUgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIGNoYXJ0IFRpdGxlIFByZXNzXG4gKlxuICogQGZ1bmN0aW9ud1xuICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqICBAcGFyYW0ge29NYW5pZmVzdH0gW29NYW5pZmVzdF0gT3V0Ym91bmRzIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NDb2xsZWN0aW9uTmFtZV0gQ29sbGVjdGlvbiBOYW1lIG9mIHRoZSBNaWNybyBDaGFydFxuICpcbiAqIHJldHVybnMge1N0cmluZ30gW0V4cHJlc3Npb25dIEhhbmRsZXIgRXhwcmVzc2lvbiBmb3IgdGhlIHRpdGxlIHByZXNzXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb2xsZWN0aW9uTmFtZTogYW55KSB7XG5cdGlmIChvQ29uZmlndXJhdGlvbikge1xuXHRcdGlmIChcblx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgfHxcblx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XCIuaGFuZGxlcnMub25EYXRhUG9pbnRUaXRsZVByZXNzZWQoJGNvbnRyb2xsZXIsICR7JHNvdXJjZT4vfSwnXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0b0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICtcblx0XHRcdFx0XCInLCdcIiArXG5cdFx0XHRcdHNDb2xsZWN0aW9uTmFtZSArXG5cdFx0XHRcdFwiJyApXCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCIuaGFuZGxlcnMubmF2aWdhdGVUb1N1YlNlY3Rpb24oJGNvbnRyb2xsZXIsICdcIiArIEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pICsgXCInKVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxufTtcblxuLypcbiAqIEZ1bmN0aW9uIHRvIHJlbmRlciBDaGFydCBUaXRsZSBhcyBMaW5rXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29Db250cm9sQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NLZXldIEZvciB0aGUgVGFyZ2V0T3V0Ym91bmQgYW5kIFRhcmdldFNlY3Rpb25cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbmsgPSBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnkpIHtcblx0aWYgKFxuXHRcdG9Db250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSB8fCAob0NvbnRyb2xDb25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbnRyb2xDb25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pKVxuXHQpIHtcblx0XHRyZXR1cm4gXCJFeHRlcm5hbFwiO1xuXHR9IGVsc2UgaWYgKG9Db250cm9sQ29uZmlndXJhdGlvbiAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkge1xuXHRcdHJldHVybiBcIkluUGFnZVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxufTtcblxuLyogR2V0IGdyb3VwSWQgZnJvbSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogQHBhcmFtIHtTdHJpbmd9IFtzQW5ub3RhdGlvblBhdGhdIEFubm90YXRpb24gUGF0aCBmb3IgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRHcm91cElkRnJvbUNvbmZpZyA9IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0Fubm90YXRpb25QYXRoOiBhbnksIHNEZWZhdWx0R3JvdXBJZD86IGFueSkge1xuXHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzQW5ub3RhdGlvblBhdGhdLFxuXHRcdGFBdXRvUGF0dGVybnMgPSBbXCJIZXJvZXNcIiwgXCJEZWNvcmF0aW9uXCIsIFwiV29ya2Vyc1wiLCBcIkxvbmdSdW5uZXJzXCJdO1xuXHRsZXQgc0dyb3VwSWQgPSBzRGVmYXVsdEdyb3VwSWQ7XG5cdGlmIChcblx0XHRvQ29uZmlndXJhdGlvbiAmJlxuXHRcdG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkICYmXG5cdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gYXV0b1BhdHRlcm4gPT09IG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHRcdH0pXG5cdCkge1xuXHRcdHNHcm91cElkID0gXCIkYXV0by5cIiArIG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHR9XG5cdHJldHVybiBzR3JvdXBJZDtcbn07XG5cbi8qXG4gKiBHZXQgQ29udGV4dCBCaW5kaW5nIHdpdGggZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gW3NLZXldIEFubm90YXRpb24gUGF0aCBmb3Igb2YgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgYmluZGluZyBmb3IgRGF0YVBvaW50cyBpbiB0aGUgSGVhZGVyLlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb25zOiBhbnksIHNLZXk6IGFueSkge1xuXHRjb25zdCBzR3JvdXBJZCA9IGdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db25maWd1cmF0aW9ucywgc0tleSk7XG5cdGxldCBzQmluZGluZztcblx0aWYgKHNHcm91cElkKSB7XG5cdFx0c0JpbmRpbmcgPSBcInsgcGF0aCA6ICcnLCBwYXJhbWV0ZXJzIDogeyAkJGdyb3VwSWQgOiAnXCIgKyBzR3JvdXBJZCArIFwiJyB9IH1cIjtcblx0fVxuXHRyZXR1cm4gc0JpbmRpbmc7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGEgRmllbGRHcm91cCBjb25zaXN0cyBvZiBvbmx5IDEgRGF0YUZpZWxkIHdpdGggTXVsdGlMaW5lIFRleHQgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gYUZvcm1FbGVtZW50cyBBIGNvbGxlY3Rpb24gb2YgZm9ybSBlbGVtZW50cyB1c2VkIGluIHRoZSBjdXJyZW50IGZpZWxkIGdyb3VwXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgb25seSAxIGRhdGEgZmllbGQgd2l0aCBNdWx0aWxpbmUgVGV4dCBhbm5vdGF0aW9uIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQgPSBmdW5jdGlvbiAoYUZvcm1FbGVtZW50czogYW55W10pIHtcblx0cmV0dXJuIGFGb3JtRWxlbWVudHMgJiYgYUZvcm1FbGVtZW50cy5sZW5ndGggPT09IDEgJiYgISFhRm9ybUVsZW1lbnRzWzBdLmlzVmFsdWVNdWx0aWxpbmVUZXh0O1xufTtcblxuLypcbiAqIEdldCBWaXNpYmxpdHkgb2YgYnJlYWRjcnVtYnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29WaWV3RGF0YV0gVmlld0RhdGEgbW9kZWxcbiAqIHJldHVybnMgeyp9IEV4cHJlc3Npb24gb3IgYm9vbGVhblxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyA9IGZ1bmN0aW9uIChvVmlld0RhdGE6IGFueSkge1xuXHRyZXR1cm4gb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icyAmJiBvVmlld0RhdGEuZmNsRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gXCJ7ZmNsaGVscGVyPi9icmVhZENydW1iSXNWaXNpYmxlfVwiIDogb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkgPSBmdW5jdGlvbiAodmlld0RhdGE6IGFueSkge1xuXHRsZXQgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiISR7dWk+Y3JlYXRlTW9kZX1cIjtcblx0aWYgKHZpZXdEYXRhLmZjbEVuYWJsZWQpIHtcblx0XHRzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwID0gXCIke2ZjbGhlbHBlcj4vc2hvd1NoYXJlSWNvbn0gJiYgXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwO1xuXHR9XG5cdHJldHVybiBcIns9IFwiICsgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCArIFwiIH1cIjtcbn07XG5cbi8qXG4gKiBHZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBoZWFkZXIgaW5mbyBpbiBlZGl0IG1vZGVcbiAqXG4gKiBJZiBlaXRoZXIgdGhlIHRpdGxlIG9yIGRlc2NyaXB0aW9uIGZpZWxkIGZyb20gdGhlIGhlYWRlciBhbm5vdGF0aW9ucyBhcmUgZWRpdGFibGUsIHRoZW4gdGhlXG4gKiBlZGl0YWJsZSBoZWFkZXIgaW5mbyBpcyB2aXNpYmxlLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQW5ub3RhdGlvbnNdIEFubm90YXRpb25zIG9iamVjdCBmb3IgZ2l2ZW4gZW50aXR5IHNldFxuICogQHBhcmFtIHtvYmplY3R9IFtvRmllbGRDb250cm9sXSBmaWVsZCBjb250cm9sXG4gKiByZXR1cm5zIHsqfSAgYmluZGluZyBleHByZXNzaW9uIG9yIGJvb2xlYW4gdmFsdWUgcmVzb2x2ZWQgZm9ybSBmdW5jaXRvbnMgaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyBhbmQgaXNSZWFkT25seUZyb21EeW5hbWljQW5ub3RhdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFZpc2libGl0eU9mSGVhZGVySW5mbyA9IGZ1bmN0aW9uIChcblx0b1RpdGxlQW5ub3RhdGlvbnM6IGFueSxcblx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnM6IGFueSxcblx0b0ZpZWxkVGl0bGVGaWVsZENvbnRyb2w6IGFueSxcblx0b0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueVxuKSB7XG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBUaXRsZSBGaWVsZFxuXHQvLyBTZXQgdG8gdHJ1ZSBhbmQgZG9uJ3QgdGFrZSBpbnRvIGFjY291bnQsIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucywgaS5lLiBubyB0aXRsZSBleGlzdHNcblx0Y29uc3QgYklzVGl0bGVSZWFkT25seSA9IG9UaXRsZUFubm90YXRpb25zID8gaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyhvVGl0bGVBbm5vdGF0aW9ucywgb0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wpIDogdHJ1ZTtcblx0Y29uc3QgdGl0bGVFeHByZXNzaW9uID0gcmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGRUaXRsZUZpZWxkQ29udHJvbCk7XG5cdC8vIFRoZXJlIGlzIG5vIGV4cHJlc3Npb24gYW5kIHRoZSB0aXRsZSBpcyBub3QgcmVhZHkgb25seSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhbiBlZGl0YWJsZSBoZWFkZXJcblx0aWYgKCFiSXNUaXRsZVJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBEZXNjcmlwdGlvbiBGaWVsZFxuXHQvLyBTZXQgdG8gdHJ1ZSBhbmQgZG9uJ3QgdGFrZSBpbnRvIGFjY291bnQsIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucywgaS5lLiBubyBkZXNjcmlwdGlvbiBleGlzdHNcblx0Y29uc3QgYklzRGVzY3JpcHRpb25SZWFkT25seSA9IG9EZXNjcmlwdGlvbkFubm90YXRpb25zXG5cdFx0PyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKG9EZXNjcmlwdGlvbkFubm90YXRpb25zLCBvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbClcblx0XHQ6IHRydWU7XG5cdGNvbnN0IGRlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMob0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wpO1xuXHQvLyBUaGVyZSBpcyBubyBleHByZXNzaW9uIGFuZCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IHJlYWR5IG9ubHksIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYW4gZWRpdGFibGUgaGVhZGVyXG5cdGlmICghYklzRGVzY3JpcHRpb25SZWFkT25seSAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBCb3RoIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBhcmUgbm90IGVkaXRhYmxlIGFuZCB0aGVyZSBhcmUgbm8gZHluYW1pYyBhbm5vdGF0aW9uc1xuXHRpZiAoYklzVGl0bGVSZWFkT25seSAmJiBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE5vdyBjb21iaW5lIGV4cHJlc3Npb25zXG5cdGlmICh0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiB0aXRsZUV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAoIXRpdGxlRXhwcmVzc2lvbiAmJiBkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gZGVzY3JpcHRpb25FeHByZXNzaW9uO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24ob0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChvVGl0bGVGaWVsZENvbnRyb2w6IGFueSwgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sOiBhbnkpIHtcblx0Ly8gSWYgYm90aCBoZWFkZXIgYW5kIHRpdGxlIGZpZWxkIGFyZSBiYXNlZCBvbiBkeW5tYWljIGZpZWxkIGNvbnRyb2wsIHRoZSBlZGl0YWJsZSBoZWFkZXJcblx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0cmV0dXJuIFwiez0gJVwiICsgb1RpdGxlRmllbGRDb250cm9sICsgXCIgPT09IDEgPyAoICVcIiArIG9EZXNjcmlwdGlvbkZpZWxkQ29udHJvbCArIFwiID09PSAxID8gZmFsc2UgOiB0cnVlICkgOiB0cnVlIH1cIjtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBkZWxldGUgYnV0dG9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlID0gZnVuY3Rpb24gKHNFbnRpdHlTZXROYW1lOiBhbnkpIHtcblx0Y29uc3Qgc0RlbGV0YWJsZUNvbnRleHRzID0gXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRzVGl0bGUgPSBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS9nZXRIZWFkZXJUaXRsZS9nZXRFeHBhbmRlZEhlYWRpbmcvZ2V0SXRlbXMvMS9nZXRUZXh0fVwiLFxuXHRcdHNEZXNjcmlwdGlvbiA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkQ29udGVudC8wL2dldEl0ZW1zLzAvZ2V0VGV4dH1cIjtcblx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHR0aXRsZTogc1RpdGxlLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25cblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmVkaXRGbG93LmRlbGV0ZURvY3VtZW50XCIsIHNEZWxldGFibGVDb250ZXh0cywgQ29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpKTtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBFZGl0IGJ1dHRvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0RhdGFGaWVsZF0gRGF0YSBmaWVsZCBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuICogcmV0dXJucyB7c3RyaW5nfSAgYmluZGluZyBleHByZXNzaW9uIC8gZnVuY3Rpb24gc3RyaW5nIGdlbmVyYXRlZCBmcm9tIGNvbW1hbmhlbHBlcidzIGZ1bmN0aW9uIGdlbmVyYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckVkaXQgPSBmdW5jdGlvbiAob0RhdGFGaWVsZDogYW55LCBzRW50aXR5U2V0TmFtZTogYW55LCBvSGVhZGVyQWN0aW9uOiBhbnkpIHtcblx0Y29uc3Qgc0VkaXRhYmxlQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+L2dldEJpbmRpbmdDb250ZXh0fVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSksXG5cdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5pc05hdmlnYWJsZSxcblx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246XG5cdFx0XHRvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uID8gYCcke29IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9ufSdgIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcIi5oYW5kbGVycy5vbkNhbGxBY3Rpb25cIiwgXCIkeyR2aWV3Pi99XCIsIHNFZGl0YWJsZUNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xufTtcblxuLypcbiAqIE1ldGhvZCB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSAncHJlc3MnIGV2ZW50IGZvciBmb290ZXIgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIHJldHVybnMge3N0cmluZ30gIEJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmcgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29tbW9uaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiA9IGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnksIHNFbnRpdHlTZXROYW1lOiBhbnksIG9IZWFkZXJBY3Rpb246IGFueSkge1xuXHRjb25zdCBzQWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0ludm9jYXRpb25Hcm91cCksXG5cdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiA/IGAnJHtvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYCA6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXCIuaGFuZGxlcnMub25DYWxsQWN0aW9uXCIsIFwiJHskdmlldz4vfVwiLCBzQWN0aW9uQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0IEV4cHJlc3Npb24gb2YgZXhlY3V0ZSBldmVudCBleHByZXNzaW9uIG9mIHByaW1hcnkgYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvRGF0YUZpZWxkXSBEYXRhIGZpZWxkIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJBY3Rpb25dIEhlYWRlciBhY3Rpb24gb2JqZWN0XG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgdmlzaWJpbGl0eSBvZiBzZW1hdGljIHBvc2l0aXZlIGFjdGlvblxuICogQHBhcmFtIHtDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ30gVGhlIGVuYWJsZW1lbnQgb2Ygc2VtYW50aWMgcG9zaXRpdmUgYWN0aW9uXG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgRWRpdCBidXR0b24gdmlzaWJpbGl0eVxuICogQHBhcmFtIHtDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ30gVGhlIGVuYWJsZW1lbnQgb2YgRWRpdCBidXR0b25cbiAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JQcmltYXJ5QWN0aW9uID0gZnVuY3Rpb24gKFxuXHRvRGF0YUZpZWxkOiBhbnksXG5cdHNFbnRpdHlTZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG9IZWFkZXJBY3Rpb246IEJhc2VBY3Rpb24gfCBudWxsLFxuXHRwb3NpdGl2ZUFjdGlvblZpc2libGU6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nLFxuXHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQ6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nLFxuXHRlZGl0QWN0aW9uVmlzaWJsZTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmcsXG5cdGVkaXRBY3Rpb25FbmFibGVkOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZ1xuKSB7XG5cdGNvbnN0IHNBY3Rpb25Db250ZXh0cyA9IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMob0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkFjdGlvbiksXG5cdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPSBvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nW1wiJEVudW1NZW1iZXJcIl0sXG5cdFx0c0ludm9jYXRpb25Hcm91cCA9IHNEYXRhRmllbGRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9wZXJhdGlvbkdyb3VwaW5nVHlwZS9DaGFuZ2VTZXRcIiA/IFwiQ2hhbmdlU2V0XCIgOiBcIklzb2xhdGVkXCI7XG5cdGNvbnN0IG9QYXJhbXMgPSB7XG5cdFx0Y29udGV4dHM6IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IHNFbnRpdHlTZXROYW1lID8gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzRW50aXR5U2V0TmFtZSkgOiBcIlwiLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQ/LkxhYmVsLCB0cnVlKSxcblx0XHRpc05hdmlnYWJsZTogb0hlYWRlckFjdGlvbj8uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBvSGVhZGVyQWN0aW9uPy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdD8gYCcke29IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9ufSdgXG5cdFx0XHQ6IHVuZGVmaW5lZFxuXHR9O1xuXHRjb25zdCBvQ29uZGl0aW9ucyA9IHtcblx0XHRwb3NpdGl2ZUFjdGlvblZpc2libGUsXG5cdFx0cG9zaXRpdmVBY3Rpb25FbmFibGVkLFxuXHRcdGVkaXRBY3Rpb25WaXNpYmxlLFxuXHRcdGVkaXRBY3Rpb25FbmFibGVkXG5cdH07XG5cdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcblx0XHRcIi5oYW5kbGVycy5vblByaW1hcnlBY3Rpb25cIixcblx0XHRcIiRjb250cm9sbGVyXCIsXG5cdFx0XCIkeyR2aWV3Pi99XCIsXG5cdFx0XCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRzQWN0aW9uQ29udGV4dHMsXG5cdFx0Q29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpLFxuXHRcdENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvQ29uZGl0aW9ucylcblx0KTtcbn07XG5cbi8qXG4gKiBHZXRzIHRoZSBiaW5kaW5nIG9mIHRoZSBjb250YWluZXIgSEJveCBmb3IgdGhlIGhlYWRlciBmYWNldC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbnRyb2xDb25maWd1cmF0aW9uXSBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvcm0gb2YgdGhlIHZpZXdEYXRhIG1vZGVsXG4gKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJGYWNldF0gVGhlIG9iamVjdCBvZiB0aGUgaGVhZGVyIGZhY2V0XG4gKiByZXR1cm5zIHsqfSAgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmcm9tIGZ1bmN0aW9uIGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcgb3IgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0U3Rhc2hhYmxlSEJveEJpbmRpbmcgPSBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnksIG9IZWFkZXJGYWNldDogYW55KSB7XG5cdGlmIChvSGVhZGVyRmFjZXQgJiYgb0hlYWRlckZhY2V0LkZhY2V0ICYmIG9IZWFkZXJGYWNldC5GYWNldC50YXJnZXRBbm5vdGF0aW9uVHlwZSA9PT0gXCJEYXRhUG9pbnRcIikge1xuXHRcdHJldHVybiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnKG9Db250cm9sQ29uZmlndXJhdGlvbiwgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25WYWx1ZSk7XG5cdH1cbn07XG5cbi8qXG4gKiBHZXRzIHRoZSAnUHJlc3MnIGV2ZW50IGV4cHJlc3Npb24gZm9yIHRoZSBleHRlcm5hbCBhbmQgaW50ZXJuYWwgZGF0YSBwb2ludCBsaW5rLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQ29uZmlndXJhdGlvbl0gQ29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb01hbmlmZXN0T3V0Ym91bmRdIE91dGJvdW5kcyBmcm9tIG1hbmlmZXN0XG4gKiByZXR1cm5zIHtzdHJpbmd9IFRoZSBydW50aW1lIGJpbmRpbmcgb2YgdGhlICdQcmVzcycgZXZlbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckxpbmsgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb246IGFueSwgb01hbmlmZXN0T3V0Ym91bmQ6IGFueSkge1xuXHRpZiAob0NvbmZpZ3VyYXRpb24pIHtcblx0XHRpZiAob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFwiLmhhbmRsZXJzLm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkKCRjb250cm9sbGVyLCAkeyRzb3VyY2U+fSwgXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcIixcIiArXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgK1xuXHRcdFx0XHRcIilcIlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pIHtcblx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGVhZGVyRm9ybUhib3hSZW5kZXJUeXBlID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChkYXRhRmllbGQ/LnRhcmdldE9iamVjdD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBcIkJhcmVcIjtcbn07XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgYWN0aW9uIGdyb3VwIGhhbmRsZXIgdGhhdCBpcyBpbnZva2VkIHdoZW4gYWRkaW5nIHRoZSBtZW51IGJ1dHRvbiBoYW5kbGluZyBhcHByb3ByaWF0ZWx5LlxuICpcbiAqIEBwYXJhbSBvQ3R4IFRoZSBjdXJyZW50IGNvbnRleHQgaW4gd2hpY2ggdGhlIGhhbmRsZXIgaXMgY2FsbGVkXG4gKiBAcGFyYW0gb0FjdGlvbiBUaGUgY3VycmVudCBhY3Rpb24gY29udGV4dFxuICogQHBhcmFtIG9EYXRhRmllbGRGb3JEZWZhdWx0QWN0aW9uIFRoZSBjdXJyZW50IGRhdGFGaWVsZCBmb3IgdGhlIGRlZmF1bHQgYWN0aW9uXG4gKiBAcGFyYW0gZGVmYXVsdEFjdGlvbkNvbnRleHRPckVudGl0eVNldCBUaGUgY3VycmVudCBjb250ZXh0IGZvciB0aGUgZGVmYXVsdCBhY3Rpb25cbiAqIEByZXR1cm5zIFRoZSBhcHByb3ByaWF0ZSBleHByZXNzaW9uIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEFjdGlvbkhhbmRsZXIob0N0eDogYW55LCBvQWN0aW9uOiBhbnksIG9EYXRhRmllbGRGb3JEZWZhdWx0QWN0aW9uOiBhbnksIGRlZmF1bHRBY3Rpb25Db250ZXh0T3JFbnRpdHlTZXQ6IGFueSkge1xuXHRpZiAob0FjdGlvbi5kZWZhdWx0QWN0aW9uKSB7XG5cdFx0dHJ5IHtcblx0XHRcdHN3aXRjaCAob0FjdGlvbi5kZWZhdWx0QWN0aW9uLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcIkZvckFjdGlvblwiOiB7XG5cdFx0XHRcdFx0cmV0dXJuIGdldFByZXNzRXhwcmVzc2lvbkZvckVkaXQob0RhdGFGaWVsZEZvckRlZmF1bHRBY3Rpb24sIGRlZmF1bHRBY3Rpb25Db250ZXh0T3JFbnRpdHlTZXQsIG9BY3Rpb24uZGVmYXVsdEFjdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2FzZSBcIkZvck5hdmlnYXRpb25cIjoge1xuXHRcdFx0XHRcdGlmIChvQWN0aW9uLmRlZmF1bHRBY3Rpb24uY29tbWFuZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFwiY21kOlwiICsgb0FjdGlvbi5kZWZhdWx0QWN0aW9uLmNvbW1hbmQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmRlZmF1bHRBY3Rpb24ucHJlc3M7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0XHRpZiAob0FjdGlvbi5kZWZhdWx0QWN0aW9uLmNvbW1hbmQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBcImNtZDpcIiArIG9BY3Rpb24uZGVmYXVsdEFjdGlvbi5jb21tYW5kO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0FjdGlvbi5kZWZhdWx0QWN0aW9uLm5vV3JhcCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZGVmYXVsdEFjdGlvbi5wcmVzcztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIENvbW1vbkhlbHBlci5idWlsZEFjdGlvbldyYXBwZXIob0FjdGlvbi5kZWZhdWx0QWN0aW9uLCB7IGlkOiBcImZvclRoZU9iamVjdFBhZ2VcIiB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChpb0V4KSB7XG5cdFx0XHRyZXR1cm4gXCJiaW5kaW5nIGZvciB0aGUgZGVmYXVsdCBhY3Rpb24gaXMgbm90IHdvcmtpbmcgYXMgZXhwZWN0ZWRcIjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBZ0NBLElBQU1BLFVBQVUsR0FBR0MsUUFBUSxD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