@sapui5/sap.fe.core 1.141.2 → 1.142.1

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 (207) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +4 -1
  3. package/src/sap/fe/core/ActionRuntime.js +48 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +61 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +94 -8
  7. package/src/sap/fe/core/AppStateHandler.js +9 -8
  8. package/src/sap/fe/core/AppStateHandler.ts +13 -9
  9. package/src/sap/fe/core/BaseController.js +8 -5
  10. package/src/sap/fe/core/BaseController.ts +6 -1
  11. package/src/sap/fe/core/CommonUtils.js +4 -123
  12. package/src/sap/fe/core/CommonUtils.ts +3 -172
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -10
  14. package/src/sap/fe/core/ExtensionAPI.ts +2 -14
  15. package/src/sap/fe/core/PageController.js +64 -43
  16. package/src/sap/fe/core/PageController.ts +62 -47
  17. package/src/sap/fe/core/TemplateComponent.js +20 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +24 -2
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
  21. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
  23. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
  24. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
  25. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +4 -1
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -0
  27. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
  28. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
  29. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -39
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +91 -54
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -3
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -3
  33. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
  34. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +8 -9
  41. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
  44. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
  45. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +9 -5
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +7 -7
  49. package/src/sap/fe/core/controllerextensions/Share.js +5 -5
  50. package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
  53. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
  54. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
  55. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +33 -11
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +45 -14
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +7 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +6 -5
  65. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  66. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +10 -6
  70. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -5
  71. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +11 -9
  72. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +22 -9
  73. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  74. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  75. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +31 -2
  76. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +34 -1
  77. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  78. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  79. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  80. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  81. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  82. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  83. package/src/sap/fe/core/converters/common/AnnotationConverter.js +88 -35
  84. package/src/sap/fe/core/converters/controls/Common/Action.js +57 -20
  85. package/src/sap/fe/core/converters/controls/Common/Action.ts +71 -21
  86. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  87. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  88. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  89. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  90. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -57
  91. package/src/sap/fe/core/converters/controls/Common/Table.ts +110 -56
  92. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  93. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  94. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  95. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +172 -78
  96. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
  98. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  100. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  101. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  102. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  103. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  104. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  105. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  106. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  107. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  108. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
  110. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  112. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  113. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  114. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  115. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  118. package/src/sap/fe/core/fpm/Component.js +8 -1
  119. package/src/sap/fe/core/fpm/Component.ts +8 -0
  120. package/src/sap/fe/core/fpm/manifest.json +1 -1
  121. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  122. package/src/sap/fe/core/helpers/AppStartupHelper.ts +91 -32
  123. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  124. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  125. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  126. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  127. package/src/sap/fe/core/helpers/ModelHelper.js +48 -9
  128. package/src/sap/fe/core/helpers/ModelHelper.ts +55 -10
  129. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  130. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  131. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  132. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  133. package/src/sap/fe/core/library.js +30 -3
  134. package/src/sap/fe/core/library.ts +28 -1
  135. package/src/sap/fe/core/messagebundle.properties +8 -1
  136. package/src/sap/fe/core/messagebundle_ar.properties +7 -0
  137. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  138. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  139. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  140. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  141. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  143. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  144. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  146. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +5 -0
  148. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  149. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  152. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  153. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  154. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  159. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  167. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_no.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  175. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  184. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  185. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  186. package/src/sap/fe/core/rootView/Fcl.controller.ts +28 -6
  187. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  188. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  189. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  190. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  191. package/src/sap/fe/core/services/RoutingServiceFactory.js +16 -7
  192. package/src/sap/fe/core/services/RoutingServiceFactory.ts +23 -10
  193. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  194. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  195. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +62 -6
  196. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +74 -11
  197. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  198. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  200. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  201. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  202. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  203. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  204. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  205. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  206. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  207. package/ui5.yaml +2 -0
@@ -157,6 +157,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
157
157
  private entityTypeRegexPattern!: RegExp;
158
158
 
159
159
  private webSocketStatus!: WEBSOCKET_STATUS;
160
+
160
161
  // Interaction type for SideEffects events
161
162
  private interactionTypeDefinition?: SideEffectsEventsInteractionManifestSetting;
162
163
 
@@ -191,7 +192,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
191
192
  const channel = getWebSocketChannelUrl(ChannelType.SideEffectsEvents, model);
192
193
 
193
194
  if (url && channel) {
194
- this.webSocket = createWebSocket(ChannelType.SideEffectsEvents, model);
195
+ this.webSocket = createWebSocket(ChannelType.SideEffectsEvents, this.appComponent);
195
196
  this.webSocket.attachMessage(this.onSideEffectsEventReceived.bind(this));
196
197
  this.webSocketStatus = WEBSOCKET_STATUS.CONNECTED;
197
198
 
@@ -400,7 +401,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
400
401
  if (executionOptions.submitBatch != false) {
401
402
  context.getModel().submitBatch(groupId);
402
403
  }
403
- await action.execute(groupId, true);
404
+ await action.invoke(groupId, true);
404
405
  }
405
406
 
406
407
  /**
@@ -557,9 +558,8 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
557
558
  }
558
559
  };
559
560
  source.entityProperties.forEach((property) => {
560
- const commonAnno = property.annotations.Common as PropertyAnnotationsWithRecommendation;
561
- if (commonAnno?.RecommendationRole) {
562
- const roleType = commonAnno.RecommendationRole;
561
+ const roleType = (property.annotations.Common as PropertyAnnotationsWithRecommendation)?.RecommendationRole;
562
+ if (roleType) {
563
563
  if (roleType.valueOf().includes("Input")) {
564
564
  addRecommendationRoles(`${source.name}`);
565
565
  this.recommendationRegistry.roles[`${source.name}`].input.push(property.name);
@@ -583,6 +583,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
583
583
  * @returns True if field is has recommendation role - Input annotation
584
584
  */
