@sapui5/sap.fe.core 1.136.2 → 1.138.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 (90) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +76 -28
  4. package/src/sap/fe/core/ActionRuntime.ts +106 -30
  5. package/src/sap/fe/core/AppComponent.js +11 -1
  6. package/src/sap/fe/core/AppComponent.ts +10 -0
  7. package/src/sap/fe/core/CommonUtils.js +15 -3
  8. package/src/sap/fe/core/CommonUtils.ts +13 -2
  9. package/src/sap/fe/core/PageController.controller.js +10 -0
  10. package/src/sap/fe/core/PageController.controller.ts +3 -0
  11. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +3 -4
  12. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +2 -2
  13. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +3 -3
  14. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +2 -2
  15. package/src/sap/fe/core/controllerextensions/EditFlow.js +42 -36
  16. package/src/sap/fe/core/controllerextensions/EditFlow.ts +53 -44
  17. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +2 -1
  18. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -1
  19. package/src/sap/fe/core/controllerextensions/InternalRouting.js +2 -15
  20. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1 -14
  21. package/src/sap/fe/core/controllerextensions/Paginator.js +20 -5
  22. package/src/sap/fe/core/controllerextensions/Paginator.ts +19 -0
  23. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +4 -2
  24. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -2
  25. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +155 -129
  26. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +200 -175
  27. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +11 -14
  28. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +11 -31
  29. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +35 -3
  30. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +46 -10
  31. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +16 -1
  32. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +17 -2
  33. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +88 -1
  34. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +106 -7
  35. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +16 -1
  36. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +15 -0
  37. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +25 -1
  38. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +24 -0
  39. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +3 -5
  40. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +2 -10
  41. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +8 -15
  42. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +7 -19
  43. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -4
  44. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +7 -3
  45. package/src/sap/fe/core/controls/DataWatcher.js +2 -2
  46. package/src/sap/fe/core/controls/DataWatcher.tsx +1 -1
  47. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +11 -6
  48. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +13 -9
  49. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  50. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
  51. package/src/sap/fe/core/converters/MetaModelConverter.js +3 -2
  52. package/src/sap/fe/core/converters/MetaModelConverter.ts +12 -4
  53. package/src/sap/fe/core/converters/controls/Common/Action.js +53 -21
  54. package/src/sap/fe/core/converters/controls/Common/Action.ts +53 -24
  55. package/src/sap/fe/core/converters/controls/Common/Chart.js +4 -1
  56. package/src/sap/fe/core/converters/controls/Common/Chart.ts +2 -1
  57. package/src/sap/fe/core/converters/controls/Common/Table.js +33 -12
  58. package/src/sap/fe/core/converters/controls/Common/Table.ts +37 -10
  59. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +2 -2
  60. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +2 -1
  61. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +6 -11
  62. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +10 -17
  63. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +3 -28
  64. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -26
  65. package/src/sap/fe/core/fpm/manifest.json +1 -1
  66. package/src/sap/fe/core/helpers/FPMHelper.js +2 -2
  67. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  68. package/src/sap/fe/core/helpers/ModelHelper.js +8 -56
  69. package/src/sap/fe/core/helpers/ModelHelper.ts +11 -57
  70. package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
  71. package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
  72. package/src/sap/fe/core/library.js +33 -4
  73. package/src/sap/fe/core/library.ts +33 -2
  74. package/src/sap/fe/core/messagebundle.properties +18 -2
  75. package/src/sap/fe/core/messagebundle_el.properties +2 -2
  76. package/src/sap/fe/core/rootView/Fcl.controller.js +3 -8
  77. package/src/sap/fe/core/rootView/Fcl.controller.ts +7 -14
  78. package/src/sap/fe/core/rootView/RootViewBaseController.js +6 -6
  79. package/src/sap/fe/core/rootView/RootViewBaseController.ts +5 -5
  80. package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -3
  81. package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -2
  82. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -1
  83. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +3 -0
  84. package/src/sap/fe/core/templating/UIFormatters.js +3 -3
  85. package/src/sap/fe/core/templating/UIFormatters.ts +1 -2
  86. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +0 -81
  87. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +0 -126
  88. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +0 -10
  89. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +0 -2
  90. package/src/sap/fe/core/designtime/messagebundle_en_US_saprigi.properties +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.core",
3
- "version": "1.136.2",
3
+ "version": "1.138.0",
4
4
  "description": "SAPUI5 Library sap.fe.core",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -6,7 +6,7 @@
6
6
  SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.136.2</version>
9
+ <version>1.138.0</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.core</documentation>
12
12
 
@@ -12,6 +12,66 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
12
12
  var equal = BindingToolkit.equal;
13
13
  var constant = BindingToolkit.constant;
14
14
  var compileExpression = BindingToolkit.compileExpression;
