@sapui5/sap.fe.core 1.135.0 → 1.136.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 (217) 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 +3 -2
  4. package/src/sap/fe/core/ActionRuntime.ts +3 -1
  5. package/src/sap/fe/core/AppComponent.js +6 -4
  6. package/src/sap/fe/core/AppComponent.ts +3 -1
  7. package/src/sap/fe/core/AppStateHandler.js +8 -6
  8. package/src/sap/fe/core/AppStateHandler.ts +7 -5
  9. package/src/sap/fe/core/CommonUtils.js +4 -1
  10. package/src/sap/fe/core/CommonUtils.ts +12 -2
  11. package/src/sap/fe/core/ExtensionAPI.js +5 -3
  12. package/src/sap/fe/core/ExtensionAPI.ts +4 -2
  13. package/src/sap/fe/core/PageController.js +13 -1
  14. package/src/sap/fe/core/PageController.ts +13 -0
  15. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +13 -5
  16. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +19 -6
  17. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +4 -2
  18. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
  19. package/src/sap/fe/core/controllerextensions/EditFlow.js +58 -14
  20. package/src/sap/fe/core/controllerextensions/EditFlow.ts +71 -11
  21. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +184 -17
  22. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +204 -12
  23. package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -3
  24. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +11 -1
  25. package/src/sap/fe/core/controllerextensions/MessageHandler.js +35 -5
  26. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
  27. package/src/sap/fe/core/controllerextensions/Routing.js +6 -6
  28. package/src/sap/fe/core/controllerextensions/Routing.ts +2 -2
  29. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +3 -11
  30. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
  31. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +11 -1
  32. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
  33. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +21 -6
  34. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +19 -5
  35. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +17 -14
  36. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +19 -17
  37. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
  39. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +10 -2
  40. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +8 -2
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +1 -1
  44. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +33 -31
  45. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +2 -2
  46. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +3 -3
  47. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +4 -1
  48. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +2 -1
  49. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +2 -2
  50. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
  51. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +4 -3
  52. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +7 -2
  53. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
  54. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
  55. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
  56. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
  57. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
  58. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
  59. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  60. package/src/sap/fe/core/converters/ManifestSettings.ts +18 -8
  61. package/src/sap/fe/core/converters/controls/Common/Action.js +54 -5
  62. package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
  63. package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -4
  64. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -4
  65. package/src/sap/fe/core/converters/controls/Common/Form.js +13 -4
  66. package/src/sap/fe/core/converters/controls/Common/Form.ts +13 -3
  67. package/src/sap/fe/core/converters/controls/Common/Table.js +29 -9
  68. package/src/sap/fe/core/converters/controls/Common/Table.ts +38 -8
  69. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +14 -16
  70. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +61 -96
  71. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +62 -13
  72. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +75 -13
  73. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +4 -33
  74. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +4 -44
  75. package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
  76. package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
  77. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +9 -4
  78. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
  79. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +7 -2
  80. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -1
  81. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +29 -7
  82. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
  83. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +34 -16
  84. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +35 -16
  85. package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
  86. package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
  87. package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
  88. package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
  89. package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
  90. package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
  91. package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
  92. package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
  93. package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
  94. package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
  95. package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
  96. package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
  97. package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
  98. package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
  99. package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
  100. package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
  101. package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
  102. package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
  103. package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
  104. package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
  105. package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
  106. package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
  107. package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
  108. package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
  109. package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
  110. package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
  111. package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
  112. package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
  113. package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
  114. package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
  115. package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
  116. package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
  117. package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
  118. package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
  119. package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
  120. package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
  121. package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
  122. package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
  123. package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
  124. package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
  125. package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
  126. package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
  127. package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
  128. package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
  129. package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
  130. package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
  131. package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
  132. package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
  133. package/src/sap/fe/core/fpm/manifest.json +1 -1
  134. package/src/sap/fe/core/helpers/AppStartupHelper.js +24 -3
  135. package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
  136. package/src/sap/fe/core/helpers/BindingHelper.js +3 -2
  137. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
  138. package/src/sap/fe/core/helpers/DeleteHelper.js +4 -9
  139. package/src/sap/fe/core/helpers/DeleteHelper.ts +3 -8
  140. package/src/sap/fe/core/helpers/ModelHelper.js +14 -4
  141. package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
  142. package/src/sap/fe/core/helpers/PasteHelper.js +38 -39
  143. package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
  144. package/src/sap/fe/core/helpers/WebSocket.js +10 -1
  145. package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
  146. package/src/sap/fe/core/library.js +1 -1
  147. package/src/sap/fe/core/messagebundle.properties +41 -2
  148. package/src/sap/fe/core/messagebundle_ar.properties +23 -2
  149. package/src/sap/fe/core/messagebundle_bg.properties +23 -2
  150. package/src/sap/fe/core/messagebundle_ca.properties +21 -0
  151. package/src/sap/fe/core/messagebundle_cnr.properties +23 -2
  152. package/src/sap/fe/core/messagebundle_cs.properties +21 -0
  153. package/src/sap/fe/core/messagebundle_cy.properties +21 -0
  154. package/src/sap/fe/core/messagebundle_da.properties +23 -2
  155. package/src/sap/fe/core/messagebundle_de.properties +23 -2
  156. package/src/sap/fe/core/messagebundle_el.properties +21 -0
  157. package/src/sap/fe/core/messagebundle_en.properties +23 -2
  158. package/src/sap/fe/core/messagebundle_en_GB.properties +23 -2
  159. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +23 -2
  160. package/src/sap/fe/core/messagebundle_es.properties +21 -0
  161. package/src/sap/fe/core/messagebundle_es_MX.properties +21 -0
  162. package/src/sap/fe/core/messagebundle_et.properties +21 -0
  163. package/src/sap/fe/core/messagebundle_fi.properties +21 -0
  164. package/src/sap/fe/core/messagebundle_fr.properties +22 -1
  165. package/src/sap/fe/core/messagebundle_fr_CA.properties +21 -0
  166. package/src/sap/fe/core/messagebundle_hi.properties +22 -1
  167. package/src/sap/fe/core/messagebundle_hr.properties +24 -3
  168. package/src/sap/fe/core/messagebundle_hu.properties +21 -0
  169. package/src/sap/fe/core/messagebundle_id.properties +21 -0
  170. package/src/sap/fe/core/messagebundle_it.properties +23 -2
  171. package/src/sap/fe/core/messagebundle_iw.properties +21 -0
  172. package/src/sap/fe/core/messagebundle_ja.properties +21 -0
  173. package/src/sap/fe/core/messagebundle_kk.properties +21 -0
  174. package/src/sap/fe/core/messagebundle_ko.properties +21 -0
  175. package/src/sap/fe/core/messagebundle_lt.properties +21 -0
  176. package/src/sap/fe/core/messagebundle_lv.properties +23 -2
  177. package/src/sap/fe/core/messagebundle_mk.properties +21 -0
  178. package/src/sap/fe/core/messagebundle_ms.properties +22 -1
  179. package/src/sap/fe/core/messagebundle_nl.properties +21 -0
  180. package/src/sap/fe/core/messagebundle_no.properties +21 -0
  181. package/src/sap/fe/core/messagebundle_pl.properties +23 -2
  182. package/src/sap/fe/core/messagebundle_pt.properties +23 -2
  183. package/src/sap/fe/core/messagebundle_pt_PT.properties +21 -0
  184. package/src/sap/fe/core/messagebundle_ro.properties +23 -2
  185. package/src/sap/fe/core/messagebundle_ru.properties +22 -1
  186. package/src/sap/fe/core/messagebundle_sh.properties +23 -2
  187. package/src/sap/fe/core/messagebundle_sk.properties +21 -0
  188. package/src/sap/fe/core/messagebundle_sl.properties +23 -2
  189. package/src/sap/fe/core/messagebundle_sr.properties +23 -2
  190. package/src/sap/fe/core/messagebundle_sv.properties +21 -0
  191. package/src/sap/fe/core/messagebundle_th.properties +21 -0
  192. package/src/sap/fe/core/messagebundle_tr.properties +21 -0
  193. package/src/sap/fe/core/messagebundle_uk.properties +23 -2
  194. package/src/sap/fe/core/messagebundle_vi.properties +23 -2
  195. package/src/sap/fe/core/messagebundle_zh_CN.properties +23 -2
  196. package/src/sap/fe/core/messagebundle_zh_TW.properties +21 -0
  197. package/src/sap/fe/core/rootView/Fcl.controller.js +5 -5
  198. package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -4
  199. package/src/sap/fe/core/rootView/NavContainer.controller.js +2 -2
  200. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  201. package/src/sap/fe/core/rootView/RootViewBaseController.js +61 -9
  202. package/src/sap/fe/core/rootView/RootViewBaseController.ts +70 -7
  203. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +28 -12
  204. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
  205. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +7 -1
  206. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
  207. package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -2
  208. package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -1
  209. package/src/sap/fe/core/services/ShellServicesFactory.js +4 -3
  210. package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
  211. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +27 -3
  212. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
  213. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  214. package/src/sap/fe/core/templating/EntitySetHelper.js +198 -58
  215. package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
  216. package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -7
  217. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +9 -7
@@ -13,7 +13,7 @@ import { StandardActions, TriggerType, triggerConfiguredSurvey } from "sap/fe/co
13
13
  import type InternalRouting from "sap/fe/core/controllerextensions/InternalRouting";
14
14
  import type MessageHandler from "sap/fe/core/controllerextensions/MessageHandler";
15
15
  import type { CustomMessage } from "sap/fe/core/controllerextensions/MessageHandler";
16
- import { Activity, shareObject } from "sap/fe/core/controllerextensions/collaboration/CollaborationCommon";
16
+ import { Activity, CollaborationUtils, shareObject } from "sap/fe/core/controllerextensions/collaboration/CollaborationCommon";
17
17
  import type { CancelParameters, CreateParameters } from "sap/fe/core/controllerextensions/editFlow/TransactionHelper";
18
18
  import TransactionHelper from "sap/fe/core/controllerextensions/editFlow/TransactionHelper";
19
19
  import type { BindContextParameters, RootContextInfo, SiblingInformation } from "sap/fe/core/controllerextensions/editFlow/draft";