585
585
  public checkIfFieldIsRecommendationRelevant(field: Control): boolean {
586
+ // Runtime call
586
587
  const context = field.getBindingContext();
587
588
  const propertyName = field.data().sourcePath.split("/").pop();
588
589
  if (context) {
@@ -610,6 +611,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
610
611
  * @returns Array of property names which are marked RecommendationRole Output
611
612
  */
612
613
  public getRecommendationOutputFields(entityTypeName: string): string[] {
614
+ // Runtime ish
613
615
  //TODO: We have to consider 1:1 navigation properties as well.
614
616
  const recommendationRolesForEntity = this.recommendationRegistry.roles[entityTypeName];
615
617
  if (recommendationRolesForEntity?.output?.length > 0) {
@@ -1127,9 +1129,12 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
1127
1129
  */
1128
1130
  private getSideEffectsAnnotationFromSource(source: EntityType | Action): CommonSideEffectTypeWithQualifier[] {
1129
1131
  const sideEffects: CommonSideEffectsType[] = [];
1130
- const commonAnnotation = source.annotations?.Common as undefined | unknown as Record<string, CommonSideEffectTypeWithQualifier>;
1131
- for (const key in commonAnnotation) {
1132
- const annotation = commonAnnotation[key];
1132
+ const commonAnnotation = source.annotations?.Common as unknown as
1133
+ | undefined
1134
+ | (Record<string, CommonSideEffectTypeWithQualifier> & { _keys?: string[] });
1135
+ const existingKeys = commonAnnotation?._keys?.filter((key) => key.startsWith("SideEffects")) ?? [];
1136
+ for (const key of existingKeys) {
1137
+ const annotation = commonAnnotation![key];
1133
1138
  if (this.isSideEffectsAnnotation(annotation)) {
1134
1139
  sideEffects.push(annotation);
1135
1140
  }
@@ -50,11 +50,15 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
50
50
  }
51
51
  }
52
52
  const sCacheIdentifier = `${oAppComponent.getMetadata().getName()}_${sStableId}_${Localization.getLanguageTag()}`;
53
+ const bundlesToLoad = ["sap.fe.core.messagebundle", "sap.fe.macros.messagebundle", "sap.fe.templates.messagebundle"];
54
+ if (oComponent._getAdditionalI18nBundles) {
55
+ bundlesToLoad.push(...oComponent._getAdditionalI18nBundles());
56
+ }
53
57
  aServiceDependencies.push(ServiceFactoryRegistry.get("sap.fe.core.services.ResourceModelService").createInstance({
54
58
  scopeType: "component",
55
59
  scopeObject: oComponent,
56
60
  settings: {
57
- bundles: ["sap.fe.core.messagebundle", "sap.fe.macros.messagebundle", "sap.fe.templates.messagebundle"],
61
+ bundles: bundlesToLoad,
58
62
  enhanceI18n: aEnhanceI18n,
59
63
  modelName: "sap.fe.i18n"
60
64
  }
@@ -157,6 +161,10 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
157
161
  if (oViewSettings.preprocessors) {
158
162
  oViewSettings.preprocessors.xml.models["error"] = new JSONModel(reason);
159
163
  }
164
+ delete oViewSettings.cache;
165
+ oViewSettings.id += "-Error";
166
+ oViewSettings.viewData.stableId += "-Error";
167
+ delete oViewSettings.controller;
160
168
  return oComponent.runAsOwner(async () => {
161
169
  return View.create(oViewSettings).then(oView => {
162
170
  this.oView = oView;
@@ -180,7 +188,10 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
180
188
  let sFullContextPath = oAppComponent.getRoutingService().getTargetInformationFor(oComponent)?.options?.settings?.fullContextPath ?? "";
181
189
  if (!sFullContextPath) {
182
190
  // if the context path couldn't be retrieved from the routing service, try to get it from the component itself
183
- sFullContextPath = oComponent.getContextPath() ?? "";
191
+ const componentContextPath = oComponent.getContextPath();
192
+ if (componentContextPath) {
193
+ sFullContextPath = componentContextPath.endsWith("/") ? componentContextPath : `${componentContextPath}/`;
194
+ }
184
195
  }
185
196
  const oMetaModel = oAppComponent.getMetaModel();
186
197
  const oManifestContent = oAppComponent.getManifest();
@@ -290,17 +301,62 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
290
301
  oViewSettings = this._getViewSettings(preprocessorContext, mServiceSettings, oComponent, mViewData, sCacheKey, oPageModel, oResourceModel);
291
302
  // Setting the pageModel on the component for potential reuse
292
303
  oComponent.setModel(oPageModel, "_pageModel");
304
+ oComponent.setModel(oViewDataModel, "viewData");
305
+ const uiModel = oAppComponent.getModel("ui");
306
+ const internalModel = oAppComponent.getModel("internal");
307
+ oComponent.setModel(uiModel, "ui");
308
+ oComponent.setModel(internalModel, "internal");
309
+ oComponent.setModel(internalModel, "pageInternal");
310
+ const path = `/pages/${oViewSettings.id}`;
311
+ uiModel.setProperty(path, {
312
+ controls: {}
313
+ });
314
+ internalModel.setProperty(path, {
315
+ controls: {},
316
+ collaboration: {}
317
+ });
318
+ let targetUIModelContext = "/";
319
+ if (oComponent.isA("sap.fe.templates.ListReport.Component")) {
320
+ targetUIModelContext = `/${oViewSettings.id}`;
321
+ }
322
+ oComponent.setBindingContext(uiModel.createBindingContext(targetUIModelContext), "ui");
323
+ oComponent.setBindingContext(internalModel.createBindingContext(path), "internal");
324
+
325
+ // for the time being provide it also pageInternal as some macros access it - to be removed
326
+ oComponent.setBindingContext(internalModel.createBindingContext(path), "pageInternal");
293
327
  oComponent.setPreprocessorContext(preprocessorContext);
294
328
  return oComponent.runAsOwner(async () => {
295
329
  return View.create(oViewSettings).then(oView => {
296
330
  this.oView = oView;
297
331
  const viewJSONModel = new JSONModel(this.oView);
298
332
  ModelHelper.enhanceViewJSONModel(viewJSONModel);
299
- this.oView.setModel(viewJSONModel, "$view");
300
- this.oView.setModel(oViewDataModel, "viewData");
333
+ oComponent.setModel(viewJSONModel, "$view");
334
+ if (oAppComponent.hideViewDuringCreation && oComponent.isA("sap.fe.templates.ObjectPage.Component")) {
335
+ this.oView.setVisible(false);
336
+ }
301
337
  oComponent.setAggregation("rootControl", this.oView);
338
+ if (oAppComponent.eagerViewCreation) {
339
+ setTimeout(() => {
340
+ for (const navName in mNavigation) {
341
+ const routingTargets = oAppComponent.getRoutingService()._getRouteInformation(mNavigation[navName].detail.route)?.targetsWithInfo;
342
+ if (routingTargets) {
343
+ for (const routingTarget of routingTargets) {
344
+ const routingTargetName = typeof routingTarget === "string" ? routingTarget : routingTarget.name;
345
+ const routerTarget = oAppComponent.getRouter().getTarget(routingTargetName);
346
+ if (routerTarget && !Array.isArray(routerTarget)) {
347
+ routerTarget.load(routingTarget);
348
+ }
349
+ }
350
+ }
351
+ }
352
+ }, 2000); // Delay a bit to not block the initial rendering
353
+ }
302
354
  return sCacheKey;
303
- }).catch(async reason => this._createErrorPage(reason, oViewSettings, mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage", oComponent, sCacheKey)).catch(e => Log.error(e.message, e));
355
+ }).catch(async reason => {
356
+ oComponent.getRootController()?.destroy();
357
+ oComponent.setRootController();
358
+ return this._createErrorPage(reason, oViewSettings, mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage", oComponent, sCacheKey);
359
+ }).catch(e => Log.error(e.message, e));
304
360
  });
305
361
  } catch (error) {
306
362
  Log.error(error.message, error);
@@ -441,4 +497,4 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
441
497
  _exports.TemplatedViewServiceFactory = TemplatedViewServiceFactory;
442
498
  return _exports;
443
499
  }, false);
444
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZSIsIl9TZXJ2aWNlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiaW5pdCIsImFTZXJ2aWNlRGVwZW5kZW5jaWVzIiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwidmlld1ByZWxvYWRlclNlcnZpY2UiLCJnZXRWaWV3UHJlbG9hZGVyU2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJwYWdlSWQiLCJnZXRMb2NhbElkIiwiZ2V0SWQiLCJzU3RhYmxlSWQiLCJnZXRNZXRhZGF0YSIsImdldENvbXBvbmVudE5hbWUiLCJhRW5oYW5jZUkxOG4iLCJnZXRFbmhhbmNlSTE4biIsInNBcHBOYW1lc3BhY2UiLCJvRmFjdG9yeSIsImZhY3RvcnkiLCJpIiwibGVuZ3RoIiwib1Jlc291cmNlTW9kZWwiLCJnZXRNb2RlbCIsImlzQSIsInJlcGxhY2UiLCJzQ2FjaGVJZGVudGlmaWVyIiwiZ2V0TmFtZSIsIkxvY2FsaXphdGlvbiIsImdldExhbmd1YWdlVGFnIiwicHVzaCIsIlNlcnZpY2VGYWN0b3J5UmVnaXN0cnkiLCJnZXQiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsInNldHRpbmdzIiwiYnVuZGxlcyIsImVuaGFuY2VJMThuIiwibW9kZWxOYW1lIiwidGhlbiIsIm9SZXNvdXJjZU1vZGVsU2VydmljZSIsImdldFJlc291cmNlTW9kZWwiLCJtZXRhTW9kZWwiLCJhcHBDb21wb25lbnQiLCJjb21wb25lbnQiLCJvQ2FjaGVIYW5kbGVyU2VydmljZSIsImlzQ2FjaGVSZWFkeSIsInZhbGlkYXRlQ2FjaGVLZXkiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsIlZlcnNpb25JbmZvIiwibG9hZCIsIm9JbmZvIiwic1RpbWVzdGFtcCIsImxpYnJhcmllcyIsIkNvcmUiLCJidWlsZGluZm8iLCJidWlsZHRpbWUiLCJmb3JFYWNoIiwib0xpYnJhcnkiLCJidWlsZFRpbWVzdGFtcCIsImNhdGNoIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwiYWxsIiwiYURlcGVuZGVuY2llc1Jlc3VsdCIsInNDYWNoZUtleSIsIlRlbXBsYXRlQ29udmVydGVyIiwiTWV0YU1vZGVsQ29udmVydGVyIiwicmVxdWlyZURlcGVuZGVuY2llcyIsImNyZWF0ZVZpZXciLCJnZXRJbnN0YW5jZSIsImludmFsaWRhdGVJZk5lZWRlZCIsInJlZnJlc2hWaWV3Iiwib1Jvb3RWaWV3IiwiZ2V0Um9vdENvbnRyb2wiLCJkZXN0cm95Iiwib1ZpZXciLCJyZXNvdXJjZU1vZGVsIiwic3RhYmxlSWQiLCJnZXRVSUFyZWEiLCJpbnZhbGlkYXRlIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJfZ2V0Vmlld1NldHRpbmdzIiwicHJlcHJvY2Vzc29yQ29udGV4dCIsIm1TZXJ2aWNlU2V0dGluZ3MiLCJtVmlld0RhdGEiLCJvUGFnZU1vZGVsIiwidmlld1R5cGUiLCJnZXRWaWV3VHlwZSIsInVuZGVmaW5lZCIsInR5cGUiLCJwcmVwcm9jZXNzb3JzIiwieG1sIiwiY29udHJvbHMiLCJpZCIsInZpZXdOYW1lIiwiZ2V0Vmlld05hbWUiLCJ2aWV3RGF0YSIsImNhY2hlIiwia2V5cyIsImFkZGl0aW9uYWxEYXRhIiwiZ2V0QWRkaXRpb25hbENhY2hlRGF0YSIsImdldERhdGEiLCJzZXRBZGRpdGlvbmFsQ2FjaGVEYXRhIiwidmFsdWUiLCJzZXREYXRhIiwibW9kZWxzIiwiaGVpZ2h0IiwiX2NyZWF0ZUVycm9yUGFnZSIsInJlYXNvbiIsIm9WaWV3U2V0dGluZ3MiLCJtZXNzYWdlIiwiSlNPTk1vZGVsIiwicnVuQXNPd25lciIsIlZpZXciLCJjcmVhdGUiLCJzZXRNb2RlbCIsInNldEFnZ3JlZ2F0aW9uIiwiZ2V0Q29udHJvbGxlciIsImdldFBsYWNlaG9sZGVyIiwiaGlkZVJvb3RQbGFjZWhvbGRlciIsInNDb252ZXJ0ZXJUeXBlIiwiY29udmVydGVyVHlwZSIsInNGdWxsQ29udGV4dFBhdGgiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldFRhcmdldEluZm9ybWF0aW9uRm9yIiwib3B0aW9ucyIsImZ1bGxDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwib01hbmlmZXN0Q29udGVudCIsImdldE1hbmlmZXN0Iiwib0RldmljZU1vZGVsIiwiRGV2aWNlIiwic2V0RGVmYXVsdEJpbmRpbmdNb2RlIiwib01hbmlmZXN0TW9kZWwiLCJvVmlld0RhdGFNb2RlbCIsIm9Sb3V0aW5nU2VydmljZSIsImdldFNlcnZpY2UiLCJvVGFyZ2V0SW5mbyIsIm1PdXRib3VuZHMiLCJjcm9zc05hdmlnYXRpb24iLCJvdXRib3VuZHMiLCJtTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb24iLCJjb252ZXJ0ZWRNZXRhZGF0YSIsImNvbnZlcnRUeXBlcyIsImdldENhcGFiaWxpdGllcyIsIl9lbmhhbmNlTmF2aWdhdGlvbkNvbmZpZyIsImRlZmluaXRpb25Db250ZXh0IiwiRGVmaW5pdGlvbkNvbnRleHQiLCJhZGRBcHBsaWNhdGlvbk1hbmlmZXN0IiwibmF2aWdhdGlvbiIsInZpZXdMZXZlbCIsImNvbnRlbnREZW5zaXRpZXMiLCJpc0Rlc2t0b3AiLCJzeXN0ZW0iLCJkZXNrdG9wIiwiaXNQaG9uZSIsInBob25lIiwiVGVtcGxhdGVUeXBlIiwiRnJlZVN0eWxlUGFnZSIsImdldFZpZXdEYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwiVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5Iiwic2V0UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzIiwiaXNTaGFyZUJ1dHRvblZpc2libGVGb3JNeUluYm94IiwiZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Rm9yTXlJbmJveCIsIm9TaGVsbFNlcnZpY2VzIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNoZWxsQ29udGVudERlbnNpdHkiLCJnZXRDb250ZW50RGVuc2l0eSIsInNhcGZlTWFuaWZlc3RDb250ZW50Iiwic2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiZm9ybSIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwic0Fubm90YXRpb25QYXRoIiwiaW5jbHVkZXMiLCJzVGFyZ2V0QW5ub3RhdGlvblBhdGgiLCJyZXNvbHZlRHluYW1pY0V4cHJlc3Npb24iLCJUZW1wbGF0ZU1vZGVsIiwib0RpYWdub3N0aWNzIiwiZ2V0RGlhZ25vc3RpY3MiLCJpSXNzdWVDb3VudCIsImdldElzc3VlcyIsIm9Db252ZXJ0ZXJQYWdlTW9kZWwiLCJjb252ZXJ0UGFnZSIsIk1hbmlmZXN0V3JhcHBlciIsIl9nZXRDb250cm9sbGVyTmFtZSIsImNvbnRyb2xsZXJOYW1lIiwiYUlzc3VlcyIsImFBZGRlZElzc3VlcyIsInNsaWNlIiwid2FybmluZyIsImFTcGxpdFBhdGgiLCJzcGxpdCIsInNFbnRpdHlTZXRQYXRoIiwiX2dldEZ1bGxQYXRoVG9FbnRpdHlTZXQiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIm5vUmVzb2x2ZSIsImRldmljZSIsIm1hbmlmZXN0IiwiZ2V0Q29udmVydGVkTWV0YWRhdGEiLCJnZXREZWZpbml0aW9uQ29udGV4dCIsImdldERlZmluaXRpb25Gb3JQYWdlIiwiZW5kc1dpdGgiLCJzdWJzdHJpbmciLCJnZXRQYWdlRm9yIiwidmlld0lkIiwic2V0UHJlcHJvY2Vzc29yQ29udGV4dCIsInZpZXdKU09OTW9kZWwiLCJNb2RlbEhlbHBlciIsImVuaGFuY2VWaWV3SlNPTk1vZGVsIiwiZXJyb3JWaWV3TmFtZSIsImUiLCJFcnJvciIsImNvbnZlcnRlZFR5cGVzIiwibmF2aWdhdGlvbk9iamVjdEtleSIsIm5hdmlnYXRpb25PYmplY3QiLCJvdXRib3VuZENvbmZpZyIsImRldGFpbCIsIm91dGJvdW5kIiwib3V0Ym91bmREZXRhaWwiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsInBhcmFtZXRlcnMiLCJhdmFpbGFiaWxpdHkiLCJyZWdpc3RlclZpcnR1YWxQcm9wZXJ0eSIsInJvdXRlIiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJyZWR1Y2UiLCJzUGF0aFNvRmFyIiwic05leHRQYXRoUGFydCIsIm9UYXJnZXQiLCJnZXRPYmplY3QiLCJnZXRWaWV3IiwiZ2V0SW50ZXJmYWNlIiwiZXhpdCIsInJlbW92ZUdsb2JhbEluc3RhbmNlIiwiU2VydmljZSIsIl9TZXJ2aWNlRmFjdG9yeSIsIl90aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjYWxsIiwiX29JbnN0YW5jZVJlZ2lzdHJ5IiwiX3Byb3RvMiIsIm9TZXJ2aWNlQ29udGV4dCIsImlDcmVhdGluZ1ZpZXdzIiwib1RlbXBsYXRlZFZpZXdTZXJ2aWNlIiwiY29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJmZUVudmlyb25tZW50IiwiZ2V0U2hhcmVDb250cm9sVmlzaWJpbGl0eSIsImdldE51bWJlck9mVmlld3NJbkNyZWF0aW9uU3RhdGUiLCJ0YXJnZXRzIiwicm91dGluZyIsInJlYWxUYXJnZXQiLCJ0YXJnZXRUb0ZpbmQiLCJhY3R1YWxTZXR0aW5ncyIsImFwcGx5UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzIiwiU2VydmljZUZhY3RvcnkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnZlcnRlZE1ldGFkYXRhIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNBUEpTT05TY2hlbWFGb3JXZWJBcHBsaWNhdGlvbk1hbmlmZXN0RmlsZSB9IGZyb20gXCJAdWk1L21hbmlmZXN0L3R5cGVzL21hbmlmZXN0XCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBMb2NhbGl6YXRpb24gZnJvbSBcInNhcC9iYXNlL2kxOG4vTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyByZXNvbHZlQmluZGluZ1N0cmluZyB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudERhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24sIFhNTFByZXByb2Nlc3NvckNvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IFN1cnZleUNvbmZpZyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUge1xuXHRCYXNlTWFuaWZlc3RTZXR0aW5ncyxcblx0Q29udGVudERlbnNpdGllc1R5cGUsXG5cdENvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRNYW5pZmVzdEFjdGlvbixcblx0TWFuaWZlc3RIZWFkZXJGYWNldCxcblx0VmFyaWFudE1hbmFnZW1lbnRUeXBlXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IFRlbXBsYXRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RXcmFwcGVyXCI7XG5pbXBvcnQgdHlwZSAqIGFzIF9NZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyByZWdpc3RlclZpcnR1YWxQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgKiBhcyBfVGVtcGxhdGVDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlUmVjb3JkIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgRGVmaW5pdGlvblBhZ2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZGVmaW5pdGlvbi9GRURlZmluaXRpb25cIjtcbmltcG9ydCB7IERlZmluaXRpb25Db250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2RlZmluaXRpb24vRkVEZWZpbml0aW9uXCI7XG5pbXBvcnQgeyByZXF1aXJlRGVwZW5kZW5jaWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTG9hZGVyVXRpbHNcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgYXBwbHlQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvbWFuaWZlc3RNZXJnZXIvQ2hhbmdlUGFnZUNvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVIYW5kbGVyU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9DYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgdHlwZSBIaWVyYWNoeU1vZGUgYXMgQnJlYWRjcnVtYnNIaWVyYWNoeU1vZGUgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9CcmVhZGNydW1ic1wiO1xuaW1wb3J0IHR5cGUgeyBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eSB9IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgVmVyc2lvbkluZm8gZnJvbSBcInNhcC91aS9WZXJzaW9uSW5mb1wiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RDb250ZW50LCBNYW5pZmVzdE91dGJvdW5kRW50cnksIFNoYXJlT3B0aW9ucyB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5UmVnaXN0cnlcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCB7IHJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0R5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZU1vZGVsU2VydmljZSB9IGZyb20gXCIuL1Jlc291cmNlTW9kZWxTZXJ2aWNlRmFjdG9yeVwiO1xuXG50eXBlIFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3MgPSB7XG5cdHZpZXdUeXBlPzogc3RyaW5nO1xuXHR2aWV3TmFtZT86IHN0cmluZztcbn07XG5cbnR5cGUgVmlld1NldHRpbmdzID0gUGFyYW1ldGVyczx0eXBlb2YgVmlldy5jcmVhdGU+WzBdICYgeyBjYWNoZTogdW5rbm93bjsgbW9kZWxzOiB1bmtub3duOyBoZWlnaHQ6IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgVmlld0RhdGEgPSB7XG5cdGJyZWFkY3J1bWJzSGllcmFyY2h5TW9kZT86IEJyZWFkY3J1bWJzSGllcmFjaHlNb2RlO1xuXHRmY2xFbmFibGVkPzogYm9vbGVhbjtcblx0ZWRpdGFibGVIZWFkZXJDb250ZW50PzogYm9vbGVhbjtcblx0aGlkZUZpbHRlckJhcj86IGJvb2xlYW47XG5cdHVzZUhpZGRlbkZpbHRlckJhcj86IGJvb2xlYW47XG5cdHNlY3Rpb25MYXlvdXQ/OiBzdHJpbmc7XG5cdGFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM/OiBSZWNvcmQ8c3RyaW5nLCBTZW1hbnRpY09iamVjdD47XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRuYXZpZ2F0aW9uOiBvYmplY3Q7XG5cdHZpZXdMZXZlbDogbnVtYmVyO1xuXHR2YXJpYW50TWFuYWdlbWVudD86IFZhcmlhbnRNYW5hZ2VtZW50VHlwZTtcblx0c3RhYmxlSWQ6IHN0cmluZztcblx0Y29udGVudERlbnNpdGllcz86IENvbnRlbnREZW5zaXRpZXNUeXBlO1xuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsO1xuXHRmdWxsQ29udGV4dFBhdGg6IHN0cmluZztcblx0aXNEZXNrdG9wOiBib29sZWFuO1xuXHRpc1Bob25lOiBib29sZWFuO1xuXHRjb252ZXJ0ZXJUeXBlOiBUZW1wbGF0ZVR5cGU7XG5cdHNoZWxsQ29udGVudERlbnNpdHk/OiBzdHJpbmc7XG5cdHVzZU5ld0xhenlMb2FkaW5nPzogYm9vbGVhbjtcblx0aW5pdGlhbExvYWQ/OiBzdHJpbmc7XG5cdGxpdmVNb2RlPzogYm9vbGVhbjtcblx0cmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdD86IGJvb2xlYW47XG5cdGNvbnRyb2xDb25maWd1cmF0aW9uPzogQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdHJlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZT86IHVua25vd247XG5cdGVudGl0eVNldD86IHN0cmluZztcblx0aXNTaGFyZUJ1dHRvblZpc2libGVGb3JNeUluYm94PzogYm9vbGVhbjtcblx0Y29udGV4dFBhdGg/OiBzdHJpbmc7XG5cdHNoYXJlPzogU2hhcmVPcHRpb25zO1xuXHRzaGFyZU92ZXJmbG93UHJpb3JpdHk/OiBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eTtcblx0c2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24/OiBNYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl07XG5cdGNvbnRlbnQ/OiB7XG5cdFx0ZmVlZGJhY2s/OiB7IGFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTdXJ2ZXlDb25maWc+OyBzdGFuZGFyZEFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTdXJ2ZXlDb25maWc+IH07XG5cdFx0aGVhZGVyPzoge1xuXHRcdFx0ZmFjZXRzPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0SGVhZGVyRmFjZXQ+O1xuXHRcdFx0YWN0aW9ucz86IENvbmZpZ3VyYWJsZVJlY29yZDxNYW5pZmVzdEFjdGlvbj47XG5cdFx0fTtcblx0XHRmb290ZXI/OiB7XG5cdFx0XHRhY3Rpb25zPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0QWN0aW9uPjtcblx0XHR9O1xuXHR9O1xufTtcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZWRWaWV3U2VydmljZSBleHRlbmRzIFNlcnZpY2U8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8dm9pZD47XG5cblx0b1ZpZXchOiBWaWV3O1xuXG5cdG9SZXNvdXJjZU1vZGVsU2VydmljZSE6IFJlc291cmNlTW9kZWxTZXJ2aWNlO1xuXG5cdG9DYWNoZUhhbmRsZXJTZXJ2aWNlITogQ2FjaGVIYW5kbGVyU2VydmljZTtcblxuXHRvRmFjdG9yeSE6IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeTtcblxuXHRyZXNvdXJjZU1vZGVsITogUmVzb3VyY2VNb2RlbDtcblxuXHRzdGFibGVJZCE6IHN0cmluZztcblxuXHRwYWdlSWQhOiBzdHJpbmc7XG5cblx0VGVtcGxhdGVDb252ZXJ0ZXI/OiB0eXBlb2YgX1RlbXBsYXRlQ29udmVydGVyO1xuXG5cdE1ldGFNb2RlbENvbnZlcnRlcj86IHR5cGVvZiBfTWV0YU1vZGVsQ29udmVydGVyO1xuXG5cdGluaXQoKTogdm9pZCB7XG5cdFx0Y29uc3QgYVNlcnZpY2VEZXBlbmRlbmNpZXMgPSBbXTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdDtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9Db21wb25lbnQpO1xuXHRcdGNvbnN0IHZpZXdQcmVsb2FkZXJTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRWaWV3UHJlbG9hZGVyU2VydmljZSgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdHRoaXMucGFnZUlkID0gb0FwcENvbXBvbmVudC5nZXRMb2NhbElkKG9Db21wb25lbnQuZ2V0SWQoKSkgYXMgc3RyaW5nO1xuXHRcdGNvbnN0IHNTdGFibGVJZCA9IGAke29BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRDb21wb25lbnROYW1lKCl9Ojoke3RoaXMucGFnZUlkfWA7XG5cdFx0Y29uc3QgYUVuaGFuY2VJMThuID0gb0NvbXBvbmVudC5nZXRFbmhhbmNlSTE4bigpIHx8IFtdO1xuXHRcdGxldCBzQXBwTmFtZXNwYWNlO1xuXHRcdHRoaXMub0ZhY3RvcnkgPSBvQ29udGV4dC5mYWN0b3J5O1xuXHRcdGlmIChhRW5oYW5jZUkxOG4pIHtcblx0XHRcdHNBcHBOYW1lc3BhY2UgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0Q29tcG9uZW50TmFtZSgpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhRW5oYW5jZUkxOG4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Ly8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0ZXh0LXZlcnRpY2FsaXphdGlvbiBhcHBsaWNhdGlvbnMgY2FuIGFsc28gcGFzcyBhIHJlc291cmNlIG1vZGVsIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIFVJNSB0YWtlcyBjYXJlIG9mIHRleHQtdmVydGljYWxpemF0aW9uIGZvciByZXNvdXJjZSBtb2RlbHMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gSGVuY2UgY2hlY2sgaWYgdGhlIGdpdmVuIGtleSBpcyBhIHJlc291cmNlIG1vZGVsIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIGlmIHNvIHRoaXMgbW9kZWwgc2hvdWxkIGJlIHVzZWQgdG8gZW5oYW5jZSB0aGUgc2FwLmZlIHJlc291cmNlIG1vZGVsIHNvIHBhc3MgaXQgYXMgaXQgaXNcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1vZGVsKGFFbmhhbmNlSTE4bltpXSk7XG5cdFx0XHRcdGlmIChvUmVzb3VyY2VNb2RlbCAmJiBvUmVzb3VyY2VNb2RlbC5pc0EoXCJzYXAudWkubW9kZWwucmVzb3VyY2UuUmVzb3VyY2VNb2RlbFwiKSkge1xuXHRcdFx0XHRcdGFFbmhhbmNlSTE4bltpXSA9IG9SZXNvdXJjZU1vZGVsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFFbmhhbmNlSTE4bltpXSA9IGAke3NBcHBOYW1lc3BhY2V9LiR7YUVuaGFuY2VJMThuW2ldLnJlcGxhY2UoXCIucHJvcGVydGllc1wiLCBcIlwiKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IHNDYWNoZUlkZW50aWZpZXIgPSBgJHtvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfV8ke3NTdGFibGVJZH1fJHtMb2NhbGl6YXRpb24uZ2V0TGFuZ3VhZ2VUYWcoKX1gO1xuXHRcdGFTZXJ2aWNlRGVwZW5kZW5jaWVzLnB1c2goXG5cdFx0XHRTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5LmdldChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLlJlc291cmNlTW9kZWxTZXJ2aWNlXCIpXG5cdFx0XHRcdC5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0c2NvcGVUeXBlOiBcImNvbXBvbmVudFwiLFxuXHRcdFx0XHRcdHNjb3BlT2JqZWN0OiBvQ29tcG9uZW50LFxuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRidW5kbGVzOiBbXCJzYXAuZmUuY29yZS5tZXNzYWdlYnVuZGxlXCIsIFwic2FwLmZlLm1hY3Jvcy5tZXNzYWdlYnVuZGxlXCIsIFwic2FwLmZlLnRlbXBsYXRlcy5tZXNzYWdlYnVuZGxlXCJdLFxuXHRcdFx0XHRcdFx0ZW5oYW5jZUkxOG46IGFFbmhhbmNlSTE4bixcblx0XHRcdFx0XHRcdG1vZGVsTmFtZTogXCJzYXAuZmUuaTE4blwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigob1Jlc291cmNlTW9kZWxTZXJ2aWNlOiBSZXNvdXJjZU1vZGVsU2VydmljZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMub1Jlc291cmNlTW9kZWxTZXJ2aWNlID0gb1Jlc291cmNlTW9kZWxTZXJ2aWNlO1xuXHRcdFx0XHRcdHJldHVybiBvUmVzb3VyY2VNb2RlbFNlcnZpY2UuZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkuZ2V0KFwic2FwLmZlLmNvcmUuc2VydmljZXMuQ2FjaGVIYW5kbGVyU2VydmljZVwiKVxuXHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRjb21wb25lbnQ6IG9Db21wb25lbnRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGFzeW5jIChvQ2FjaGVIYW5kbGVyU2VydmljZTogQ2FjaGVIYW5kbGVyU2VydmljZSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHZpZXdQcmVsb2FkZXJTZXJ2aWNlLmlzQ2FjaGVSZWFkeSgpO1xuXHRcdFx0XHRcdHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UgPSBvQ2FjaGVIYW5kbGVyU2VydmljZTtcblx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlclNlcnZpY2UudmFsaWRhdGVDYWNoZUtleShzQ2FjaGVJZGVudGlmaWVyLCBvQ29tcG9uZW50LCBvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkpO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFZlcnNpb25JbmZvLmxvYWQoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0luZm8pIHtcblx0XHRcdFx0XHRsZXQgc1RpbWVzdGFtcCA9IFwiXCI7XG5cdFx0XHRcdFx0aWYgKCFvSW5mby5saWJyYXJpZXMpIHtcblx0XHRcdFx0XHRcdHNUaW1lc3RhbXAgPSAoQ29yZSBhcyB7IGJ1aWxkaW5mbz86IHsgYnVpbGR0aW1lPzogc3RyaW5nIH0gfSk/LmJ1aWxkaW5mbz8uYnVpbGR0aW1lID8/IFwiPE5PVkFMVUU+XCI7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9JbmZvLmxpYnJhcmllcy5mb3JFYWNoKGZ1bmN0aW9uIChvTGlicmFyeSkge1xuXHRcdFx0XHRcdFx0XHRzVGltZXN0YW1wICs9IG9MaWJyYXJ5LmJ1aWxkVGltZXN0YW1wO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBzVGltZXN0YW1wO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBcIjxOT1ZBTFVFPlwiO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0dGhpcy5pbml0UHJvbWlzZSA9IFByb21pc2UuYWxsKGFTZXJ2aWNlRGVwZW5kZW5jaWVzKVxuXHRcdFx0LnRoZW4oYXN5bmMgKGFEZXBlbmRlbmNpZXNSZXN1bHQ6IHVua25vd25bXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VNb2RlbCA9IGFEZXBlbmRlbmNpZXNSZXN1bHRbMF0gYXMgUmVzb3VyY2VNb2RlbDtcblx0XHRcdFx0Y29uc3Qgc0NhY2hlS2V5ID0gYURlcGVuZGVuY2llc1Jlc3VsdFsxXSBhcyBzdHJpbmcgfCBudWxsO1xuXHRcdFx0XHRjb25zdCBbVGVtcGxhdGVDb252ZXJ0ZXIsIE1ldGFNb2RlbENvbnZlcnRlcl0gPSBhd2FpdCByZXF1aXJlRGVwZW5kZW5jaWVzKFtcblx0XHRcdFx0XHRcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIixcblx0XHRcdFx0XHRcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCJcblx0XHRcdFx0XSk7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZVZpZXcoXG5cdFx0XHRcdFx0b1Jlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0c1N0YWJsZUlkLFxuXHRcdFx0XHRcdHNDYWNoZUtleSxcblx0XHRcdFx0XHRUZW1wbGF0ZUNvbnZlcnRlciBhcyB0eXBlb2YgX1RlbXBsYXRlQ29udmVydGVyLFxuXHRcdFx0XHRcdE1ldGFNb2RlbENvbnZlcnRlciBhcyB0eXBlb2YgX01ldGFNb2RlbENvbnZlcnRlclxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzQ2FjaGVLZXk6IHN0cmluZyB8IHZvaWQgfCBudWxsKTogdm9pZCB7XG5cdFx0XHRcdGNvbnN0IG9DYWNoZUhhbmRsZXJTZXJ2aWNlID0gU2VydmljZUZhY3RvcnlSZWdpc3RyeS5nZXQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5DYWNoZUhhbmRsZXJTZXJ2aWNlXCIpLmdldEluc3RhbmNlKG9NZXRhTW9kZWwpO1xuXHRcdFx0XHRvQ2FjaGVIYW5kbGVyU2VydmljZS5pbnZhbGlkYXRlSWZOZWVkZWQoXG5cdFx0XHRcdFx0c0NhY2hlS2V5LFxuXHRcdFx0XHRcdHNDYWNoZUlkZW50aWZpZXIsXG5cdFx0XHRcdFx0b0NvbXBvbmVudCxcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKClcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVmcmVzaCB0aGUgY3VycmVudCB2aWV3IHVzaW5nIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gYXMgYmVmb3JlLlxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgaW5kaWNhdGluZyB3aGVuIHRoZSB2aWV3IGlzIHJlZnJlc2hlZFxuXHQgKi9cblx0YXN5bmMgcmVmcmVzaFZpZXcob0NvbXBvbmVudDogVGVtcGxhdGVDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvUm9vdFZpZXcgPSBvQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdFx0aWYgKG9Sb290Vmlldykge1xuXHRcdFx0b1Jvb3RWaWV3LmRlc3Ryb3koKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMub1ZpZXcpIHtcblx0XHRcdHRoaXMub1ZpZXcuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVWaWV3KHRoaXMucmVzb3VyY2VNb2RlbCwgdGhpcy5zdGFibGVJZCwgXCJcIiwgdGhpcy5UZW1wbGF0ZUNvbnZlcnRlciEsIHRoaXMuTWV0YU1vZGVsQ29udmVydGVyISlcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0b0NvbXBvbmVudC5nZXRVSUFyZWEoKS5pbnZhbGlkYXRlKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRvQ29tcG9uZW50LmdldFVJQXJlYSgpLmludmFsaWRhdGUoKTtcblx0XHRcdFx0TG9nLmVycm9yKG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRfZ2V0Vmlld1NldHRpbmdzKFxuXHRcdHByZXByb2Nlc3NvckNvbnRleHQ6IFhNTFByZXByb2Nlc3NvckNvbnRleHQsXG5cdFx0bVNlcnZpY2VTZXR0aW5nczogVGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncyxcblx0XHRvQ29tcG9uZW50OiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4sXG5cdFx0bVZpZXdEYXRhOiBWaWV3RGF0YSxcblx0XHRzQ2FjaGVLZXk6IHN0cmluZyB8IG51bGwsXG5cdFx0b1BhZ2VNb2RlbDogSlNPTk1vZGVsLFxuXHRcdG9SZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsXG5cdCk6IFZpZXdTZXR0aW5ncyB7XG5cdFx0bGV0IHZpZXdUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBtU2VydmljZVNldHRpbmdzLnZpZXdUeXBlIHx8IG9Db21wb25lbnQuZ2V0Vmlld1R5cGUoKSB8fCBcIlhNTFwiO1xuXHRcdGlmICh2aWV3VHlwZSAhPT0gXCJYTUxcIikge1xuXHRcdFx0dmlld1R5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlOiB2aWV3VHlwZSxcblx0XHRcdHByZXByb2Nlc3NvcnM6IHtcblx0XHRcdFx0eG1sOiBwcmVwcm9jZXNzb3JDb250ZXh0LFxuXHRcdFx0XHRjb250cm9sczoge31cblx0XHRcdH0sXG5cdFx0XHRpZDogbVZpZXdEYXRhLnN0YWJsZUlkLFxuXHRcdFx0dmlld05hbWU6IG1TZXJ2aWNlU2V0dGluZ3Mudmlld05hbWUgfHwgb0NvbXBvbmVudC5nZXRWaWV3TmFtZT8uKCksXG5cdFx0XHR2aWV3RGF0YTogbVZpZXdEYXRhLFxuXHRcdFx0Y2FjaGU6IHtcblx0XHRcdFx0a2V5czogW3NDYWNoZUtleV0sXG5cdFx0XHRcdGFkZGl0aW9uYWxEYXRhOiB7XG5cdFx0XHRcdFx0Ly8gV2Ugc3RvcmUgdGhlIHBhZ2UgbW9kZWwgZGF0YSBpbiB0aGUgYGFkZGl0aW9uYWxEYXRhYCBvZiB0aGUgdmlldyBjYWNoZSwgdGhpcyB3YXkgaXQgaXMgYWx3YXlzIGluIHN5bmNcblx0XHRcdFx0XHRnZXRBZGRpdGlvbmFsQ2FjaGVEYXRhOiAoKTogdW5rbm93biA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1BhZ2VNb2RlbC5nZXREYXRhKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzZXRBZGRpdGlvbmFsQ2FjaGVEYXRhOiAodmFsdWU6IG9iamVjdCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0b1BhZ2VNb2RlbC5zZXREYXRhKHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XCJzYXAuZmUuaTE4blwiOiBvUmVzb3VyY2VNb2RlbFxuXHRcdFx0fSxcblx0XHRcdGhlaWdodDogXCIxMDAlXCJcblx0XHR9O1xuXHR9XG5cblx0YXN5bmMgX2NyZWF0ZUVycm9yUGFnZShcblx0XHRyZWFzb246IEVycm9yLFxuXHRcdG9WaWV3U2V0dGluZ3M6IFZpZXdTZXR0aW5ncyxcblx0XHR2aWV3TmFtZTogc3RyaW5nLFxuXHRcdG9Db21wb25lbnQ6IFRlbXBsYXRlQ29tcG9uZW50LFxuXHRcdHNDYWNoZUtleTogc3RyaW5nIHwgbnVsbFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdC8vIGp1c3QgcmVwbGFjZSB0aGUgdmlldyBuYW1lIGFuZCBhIG1vZGVsIGNvbnRhaW5pbmcgdGhlIHJlYXNvbiwgYnV0IGtlZXAgdGhlIG90aGVyIHNldHRpbmdzXG5cdFx0TG9nLmVycm9yKHJlYXNvbi5tZXNzYWdlLCByZWFzb24pO1xuXHRcdG9WaWV3U2V0dGluZ3Mudmlld05hbWUgPSB2aWV3TmFtZTtcblx0XHRpZiAob1ZpZXdTZXR0aW5ncy5wcmVwcm9jZXNzb3JzKSB7XG5cdFx0XHQob1ZpZXdTZXR0aW5ncy5wcmVwcm9jZXNzb3JzIGFzIFJlY29yZDxzdHJpbmcsIHsgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbD4gfT4pLnhtbC5tb2RlbHNbXCJlcnJvclwiXSA9IG5ldyBKU09OTW9kZWwocmVhc29uKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0NvbXBvbmVudC5ydW5Bc093bmVyKGFzeW5jICgpID0+IHtcblx0XHRcdHJldHVybiBWaWV3LmNyZWF0ZShvVmlld1NldHRpbmdzKS50aGVuKChvVmlldzogVmlldykgPT4ge1xuXHRcdFx0XHR0aGlzLm9WaWV3ID0gb1ZpZXc7XG5cdFx0XHRcdHRoaXMub1ZpZXcuc2V0TW9kZWwobmV3IEpTT05Nb2RlbCh0aGlzLm9WaWV3KSwgXCIkdmlld1wiKTtcblx0XHRcdFx0b0NvbXBvbmVudC5zZXRBZ2dyZWdhdGlvbihcInJvb3RDb250cm9sXCIsIHRoaXMub1ZpZXcpO1xuXHRcdFx0XHRvQ29tcG9uZW50LmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250cm9sKCkuZ2V0Q29udHJvbGxlcigpLmdldFBsYWNlaG9sZGVyKCkuaGlkZVJvb3RQbGFjZWhvbGRlcigpO1xuXHRcdFx0XHRyZXR1cm4gc0NhY2hlS2V5O1xuXHRcdFx0fSk7XG5cdFx0fSkgYXMgUHJvbWlzZTxzdHJpbmc+O1xuXHR9XG5cblx0YXN5bmMgY3JlYXRlVmlldyhcblx0XHRvUmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRzU3RhYmxlSWQ6IHN0cmluZyxcblx0XHRzQ2FjaGVLZXk6IHN0cmluZyB8IG51bGwsXG5cdFx0VGVtcGxhdGVDb252ZXJ0ZXI6IHR5cGVvZiBfVGVtcGxhdGVDb252ZXJ0ZXIsXG5cdFx0TWV0YU1vZGVsQ29udmVydGVyOiB0eXBlb2YgX01ldGFNb2RlbENvbnZlcnRlclxuXHQpOiBQcm9taXNlPHN0cmluZyB8IG51bGwgfCB2b2lkPiB7XG5cdFx0dGhpcy5yZXNvdXJjZU1vZGVsID0gb1Jlc291cmNlTW9kZWw7XG5cdFx0dGhpcy5zdGFibGVJZCA9IHNTdGFibGVJZDtcblx0XHR0aGlzLlRlbXBsYXRlQ29udmVydGVyID0gVGVtcGxhdGVDb252ZXJ0ZXI7XG5cdFx0dGhpcy5NZXRhTW9kZWxDb252ZXJ0ZXIgPSBNZXRhTW9kZWxDb252ZXJ0ZXI7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBtU2VydmljZVNldHRpbmdzID0gb0NvbnRleHQuc2V0dGluZ3M7XG5cdFx0Y29uc3Qgc0NvbnZlcnRlclR5cGUgPSBtU2VydmljZVNldHRpbmdzLmNvbnZlcnRlclR5cGU7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0IGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9Db21wb25lbnQpO1xuXHRcdGxldCBzRnVsbENvbnRleHRQYXRoOiBzdHJpbmcgPVxuXHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKG9Db21wb25lbnQpPy5vcHRpb25zPy5zZXR0aW5ncz8uZnVsbENvbnRleHRQYXRoID8/IFwiXCI7XG5cdFx0aWYgKCFzRnVsbENvbnRleHRQYXRoKSB7XG5cdFx0XHQvLyBpZiB0aGUgY29udGV4dCBwYXRoIGNvdWxkbid0IGJlIHJldHJpZXZlZCBmcm9tIHRoZSByb3V0aW5nIHNlcnZpY2UsIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgY29tcG9uZW50IGl0c2VsZlxuXHRcdFx0c0Z1bGxDb250ZXh0UGF0aCA9IG9Db21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSA/PyBcIlwiO1xuXHRcdH1cblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBvTWFuaWZlc3RDb250ZW50ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpO1xuXHRcdGNvbnN0IG9EZXZpY2VNb2RlbCA9IG5ldyBKU09OTW9kZWwoRGV2aWNlKS5zZXREZWZhdWx0QmluZGluZ01vZGUoXCJPbmVXYXlcIik7XG5cdFx0Y29uc3Qgb01hbmlmZXN0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG9NYW5pZmVzdENvbnRlbnQpO1xuXHRcdGxldCBvUGFnZU1vZGVsOiBUZW1wbGF0ZU1vZGVsLCBvVmlld0RhdGFNb2RlbDogTW9kZWwsIG1WaWV3RGF0YTogVmlld0RhdGE7XG5cdFx0Ly8gTG9hZCB0aGUgaW5kZXggZm9yIHRoZSBhZGRpdGlvbmFsIGJ1aWxkaW5nIGJsb2NrcyB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZW1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1JvdXRpbmdTZXJ2aWNlID0gYXdhaXQgb0FwcENvbXBvbmVudC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIik7XG5cdFx0XHQvLyBSZXRyaWV2ZSB0aGUgdmlld0xldmVsIGZvciB0aGUgY29tcG9uZW50XG5cdFx0XHRjb25zdCBvVGFyZ2V0SW5mbyA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcihvQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG1PdXRib3VuZHMgPVxuXHRcdFx0XHQob01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24ub3V0Ym91bmRzKSB8fFxuXHRcdFx0XHR7fTtcblx0XHRcdGNvbnN0IG1OYXZpZ2F0aW9uID0gb0NvbXBvbmVudC5nZXROYXZpZ2F0aW9uKCkgfHwge307XG5cdFx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IE1ldGFNb2RlbENvbnZlcnRlci5jb252ZXJ0VHlwZXMoXG5cdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX2VuaGFuY2VOYXZpZ2F0aW9uQ29uZmlnKG1OYXZpZ2F0aW9uLCBtT3V0Ym91bmRzLCBjb252ZXJ0ZWRNZXRhZGF0YSwgc1N0YWJsZUlkKTtcblx0XHRcdGNvbnN0IGRlZmluaXRpb25Db250ZXh0ID0gbmV3IERlZmluaXRpb25Db250ZXh0KGNvbnZlcnRlZE1ldGFkYXRhKTtcblx0XHRcdGRlZmluaXRpb25Db250ZXh0LmFkZEFwcGxpY2F0aW9uTWFuaWZlc3Qob01hbmlmZXN0Q29udGVudCBhcyBTQVBKU09OU2NoZW1hRm9yV2ViQXBwbGljYXRpb25NYW5pZmVzdEZpbGUpO1xuXG5cdFx0XHRtVmlld0RhdGEgPSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0bmF2aWdhdGlvbjogbU5hdmlnYXRpb24sXG5cdFx0XHRcdHZpZXdMZXZlbDogb1RhcmdldEluZm8/LnZpZXdMZXZlbCxcblx0XHRcdFx0c3RhYmxlSWQ6IHNTdGFibGVJZCxcblx0XHRcdFx0Y29udGVudERlbnNpdGllczogb01hbmlmZXN0Q29udGVudFtcInNhcC51aTVcIl0/LmNvbnRlbnREZW5zaXRpZXMsXG5cdFx0XHRcdHJlc291cmNlTW9kZWw6IG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdGlzRGVza3RvcDogRGV2aWNlLnN5c3RlbS5kZXNrdG9wLFxuXHRcdFx0XHRpc1Bob25lOiBEZXZpY2Uuc3lzdGVtLnBob25lLFxuXHRcdFx0XHRjb252ZXJ0ZXJUeXBlOiBUZW1wbGF0ZVR5cGUuRnJlZVN0eWxlUGFnZVxuXHRcdFx0fTtcblx0XHRcdGlmIChvQ29tcG9uZW50LmdldFZpZXdEYXRhKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24obVZpZXdEYXRhLCBvQ29tcG9uZW50LmdldFZpZXdEYXRhKCkpO1xuXHRcdFx0XHRtVmlld0RhdGEgPSBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3Rvcnkuc2V0UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnQsXG5cdFx0XHRcdFx0bVZpZXdEYXRhLFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0dGhpcy5wYWdlSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1WaWV3RGF0YS5pc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3ggPSBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Rm9yTXlJbmJveChvQXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VzID0gb0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdFx0XHRtVmlld0RhdGEuY29udmVydGVyVHlwZSA9IHNDb252ZXJ0ZXJUeXBlO1xuXHRcdFx0bVZpZXdEYXRhLnNoZWxsQ29udGVudERlbnNpdHkgPSBvU2hlbGxTZXJ2aWNlcy5nZXRDb250ZW50RGVuc2l0eSgpO1xuXHRcdFx0Y29uc3Qgc2FwZmVNYW5pZmVzdENvbnRlbnQgPSBvTWFuaWZlc3RDb250ZW50W1wic2FwLmZlXCJdO1xuXHRcdFx0bVZpZXdEYXRhLnNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gb01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXTtcblx0XHRcdG1WaWV3RGF0YS5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ID0gc2FwZmVNYW5pZmVzdENvbnRlbnQ/LmZvcm1cblx0XHRcdFx0PyBzYXBmZU1hbmlmZXN0Q29udGVudD8uZm9ybT8ucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdFxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdG9WaWV3RGF0YU1vZGVsID0gbmV3IEpTT05Nb2RlbChtVmlld0RhdGEpO1xuXHRcdFx0aWYgKG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbikge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNBbm5vdGF0aW9uUGF0aCBpbiBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24pIHtcblx0XHRcdFx0XHRpZiAoc0Fubm90YXRpb25QYXRoLmluY2x1ZGVzKFwiW1wiKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc1RhcmdldEFubm90YXRpb25QYXRoID0gcmVzb2x2ZUR5bmFtaWNFeHByZXNzaW9uKHNBbm5vdGF0aW9uUGF0aCwgb01ldGFNb2RlbCk7XG5cdFx0XHRcdFx0XHRtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb25bc1RhcmdldEFubm90YXRpb25QYXRoXSA9IG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbltzQW5ub3RhdGlvblBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvUGFnZU1vZGVsID0gbmV3IFRlbXBsYXRlTW9kZWwoKCkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IG9EaWFnbm9zdGljcyA9IG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKTtcblx0XHRcdFx0XHRjb25zdCBpSXNzdWVDb3VudCA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKS5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnZlcnRlclBhZ2VNb2RlbCA9IFRlbXBsYXRlQ29udmVydGVyLmNvbnZlcnRQYWdlKFxuXHRcdFx0XHRcdFx0c0NvbnZlcnRlclR5cGUsXG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0bVZpZXdEYXRhIGFzIHVua25vd24gYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0XHRcdFx0XHRuZXcgTWFuaWZlc3RXcmFwcGVyKG1WaWV3RGF0YSBhcyB1bmtub3duIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzLCBvQXBwQ29tcG9uZW50KSxcblx0XHRcdFx0XHRcdG9EaWFnbm9zdGljcyxcblx0XHRcdFx0XHRcdHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKCksXG5cdFx0XHRcdFx0XHRvQ29tcG9uZW50XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpZiAob0NvbnZlcnRlclBhZ2VNb2RlbCAmJiBvQ29tcG9uZW50Ll9nZXRDb250cm9sbGVyTmFtZSgpKSB7XG5cdFx0XHRcdFx0XHQob0NvbnZlcnRlclBhZ2VNb2RlbCBhcyB7IGNvbnRyb2xsZXJOYW1lPzogc3RyaW5nIH0pLmNvbnRyb2xsZXJOYW1lID0gb0NvbXBvbmVudC5fZ2V0Q29udHJvbGxlck5hbWUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYUlzc3VlcyA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKTtcblx0XHRcdFx0XHRjb25zdCBhQWRkZWRJc3N1ZXMgPSBhSXNzdWVzLnNsaWNlKGlJc3N1ZUNvdW50KTtcblx0XHRcdFx0XHRpZiAoYUFkZGVkSXNzdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdExvZy53YXJuaW5nKFxuXHRcdFx0XHRcdFx0XHRcIlNvbWUgaXNzdWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB5b3VyIHByb2plY3QsIHBsZWFzZSBjaGVjayB0aGUgVUk1IHN1cHBvcnQgYXNzaXN0YW50IHJ1bGUgZm9yIHNhcC5mZS5jb3JlXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBvQ29udmVydGVyUGFnZU1vZGVsO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IGFTcGxpdFBhdGggPSBzRnVsbENvbnRleHRQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gdGhpcy5fZ2V0RnVsbFBhdGhUb0VudGl0eVNldChhU3BsaXRQYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IHByZXByb2Nlc3NvckNvbnRleHQ6IFhNTFByZXByb2Nlc3NvckNvbnRleHQgPSB7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNFbnRpdHlTZXRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5U2V0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVsbENvbnRleHRQYXRoKSA6IG51bGwsXG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogc0Z1bGxDb250ZXh0UGF0aCA/IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bGxDb250ZXh0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiwgdW5kZWZpbmVkLCB7IG5vUmVzb2x2ZTogdHJ1ZSB9KSxcblx0XHRcdFx0XHRcdHZpZXdEYXRhOiBtVmlld0RhdGEgPyBvVmlld0RhdGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgOiBudWxsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdGVudGl0eVNldDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XCJzYXAuZmUuaTE4blwiOiBvUmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGRldmljZTogb0RldmljZU1vZGVsLFxuXHRcdFx0XHRcdFx0bWFuaWZlc3Q6IG9NYW5pZmVzdE1vZGVsLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbCBhcyB1bmtub3duIGFzIEpTT05Nb2RlbCxcblx0XHRcdFx0XHRcdHZpZXdEYXRhOiBvVmlld0RhdGFNb2RlbFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoLFxuXHRcdFx0XHRcdGdldENvbnZlcnRlZE1ldGFkYXRhOiAoKSA9PiBjb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRcdFx0XHRnZXREZWZpbml0aW9uQ29udGV4dCgpOiBEZWZpbml0aW9uQ29udGV4dCB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGVmaW5pdGlvbkNvbnRleHQ7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXREZWZpbml0aW9uRm9yUGFnZSgpOiBEZWZpbml0aW9uUGFnZSB7XG5cdFx0XHRcdFx0XHRsZXQgZnVsbENvbnRleHRQYXRoID0gc0Z1bGxDb250ZXh0UGF0aDtcblx0XHRcdFx0XHRcdGlmIChmdWxsQ29udGV4dFBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aCA9IGZ1bGxDb250ZXh0UGF0aC5zdWJzdHJpbmcoMCwgZnVsbENvbnRleHRQYXRoLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRlZmluaXRpb25Db250ZXh0LmdldFBhZ2VGb3IoZnVsbENvbnRleHRQYXRoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHR2aWV3SWQ6IHNTdGFibGVJZFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvVmlld1NldHRpbmdzID0gdGhpcy5fZ2V0Vmlld1NldHRpbmdzKFxuXHRcdFx0XHRcdHByZXByb2Nlc3NvckNvbnRleHQsXG5cdFx0XHRcdFx0bVNlcnZpY2VTZXR0aW5ncyxcblx0XHRcdFx0XHRvQ29tcG9uZW50LFxuXHRcdFx0XHRcdG1WaWV3RGF0YSxcblx0XHRcdFx0XHRzQ2FjaGVLZXksXG5cdFx0XHRcdFx0b1BhZ2VNb2RlbCBhcyB1bmtub3duIGFzIEpTT05Nb2RlbCxcblx0XHRcdFx0XHRvUmVzb3VyY2VNb2RlbFxuXHRcdFx0XHQpO1xuXHRcdFx0Ly8gU2V0dGluZyB0aGUgcGFnZU1vZGVsIG9uIHRoZSBjb21wb25lbnQgZm9yIHBvdGVudGlhbCByZXVzZVxuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbChvUGFnZU1vZGVsIGFzIHVua25vd24gYXMgSlNPTk1vZGVsLCBcIl9wYWdlTW9kZWxcIik7XG5cdFx0XHRvQ29tcG9uZW50LnNldFByZXByb2Nlc3NvckNvbnRleHQocHJlcHJvY2Vzc29yQ29udGV4dCk7XG5cdFx0XHRyZXR1cm4gb0NvbXBvbmVudC5ydW5Bc093bmVyKGFzeW5jICgpID0+IHtcblx0XHRcdFx0cmV0dXJuIFZpZXcuY3JlYXRlKG9WaWV3U2V0dGluZ3MpXG5cblx0XHRcdFx0XHQudGhlbigob1ZpZXc6IFZpZXcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMub1ZpZXcgPSBvVmlldztcblx0XHRcdFx0XHRcdGNvbnN0IHZpZXdKU09OTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHRoaXMub1ZpZXcpO1xuXHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuZW5oYW5jZVZpZXdKU09OTW9kZWwodmlld0pTT05Nb2RlbCBhcyBKU09OTW9kZWwgJiB7IF9nZXRPYmplY3Q6IEZ1bmN0aW9uIH0pO1xuXHRcdFx0XHRcdFx0dGhpcy5vVmlldy5zZXRNb2RlbCh2aWV3SlNPTk1vZGVsLCBcIiR2aWV3XCIpO1xuXHRcdFx0XHRcdFx0dGhpcy5vVmlldy5zZXRNb2RlbChvVmlld0RhdGFNb2RlbCwgXCJ2aWV3RGF0YVwiKTtcblx0XHRcdFx0XHRcdG9Db21wb25lbnQuc2V0QWdncmVnYXRpb24oXCJyb290Q29udHJvbFwiLCB0aGlzLm9WaWV3KTtcblx0XHRcdFx0XHRcdHJldHVybiBzQ2FjaGVLZXk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goYXN5bmMgKHJlYXNvbjogRXJyb3IpID0+XG5cdFx0XHRcdFx0XHR0aGlzLl9jcmVhdGVFcnJvclBhZ2UoXG5cdFx0XHRcdFx0XHRcdHJlYXNvbixcblx0XHRcdFx0XHRcdFx0b1ZpZXdTZXR0aW5ncyxcblx0XHRcdFx0XHRcdFx0bVNlcnZpY2VTZXR0aW5ncy5lcnJvclZpZXdOYW1lIHx8IFwic2FwLmZlLmNvcmUuc2VydmljZXMudmlldy5UZW1wbGF0aW5nRXJyb3JQYWdlXCIsXG5cdFx0XHRcdFx0XHRcdG9Db21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdHNDYWNoZUtleVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQuY2F0Y2goKGUpID0+IExvZy5lcnJvcihlLm1lc3NhZ2UsIGUpKTtcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB2aWV3IDogJHtlcnJvcn1gKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIF9lbmhhbmNlTmF2aWdhdGlvbkNvbmZpZyhcblx0XHRtTmF2aWdhdGlvbjogUmVjb3JkPHN0cmluZywgTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24+LFxuXHRcdG1PdXRib3VuZHM6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0T3V0Ym91bmRFbnRyeT4sXG5cdFx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdHN0YWJsZUlkOiBzdHJpbmdcblx0KTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXMobU5hdmlnYXRpb24pLmZvckVhY2goZnVuY3Rpb24gKG5hdmlnYXRpb25PYmplY3RLZXk6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0Y29uc3QgbmF2aWdhdGlvbk9iamVjdCA9IG1OYXZpZ2F0aW9uW25hdmlnYXRpb25PYmplY3RLZXldO1xuXHRcdFx0bGV0IG91dGJvdW5kQ29uZmlnO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25PYmplY3QuZGV0YWlsICYmIG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kICYmIG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5kZXRhaWwub3V0Ym91bmRdKSB7XG5cdFx0XHRcdG91dGJvdW5kQ29uZmlnID0gbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZF07XG5cdFx0XHRcdG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kRGV0YWlsID0ge1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvdXRib3VuZENvbmZpZy5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRhY3Rpb246IG91dGJvdW5kQ29uZmlnLmFjdGlvbixcblx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBvdXRib3VuZENvbmZpZy5wYXJhbWV0ZXJzXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5kZXRhaWwuYXZhaWxhYmlsaXR5KSB7XG5cdFx0XHRcdHJlZ2lzdGVyVmlydHVhbFByb3BlcnR5KFxuXHRcdFx0XHRcdGNvbnZlcnRlZFR5cGVzLFxuXHRcdFx0XHRcdFwicm91dGVOYXZpZ2FibGUtXCIgKyBuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5yb3V0ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZUJpbmRpbmdTdHJpbmcobmF2aWdhdGlvbk9iamVjdC5kZXRhaWwuYXZhaWxhYmlsaXR5ISk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzdGFibGVJZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5hdmlnYXRpb25PYmplY3QuY3JlYXRlICYmIG5hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kICYmIG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmRdKSB7XG5cdFx0XHRcdG91dGJvdW5kQ29uZmlnID0gbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZF07XG5cdFx0XHRcdG5hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kRGV0YWlsID0ge1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvdXRib3VuZENvbmZpZy5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRhY3Rpb246IG91dGJvdW5kQ29uZmlnLmFjdGlvbixcblx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBvdXRib3VuZENvbmZpZy5wYXJhbWV0ZXJzXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9nZXRGdWxsUGF0aFRvRW50aXR5U2V0KGFTcGxpdFBhdGg6IHN0cmluZ1tdLCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFTcGxpdFBhdGgucmVkdWNlKGZ1bmN0aW9uIChzUGF0aFNvRmFyOiBzdHJpbmcsIHNOZXh0UGF0aFBhcnQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0XHRpZiAoc05leHRQYXRoUGFydCA9PT0gXCJcIikge1xuXHRcdFx0XHRyZXR1cm4gc1BhdGhTb0Zhcjtcblx0XHRcdH1cblx0XHRcdGlmIChzUGF0aFNvRmFyID09PSBcIlwiKSB7XG5cdFx0XHRcdHNQYXRoU29GYXIgPSBgLyR7c05leHRQYXRoUGFydH1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb1RhcmdldCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRoU29GYXJ9LyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLyR7c05leHRQYXRoUGFydH1gKTtcblx0XHRcdFx0aWYgKG9UYXJnZXQgJiYgT2JqZWN0LmtleXMob1RhcmdldCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHNQYXRoU29GYXIgKz0gXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRzUGF0aFNvRmFyICs9IGAvJHtzTmV4dFBhdGhQYXJ0fWA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc1BhdGhTb0Zhcjtcblx0XHR9LCBcIlwiKTtcblx0fVxuXG5cdGdldFZpZXcoKTogVmlldyB7XG5cdFx0cmV0dXJuIHRoaXMub1ZpZXc7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogVGVtcGxhdGVkVmlld1NlcnZpY2Uge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0ZXhpdCgpOiB2b2lkIHtcblx0XHQvLyBEZXJlZ2lzdGVyIGdsb2JhbCBpbnN0YW5jZVxuXHRcdGlmICh0aGlzLm9SZXNvdXJjZU1vZGVsU2VydmljZSkge1xuXHRcdFx0dGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZSkge1xuXHRcdFx0dGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZS5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdHRoaXMub0ZhY3RvcnkucmVtb3ZlR2xvYmFsSW5zdGFuY2UoKTtcblx0fVxufVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeSBleHRlbmRzIFNlcnZpY2VGYWN0b3J5PFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3M+IHtcblx0X29JbnN0YW5jZVJlZ2lzdHJ5OiBSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZWRWaWV3U2VydmljZT4gPSB7fTtcblxuXHRzdGF0aWMgaUNyZWF0aW5nVmlld3M6IDA7XG5cblx0YXN5bmMgY3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzPik6IFByb21pc2U8VGVtcGxhdGVkVmlld1NlcnZpY2U+IHtcblx0XHRUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3MrKztcblx0XHRjb25zdCBvVGVtcGxhdGVkVmlld1NlcnZpY2UgPSBuZXcgVGVtcGxhdGVkVmlld1NlcnZpY2UoT2JqZWN0LmFzc2lnbih7IGZhY3Rvcnk6IHRoaXMgfSwgb1NlcnZpY2VDb250ZXh0KSk7XG5cdFx0cmV0dXJuIG9UZW1wbGF0ZWRWaWV3U2VydmljZS5pbml0UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cy0tO1xuXHRcdFx0cmV0dXJuIG9UZW1wbGF0ZWRWaWV3U2VydmljZTtcblx0XHR9KTtcblx0fVxuXG5cdHJlbW92ZUdsb2JhbEluc3RhbmNlKCk6IHZvaWQge1xuXHRcdHRoaXMuX29JbnN0YW5jZVJlZ2lzdHJ5ID0ge307XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGNvbXBvbmVudCBkYXRhIHNwZWNpZmllcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgJ1NoYXJlJyBidXR0b24gYW5kIHJldHVybnMgdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiB0aGUgdmlzaWJpbGl0eS5cblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBTcGVjaWZpZXMgdGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZSBhcyB0cnVlIG9yIGZhbHNlIGJhc2VkIHdoZXRoZXIgdGhlICdTaGFyZScgYnV0dG9uIHNob3VsZCBiZSB2aXNpYmxlIG9yIG5vdFxuXHQgKi9cblx0c3RhdGljIGdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eUZvck15SW5ib3goYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb21wb25lbnREYXRhOiBDb21wb25lbnREYXRhID0gYXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHRpZiAoY29tcG9uZW50RGF0YSAhPT0gdW5kZWZpbmVkICYmIGNvbXBvbmVudERhdGEuZmVFbnZpcm9ubWVudCkge1xuXHRcdFx0cmV0dXJuIGNvbXBvbmVudERhdGEuZmVFbnZpcm9ubWVudC5nZXRTaGFyZUNvbnRyb2xWaXNpYmlsaXR5KCk7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TnVtYmVyT2ZWaWV3c0luQ3JlYXRpb25TdGF0ZSgpOiBudW1iZXIge1xuXHRcdHJldHVybiBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3M7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBwYWdlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBmb3IgYSBzcGVjaWZpYyBwYWdlIGlkZW50aWZpZWQgYnkgaXRzIElELlxuXHQgKiBAcGFyYW0gbWFuaWZlc3QgVGhlIG1hbmlmZXN0IGNvbnRlbnQgb2JqZWN0IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBkZXRhaWxzLlxuXHQgKiBAcGFyYW0gdmlld0RhdGEgVGhlIHZpZXcgZGF0YSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2aWV3LlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSBwYWdlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwYWdlIGZvciB3aGljaCBjb25maWd1cmF0aW9uIGNoYW5nZXMgYXJlIHRvIGJlIGFwcGxpZWQuXG5cdCAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIHZpZXcgZGF0YSBvYmplY3QgcmVmbGVjdGluZyB0aGUgYXBwbGllZCBjaGFuZ2VzLlxuXHQgKi9cblx0c3RhdGljIHNldFBhZ2VDb25maWd1cmF0aW9uQ2hhbmdlcyhcblx0XHRtYW5pZmVzdDogTWFuaWZlc3RDb250ZW50LFxuXHRcdHZpZXdEYXRhOiBWaWV3RGF0YSxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRwYWdlSWQ6IHN0cmluZ1xuXHQpOiBWaWV3RGF0YSB7XG5cdFx0Y29uc3QgdGFyZ2V0cyA9IG1hbmlmZXN0Py5bXCJzYXAudWk1XCJdPy5yb3V0aW5nPy50YXJnZXRzID8/IHt9O1xuXHRcdGxldCByZWFsVGFyZ2V0ID0gXCJcIjtcblx0XHRmb3IgKGNvbnN0IHRhcmdldFRvRmluZCBpbiB0YXJnZXRzKSB7XG5cdFx0XHRpZiAodGFyZ2V0c1t0YXJnZXRUb0ZpbmRdLmlkID09PSBwYWdlSWQpIHtcblx0XHRcdFx0cmVhbFRhcmdldCA9IHRhcmdldFRvRmluZDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChyZWFsVGFyZ2V0ID09PSBcIlwiKSB7XG5cdFx0XHRyZWFsVGFyZ2V0ID0gcGFnZUlkO1xuXHRcdH1cblx0XHRjb25zdCBhY3R1YWxTZXR0aW5ncyA9IG1hbmlmZXN0Py5bXCJzYXAudWk1XCJdPy5yb3V0aW5nPy50YXJnZXRzPy5bcmVhbFRhcmdldF0/Lm9wdGlvbnM/LnNldHRpbmdzIHx8IHt9O1xuXHRcdHJldHVybiBhcHBseVBhZ2VDb25maWd1cmF0aW9uQ2hhbmdlcyhhY3R1YWxTZXR0aW5ncywgdmlld0RhdGEsIGFwcENvbXBvbmVudCwgcGFnZUlkKTtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztNQXFHYUEsb0JBQW9CLDBCQUFBQyxRQUFBO0lBQUEsU0FBQUQscUJBQUE7TUFBQSxPQUFBQyxRQUFBLENBQUFDLEtBQUEsT0FBQUMsU0FBQTtJQUFBO0lBQUFDLFFBQUEsQ0FBQUosb0JBQUEsR0FBQUEsb0JBQUE7SUFBQUssY0FBQSxDQUFBTCxvQkFBQSxFQUFBQyxRQUFBO0lBQUEsSUFBQUssTUFBQSxHQUFBTixvQkFBQSxDQUFBTyxTQUFBO0lBQUFELE1BQUEsQ0FxQmhDRSxJQUFJLEdBQUosU0FBQUEsSUFBSUEsQ0FBQSxFQUFTO01BQ1osTUFBTUMsb0JBQW9CLEdBQUcsRUFBRTtNQUMvQixNQUFNQyxRQUFRLEdBQUcsSUFBSSxDQUFDQyxVQUFVLENBQUMsQ0FBQztNQUNsQyxNQUFNQyxVQUFVLEdBQUdGLFFBQVEsQ0FBQ0csV0FBVztNQUN2QyxNQUFNQyxhQUFhLEdBQUdDLFdBQVcs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
500
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZSIsIl9TZXJ2aWNlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiaW5pdCIsImFTZXJ2aWNlRGVwZW5kZW5jaWVzIiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwidmlld1ByZWxvYWRlclNlcnZpY2UiLCJnZXRWaWV3UHJlbG9hZGVyU2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJwYWdlSWQiLCJnZXRMb2NhbElkIiwiZ2V0SWQiLCJzU3RhYmxlSWQiLCJnZXRNZXRhZGF0YSIsImdldENvbXBvbmVudE5hbWUiLCJhRW5oYW5jZUkxOG4iLCJnZXRFbmhhbmNlSTE4biIsInNBcHBOYW1lc3BhY2UiLCJvRmFjdG9yeSIsImZhY3RvcnkiLCJpIiwibGVuZ3RoIiwib1Jlc291cmNlTW9kZWwiLCJnZXRNb2RlbCIsImlzQSIsInJlcGxhY2UiLCJzQ2FjaGVJZGVudGlmaWVyIiwiZ2V0TmFtZSIsIkxvY2FsaXphdGlvbiIsImdldExhbmd1YWdlVGFnIiwiYnVuZGxlc1RvTG9hZCIsIl9nZXRBZGRpdGlvbmFsSTE4bkJ1bmRsZXMiLCJwdXNoIiwiU2VydmljZUZhY3RvcnlSZWdpc3RyeSIsImdldCIsImNyZWF0ZUluc3RhbmNlIiwic2NvcGVUeXBlIiwic2V0dGluZ3MiLCJidW5kbGVzIiwiZW5oYW5jZUkxOG4iLCJtb2RlbE5hbWUiLCJ0aGVuIiwib1Jlc291cmNlTW9kZWxTZXJ2aWNlIiwiZ2V0UmVzb3VyY2VNb2RlbCIsIm1ldGFNb2RlbCIsImFwcENvbXBvbmVudCIsImNvbXBvbmVudCIsIm9DYWNoZUhhbmRsZXJTZXJ2aWNlIiwiaXNDYWNoZVJlYWR5IiwidmFsaWRhdGVDYWNoZUtleSIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiVmVyc2lvbkluZm8iLCJsb2FkIiwib0luZm8iLCJzVGltZXN0YW1wIiwibGlicmFyaWVzIiwiQ29yZSIsImJ1aWxkaW5mbyIsImJ1aWxkdGltZSIsImZvckVhY2giLCJvTGlicmFyeSIsImJ1aWxkVGltZXN0YW1wIiwiY2F0Y2giLCJpbml0UHJvbWlzZSIsIlByb21pc2UiLCJhbGwiLCJhRGVwZW5kZW5jaWVzUmVzdWx0Iiwic0NhY2hlS2V5IiwiVGVtcGxhdGVDb252ZXJ0ZXIiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJyZXF1aXJlRGVwZW5kZW5jaWVzIiwiY3JlYXRlVmlldyIsImdldEluc3RhbmNlIiwiaW52YWxpZGF0ZUlmTmVlZGVkIiwicmVmcmVzaFZpZXciLCJvUm9vdFZpZXciLCJnZXRSb290Q29udHJvbCIsImRlc3Ryb3kiLCJvVmlldyIsInJlc291cmNlTW9kZWwiLCJzdGFibGVJZCIsImdldFVJQXJlYSIsImludmFsaWRhdGUiLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIl9nZXRWaWV3U2V0dGluZ3MiLCJwcmVwcm9jZXNzb3JDb250ZXh0IiwibVNlcnZpY2VTZXR0aW5ncyIsIm1WaWV3RGF0YSIsIm9QYWdlTW9kZWwiLCJ2aWV3VHlwZSIsImdldFZpZXdUeXBlIiwidW5kZWZpbmVkIiwidHlwZSIsInByZXByb2Nlc3NvcnMiLCJ4bWwiLCJjb250cm9scyIsImlkIiwidmlld05hbWUiLCJnZXRWaWV3TmFtZSIsInZpZXdEYXRhIiwiY2FjaGUiLCJrZXlzIiwiYWRkaXRpb25hbERhdGEiLCJnZXRBZGRpdGlvbmFsQ2FjaGVEYXRhIiwiZ2V0RGF0YSIsInNldEFkZGl0aW9uYWxDYWNoZURhdGEiLCJ2YWx1ZSIsInNldERhdGEiLCJtb2RlbHMiLCJoZWlnaHQiLCJfY3JlYXRlRXJyb3JQYWdlIiwicmVhc29uIiwib1ZpZXdTZXR0aW5ncyIsIm1lc3NhZ2UiLCJKU09OTW9kZWwiLCJjb250cm9sbGVyIiwicnVuQXNPd25lciIsIlZpZXciLCJjcmVhdGUiLCJzZXRNb2RlbCIsInNldEFnZ3JlZ2F0aW9uIiwiZ2V0Q29udHJvbGxlciIsImdldFBsYWNlaG9sZGVyIiwiaGlkZVJvb3RQbGFjZWhvbGRlciIsInNDb252ZXJ0ZXJUeXBlIiwiY29udmVydGVyVHlwZSIsInNGdWxsQ29udGV4dFBhdGgiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldFRhcmdldEluZm9ybWF0aW9uRm9yIiwib3B0aW9ucyIsImZ1bGxDb250ZXh0UGF0aCIsImNvbXBvbmVudENvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJlbmRzV2l0aCIsIm9NYW5pZmVzdENvbnRlbnQiLCJnZXRNYW5pZmVzdCIsIm9EZXZpY2VNb2RlbCIsIkRldmljZSIsInNldERlZmF1bHRCaW5kaW5nTW9kZSIsIm9NYW5pZmVzdE1vZGVsIiwib1ZpZXdEYXRhTW9kZWwiLCJvUm91dGluZ1NlcnZpY2UiLCJnZXRTZXJ2aWNlIiwib1RhcmdldEluZm8iLCJtT3V0Ym91bmRzIiwiY3Jvc3NOYXZpZ2F0aW9uIiwib3V0Ym91bmRzIiwibU5hdmlnYXRpb24iLCJnZXROYXZpZ2F0aW9uIiwiY29udmVydGVkTWV0YWRhdGEiLCJjb252ZXJ0VHlwZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJfZW5oYW5jZU5hdmlnYXRpb25Db25maWciLCJkZWZpbml0aW9uQ29udGV4dCIsIkRlZmluaXRpb25Db250ZXh0IiwiYWRkQXBwbGljYXRpb25NYW5pZmVzdCIsIm5hdmlnYXRpb24iLCJ2aWV3TGV2ZWwiLCJjb250ZW50RGVuc2l0aWVzIiwiaXNEZXNrdG9wIiwic3lzdGVtIiwiZGVza3RvcCIsImlzUGhvbmUiLCJwaG9uZSIsIlRlbXBsYXRlVHlwZSIsIkZyZWVTdHlsZVBhZ2UiLCJnZXRWaWV3RGF0YSIsIk9iamVjdCIsImFzc2lnbiIsIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeSIsInNldFBhZ2VDb25maWd1cmF0aW9uQ2hhbmdlcyIsImlzU2hhcmVCdXR0b25WaXNpYmxlRm9yTXlJbmJveCIsImdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eUZvck15SW5ib3giLCJvU2hlbGxTZXJ2aWNlcyIsImdldFNoZWxsU2VydmljZXMiLCJzaGVsbENvbnRlbnREZW5zaXR5IiwiZ2V0Q29udGVudERlbnNpdHkiLCJzYXBmZU1hbmlmZXN0Q29udGVudCIsInNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwicmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCIsImZvcm0iLCJjb250cm9sQ29uZmlndXJhdGlvbiIsInNBbm5vdGF0aW9uUGF0aCIsImluY2x1ZGVzIiwic1RhcmdldEFubm90YXRpb25QYXRoIiwicmVzb2x2ZUR5bmFtaWNFeHByZXNzaW9uIiwiVGVtcGxhdGVNb2RlbCIsIm9EaWFnbm9zdGljcyIsImdldERpYWdub3N0aWNzIiwiaUlzc3VlQ291bnQiLCJnZXRJc3N1ZXMiLCJvQ29udmVydGVyUGFnZU1vZGVsIiwiY29udmVydFBhZ2UiLCJNYW5pZmVzdFdyYXBwZXIiLCJfZ2V0Q29udHJvbGxlck5hbWUiLCJjb250cm9sbGVyTmFtZSIsImFJc3N1ZXMiLCJhQWRkZWRJc3N1ZXMiLCJzbGljZSIsIndhcm5pbmciLCJhU3BsaXRQYXRoIiwic3BsaXQiLCJzRW50aXR5U2V0UGF0aCIsIl9nZXRGdWxsUGF0aFRvRW50aXR5U2V0IiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5U2V0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJjb250ZXh0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJub1Jlc29sdmUiLCJkZXZpY2UiLCJtYW5pZmVzdCIsImdldENvbnZlcnRlZE1ldGFkYXRhIiwiZ2V0RGVmaW5pdGlvbkNvbnRleHQiLCJnZXREZWZpbml0aW9uRm9yUGFnZSIsInN1YnN0cmluZyIsImdldFBhZ2VGb3IiLCJ2aWV3SWQiLCJ1aU1vZGVsIiwiaW50ZXJuYWxNb2RlbCIsInBhdGgiLCJzZXRQcm9wZXJ0eSIsImNvbGxhYm9yYXRpb24iLCJ0YXJnZXRVSU1vZGVsQ29udGV4dCIsInNldEJpbmRpbmdDb250ZXh0Iiwic2V0UHJlcHJvY2Vzc29yQ29udGV4dCIsInZpZXdKU09OTW9kZWwiLCJNb2RlbEhlbHBlciIsImVuaGFuY2VWaWV3SlNPTk1vZGVsIiwiaGlkZVZpZXdEdXJpbmdDcmVhdGlvbiIsInNldFZpc2libGUiLCJlYWdlclZpZXdDcmVhdGlvbiIsInNldFRpbWVvdXQiLCJuYXZOYW1lIiwicm91dGluZ1RhcmdldHMiLCJfZ2V0Um91dGVJbmZvcm1hdGlvbiIsImRldGFpbCIsInJvdXRlIiwidGFyZ2V0c1dpdGhJbmZvIiwicm91dGluZ1RhcmdldCIsInJvdXRpbmdUYXJnZXROYW1lIiwibmFtZSIsInJvdXRlclRhcmdldCIsImdldFJvdXRlciIsImdldFRhcmdldCIsIkFycmF5IiwiaXNBcnJheSIsImdldFJvb3RDb250cm9sbGVyIiwic2V0Um9vdENvbnRyb2xsZXIiLCJlcnJvclZpZXdOYW1lIiwiZSIsIkVycm9yIiwiY29udmVydGVkVHlwZXMiLCJuYXZpZ2F0aW9uT2JqZWN0S2V5IiwibmF2aWdhdGlvbk9iamVjdCIsIm91dGJvdW5kQ29uZmlnIiwib3V0Ym91bmQiLCJvdXRib3VuZERldGFpbCIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwicGFyYW1ldGVycyIsImF2YWlsYWJpbGl0eSIsInJlZ2lzdGVyVmlydHVhbFByb3BlcnR5IiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJyZWR1Y2UiLCJzUGF0aFNvRmFyIiwic05leHRQYXRoUGFydCIsIm9UYXJnZXQiLCJnZXRPYmplY3QiLCJnZXRWaWV3IiwiZ2V0SW50ZXJmYWNlIiwiZXhpdCIsInJlbW92ZUdsb2JhbEluc3RhbmNlIiwiU2VydmljZSIsIl9TZXJ2aWNlRmFjdG9yeSIsIl90aGlzIiwiX2xlbiIsImFyZ3MiLCJfa2V5IiwiY2FsbCIsIl9vSW5zdGFuY2VSZWdpc3RyeSIsIl9wcm90bzIiLCJvU2VydmljZUNvbnRleHQiLCJpQ3JlYXRpbmdWaWV3cyIsIm9UZW1wbGF0ZWRWaWV3U2VydmljZSIsImNvbXBvbmVudERhdGEiLCJnZXRDb21wb25lbnREYXRhIiwiZmVFbnZpcm9ubWVudCIsImdldFNoYXJlQ29udHJvbFZpc2liaWxpdHkiLCJnZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlIiwidGFyZ2V0cyIsInJvdXRpbmciLCJyZWFsVGFyZ2V0IiwidGFyZ2V0VG9GaW5kIiwiYWN0dWFsU2V0dGluZ3MiLCJhcHBseVBhZ2VDb25maWd1cmF0aW9uQ2hhbmdlcyIsIlNlcnZpY2VGYWN0b3J5Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb252ZXJ0ZWRNZXRhZGF0YSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTQVBKU09OU2NoZW1hRm9yV2ViQXBwbGljYXRpb25NYW5pZmVzdEZpbGUgfSBmcm9tIFwiQHVpNS9tYW5pZmVzdC90eXBlcy9tYW5pZmVzdFwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgTG9jYWxpemF0aW9uIGZyb20gXCJzYXAvYmFzZS9pMThuL0xvY2FsaXphdGlvblwiO1xuaW1wb3J0IHsgcmVzb2x2ZUJpbmRpbmdTdHJpbmcgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnREYXRhIH0gZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNPYmplY3QgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiwgWE1MUHJlcHJvY2Vzc29yQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IFRlbXBsYXRlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgU3VydmV5Q29uZmlnIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ZlZWRiYWNrXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEJhc2VNYW5pZmVzdFNldHRpbmdzLFxuXHRDb250ZW50RGVuc2l0aWVzVHlwZSxcblx0Q29udHJvbENvbmZpZ3VyYXRpb24sXG5cdE1hbmlmZXN0QWN0aW9uLFxuXHRNYW5pZmVzdEhlYWRlckZhY2V0LFxuXHRWYXJpYW50TWFuYWdlbWVudFR5cGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IE1hbmlmZXN0V3JhcHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFdyYXBwZXJcIjtcbmltcG9ydCB0eXBlICogYXMgX01ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IHJlZ2lzdGVyVmlydHVhbFByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSAqIGFzIF9UZW1wbGF0ZUNvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmFibGVSZWNvcmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHR5cGUgeyBEZWZpbml0aW9uUGFnZSB9IGZyb20gXCJzYXAvZmUvY29yZS9kZWZpbml0aW9uL0ZFRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRGVmaW5pdGlvbkNvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZGVmaW5pdGlvbi9GRURlZmluaXRpb25cIjtcbmltcG9ydCB7IHJlcXVpcmVEZXBlbmRlbmNpZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Mb2FkZXJVdGlsc1wiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBhcHBseVBhZ2VDb25maWd1cmF0aW9uQ2hhbmdlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9tYW5pZmVzdE1lcmdlci9DaGFuZ2VQYWdlQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUhhbmRsZXJTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL0NhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgeyB0eXBlIEhpZXJhY2h5TW9kZSBhcyBCcmVhZGNydW1ic0hpZXJhY2h5TW9kZSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL0JyZWFkY3J1bWJzXCI7XG5pbXBvcnQgdHlwZSB7IE92ZXJmbG93VG9vbGJhclByaW9yaXR5IH0gZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCBEZXZpY2UgZnJvbSBcInNhcC91aS9EZXZpY2VcIjtcbmltcG9ydCBWZXJzaW9uSW5mbyBmcm9tIFwic2FwL3VpL1ZlcnNpb25JbmZvXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdENvbnRlbnQsIE1hbmlmZXN0T3V0Ym91bmRFbnRyeSwgU2hhcmVPcHRpb25zIH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlSZWdpc3RyeVwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUR5bmFtaWNFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2hlbHBlcnMvRHluYW1pY0Fubm90YXRpb25QYXRoSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4vUmVzb3VyY2VNb2RlbFNlcnZpY2VGYWN0b3J5XCI7XG5cbnR5cGUgVGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncyA9IHtcblx0dmlld1R5cGU/OiBzdHJpbmc7XG5cdHZpZXdOYW1lPzogc3RyaW5nO1xufTtcblxudHlwZSBWaWV3U2V0dGluZ3MgPSBQYXJhbWV0ZXJzPHR5cGVvZiBWaWV3LmNyZWF0ZT5bMF0gJiB7IGNhY2hlOiB1bmtub3duOyBtb2RlbHM6IHVua25vd247IGhlaWdodDogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBWaWV3RGF0YSA9IHtcblx0YnJlYWRjcnVtYnNIaWVyYXJjaHlNb2RlPzogQnJlYWRjcnVtYnNIaWVyYWNoeU1vZGU7XG5cdGZjbEVuYWJsZWQ/OiBib29sZWFuO1xuXHRlZGl0YWJsZUhlYWRlckNvbnRlbnQ/OiBib29sZWFuO1xuXHRoaWRlRmlsdGVyQmFyPzogYm9vbGVhbjtcblx0dXNlSGlkZGVuRmlsdGVyQmFyPzogYm9vbGVhbjtcblx0c2VjdGlvbkxheW91dD86IHN0cmluZztcblx0YWRkaXRpb25hbFNlbWFudGljT2JqZWN0cz86IFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0Pjtcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7XG5cdG5hdmlnYXRpb246IG9iamVjdDtcblx0dmlld0xldmVsOiBudW1iZXI7XG5cdHZhcmlhbnRNYW5hZ2VtZW50PzogVmFyaWFudE1hbmFnZW1lbnRUeXBlO1xuXHRzdGFibGVJZDogc3RyaW5nO1xuXHRjb250ZW50RGVuc2l0aWVzPzogQ29udGVudERlbnNpdGllc1R5cGU7XG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWw7XG5cdGZ1bGxDb250ZXh0UGF0aDogc3RyaW5nO1xuXHRpc0Rlc2t0b3A6IGJvb2xlYW47XG5cdGlzUGhvbmU6IGJvb2xlYW47XG5cdGNvbnZlcnRlclR5cGU6IFRlbXBsYXRlVHlwZTtcblx0c2hlbGxDb250ZW50RGVuc2l0eT86IHN0cmluZztcblx0dXNlTmV3TGF6eUxvYWRpbmc/OiBib29sZWFuO1xuXHRpbml0aWFsTG9hZD86IHN0cmluZztcblx0bGl2ZU1vZGU/OiBib29sZWFuO1xuXHRyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0PzogYm9vbGVhbjtcblx0Y29udHJvbENvbmZpZ3VyYXRpb24/OiBDb250cm9sQ29uZmlndXJhdGlvbjtcblx0cmVmcmVzaFN0cmF0ZWd5T25BcHBSZXN0b3JlPzogdW5rbm93bjtcblx0ZW50aXR5U2V0Pzogc3RyaW5nO1xuXHRpc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3g/OiBib29sZWFuO1xuXHRjb250ZXh0UGF0aD86IHN0cmluZztcblx0c2hhcmU/OiBTaGFyZU9wdGlvbnM7XG5cdHNoYXJlT3ZlcmZsb3dQcmlvcml0eT86IE92ZXJmbG93VG9vbGJhclByaW9yaXR5O1xuXHRzYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbj86IE1hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXTtcblx0Y29udGVudD86IHtcblx0XHRmZWVkYmFjaz86IHsgYWN0aW9ucz86IFJlY29yZDxzdHJpbmcsIFN1cnZleUNvbmZpZz47IHN0YW5kYXJkQWN0aW9ucz86IFJlY29yZDxzdHJpbmcsIFN1cnZleUNvbmZpZz4gfTtcblx0XHRoZWFkZXI/OiB7XG5cdFx0XHRmYWNldHM/OiBDb25maWd1cmFibGVSZWNvcmQ8TWFuaWZlc3RIZWFkZXJGYWNldD47XG5cdFx0XHRhY3Rpb25zPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0QWN0aW9uPjtcblx0XHR9O1xuXHRcdGZvb3Rlcj86IHtcblx0XHRcdGFjdGlvbnM/OiBDb25maWd1cmFibGVSZWNvcmQ8TWFuaWZlc3RBY3Rpb24+O1xuXHRcdH07XG5cdH07XG59O1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlZFZpZXdTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzPiB7XG5cdGluaXRQcm9taXNlITogUHJvbWlzZTx2b2lkPjtcblxuXHRvVmlldyE6IEZFVmlldztcblxuXHRvUmVzb3VyY2VNb2RlbFNlcnZpY2UhOiBSZXNvdXJjZU1vZGVsU2VydmljZTtcblxuXHRvQ2FjaGVIYW5kbGVyU2VydmljZSE6IENhY2hlSGFuZGxlclNlcnZpY2U7XG5cblx0b0ZhY3RvcnkhOiBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3Rvcnk7XG5cblx0cmVzb3VyY2VNb2RlbCE6IFJlc291cmNlTW9kZWw7XG5cblx0c3RhYmxlSWQhOiBzdHJpbmc7XG5cblx0cGFnZUlkITogc3RyaW5nO1xuXG5cdFRlbXBsYXRlQ29udmVydGVyPzogdHlwZW9mIF9UZW1wbGF0ZUNvbnZlcnRlcjtcblxuXHRNZXRhTW9kZWxDb252ZXJ0ZXI/OiB0eXBlb2YgX01ldGFNb2RlbENvbnZlcnRlcjtcblxuXHRpbml0KCk6IHZvaWQge1xuXHRcdGNvbnN0IGFTZXJ2aWNlRGVwZW5kZW5jaWVzID0gW107XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3Q7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvQ29tcG9uZW50KTtcblx0XHRjb25zdCB2aWV3UHJlbG9hZGVyU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0Vmlld1ByZWxvYWRlclNlcnZpY2UoKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHR0aGlzLnBhZ2VJZCA9IG9BcHBDb21wb25lbnQuZ2V0TG9jYWxJZChvQ29tcG9uZW50LmdldElkKCkpIGFzIHN0cmluZztcblx0XHRjb25zdCBzU3RhYmxlSWQgPSBgJHtvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0Q29tcG9uZW50TmFtZSgpfTo6JHt0aGlzLnBhZ2VJZH1gO1xuXHRcdGNvbnN0IGFFbmhhbmNlSTE4biA9IG9Db21wb25lbnQuZ2V0RW5oYW5jZUkxOG4oKSB8fCBbXTtcblx0XHRsZXQgc0FwcE5hbWVzcGFjZTtcblx0XHR0aGlzLm9GYWN0b3J5ID0gb0NvbnRleHQuZmFjdG9yeTtcblx0XHRpZiAoYUVuaGFuY2VJMThuKSB7XG5cdFx0XHRzQXBwTmFtZXNwYWNlID0gb0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldENvbXBvbmVudE5hbWUoKTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUVuaGFuY2VJMThuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgdGV4dC12ZXJ0aWNhbGl6YXRpb24gYXBwbGljYXRpb25zIGNhbiBhbHNvIHBhc3MgYSByZXNvdXJjZSBtb2RlbCBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0XHQvLyBVSTUgdGFrZXMgY2FyZSBvZiB0ZXh0LXZlcnRpY2FsaXphdGlvbiBmb3IgcmVzb3VyY2UgbW9kZWxzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIEhlbmNlIGNoZWNrIGlmIHRoZSBnaXZlbiBrZXkgaXMgYSByZXNvdXJjZSBtb2RlbCBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0XHQvLyBpZiBzbyB0aGlzIG1vZGVsIHNob3VsZCBiZSB1c2VkIHRvIGVuaGFuY2UgdGhlIHNhcC5mZSByZXNvdXJjZSBtb2RlbCBzbyBwYXNzIGl0IGFzIGl0IGlzXG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNb2RlbChhRW5oYW5jZUkxOG5baV0pO1xuXHRcdFx0XHRpZiAob1Jlc291cmNlTW9kZWwgJiYgb1Jlc291cmNlTW9kZWwuaXNBKFwic2FwLnVpLm1vZGVsLnJlc291cmNlLlJlc291cmNlTW9kZWxcIikpIHtcblx0XHRcdFx0XHRhRW5oYW5jZUkxOG5baV0gPSBvUmVzb3VyY2VNb2RlbDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhRW5oYW5jZUkxOG5baV0gPSBgJHtzQXBwTmFtZXNwYWNlfS4ke2FFbmhhbmNlSTE4bltpXS5yZXBsYWNlKFwiLnByb3BlcnRpZXNcIiwgXCJcIil9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBzQ2FjaGVJZGVudGlmaWVyID0gYCR7b0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX1fJHtzU3RhYmxlSWR9XyR7TG9jYWxpemF0aW9uLmdldExhbmd1YWdlVGFnKCl9YDtcblx0XHRjb25zdCBidW5kbGVzVG9Mb2FkID0gW1wic2FwLmZlLmNvcmUubWVzc2FnZWJ1bmRsZVwiLCBcInNhcC5mZS5tYWNyb3MubWVzc2FnZWJ1bmRsZVwiLCBcInNhcC5mZS50ZW1wbGF0ZXMubWVzc2FnZWJ1bmRsZVwiXTtcblx0XHRpZiAob0NvbXBvbmVudC5fZ2V0QWRkaXRpb25hbEkxOG5CdW5kbGVzKSB7XG5cdFx0XHRidW5kbGVzVG9Mb2FkLnB1c2goLi4ub0NvbXBvbmVudC5fZ2V0QWRkaXRpb25hbEkxOG5CdW5kbGVzKCkpO1xuXHRcdH1cblx0XHRhU2VydmljZURlcGVuZGVuY2llcy5wdXNoKFxuXHRcdFx0U2VydmljZUZhY3RvcnlSZWdpc3RyeS5nZXQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5SZXNvdXJjZU1vZGVsU2VydmljZVwiKVxuXHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHNjb3BlVHlwZTogXCJjb21wb25lbnRcIixcblx0XHRcdFx0XHRzY29wZU9iamVjdDogb0NvbXBvbmVudCxcblx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0YnVuZGxlczogYnVuZGxlc1RvTG9hZCxcblx0XHRcdFx0XHRcdGVuaGFuY2VJMThuOiBhRW5oYW5jZUkxOG4sXG5cdFx0XHRcdFx0XHRtb2RlbE5hbWU6IFwic2FwLmZlLmkxOG5cIlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKG9SZXNvdXJjZU1vZGVsU2VydmljZTogUmVzb3VyY2VNb2RlbFNlcnZpY2UpID0+IHtcblx0XHRcdFx0XHR0aGlzLm9SZXNvdXJjZU1vZGVsU2VydmljZSA9IG9SZXNvdXJjZU1vZGVsU2VydmljZTtcblx0XHRcdFx0XHRyZXR1cm4gb1Jlc291cmNlTW9kZWxTZXJ2aWNlLmdldFJlc291cmNlTW9kZWwoKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXHRcdGFTZXJ2aWNlRGVwZW5kZW5jaWVzLnB1c2goXG5cdFx0XHRTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5LmdldChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLkNhY2hlSGFuZGxlclNlcnZpY2VcIilcblx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50OiBvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0Y29tcG9uZW50OiBvQ29tcG9uZW50XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbihhc3luYyAob0NhY2hlSGFuZGxlclNlcnZpY2U6IENhY2hlSGFuZGxlclNlcnZpY2UpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcblx0XHRcdFx0XHRhd2FpdCB2aWV3UHJlbG9hZGVyU2VydmljZS5pc0NhY2hlUmVhZHkoKTtcblx0XHRcdFx0XHR0aGlzLm9DYWNoZUhhbmRsZXJTZXJ2aWNlID0gb0NhY2hlSGFuZGxlclNlcnZpY2U7XG5cdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJTZXJ2aWNlLnZhbGlkYXRlQ2FjaGVLZXkoc0NhY2hlSWRlbnRpZmllciwgb0NvbXBvbmVudCwgb0FwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXHRcdGFTZXJ2aWNlRGVwZW5kZW5jaWVzLnB1c2goXG5cdFx0XHRWZXJzaW9uSW5mby5sb2FkKClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9JbmZvKSB7XG5cdFx0XHRcdFx0bGV0IHNUaW1lc3RhbXAgPSBcIlwiO1xuXHRcdFx0XHRcdGlmICghb0luZm8ubGlicmFyaWVzKSB7XG5cdFx0XHRcdFx0XHRzVGltZXN0YW1wID0gKENvcmUgYXMgeyBidWlsZGluZm8/OiB7IGJ1aWxkdGltZT86IHN0cmluZyB9IH0pPy5idWlsZGluZm8/LmJ1aWxkdGltZSA/PyBcIjxOT1ZBTFVFPlwiO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvSW5mby5saWJyYXJpZXMuZm9yRWFjaChmdW5jdGlvbiAob0xpYnJhcnkpIHtcblx0XHRcdFx0XHRcdFx0c1RpbWVzdGFtcCArPSBvTGlicmFyeS5idWlsZFRpbWVzdGFtcDtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gc1RpbWVzdGFtcDtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCI8Tk9WQUxVRT5cIjtcblx0XHRcdFx0fSlcblx0XHQpO1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLmFsbChhU2VydmljZURlcGVuZGVuY2llcylcblx0XHRcdC50aGVuKGFzeW5jIChhRGVwZW5kZW5jaWVzUmVzdWx0OiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlTW9kZWwgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzBdIGFzIFJlc291cmNlTW9kZWw7XG5cdFx0XHRcdGNvbnN0IHNDYWNoZUtleSA9IGFEZXBlbmRlbmNpZXNSZXN1bHRbMV0gYXMgc3RyaW5nIHwgbnVsbDtcblx0XHRcdFx0Y29uc3QgW1RlbXBsYXRlQ29udmVydGVyLCBNZXRhTW9kZWxDb252ZXJ0ZXJdID0gYXdhaXQgcmVxdWlyZURlcGVuZGVuY2llcyhbXG5cdFx0XHRcdFx0XCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCIsXG5cdFx0XHRcdFx0XCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiXG5cdFx0XHRcdF0pO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVWaWV3KFxuXHRcdFx0XHRcdG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdHNTdGFibGVJZCxcblx0XHRcdFx0XHRzQ2FjaGVLZXksXG5cdFx0XHRcdFx0VGVtcGxhdGVDb252ZXJ0ZXIgYXMgdHlwZW9mIF9UZW1wbGF0ZUNvbnZlcnRlcixcblx0XHRcdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXIgYXMgdHlwZW9mIF9NZXRhTW9kZWxDb252ZXJ0ZXJcblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoc0NhY2hlS2V5OiBzdHJpbmcgfCB2b2lkIHwgbnVsbCk6IHZvaWQge1xuXHRcdFx0XHRjb25zdCBvQ2FjaGVIYW5kbGVyU2VydmljZSA9IFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkuZ2V0KFwic2FwLmZlLmNvcmUuc2VydmljZXMuQ2FjaGVIYW5kbGVyU2VydmljZVwiKS5nZXRJbnN0YW5jZShvTWV0YU1vZGVsKTtcblx0XHRcdFx0b0NhY2hlSGFuZGxlclNlcnZpY2UuaW52YWxpZGF0ZUlmTmVlZGVkKFxuXHRcdFx0XHRcdHNDYWNoZUtleSxcblx0XHRcdFx0XHRzQ2FjaGVJZGVudGlmaWVyLFxuXHRcdFx0XHRcdG9Db21wb25lbnQsXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZnJlc2ggdGhlIGN1cnJlbnQgdmlldyB1c2luZyB0aGUgc2FtZSBjb25maWd1cmF0aW9uIGFzIGJlZm9yZS5cblx0ICogQHBhcmFtIG9Db21wb25lbnRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIGluZGljYXRpbmcgd2hlbiB0aGUgdmlldyBpcyByZWZyZXNoZWRcblx0ICovXG5cdGFzeW5jIHJlZnJlc2hWaWV3KG9Db21wb25lbnQ6IFRlbXBsYXRlQ29tcG9uZW50KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3ID0gb0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdGlmIChvUm9vdFZpZXcpIHtcblx0XHRcdG9Sb290Vmlldy5kZXN0cm95KCk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLm9WaWV3KSB7XG5cdFx0XHR0aGlzLm9WaWV3LmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlVmlldyh0aGlzLnJlc291cmNlTW9kZWwsIHRoaXMuc3RhYmxlSWQsIFwiXCIsIHRoaXMuVGVtcGxhdGVDb252ZXJ0ZXIhLCB0aGlzLk1ldGFNb2RlbENvbnZlcnRlciEpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdG9Db21wb25lbnQuZ2V0VUlBcmVhKCkuaW52YWxpZGF0ZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0b0NvbXBvbmVudC5nZXRVSUFyZWEoKS5pbnZhbGlkYXRlKCk7XG5cdFx0XHRcdExvZy5lcnJvcihvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0X2dldFZpZXdTZXR0aW5ncyhcblx0XHRwcmVwcm9jZXNzb3JDb250ZXh0OiBYTUxQcmVwcm9jZXNzb3JDb250ZXh0LFxuXHRcdG1TZXJ2aWNlU2V0dGluZ3M6IFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3MsXG5cdFx0b0NvbXBvbmVudDogRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+LFxuXHRcdG1WaWV3RGF0YTogVmlld0RhdGEsXG5cdFx0c0NhY2hlS2V5OiBzdHJpbmcgfCBudWxsLFxuXHRcdG9QYWdlTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRvUmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbFxuXHQpOiBWaWV3U2V0dGluZ3Mge1xuXHRcdGxldCB2aWV3VHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gbVNlcnZpY2VTZXR0aW5ncy52aWV3VHlwZSB8fCBvQ29tcG9uZW50LmdldFZpZXdUeXBlKCkgfHwgXCJYTUxcIjtcblx0XHRpZiAodmlld1R5cGUgIT09IFwiWE1MXCIpIHtcblx0XHRcdHZpZXdUeXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0dHlwZTogdmlld1R5cGUsXG5cdFx0XHRwcmVwcm9jZXNzb3JzOiB7XG5cdFx0XHRcdHhtbDogcHJlcHJvY2Vzc29yQ29udGV4dCxcblx0XHRcdFx0Y29udHJvbHM6IHt9XG5cdFx0XHR9LFxuXHRcdFx0aWQ6IG1WaWV3RGF0YS5zdGFibGVJZCxcblx0XHRcdHZpZXdOYW1lOiBtU2VydmljZVNldHRpbmdzLnZpZXdOYW1lIHx8IG9Db21wb25lbnQuZ2V0Vmlld05hbWU/LigpLFxuXHRcdFx0dmlld0RhdGE6IG1WaWV3RGF0YSxcblx0XHRcdGNhY2hlOiB7XG5cdFx0XHRcdGtleXM6IFtzQ2FjaGVLZXldLFxuXHRcdFx0XHRhZGRpdGlvbmFsRGF0YToge1xuXHRcdFx0XHRcdC8vIFdlIHN0b3JlIHRoZSBwYWdlIG1vZGVsIGRhdGEgaW4gdGhlIGBhZGRpdGlvbmFsRGF0YWAgb2YgdGhlIHZpZXcgY2FjaGUsIHRoaXMgd2F5IGl0IGlzIGFsd2F5cyBpbiBzeW5jXG5cdFx0XHRcdFx0Z2V0QWRkaXRpb25hbENhY2hlRGF0YTogKCk6IHVua25vd24gPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9QYWdlTW9kZWwuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0c2V0QWRkaXRpb25hbENhY2hlRGF0YTogKHZhbHVlOiBvYmplY3QpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdG9QYWdlTW9kZWwuc2V0RGF0YSh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFwic2FwLmZlLmkxOG5cIjogb1Jlc291cmNlTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRoZWlnaHQ6IFwiMTAwJVwiXG5cdFx0fTtcblx0fVxuXG5cdGFzeW5jIF9jcmVhdGVFcnJvclBhZ2UoXG5cdFx0cmVhc29uOiBFcnJvcixcblx0XHRvVmlld1NldHRpbmdzOiBWaWV3U2V0dGluZ3MsXG5cdFx0dmlld05hbWU6IHN0cmluZyxcblx0XHRvQ29tcG9uZW50OiBUZW1wbGF0ZUNvbXBvbmVudCxcblx0XHRzQ2FjaGVLZXk6IHN0cmluZyB8IG51bGxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHQvLyBqdXN0IHJlcGxhY2UgdGhlIHZpZXcgbmFtZSBhbmQgYSBtb2RlbCBjb250YWluaW5nIHRoZSByZWFzb24sIGJ1dCBrZWVwIHRoZSBvdGhlciBzZXR0aW5nc1xuXHRcdExvZy5lcnJvcihyZWFzb24ubWVzc2FnZSwgcmVhc29uKTtcblx0XHRvVmlld1NldHRpbmdzLnZpZXdOYW1lID0gdmlld05hbWU7XG5cdFx0aWYgKG9WaWV3U2V0dGluZ3MucHJlcHJvY2Vzc29ycykge1xuXHRcdFx0KG9WaWV3U2V0dGluZ3MucHJlcHJvY2Vzc29ycyBhcyBSZWNvcmQ8c3RyaW5nLCB7IG1vZGVsczogUmVjb3JkPHN0cmluZywgTW9kZWw+IH0+KS54bWwubW9kZWxzW1wiZXJyb3JcIl0gPSBuZXcgSlNPTk1vZGVsKHJlYXNvbik7XG5cdFx0fVxuXHRcdGRlbGV0ZSBvVmlld1NldHRpbmdzLmNhY2hlO1xuXHRcdG9WaWV3U2V0dGluZ3MuaWQgKz0gXCItRXJyb3JcIjtcblx0XHRvVmlld1NldHRpbmdzLnZpZXdEYXRhLnN0YWJsZUlkICs9IFwiLUVycm9yXCI7XG5cdFx0ZGVsZXRlIG9WaWV3U2V0dGluZ3MuY29udHJvbGxlcjtcblxuXHRcdHJldHVybiBvQ29tcG9uZW50LnJ1bkFzT3duZXIoYXN5bmMgKCkgPT4ge1xuXHRcdFx0cmV0dXJuIFZpZXcuY3JlYXRlKG9WaWV3U2V0dGluZ3MpLnRoZW4oKG9WaWV3OiBWaWV3KSA9PiB7XG5cdFx0XHRcdHRoaXMub1ZpZXcgPSBvVmlldyBhcyBGRVZpZXc7XG5cdFx0XHRcdHRoaXMub1ZpZXcuc2V0TW9kZWwobmV3IEpTT05Nb2RlbCh0aGlzLm9WaWV3KSwgXCIkdmlld1wiKTtcblx0XHRcdFx0b0NvbXBvbmVudC5zZXRBZ2dyZWdhdGlvbihcInJvb3RDb250cm9sXCIsIHRoaXMub1ZpZXcpO1xuXHRcdFx0XHRvQ29tcG9uZW50LmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250cm9sKCkuZ2V0Q29udHJvbGxlcigpLmdldFBsYWNlaG9sZGVyKCkuaGlkZVJvb3RQbGFjZWhvbGRlcigpO1xuXHRcdFx0XHRyZXR1cm4gc0NhY2hlS2V5O1xuXHRcdFx0fSk7XG5cdFx0fSkgYXMgUHJvbWlzZTxzdHJpbmc+O1xuXHR9XG5cblx0YXN5bmMgY3JlYXRlVmlldyhcblx0XHRvUmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRzU3RhYmxlSWQ6IHN0cmluZyxcblx0XHRzQ2FjaGVLZXk6IHN0cmluZyB8IG51bGwsXG5cdFx0VGVtcGxhdGVDb252ZXJ0ZXI6IHR5cGVvZiBfVGVtcGxhdGVDb252ZXJ0ZXIsXG5cdFx0TWV0YU1vZGVsQ29udmVydGVyOiB0eXBlb2YgX01ldGFNb2RlbENvbnZlcnRlclxuXHQpOiBQcm9taXNlPHN0cmluZyB8IG51bGwgfCB2b2lkPiB7XG5cdFx0dGhpcy5yZXNvdXJjZU1vZGVsID0gb1Jlc291cmNlTW9kZWw7XG5cdFx0dGhpcy5zdGFibGVJZCA9IHNTdGFibGVJZDtcblx0XHR0aGlzLlRlbXBsYXRlQ29udmVydGVyID0gVGVtcGxhdGVDb252ZXJ0ZXI7XG5cdFx0dGhpcy5NZXRhTW9kZWxDb252ZXJ0ZXIgPSBNZXRhTW9kZWxDb252ZXJ0ZXI7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBtU2VydmljZVNldHRpbmdzID0gb0NvbnRleHQuc2V0dGluZ3M7XG5cdFx0Y29uc3Qgc0NvbnZlcnRlclR5cGUgPSBtU2VydmljZVNldHRpbmdzLmNvbnZlcnRlclR5cGU7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0IGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9Db21wb25lbnQpO1xuXHRcdGxldCBzRnVsbENvbnRleHRQYXRoOiBzdHJpbmcgPVxuXHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKG9Db21wb25lbnQpPy5vcHRpb25zPy5zZXR0aW5ncz8uZnVsbENvbnRleHRQYXRoID8/IFwiXCI7XG5cdFx0aWYgKCFzRnVsbENvbnRleHRQYXRoKSB7XG5cdFx0XHQvLyBpZiB0aGUgY29udGV4dCBwYXRoIGNvdWxkbid0IGJlIHJldHJpZXZlZCBmcm9tIHRoZSByb3V0aW5nIHNlcnZpY2UsIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgY29tcG9uZW50IGl0c2VsZlxuXHRcdFx0Y29uc3QgY29tcG9uZW50Q29udGV4dFBhdGggPSBvQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCk7XG5cdFx0XHRpZiAoY29tcG9uZW50Q29udGV4dFBhdGgpIHtcblx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aCA9IGNvbXBvbmVudENvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSA/IGNvbXBvbmVudENvbnRleHRQYXRoIDogYCR7Y29tcG9uZW50Q29udGV4dFBhdGh9L2A7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG9NYW5pZmVzdENvbnRlbnQgPSBvQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0KCk7XG5cdFx0Y29uc3Qgb0RldmljZU1vZGVsID0gbmV3IEpTT05Nb2RlbChEZXZpY2UpLnNldERlZmF1bHRCaW5kaW5nTW9kZShcIk9uZVdheVwiKTtcblx0XHRjb25zdCBvTWFuaWZlc3RNb2RlbCA9IG5ldyBKU09OTW9kZWwob01hbmlmZXN0Q29udGVudCk7XG5cdFx0bGV0IG9QYWdlTW9kZWw6IFRlbXBsYXRlTW9kZWwsIG9WaWV3RGF0YU1vZGVsOiBNb2RlbCwgbVZpZXdEYXRhOiBWaWV3RGF0YTtcblx0XHQvLyBMb2FkIHRoZSBpbmRleCBmb3IgdGhlIGFkZGl0aW9uYWwgYnVpbGRpbmcgYmxvY2tzIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgdGhlbVxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm91dGluZ1NlcnZpY2UgPSBhd2FpdCBvQXBwQ29tcG9uZW50LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKTtcblx0XHRcdC8vIFJldHJpZXZlIHRoZSB2aWV3TGV2ZWwgZm9yIHRoZSBjb21wb25lbnRcblx0XHRcdGNvbnN0IG9UYXJnZXRJbmZvID0gb1JvdXRpbmdTZXJ2aWNlLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKG9Db21wb25lbnQpO1xuXHRcdFx0Y29uc3QgbU91dGJvdW5kcyA9XG5cdFx0XHRcdChvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXSAmJlxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnRbXCJzYXAuYXBwXCJdLmNyb3NzTmF2aWdhdGlvbiAmJlxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnRbXCJzYXAuYXBwXCJdLmNyb3NzTmF2aWdhdGlvbi5vdXRib3VuZHMpIHx8XG5cdFx0XHRcdHt9O1xuXHRcdFx0Y29uc3QgbU5hdmlnYXRpb24gPSBvQ29tcG9uZW50LmdldE5hdmlnYXRpb24oKSB8fCB7fTtcblx0XHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFkYXRhID0gTWV0YU1vZGVsQ29udmVydGVyLmNvbnZlcnRUeXBlcyhcblx0XHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fZW5oYW5jZU5hdmlnYXRpb25Db25maWcobU5hdmlnYXRpb24sIG1PdXRib3VuZHMsIGNvbnZlcnRlZE1ldGFkYXRhLCBzU3RhYmxlSWQpO1xuXHRcdFx0Y29uc3QgZGVmaW5pdGlvbkNvbnRleHQgPSBuZXcgRGVmaW5pdGlvbkNvbnRleHQoY29udmVydGVkTWV0YWRhdGEpO1xuXHRcdFx0ZGVmaW5pdGlvbkNvbnRleHQuYWRkQXBwbGljYXRpb25NYW5pZmVzdChvTWFuaWZlc3RDb250ZW50IGFzIFNBUEpTT05TY2hlbWFGb3JXZWJBcHBsaWNhdGlvbk1hbmlmZXN0RmlsZSk7XG5cblx0XHRcdG1WaWV3RGF0YSA9IHtcblx0XHRcdFx0YXBwQ29tcG9uZW50OiBvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRuYXZpZ2F0aW9uOiBtTmF2aWdhdGlvbixcblx0XHRcdFx0dmlld0xldmVsOiBvVGFyZ2V0SW5mbz8udmlld0xldmVsLFxuXHRcdFx0XHRzdGFibGVJZDogc1N0YWJsZUlkLFxuXHRcdFx0XHRjb250ZW50RGVuc2l0aWVzOiBvTWFuaWZlc3RDb250ZW50W1wic2FwLnVpNVwiXT8uY29udGVudERlbnNpdGllcyxcblx0XHRcdFx0cmVzb3VyY2VNb2RlbDogb1Jlc291cmNlTW9kZWwsXG5cdFx0XHRcdGZ1bGxDb250ZXh0UGF0aDogc0Z1bGxDb250ZXh0UGF0aCxcblx0XHRcdFx0aXNEZXNrdG9wOiBEZXZpY2Uuc3lzdGVtLmRlc2t0b3AsXG5cdFx0XHRcdGlzUGhvbmU6IERldmljZS5zeXN0ZW0ucGhvbmUsXG5cdFx0XHRcdGNvbnZlcnRlclR5cGU6IFRlbXBsYXRlVHlwZS5GcmVlU3R5bGVQYWdlXG5cdFx0XHR9O1xuXHRcdFx0aWYgKG9Db21wb25lbnQuZ2V0Vmlld0RhdGEpIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihtVmlld0RhdGEsIG9Db21wb25lbnQuZ2V0Vmlld0RhdGEoKSk7XG5cdFx0XHRcdG1WaWV3RGF0YSA9IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5zZXRQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMoXG5cdFx0XHRcdFx0b01hbmlmZXN0Q29udGVudCxcblx0XHRcdFx0XHRtVmlld0RhdGEsXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHR0aGlzLnBhZ2VJZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bVZpZXdEYXRhLmlzU2hhcmVCdXR0b25WaXNpYmxlRm9yTXlJbmJveCA9IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5nZXRTaGFyZUJ1dHRvblZpc2liaWxpdHlGb3JNeUluYm94KG9BcHBDb21wb25lbnQpO1xuXHRcdFx0Y29uc3Qgb1NoZWxsU2VydmljZXMgPSBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKTtcblx0XHRcdG1WaWV3RGF0YS5jb252ZXJ0ZXJUeXBlID0gc0NvbnZlcnRlclR5cGU7XG5cdFx0XHRtVmlld0RhdGEuc2hlbGxDb250ZW50RGVuc2l0eSA9IG9TaGVsbFNlcnZpY2VzLmdldENvbnRlbnREZW5zaXR5KCk7XG5cdFx0XHRjb25zdCBzYXBmZU1hbmlmZXN0Q29udGVudCA9IG9NYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl07XG5cdFx0XHRtVmlld0RhdGEuc2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBvTWFuaWZlc3RDb250ZW50W1wic2FwLmZlXCJdO1xuXHRcdFx0bVZpZXdEYXRhLnJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QgPSBzYXBmZU1hbmlmZXN0Q29udGVudD8uZm9ybVxuXHRcdFx0XHQ/IHNhcGZlTWFuaWZlc3RDb250ZW50Py5mb3JtPy5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0XG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0b1ZpZXdEYXRhTW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1WaWV3RGF0YSk7XG5cdFx0XHRpZiAobVZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uKSB7XG5cdFx0XHRcdGZvciAoY29uc3Qgc0Fubm90YXRpb25QYXRoIGluIG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbikge1xuXHRcdFx0XHRcdGlmIChzQW5ub3RhdGlvblBhdGguaW5jbHVkZXMoXCJbXCIpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzVGFyZ2V0QW5ub3RhdGlvblBhdGggPSByZXNvbHZlRHluYW1pY0V4cHJlc3Npb24oc0Fubm90YXRpb25QYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdFx0XHRcdG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbltzVGFyZ2V0QW5ub3RhdGlvblBhdGhdID0gbVZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uW3NBbm5vdGF0aW9uUGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9QYWdlTW9kZWwgPSBuZXcgVGVtcGxhdGVNb2RlbCgoKSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0RpYWdub3N0aWNzID0gb0FwcENvbXBvbmVudC5nZXREaWFnbm9zdGljcygpO1xuXHRcdFx0XHRcdGNvbnN0IGlJc3N1ZUNvdW50ID0gb0RpYWdub3N0aWNzLmdldElzc3VlcygpLmxlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBvQ29udmVydGVyUGFnZU1vZGVsID0gVGVtcGxhdGVDb252ZXJ0ZXIuY29udmVydFBhZ2UoXG5cdFx0XHRcdFx0XHRzQ29udmVydGVyVHlwZSxcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRtVmlld0RhdGEgYXMgdW5rbm93biBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncyxcblx0XHRcdFx0XHRcdG5ldyBNYW5pZmVzdFdyYXBwZXIobVZpZXdEYXRhIGFzIHVua25vd24gYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3MsIG9BcHBDb21wb25lbnQpLFxuXHRcdFx0XHRcdFx0b0RpYWdub3N0aWNzLFxuXHRcdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aCxcblx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKSxcblx0XHRcdFx0XHRcdG9Db21wb25lbnRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGlmIChvQ29udmVydGVyUGFnZU1vZGVsICYmIG9Db21wb25lbnQuX2dldENvbnRyb2xsZXJOYW1lKCkpIHtcblx0XHRcdFx0XHRcdChvQ29udmVydGVyUGFnZU1vZGVsIGFzIHsgY29udHJvbGxlck5hbWU/OiBzdHJpbmcgfSkuY29udHJvbGxlck5hbWUgPSBvQ29tcG9uZW50Ll9nZXRDb250cm9sbGVyTmFtZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBhSXNzdWVzID0gb0RpYWdub3N0aWNzLmdldElzc3VlcygpO1xuXHRcdFx0XHRcdGNvbnN0IGFBZGRlZElzc3VlcyA9IGFJc3N1ZXMuc2xpY2UoaUlzc3VlQ291bnQpO1xuXHRcdFx0XHRcdGlmIChhQWRkZWRJc3N1ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0XHRcdFwiU29tZSBpc3N1ZXMgaGF2ZSBiZWVuIGRldGVjdGVkIGluIHlvdXIgcHJvamVjdCwgcGxlYXNlIGNoZWNrIHRoZSBVSTUgc3VwcG9ydCBhc3Npc3RhbnQgcnVsZSBmb3Igc2FwLmZlLmNvcmVcIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG9Db252ZXJ0ZXJQYWdlTW9kZWw7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZywgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRyZXR1cm4ge307XG5cdFx0XHRcdH1cblx0XHRcdH0sIG9NZXRhTW9kZWwpO1xuXHRcdFx0Y29uc3QgYVNwbGl0UGF0aCA9IHNGdWxsQ29udGV4dFBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSB0aGlzLl9nZXRGdWxsUGF0aFRvRW50aXR5U2V0KGFTcGxpdFBhdGgsIG9NZXRhTW9kZWwpO1xuXHRcdFx0Y29uc3QgcHJlcHJvY2Vzc29yQ29udGV4dDogWE1MUHJlcHJvY2Vzc29yQ29udGV4dCA9IHtcblx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdGVudGl0eVNldDogc0VudGl0eVNldFBhdGggPyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlTZXRQYXRoKSA6IG51bGwsXG5cdFx0XHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGggPyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdWxsQ29udGV4dFBhdGgpIDogbnVsbCxcblx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVsbENvbnRleHRQYXRoKSA6IG51bGwsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0OiBvUGFnZU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiLCB1bmRlZmluZWQsIHsgbm9SZXNvbHZlOiB0cnVlIH0pLFxuXHRcdFx0XHRcdFx0dmlld0RhdGE6IG1WaWV3RGF0YSA/IG9WaWV3RGF0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSA6IG51bGxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcInNhcC5mZS5pMThuXCI6IG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0ZGV2aWNlOiBvRGV2aWNlTW9kZWwsXG5cdFx0XHRcdFx0XHRtYW5pZmVzdDogb01hbmlmZXN0TW9kZWwsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0OiBvUGFnZU1vZGVsIGFzIHVua25vd24gYXMgSlNPTk1vZGVsLFxuXHRcdFx0XHRcdFx0dmlld0RhdGE6IG9WaWV3RGF0YU1vZGVsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0Z2V0Q29udmVydGVkTWV0YWRhdGE6ICgpID0+IGNvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdFx0XHRcdGdldERlZmluaXRpb25Db250ZXh0KCk6IERlZmluaXRpb25Db250ZXh0IHtcblx0XHRcdFx0XHRcdHJldHVybiBkZWZpbml0aW9uQ29udGV4dDtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldERlZmluaXRpb25Gb3JQYWdlKCk6IERlZmluaXRpb25QYWdlIHtcblx0XHRcdFx0XHRcdGxldCBmdWxsQ29udGV4dFBhdGggPSBzRnVsbENvbnRleHRQYXRoO1xuXHRcdFx0XHRcdFx0aWYgKGZ1bGxDb250ZXh0UGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoID0gZnVsbENvbnRleHRQYXRoLnN1YnN0cmluZygwLCBmdWxsQ29udGV4dFBhdGgubGVuZ3RoIC0gMSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGVmaW5pdGlvbkNvbnRleHQuZ2V0UGFnZUZvcihmdWxsQ29udGV4dFBhdGgpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50OiBvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdHZpZXdJZDogc1N0YWJsZUlkXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9WaWV3U2V0dGluZ3MgPSB0aGlzLl9nZXRWaWV3U2V0dGluZ3MoXG5cdFx0XHRcdFx0cHJlcHJvY2Vzc29yQ29udGV4dCxcblx0XHRcdFx0XHRtU2VydmljZVNldHRpbmdzLFxuXHRcdFx0XHRcdG9Db21wb25lbnQsXG5cdFx0XHRcdFx0bVZpZXdEYXRhLFxuXHRcdFx0XHRcdHNDYWNoZUtleSxcblx0XHRcdFx0XHRvUGFnZU1vZGVsIGFzIHVua25vd24gYXMgSlNPTk1vZGVsLFxuXHRcdFx0XHRcdG9SZXNvdXJjZU1vZGVsXG5cdFx0XHRcdCk7XG5cdFx0XHQvLyBTZXR0aW5nIHRoZSBwYWdlTW9kZWwgb24gdGhlIGNvbXBvbmVudCBmb3IgcG90ZW50aWFsIHJldXNlXG5cdFx0XHRvQ29tcG9uZW50LnNldE1vZGVsKG9QYWdlTW9kZWwgYXMgdW5rbm93biBhcyBKU09OTW9kZWwsIFwiX3BhZ2VNb2RlbFwiKTtcblx0XHRcdG9Db21wb25lbnQuc2V0TW9kZWwob1ZpZXdEYXRhTW9kZWwsIFwidmlld0RhdGFcIik7XG5cdFx0XHRjb25zdCB1aU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpO1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRvQ29tcG9uZW50LnNldE1vZGVsKHVpTW9kZWwsIFwidWlcIik7XG5cdFx0XHRvQ29tcG9uZW50LnNldE1vZGVsKGludGVybmFsTW9kZWwsIFwiaW50ZXJuYWxcIik7XG5cdFx0XHRvQ29tcG9uZW50LnNldE1vZGVsKGludGVybmFsTW9kZWwsIFwicGFnZUludGVybmFsXCIpO1xuXHRcdFx0Y29uc3QgcGF0aCA9IGAvcGFnZXMvJHtvVmlld1NldHRpbmdzLmlkfWA7XG5cdFx0XHR1aU1vZGVsLnNldFByb3BlcnR5KHBhdGgsIHtcblx0XHRcdFx0Y29udHJvbHM6IHt9XG5cdFx0XHR9KTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkocGF0aCwge1xuXHRcdFx0XHRjb250cm9sczoge30sXG5cdFx0XHRcdGNvbGxhYm9yYXRpb246IHt9XG5cdFx0XHR9KTtcblx0XHRcdGxldCB0YXJnZXRVSU1vZGVsQ29udGV4dCA9IFwiL1wiO1xuXHRcdFx0aWYgKG9Db21wb25lbnQuaXNBPENvbnRyb2w+KFwic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkNvbXBvbmVudFwiKSkge1xuXHRcdFx0XHR0YXJnZXRVSU1vZGVsQ29udGV4dCA9IGAvJHtvVmlld1NldHRpbmdzLmlkfWA7XG5cdFx0XHR9XG5cdFx0XHRvQ29tcG9uZW50LnNldEJpbmRpbmdDb250ZXh0KHVpTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQodGFyZ2V0VUlNb2RlbENvbnRleHQpLCBcInVpXCIpO1xuXHRcdFx0b0NvbXBvbmVudC5zZXRCaW5kaW5nQ29udGV4dChpbnRlcm5hbE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHBhdGgpLCBcImludGVybmFsXCIpO1xuXG5cdFx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgcHJvdmlkZSBpdCBhbHNvIHBhZ2VJbnRlcm5hbCBhcyBzb21lIG1hY3JvcyBhY2Nlc3MgaXQgLSB0byBiZSByZW1vdmVkXG5cdFx0XHRvQ29tcG9uZW50LnNldEJpbmRpbmdDb250ZXh0KGludGVybmFsTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQocGF0aCksIFwicGFnZUludGVybmFsXCIpO1xuXHRcdFx0b0NvbXBvbmVudC5zZXRQcmVwcm9jZXNzb3JDb250ZXh0KHByZXByb2Nlc3NvckNvbnRleHQpO1xuXHRcdFx0cmV0dXJuIG9Db21wb25lbnQucnVuQXNPd25lcihhc3luYyAoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBWaWV3LmNyZWF0ZShvVmlld1NldHRpbmdzKVxuXG5cdFx0XHRcdFx0LnRoZW4oKG9WaWV3OiBWaWV3KSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLm9WaWV3ID0gb1ZpZXcgYXMgRkVWaWV3O1xuXG5cdFx0XHRcdFx0XHRjb25zdCB2aWV3SlNPTk1vZGVsID0gbmV3IEpTT05Nb2RlbCh0aGlzLm9WaWV3KTtcblx0XHRcdFx0XHRcdE1vZGVsSGVscGVyLmVuaGFuY2VWaWV3SlNPTk1vZGVsKHZpZXdKU09OTW9kZWwgYXMgSlNPTk1vZGVsICYgeyBfZ2V0T2JqZWN0OiBGdW5jdGlvbiB9KTtcblx0XHRcdFx0XHRcdG9Db21wb25lbnQuc2V0TW9kZWwodmlld0pTT05Nb2RlbCwgXCIkdmlld1wiKTtcblxuXHRcdFx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQuaGlkZVZpZXdEdXJpbmdDcmVhdGlvbiAmJiBvQ29tcG9uZW50LmlzQTxDb250cm9sPihcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5Db21wb25lbnRcIikpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5vVmlldy5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0b0NvbXBvbmVudC5zZXRBZ2dyZWdhdGlvbihcInJvb3RDb250cm9sXCIsIHRoaXMub1ZpZXcpO1xuXHRcdFx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQuZWFnZXJWaWV3Q3JlYXRpb24pIHtcblx0XHRcdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBuYXZOYW1lIGluIG1OYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCByb3V0aW5nVGFyZ2V0cyA9IG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFJvdXRpbmdTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ll9nZXRSb3V0ZUluZm9ybWF0aW9uKG1OYXZpZ2F0aW9uW25hdk5hbWVdLmRldGFpbC5yb3V0ZSk/LnRhcmdldHNXaXRoSW5mbztcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0aW5nVGFyZ2V0cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IHJvdXRpbmdUYXJnZXQgb2Ygcm91dGluZ1RhcmdldHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCByb3V0aW5nVGFyZ2V0TmFtZSA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2Ygcm91dGluZ1RhcmdldCA9PT0gXCJzdHJpbmdcIiA/IHJvdXRpbmdUYXJnZXQgOiByb3V0aW5nVGFyZ2V0Lm5hbWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgcm91dGVyVGFyZ2V0ID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKS5nZXRUYXJnZXQocm91dGluZ1RhcmdldE5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJUYXJnZXQgJiYgIUFycmF5LmlzQXJyYXkocm91dGVyVGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KHJvdXRlclRhcmdldCBhcyB1bmtub3duIGFzIHsgbG9hZDogRnVuY3Rpb24gfSkubG9hZChyb3V0aW5nVGFyZ2V0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sIDIwMDApOyAvLyBEZWxheSBhIGJpdCB0byBub3QgYmxvY2sgdGhlIGluaXRpYWwgcmVuZGVyaW5nXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiBzQ2FjaGVLZXk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goYXN5bmMgKHJlYXNvbjogRXJyb3IpID0+IHtcblx0XHRcdFx0XHRcdG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2xsZXIoKT8uZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0b0NvbXBvbmVudC5zZXRSb290Q29udHJvbGxlcigpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuX2NyZWF0ZUVycm9yUGFnZShcblx0XHRcdFx0XHRcdFx0cmVhc29uLFxuXHRcdFx0XHRcdFx0XHRvVmlld1NldHRpbmdzLFxuXHRcdFx0XHRcdFx0XHRtU2VydmljZVNldHRpbmdzLmVycm9yVmlld05hbWUgfHwgXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy52aWV3LlRlbXBsYXRpbmdFcnJvclBhZ2VcIixcblx0XHRcdFx0XHRcdFx0b0NvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0c0NhY2hlS2V5XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKChlKSA9PiBMb2cuZXJyb3IoZS5tZXNzYWdlLCBlKSk7XG5cdFx0XHR9KTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKChlcnJvciBhcyBFcnJvcikubWVzc2FnZSwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgdmlldyA6ICR7ZXJyb3J9YCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfZW5oYW5jZU5hdmlnYXRpb25Db25maWcoXG5cdFx0bU5hdmlnYXRpb246IFJlY29yZDxzdHJpbmcsIE5hdmlnYXRpb25Db25maWd1cmF0aW9uPixcblx0XHRtT3V0Ym91bmRzOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdE91dGJvdW5kRW50cnk+LFxuXHRcdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRzdGFibGVJZDogc3RyaW5nXG5cdCk6IHZvaWQge1xuXHRcdE9iamVjdC5rZXlzKG1OYXZpZ2F0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uIChuYXZpZ2F0aW9uT2JqZWN0S2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25PYmplY3QgPSBtTmF2aWdhdGlvbltuYXZpZ2F0aW9uT2JqZWN0S2V5XTtcblx0XHRcdGxldCBvdXRib3VuZENvbmZpZztcblx0XHRcdGlmIChuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbCAmJiBuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZCAmJiBtT3V0Ym91bmRzW25hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kXSkge1xuXHRcdFx0XHRvdXRib3VuZENvbmZpZyA9IG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5kZXRhaWwub3V0Ym91bmRdO1xuXHRcdFx0XHRuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZERldGFpbCA9IHtcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogb3V0Ym91bmRDb25maWcuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0YWN0aW9uOiBvdXRib3VuZENvbmZpZy5hY3Rpb24sXG5cdFx0XHRcdFx0cGFyYW1ldGVyczogb3V0Ym91bmRDb25maWcucGFyYW1ldGVyc1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLmF2YWlsYWJpbGl0eSkge1xuXHRcdFx0XHRyZWdpc3RlclZpcnR1YWxQcm9wZXJ0eShcblx0XHRcdFx0XHRjb252ZXJ0ZWRUeXBlcyxcblx0XHRcdFx0XHRcInJvdXRlTmF2aWdhYmxlLVwiICsgbmF2aWdhdGlvbk9iamVjdC5kZXRhaWwucm91dGUsXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc29sdmVCaW5kaW5nU3RyaW5nKG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLmF2YWlsYWJpbGl0eSEpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0c3RhYmxlSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmIChuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZSAmJiBuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZCAmJiBtT3V0Ym91bmRzW25hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kXSkge1xuXHRcdFx0XHRvdXRib3VuZENvbmZpZyA9IG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmRdO1xuXHRcdFx0XHRuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZERldGFpbCA9IHtcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogb3V0Ym91bmRDb25maWcuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0YWN0aW9uOiBvdXRib3VuZENvbmZpZy5hY3Rpb24sXG5cdFx0XHRcdFx0cGFyYW1ldGVyczogb3V0Ym91bmRDb25maWcucGFyYW1ldGVyc1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfZ2V0RnVsbFBhdGhUb0VudGl0eVNldChhU3BsaXRQYXRoOiBzdHJpbmdbXSwgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBzdHJpbmcge1xuXHRcdHJldHVybiBhU3BsaXRQYXRoLnJlZHVjZShmdW5jdGlvbiAoc1BhdGhTb0Zhcjogc3RyaW5nLCBzTmV4dFBhdGhQYXJ0OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdFx0aWYgKHNOZXh0UGF0aFBhcnQgPT09IFwiXCIpIHtcblx0XHRcdFx0cmV0dXJuIHNQYXRoU29GYXI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc1BhdGhTb0ZhciA9PT0gXCJcIikge1xuXHRcdFx0XHRzUGF0aFNvRmFyID0gYC8ke3NOZXh0UGF0aFBhcnR9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aFNvRmFyfS8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZy8ke3NOZXh0UGF0aFBhcnR9YCk7XG5cdFx0XHRcdGlmIChvVGFyZ2V0ICYmIE9iamVjdC5rZXlzKG9UYXJnZXQpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRzUGF0aFNvRmFyICs9IFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0c1BhdGhTb0ZhciArPSBgLyR7c05leHRQYXRoUGFydH1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNQYXRoU29GYXI7XG5cdFx0fSwgXCJcIik7XG5cdH1cblxuXHRnZXRWaWV3KCk6IFZpZXcge1xuXHRcdHJldHVybiB0aGlzLm9WaWV3O1xuXHR9XG5cblx0Z2V0SW50ZXJmYWNlKCk6IFRlbXBsYXRlZFZpZXdTZXJ2aWNlIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGV4aXQoKTogdm9pZCB7XG5cdFx0Ly8gRGVyZWdpc3RlciBnbG9iYWwgaW5zdGFuY2Vcblx0XHRpZiAodGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UpIHtcblx0XHRcdHRoaXMub1Jlc291cmNlTW9kZWxTZXJ2aWNlLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UpIHtcblx0XHRcdHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UuZGVzdHJveSgpO1xuXHRcdH1cblx0XHR0aGlzLm9GYWN0b3J5LnJlbW92ZUdsb2JhbEluc3RhbmNlKCk7XG5cdH1cbn1cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzPiB7XG5cdF9vSW5zdGFuY2VSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVkVmlld1NlcnZpY2U+ID0ge307XG5cblx0c3RhdGljIGlDcmVhdGluZ1ZpZXdzOiAwO1xuXG5cdGFzeW5jIGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4pOiBQcm9taXNlPFRlbXBsYXRlZFZpZXdTZXJ2aWNlPiB7XG5cdFx0VGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LmlDcmVhdGluZ1ZpZXdzKys7XG5cdFx0Y29uc3Qgb1RlbXBsYXRlZFZpZXdTZXJ2aWNlID0gbmV3IFRlbXBsYXRlZFZpZXdTZXJ2aWNlKE9iamVjdC5hc3NpZ24oeyBmYWN0b3J5OiB0aGlzIH0sIG9TZXJ2aWNlQ29udGV4dCkpO1xuXHRcdHJldHVybiBvVGVtcGxhdGVkVmlld1NlcnZpY2UuaW5pdFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3MtLTtcblx0XHRcdHJldHVybiBvVGVtcGxhdGVkVmlld1NlcnZpY2U7XG5cdFx0fSk7XG5cdH1cblxuXHRyZW1vdmVHbG9iYWxJbnN0YW5jZSgpOiB2b2lkIHtcblx0XHR0aGlzLl9vSW5zdGFuY2VSZWdpc3RyeSA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBjb21wb25lbnQgZGF0YSBzcGVjaWZpZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlICdTaGFyZScgYnV0dG9uIGFuZCByZXR1cm5zIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gdGhlIHZpc2liaWxpdHkuXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgU3BlY2lmaWVzIHRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWUgYXMgdHJ1ZSBvciBmYWxzZSBiYXNlZCB3aGV0aGVyIHRoZSAnU2hhcmUnIGJ1dHRvbiBzaG91bGQgYmUgdmlzaWJsZSBvciBub3Rcblx0ICovXG5cdHN0YXRpYyBnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHlGb3JNeUluYm94KGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgY29tcG9uZW50RGF0YTogQ29tcG9uZW50RGF0YSA9IGFwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCk7XG5cdFx0aWYgKGNvbXBvbmVudERhdGEgIT09IHVuZGVmaW5lZCAmJiBjb21wb25lbnREYXRhLmZlRW52aXJvbm1lbnQpIHtcblx0XHRcdHJldHVybiBjb21wb25lbnREYXRhLmZlRW52aXJvbm1lbnQuZ2V0U2hhcmVDb250cm9sVmlzaWJpbGl0eSgpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0c3RhdGljIGdldE51bWJlck9mVmlld3NJbkNyZWF0aW9uU3RhdGUoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LmlDcmVhdGluZ1ZpZXdzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgcGFnZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgZm9yIGEgc3BlY2lmaWMgcGFnZSBpZGVudGlmaWVkIGJ5IGl0cyBJRC5cblx0ICogQHBhcmFtIG1hbmlmZXN0IFRoZSBtYW5pZmVzdCBjb250ZW50IG9iamVjdCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gZGV0YWlscy5cblx0ICogQHBhcmFtIHZpZXdEYXRhIFRoZSB2aWV3IGRhdGEgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmlldy5cblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwbGljYXRpb24gY29tcG9uZW50IGluc3RhbmNlLlxuXHQgKiBAcGFyYW0gcGFnZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcGFnZSBmb3Igd2hpY2ggY29uZmlndXJhdGlvbiBjaGFuZ2VzIGFyZSB0byBiZSBhcHBsaWVkLlxuXHQgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCB2aWV3IGRhdGEgb2JqZWN0IHJlZmxlY3RpbmcgdGhlIGFwcGxpZWQgY2hhbmdlcy5cblx0ICovXG5cdHN0YXRpYyBzZXRQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMoXG5cdFx0bWFuaWZlc3Q6IE1hbmlmZXN0Q29udGVudCxcblx0XHR2aWV3RGF0YTogVmlld0RhdGEsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cGFnZUlkOiBzdHJpbmdcblx0KTogVmlld0RhdGEge1xuXHRcdGNvbnN0IHRhcmdldHMgPSBtYW5pZmVzdD8uW1wic2FwLnVpNVwiXT8ucm91dGluZz8udGFyZ2V0cyA/PyB7fTtcblx0XHRsZXQgcmVhbFRhcmdldCA9IFwiXCI7XG5cdFx0Zm9yIChjb25zdCB0YXJnZXRUb0ZpbmQgaW4gdGFyZ2V0cykge1xuXHRcdFx0aWYgKHRhcmdldHNbdGFyZ2V0VG9GaW5kXS5pZCA9PT0gcGFnZUlkKSB7XG5cdFx0XHRcdHJlYWxUYXJnZXQgPSB0YXJnZXRUb0ZpbmQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAocmVhbFRhcmdldCA9PT0gXCJcIikge1xuXHRcdFx0cmVhbFRhcmdldCA9IHBhZ2VJZDtcblx0XHR9XG5cdFx0Y29uc3QgYWN0dWFsU2V0dGluZ3MgPSBtYW5pZmVzdD8uW1wic2FwLnVpNVwiXT8ucm91dGluZz8udGFyZ2V0cz8uW3JlYWxUYXJnZXRdPy5vcHRpb25zPy5zZXR0aW5ncyB8fCB7fTtcblx0XHRyZXR1cm4gYXBwbHlQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMoYWN0dWFsU2V0dGluZ3MsIHZpZXdEYXRhLCBhcHBDb21wb25lbnQsIHBhZ2VJZCk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7TUF1R2FBLG9CQUFvQiwwQkFBQUMsUUFBQTtJQUFBLFNBQUFELHFCQUFBO01BQUEsT0FBQUMsUUFBQSxDQUFBQyxLQUFBLE9BQUFDLFNBQUE7SUFBQTtJQUFBQyxRQUFBLENBQUFKLG9CQUFBLEdBQUFBLG9CQUFBO0lBQUFLLGNBQUEsQ0FBQUwsb0JBQUEsRUFBQUMsUUFBQTtJQUFBLElBQUFLLE1BQUEsR0FBQU4sb0JBQUEsQ0FBQU8sU0FBQTtJQUFBRCxNQUFBLENBcUJoQ0UsSUFBSSxHQUFKLFNBQUFBLElBQUlBLENBQUEsRUFBUztNQUNaLE1BQU1DLG9CQUFvQixHQUFHLEVBQUU7TUFDL0IsTUFBTUMsUUFBUSxHQUFHLElBQUksQ0FBQ0MsVUFBVSxDQUFDLENBQUM7TUFDbEMsTUFBTUMsVUFBVSxHQUFHRixRQUFRLENBQUNHLFdBQVc7TUFDdkMsTUFBTUMsYUFBYSxHQUFHQyxXQUFXLENBQUNDLGVBQWUsQ0FBQ0osVUFBVSxDQUFDO01BQzdELE1BQU1LLG9CQUFvQixHQUFHSCxhQUFhLENBQUNJLHVCQUF1QixDQUFDLENBQUM7TUFDcEUs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