15
+ /**
16
+ * Initializes the properties of a table action in the internal model context.
17
+ * @param internalModelContext The internal model context where the action properties are set.
18
+ * @param action The name of the action for which properties are initialized.
19
+ * @param forContextMenu Indicates if the action is for a context menu.
20
+ */
21
+ function initializeTableActionProperties(internalModelContext, action, forContextMenu) {
22
+ internalModelContext.setProperty(`dynamicActions/${action}/aApplicable`, []);
23
+ internalModelContext.setProperty(`dynamicActions/${action}/aNotApplicable`, []);
24
+ if (forContextMenu) {
25
+ internalModelContext.setProperty(`dynamicActions/${action}/bEnabledForContextMenu`, false);
26
+ } else {
27
+ internalModelContext.setProperty(`dynamicActions/${action}/bEnabled`, false);
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Handles the case when no contexts are selected for an action.
33
+ * @param internalModelContext The internal model context where the action properties are set.
34
+ * @param action The name of the action for which properties are initialized.
35
+ * @param promises An array of promises to be resolved after setting the action properties.
36
+ * @param forContextMenu Indicates if the action appears in the context menu. If false, the action appears in the table toolbar.
37
+ */
38
+ function handleNoSelectedContexts(internalModelContext, action, promises, forContextMenu) {
39
+ internalModelContext.setProperty(`dynamicActions/${action}`, {
40
+ bEnabled: false,
41
+ aApplicable: [],
42
+ aNotApplicable: []
43
+ });
44
+ promises.push(CommonUtils.setContextsBasedOnOperationAvailable(internalModelContext, [], forContextMenu).then(() => []));
45
+ }
46
+
47
+ /**
48
+ * Handles the case when contexts are selected for an action.
49
+ * @param internalModelContext The internal model context where the action properties are set.
50
+ * @param requestPromises An array of promises to be resolved after setting the action properties.
51
+ * @param promises An array of promises to be resolved after setting the action properties.
52
+ * @param forContextMenu Indicates if the action appears in the context menu. If false, the action appears in the table toolbar.
53
+ */
54
+ function handleSelectedContexts(internalModelContext, requestPromises, promises, forContextMenu) {
55
+ promises.push(CommonUtils.setContextsBasedOnOperationAvailable(internalModelContext, requestPromises, forContextMenu).then(() => []));
56
+ }
57
+
58
+ /**
59
+ * Handles the action enablement for table contexts.
60
+ * @param selectedContexts Selected contexts for the action.
61
+ * @param internalModelContext Internal model context where the action properties are set.
62
+ * @param action Name of the action for which properties are initialized.
63
+ * @param property Property to be checked for the action.
64
+ * @param requestPromises Promises to be resolved after setting the action properties.
65
+ * @param forContextMenu True if the action appears in the context menu, false if it appears in the table toolbar.
66
+ * @param promises P‚romises to be resolved after setting the action properties.
67
+ */
68
+ function handleTableContexts(selectedContexts, internalModelContext, action, property, requestPromises, forContextMenu, promises) {
69
+ if (!selectedContexts.length) {
70
+ handleNoSelectedContexts(internalModelContext, action, promises, forContextMenu);
71
+ } else if (selectedContexts.length && typeof property === "string") {
72
+ handleSelectedContexts(internalModelContext, requestPromises, promises, forContextMenu);
73
+ }
74
+ }
15
75
  const ActionRuntime = {
16
76
  /**
17
77
  * Adds error messages for an action parameter field to the message manager.
@@ -92,47 +152,35 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
92
152
  let aRequestPromises = [];
93
153
  oInternalModelContext.setProperty(sAction, false);
94
154
  if (sControl === "table") {
95
- oInternalModelContext.setProperty(`dynamicActions/${sAction}/aApplicable`, []);
96
- oInternalModelContext.setProperty(`dynamicActions/${sAction}/aNotApplicable`, []);
97
- if (forContextMenu) {
98
- oInternalModelContext.setProperty(`dynamicActions/${sAction}/bEnabledForContextMenu`, false);
99
- } else {
100
- oInternalModelContext.setProperty(`dynamicActions/${sAction}/bEnabled`, false);
101
- }
155
+ initializeTableActionProperties(oInternalModelContext, sAction, forContextMenu);
102
156
  }
103
157
  const sProperty = oActionOperationAvailableMap[sAction];
104
- for (const element of aSelectedContexts) {
105
- const oSelectedContext = element;
106
- if (oSelectedContext) {
107
- const oContextData = oSelectedContext.getObject();
158
+ for (const selectedContext of aSelectedContexts) {
159
+ if (selectedContext) {
160
+ const oContextData = selectedContext.getObject();
108
161
  if (sControl === "chart") {
109
- if (sProperty === null && !!oContextData[`#${sAction}`] || oSelectedContext.getObject(sProperty)) {
162
+ if (sProperty === null && !!oContextData[`#${sAction}`] || selectedContext.getObject(sProperty)) {
110
163
  //look for action advertisement if present and its value is not null
111
164
  oInternalModelContext.setProperty(sAction, true);
112
165
  break;
113
166
  }
114
167
  } else if (sControl === "table") {
115
- aRequestPromises = this._setActionEnablementForTable(oSelectedContext, oInternalModelContext, sAction, sProperty, aRequestPromises, forContextMenu);
168
+ aRequestPromises = this._setActionEnablementForTable(selectedContext, oInternalModelContext, sAction, sProperty, aRequestPromises, forContextMenu);
116
169
  }
117
170
  }
118
171
  }
119
172
  if (sControl === "table") {
120
- if (!aSelectedContexts.length) {
121
- oInternalModelContext.setProperty(`dynamicActions/${sAction}`, {
122
- bEnabled: false,
123
- aApplicable: [],
124
- aNotApplicable: []
125
- });
126
- aPromises.push(CommonUtils.setContextsBasedOnOperationAvailable(oInternalModelContext, [], forContextMenu));
127
- } else if (aSelectedContexts.length && typeof sProperty === "string") {
128
- // When all property values have been retrieved, set
129
- // The applicable and not-applicable selected contexts for each action and
130
- // The enabled property of the dynamic action in internal model context.
131
- aPromises.push(CommonUtils.setContextsBasedOnOperationAvailable(oInternalModelContext, aRequestPromises, forContextMenu));
132
- }
173
+ handleTableContexts(aSelectedContexts, oInternalModelContext, sAction, sProperty, aRequestPromises, forContextMenu, aPromises);
133
174
  }
134
175
  }
135
- return Promise.all(aPromises);
176
+ if (aSelectedContexts.length > 0) {
177
+ // trigger an explicit refresh of the selected context to update
178
+ // also the contexts in case of custom actions
179
+ const selectedContexts = oInternalModelContext.getProperty("selectedContexts") || [];
180
+ oInternalModelContext.setProperty("selectedContexts", []);
181
+ oInternalModelContext.setProperty("selectedContexts", selectedContexts);
182
+ }
183
+ return Promise.all(aPromises).then(results => results.flat());
136
184
  },
137
185
  setActionEnablementAfterPatch: function (oView, oListBinding, oInternalModelContext) {
138
186
  const oInternalModelContextData = oInternalModelContext?.getObject();
@@ -262,4 +310,4 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
262
310
  };
263
311
  return ActionRuntime;
264
312
  }, false);
265
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBY3Rpb25SdW50aW1lIiwiX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIiLCJtZXNzYWdlUGFyYW1ldGVycyIsIk1lc3NhZ2luZyIsImFkZE1lc3NhZ2VzIiwibWFwIiwibWVzc2FnZVBhcmFtZXRlciIsImJpbmRpbmciLCJhY3Rpb25QYXJhbWV0ZXJJbmZvIiwiZmllbGQiLCJnZXRCaW5kaW5nIiwiaXNNdWx0aVZhbHVlIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJ0eXBlIiwiTWVzc2FnZVR5cGUiLCJFcnJvciIsInByb2Nlc3NvciIsImdldE1vZGVsIiwidW5kZWZpbmVkIiwicGVyc2lzdGVudCIsInRhcmdldCIsImdldFJlc29sdmVkUGF0aCIsInZhbGlkYXRlUHJvcGVydGllcyIsImFjdGlvblBhcmFtZXRlckluZm9zIiwicmVzb3VyY2VNb2RlbCIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwidmFsaWRhdGlvblByb21pc2UiLCJyZXF1aXJlZFBhcmFtZXRlckluZm9zIiwiZmlsdGVyIiwicGFyYW1ldGVySW5mbyIsImdldFJlcXVpcmVkIiwiYWxsTWVzc2FnZXMiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZW1wdHlSZXF1aXJlZEZpZWxkcyIsInJlcXVpcmVkUGFyYW1ldGVySW5mbyIsImZpZWxkSWQiLCJnZXRJZCIsInJlbGV2YW50TWVzc2FnZXMiLCJtc2ciLCJnZXRDb250cm9sSWRzIiwic29tZSIsImNvbnRyb2xJZCIsImluY2x1ZGVzIiwibGVuZ3RoIiwidmFsdWUiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJpc0ZpZWxkQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRUZXh0IiwiZ2V0UGFyZW50IiwiZ2V0QWdncmVnYXRpb24iLCJmaXJzdEludmFsaWRQYXJhbWV0ZXIiLCJmaW5kIiwiZ2V0VmlzaWJsZSIsImhhc0Vycm9yIiwiZ2V0VmFsdWVTdGF0ZSIsInNldFZpc2libGUiLCJmb2N1cyIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJzQ29udHJvbCIsImZvckNvbnRleHRNZW51IiwiYXJndW1lbnRzIiwiYVByb21pc2VzIiwic0FjdGlvbiIsImFSZXF1ZXN0UHJvbWlzZXMiLCJzZXRQcm9wZXJ0eSIsInNQcm9wZXJ0eSIsImVsZW1lbnQiLCJvU2VsZWN0ZWRDb250ZXh0Iiwib0NvbnRleHREYXRhIiwiZ2V0T2JqZWN0IiwiX3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZSIsImJFbmFibGVkIiwiYUFwcGxpY2FibGUiLCJhTm90QXBwbGljYWJsZSIsInB1c2giLCJDb21tb25VdGlscyIsInNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZSIsImFsbCIsInNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoIiwib1ZpZXciLCJvTGlzdEJpbmRpbmciLCJvSW50ZXJuYWxNb2RlbENvbnRleHREYXRhIiwib0NvbnRyb2xzIiwiY29udHJvbHMiLCJzS2V5Iiwib1RhYmxlIiwiYnlJZCIsImlzQSIsIm9Sb3dCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsInRhYmxlQVBJIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJKU09OIiwicGFyc2UiLCJ0YWJsZURlZmluaXRpb24iLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwidXBkYXRlRWRpdEJ1dHRvblZpc2liaWxpdHlBbmRFbmFibGVtZW50IiwiaVZpZXdMZXZlbCIsImdldFZpZXdEYXRhIiwidmlld0xldmVsIiwiaXNFZGl0YWJsZSIsImdldElzRWRpdGFibGUiLCJvQ29udGV4dCIsIm9BcHBDb21wb25lbnQiLCJnZXRBcHBDb21wb25lbnQiLCJzTWV0YVBhdGgiLCJNb2RlbEhlbHBlciIsImdldE1ldGFQYXRoRm9yQ29udGV4dCIsInNFbnRpdHlTZXQiLCJnZXRSb290RW50aXR5U2V0UGF0aCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YU1vZGVsIiwiZ2V0Q29udGV4dCIsImdldFBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0IiwiQ29udmVydGVyQ29udGV4dCIsImNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyIsImdldERpYWdub3N0aWNzIiwibWVyZ2UiLCJlbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJlbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZSIsInVwZGF0ZUhpZGRlbiIsImJVcGRhdGVIaWRkZW4iLCJpc0VudGl0eVNldCIsImFubm90YXRpb25zIiwiVUkiLCJVcGRhdGVIaWRkZW4iLCJ2YWx1ZU9mIiwiaXNVcGRhdGVIaWRkZW4iLCJzRWRpdEVuYWJsZUJpbmRpbmciLCJnZXRFZGl0QnV0dG9uRW5hYmxlZCIsImRyYWZ0Um9vdFBhdGgiLCJnZXREcmFmdFJvb3RQYXRoIiwic1N0aWNreVJvb3RQYXRoIiwiZ2V0U3RpY2t5Um9vdFBhdGgiLCJzUGF0aCIsIm9Sb290Q29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0Iiwic0hpZGRlbkV4cHJlc3Npb24iLCJjb21waWxlRXhwcmVzc2lvbiIsImVxdWFsIiwiZ2V0SGlkZGVuRXhwcmVzc2lvbiIsInVwZGF0ZUVkaXRNb2RlbENvbnRleHQiLCJzQmluZGluZ0V4cHJlc3Npb24iLCJvSGlkZGVuRWxlbWVudCIsIkFueUVsZW1lbnQiLCJhbnlUZXh0Iiwic2V0QmluZGluZ0NvbnRleHQiLCJhZGREZXBlbmRlbnQiLCIkJGdyb3VwSWQiLCJhdHRhY2hDaGFuZ2UiLCJvRXZlbnQiLCJvTmV3VmFsdWUiLCJnZXRTb3VyY2UiLCJnZXRFeHRlcm5hbFZhbHVlIiwic0VuYWJsZW1lbnRGaWVsZE5hbWUiLCJnZXRQcm9wZXJ0eSIsImJBY3Rpb25FbmFibGVkIiwiYkVuYWJsZWRGb3JDb250ZXh0TWVudSIsImFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnUiLCJhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51Iiwic0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCIsIm9UcmFuc2Zvcm1lZEJpbmRpbmciLCJ0cmFuc2Zvcm1SZWN1cnNpdmVseSIsIm9CaW5kaW5nRXhwcmVzc2lvbiIsImNvbnN0YW50IiwicGF0aCIsInNSZXN1bHQiLCJzZXREeW5hbWljQWN0aW9uQ29udGV4dHMiLCJyZXF1ZXN0UHJvcGVydHkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkFjdGlvblJ1bnRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb25QYXJhbWV0ZXIgYXMgRWRtQWN0aW9uUGFyYW1ldGVyLCBQcmltaXRpdmVUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIHsgUGF0aEluTW9kZWxFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgY29uc3RhbnQsIGVxdWFsLCB0cmFuc2Zvcm1SZWN1cnNpdmVseSB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgX1JlcXVlc3RlZFByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IHR5cGUgTGFiZWwgZnJvbSBcInNhcC9tL0xhYmVsXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIFByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL1Byb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBGaWxlVXBsb2FkZXIgZnJvbSBcInNhcC91aS91bmlmaWVkL0ZpbGVVcGxvYWRlclwiO1xuaW1wb3J0IEFueUVsZW1lbnQgZnJvbSBcIi4vY29udHJvbHMvQW55RWxlbWVudFwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4vY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcIi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBnZXRFZGl0QnV0dG9uRW5hYmxlZCwgZ2V0SGlkZGVuRXhwcmVzc2lvbiB9IGZyb20gXCIuL2NvbnZlcnRlcnMvb2JqZWN0UGFnZS9IZWFkZXJBbmRGb290ZXJBY3Rpb25cIjtcblxuZXhwb3J0IHR5cGUgQWN0aW9uUGFyYW1ldGVySW5mbyA9IHtcblx0cGFyYW1ldGVyPzogRWRtQWN0aW9uUGFyYW1ldGVyO1xuXHRmaWVsZDogRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWxlVXBsb2FkZXI7XG5cdGlzTXVsdGlWYWx1ZTogYm9vbGVhbjtcblx0dmFsdWU/OiBzdHJpbmcgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHR2YWxpZGF0aW9uUHJvbWlzZT86IFByb21pc2U8c3RyaW5nIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPjtcblx0aGFzRXJyb3I6IGJvb2xlYW47XG5cdHByb3BlcnR5UGF0aD86IHN0cmluZztcbn07XG5cbmNvbnN0IEFjdGlvblJ1bnRpbWUgPSB7XG5cdC8qKlxuXHQgKiBBZGRzIGVycm9yIG1lc3NhZ2VzIGZvciBhbiBhY3Rpb24gcGFyYW1ldGVyIGZpZWxkIHRvIHRoZSBtZXNzYWdlIG1hbmFnZXIuXG5cdCAqIEBwYXJhbSBtZXNzYWdlUGFyYW1ldGVycyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyIGFuZCBtZXNzYWdlcyByZWZlcnJpbmcgdG8gdGhpcyBwYXJhbWV0ZXJcblx0ICovXG5cdF9hZGRNZXNzYWdlRm9yQWN0aW9uUGFyYW1ldGVyOiBmdW5jdGlvbiAobWVzc2FnZVBhcmFtZXRlcnM6IHsgYWN0aW9uUGFyYW1ldGVySW5mbzogQWN0aW9uUGFyYW1ldGVySW5mbzsgbWVzc2FnZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRcdG1lc3NhZ2VQYXJhbWV0ZXJzLm1hcCgobWVzc2FnZVBhcmFtZXRlcikgPT4ge1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nID0gbWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvLmZpZWxkLmdldEJpbmRpbmcoXG5cdFx0XHRcdFx0bWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvLmlzTXVsdGlWYWx1ZSA/IFwiaXRlbXNcIiA6IFwidmFsdWVcIlxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm4gbmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdG1lc3NhZ2U6IG1lc3NhZ2VQYXJhbWV0ZXIubWVzc2FnZSxcblx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRwcm9jZXNzb3I6IGJpbmRpbmc/LmdldE1vZGVsKCkgPz8gdW5kZWZpbmVkLCAvLyBnZXRNb2RlbCgpOiBudWxsIHwgTW9kZWwgfn4+IHByb2Nlc3Nvcj86IE1lc3NhZ2VQcm9jZXNzb3Jcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHRhcmdldDogYmluZGluZz8uZ2V0UmVzb2x2ZWRQYXRoKClcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbGwgcmVxdWlyZWQgYWN0aW9uIHBhcmFtZXRlcnMgY29udGFpbiBkYXRhIGFuZCBjaGVja3MgZm9yIGFsbCBhY3Rpb24gcGFyYW1ldGVycyBpZiB0aGVcblx0ICogY29udGFpbmVkIGRhdGEgaXMgdmFsaWQuXG5cdCAqIEBwYXJhbSBhY3Rpb25QYXJhbWV0ZXJJbmZvcyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIHJlc3VsdCBjYW4gYmUgdHJ1ZSBvciBmYWxzZVxuXHQgKi9cblx0dmFsaWRhdGVQcm9wZXJ0aWVzOiBhc3luYyBmdW5jdGlvbiAoYWN0aW9uUGFyYW1ldGVySW5mb3M6IEFjdGlvblBhcmFtZXRlckluZm9bXSwgcmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcblx0XHRcdGFjdGlvblBhcmFtZXRlckluZm9zLm1hcChcblx0XHRcdFx0KGFjdGlvblBhcmFtZXRlckluZm8pOiBQcm9taXNlPHN0cmluZyB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT4gfCB1bmRlZmluZWQgPT4gYWN0aW9uUGFyYW1ldGVySW5mby52YWxpZGF0aW9uUHJvbWlzZVxuXHRcdFx0KVxuXHRcdCk7XG5cblx0XHRjb25zdCByZXF1aXJlZFBhcmFtZXRlckluZm9zID0gYWN0aW9uUGFyYW1ldGVySW5mb3MuZmlsdGVyKFxuXHRcdFx0KHBhcmFtZXRlckluZm8pID0+XG5cdFx0XHRcdChwYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkKS5nZXRSZXF1aXJlZCAmJlxuXHRcdFx0XHQocGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCkuZ2V0UmVxdWlyZWQoKVxuXHRcdCk7XG5cblx0XHRjb25zdCBhbGxNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0Y29uc3QgZW1wdHlSZXF1aXJlZEZpZWxkcyA9IHJlcXVpcmVkUGFyYW1ldGVySW5mb3MuZmlsdGVyKChyZXF1aXJlZFBhcmFtZXRlckluZm8pID0+IHtcblx0XHRcdGNvbnN0IGZpZWxkSWQgPSByZXF1aXJlZFBhcmFtZXRlckluZm8uZmllbGQuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IHJlbGV2YW50TWVzc2FnZXMgPSBhbGxNZXNzYWdlcy5maWx0ZXIoKG1zZzogTWVzc2FnZSkgPT5cblx0XHRcdFx0bXNnLmdldENvbnRyb2xJZHMoKS5zb21lKChjb250cm9sSWQ6IHN0cmluZykgPT4gY29udHJvbElkLmluY2x1ZGVzKGZpZWxkSWQpKVxuXHRcdFx0KTtcblx0XHRcdGlmIChyZWxldmFudE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmIChyZXF1aXJlZFBhcmFtZXRlckluZm8uaXNNdWx0aVZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiByZXF1aXJlZFBhcmFtZXRlckluZm8udmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhcmVxdWlyZWRQYXJhbWV0ZXJJbmZvLnZhbHVlLmxlbmd0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkVmFsdWUgPSAocmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkKS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRjb25zdCBpc0ZpZWxkQXJyYXkgPSBBcnJheS5pc0FycmF5KChyZXF1aXJlZFBhcmFtZXRlckluZm8uZmllbGQgYXMgRmllbGQpLmdldFZhbHVlKCkpO1xuXHRcdFx0XHRpZiAoaXNGaWVsZEFycmF5KSB7XG5cdFx0XHRcdFx0Ly8gb25seSBmaXJzdCB2YWx1ZSBjaGVjayBpcyBlbm91Z2ggYXMgdGhlIGZpZWxkIHZhbHVlIGNvbWVzIG9uIFswXSByZXN0IG9mIHRoZSBhcnJheSBpbmNsdWRlcyBjdXJyZW5jeSBhbmQgY3VycmVuY3kgY29kZVxuXHRcdFx0XHRcdC8vIGJvdGggb2Ygd2hpY2ggY2FuIG9yIGNhbm5vdCBiZSBudWxsLCBzbyB3ZSBzaGFsbCBjaGVjayBvbmx5IHRoZSBmaWVsZCB2YWx1ZVxuXHRcdFx0XHRcdHJldHVybiBmaWVsZFZhbHVlWzBdID09PSBudWxsIHx8IGZpZWxkVmFsdWVbMF0gPT09IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmaWVsZFZhbHVlID09PSBudWxsIHx8IGZpZWxkVmFsdWUgPT09IFwiXCI7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0LyogTWVzc2FnZSBmb3IgbWlzc2luZyBtYW5kYXRvcnkgdmFsdWUgb2YgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgKi9cblx0XHRpZiAoZW1wdHlSZXF1aXJlZEZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIoXG5cdFx0XHRcdGVtcHR5UmVxdWlyZWRGaWVsZHMubWFwKChhY3Rpb25QYXJhbWV0ZXJJbmZvKSA9PiAoe1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm86IGFjdGlvblBhcmFtZXRlckluZm8sXG5cdFx0XHRcdFx0bWVzc2FnZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19PUEVSQVRJT05TX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX01JU1NJTkdfTUFOREFUT1JZX01TR1wiLCBbXG5cdFx0XHRcdFx0XHQoYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5nZXRQYXJlbnQoKT8uZ2V0QWdncmVnYXRpb24oXCJsYWJlbFwiKSBhcyBMYWJlbCkuZ2V0VGV4dCgpXG5cdFx0XHRcdFx0XSlcblx0XHRcdFx0fSkpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvKiBDaGVjayB2YWx1ZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyAqL1xuXHRcdGNvbnN0IGZpcnN0SW52YWxpZFBhcmFtZXRlciA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbmQoXG5cdFx0XHQocGFyYW1ldGVySW5mbykgPT5cblx0XHRcdFx0cGFyYW1ldGVySW5mby5maWVsZC5nZXRWaXNpYmxlKCkgJiZcblx0XHRcdFx0KHBhcmFtZXRlckluZm8uaGFzRXJyb3IgfHwgcGFyYW1ldGVySW5mby5maWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFwiRXJyb3JcIiB8fCBlbXB0eVJlcXVpcmVkRmllbGRzLmluY2x1ZGVzKHBhcmFtZXRlckluZm8pKVxuXHRcdCk7XG5cdFx0aWYgKGZpcnN0SW52YWxpZFBhcmFtZXRlcikge1xuXHRcdFx0Zmlyc3RJbnZhbGlkUGFyYW1ldGVyLmZpZWxkLnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRmaXJzdEludmFsaWRQYXJhbWV0ZXIuZmllbGQuZm9jdXMoKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhY3Rpb24gZW5hYmxlbWVudC5cblx0ICogQHBhcmFtIG9JbnRlcm5hbE1vZGVsQ29udGV4dCBPYmplY3QgY29udGFpbmluZyB0aGUgY29udGV4dCBtb2RlbFxuXHQgKiBAcGFyYW0gb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCBNYXAgY29udGFpbmluZyB0aGUgb3BlcmF0aW9uIGF2YWlsYWJpbGl0eSBvZiBhY3Rpb25zXG5cdCAqIEBwYXJhbSBhU2VsZWN0ZWRDb250ZXh0cyBBcnJheSBjb250YWluaW5nIHNlbGVjdGVkIGNvbnRleHRzIG9mIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0gc0NvbnRyb2wgQ29udHJvbCBuYW1lXG5cdCAqIEBwYXJhbSBmb3JDb250ZXh0TWVudSBJbmRpY2F0ZXMgaWYgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSBjb250ZXh0IG1lbnUuIElmIGZhbHNlLCB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIHRhYmxlIHRvb2xiYXJcblx0ICogQHJldHVybnMgVGhlIGFjdGlvbiBlbmFibGVtZW50IHByb21pc2VzXG5cdCAqL1xuXHRzZXRBY3Rpb25FbmFibGVtZW50OiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuXHRcdGFTZWxlY3RlZENvbnRleHRzOiBDb250ZXh0W10sXG5cdFx0c0NvbnRyb2w6IHN0cmluZyxcblx0XHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG5cdCk6IFByb21pc2U8dm9pZFtdPiB7XG5cdFx0Y29uc3QgYVByb21pc2VzID0gW107XG5cdFx0Zm9yIChjb25zdCBzQWN0aW9uIGluIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRcdGxldCBhUmVxdWVzdFByb21pc2VzOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXSA9IFtdO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNBY3Rpb24sIGZhbHNlKTtcblx0XHRcdGlmIChzQ29udHJvbCA9PT0gXCJ0YWJsZVwiKSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hQXBwbGljYWJsZWAsIFtdKTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FOb3RBcHBsaWNhYmxlYCwgW10pO1xuXHRcdFx0XHRpZiAoZm9yQ29udGV4dE1lbnUpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYkVuYWJsZWRGb3JDb250ZXh0TWVudWAsIGZhbHNlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYkVuYWJsZWRgLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IHNQcm9wZXJ0eSA9IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXBbc0FjdGlvbl07XG5cdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYVNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGVsZW1lbnQ7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdFx0XHRpZiAoc0NvbnRyb2wgPT09IFwiY2hhcnRcIikge1xuXHRcdFx0XHRcdFx0aWYgKChzUHJvcGVydHkgPT09IG51bGwgJiYgISFvQ29udGV4dERhdGFbYCMke3NBY3Rpb259YF0pIHx8IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0Ly9sb29rIGZvciBhY3Rpb24gYWR2ZXJ0aXNlbWVudCBpZiBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgbm90IG51bGxcblx0XHRcdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNBY3Rpb24sIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0XHRcdGFSZXF1ZXN0UHJvbWlzZXMgPSB0aGlzLl9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGUoXG5cdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0c0FjdGlvbixcblx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRhUmVxdWVzdFByb21pc2VzLFxuXHRcdFx0XHRcdFx0XHRmb3JDb250ZXh0TWVudVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzQ29udHJvbCA9PT0gXCJ0YWJsZVwiKSB7XG5cdFx0XHRcdGlmICghYVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHRcdFx0YkVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0YUFwcGxpY2FibGU6IFtdLFxuXHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YVByb21pc2VzLnB1c2goQ29tbW9uVXRpbHMuc2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlKG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgW10sIGZvckNvbnRleHRNZW51KSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoICYmIHR5cGVvZiBzUHJvcGVydHkgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHQvLyBXaGVuIGFsbCBwcm9wZXJ0eSB2YWx1ZXMgaGF2ZSBiZWVuIHJldHJpZXZlZCwgc2V0XG5cdFx0XHRcdFx0Ly8gVGhlIGFwcGxpY2FibGUgYW5kIG5vdC1hcHBsaWNhYmxlIHNlbGVjdGVkIGNvbnRleHRzIGZvciBlYWNoIGFjdGlvbiBhbmRcblx0XHRcdFx0XHQvLyBUaGUgZW5hYmxlZCBwcm9wZXJ0eSBvZiB0aGUgZHluYW1pYyBhY3Rpb24gaW4gaW50ZXJuYWwgbW9kZWwgY29udGV4dC5cblx0XHRcdFx0XHRhUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdENvbW1vblV0aWxzLnNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZShvSW50ZXJuYWxNb2RlbENvbnRleHQsIGFSZXF1ZXN0UHJvbWlzZXMsIGZvckNvbnRleHRNZW51KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFQcm9taXNlcyk7XG5cdH0sXG5cdHNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoOiBmdW5jdGlvbiAoXG5cdFx0b1ZpZXc6IFZpZXcsXG5cdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHRcblx0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0RGF0YSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3Qgb0NvbnRyb2xzID0gKG9JbnRlcm5hbE1vZGVsQ29udGV4dERhdGE/LmNvbnRyb2xzIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB7IGNvbnRyb2xJZD86IHN0cmluZyB9Pjtcblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gb0NvbnRyb2xzKSB7XG5cdFx0XHRpZiAob0NvbnRyb2xzW3NLZXldICYmIG9Db250cm9sc1tzS2V5XS5jb250cm9sSWQpIHtcblx0XHRcdFx0Y29uc3Qgb1RhYmxlID0gb1ZpZXcuYnlJZChzS2V5KTtcblx0XHRcdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRjb25zdCBvUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRcdFx0aWYgKG9Sb3dCaW5kaW5nID09IG9MaXN0QmluZGluZykge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvVGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRvVGFibGUuZ2V0U2VsZWN0ZWRDb250ZXh0cygpIGFzIENvbnRleHRbXSxcblx0XHRcdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQob1ZpZXc6IEZFVmlldyk6IHZvaWQge1xuXHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncyk/LnZpZXdMZXZlbCxcblx0XHRcdGlzRWRpdGFibGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKG9WaWV3KTtcblx0XHRpZiAoKGlWaWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEgJiYgaXNFZGl0YWJsZSAhPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IE1vZGVsSGVscGVyLmdldFJvb3RFbnRpdHlTZXRQYXRoKHNNZXRhUGF0aCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG9Db250ZXh0XG5cdFx0XHRcdD8uZ2V0TW9kZWwoKVxuXHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0Py5nZXRDb250ZXh0KG9Db250ZXh0Py5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgY29udmVydGVyQ29udGV4dCA9IENvbnZlcnRlckNvbnRleHQ/LmNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyhcblx0XHRcdFx0c0VudGl0eVNldCxcblx0XHRcdFx0bWV0YUNvbnRleHQsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKSxcblx0XHRcdFx0bWVyZ2Vcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdFx0bGV0IHVwZGF0ZUhpZGRlbjtcblx0XHRcdC8vRmluZCB0aGUgVXBkYXRlIEhpZGRlbiBvZiB0aGUgcm9vdCBlbnRpdHkgc2V0IGFuZCBiaW5kIHRoZSBwcm9wZXJ0eSB0byBBbnlFbGVtZW50LCBhbnkgY2hhbmdlcyBpbiB0aGUgcGF0aCBvZiB0aGUgcm9vdCBVcGRhdGVIaWRkZW4gd2lsbCBiZSB1cGRhdGVkIHZpYSB0aGUgcHJvcGVydHksIGludGVybmFsIG1vZGVsIGNvbnRleHQgaXMgdXBkYXRlZCBiYXNlZCBvbiB0aGUgcHJvcGVydHlcblx0XHRcdGNvbnN0IGJVcGRhdGVIaWRkZW4gPSBpc0VudGl0eVNldChlbnRpdHlTZXQpICYmIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuPy52YWx1ZU9mKCk7XG5cdFx0XHRpZiAoYlVwZGF0ZUhpZGRlbiAhPT0gdHJ1ZSkge1xuXHRcdFx0XHR1cGRhdGVIaWRkZW4gPSBNb2RlbEhlbHBlci5pc1VwZGF0ZUhpZGRlbihlbnRpdHlTZXQsIGVudGl0eVR5cGUpO1xuXHRcdFx0fVxuXHRcdFx0Ly9GaW5kIHRoZSBvcGVyYXRpb24gYXZhaWxhYmxlIHByb3BlcnR5IG9mIHRoZSByb290IGVkaXQgY29uZmlndXJhdGlvbiBhbmQgZmV0Y2ggdGhlIHByb3BlcnR5IHVzaW5nIEFueUVsZW1lbnRcblx0XHRcdGNvbnN0IHNFZGl0RW5hYmxlQmluZGluZyA9IGdldEVkaXRCdXR0b25FbmFibGVkKGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0Y29uc3QgZHJhZnRSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1N0aWNreVJvb3RQYXRoID0gTW9kZWxIZWxwZXIuZ2V0U3RpY2t5Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1BhdGggPSBkcmFmdFJvb3RQYXRoIHx8IHNTdGlja3lSb290UGF0aDtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRpZiAoc1BhdGgpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RDb250ZXh0ID0gb1ZpZXcuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGlmICh1cGRhdGVIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IHNIaWRkZW5FeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24oZXF1YWwoZ2V0SGlkZGVuRXhwcmVzc2lvbihjb252ZXJ0ZXJDb250ZXh0LCB1cGRhdGVIaWRkZW4pLCBmYWxzZSkpO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRWRpdE1vZGVsQ29udGV4dChzSGlkZGVuRXhwcmVzc2lvbiwgb1ZpZXcsIG9Sb290Q29udGV4dCwgXCJyb290RWRpdFZpc2libGVcIiwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc0VkaXRFbmFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVFZGl0TW9kZWxDb250ZXh0KHNFZGl0RW5hYmxlQmluZGluZywgb1ZpZXcsIG9Sb290Q29udGV4dCwgXCJyb290RWRpdEVuYWJsZWRcIiwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0TW9kZWxDb250ZXh0OiBmdW5jdGlvbiAoXG5cdFx0c0JpbmRpbmdFeHByZXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0b1ZpZXc6IFZpZXcsXG5cdFx0b1Jvb3RDb250ZXh0OiBDb250ZXh0LFxuXHRcdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHRcblx0KTogdm9pZCB7XG5cdFx0aWYgKHNCaW5kaW5nRXhwcmVzc2lvbikge1xuXHRcdFx0Y29uc3Qgb0hpZGRlbkVsZW1lbnQgPSBuZXcgQW55RWxlbWVudCh7IGFueVRleHQ6IHNCaW5kaW5nRXhwcmVzc2lvbiB9KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0b1ZpZXcuYWRkRGVwZW5kZW50KG9IaWRkZW5FbGVtZW50KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LmdldEJpbmRpbmcoXCJhbnlUZXh0XCIpO1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvSGlkZGVuRWxlbWVudFxuXHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHQ/LmJpbmRDb250ZXh0KG9Sb290Q29udGV4dC5nZXRQYXRoKCksIG9Sb290Q29udGV4dCwgeyAkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIgfSlcblx0XHRcdFx0Py5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50Py5nZXRCaW5kaW5nKFwiYW55VGV4dFwiKT8uYXR0YWNoQ2hhbmdlKChvRXZlbnQ6IEV2ZW50PHt9LCBQcm9wZXJ0eUJpbmRpbmc+KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9OZXdWYWx1ZSA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzUHJvcGVydHksIG9OZXdWYWx1ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZTogZnVuY3Rpb24gKFxuXHRcdG9TZWxlY3RlZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRzQWN0aW9uOiBzdHJpbmcsXG5cdFx0c1Byb3BlcnR5OiBzdHJpbmcsXG5cdFx0YVJlcXVlc3RQcm9taXNlczogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXSB7XG5cdFx0Ly8gUmV0cmlldmUgcHJldmlvdXNseSBjaGVja2VkIGNvbnRleHRzIGluIGNhc2Ugb2YgIWZvckNvbnRleHRNZW51XG5cdFx0Y29uc3Qgc0VuYWJsZW1lbnRGaWVsZE5hbWUgPSBmb3JDb250ZXh0TWVudSA/IFwiYkVuYWJsZWRGb3JDb250ZXh0TWVudVwiIDogXCJiRW5hYmxlZFwiLFxuXHRcdFx0YUFwcGxpY2FibGU6IFtDb250ZXh0IHwgdW5kZWZpbmVkXSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hQXBwbGljYWJsZWApIHx8IFtdLFxuXHRcdFx0YU5vdEFwcGxpY2FibGU6IFtDb250ZXh0IHwgdW5kZWZpbmVkXSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hTm90QXBwbGljYWJsZWApIHx8IFtdO1xuXHRcdGxldCBiQWN0aW9uRW5hYmxlZDogYm9vbGVhbiA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS8ke3NFbmFibGVtZW50RmllbGROYW1lfWApIHx8IGZhbHNlO1xuXG5cdFx0aWYgKCFmb3JDb250ZXh0TWVudSkge1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHRiRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRcdGFBcHBsaWNhYmxlOiBbXSxcblx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHQvLyBEbyBub3QgY2hhbmdlIGVuYWJsZWQsIGFBcHBsaWNhYmxlIGFuZCBhTm90QXBwbGljYWJsZSBwcm9wZXJ0eSBpbiBjYXNlIG9mIGNvbnRleHQgbWVudSBjYWxjdWxhdGlvblxuXHRcdFx0XHQvLyBpbiBjYXNlIG9mIGNvbnRleHQgbWVudSwgb25seSB0aGUgY2xpY2tlZCBjb250ZXh0IGdvZXMgaW50byB0aGUgcHJvY2Vzc2luZyAtIG90aGVyIHNlbGVjdGVkIGNvbnRleHRzIG11c3QgYmUga2VwdCBpbiB0aGUgbW9kZWxcblx0XHRcdFx0YkVuYWJsZWQ6IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9iRW5hYmxlZGApLFxuXHRcdFx0XHRhQXBwbGljYWJsZTogb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FBcHBsaWNhYmxlYCksXG5cdFx0XHRcdGFOb3RBcHBsaWNhYmxlOiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYU5vdEFwcGxpY2FibGVgKSxcblx0XHRcdFx0YkVuYWJsZWRGb3JDb250ZXh0TWVudTogZmFsc2UsXG5cdFx0XHRcdGFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnU6IFtdLFxuXHRcdFx0XHRhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIE5vdGUgdGhhdCBub24gZHluYW1pYyBhY3Rpb25zIGFyZSBub3QgcHJvY2Vzc2VkIGhlcmUuIFRoZXkgYXJlIGVuYWJsZWQgYmVjYXVzZVxuXHRcdC8vIG9uZSBvciBtb3JlIGFyZSBzZWxlY3RlZCBhbmQgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBjb25kaXRpb24gaW4gdGhlIHRlbXBsYXRpbmdcblx0XHQvLyBpcyB0aGVuIHVuZGVmaW5lZCBhbmQgdGh1cyB0aGUgYnV0dG9uIHRha2VzIHRoZSBkZWZhdWx0IGVuYWJsaW5nLCB3aGljaCBpcyB0cnVlIVxuXHRcdGNvbnN0IHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGggPSBgJHtvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9keW5hbWljQWN0aW9ucy8ke3NBY3Rpb259LyR7c0VuYWJsZW1lbnRGaWVsZE5hbWV9YDtcblxuXHRcdGlmICh0eXBlb2Ygc1Byb3BlcnR5ID09PSBcIm9iamVjdFwiICYmIHNQcm9wZXJ0eSAhPT0gbnVsbCAmJiBzUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKG9TZWxlY3RlZENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0XHRcdFx0Y29uc3Qgb1RyYW5zZm9ybWVkQmluZGluZyA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdHNQcm9wZXJ0eSxcblx0XHRcdFx0XHRcIlBhdGhJbk1vZGVsXCIsXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuXHRcdFx0XHRcdGZ1bmN0aW9uIChvQmluZGluZ0V4cHJlc3Npb246IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxQcmltaXRpdmVUeXBlPikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0RGF0YSA/IGNvbnN0YW50KG9Db250ZXh0RGF0YVtvQmluZGluZ0V4cHJlc3Npb24ucGF0aF0pIDogY29uc3RhbnQoZmFsc2UpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBzUmVzdWx0ID0gY29tcGlsZUV4cHJlc3Npb24ob1RyYW5zZm9ybWVkQmluZGluZyk7XG5cdFx0XHRcdGJBY3Rpb25FbmFibGVkID0gYkFjdGlvbkVuYWJsZWQgfHwgc1Jlc3VsdCA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgsIGJBY3Rpb25FbmFibGVkKTtcblx0XHRcdFx0KHNSZXN1bHQgPT09IFwidHJ1ZVwiID8gYUFwcGxpY2FibGUgOiBhTm90QXBwbGljYWJsZSkucHVzaChvU2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdH1cblx0XHRcdENvbW1vblV0aWxzLnNldER5bmFtaWNBY3Rpb25Db250ZXh0cyhvSW50ZXJuYWxNb2RlbENvbnRleHQsIHNBY3Rpb24sIGFBcHBsaWNhYmxlLCBhTm90QXBwbGljYWJsZSwgZm9yQ29udGV4dE1lbnUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvU2VsZWN0ZWRDb250ZXh0Py5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0XHRcdGlmIChzUHJvcGVydHkgPT09IG51bGwgJiYgISFvQ29udGV4dERhdGFbYCMke3NBY3Rpb259YF0pIHtcblx0XHRcdFx0Ly9sb29rIGZvciBhY3Rpb24gYWR2ZXJ0aXNlbWVudCBpZiBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgbm90IG51bGxcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCkuc2V0UHJvcGVydHkoc0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9TZWxlY3RlZENvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBDb2xsZWN0IHByb21pc2VzIHRvIHJldHJpZXZlIHNpbmdsZXRvbiBvciBub3JtYWwgcHJvcGVydHkgdmFsdWUgYXN5bmNocm9ub3VzbHlcblx0XHRcdFx0YVJlcXVlc3RQcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLnJlcXVlc3RQcm9wZXJ0eShvU2VsZWN0ZWRDb250ZXh0LCBzQWN0aW9uLCBzUHJvcGVydHksIHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFSZXF1ZXN0UHJvbWlzZXM7XG5cdH1cbn07XG5leHBvcnQgZGVmYXVsdCBBY3Rpb25SdW50aW1lO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztFQXlDQSxNQUFNQSxhQUFhLEdBQUc7SUFDckI7QUFDRDtBQUNBO0FBQ0E7SUFDQ0MsNkJBQTZCLEVBQUUsU0FBQUEsQ0FBVUMsaUJBQWtGLEVBQVE7TUFDbElDLFNBQVMsQ0FBQ0MsV0FBVyxDQUNwQkYsaUJBQWlCLENBQUNHLEdBQUcsQ0FBRUMsZ0JBQWdCLElBQUs7UUFDM0MsTUFBTUMsT0FBTyxHQUFHRCxnQkFBZ0IsQ0FBQ0UsbUJBQW1CLENBQUNDLEtBQUssQ0FBQ0MsVUFBVSxDQUNwRUosZ0JBQWdCLENBQUNFLG1CQUFtQixDQUFDRyxZQUFZLEdBQUcsT0FBTyxHQUFHLE9BQy9ELENBQUM7UUFD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
313
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbml0aWFsaXplVGFibGVBY3Rpb25Qcm9wZXJ0aWVzIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJhY3Rpb24iLCJmb3JDb250ZXh0TWVudSIsInNldFByb3BlcnR5IiwiaGFuZGxlTm9TZWxlY3RlZENvbnRleHRzIiwicHJvbWlzZXMiLCJiRW5hYmxlZCIsImFBcHBsaWNhYmxlIiwiYU5vdEFwcGxpY2FibGUiLCJwdXNoIiwiQ29tbW9uVXRpbHMiLCJzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUiLCJ0aGVuIiwiaGFuZGxlU2VsZWN0ZWRDb250ZXh0cyIsInJlcXVlc3RQcm9taXNlcyIsImhhbmRsZVRhYmxlQ29udGV4dHMiLCJzZWxlY3RlZENvbnRleHRzIiwicHJvcGVydHkiLCJsZW5ndGgiLCJBY3Rpb25SdW50aW1lIiwiX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIiLCJtZXNzYWdlUGFyYW1ldGVycyIsIk1lc3NhZ2luZyIsImFkZE1lc3NhZ2VzIiwibWFwIiwibWVzc2FnZVBhcmFtZXRlciIsImJpbmRpbmciLCJhY3Rpb25QYXJhbWV0ZXJJbmZvIiwiZmllbGQiLCJnZXRCaW5kaW5nIiwiaXNNdWx0aVZhbHVlIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJ0eXBlIiwiTWVzc2FnZVR5cGUiLCJFcnJvciIsInByb2Nlc3NvciIsImdldE1vZGVsIiwidW5kZWZpbmVkIiwicGVyc2lzdGVudCIsInRhcmdldCIsImdldFJlc29sdmVkUGF0aCIsInZhbGlkYXRlUHJvcGVydGllcyIsImFjdGlvblBhcmFtZXRlckluZm9zIiwicmVzb3VyY2VNb2RlbCIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwidmFsaWRhdGlvblByb21pc2UiLCJyZXF1aXJlZFBhcmFtZXRlckluZm9zIiwiZmlsdGVyIiwicGFyYW1ldGVySW5mbyIsImdldFJlcXVpcmVkIiwiYWxsTWVzc2FnZXMiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZW1wdHlSZXF1aXJlZEZpZWxkcyIsInJlcXVpcmVkUGFyYW1ldGVySW5mbyIsImZpZWxkSWQiLCJnZXRJZCIsInJlbGV2YW50TWVzc2FnZXMiLCJtc2ciLCJnZXRDb250cm9sSWRzIiwic29tZSIsImNvbnRyb2xJZCIsImluY2x1ZGVzIiwidmFsdWUiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJpc0ZpZWxkQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRUZXh0IiwiZ2V0UGFyZW50IiwiZ2V0QWdncmVnYXRpb24iLCJmaXJzdEludmFsaWRQYXJhbWV0ZXIiLCJmaW5kIiwiZ2V0VmlzaWJsZSIsImhhc0Vycm9yIiwiZ2V0VmFsdWVTdGF0ZSIsInNldFZpc2libGUiLCJmb2N1cyIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJzQ29udHJvbCIsImFyZ3VtZW50cyIsImFQcm9taXNlcyIsInNBY3Rpb24iLCJhUmVxdWVzdFByb21pc2VzIiwic1Byb3BlcnR5Iiwic2VsZWN0ZWRDb250ZXh0Iiwib0NvbnRleHREYXRhIiwiZ2V0T2JqZWN0IiwiX3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZSIsImdldFByb3BlcnR5IiwiYWxsIiwicmVzdWx0cyIsImZsYXQiLCJzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaCIsIm9WaWV3Iiwib0xpc3RCaW5kaW5nIiwib0ludGVybmFsTW9kZWxDb250ZXh0RGF0YSIsIm9Db250cm9scyIsImNvbnRyb2xzIiwic0tleSIsIm9UYWJsZSIsImJ5SWQiLCJpc0EiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJ0YWJsZUFQSSIsImdldEJpbmRpbmdDb250ZXh0IiwiSlNPTiIsInBhcnNlIiwidGFibGVEZWZpbml0aW9uIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInVwZGF0ZUVkaXRCdXR0b25WaXNpYmlsaXR5QW5kRW5hYmxlbWVudCIsImlWaWV3TGV2ZWwiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsImlzRWRpdGFibGUiLCJnZXRJc0VkaXRhYmxlIiwib0NvbnRleHQiLCJvQXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50Iiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzRW50aXR5U2V0IiwiZ2V0Um9vdEVudGl0eVNldFBhdGgiLCJtZXRhQ29udGV4dCIsImdldE1ldGFNb2RlbCIsImdldENvbnRleHQiLCJnZXRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIkNvbnZlcnRlckNvbnRleHQiLCJjcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8iLCJnZXREaWFnbm9zdGljcyIsIm1lcmdlIiwiZW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0IiwiZW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJ1cGRhdGVIaWRkZW4iLCJiVXBkYXRlSGlkZGVuIiwiaXNFbnRpdHlTZXQiLCJhbm5vdGF0aW9ucyIsIlVJIiwiVXBkYXRlSGlkZGVuIiwidmFsdWVPZiIsImlzVXBkYXRlSGlkZGVuIiwic0VkaXRFbmFibGVCaW5kaW5nIiwiZ2V0RWRpdEJ1dHRvbkVuYWJsZWQiLCJkcmFmdFJvb3RQYXRoIiwiZ2V0RHJhZnRSb290UGF0aCIsInNTdGlja3lSb290UGF0aCIsImdldFN0aWNreVJvb3RQYXRoIiwic1BhdGgiLCJvUm9vdENvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsInNIaWRkZW5FeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJlcXVhbCIsImdldEhpZGRlbkV4cHJlc3Npb24iLCJ1cGRhdGVFZGl0TW9kZWxDb250ZXh0Iiwic0JpbmRpbmdFeHByZXNzaW9uIiwib0hpZGRlbkVsZW1lbnQiLCJBbnlFbGVtZW50IiwiYW55VGV4dCIsInNldEJpbmRpbmdDb250ZXh0IiwiYWRkRGVwZW5kZW50IiwiJCRncm91cElkIiwiYXR0YWNoQ2hhbmdlIiwib0V2ZW50Iiwib05ld1ZhbHVlIiwiZ2V0U291cmNlIiwiZ2V0RXh0ZXJuYWxWYWx1ZSIsIm9TZWxlY3RlZENvbnRleHQiLCJzRW5hYmxlbWVudEZpZWxkTmFtZSIsImJBY3Rpb25FbmFibGVkIiwiYkVuYWJsZWRGb3JDb250ZXh0TWVudSIsImFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnUiLCJhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51Iiwic0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCIsIm9UcmFuc2Zvcm1lZEJpbmRpbmciLCJ0cmFuc2Zvcm1SZWN1cnNpdmVseSIsIm9CaW5kaW5nRXhwcmVzc2lvbiIsImNvbnN0YW50IiwicGF0aCIsInNSZXN1bHQiLCJzZXREeW5hbWljQWN0aW9uQ29udGV4dHMiLCJyZXF1ZXN0UHJvcGVydHkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkFjdGlvblJ1bnRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb25QYXJhbWV0ZXIgYXMgRWRtQWN0aW9uUGFyYW1ldGVyLCBQcmltaXRpdmVUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIHsgUGF0aEluTW9kZWxFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgY29uc3RhbnQsIGVxdWFsLCB0cmFuc2Zvcm1SZWN1cnNpdmVseSB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgX1JlcXVlc3RlZFByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IHR5cGUgTGFiZWwgZnJvbSBcInNhcC9tL0xhYmVsXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIFByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL1Byb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBGaWxlVXBsb2FkZXIgZnJvbSBcInNhcC91aS91bmlmaWVkL0ZpbGVVcGxvYWRlclwiO1xuaW1wb3J0IEFueUVsZW1lbnQgZnJvbSBcIi4vY29udHJvbHMvQW55RWxlbWVudFwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4vY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcIi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBnZXRFZGl0QnV0dG9uRW5hYmxlZCwgZ2V0SGlkZGVuRXhwcmVzc2lvbiB9IGZyb20gXCIuL2NvbnZlcnRlcnMvb2JqZWN0UGFnZS9IZWFkZXJBbmRGb290ZXJBY3Rpb25cIjtcblxuZXhwb3J0IHR5cGUgQWN0aW9uUGFyYW1ldGVySW5mbyA9IHtcblx0cGFyYW1ldGVyPzogRWRtQWN0aW9uUGFyYW1ldGVyO1xuXHRmaWVsZDogRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWxlVXBsb2FkZXI7XG5cdGlzTXVsdGlWYWx1ZTogYm9vbGVhbjtcblx0dmFsdWU/OiBzdHJpbmcgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHR2YWxpZGF0aW9uUHJvbWlzZT86IFByb21pc2U8c3RyaW5nIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPjtcblx0aGFzRXJyb3I6IGJvb2xlYW47XG5cdHByb3BlcnR5UGF0aD86IHN0cmluZztcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgb2YgYSB0YWJsZSBhY3Rpb24gaW4gdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQuXG4gKiBAcGFyYW0gaW50ZXJuYWxNb2RlbENvbnRleHQgVGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgd2hlcmUgdGhlIGFjdGlvbiBwcm9wZXJ0aWVzIGFyZSBzZXQuXG4gKiBAcGFyYW0gYWN0aW9uIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gZm9yIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluaXRpYWxpemVkLlxuICogQHBhcmFtIGZvckNvbnRleHRNZW51IEluZGljYXRlcyBpZiB0aGUgYWN0aW9uIGlzIGZvciBhIGNvbnRleHQgbWVudS5cbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZVRhYmxlQWN0aW9uUHJvcGVydGllcyhpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsIGFjdGlvbjogc3RyaW5nLCBmb3JDb250ZXh0TWVudTogYm9vbGVhbik6IHZvaWQge1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHthY3Rpb259L2FBcHBsaWNhYmxlYCwgW10pO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHthY3Rpb259L2FOb3RBcHBsaWNhYmxlYCwgW10pO1xuXHRpZiAoZm9yQ29udGV4dE1lbnUpIHtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHthY3Rpb259L2JFbmFibGVkRm9yQ29udGV4dE1lbnVgLCBmYWxzZSk7XG5cdH0gZWxzZSB7XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7YWN0aW9ufS9iRW5hYmxlZGAsIGZhbHNlKTtcblx0fVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBubyBjb250ZXh0cyBhcmUgc2VsZWN0ZWQgZm9yIGFuIGFjdGlvbi5cbiAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsQ29udGV4dCBUaGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCB3aGVyZSB0aGUgYWN0aW9uIHByb3BlcnRpZXMgYXJlIHNldC5cbiAqIEBwYXJhbSBhY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiBmb3Igd2hpY2ggcHJvcGVydGllcyBhcmUgaW5pdGlhbGl6ZWQuXG4gKiBAcGFyYW0gcHJvbWlzZXMgQW4gYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYWZ0ZXIgc2V0dGluZyB0aGUgYWN0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgSW5kaWNhdGVzIGlmIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgY29udGV4dCBtZW51LiBJZiBmYWxzZSwgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSB0YWJsZSB0b29sYmFyLlxuICovXG5mdW5jdGlvbiBoYW5kbGVOb1NlbGVjdGVkQ29udGV4dHMoXG5cdGludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0YWN0aW9uOiBzdHJpbmcsXG5cdHByb21pc2VzOiBQcm9taXNlPHZvaWRbXT5bXSxcblx0Zm9yQ29udGV4dE1lbnU6IGJvb2xlYW5cbik6IHZvaWQge1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHthY3Rpb259YCwge1xuXHRcdGJFbmFibGVkOiBmYWxzZSxcblx0XHRhQXBwbGljYWJsZTogW10sXG5cdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdH0pO1xuXHRwcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLnNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZShpbnRlcm5hbE1vZGVsQ29udGV4dCwgW10sIGZvckNvbnRleHRNZW51KS50aGVuKCgpID0+IFtdKSk7XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgY2FzZSB3aGVuIGNvbnRleHRzIGFyZSBzZWxlY3RlZCBmb3IgYW4gYWN0aW9uLlxuICogQHBhcmFtIGludGVybmFsTW9kZWxDb250ZXh0IFRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHdoZXJlIHRoZSBhY3Rpb24gcHJvcGVydGllcyBhcmUgc2V0LlxuICogQHBhcmFtIHJlcXVlc3RQcm9taXNlcyBBbiBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBhZnRlciBzZXR0aW5nIHRoZSBhY3Rpb24gcHJvcGVydGllcy5cbiAqIEBwYXJhbSBwcm9taXNlc1x0QW4gYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYWZ0ZXIgc2V0dGluZyB0aGUgYWN0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgSW5kaWNhdGVzIGlmIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgY29udGV4dCBtZW51LiBJZiBmYWxzZSwgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSB0YWJsZSB0b29sYmFyLlxuICovXG5mdW5jdGlvbiBoYW5kbGVTZWxlY3RlZENvbnRleHRzKFxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdHJlcXVlc3RQcm9taXNlczogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10sXG5cdHByb21pc2VzOiBQcm9taXNlPHZvaWRbXT5bXSxcblx0Zm9yQ29udGV4dE1lbnU6IGJvb2xlYW5cbik6IHZvaWQge1xuXHRwcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLnNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZShpbnRlcm5hbE1vZGVsQ29udGV4dCwgcmVxdWVzdFByb21pc2VzLCBmb3JDb250ZXh0TWVudSkudGhlbigoKSA9PiBbXSkpO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGFjdGlvbiBlbmFibGVtZW50IGZvciB0YWJsZSBjb250ZXh0cy5cbiAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHRzICBTZWxlY3RlZCBjb250ZXh0cyBmb3IgdGhlIGFjdGlvbi5cbiAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsQ29udGV4dCBcdEludGVybmFsIG1vZGVsIGNvbnRleHQgd2hlcmUgdGhlIGFjdGlvbiBwcm9wZXJ0aWVzIGFyZSBzZXQuXG4gKiBAcGFyYW0gYWN0aW9uIE5hbWUgb2YgdGhlIGFjdGlvbiBmb3Igd2hpY2ggcHJvcGVydGllcyBhcmUgaW5pdGlhbGl6ZWQuXG4gKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gYmUgY2hlY2tlZCBmb3IgdGhlIGFjdGlvbi5cbiAqIEBwYXJhbSByZXF1ZXN0UHJvbWlzZXMgUHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYWZ0ZXIgc2V0dGluZyB0aGUgYWN0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgVHJ1ZSBpZiB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIGNvbnRleHQgbWVudSwgZmFsc2UgaWYgaXQgYXBwZWFycyBpbiB0aGUgdGFibGUgdG9vbGJhci5cbiAqIEBwYXJhbSBwcm9taXNlcyBQ4oCacm9taXNlcyB0byBiZSByZXNvbHZlZCBhZnRlciBzZXR0aW5nIHRoZSBhY3Rpb24gcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlVGFibGVDb250ZXh0cyhcblx0c2VsZWN0ZWRDb250ZXh0czogQ29udGV4dFtdLFxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdGFjdGlvbjogc3RyaW5nLFxuXHRwcm9wZXJ0eTogc3RyaW5nLFxuXHRyZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdLFxuXHRmb3JDb250ZXh0TWVudTogYm9vbGVhbixcblx0cHJvbWlzZXM6IFByb21pc2U8dm9pZFtdPltdXG4pOiB2b2lkIHtcblx0aWYgKCFzZWxlY3RlZENvbnRleHRzLmxlbmd0aCkge1xuXHRcdGhhbmRsZU5vU2VsZWN0ZWRDb250ZXh0cyhpbnRlcm5hbE1vZGVsQ29udGV4dCwgYWN0aW9uLCBwcm9taXNlcywgZm9yQ29udGV4dE1lbnUpO1xuXHR9IGVsc2UgaWYgKHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoICYmIHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGhhbmRsZVNlbGVjdGVkQ29udGV4dHMoaW50ZXJuYWxNb2RlbENvbnRleHQsIHJlcXVlc3RQcm9taXNlcywgcHJvbWlzZXMsIGZvckNvbnRleHRNZW51KTtcblx0fVxufVxuXG5jb25zdCBBY3Rpb25SdW50aW1lID0ge1xuXHQvKipcblx0ICogQWRkcyBlcnJvciBtZXNzYWdlcyBmb3IgYW4gYWN0aW9uIHBhcmFtZXRlciBmaWVsZCB0byB0aGUgbWVzc2FnZSBtYW5hZ2VyLlxuXHQgKiBAcGFyYW0gbWVzc2FnZVBhcmFtZXRlcnMgSW5mb3JtYXRpb24gaWRlbnRpZnlpbmcgYW4gYWN0aW9uIHBhcmFtZXRlciBhbmQgbWVzc2FnZXMgcmVmZXJyaW5nIHRvIHRoaXMgcGFyYW1ldGVyXG5cdCAqL1xuXHRfYWRkTWVzc2FnZUZvckFjdGlvblBhcmFtZXRlcjogZnVuY3Rpb24gKG1lc3NhZ2VQYXJhbWV0ZXJzOiB7IGFjdGlvblBhcmFtZXRlckluZm86IEFjdGlvblBhcmFtZXRlckluZm87IG1lc3NhZ2U6IHN0cmluZyB9W10pOiB2b2lkIHtcblx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoXG5cdFx0XHRtZXNzYWdlUGFyYW1ldGVycy5tYXAoKG1lc3NhZ2VQYXJhbWV0ZXIpID0+IHtcblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5nZXRCaW5kaW5nKFxuXHRcdFx0XHRcdG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5pc011bHRpVmFsdWUgPyBcIml0ZW1zXCIgOiBcInZhbHVlXCJcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBtZXNzYWdlUGFyYW1ldGVyLm1lc3NhZ2UsXG5cdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0cHJvY2Vzc29yOiBiaW5kaW5nPy5nZXRNb2RlbCgpID8/IHVuZGVmaW5lZCwgLy8gZ2V0TW9kZWwoKTogbnVsbCB8IE1vZGVsIH5+PiBwcm9jZXNzb3I/OiBNZXNzYWdlUHJvY2Vzc29yXG5cdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHR0YXJnZXQ6IGJpbmRpbmc/LmdldFJlc29sdmVkUGF0aCgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGFjdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW4gZGF0YSBhbmQgY2hlY2tzIGZvciBhbGwgYWN0aW9uIHBhcmFtZXRlcnMgaWYgdGhlXG5cdCAqIGNvbnRhaW5lZCBkYXRhIGlzIHZhbGlkLlxuXHQgKiBAcGFyYW0gYWN0aW9uUGFyYW1ldGVySW5mb3MgSW5mb3JtYXRpb24gaWRlbnRpZnlpbmcgYW4gYWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGlvbiByZXN1bHQgY2FuIGJlIHRydWUgb3IgZmFsc2Vcblx0ICovXG5cdHZhbGlkYXRlUHJvcGVydGllczogYXN5bmMgZnVuY3Rpb24gKGFjdGlvblBhcmFtZXRlckluZm9zOiBBY3Rpb25QYXJhbWV0ZXJJbmZvW10sIHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG5cdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvcy5tYXAoXG5cdFx0XHRcdChhY3Rpb25QYXJhbWV0ZXJJbmZvKTogUHJvbWlzZTxzdHJpbmcgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+IHwgdW5kZWZpbmVkID0+IGFjdGlvblBhcmFtZXRlckluZm8udmFsaWRhdGlvblByb21pc2Vcblx0XHRcdClcblx0XHQpO1xuXG5cdFx0Y29uc3QgcmVxdWlyZWRQYXJhbWV0ZXJJbmZvcyA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbHRlcihcblx0XHRcdChwYXJhbWV0ZXJJbmZvKSA9PlxuXHRcdFx0XHQocGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCkuZ2V0UmVxdWlyZWQgJiZcblx0XHRcdFx0KHBhcmFtZXRlckluZm8uZmllbGQgYXMgRmllbGQgfCBNdWx0aVZhbHVlRmllbGQpLmdldFJlcXVpcmVkKClcblx0XHQpO1xuXG5cdFx0Y29uc3QgYWxsTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IGVtcHR5UmVxdWlyZWRGaWVsZHMgPSByZXF1aXJlZFBhcmFtZXRlckluZm9zLmZpbHRlcigocmVxdWlyZWRQYXJhbWV0ZXJJbmZvKSA9PiB7XG5cdFx0XHRjb25zdCBmaWVsZElkID0gcmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmZpZWxkLmdldElkKCk7XG5cdFx0XHRjb25zdCByZWxldmFudE1lc3NhZ2VzID0gYWxsTWVzc2FnZXMuZmlsdGVyKChtc2c6IE1lc3NhZ2UpID0+XG5cdFx0XHRcdG1zZy5nZXRDb250cm9sSWRzKCkuc29tZSgoY29udHJvbElkOiBzdHJpbmcpID0+IGNvbnRyb2xJZC5pbmNsdWRlcyhmaWVsZElkKSlcblx0XHRcdCk7XG5cdFx0XHRpZiAocmVsZXZhbnRNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAocmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmlzTXVsdGlWYWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gcmVxdWlyZWRQYXJhbWV0ZXJJbmZvLnZhbHVlID09PSB1bmRlZmluZWQgfHwgIXJlcXVpcmVkUGFyYW1ldGVySW5mby52YWx1ZS5sZW5ndGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmaWVsZFZhbHVlID0gKHJlcXVpcmVkUGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCkuZ2V0VmFsdWUoKTtcblx0XHRcdFx0Y29uc3QgaXNGaWVsZEFycmF5ID0gQXJyYXkuaXNBcnJheSgocmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkKS5nZXRWYWx1ZSgpKTtcblx0XHRcdFx0aWYgKGlzRmllbGRBcnJheSkge1xuXHRcdFx0XHRcdC8vIG9ubHkgZmlyc3QgdmFsdWUgY2hlY2sgaXMgZW5vdWdoIGFzIHRoZSBmaWVsZCB2YWx1ZSBjb21lcyBvbiBbMF0gcmVzdCBvZiB0aGUgYXJyYXkgaW5jbHVkZXMgY3VycmVuY3kgYW5kIGN1cnJlbmN5IGNvZGVcblx0XHRcdFx0XHQvLyBib3RoIG9mIHdoaWNoIGNhbiBvciBjYW5ub3QgYmUgbnVsbCwgc28gd2Ugc2hhbGwgY2hlY2sgb25seSB0aGUgZmllbGQgdmFsdWVcblx0XHRcdFx0XHRyZXR1cm4gZmllbGRWYWx1ZVswXSA9PT0gbnVsbCB8fCBmaWVsZFZhbHVlWzBdID09PSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmaWVsZFZhbHVlID09PSB1bmRlZmluZWQgfHwgZmllbGRWYWx1ZSA9PT0gbnVsbCB8fCBmaWVsZFZhbHVlID09PSBcIlwiO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8qIE1lc3NhZ2UgZm9yIG1pc3NpbmcgbWFuZGF0b3J5IHZhbHVlIG9mIHRoZSBhY3Rpb24gcGFyYW1ldGVyICovXG5cdFx0aWYgKGVtcHR5UmVxdWlyZWRGaWVsZHMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLl9hZGRNZXNzYWdlRm9yQWN0aW9uUGFyYW1ldGVyKFxuXHRcdFx0XHRlbXB0eVJlcXVpcmVkRmllbGRzLm1hcCgoYWN0aW9uUGFyYW1ldGVySW5mbykgPT4gKHtcblx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvOiBhY3Rpb25QYXJhbWV0ZXJJbmZvLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19NSVNTSU5HX01BTkRBVE9SWV9NU0dcIiwgW1xuXHRcdFx0XHRcdFx0KGFjdGlvblBhcmFtZXRlckluZm8uZmllbGQuZ2V0UGFyZW50KCk/LmdldEFnZ3JlZ2F0aW9uKFwibGFiZWxcIikgYXMgTGFiZWwpLmdldFRleHQoKVxuXHRcdFx0XHRcdF0pXG5cdFx0XHRcdH0pKVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0LyogQ2hlY2sgdmFsdWUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMgKi9cblx0XHRjb25zdCBmaXJzdEludmFsaWRQYXJhbWV0ZXIgPSBhY3Rpb25QYXJhbWV0ZXJJbmZvcy5maW5kKFxuXHRcdFx0KHBhcmFtZXRlckluZm8pID0+XG5cdFx0XHRcdHBhcmFtZXRlckluZm8uZmllbGQuZ2V0VmlzaWJsZSgpICYmXG5cdFx0XHRcdChwYXJhbWV0ZXJJbmZvLmhhc0Vycm9yIHx8IHBhcmFtZXRlckluZm8uZmllbGQuZ2V0VmFsdWVTdGF0ZSgpID09PSBcIkVycm9yXCIgfHwgZW1wdHlSZXF1aXJlZEZpZWxkcy5pbmNsdWRlcyhwYXJhbWV0ZXJJbmZvKSlcblx0XHQpO1xuXHRcdGlmIChmaXJzdEludmFsaWRQYXJhbWV0ZXIpIHtcblx0XHRcdGZpcnN0SW52YWxpZFBhcmFtZXRlci5maWVsZC5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0Zmlyc3RJbnZhbGlkUGFyYW1ldGVyLmZpZWxkLmZvY3VzKCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyB0aGUgYWN0aW9uIGVuYWJsZW1lbnQuXG5cdCAqIEBwYXJhbSBvSW50ZXJuYWxNb2RlbENvbnRleHQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNvbnRleHQgbW9kZWxcblx0ICogQHBhcmFtIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgTWFwIGNvbnRhaW5pbmcgdGhlIG9wZXJhdGlvbiBhdmFpbGFiaWxpdHkgb2YgYWN0aW9uc1xuXHQgKiBAcGFyYW0gYVNlbGVjdGVkQ29udGV4dHMgQXJyYXkgY29udGFpbmluZyBzZWxlY3RlZCBjb250ZXh0cyBvZiB0aGUgY2hhcnRcblx0ICogQHBhcmFtIHNDb250cm9sIENvbnRyb2wgbmFtZVxuXHQgKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgSW5kaWNhdGVzIGlmIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgY29udGV4dCBtZW51LiBJZiBmYWxzZSwgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSB0YWJsZSB0b29sYmFyXG5cdCAqIEByZXR1cm5zIFRoZSBhY3Rpb24gZW5hYmxlbWVudCBwcm9taXNlc1xuXHQgKi9cblx0c2V0QWN0aW9uRW5hYmxlbWVudDogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0b0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcblx0XHRhU2VsZWN0ZWRDb250ZXh0czogQ29udGV4dFtdLFxuXHRcdHNDb250cm9sOiBzdHJpbmcsXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiBQcm9taXNlPHZvaWRbXT4ge1xuXHRcdGNvbnN0IGFQcm9taXNlczogUHJvbWlzZTx2b2lkW10+W10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHNBY3Rpb24gaW4gb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCkge1xuXHRcdFx0bGV0IGFSZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdID0gW107XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoc0FjdGlvbiwgZmFsc2UpO1xuXHRcdFx0aWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0aW5pdGlhbGl6ZVRhYmxlQWN0aW9uUHJvcGVydGllcyhvSW50ZXJuYWxNb2RlbENvbnRleHQsIHNBY3Rpb24sIGZvckNvbnRleHRNZW51KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNQcm9wZXJ0eSA9IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXBbc0FjdGlvbl07XG5cdFx0XHRmb3IgKGNvbnN0IHNlbGVjdGVkQ29udGV4dCBvZiBhU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2VsZWN0ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0XHRcdGlmIChzQ29udHJvbCA9PT0gXCJjaGFydFwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoKHNQcm9wZXJ0eSA9PT0gbnVsbCAmJiAhIW9Db250ZXh0RGF0YVtgIyR7c0FjdGlvbn1gXSkgfHwgc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRcdC8vbG9vayBmb3IgYWN0aW9uIGFkdmVydGlzZW1lbnQgaWYgcHJlc2VudCBhbmQgaXRzIHZhbHVlIGlzIG5vdCBudWxsXG5cdFx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzQWN0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzQ29udHJvbCA9PT0gXCJ0YWJsZVwiKSB7XG5cdFx0XHRcdFx0XHRhUmVxdWVzdFByb21pc2VzID0gdGhpcy5fc2V0QWN0aW9uRW5hYmxlbWVudEZvclRhYmxlKFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0c0FjdGlvbixcblx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRhUmVxdWVzdFByb21pc2VzLFxuXHRcdFx0XHRcdFx0XHRmb3JDb250ZXh0TWVudVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0aGFuZGxlVGFibGVDb250ZXh0cyhcblx0XHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0c0FjdGlvbixcblx0XHRcdFx0XHRzUHJvcGVydHksXG5cdFx0XHRcdFx0YVJlcXVlc3RQcm9taXNlcyxcblx0XHRcdFx0XHRmb3JDb250ZXh0TWVudSxcblx0XHRcdFx0XHRhUHJvbWlzZXNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gdHJpZ2dlciBhbiBleHBsaWNpdCByZWZyZXNoIG9mIHRoZSBzZWxlY3RlZCBjb250ZXh0IHRvIHVwZGF0ZVxuXHRcdFx0Ly8gYWxzbyB0aGUgY29udGV4dHMgaW4gY2FzZSBvZiBjdXN0b20gYWN0aW9uc1xuXHRcdFx0Y29uc3Qgc2VsZWN0ZWRDb250ZXh0cyA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIikgfHwgW107XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIFtdKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIiwgc2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFQcm9taXNlcykudGhlbigocmVzdWx0cykgPT4gcmVzdWx0cy5mbGF0KCkpO1xuXHR9LFxuXHRzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaDogZnVuY3Rpb24gKFxuXHRcdG9WaWV3OiBWaWV3LFxuXHRcdG9MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dERhdGEgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQ/LmdldE9iamVjdCgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdGNvbnN0IG9Db250cm9scyA9IChvSW50ZXJuYWxNb2RlbENvbnRleHREYXRhPy5jb250cm9scyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgeyBjb250cm9sSWQ/OiBzdHJpbmcgfT47XG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIG9Db250cm9scykge1xuXHRcdFx0aWYgKG9Db250cm9sc1tzS2V5XSAmJiBvQ29udHJvbHNbc0tleV0uY29udHJvbElkKSB7XG5cdFx0XHRcdGNvbnN0IG9UYWJsZSA9IG9WaWV3LmJ5SWQoc0tleSk7XG5cdFx0XHRcdGlmIChvVGFibGUgJiYgb1RhYmxlLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1Jvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRcdGlmIChvUm93QmluZGluZyA9PSBvTGlzdEJpbmRpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gb1RhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdFx0XHRvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZSh0YWJsZUFQSS50YWJsZURlZmluaXRpb24ub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRcdFx0b1RhYmxlLmdldFNlbGVjdGVkQ29udGV4dHMoKSBhcyBDb250ZXh0W10sXG5cdFx0XHRcdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0dXBkYXRlRWRpdEJ1dHRvblZpc2liaWxpdHlBbmRFbmFibGVtZW50KG9WaWV3OiBGRVZpZXcpOiB2b2lkIHtcblx0XHRjb25zdCBpVmlld0xldmVsID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3MpPy52aWV3TGV2ZWwsXG5cdFx0XHRpc0VkaXRhYmxlID0gQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZShvVmlldyk7XG5cdFx0aWYgKChpVmlld0xldmVsIGFzIG51bWJlcikgPiAxICYmIGlzRWRpdGFibGUgIT09IHRydWUpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWV0YVBhdGhGb3JDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBNb2RlbEhlbHBlci5nZXRSb290RW50aXR5U2V0UGF0aChzTWV0YVBhdGgpO1xuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBvQ29udGV4dFxuXHRcdFx0XHQ/LmdldE1vZGVsKClcblx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdD8uZ2V0Q29udGV4dChvQ29udGV4dD8uZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IGNvbnZlcnRlckNvbnRleHQgPSBDb252ZXJ0ZXJDb250ZXh0Py5jcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8oXG5cdFx0XHRcdHNFbnRpdHlTZXQsXG5cdFx0XHRcdG1ldGFDb250ZXh0LFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldERpYWdub3N0aWNzKCksXG5cdFx0XHRcdG1lcmdlXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRcdGxldCB1cGRhdGVIaWRkZW47XG5cdFx0XHQvL0ZpbmQgdGhlIFVwZGF0ZSBIaWRkZW4gb2YgdGhlIHJvb3QgZW50aXR5IHNldCBhbmQgYmluZCB0aGUgcHJvcGVydHkgdG8gQW55RWxlbWVudCwgYW55IGNoYW5nZXMgaW4gdGhlIHBhdGggb2YgdGhlIHJvb3QgVXBkYXRlSGlkZGVuIHdpbGwgYmUgdXBkYXRlZCB2aWEgdGhlIHByb3BlcnR5LCBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IGlzIHVwZGF0ZWQgYmFzZWQgb24gdGhlIHByb3BlcnR5XG5cdFx0XHRjb25zdCBiVXBkYXRlSGlkZGVuID0gaXNFbnRpdHlTZXQoZW50aXR5U2V0KSAmJiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlbj8udmFsdWVPZigpO1xuXHRcdFx0aWYgKGJVcGRhdGVIaWRkZW4gIT09IHRydWUpIHtcblx0XHRcdFx0dXBkYXRlSGlkZGVuID0gTW9kZWxIZWxwZXIuaXNVcGRhdGVIaWRkZW4oZW50aXR5U2V0LCBlbnRpdHlUeXBlKTtcblx0XHRcdH1cblx0XHRcdC8vRmluZCB0aGUgb3BlcmF0aW9uIGF2YWlsYWJsZSBwcm9wZXJ0eSBvZiB0aGUgcm9vdCBlZGl0IGNvbmZpZ3VyYXRpb24gYW5kIGZldGNoIHRoZSBwcm9wZXJ0eSB1c2luZyBBbnlFbGVtZW50XG5cdFx0XHRjb25zdCBzRWRpdEVuYWJsZUJpbmRpbmcgPSBnZXRFZGl0QnV0dG9uRW5hYmxlZChjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGNvbnN0IGRyYWZ0Um9vdFBhdGggPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHNTdGlja3lSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldFN0aWNreVJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHNQYXRoID0gZHJhZnRSb290UGF0aCB8fCBzU3RpY2t5Um9vdFBhdGg7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0aWYgKHNQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290Q29udGV4dCA9IG9WaWV3LmdldE1vZGVsKCkuYmluZENvbnRleHQoc1BhdGgpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRpZiAodXBkYXRlSGlkZGVuICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb25zdCBzSGlkZGVuRXhwcmVzc2lvbiA9IGNvbXBpbGVFeHByZXNzaW9uKGVxdWFsKGdldEhpZGRlbkV4cHJlc3Npb24oY29udmVydGVyQ29udGV4dCwgdXBkYXRlSGlkZGVuKSwgZmFsc2UpKTtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZUVkaXRNb2RlbENvbnRleHQoc0hpZGRlbkV4cHJlc3Npb24sIG9WaWV3LCBvUm9vdENvbnRleHQsIFwicm9vdEVkaXRWaXNpYmxlXCIsIG9JbnRlcm5hbE1vZGVsQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNFZGl0RW5hYmxlQmluZGluZykge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRWRpdE1vZGVsQ29udGV4dChzRWRpdEVuYWJsZUJpbmRpbmcsIG9WaWV3LCBvUm9vdENvbnRleHQsIFwicm9vdEVkaXRFbmFibGVkXCIsIG9JbnRlcm5hbE1vZGVsQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0dXBkYXRlRWRpdE1vZGVsQ29udGV4dDogZnVuY3Rpb24gKFxuXHRcdHNCaW5kaW5nRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdG9WaWV3OiBWaWV3LFxuXHRcdG9Sb290Q29udGV4dDogQ29udGV4dCxcblx0XHRzUHJvcGVydHk6IHN0cmluZyxcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0XG5cdCk6IHZvaWQge1xuXHRcdGlmIChzQmluZGluZ0V4cHJlc3Npb24pIHtcblx0XHRcdGNvbnN0IG9IaWRkZW5FbGVtZW50ID0gbmV3IEFueUVsZW1lbnQoeyBhbnlUZXh0OiBzQmluZGluZ0V4cHJlc3Npb24gfSk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudC5zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdG9WaWV3LmFkZERlcGVuZGVudChvSGlkZGVuRWxlbWVudCk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudC5nZXRCaW5kaW5nKFwiYW55VGV4dFwiKTtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gb0hpZGRlbkVsZW1lbnRcblx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0Py5iaW5kQ29udGV4dChvUm9vdENvbnRleHQuZ2V0UGF0aCgpLCBvUm9vdENvbnRleHQsIHsgJCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiIH0pXG5cdFx0XHRcdD8uZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudD8uZ2V0QmluZGluZyhcImFueVRleHRcIik/LmF0dGFjaENoYW5nZSgob0V2ZW50OiBFdmVudDx7fSwgUHJvcGVydHlCaW5kaW5nPikgPT4ge1xuXHRcdFx0XHRjb25zdCBvTmV3VmFsdWUgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0RXh0ZXJuYWxWYWx1ZSgpO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoc1Byb3BlcnR5LCBvTmV3VmFsdWUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdF9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGU6IGZ1bmN0aW9uIChcblx0XHRvU2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0c0FjdGlvbjogc3RyaW5nLFxuXHRcdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGFSZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdLFxuXHRcdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcblx0KTogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10ge1xuXHRcdC8vIFJldHJpZXZlIHByZXZpb3VzbHkgY2hlY2tlZCBjb250ZXh0cyBpbiBjYXNlIG9mICFmb3JDb250ZXh0TWVudVxuXHRcdGNvbnN0IHNFbmFibGVtZW50RmllbGROYW1lID0gZm9yQ29udGV4dE1lbnUgPyBcImJFbmFibGVkRm9yQ29udGV4dE1lbnVcIiA6IFwiYkVuYWJsZWRcIixcblx0XHRcdGFBcHBsaWNhYmxlOiBbQ29udGV4dCB8IHVuZGVmaW5lZF0gPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYUFwcGxpY2FibGVgKSB8fCBbXSxcblx0XHRcdGFOb3RBcHBsaWNhYmxlOiBbQ29udGV4dCB8IHVuZGVmaW5lZF0gPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYU5vdEFwcGxpY2FibGVgKSB8fCBbXTtcblx0XHRsZXQgYkFjdGlvbkVuYWJsZWQ6IGJvb2xlYW4gPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vJHtzRW5hYmxlbWVudEZpZWxkTmFtZX1gKSB8fCBmYWxzZTtcblxuXHRcdGlmICghZm9yQ29udGV4dE1lbnUpIHtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufWAsIHtcblx0XHRcdFx0YkVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRhQXBwbGljYWJsZTogW10sXG5cdFx0XHRcdGFOb3RBcHBsaWNhYmxlOiBbXVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufWAsIHtcblx0XHRcdFx0Ly8gRG8gbm90IGNoYW5nZSBlbmFibGVkLCBhQXBwbGljYWJsZSBhbmQgYU5vdEFwcGxpY2FibGUgcHJvcGVydHkgaW4gY2FzZSBvZiBjb250ZXh0IG1lbnUgY2FsY3VsYXRpb25cblx0XHRcdFx0Ly8gaW4gY2FzZSBvZiBjb250ZXh0IG1lbnUsIG9ubHkgdGhlIGNsaWNrZWQgY29udGV4dCBnb2VzIGludG8gdGhlIHByb2Nlc3NpbmcgLSBvdGhlciBzZWxlY3RlZCBjb250ZXh0cyBtdXN0IGJlIGtlcHQgaW4gdGhlIG1vZGVsXG5cdFx0XHRcdGJFbmFibGVkOiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYkVuYWJsZWRgKSxcblx0XHRcdFx0YUFwcGxpY2FibGU6IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hQXBwbGljYWJsZWApLFxuXHRcdFx0XHRhTm90QXBwbGljYWJsZTogb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FOb3RBcHBsaWNhYmxlYCksXG5cdFx0XHRcdGJFbmFibGVkRm9yQ29udGV4dE1lbnU6IGZhbHNlLFxuXHRcdFx0XHRhQXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXSxcblx0XHRcdFx0YU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudTogW11cblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBOb3RlIHRoYXQgbm9uIGR5bmFtaWMgYWN0aW9ucyBhcmUgbm90IHByb2Nlc3NlZCBoZXJlLiBUaGV5IGFyZSBlbmFibGVkIGJlY2F1c2Vcblx0XHQvLyBvbmUgb3IgbW9yZSBhcmUgc2VsZWN0ZWQgYW5kIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgY29uZGl0aW9uIGluIHRoZSB0ZW1wbGF0aW5nXG5cdFx0Ly8gaXMgdGhlbiB1bmRlZmluZWQgYW5kIHRodXMgdGhlIGJ1dHRvbiB0YWtlcyB0aGUgZGVmYXVsdCBlbmFibGluZywgd2hpY2ggaXMgdHJ1ZSFcblx0XHRjb25zdCBzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoID0gYCR7b0ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS8ke3NFbmFibGVtZW50RmllbGROYW1lfWA7XG5cblx0XHRpZiAodHlwZW9mIHNQcm9wZXJ0eSA9PT0gXCJvYmplY3RcIiAmJiBzUHJvcGVydHkgIT09IG51bGwgJiYgc1Byb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmIChvU2VsZWN0ZWRDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgUHJpbWl0aXZlVHlwZT47XG5cdFx0XHRcdGNvbnN0IG9UcmFuc2Zvcm1lZEJpbmRpbmcgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShcblx0XHRcdFx0XHRzUHJvcGVydHksXG5cdFx0XHRcdFx0XCJQYXRoSW5Nb2RlbFwiLFxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcblx0XHRcdFx0XHRmdW5jdGlvbiAob0JpbmRpbmdFeHByZXNzaW9uOiBQYXRoSW5Nb2RlbEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4pIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dERhdGEgPyBjb25zdGFudChvQ29udGV4dERhdGFbb0JpbmRpbmdFeHByZXNzaW9uLnBhdGhdKSA6IGNvbnN0YW50KGZhbHNlKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3Qgc1Jlc3VsdCA9IGNvbXBpbGVFeHByZXNzaW9uKG9UcmFuc2Zvcm1lZEJpbmRpbmcpO1xuXHRcdFx0XHRiQWN0aW9uRW5hYmxlZCA9IGJBY3Rpb25FbmFibGVkIHx8IHNSZXN1bHQgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoLCBiQWN0aW9uRW5hYmxlZCk7XG5cdFx0XHRcdChzUmVzdWx0ID09PSBcInRydWVcIiA/IGFBcHBsaWNhYmxlIDogYU5vdEFwcGxpY2FibGUpLnB1c2gob1NlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRDb21tb25VdGlscy5zZXREeW5hbWljQWN0aW9uQ29udGV4dHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBzQWN0aW9uLCBhQXBwbGljYWJsZSwgYU5vdEFwcGxpY2FibGUsIGZvckNvbnRleHRNZW51KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dD8uZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgUHJpbWl0aXZlVHlwZT47XG5cdFx0XHRpZiAoc1Byb3BlcnR5ID09PSBudWxsICYmICEhb0NvbnRleHREYXRhW2AjJHtzQWN0aW9ufWBdKSB7XG5cdFx0XHRcdC8vbG9vayBmb3IgYWN0aW9uIGFkdmVydGlzZW1lbnQgaWYgcHJlc2VudCBhbmQgaXRzIHZhbHVlIGlzIG5vdCBudWxsXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgsIHRydWUpO1xuXHRcdFx0fSBlbHNlIGlmIChvU2VsZWN0ZWRDb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gQ29sbGVjdCBwcm9taXNlcyB0byByZXRyaWV2ZSBzaW5nbGV0b24gb3Igbm9ybWFsIHByb3BlcnR5IHZhbHVlIGFzeW5jaHJvbm91c2x5XG5cdFx0XHRcdGFSZXF1ZXN0UHJvbWlzZXMucHVzaChDb21tb25VdGlscy5yZXF1ZXN0UHJvcGVydHkob1NlbGVjdGVkQ29udGV4dCwgc0FjdGlvbiwgc1Byb3BlcnR5LCBzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBhUmVxdWVzdFByb21pc2VzO1xuXHR9XG59O1xuZXhwb3J0IGRlZmF1bHQgQWN0aW9uUnVudGltZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7RUF5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0EsK0JBQStCQSxDQUFDQyxvQkFBMEMsRUFBRUMsTUFBYyxFQUFFQyxjQUF1QixFQUFRO0lBQ25JRixvQkFBb0IsQ0FBQ0csV0FBVyxDQUFDLGtCQUFrQkYsTUFBTSxjQUFjLEVBQUUsRUFBRSxDQUFDO0lBQzVFRCxvQkFBb0IsQ0FBQ0csV0FBVyxDQUFDLGtCQUFrQkYsTUFBTSxpQkFBaUIsRUFBRSxFQUFFLENBQUM7SUFDL0UsSUFBSUMsY0FBYyxFQUFFO01BQ25CRixvQkFBb0IsQ0FBQ0csV0FBVyxDQUFDLGtCQUFrQkYsTUFBTSx5QkFBeUIsRUFBRSxLQUFLLENBQUM7SUFDM0YsQ0FBQyxNQUFNO01BQ05ELG9CQUFv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
@@ -39,6 +39,85 @@ export type ActionParameterInfo = {
39
39
  propertyPath?: string;
40
40
  };
41
41
 
42
+ /**
43
+ * Initializes the properties of a table action in the internal model context.
44
+ * @param internalModelContext The internal model context where the action properties are set.
45
+ * @param action The name of the action for which properties are initialized.
46
+ * @param forContextMenu Indicates if the action is for a context menu.
47
+ */
48
+ function initializeTableActionProperties(internalModelContext: InternalModelContext, action: string, forContextMenu: boolean): void {
49
+ internalModelContext.setProperty(`dynamicActions/${action}/aApplicable`, []);
50
+ internalModelContext.setProperty(`dynamicActions/${action}/aNotApplicable`, []);
51
+ if (forContextMenu) {
52
+ internalModelContext.setProperty(`dynamicActions/${action}/bEnabledForContextMenu`, false);
53
+ } else {
54
+ internalModelContext.setProperty(`dynamicActions/${action}/bEnabled`, false);
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Handles the case when no contexts are selected for an action.
60
+ * @param internalModelContext The internal model context where the action properties are set.
61
+ * @param action The name of the action for which properties are initialized.
62
+ * @param promises An array of promises to be resolved after setting the action properties.
63
+ * @param forContextMenu Indicates if the action appears in the context menu. If false, the action appears in the table toolbar.
64
+ */
65
+ function handleNoSelectedContexts(
66
+ internalModelContext: InternalModelContext,
67
+ action: string,
68
+ promises: Promise<void[]>[],
69
+ forContextMenu: boolean
70
+ ): void {
71
+ internalModelContext.setProperty(`dynamicActions/${action}`, {
72
+ bEnabled: false,
73
+ aApplicable: [],
74
+ aNotApplicable: []
75
+ });
76
+ promises.push(CommonUtils.setContextsBasedOnOperationAvailable(internalModelContext, [], forContextMenu).then(() => []));
77
+ }
78
+
79
+ /**
80
+ * Handles the case when contexts are selected for an action.
81
+ * @param internalModelContext The internal model context where the action properties are set.
82
+ * @param requestPromises An array of promises to be resolved after setting the action properties.
83
+ * @param promises An array of promises to be resolved after setting the action properties.
84
+ * @param forContextMenu Indicates if the action appears in the context menu. If false, the action appears in the table toolbar.
85
+ */
86
+ function handleSelectedContexts(
87
+ internalModelContext: InternalModelContext,
88
+ requestPromises: Promise<_RequestedProperty>[],
89
+ promises: Promise<void[]>[],
90
+ forContextMenu: boolean
91
+ ): void {
92
+ promises.push(CommonUtils.setContextsBasedOnOperationAvailable(internalModelContext, requestPromises, forContextMenu).then(() => []));
93
+ }
94
+
95
+ /**
96
+ * Handles the action enablement for table contexts.
97
+ * @param selectedContexts Selected contexts for the action.
98
+ * @param internalModelContext Internal model context where the action properties are set.
99
+ * @param action Name of the action for which properties are initialized.
100
+ * @param property Property to be checked for the action.
101
+ * @param requestPromises Promises to be resolved after setting the action properties.
102
+ * @param forContextMenu True if the action appears in the context menu, false if it appears in the table toolbar.
103
+ * @param promises P‚romises to be resolved after setting the action properties.
104
+ */
105
+ function handleTableContexts(
106
+ selectedContexts: Context[],
107
+ internalModelContext: InternalModelContext,
108
+ action: string,
109
+ property: string,
110
+ requestPromises: Promise<_RequestedProperty>[],
111
+ forContextMenu: boolean,
112
+ promises: Promise<void[]>[]
113
+ ): void {
114
+ if (!selectedContexts.length) {
115
+ handleNoSelectedContexts(internalModelContext, action, promises, forContextMenu);
116
+ } else if (selectedContexts.length && typeof property === "string") {
117
+ handleSelectedContexts(internalModelContext, requestPromises, promises, forContextMenu);
118
+ }
119
+ }
120
+
42
121
  const ActionRuntime = {
43
122
  /**
44
123
  * Adds error messages for an action parameter field to the message manager.
@@ -144,33 +223,26 @@ const ActionRuntime = {
144
223
  sControl: string,
145
224
  forContextMenu = false
146
225
  ): Promise<void[]> {
147
- const aPromises = [];
226
+ const aPromises: Promise<void[]>[] = [];
148
227
  for (const sAction in oActionOperationAvailableMap) {
149
228
  let aRequestPromises: Promise<_RequestedProperty>[] = [];
150
229
  oInternalModelContext.setProperty(sAction, false);
151
230
  if (sControl === "table") {
152
- oInternalModelContext.setProperty(`dynamicActions/${sAction}/aApplicable`, []);
153
- oInternalModelContext.setProperty(`dynamicActions/${sAction}/aNotApplicable`, []);
154
- if (forContextMenu) {
155
- oInternalModelContext.setProperty(`dynamicActions/${sAction}/bEnabledForContextMenu`, false);
156
- } else {
157
- oInternalModelContext.setProperty(`dynamicActions/${sAction}/bEnabled`, false);
158
- }
231
+ initializeTableActionProperties(oInternalModelContext, sAction, forContextMenu);
159
232
  }
160
233
  const sProperty = oActionOperationAvailableMap[sAction];
161
- for (const element of aSelectedContexts) {
162
- const oSelectedContext = element;
163
- if (oSelectedContext) {
164
- const oContextData = oSelectedContext.getObject() as Record<string, unknown>;
234
+ for (const selectedContext of aSelectedContexts) {
235
+ if (selectedContext) {
236
+ const oContextData = selectedContext.getObject() as Record<string, unknown>;
165
237
  if (sControl === "chart") {
166
- if ((sProperty === null && !!oContextData[`#${sAction}`]) || oSelectedContext.getObject(sProperty)) {
238
+ if ((sProperty === null && !!oContextData[`#${sAction}`]) || selectedContext.getObject(sProperty)) {
167
239
  //look for action advertisement if present and its value is not null
168
240
  oInternalModelContext.setProperty(sAction, true);
169
241
  break;
170
242
  }
171
243
  } else if (sControl === "table") {
172
244
  aRequestPromises = this._setActionEnablementForTable(
173
- oSelectedContext,
245
+ selectedContext,
174
246
  oInternalModelContext,
175
247
  sAction,
176
248
  sProperty,
@@ -180,25 +252,29 @@ const ActionRuntime = {
180
252
  }
181
253
  }
182
254
  }
255
+
183
256
  if (sControl === "table") {
184
- if (!aSelectedContexts.length) {
185
- oInternalModelContext.setProperty(`dynamicActions/${sAction}`, {
186
- bEnabled: false,
187
- aApplicable: [],
188
- aNotApplicable: []
189
- });
190
- aPromises.push(CommonUtils.setContextsBasedOnOperationAvailable(oInternalModelContext, [], forContextMenu));
191
- } else if (aSelectedContexts.length && typeof sProperty === "string") {
192
- // When all property values have been retrieved, set
193
- // The applicable and not-applicable selected contexts for each action and
194
- // The enabled property of the dynamic action in internal model context.
195
- aPromises.push(
196
- CommonUtils.setContextsBasedOnOperationAvailable(oInternalModelContext, aRequestPromises, forContextMenu)
197
- );
198
- }
257
+ handleTableContexts(
258
+ aSelectedContexts,
259
+ oInternalModelContext,
260
+ sAction,
261
+ sProperty,
262
+ aRequestPromises,
263
+ forContextMenu,
264
+ aPromises
265
+ );
199
266
  }
200
267
  }
201
- return Promise.all(aPromises);
268
+
269
+ if (aSelectedContexts.length > 0) {
270
+ // trigger an explicit refresh of the selected context to update
271
+ // also the contexts in case of custom actions
272
+ const selectedContexts = oInternalModelContext.getProperty("selectedContexts") || [];
273
+ oInternalModelContext.setProperty("selectedContexts", []);
274
+ oInternalModelContext.setProperty("selectedContexts", selectedContexts);
275
+ }
276
+
277
+ return Promise.all(aPromises).then((results) => results.flat());
202
278
  },
203
279
  setActionEnablementAfterPatch: function (
204
280
  oView: View,