@@ -117,6 +117,8 @@ class EditFlow extends BaseControllerExtension {
117
117
 
118
118
  private _hiddenDraft: HiddenDraft | undefined;
119
119
 
120
+ private fetchCollaborativeDraftUsersPromise: Promise<unknown> | undefined;
121
+
120
122
  @methodOverride()
121
123
  onInit(): void {
122
124
  this._hiddenDraft = this.getAppComponent().getEnvironmentCapabilities().getCapabilities().HiddenDraft as HiddenDraft;
@@ -211,6 +213,14 @@ class EditFlow extends BaseControllerExtension {
211
213
 
212
214
  let overrideMessageUIDecision = false;
213
215
  if (newDocumentContext) {
216
+ if (programmingModel !== ProgrammingModel.Sticky && ModelHelper.isCollaborationDraftSupported(model.getMetaModel())) {
217
+ // according to UX in case of enabled collaboration draft we share the object immediately
218
+ shareObject(newDocumentContext);
219
+ this.fetchCollaborativeDraftUsersPromise = newDocumentContext.requestSideEffects(
220
+ ["DraftAdministrativeData/DraftAdministrativeUser"],
221
+ "$auto.Workers"
222
+ );
223
+ }
214
224
  await this.base.editFlow.onAfterEdit({ context: contextToNavigate });
215
225
  await this._handleNewContext(contextToNavigate as Context, {
216
226
  editable: true,
@@ -228,9 +238,6 @@ class EditFlow extends BaseControllerExtension {
228
238
  stickyContext = newDocumentContext;
229
239
  }
230
240
  await this.handleStickyOn(stickyContext);
231
- } else if (ModelHelper.isCollaborationDraftSupported(model.getMetaModel())) {
232
- // according to UX in case of enabled collaboration draft we share the object immediately
233
- shareObject(newDocumentContext);
234
241
  }
235
242
  overrideMessageUIDecision = true;
236
243
 
@@ -799,7 +806,7 @@ class EditFlow extends BaseControllerExtension {
799
806
  ),
800
807
  keepTransientContextOnFailed: false, // currently not fully supported
801
808
  busyMode: "Local", // busy handling shall be done locally only
802
- busyId: table?.getId(),
809
+ busyId: (table?.getParent() as TableAPI | undefined)?.getTableDefinition()?.annotation.id,
803
810
  parentControl: this.getView(),
804
811
  beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
805
812
  skipParameterDialog: appComponent.getStartupMode() === StartupMode.AutoCreate, // In case the application was called with preferredMode=autoCreateWith, we want to skip the action parameter dialog
@@ -889,6 +896,8 @@ class EditFlow extends BaseControllerExtension {
889
896
  }
890
897
  }
891
898
  });
899
+ } else {
900
+ table = undefined;
892
901
  }
893
902
 
894
903
  // take care on message handling, draft indicator (in case of draft)
@@ -900,7 +909,7 @@ class EditFlow extends BaseControllerExtension {
900
909
  //Check if All parameters are needed
901
910
  keepTransientContextOnFailed: false, // currently not fully supported
902
911
  busyMode: "Local", // busy handling shall be done locally only
903
- busyId: table?.getId(),
912
+ busyId: (table?.getParent() as TableAPI | undefined)?.getTableDefinition()?.annotation.id,
904
913
  parentControl: this.getView(),
905
914
  beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
906
915
  skipParameterDialog: this.getAppComponent().getStartupMode() === StartupMode.AutoCreate, // In case the application was called with preferredMode=autoCreateWith, we want to skip the action parameter dialog
@@ -1011,7 +1020,7 @@ class EditFlow extends BaseControllerExtension {
1011
1020
  //Check if All parameters are needed
1012
1021
  keepTransientContextOnFailed: false, // currently not fully supported
1013
1022
  busyMode: "Local", // busy handling shall be done locally only
1014
- busyId: table?.getId(),
1023
+ busyId: (table?.getParent() as TableAPI | undefined)?.getTableDefinition()?.annotation.id,
1015
1024
  parentControl: this.getView(),
1016
1025
  beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
1017
1026
  afterCreateCallBack: afterCreateInDialog,
@@ -1561,6 +1570,24 @@ class EditFlow extends BaseControllerExtension {
1561
1570
  return Promise.resolve();
1562
1571
  }
1563
1572
 
1573
+ /**
1574
+ * This function can be used to intercept the action execution. You can execute custom coding in this function.
1575
+ * The framework waits for the returned promise to be resolved before continuing the action.
1576
+ * If you reject the promise, the action is stopped.
1577
+ *
1578
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
1579
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1580
+ * @param _mParameters Object containing the parameters passed to onBeforeExecuteAction
1581
+ * @param _mParameters.contexts An array of contexts that are going to be used for the action execution
1582
+ * @returns A promise to be returned by the overridden method. If resolved, the 'Delete' action is triggered. If rejected, the action is not triggered.
1583
+ */
1584
+ @publicExtension()
1585
+ @extensible("AfterAsync")
1586
+ async onBeforeExecuteAction(_mParameters?: { contexts?: Context[] | Context | null }): Promise<void> {
1587
+ // to be overridden
1588
+ return Promise.resolve();
1589
+ }
1590
+
1564
1591
  /**
1565
1592
  * This function can be used to execute code after the 'Save' action.
1566
1593
  * You can execute custom coding in this function.
@@ -1673,6 +1700,16 @@ class EditFlow extends BaseControllerExtension {
1673
1700
  @publicExtension()
1674
1701
  @finalExtension()
1675
1702
  async saveDocument(oContext: Context, mParameters: SaveDocumentParameters): Promise<void> {
1703
+ // saveDocument is called from inline edit keyboard shortcut
1704
+ if (
1705
+ !this.getGlobalUIModel().getProperty("/isEditable") &&
1706
+ this.base.inlineEditFlow?.isInlineEditPossible() &&
1707
+ this.getGlobalUIModel().getProperty("/isInlineEditActive")
1708
+ ) {
1709
+ this.base.inlineEditFlow.inlineEditSave();
1710
+ return;
1711
+ }
1712
+
1676
1713
  mParameters = mParameters || {};
1677
1714
  const bExecuteSideEffectsOnError = mParameters.bExecuteSideEffectsOnError || undefined;
1678
1715
  const transactionHelper = this.getTransactionHelper();
@@ -1820,8 +1857,6 @@ class EditFlow extends BaseControllerExtension {
1820
1857
  siblingInfo = await this._computeSiblingInformation(oContext, oContext, ProgrammingModel.Draft, false);
1821
1858
  }
1822
1859
  if (siblingInfo) {
1823
- this.setEditMode(editable ? EditMode.Editable : EditMode.Display, false); //switch to edit mode only if a draft is available
1824
-
1825
1860
  if (oRootViewController.isFclEnabled()) {
1826
1861
  const lastSemanticMapping = this._getSemanticMapping();
1827
1862
  if (lastSemanticMapping?.technicalPath === oContext.getPath()) {
@@ -2365,6 +2400,7 @@ class EditFlow extends BaseControllerExtension {
2365
2400
 
2366
2401
  try {
2367
2402
  await this.syncTask();
2403
+ await this.base.editFlow.onBeforeExecuteAction({ contexts: mParameters.contexts });
2368
2404
  const response = await transactionHelper.callAction(sActionName, mParameters, this.getAppComponent(), this.getMessageHandler());
2369
2405
  const successFullExecution = response.filter(isFulfilled);
2370
2406
  if (response.length !== successFullExecution.length) {
@@ -2677,8 +2713,33 @@ class EditFlow extends BaseControllerExtension {
2677
2713
  this.setDraftStatus(DraftStatus.Clear);
2678
2714
  const globalModel = this.getGlobalUIModel();
2679
2715
  globalModel.setProperty("/isEditablePending", true, undefined, true);
2716
+
2717
+ const model = this.getView().getModel();
2718
+ const isCollaborationDraftSupported = ModelHelper.isCollaborationDraftSupported(model!.getMetaModel());
2719
+ let forceDisplayMode = false;
2680
2720
  const isActiveEntity = await context.requestObject("IsActiveEntity");
2681
- if (isActiveEntity === false) {
2721
+
2722
+ if (isCollaborationDraftSupported && isActiveEntity === false) {
2723
+ await this.fetchCollaborativeDraftUsersPromise;
2724
+ const usersInvited = (await context.requestObject("DraftAdministrativeData/DraftAdministrativeUser")) as {
2725
+ DraftEntityType: string;
2726
+ DraftUUID: string;
2727
+ UserID: string;
2728
+ }[];
2729
+ const me = CollaborationUtils.getMe(this.getAppComponent()),
2730
+ hasMe = usersInvited?.filter((singleUser) => singleUser.UserID === me.id) ?? [];
2731
+ if (hasMe.length > 0) {
2732
+ globalModel.setProperty("/hasCollaborationAuthorization", true);
2733
+ } else {
2734
+ forceDisplayMode = true;
2735
+ globalModel.setProperty("/hasCollaborationAuthorization", false);
2736
+ }
2737
+ } else {
2738
+ globalModel.setProperty("/hasCollaborationAuthorization", undefined);
2739
+ }
2740
+ this.fetchCollaborativeDraftUsersPromise = undefined;
2741
+
2742
+ if (isActiveEntity === false && !forceDisplayMode) {
2682
2743
  // in case the document is draft set it in edit mode
2683
2744
  this.setEditMode(EditMode.Editable);
2684
2745
  const hasActiveEntity = await context.requestObject("HasActiveEntity");
@@ -2723,7 +2784,6 @@ class EditFlow extends BaseControllerExtension {
2723
2784
  * @param parameters.noDialog
2724
2785
  * @param parameters.title
2725
2786
  * @param parameters.description
2726
- * @param parameters.entitySetName
2727
2787
  * @param parameters.numberOfSelectedContexts
2728
2788
  * @param parameters.unSavedContexts
2729
2789
  * @param parameters.lockedContexts
@@ -2,18 +2,19 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupport", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BaseControllerExtension", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/TypeGuards", "sap/ui/core/Messaging"], function (Log, ClassSupport, HookSupport, CommonUtils, BaseControllerExtension, messageHandling, MetaModelConverter, TypeGuards, Messaging) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupport", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BaseControllerExtension", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/controls/inlineEditFlow/BeforeActionDialog", "sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/TypeGuards", "sap/m/MessageToast", "sap/ui/core/Lib", "sap/ui/core/Messaging", "../controls/inlineEditFlow/DraftExistsDialog"], function (Log, ClassSupport, HookSupport, CommonUtils, BaseControllerExtension, messageHandling, BeforeActionDialog, BeforeNavigationDialog, MetaModelConverter, TypeGuards, MessageToast, Lib, Messaging, DraftExistsDialog) {
6
6
  "use strict";
7
7
 
8
- var _dec, _dec2, _class, _class2;
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _class, _class2;
9
9
  var _exports = {};
10
10
  var isProperty = TypeGuards.isProperty;
11
11
  var hookable = HookSupport.hookable;
12
+ var methodOverride = ClassSupport.methodOverride;
12
13
  var defineUI5Class = ClassSupport.defineUI5Class;
13
14
  function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
14
15
  function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
15
16
  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
16
- let InlineEditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.InlineEditFlow"), _dec2 = hookable("Before"), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseControllerExtens) {
17
+ let InlineEditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.InlineEditFlow"), _dec2 = hookable("Before"), _dec3 = methodOverride("routing"), _dec4 = methodOverride("editFlow"), _dec5 = methodOverride("editFlow"), _dec6 = methodOverride("editFlow"), _dec7 = methodOverride("editFlow"), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseControllerExtens) {
17
18
  function InlineEditFlow() {
18
19
  var _this;
19
20
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
@@ -36,10 +37,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
36
37
 
37
38
  /**
38
39
  * Save the inline edit changes.
39
- * @param bindingContextPath
40
40
  * @returns A promise that resolved once the batch has returned.
41
41
  */;
42
- _proto.inlineEditSave = async function inlineEditSave(bindingContextPath) {
42
+ _proto.inlineEditSave = async function inlineEditSave() {
43
43
  const model = this.base.getView().getModel();
44
44
  const messages = Messaging.getMessageModel().getData();
45
45
  const hasTechnicalMessages = messages.some(message => !messageHandling.isNonTechnicalMessage(message));
@@ -54,7 +54,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
54
54
  }
55
55
  try {
56
56
  Messaging.removeAllMessages();
57
- this.inlineEditBindingContextPath = bindingContextPath;
58
57
  await model.submitBatch(CommonUtils.INLINEEDIT_UPDATEGROUPID);
59
58
  } catch (error) {
60
59
  Log.warning("Error while saving inline edit changes");
@@ -66,30 +65,40 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
66
65
  */;
67
66
  _proto.inlineEditDiscard = function inlineEditDiscard() {
68
67
  this.base.getView().getModel().resetChanges(CommonUtils.INLINEEDIT_UPDATEGROUPID);
69
- this.inlineEditEnd();
68
+ this.inlineEditEnd(true);
70
69
  }
71
70
 
72
71
  /**
73
72
  * End the inline edit.
73
+ * @param refreshDescription
74
74
  */;
75
- _proto.inlineEditEnd = function inlineEditEnd() {
75
+ _proto.inlineEditEnd = function inlineEditEnd(refreshDescription) {
76
76
  Messaging.removeAllMessages();
77
77
  this.base.setShowFooter(false);
78
78
  for (const control of this.inlineEditControls) {
79
- control.inlineEditEnd();
79
+ control.inlineEditEnd(refreshDescription);
80
80
  }
81
81
  this.inlineEditControls = [];
82
+ this.base.getView().getModel("ui").setProperty("/isInlineEditActive", false);
82
83
  }
83
84
 
84
85
  /**
85
86
  * Start the inline edit on the bindingContextPath for the propertyFullyQualifiedName.
86
87
  * @param propertyFullyQualifiedName
87
88
  * @param bindingContextPath
89
+ * @param controlTrigger
88
90
  */;
89
- _proto.startInlineEdit = function startInlineEdit(propertyFullyQualifiedName, bindingContextPath) {
91
+ _proto.startInlineEdit = function startInlineEdit(propertyFullyQualifiedName, bindingContextPath, controlTrigger) {
92
+ if (controlTrigger?.getBindingContext()?.getProperty("HasDraftEntity")) {
93
+ // there is already a draft on the entity. We should not start inline edit
94
+ new DraftExistsDialog(this.base.getView()).open();
95
+ controlTrigger?.resetIndicatorPopup();
96
+ return;
97
+ }
90
98
  const inlineEditService = this.base.getAppComponent().getInlineEditService();
91
99
  const dependentProperties = inlineEditService.getInlineConnectedProperties(this.base.getRoutingTargetName(), propertyFullyQualifiedName);
92
100
  this.inlineEditStart([], dependentProperties?.length ? dependentProperties : [propertyFullyQualifiedName], bindingContextPath);
101
+ this.base.getView().getModel("ui").setProperty("/isInlineEditActive", true);
93
102
  }
94
103
 
95
104
  /**
@@ -112,15 +121,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
112
121
  * @param properties
113
122
  * @param bindingContextPath
114
123
  */;
115
- _proto.
116
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
117
- inlineEditStart = function inlineEditStart(inlineEditControls, properties, bindingContextPath) {
124
+ _proto.inlineEditStart = async function inlineEditStart(inlineEditControls, properties, bindingContextPath) {
125
+ if (this.abortTimerBeforeSave) {
126
+ // if there is a timer to save
127
+ this.abortTimerBeforeSave();
128
+ this.abortTimerBeforeSave = undefined;
129
+ await this.inlineEditSave();
130
+ }
118
131
  const alreadyRegisteredControls = this.inlineEditControls.map(control => control.getId());
119
132
  for (const control of inlineEditControls) {
120
133
  if (!alreadyRegisteredControls.includes(control.getId())) {
121
134
  this.inlineEditControls.push(control);
122
135
  }
123
136
  }
137
+ this.inlineEditBindingContextPath = bindingContextPath;
138
+ return;
124
139
  }
125
140
 
126
141
  /**
@@ -137,7 +152,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
137
152
  * @param event The event sent by the binding
138
153
  */;
139
154
  _proto.handleInlineEditPatchSent = async function handleInlineEditPatchSent(event) {
140
- const patchPromise = new Promise((resolve, reject) => {
155
+ this.patchPromise = new Promise((resolve, reject) => {
141
156
  event.getSource().attachEventOnce("patchCompleted", patchCompletedEvent => {
142
157
  const bSuccess = patchCompletedEvent.getParameter("success");
143
158
  if (bSuccess) {
@@ -148,9 +163,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
148
163
  });
149
164
  });
150
165
  try {
151
- await patchPromise;
166
+ await this.patchPromise;
167
+ this.patchPromise = undefined;
168
+ const resourceBundle = Lib.getResourceBundleFor("sap.fe.core");
169
+ if (resourceBundle) {
170
+ MessageToast.show(resourceBundle.getText("C_INLINE_EDIT_SAVED"));
171
+ }
152
172
  this.inlineEditEnd();
153
173
  } catch (patchCompletedEvent) {
174
+ this.patchPromise = undefined;
154
175
  this.handleInlineEditSaveFailed();
155
176
  }
156
177
  }
@@ -163,6 +184,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
163
184
  const messages = Messaging.getMessageModel().getData();
164
185
  if (messages.length) {
165
186
  this.base.setShowFooter(true);
187
+ this.propagateInlineFieldGroupIdToMessageButton();
166
188
  }
167
189
  if (!this.inlineEditBindingContextPath) {
168
190
  return;
@@ -179,10 +201,155 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
179
201
  }
180
202
  }
181
203
  }
204
+ }
205
+
206
+ /**
207
+ * Performs a delayedCall when you focus out of a field.
208
+ */;
209
+ _proto.delayedCallToSave = async function delayedCallToSave() {
210
+ if (this.abortTimerBeforeSave || this.patchPromise) {
211
+ // if there is already a timer running or a save in process do nothing
212
+ return;
213
+ }
214
+ const timerBeforeSave = new Promise((resolve, reject) => {
215
+ this.abortTimerBeforeSave = reject;
216
+ setTimeout(() => resolve(), 500);
217
+ });
218
+ try {
219
+ await timerBeforeSave;
220
+ this.abortTimerBeforeSave = undefined;
221
+ this.inlineEditSave();
222
+ } catch (e) {
223
+ // Nothing to see it is just someone that cancelled the timer
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Method to ensure we leave inline edit before any navigation..
229
+ * @returns Promise that retruns true if we need to cancel navigation and stay in inline edit
230
+ */;
231
+ _proto.onBeforeNavigation = async function onBeforeNavigation() {
232
+ if (this.inlineEditControls.length > 0) {
233
+ // there are controls in inline edit we need to prevent the navigation and show the dialog
234
+ if (this.abortTimerBeforeSave) {
235
+ this.abortTimerBeforeSave();
236
+ this.abortTimerBeforeSave = undefined;
237
+ }
238
+ if (!this.base.getView().getModel().hasPendingChanges(CommonUtils.INLINEEDIT_UPDATEGROUPID)) {
239
+ // fields are in inline edit and there are no pending changes. We need to show the dialog
240
+ this.inlineEditEnd();
241
+ return false;
242
+ }
243
+ try {
244
+ if (this.patchPromise) {
245
+ await this.patchPromise;
246
+ } else {
247
+ const dialogResult = await this.openInlineEditBeforeNavigationDialogAndWaitForResult();
248
+ if (dialogResult === "Save") {
249
+ // we save and wait for the patchPromise
250
+ await this.inlineEditSave();
251
+ if (this.base.getView().getModel().hasPendingChanges(CommonUtils.INLINEEDIT_UPDATEGROUPID)) {
252
+ // if after saves there are still changes this means save has failed. we need to cancel navigation
253
+ this.focusHandling(this.inlineEditControls[0]);
254
+ return true;
255
+ }
256
+ } else if (dialogResult === "Cancel") {
257
+ this.focusHandling(this.inlineEditControls[0]);
258
+ return true;
259
+ } else {
260
+ // we discard the changes
261
+ this.inlineEditDiscard();
262
+ }
263
+ return false;
264
+ }
265
+ } catch (e) {
266
+ this.focusHandling(this.inlineEditControls[0]);
267
+ return true;
268
+ }
269
+ }
270
+ return false;
271
+ }
272
+
273
+ /**
274
+ * Method to open the dialog before navigation.
275
+ * @returns Promise that returns the dialog choice once the user has clicked on ok or cancel
276
+ */;
277
+ _proto.openInlineEditBeforeNavigationDialogAndWaitForResult = async function openInlineEditBeforeNavigationDialogAndWaitForResult() {
278
+ return new Promise(resolve => {
279
+ new BeforeNavigationDialog(this.base.getView(), resolve).open();
280
+ });
281
+ }
282
+
283
+ /**
284
+ * Method to ensure we leave inline edit before any standard edit flowaction.
285
+ * @returns Promise that reject and triggers save or discard if we are in inline edit
286
+ */;
287
+ _proto.onBeforeAnyEditFlowAction = async function onBeforeAnyEditFlowAction() {
288
+ if (this.inlineEditControls.length > 0) {
289
+ if (this.abortTimerBeforeSave) {
290
+ this.abortTimerBeforeSave();
291
+ this.abortTimerBeforeSave = undefined;
292
+ }
293
+ if (!this.base.getView().getModel().hasPendingChanges(CommonUtils.INLINEEDIT_UPDATEGROUPID)) {
294
+ // fields are in inline edit and there are no pending changes. We don't need to show the dialog
295
+ this.inlineEditEnd();
296
+ return Promise.resolve();
297
+ }
298
+ new BeforeActionDialog(this.base.getView()).open();
299
+ // there are controls in inline edit we need to prevent the action and show the dialog
300
+ return Promise.reject();
301
+ }
302
+ return Promise.resolve();
303
+ }
304
+
305
+ /**
306
+ * Handle before edit.
307
+ * @returns Promise that reject if edit needs to be cancelled
308
+ */;
309
+ _proto.onBeforeEdit = async function onBeforeEdit() {
310
+ return this.onBeforeAnyEditFlowAction();
311
+ }
312
+
313
+ /**
314
+ * Handle before create.
315
+ * @returns Promise that reject if cretae needs to be cancelled
316
+ */;
317
+ _proto.onBeforeCreate = async function onBeforeCreate() {
318
+ return this.onBeforeAnyEditFlowAction();
319
+ }
320
+
321
+ /**
322
+ * Handle before delete.
323
+ * @returns Promise that reject if delete needs to be cancelled
324
+ */;
325
+ _proto.onBeforeDelete = async function onBeforeDelete() {
326
+ return this.onBeforeAnyEditFlowAction();
327
+ }
328
+
329
+ /**
330
+ * Handle before action.
331
+ * @returns Promise that reject if delete needs to be cancelled
332
+ */;
333
+ _proto.onBeforeExecuteAction = async function onBeforeExecuteAction() {
334
+ return this.onBeforeAnyEditFlowAction();
335
+ }
336
+
337
+ /**
338
+ * Propagate the field group id to the message button.
339
+ */;
340
+ _proto.propagateInlineFieldGroupIdToMessageButton = function propagateInlineFieldGroupIdToMessageButton() {
341
+ // we propagate the fieldgroupId to the footer and all its descendants to ensure that
342
+ // clicking on the footer does not trigger a focusout and a save for the inline edit
343
+ const footerControls = this.base.getFooter()?.findAggregatedObjects(true, managedObject => managedObject.isA("sap.ui.core.Control")) ?? [];
344
+ for (const control of footerControls) {
345
+ const childFieldGroupIds = new Set(control.getFieldGroupIds());
346
+ childFieldGroupIds.add("InlineEdit");
347
+ control.setFieldGroupIds(Array.from(childFieldGroupIds));
348
+ }
182
349
  };
183
350
  return InlineEditFlow;
184
- }(BaseControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "inlineEditStart", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "inlineEditStart"), _class2.prototype), _class2)) || _class);
351
+ }(BaseControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "inlineEditStart", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "inlineEditStart"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeNavigation", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeNavigation"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeExecuteAction", [_dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeExecuteAction"), _class2.prototype), _class2)) || _class);
185
352
  _exports = InlineEditFlow;
186
353
  return _exports;
187
354
  }, false);
188
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbmxpbmVFZGl0RmxvdyIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwiaG9va2FibGUiLCJfY2xhc3MiLCJfY2xhc3MyIiwiX0Jhc2VDb250cm9sbGVyRXh0ZW5zIiwiX3RoaXMiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNhbGwiLCJpbmxpbmVFZGl0Q29udHJvbHMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJiYXNlIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0SW5saW5lRWRpdFNlcnZpY2UiLCJkb2VzUGFnZUhhdmVJbmxpbmVFZGl0IiwiZ2V0Um91dGluZ1RhcmdldE5hbWUiLCJpbmxpbmVFZGl0U2F2ZSIsImJpbmRpbmdDb250ZXh0UGF0aCIsIm1vZGVsIiwiZ2V0VmlldyIsImdldE1vZGVsIiwibWVzc2FnZXMiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiaGFzVGVjaG5pY2FsTWVzc2FnZXMiLCJzb21lIiwibWVzc2FnZSIsIm1lc3NhZ2VIYW5kbGluZyIsImlzTm9uVGVjaG5pY2FsTWVzc2FnZSIsInNldFNob3dGb290ZXIiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsIkNvbW1vblV0aWxzIiwiSU5MSU5FRURJVF9VUERBVEVHUk9VUElEIiwiaW5saW5lRWRpdEVuZCIsInJlbW92ZUFsbE1lc3NhZ2VzIiwiaW5saW5lRWRpdEJpbmRpbmdDb250ZXh0UGF0aCIsInN1Ym1pdEJhdGNoIiwiZXJyb3IiLCJMb2ciLCJ3YXJuaW5nIiwiaW5saW5lRWRpdERpc2NhcmQiLCJyZXNldENoYW5nZXMiLCJjb250cm9sIiwic3RhcnRJbmxpbmVFZGl0IiwicHJvcGVydHlGdWxseVF1YWxpZmllZE5hbWUiLCJpbmxpbmVFZGl0U2VydmljZSIsImRlcGVuZGVudFByb3BlcnRpZXMiLCJnZXRJbmxpbmVDb25uZWN0ZWRQcm9wZXJ0aWVzIiwiaW5saW5lRWRpdFN0YXJ0IiwiZm9jdXNIYW5kbGluZyIsImlubGluZUVkaXRDb250cm9sIiwiY2xvc2VJbmxpbmVFZGl0UG9wdXBFZGl0TW9kZSIsImZvY3VzIiwicHJvcGVydGllcyIsImFscmVhZHlSZWdpc3RlcmVkQ29udHJvbHMiLCJtYXAiLCJnZXRJZCIsImluY2x1ZGVzIiwicHVzaCIsImlzUHJvcGVydHlDb25zaWRlcmVkRm9ySW5saW5lRWRpdCIsImhhbmRsZUlubGluZUVkaXRQYXRjaFNlbnQiLCJldmVudCIsInBhdGNoUHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0U291cmNlIiwiYXR0YWNoRXZlbnRPbmNlIiwicGF0Y2hDb21wbGV0ZWRFdmVudCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlSW5saW5lRWRpdFNhdmVGYWlsZWQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJ0YXJnZXQiLCJnZXRUYXJnZXRzIiwidGFyZ2V0TWV0YUNvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImdldE1ldGFQYXRoIiwibWVzc2FnZVRhcmdldERhdGFNb2RlbE9iamVjdCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImlzUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRGdWxseVF1YWxpZmllZE5hbWUiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIklubGluZUVkaXRGbG93LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvSG9va1N1cHBvcnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CYXNlQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBpc1Byb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHsgdHlwZSBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC9mZS9tYWNyb3MvRmllbGRcIjtcbmltcG9ydCB0eXBlIElubGluZUVkaXQgZnJvbSBcInNhcC9mZS9tYWNyb3MvaW5saW5lRWRpdC9JbmxpbmVFZGl0XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW5saW5lRWRpdEZsb3dcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElubGluZUVkaXRGbG93IGV4dGVuZHMgQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgaW5saW5lRWRpdENvbnRyb2xzOiBDb250cm9sW10gPSBbXTtcblxuXHRwcml2YXRlIGlubGluZUVkaXRCaW5kaW5nQ29udGV4dFBhdGg/OiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBrbm93IGlmIHRoZXJlIGNhbiBiZSBpbmxpbmUgZWRpdCBvbiB0aGUgcGFnZS5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiBpbmxpbmUgZWRpdCBpcyBwb3NzaWJsZVxuXHQgKi9cblx0aXNJbmxpbmVFZGl0UG9zc2libGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRJbmxpbmVFZGl0U2VydmljZSgpLmRvZXNQYWdlSGF2ZUlubGluZUVkaXQodGhpcy5iYXNlLmdldFJvdXRpbmdUYXJnZXROYW1lKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmUgdGhlIGlubGluZSBlZGl0IGNoYW5nZXMuXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dFBhdGhcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZWQgb25jZSB0aGUgYmF0Y2ggaGFzIHJldHVybmVkLlxuXHQgKi9cblx0YXN5bmMgaW5saW5lRWRpdFNhdmUoYmluZGluZ0NvbnRleHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblxuXHRcdGNvbnN0IG1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRjb25zdCBoYXNUZWNobmljYWxNZXNzYWdlcyA9IG1lc3NhZ2VzLnNvbWUoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+ICFtZXNzYWdlSGFuZGxpbmcuaXNOb25UZWNobmljYWxNZXNzYWdlKG1lc3NhZ2UpKTtcblx0XHRpZiAoaGFzVGVjaG5pY2FsTWVzc2FnZXMpIHtcblx0XHRcdHRoaXMuYmFzZS5zZXRTaG93Rm9vdGVyKHRydWUpO1xuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIGludmFsaWQgdHlwZXMgd2Ugc2hvdWxkIG5vdCB0cnkgdG8gc2F2ZVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoIW1vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCkpIHtcblx0XHRcdHRoaXMuaW5saW5lRWRpdEVuZCgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0TWVzc2FnaW5nLnJlbW92ZUFsbE1lc3NhZ2VzKCk7XG5cdFx0XHR0aGlzLmlubGluZUVkaXRCaW5kaW5nQ29udGV4dFBhdGggPSBiaW5kaW5nQ29udGV4dFBhdGg7XG5cdFx0XHRhd2FpdCBtb2RlbC5zdWJtaXRCYXRjaChDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cud2FybmluZyhcIkVycm9yIHdoaWxlIHNhdmluZyBpbmxpbmUgZWRpdCBjaGFuZ2VzXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBpbmxpbmUgZWRpdCBjaGFuZ2VzLlxuXHQgKi9cblx0aW5saW5lRWRpdERpc2NhcmQoKTogdm9pZCB7XG5cdFx0dGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpLnJlc2V0Q2hhbmdlcyhDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQpO1xuXHRcdHRoaXMuaW5saW5lRWRpdEVuZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuZCB0aGUgaW5saW5lIGVkaXQuXG5cdCAqL1xuXHRpbmxpbmVFZGl0RW5kKCk6IHZvaWQge1xuXHRcdE1lc3NhZ2luZy5yZW1vdmVBbGxNZXNzYWdlcygpO1xuXHRcdHRoaXMuYmFzZS5zZXRTaG93Rm9vdGVyKGZhbHNlKTtcblx0XHRmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5pbmxpbmVFZGl0Q29udHJvbHMpIHtcblx0XHRcdChjb250cm9sIGFzIEVuaGFuY2VXaXRoVUk1PEZpZWxkPiAmIElubGluZUVkaXQpLmlubGluZUVkaXRFbmQoKTtcblx0XHR9XG5cdFx0dGhpcy5pbmxpbmVFZGl0Q29udHJvbHMgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCB0aGUgaW5saW5lIGVkaXQgb24gdGhlIGJpbmRpbmdDb250ZXh0UGF0aCBmb3IgdGhlIHByb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlGdWxseVF1YWxpZmllZE5hbWVcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0UGF0aFxuXHQgKi9cblx0c3RhcnRJbmxpbmVFZGl0KHByb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmcsIGJpbmRpbmdDb250ZXh0UGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3QgaW5saW5lRWRpdFNlcnZpY2UgPSB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0SW5saW5lRWRpdFNlcnZpY2UoKTtcblx0XHRjb25zdCBkZXBlbmRlbnRQcm9wZXJ0aWVzID0gaW5saW5lRWRpdFNlcnZpY2UuZ2V0SW5saW5lQ29ubmVjdGVkUHJvcGVydGllcyhcblx0XHRcdHRoaXMuYmFzZS5nZXRSb3V0aW5nVGFyZ2V0TmFtZSgpLFxuXHRcdFx0cHJvcGVydHlGdWxseVF1YWxpZmllZE5hbWVcblx0XHQpO1xuXG5cdFx0dGhpcy5pbmxpbmVFZGl0U3RhcnQoW10sIGRlcGVuZGVudFByb3BlcnRpZXM/Lmxlbmd0aCA/IGRlcGVuZGVudFByb3BlcnRpZXMgOiBbcHJvcGVydHlGdWxseVF1YWxpZmllZE5hbWVdLCBiaW5kaW5nQ29udGV4dFBhdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZvY3VzIGhhbmRsaW5nIGZvciBpbmxpbmUgZWRpdC4gV2hlbiBvbmUgZmllbGQgZ2V0cyBmb2N1cywgYWxsIG90aGVyIGlubGluZSBlZGl0IHBvcHVwcywgdGhhdCBhcmUgY3VycmVudGx5IG9wZW5lZCwgc2hvdWxkIGJlIGNsb3NlZC5cblx0ICogQHBhcmFtIGlubGluZUVkaXRDb250cm9sIENvbnRyb2xzIHdoaWNoIGFyZSBjdXJyZW50bHkgaW4gaW5saW5lIGVkaXQgbW9kZS5cblx0ICovXG5cdGZvY3VzSGFuZGxpbmcoaW5saW5lRWRpdENvbnRyb2w6IENvbnRyb2wpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5pbmxpbmVFZGl0Q29udHJvbHMpIHtcblx0XHRcdGlmIChjb250cm9sICE9PSBpbmxpbmVFZGl0Q29udHJvbCkge1xuXHRcdFx0XHQoY29udHJvbCBhcyBFbmhhbmNlV2l0aFVJNTxGaWVsZD4gJiBJbmxpbmVFZGl0KS5jbG9zZUlubGluZUVkaXRQb3B1cEVkaXRNb2RlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wgPT09IGlubGluZUVkaXRDb250cm9sKSB7XG5cdFx0XHRcdGNvbnRyb2wuZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29uZmlybSB0aGUgc3RhcnQgb2YgdGhlIGlubGluZSBlZGl0IG9uIHRoZSBiaW5kaW5nQ29udGV4dFBhdGggZm9yIHRoZSBwcm9wZXJ0aWVzLlxuXHQgKiBAcGFyYW0gaW5saW5lRWRpdENvbnRyb2xzIFRoZSBmaWVsZHMgdGhhdCBhcmUgY3VycmVudGx5IGluIGlubGluZSBlZGl0IG1vZGUuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dFBhdGhcblx0ICovXG5cdEBob29rYWJsZShcIkJlZm9yZVwiKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGlubGluZUVkaXRTdGFydChpbmxpbmVFZGl0Q29udHJvbHM6IENvbnRyb2xbXSwgcHJvcGVydGllczogc3RyaW5nW10sIGJpbmRpbmdDb250ZXh0UGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3QgYWxyZWFkeVJlZ2lzdGVyZWRDb250cm9scyA9IHRoaXMuaW5saW5lRWRpdENvbnRyb2xzLm1hcCgoY29udHJvbDogQ29udHJvbCkgPT4gY29udHJvbC5nZXRJZCgpKTtcblx0XHRmb3IgKGNvbnN0IGNvbnRyb2wgb2YgaW5saW5lRWRpdENvbnRyb2xzKSB7XG5cdFx0XHRpZiAoIWFscmVhZHlSZWdpc3RlcmVkQ29udHJvbHMuaW5jbHVkZXMoY29udHJvbC5nZXRJZCgpKSkge1xuXHRcdFx0XHR0aGlzLmlubGluZUVkaXRDb250cm9scy5wdXNoKGNvbnRyb2wpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yIGlubGluZSBlZGl0LlxuXHQgKiBAcGFyYW0gcHJvcGVydHlGdWxseVF1YWxpZmllZE5hbWVcblx0ICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBjb25zaWRlcmVkIGZvciBJbmxpbmUgZWRpdC5cblx0ICovXG5cdGlzUHJvcGVydHlDb25zaWRlcmVkRm9ySW5saW5lRWRpdChwcm9wZXJ0eUZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZVxuXHRcdFx0LmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHQuZ2V0SW5saW5lRWRpdFNlcnZpY2UoKVxuXHRcdFx0LmlzUHJvcGVydHlDb25zaWRlcmVkRm9ySW5saW5lRWRpdCh0aGlzLmJhc2UuZ2V0Um91dGluZ1RhcmdldE5hbWUoKSwgcHJvcGVydHlGdWxseVF1YWxpZmllZE5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogaGFuZGxlIGlubGluZSBlZGl0IHNhdmUgc3VjY2VzcyBvciBmYWlsdXJlLlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGFzeW5jIGhhbmRsZUlubGluZUVkaXRQYXRjaFNlbnQoZXZlbnQ6IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTxVSTVFdmVudD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0ZXZlbnQuZ2V0U291cmNlKCkuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKHBhdGNoQ29tcGxldGVkRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbiB9PikgPT4ge1xuXHRcdFx0XHRjb25zdCBiU3VjY2VzcyA9IHBhdGNoQ29tcGxldGVkRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0aWYgKGJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShwYXRjaENvbXBsZXRlZEV2ZW50KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QocGF0Y2hDb21wbGV0ZWRFdmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBwYXRjaFByb21pc2U7XG5cdFx0XHR0aGlzLmlubGluZUVkaXRFbmQoKTtcblx0XHR9IGNhdGNoIChwYXRjaENvbXBsZXRlZEV2ZW50KSB7XG5cdFx0XHR0aGlzLmhhbmRsZUlubGluZUVkaXRTYXZlRmFpbGVkKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzaG93IHRoZSBlcnJvcnMgd2hlbiB0aGUgaW5saW5lIGVkaXQgc2F2ZSBmYWlscy5cblx0ICovXG5cdGhhbmRsZUlubGluZUVkaXRTYXZlRmFpbGVkKCk6IHZvaWQge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdGNvbnN0IG1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRpZiAobWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmJhc2Uuc2V0U2hvd0Zvb3Rlcih0cnVlKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLmlubGluZUVkaXRCaW5kaW5nQ29udGV4dFBhdGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHRhcmdldCBvZiBtZXNzYWdlLmdldFRhcmdldHMoKSkge1xuXHRcdFx0XHRjb25zdCB0YXJnZXRNZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChtZXRhTW9kZWwuZ2V0TWV0YVBhdGgodGFyZ2V0KSk7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VUYXJnZXREYXRhTW9kZWxPYmplY3QgPSB0YXJnZXRNZXRhQ29udGV4dFxuXHRcdFx0XHRcdD8gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0czx1bmtub3duPih0YXJnZXRNZXRhQ29udGV4dClcblx0XHRcdFx0XHQ6IG51bGw7XG5cdFx0XHRcdGlmIChpc1Byb3BlcnR5KG1lc3NhZ2VUYXJnZXREYXRhTW9kZWxPYmplY3Q/LnRhcmdldE9iamVjdCkpIHtcblx0XHRcdFx0XHRjb25zdCB0YXJnZXRGdWxseVF1YWxpZmllZE5hbWUgPVxuXHRcdFx0XHRcdFx0KG1lc3NhZ2VUYXJnZXREYXRhTW9kZWxPYmplY3QgYXMgdW5rbm93biBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pik/LnRhcmdldE9iamVjdD8uZnVsbHlRdWFsaWZpZWROYW1lID8/IFwiXCI7XG5cdFx0XHRcdFx0aWYgKHRoaXMuaXNQcm9wZXJ0eUNvbnNpZGVyZWRGb3JJbmxpbmVFZGl0KHRhcmdldEZ1bGx5UXVhbGlmaWVkTmFtZSkpIHtcblx0XHRcdFx0XHRcdHRoaXMuc3RhcnRJbmxpbmVFZGl0KHRhcmdldEZ1bGx5UXVhbGlmaWVkTmFtZSwgdGhpcy5pbmxpbmVFZGl0QmluZGluZ0NvbnRleHRQYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O01BcUJxQkEsY0FBYyxJQUFBQyxJQUFBLEdBRGxDQyxjQUFjLENBQUMsaURBQWlELENBQUMsRUFBQUMsS0FBQSxHQW1HaEVDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBQUgsSUFBQSxDQUFBSSxNQUFBLElBQUFDLE9BQUEsMEJBQUFDLHFCQUFBO0lBQUEsU0FBQVAsZUFBQTtNQUFBLElBQUFRLEtBQUE7TUFBQSxTQUFBQyxJQUFBLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxFQUFBQyxJQUFBLE9BQUFDLEtBQUEsQ0FBQUosSUFBQSxHQUFBSyxJ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
355
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbmxpbmVFZGl0RmxvdyIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwiaG9va2FibGUiLCJfZGVjMyIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzQiLCJfZGVjNSIsIl9kZWM2IiwiX2RlYzciLCJfY2xhc3MiLCJfY2xhc3MyIiwiX0Jhc2VDb250cm9sbGVyRXh0ZW5zIiwiX3RoaXMiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNhbGwiLCJpbmxpbmVFZGl0Q29udHJvbHMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJiYXNlIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0SW5saW5lRWRpdFNlcnZpY2UiLCJkb2VzUGFnZUhhdmVJbmxpbmVFZGl0IiwiZ2V0Um91dGluZ1RhcmdldE5hbWUiLCJpbmxpbmVFZGl0U2F2ZSIsIm1vZGVsIiwiZ2V0VmlldyIsImdldE1vZGVsIiwibWVzc2FnZXMiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiaGFzVGVjaG5pY2FsTWVzc2FnZXMiLCJzb21lIiwibWVzc2FnZSIsIm1lc3NhZ2VIYW5kbGluZyIsImlzTm9uVGVjaG5pY2FsTWVzc2FnZSIsInNldFNob3dGb290ZXIiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsIkNvbW1vblV0aWxzIiwiSU5MSU5FRURJVF9VUERBVEVHUk9VUElEIiwiaW5saW5lRWRpdEVuZCIsInJlbW92ZUFsbE1lc3NhZ2VzIiwic3VibWl0QmF0Y2giLCJlcnJvciIsIkxvZyIsIndhcm5pbmciLCJpbmxpbmVFZGl0RGlzY2FyZCIsInJlc2V0Q2hhbmdlcyIsInJlZnJlc2hEZXNjcmlwdGlvbiIsImNvbnRyb2wiLCJzZXRQcm9wZXJ0eSIsInN0YXJ0SW5saW5lRWRpdCIsInByb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lIiwiYmluZGluZ0NvbnRleHRQYXRoIiwiY29udHJvbFRyaWdnZXIiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwiRHJhZnRFeGlzdHNEaWFsb2ciLCJvcGVuIiwicmVzZXRJbmRpY2F0b3JQb3B1cCIsImlubGluZUVkaXRTZXJ2aWNlIiwiZGVwZW5kZW50UHJvcGVydGllcyIsImdldElubGluZUNvbm5lY3RlZFByb3BlcnRpZXMiLCJpbmxpbmVFZGl0U3RhcnQiLCJmb2N1c0hhbmRsaW5nIiwiaW5saW5lRWRpdENvbnRyb2wiLCJjbG9zZUlubGluZUVkaXRQb3B1cEVkaXRNb2RlIiwiZm9jdXMiLCJwcm9wZXJ0aWVzIiwiYWJvcnRUaW1lckJlZm9yZVNhdmUiLCJ1bmRlZmluZWQiLCJhbHJlYWR5UmVnaXN0ZXJlZENvbnRyb2xzIiwibWFwIiwiZ2V0SWQiLCJpbmNsdWRlcyIsInB1c2giLCJpbmxpbmVFZGl0QmluZGluZ0NvbnRleHRQYXRoIiwiaXNQcm9wZXJ0eUNvbnNpZGVyZWRGb3JJbmxpbmVFZGl0IiwiaGFuZGxlSW5saW5lRWRpdFBhdGNoU2VudCIsImV2ZW50IiwicGF0Y2hQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJnZXRTb3VyY2UiLCJhdHRhY2hFdmVudE9uY2UiLCJwYXRjaENvbXBsZXRlZEV2ZW50IiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYiIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiTWVzc2FnZVRvYXN0Iiwic2hvdyIsImdldFRleHQiLCJoYW5kbGVJbmxpbmVFZGl0U2F2ZUZhaWxlZCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInByb3BhZ2F0ZUlubGluZUZpZWxkR3JvdXBJZFRvTWVzc2FnZUJ1dHRvbiIsInRhcmdldCIsImdldFRhcmdldHMiLCJ0YXJnZXRNZXRhQ29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJtZXNzYWdlVGFyZ2V0RGF0YU1vZGVsT2JqZWN0IiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNQcm9wZXJ0eSIsInRhcmdldE9iamVjdCIsInRhcmdldEZ1bGx5UXVhbGlmaWVkTmFtZSIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImRlbGF5ZWRDYWxsVG9TYXZlIiwidGltZXJCZWZvcmVTYXZlIiwic2V0VGltZW91dCIsImUiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJkaWFsb2dSZXN1bHQiLCJvcGVuSW5saW5lRWRpdEJlZm9yZU5hdmlnYXRpb25EaWFsb2dBbmRXYWl0Rm9yUmVzdWx0IiwiQmVmb3JlTmF2aWdhdGlvbkRpYWxvZyIsIm9uQmVmb3JlQW55RWRpdEZsb3dBY3Rpb24iLCJCZWZvcmVBY3Rpb25EaWFsb2ciLCJvbkJlZm9yZUVkaXQiLCJvbkJlZm9yZUNyZWF0ZSIsIm9uQmVmb3JlRGVsZXRlIiwib25CZWZvcmVFeGVjdXRlQWN0aW9uIiwiZm9vdGVyQ29udHJvbHMiLCJnZXRGb290ZXIiLCJmaW5kQWdncmVnYXRlZE9iamVjdHMiLCJtYW5hZ2VkT2JqZWN0IiwiaXNBIiwiY2hpbGRGaWVsZEdyb3VwSWRzIiwiU2V0IiwiZ2V0RmllbGRHcm91cElkcyIsImFkZCIsInNldEZpZWxkR3JvdXBJZHMiLCJmcm9tIiwiQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24iLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJJbmxpbmVFZGl0Rmxvdy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBtZXRob2RPdmVycmlkZSwgdHlwZSBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGhvb2thYmxlIH0gZnJvbSBcInNhcC9mZS9iYXNlL0hvb2tTdXBwb3J0XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IEJlZm9yZUFjdGlvbkRpYWxvZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvaW5saW5lRWRpdEZsb3cvQmVmb3JlQWN0aW9uRGlhbG9nXCI7XG5pbXBvcnQgQmVmb3JlTmF2aWdhdGlvbkRpYWxvZywgeyB0eXBlIERJQUxPR1JFU1VMVCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9pbmxpbmVFZGl0Rmxvdy9CZWZvcmVOYXZpZ2F0aW9uRGlhbG9nXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBpc1Byb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHsgdHlwZSBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC9mZS9tYWNyb3MvRmllbGRcIjtcbmltcG9ydCB0eXBlIElubGluZUVkaXQgZnJvbSBcInNhcC9mZS9tYWNyb3MvaW5saW5lRWRpdC9JbmxpbmVFZGl0XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IExpYiBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUNvbnRleHRCaW5kaW5nJFBhdGNoU2VudEV2ZW50IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgRHJhZnRFeGlzdHNEaWFsb2cgZnJvbSBcIi4uL2NvbnRyb2xzL2lubGluZUVkaXRGbG93L0RyYWZ0RXhpc3RzRGlhbG9nXCI7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLklubGluZUVkaXRGbG93XCIpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmxpbmVFZGl0RmxvdyBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIGlubGluZUVkaXRDb250cm9sczogQ29udHJvbFtdID0gW107XG5cblx0cHJpdmF0ZSBpbmxpbmVFZGl0QmluZGluZ0NvbnRleHRQYXRoPzogc3RyaW5nO1xuXG5cdHByaXZhdGUgYWJvcnRUaW1lckJlZm9yZVNhdmU/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHBhdGNoUHJvbWlzZT86IFByb21pc2U8VUk1RXZlbnQ+O1xuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8ga25vdyBpZiB0aGVyZSBjYW4gYmUgaW5saW5lIGVkaXQgb24gdGhlIHBhZ2UuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgaW5saW5lIGVkaXQgaXMgcG9zc2libGVcblx0ICovXG5cdGlzSW5saW5lRWRpdFBvc3NpYmxlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0SW5saW5lRWRpdFNlcnZpY2UoKS5kb2VzUGFnZUhhdmVJbmxpbmVFZGl0KHRoaXMuYmFzZS5nZXRSb3V0aW5nVGFyZ2V0TmFtZSgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlIHRoZSBpbmxpbmUgZWRpdCBjaGFuZ2VzLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlZCBvbmNlIHRoZSBiYXRjaCBoYXMgcmV0dXJuZWQuXG5cdCAqL1xuXHRhc3luYyBpbmxpbmVFZGl0U2F2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblxuXHRcdGNvbnN0IG1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRjb25zdCBoYXNUZWNobmljYWxNZXNzYWdlcyA9IG1lc3NhZ2VzLnNvbWUoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+ICFtZXNzYWdlSGFuZGxpbmcuaXNOb25UZWNobmljYWxNZXNzYWdlKG1lc3NhZ2UpKTtcblx0XHRpZiAoaGFzVGVjaG5pY2FsTWVzc2FnZXMpIHtcblx0XHRcdHRoaXMuYmFzZS5zZXRTaG93Rm9vdGVyKHRydWUpO1xuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIGludmFsaWQgdHlwZXMgd2Ugc2hvdWxkIG5vdCB0cnkgdG8gc2F2ZVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoIW1vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCkpIHtcblx0XHRcdHRoaXMuaW5saW5lRWRpdEVuZCgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0TWVzc2FnaW5nLnJlbW92ZUFsbE1lc3NhZ2VzKCk7XG5cdFx0XHRhd2FpdCBtb2RlbC5zdWJtaXRCYXRjaChDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cud2FybmluZyhcIkVycm9yIHdoaWxlIHNhdmluZyBpbmxpbmUgZWRpdCBjaGFuZ2VzXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBpbmxpbmUgZWRpdCBjaGFuZ2VzLlxuXHQgKi9cblx0aW5saW5lRWRpdERpc2NhcmQoKTogdm9pZCB7XG5cdFx0dGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpLnJlc2V0Q2hhbmdlcyhDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQpO1xuXHRcdHRoaXMuaW5saW5lRWRpdEVuZCh0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmQgdGhlIGlubGluZSBlZGl0LlxuXHQgKiBAcGFyYW0gcmVmcmVzaERlc2NyaXB0aW9uXG5cdCAqL1xuXHRpbmxpbmVFZGl0RW5kKHJlZnJlc2hEZXNjcmlwdGlvbj86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRNZXNzYWdpbmcucmVtb3ZlQWxsTWVzc2FnZXMoKTtcblx0XHR0aGlzLmJhc2Uuc2V0U2hvd0Zvb3RlcihmYWxzZSk7XG5cdFx0Zm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaW5saW5lRWRpdENvbnRyb2xzKSB7XG5cdFx0XHQoY29udHJvbCBhcyBFbmhhbmNlV2l0aFVJNTxGaWVsZD4gJiBJbmxpbmVFZGl0KS5pbmxpbmVFZGl0RW5kKHJlZnJlc2hEZXNjcmlwdGlvbik7XG5cdFx0fVxuXHRcdHRoaXMuaW5saW5lRWRpdENvbnRyb2xzID0gW107XG5cdFx0dGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpLnNldFByb3BlcnR5KFwiL2lzSW5saW5lRWRpdEFjdGl2ZVwiLCBmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogU3RhcnQgdGhlIGlubGluZSBlZGl0IG9uIHRoZSBiaW5kaW5nQ29udGV4dFBhdGggZm9yIHRoZSBwcm9wZXJ0eUZ1bGx5UXVhbGlmaWVkTmFtZS5cblx0ICogQHBhcmFtIHByb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dFBhdGhcblx0ICogQHBhcmFtIGNvbnRyb2xUcmlnZ2VyXG5cdCAqL1xuXHRzdGFydElubGluZUVkaXQoXG5cdFx0cHJvcGVydHlGdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZyxcblx0XHRiaW5kaW5nQ29udGV4dFBhdGg6IHN0cmluZyxcblx0XHRjb250cm9sVHJpZ2dlcj86IEVuaGFuY2VXaXRoVUk1PEZpZWxkPiAmIElubGluZUVkaXRcblx0KTogdm9pZCB7XG5cdFx0aWYgKGNvbnRyb2xUcmlnZ2VyPy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpKSB7XG5cdFx0XHQvLyB0aGVyZSBpcyBhbHJlYWR5IGEgZHJhZnQgb24gdGhlIGVudGl0eS4gV2Ugc2hvdWxkIG5vdCBzdGFydCBpbmxpbmUgZWRpdFxuXHRcdFx0bmV3IERyYWZ0RXhpc3RzRGlhbG9nKHRoaXMuYmFzZS5nZXRWaWV3KCkpLm9wZW4oKTtcblx0XHRcdGNvbnRyb2xUcmlnZ2VyPy5yZXNldEluZGljYXRvclBvcHVwKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGlubGluZUVkaXRTZXJ2aWNlID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldElubGluZUVkaXRTZXJ2aWNlKCk7XG5cdFx0Y29uc3QgZGVwZW5kZW50UHJvcGVydGllcyA9IGlubGluZUVkaXRTZXJ2aWNlLmdldElubGluZUNvbm5lY3RlZFByb3BlcnRpZXMoXG5cdFx0XHR0aGlzLmJhc2UuZ2V0Um91dGluZ1RhcmdldE5hbWUoKSxcblx0XHRcdHByb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0KTtcblxuXHRcdHRoaXMuaW5saW5lRWRpdFN0YXJ0KFtdLCBkZXBlbmRlbnRQcm9wZXJ0aWVzPy5sZW5ndGggPyBkZXBlbmRlbnRQcm9wZXJ0aWVzIDogW3Byb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lXSwgYmluZGluZ0NvbnRleHRQYXRoKTtcblx0XHR0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikuc2V0UHJvcGVydHkoXCIvaXNJbmxpbmVFZGl0QWN0aXZlXCIsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZvY3VzIGhhbmRsaW5nIGZvciBpbmxpbmUgZWRpdC4gV2hlbiBvbmUgZmllbGQgZ2V0cyBmb2N1cywgYWxsIG90aGVyIGlubGluZSBlZGl0IHBvcHVwcywgdGhhdCBhcmUgY3VycmVudGx5IG9wZW5lZCwgc2hvdWxkIGJlIGNsb3NlZC5cblx0ICogQHBhcmFtIGlubGluZUVkaXRDb250cm9sIENvbnRyb2xzIHdoaWNoIGFyZSBjdXJyZW50bHkgaW4gaW5saW5lIGVkaXQgbW9kZS5cblx0ICovXG5cdGZvY3VzSGFuZGxpbmcoaW5saW5lRWRpdENvbnRyb2w6IENvbnRyb2wpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5pbmxpbmVFZGl0Q29udHJvbHMpIHtcblx0XHRcdGlmIChjb250cm9sICE9PSBpbmxpbmVFZGl0Q29udHJvbCkge1xuXHRcdFx0XHQoY29udHJvbCBhcyBFbmhhbmNlV2l0aFVJNTxGaWVsZD4gJiBJbmxpbmVFZGl0KS5jbG9zZUlubGluZUVkaXRQb3B1cEVkaXRNb2RlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wgPT09IGlubGluZUVkaXRDb250cm9sKSB7XG5cdFx0XHRcdGNvbnRyb2wuZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29uZmlybSB0aGUgc3RhcnQgb2YgdGhlIGlubGluZSBlZGl0IG9uIHRoZSBiaW5kaW5nQ29udGV4dFBhdGggZm9yIHRoZSBwcm9wZXJ0aWVzLlxuXHQgKiBAcGFyYW0gaW5saW5lRWRpdENvbnRyb2xzIFRoZSBmaWVsZHMgdGhhdCBhcmUgY3VycmVudGx5IGluIGlubGluZSBlZGl0IG1vZGUuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dFBhdGhcblx0ICovXG5cdEBob29rYWJsZShcIkJlZm9yZVwiKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFzeW5jIGlubGluZUVkaXRTdGFydChpbmxpbmVFZGl0Q29udHJvbHM6IENvbnRyb2xbXSwgcHJvcGVydGllczogc3RyaW5nW10sIGJpbmRpbmdDb250ZXh0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuYWJvcnRUaW1lckJlZm9yZVNhdmUpIHtcblx0XHRcdC8vIGlmIHRoZXJlIGlzICBhIHRpbWVyIHRvIHNhdmVcblx0XHRcdHRoaXMuYWJvcnRUaW1lckJlZm9yZVNhdmUoKTtcblx0XHRcdHRoaXMuYWJvcnRUaW1lckJlZm9yZVNhdmUgPSB1bmRlZmluZWQ7XG5cdFx0XHRhd2FpdCB0aGlzLmlubGluZUVkaXRTYXZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IGFscmVhZHlSZWdpc3RlcmVkQ29udHJvbHMgPSB0aGlzLmlubGluZUVkaXRDb250cm9scy5tYXAoKGNvbnRyb2w6IENvbnRyb2wpID0+IGNvbnRyb2wuZ2V0SWQoKSk7XG5cdFx0Zm9yIChjb25zdCBjb250cm9sIG9mIGlubGluZUVkaXRDb250cm9scykge1xuXHRcdFx0aWYgKCFhbHJlYWR5UmVnaXN0ZXJlZENvbnRyb2xzLmluY2x1ZGVzKGNvbnRyb2wuZ2V0SWQoKSkpIHtcblx0XHRcdFx0dGhpcy5pbmxpbmVFZGl0Q29udHJvbHMucHVzaChjb250cm9sKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5pbmxpbmVFZGl0QmluZGluZ0NvbnRleHRQYXRoID0gYmluZGluZ0NvbnRleHRQYXRoO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yIGlubGluZSBlZGl0LlxuXHQgKiBAcGFyYW0gcHJvcGVydHlGdWxseVF1YWxpZmllZE5hbWVcblx0ICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBjb25zaWRlcmVkIGZvciBJbmxpbmUgZWRpdC5cblx0ICovXG5cdGlzUHJvcGVydHlDb25zaWRlcmVkRm9ySW5saW5lRWRpdChwcm9wZXJ0eUZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZVxuXHRcdFx0LmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHQuZ2V0SW5saW5lRWRpdFNlcnZpY2UoKVxuXHRcdFx0LmlzUHJvcGVydHlDb25zaWRlcmVkRm9ySW5saW5lRWRpdCh0aGlzLmJhc2UuZ2V0Um91dGluZ1RhcmdldE5hbWUoKSwgcHJvcGVydHlGdWxseVF1YWxpZmllZE5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogaGFuZGxlIGlubGluZSBlZGl0IHNhdmUgc3VjY2VzcyBvciBmYWlsdXJlLlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGFzeW5jIGhhbmRsZUlubGluZUVkaXRQYXRjaFNlbnQoZXZlbnQ6IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLnBhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPFVJNUV2ZW50PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRldmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuIH0+KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRyZXNvbHZlKHBhdGNoQ29tcGxldGVkRXZlbnQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlamVjdChwYXRjaENvbXBsZXRlZEV2ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMucGF0Y2hQcm9taXNlO1xuXHRcdFx0dGhpcy5wYXRjaFByb21pc2UgPSB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYi5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0aWYgKHJlc291cmNlQnVuZGxlKSB7XG5cdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0lOTElORV9FRElUX1NBVkVEXCIpKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuaW5saW5lRWRpdEVuZCgpO1xuXHRcdH0gY2F0Y2ggKHBhdGNoQ29tcGxldGVkRXZlbnQpIHtcblx0XHRcdHRoaXMucGF0Y2hQcm9taXNlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5oYW5kbGVJbmxpbmVFZGl0U2F2ZUZhaWxlZCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gc2hvdyB0aGUgZXJyb3JzIHdoZW4gdGhlIGlubGluZSBlZGl0IHNhdmUgZmFpbHMuXG5cdCAqL1xuXHRoYW5kbGVJbmxpbmVFZGl0U2F2ZUZhaWxlZCgpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRjb25zdCBtZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0aWYgKG1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5iYXNlLnNldFNob3dGb290ZXIodHJ1ZSk7XG5cdFx0XHR0aGlzLnByb3BhZ2F0ZUlubGluZUZpZWxkR3JvdXBJZFRvTWVzc2FnZUJ1dHRvbigpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuaW5saW5lRWRpdEJpbmRpbmdDb250ZXh0UGF0aCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcblx0XHRcdGZvciAoY29uc3QgdGFyZ2V0IG9mIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpKSB7XG5cdFx0XHRcdGNvbnN0IHRhcmdldE1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXQpKTtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZVRhcmdldERhdGFNb2RlbE9iamVjdCA9IHRhcmdldE1ldGFDb250ZXh0XG5cdFx0XHRcdFx0PyBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzPHVua25vd24+KHRhcmdldE1ldGFDb250ZXh0KVxuXHRcdFx0XHRcdDogbnVsbDtcblx0XHRcdFx0aWYgKGlzUHJvcGVydHkobWVzc2FnZVRhcmdldERhdGFNb2RlbE9iamVjdD8udGFyZ2V0T2JqZWN0KSkge1xuXHRcdFx0XHRcdGNvbnN0IHRhcmdldEZ1bGx5UXVhbGlmaWVkTmFtZSA9XG5cdFx0XHRcdFx0XHQobWVzc2FnZVRhcmdldERhdGFNb2RlbE9iamVjdCBhcyB1bmtub3duIGFzIERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+KT8udGFyZ2V0T2JqZWN0Py5mdWxseVF1YWxpZmllZE5hbWUgPz8gXCJcIjtcblx0XHRcdFx0XHRpZiAodGhpcy5pc1Byb3BlcnR5Q29uc2lkZXJlZEZvcklubGluZUVkaXQodGFyZ2V0RnVsbHlRdWFsaWZpZWROYW1lKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5zdGFydElubGluZUVkaXQodGFyZ2V0RnVsbHlRdWFsaWZpZWROYW1lLCB0aGlzLmlubGluZUVkaXRCaW5kaW5nQ29udGV4dFBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBhIGRlbGF5ZWRDYWxsIHdoZW4geW91IGZvY3VzIG91dCBvZiBhIGZpZWxkLlxuXHQgKi9cblx0YXN5bmMgZGVsYXllZENhbGxUb1NhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuYWJvcnRUaW1lckJlZm9yZVNhdmUgfHwgdGhpcy5wYXRjaFByb21pc2UpIHtcblx0XHRcdC8vIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB0aW1lciBydW5uaW5nIG9yIGEgc2F2ZSBpbiBwcm9jZXNzIGRvIG5vdGhpbmdcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdGltZXJCZWZvcmVTYXZlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dGhpcy5hYm9ydFRpbWVyQmVmb3JlU2F2ZSA9IHJlamVjdDtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCA1MDApO1xuXHRcdH0pO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aW1lckJlZm9yZVNhdmU7XG5cdFx0XHR0aGlzLmFib3J0VGltZXJCZWZvcmVTYXZlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5pbmxpbmVFZGl0U2F2ZSgpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdC8vIE5vdGhpbmcgdG8gc2VlIGl0IGlzIGp1c3Qgc29tZW9uZSB0aGF0IGNhbmNlbGxlZCB0aGUgdGltZXJcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGVuc3VyZSB3ZSBsZWF2ZSBpbmxpbmUgZWRpdCBiZWZvcmUgYW55IG5hdmlnYXRpb24uLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmV0cnVucyB0cnVlIGlmIHdlIG5lZWQgdG8gY2FuY2VsIG5hdmlnYXRpb24gYW5kIHN0YXkgaW4gaW5saW5lIGVkaXRcblx0ICovXG5cdEBtZXRob2RPdmVycmlkZShcInJvdXRpbmdcIilcblx0YXN5bmMgb25CZWZvcmVOYXZpZ2F0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICh0aGlzLmlubGluZUVkaXRDb250cm9scy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyB0aGVyZSBhcmUgY29udHJvbHMgaW4gaW5saW5lIGVkaXQgd2UgbmVlZCB0byBwcmV2ZW50IHRoZSBuYXZpZ2F0aW9uIGFuZCBzaG93IHRoZSBkaWFsb2dcblx0XHRcdGlmICh0aGlzLmFib3J0VGltZXJCZWZvcmVTYXZlKSB7XG5cdFx0XHRcdHRoaXMuYWJvcnRUaW1lckJlZm9yZVNhdmUoKTtcblx0XHRcdFx0dGhpcy5hYm9ydFRpbWVyQmVmb3JlU2F2ZSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGlmICghdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCkpIHtcblx0XHRcdFx0Ly8gZmllbGRzIGFyZSBpbiBpbmxpbmUgZWRpdCBhbmQgdGhlcmUgYXJlIG5vIHBlbmRpbmcgY2hhbmdlcy4gV2UgbmVlZCB0byBzaG93IHRoZSBkaWFsb2dcblx0XHRcdFx0dGhpcy5pbmxpbmVFZGl0RW5kKCk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmICh0aGlzLnBhdGNoUHJvbWlzZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGF0Y2hQcm9taXNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IGRpYWxvZ1Jlc3VsdCA9IGF3YWl0IHRoaXMub3BlbklubGluZUVkaXRCZWZvcmVOYXZpZ2F0aW9uRGlhbG9nQW5kV2FpdEZvclJlc3VsdCgpO1xuXHRcdFx0XHRcdGlmIChkaWFsb2dSZXN1bHQgPT09IFwiU2F2ZVwiKSB7XG5cdFx0XHRcdFx0XHQvLyB3ZSBzYXZlIGFuZCB3YWl0IGZvciB0aGUgcGF0Y2hQcm9taXNlXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmlubGluZUVkaXRTYXZlKCk7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaWYgYWZ0ZXIgc2F2ZXMgdGhlcmUgYXJlIHN0aWxsIGNoYW5nZXMgdGhpcyBtZWFucyBzYXZlIGhhcyBmYWlsZWQuIHdlIG5lZWQgdG8gY2FuY2VsIG5hdmlnYXRpb25cblx0XHRcdFx0XHRcdFx0dGhpcy5mb2N1c0hhbmRsaW5nKHRoaXMuaW5saW5lRWRpdENvbnRyb2xzWzBdKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChkaWFsb2dSZXN1bHQgPT09IFwiQ2FuY2VsXCIpIHtcblx0XHRcdFx0XHRcdHRoaXMuZm9jdXNIYW5kbGluZyh0aGlzLmlubGluZUVkaXRDb250cm9sc1swXSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gd2UgZGlzY2FyZCB0aGUgY2hhbmdlc1xuXHRcdFx0XHRcdFx0dGhpcy5pbmxpbmVFZGl0RGlzY2FyZCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0dGhpcy5mb2N1c0hhbmRsaW5nKHRoaXMuaW5saW5lRWRpdENvbnRyb2xzWzBdKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gb3BlbiB0aGUgZGlhbG9nIGJlZm9yZSBuYXZpZ2F0aW9uLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmV0dXJucyB0aGUgZGlhbG9nIGNob2ljZSBvbmNlIHRoZSB1c2VyIGhhcyBjbGlja2VkIG9uIG9rIG9yIGNhbmNlbFxuXHQgKi9cblx0YXN5bmMgb3BlbklubGluZUVkaXRCZWZvcmVOYXZpZ2F0aW9uRGlhbG9nQW5kV2FpdEZvclJlc3VsdCgpOiBQcm9taXNlPERJQUxPR1JFU1VMVD4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZTxESUFMT0dSRVNVTFQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRuZXcgQmVmb3JlTmF2aWdhdGlvbkRpYWxvZyh0aGlzLmJhc2UuZ2V0VmlldygpLCByZXNvbHZlKS5vcGVuKCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGVuc3VyZSB3ZSBsZWF2ZSBpbmxpbmUgZWRpdCBiZWZvcmUgYW55IHN0YW5kYXJkIGVkaXQgZmxvd2FjdGlvbi5cblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlamVjdCBhbmQgdHJpZ2dlcnMgc2F2ZSBvciBkaXNjYXJkIGlmIHdlIGFyZSBpbiBpbmxpbmUgZWRpdFxuXHQgKi9cblx0YXN5bmMgb25CZWZvcmVBbnlFZGl0Rmxvd0FjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5pbmxpbmVFZGl0Q29udHJvbHMubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKHRoaXMuYWJvcnRUaW1lckJlZm9yZVNhdmUpIHtcblx0XHRcdFx0dGhpcy5hYm9ydFRpbWVyQmVmb3JlU2F2ZSgpO1xuXHRcdFx0XHR0aGlzLmFib3J0VGltZXJCZWZvcmVTYXZlID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCF0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoQ29tbW9uVXRpbHMuSU5MSU5FRURJVF9VUERBVEVHUk9VUElEKSkge1xuXHRcdFx0XHQvLyBmaWVsZHMgYXJlIGluIGlubGluZSBlZGl0IGFuZCB0aGVyZSBhcmUgbm8gcGVuZGluZyBjaGFuZ2VzLiBXZSBkb24ndCBuZWVkIHRvIHNob3cgdGhlIGRpYWxvZ1xuXHRcdFx0XHR0aGlzLmlubGluZUVkaXRFbmQoKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fVxuXHRcdFx0bmV3IEJlZm9yZUFjdGlvbkRpYWxvZyh0aGlzLmJhc2UuZ2V0VmlldygpKS5vcGVuKCk7XG5cdFx0XHQvLyB0aGVyZSBhcmUgY29udHJvbHMgaW4gaW5saW5lIGVkaXQgd2UgbmVlZCB0byBwcmV2ZW50IHRoZSBhY3Rpb24gYW5kIHNob3cgdGhlIGRpYWxvZ1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgYmVmb3JlIGVkaXQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZWplY3QgaWYgZWRpdCBuZWVkcyB0byBiZSBjYW5jZWxsZWRcblx0ICovXG5cdEBtZXRob2RPdmVycmlkZShcImVkaXRGbG93XCIpXG5cdGFzeW5jIG9uQmVmb3JlRWRpdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5vbkJlZm9yZUFueUVkaXRGbG93QWN0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlIGJlZm9yZSBjcmVhdGUuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZWplY3QgaWYgY3JldGFlIG5lZWRzIHRvIGJlIGNhbmNlbGxlZFxuXHQgKi9cblx0QG1ldGhvZE92ZXJyaWRlKFwiZWRpdEZsb3dcIilcblx0YXN5bmMgb25CZWZvcmVDcmVhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMub25CZWZvcmVBbnlFZGl0Rmxvd0FjdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZSBiZWZvcmUgZGVsZXRlLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVqZWN0IGlmIGRlbGV0ZSBuZWVkcyB0byBiZSBjYW5jZWxsZWRcblx0ICovXG5cdEBtZXRob2RPdmVycmlkZShcImVkaXRGbG93XCIpXG5cdGFzeW5jIG9uQmVmb3JlRGVsZXRlKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLm9uQmVmb3JlQW55RWRpdEZsb3dBY3Rpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgYmVmb3JlIGFjdGlvbi5cblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlamVjdCBpZiBkZWxldGUgbmVlZHMgdG8gYmUgY2FuY2VsbGVkXG5cdCAqL1xuXHRAbWV0aG9kT3ZlcnJpZGUoXCJlZGl0Rmxvd1wiKVxuXHRhc3luYyBvbkJlZm9yZUV4ZWN1dGVBY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMub25CZWZvcmVBbnlFZGl0Rmxvd0FjdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb3BhZ2F0ZSB0aGUgZmllbGQgZ3JvdXAgaWQgdG8gdGhlIG1lc3NhZ2UgYnV0dG9uLlxuXHQgKi9cblx0cHJpdmF0ZSBwcm9wYWdhdGVJbmxpbmVGaWVsZEdyb3VwSWRUb01lc3NhZ2VCdXR0b24oKTogdm9pZCB7XG5cdFx0Ly8gd2UgcHJvcGFnYXRlIHRoZSBmaWVsZGdyb3VwSWQgdG8gdGhlIGZvb3RlciBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyB0byBlbnN1cmUgdGhhdFxuXHRcdC8vIGNsaWNraW5nIG9uIHRoZSBmb290ZXIgZG9lcyBub3QgdHJpZ2dlciBhIGZvY3Vzb3V0IGFuZCBhIHNhdmUgZm9yIHRoZSBpbmxpbmUgZWRpdFxuXHRcdGNvbnN0IGZvb3RlckNvbnRyb2xzID1cblx0XHRcdCh0aGlzLmJhc2Vcblx0XHRcdFx0LmdldEZvb3RlcigpXG5cdFx0XHRcdD8uZmluZEFnZ3JlZ2F0ZWRPYmplY3RzKHRydWUsIChtYW5hZ2VkT2JqZWN0OiBNYW5hZ2VkT2JqZWN0KSA9PiBtYW5hZ2VkT2JqZWN0LmlzQTxDb250cm9sPihcInNhcC51aS5jb3JlLkNvbnRyb2xcIikpIGFzXG5cdFx0XHRcdHwgQ29udHJvbFtdXG5cdFx0XHRcdHwgdW5kZWZpbmVkKSA/PyBbXTtcblxuXHRcdGZvciAoY29uc3QgY29udHJvbCBvZiBmb290ZXJDb250cm9scykge1xuXHRcdFx0Y29uc3QgY2hpbGRGaWVsZEdyb3VwSWRzID0gbmV3IFNldChjb250cm9sLmdldEZpZWxkR3JvdXBJZHMoKSk7XG5cdFx0XHRjaGlsZEZpZWxkR3JvdXBJZHMuYWRkKFwiSW5saW5lRWRpdFwiKTtcblx0XHRcdGNvbnRyb2wuc2V0RmllbGRHcm91cElkcyhBcnJheS5mcm9tKGNoaWxkRmllbGRHcm91cElkcykpO1xuXHRcdH1cblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O01BMEJxQkEsY0FBYyxJQUFBQyxJQUFBLEdBRGxDQyxjQUFjLENBQUMsaURBQWlELENBQUMsRUFBQUMsS0FBQSxHQW1IaEVDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBQUMsS0FBQSxHQW9IbEJDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBQUMsS0FBQSxHQStFekJELGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBQUUsS0FBQSxHQVMxQkYsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFBRyxLQUFBLEdBUzFCSCxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUFJLEtB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Q0FBVSxxQkFBcUIsQ0FBQyxDQUFDLElBRWxHLEVBQUU7TUFFcEIsS0FBSyxNQUFNaEYsT0FBTyxJQUFJNEUsY0FBYyxFQUFFO1FBQ3JDLE1BQU1LLGtCQUFrQixHQUFHLElBQUlDLEdBQUcsQ0FBQ2xGLE9BQU8sQ0FBQ21GLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUM5REYsa0JBQWtCLENBQUNHLEdBQUcsQ0FBQyxZQUFZLENBQUM7UUFDcENwRixPQUFPLENBQUNxRixnQkFBZ0IsQ0FBQzdILEtBQUssQ0FBQzhILElBQUksQ0FBQ0wsa0JBQWtCLENBQUMsQ0FBQztNQUN6RDtJQUNELENBQUM7SUFBQSxPQUFBNUksY0FBQTtFQUFBLEVBdlcwQ2tKLHVCQUF1QixHQUFBQyx5QkFBQSxDQUFBdkksT0FBQSxDQUFBYyxTQUFBLHNCQUFBdkIsS0FBQSxHQUFBaUosTUFBQSxDQUFBQyx3QkFBQSxDQUFBekksT0FBQSxDQUFBYyxTQUFBLHNCQUFBZCxPQUFBLENBQUFjLFNBQUEsR0FBQXlILHlCQUFBLENBQUF2SSxPQUFBLENBQUFjLFNBQUEseUJBQUFyQixLQUFBLEdBQUErSSxNQUFBLENBQUFDLHdCQUFBLENBQUF6SSxPQUFBLENBQUFjLFNBQUEseUJBQUFkLE9BQUEsQ0FBQWMsU0FBQSxHQUFBeUgseUJBQUEsQ0FBQXZJLE9BQUEsQ0FBQWMsU0FBQSxtQkFBQW5CLEtBQUEsR0FBQTZJLE1BQUEsQ0FBQUMsd0JBQUEsQ0FBQXpJLE9BQUEsQ0FBQWMsU0FBQSxtQkFBQWQsT0FBQSxDQUFBYyxTQUFBLEdBQUF5SCx5QkFBQSxDQUFBdkksT0FBQSxDQUFBYyxTQUFBLHFCQUFBbEIsS0FBQSxHQUFBNEksTUFBQSxDQUFBQyx3QkFBQSxDQUFBekksT0FBQSxDQUFBYyxTQUFBLHFCQUFBZCxPQUFBLENBQUFjLFNBQUEsR0FBQXlILHlCQUFBLENBQUF2SSxPQUFBLENBQUFjLFNBQUEscUJBQUFqQixLQUFBLEdBQUEySSxNQUFBLENBQUFDLHdCQUFBLENBQUF6SSxPQUFBLENBQUFjLFNBQUEscUJBQUFkLE9BQUEsQ0FBQWMsU0FBQSxHQUFBeUgseUJBQUEsQ0FBQXZJLE9BQUEsQ0FBQWMsU0FBQSw0QkFBQWhCLEtBQUEsR0FBQTBJLE1BQUEsQ0FBQUMsd0JBQUEsQ0FBQXpJLE9BQUEsQ0FBQWMsU0FBQSw0QkFBQWQsT0FBQSxDQUFBYyxTQUFBLEdBQUFkLE9BQUEsTUFBQUQsTUFBQTtFQUFBWSxRQUFBLEdBQUF2QixjQUFBO0VBQUEsT0FBQXVCLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==