@sapui5/sap.fe.core 1.136.10 → 1.136.11

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 (35) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/PageController.controller.js +10 -0
  4. package/src/sap/fe/core/PageController.controller.ts +3 -0
  5. package/src/sap/fe/core/controllerextensions/InternalRouting.js +23 -13
  6. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +34 -13
  7. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -6
  8. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +8 -5
  9. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +2 -1
  10. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +1 -0
  11. package/src/sap/fe/core/converters/controls/Common/Action.js +15 -1
  12. package/src/sap/fe/core/converters/controls/Common/Action.ts +21 -1
  13. package/src/sap/fe/core/converters/controls/Common/Table.js +54 -46
  14. package/src/sap/fe/core/converters/controls/Common/Table.ts +65 -45
  15. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +26 -6
  16. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +32 -10
  17. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
  18. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
  19. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
  20. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
  21. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  22. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  23. package/src/sap/fe/core/fpm/manifest.json +1 -1
  24. package/src/sap/fe/core/helpers/AppStartupHelper.js +75 -18
  25. package/src/sap/fe/core/helpers/AppStartupHelper.ts +79 -25
  26. package/src/sap/fe/core/helpers/MetaModelFunction.js +10 -3
  27. package/src/sap/fe/core/helpers/MetaModelFunction.ts +9 -3
  28. package/src/sap/fe/core/library.js +1 -1
  29. package/src/sap/fe/core/messagebundle_es.properties +1 -1
  30. package/src/sap/fe/core/messagebundle_fr.properties +1 -1
  31. package/src/sap/fe/core/messagebundle_ko.properties +1 -1
  32. package/src/sap/fe/core/messagebundle_no.properties +2 -2
  33. package/src/sap/fe/core/services/RoutingServiceFactory.js +4 -2
  34. package/src/sap/fe/core/services/RoutingServiceFactory.ts +5 -2
  35. package/ui5.yaml +1 -0
@@ -24,6 +24,7 @@ import Library from "sap/ui/core/Lib";
24
24
  import type { RoutingTarget } from "sap/ui/core/Manifest";
25
25
  import ControllerExtension from "sap/ui/core/mvc/ControllerExtension";
26
26
  import OverrideExecution from "sap/ui/core/mvc/OverrideExecution";
27
+ import type View from "sap/ui/core/mvc/View";
27
28
  import type Router from "sap/ui/core/routing/Router";
28
29
  import type Binding from "sap/ui/model/Binding";
29
30
  import type Context from "sap/ui/model/odata/v4/Context";
@@ -294,7 +295,25 @@ class InternalRouting extends ControllerExtension {
294
295
  }
295
296
 
296
297
  this.removeTransitionMessagesForPreviousContext();
297
- return this._oRoutingService.navigateToContext(context, parameters, this._oView.getViewData(), this._oTargetInformation);
298
+ let skipHashGuardCheck;
299
+ const hiddenDraftEnabled = (this._oAppComponent?.getEnvironmentCapabilities()?.getCapabilities()?.HiddenDraft as HiddenDraft)
300
+ ?.enabled;
301
+ const isDocumentModified = this._oAppComponent?.getModel("ui")?.getProperty(UiModelConstants.DocumentModified) ?? true;
302
+ if (
303
+ this._oAppComponent.getRootViewController().isFclEnabled() &&
304
+ this.getFCLLevel() === 0 &&
305
+ hiddenDraftEnabled &&
306
+ !isDocumentModified
307
+ ) {
308
+ skipHashGuardCheck = true;
309
+ }
310
+ return this._oRoutingService.navigateToContext(
311
+ context,
312
+ parameters,
313
+ this._oView.getViewData(),
314
+ this._oTargetInformation,
315
+ skipHashGuardCheck
316
+ );
298
317
  }
299
318
 
300
319
  /**
@@ -1048,22 +1067,24 @@ class InternalRouting extends ControllerExtension {
1048
1067
 
1049
1068
  /**
1050
1069
  * Sets the binding context of the page or the component.
1051
- * @param oContext The binding context
1070
+ * @param context The binding context
1052
1071
  */
1053
- _setBindingContext(oContext: Context | null): void {
1054
- let oPreviousContext, oTargetControl;
1072
+ _setBindingContext(context: Context | null): void {
1073
+ let previousContext: Context, targetControl: View | EnhanceWithUI5<TemplateComponent>;
1055
1074
  if (this._oPageComponent) {
1056
- oPreviousContext = this._oPageComponent.getBindingContext() as Context;
1057
- oTargetControl = this._oPageComponent;
1075
+ previousContext = this._oPageComponent.getBindingContext() as Context;
1076
+ targetControl = this._oPageComponent;
1058
1077
  } else {
1059
- oPreviousContext = this._oView.getBindingContext();
1060
- oTargetControl = this._oView;
1078
+ previousContext = this._oView.getBindingContext();
1079
+ targetControl = this._oView;
1061
1080
  }
1062
-
1063
- oTargetControl.setBindingContext(oContext);
1064
-
1065
- if (oPreviousContext?.isKeepAlive() && oPreviousContext !== oContext) {
1066
- this._setKeepAlive(oPreviousContext, false);
1081
+ targetControl.setBindingContext(context);
1082
+ if (previousContext?.isKeepAlive() && previousContext !== context) {
1083
+ const rootViewController = this._oAppComponent.getRootViewController();
1084
+ /* Before deleting the bindingContext, we ensure it's not also used in another page.*/
1085
+ if (!rootViewController.getInstancedViews().some((pageView: View) => pageView.getBindingContext?.() === previousContext)) {
1086
+ this._setKeepAlive(previousContext, false);
1087
+ }
1067
1088
  }
1068
1089
  }
1069
1090
 
@@ -192,9 +192,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
192
192
  * @param bDisablePreservationCache If set to true, cache preservation mechanism is disabled for the current navigation
193
193
  * @param bForceFocus If set to true, the logic to set the focus once the navigation is finalized will be triggered (onPageReady)
194
194
  * @param bPreserveShellBackNavigationHandler If not set to false, the back navigation is set to undefined
195
+ * @param skipHashGuardCheck
195
196
  * @returns Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
196
197
  */;
197
- _proto.navToHash = async function navToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, bPreserveShellBackNavigationHandler) {
198
+ _proto.navToHash = async function navToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, bPreserveShellBackNavigationHandler, skipHashGuardCheck) {
198
199
  sHash = sHash.startsWith("/") ? sHash.substring(1) : sHash;
199
200
  if (bPreserveShellBackNavigationHandler !== false) {
200
201
  await this._oShellServices.setBackNavigation();
@@ -203,21 +204,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
203
204
  if (this._oRouteMatchSynchronization) {
204
205
  return this._oRouteMatchSynchronization.waitFor().then(async () => {
205
206
  this._oRouteMatchSynchronization = undefined;
206
- return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
207
+ return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, skipHashGuardCheck);
207
208
  });
208
209
  } else {
209
210
  if (this._bActivateRouteMatchSynchro) {
210
211
  this.waitForRouteMatchBeforeNavigation();
211
212
  }
212
- return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
213
+ return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, skipHashGuardCheck);
213
214
  }
214
215
  };
215
- _proto._internalNavToHash = async function _internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus) {
216
+ _proto._internalNavToHash = async function _internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, skipHashGuardCheck) {
216
217
  // Add the app state in the hash if needed
217
218
  if (this.fclEnabled && this.sIAppStateKey && !this.findAppStateInHash(sHash)) {
218
219
  sHash = this.setAppStateInHash(sHash, this.sIAppStateKey);
219
220
  }
220
- if (!this.checkHashWithGuard(sHash)) {
221
+ if (!this.checkHashWithGuard(sHash) && !(skipHashGuardCheck ?? false)) {
221
222
  if (!this.oResourceBundle) {
222
223
  this.oResourceBundle = Library.getResourceBundleFor("sap.fe.core");
223
224
  }
@@ -924,4 +925,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/
924
925
  }(BaseObject)) || _class);
925
926
  return RouterProxy;
926
927
  }, false);
927
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnVtU3RhdGUiLCJFUVVBTCIsIkNPTVBBVElCTEUiLCJBTkNFU1RPUiIsIkRJRkZFUkVOVCIsImVudW1VUkxQYXJhbXMiLCJMQVlPVVRQQVJBTSIsIklBUFBTVEFURVBBUkFNIiwiY3JlYXRlR3VhcmRGcm9tSGFzaCIsInNHdWFyZEhhc2giLCJoYXNoVHJha2VyIiwiX2d1YXJkSGFzaCIsInJlcGxhY2UiLCJoYXNoVHJhY2tlciIsInVuZGVmaW5lZCIsImNoZWNrIiwic0hhc2giLCJpbmRleE9mIiwicmVtb3ZlQXBwU3RhdGVJbkhhc2giLCJSZWdFeHAiLCJSb3V0ZXJQcm94eSIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9jbGFzcyIsIl9CYXNlT2JqZWN0IiwiX3RoaXMiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNhbGwiLCJiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmciLCJiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5IiwiYklzR3VhcmRDcm9zc0FsbG93ZWQiLCJzSUFwcFN0YXRlS2V5IiwiX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvIiwiX2JBcHBseVJlc3RvcmUiLCJfcGF0aE1hcHBpbmdzIiwicmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsImluaXQiLCJvQXBwQ29tcG9uZW50IiwiaXNmY2xFbmFibGVkIiwiZ2V0U2VydmljZSIsInRoZW4iLCJhc3luY0luaXQiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiX2ZuSGFzaEd1YXJkIiwiaGFzaEd1YXJkIiwiYmluZCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJfYkRpc2FibGVPbkhhc2hDaGFuZ2UiLCJfYklnbm9yZVJlc3RvcmUiLCJfYkZvcmNlRm9jdXMiLCJfb1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW5pdFJhdyIsImdldFJvdXRlciIsInJvdXRpbmdIaW50cyIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0Um91dGluZ0hpbnRzIiwid2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uIiwiaGlzdG9yeSIsInJlcGxhY2VTdGF0ZSIsIk9iamVjdCIsImFzc2lnbiIsImZlTGV2ZWwiLCJzdGF0ZSIsImxvY2F0aW9uIiwiZmNsRW5hYmxlZCIsIl9mbkJsb2NraW5nTmF2RmlsdGVyIiwiX2Jsb2NraW5nTmF2aWdhdGlvbkZpbHRlciIsInJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlciIsImRlc3Ryb3kiLCJ1bnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzZXRBcHBTdGF0ZUluSGFzaCIsInNBcHBTdGF0ZUtleSIsInNOZXdIYXNoIiwiaW5jbHVkZXMiLCJmaW5kQXBwU3RhdGVJbkhhc2giLCJhQXBwU3RhdGUiLCJtYXRjaCIsImdldERlY29kZWRXaW5kb3dIYXNoIiwiZGVjb2RlVVJJIiwiaGFzaCIsIm9Sb3V0ZXIiLCJfb1JvdXRlciIsIl9vTWFuYWdlZEhpc3RvcnkiLCJfb05hdmlnYXRpb25HdWFyZCIsInNDdXJyZW50QXBwSGFzaCIsImdldEhhc2giLCJwdXNoIiwiX2V4dHJhY3RTdGF0ZUZyb21IYXNoIiwiYXBwTmFtZSIsImdldEFwcE5hbWVGcm9tSGFzaCIsImdldEZ1bGxIYXNoIiwic3BsaXRIYXNoIiwiYXBwU3BlY2lmaWNSb3V0ZSIsImdldEhhc2hDaGFuZ2VyIiwic2hlbGxQYXJ0IiwiaXNGb2N1c0ZvcmNlZCIsInNldEZvY3VzRm9yY2VkIiwiYkZvcmNlZCIsInJlbW92ZUlBcHBTdGF0ZUtleSIsInJlbW92ZVJlc3RvcmVIaXN0b3J5RmxhZ0Zyb21IYXNoIiwibmF2VG9IYXNoIiwiYlByZXNlcnZlSGlzdG9yeSIsImJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUiLCJiRm9yY2VGb2N1cyIsImJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyIiwic3RhcnRzV2l0aCIsInN1YnN0cmluZyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwid2FpdEZvciIsIl9pbnRlcm5hbE5hdlRvSGFzaCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsIm9SZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImNvbmZpcm0iLCJnZXRUZXh0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJvTmV3U3RhdGUiLCJhQ3VycmVudEhhc2hLZXlzIiwiZXh0cmFjdEVudGl0eVNldHNGcm9tSGFzaCIsImtleXMiLCJldmVyeSIsImtleSIsImluZGV4Iiwib0hpc3RvcnlBY3Rpb24iLCJfcHVzaE5ld1N0YXRlIiwic3RvcmVGb2N1c0luZm9Gb3JDdXJyZW50SGFzaCIsIl9yZWJ1aWxkQnJvd3Nlckhpc3RvcnkiLCJyZXN0b3JlSGlzdG9yeSIsInNUYXJnZXRIYXNoIiwiY2hlY2tSZXN0b3JlSGlzdG9yeVdhc1RyaWdnZXJlZCIsInJlc2V0UmVzdG9yZUhpc3RvcnlGbGFnIiwibmF2QmFjayIsInNDdXJyZW50SGFzaCIsInNQcmV2aW91c0hhc2giLCJpIiwiYmFjayIsIm5hdlRvIiwic1JvdXRlTmFtZSIsIm9QYXJhbWV0ZXJzIiwiZ2V0VVJMIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImJJc1N0aWNreU1vZGUiLCJleGl0RnJvbUFwcCIsImJhY2tUb1ByZXZpb3VzQXBwIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5Iiwib0xvY2FsR3VhcmQiLCJpc05hdmlnYXRpb25GaW5hbGl6ZWQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsInJlc29sdmVSb3V0ZU1hdGNoIiwiU3luY2hyb25pemF0aW9uIiwic0hhc2hOb1BhcmFtcyIsInNwbGl0IiwiYVRva2VucyIsIm5hbWVzIiwiZm9yRWFjaCIsInNUb2tlbiIsIm9TdGF0ZSIsInNjcmVlbk1vZGUiLCJhTGF5b3V0Iiwic0xheW91dCIsImJSZWJ1aWxkT25seSIsImJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiIsImxhc3RJbmRleCIsImlQb3BDb3VudCIsInBvcCIsInByZXNlcnZlZCIsIm9MYXN0UmVtb3ZlZEl0ZW0iLCJvVG9wU3RhdGUiLCJfY29tcGFyZUNhY2hlU3RhdGVzIiwic1ByZXZpb3VzSUFwcFN0YXRlS2V5Iiwib0NvbXBhcmlzb25TdGF0ZVJlc3VsdCIsImJIYXNTYW1lSGFzaCIsImZvY3VzQ29udHJvbElkIiwic2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQiLCJmb2N1c0luZm8iLCJzZWNvbmRhcnlGb2N1c0luZm8iLCJ0eXBlIiwic3RlcHMiLCJfZGlzYWJsZUV2ZW50T25IYXNoQ2hhbmdlIiwic3RvcCIsIl9lbmFibGVFdmVudE9uSGFzaENoYW5nZSIsImJJZ25vcmVDdXJyZW50SGFzaCIsImluaXRpYWxpemUiLCJ0aGF0Iiwib1RhcmdldFN0YXRlIiwibmV3TGV2ZWwiLCJyZXBsYWNlQXN5bmMiLCJyZXBsYWNlSGFzaCIsInNldFRpbWVvdXQiLCJiYWNrUmVwbGFjZUFzeW5jIiwiYmFja0FzeW5jIiwic2V0SGFzaCIsImdvIiwiZ2V0TGFzdEhpc3RvcnlFbnRyeSIsInNldFBhdGhNYXBwaW5nIiwibWFwcGluZ3MiLCJmaWx0ZXIiLCJtYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjdXJyZW50QXBwTmFtZSIsImZpbmQiLCJtIiwiZW5jb2RlVVJJIiwiYUhhc2hTcGxpdCIsInNBcHBIYXNoIiwib1N0YXRlMSIsIm9TdGF0ZTIiLCJlcXVhbCIsInBhcmVudE9mIiwic3BsaXRBcHBTcGVjaWZpY1JvdXRlIiwicm91dGVTcGxpdCIsInNoaWZ0IiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJzZWdtZW50cyIsInByZXZpb3VzSGFzaCIsImNoZWNrSWZCYWNrRXhpdHNBcHAiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0Iiwib0N1cnJlbnRTdGF0ZSIsIm9QcmV2aW91c1N0YXRlIiwicmVzdG9yZUZvY3VzRm9yQ3VycmVudEhhc2giLCJjdXJyZW50SGFzaCIsInN0YXRlRm9ySGFzaCIsImZvY3VzQXBwbGllZCIsImZvY3VzQ29udHJvbCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldEZvY3VzRG9tUmVmIiwiZ2V0UGFyZW50IiwiaXNBIiwiZ2V0QnVzeSIsImZvY3VzIiwiZ2V0QWN0aXZlRWxlbWVudCIsImdldElkIiwicGFyZW50VGFibGUiLCJwcmV2ZW50U2Nyb2xsIiwiZ2V0Rm9jdXNJbmZvIiwiZmluZExheW91dEZvckhhc2giLCJoYXNoTm9QYXJhbSIsInRhcmdldFN0YXRlIiwiQmFzZU9iamVjdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiUm91dGVyUHJveHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IFN5bmNocm9uaXphdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TeW5jaHJvbml6YXRpb25cIjtcbmltcG9ydCB0eXBlIHsgSVNoZWxsU2VydmljZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2hlbGxTZXJ2aWNlc0ZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIE1UYWJsZSBmcm9tIFwic2FwL20vVGFibGVcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgVUlUYWJsZSBmcm9tIFwic2FwL3VpL3RhYmxlL1RhYmxlXCI7XG5cbmNvbnN0IGVudW1TdGF0ZSA9IHtcblx0RVFVQUw6IDAsXG5cdENPTVBBVElCTEU6IDEsXG5cdEFOQ0VTVE9SOiAyLFxuXHRESUZGRVJFTlQ6IDNcbn07XG5jb25zdCBlbnVtVVJMUGFyYW1zID0ge1xuXHRMQVlPVVRQQVJBTTogXCJsYXlvdXRcIixcblx0SUFQUFNUQVRFUEFSQU06IFwic2FwLWlhcHAtc3RhdGVcIlxufTtcblxudHlwZSBSb3V0ZXJTdGF0ZSA9IHtcblx0a2V5czogc3RyaW5nW107XG5cdGhhc2g6IHN0cmluZztcblx0cHJlc2VydmVkPzogYm9vbGVhbjtcblx0c0xheW91dD86IHN0cmluZztcblx0c2NyZWVuTW9kZTogbnVtYmVyO1xuXHRmb2N1c0NvbnRyb2xJZD86IHN0cmluZztcblx0c2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQ/OiBzdHJpbmc7XG5cdGZvY3VzSW5mbz86IHtcblx0XHRwcmV2ZW50U2Nyb2xsPzogYm9vbGVhbjtcblx0XHR0YXJnZXRJbmZvPzogdW5rbm93bjtcblx0fTtcblx0c2Vjb25kYXJ5Rm9jdXNJbmZvPzoge1xuXHRcdHByZXZlbnRTY3JvbGw/OiBib29sZWFuO1xuXHR9O1xufTtcblxudHlwZSBPdGhlckhpc3RvcnlBY3Rpb24gPSB7IHR5cGU6IFwiYXBwZW5kXCIgfCBcIm5vbmVcIiB8IFwicmVwbGFjZVwiIH07XG5leHBvcnQgdHlwZSBCYWNrSGlzdG9yeUFjdGlvbiA9IHsgdHlwZTogXCJiYWNrXCIgfCBcImJhY2stcmVwbGFjZVwiOyBzdGVwczogbnVtYmVyIH07XG50eXBlIEh5c3RvcnlBY3Rpb24gPSBCYWNrSGlzdG9yeUFjdGlvbiB8IE90aGVySGlzdG9yeUFjdGlvbjtcblxudHlwZSBOYXZpZ2F0aW9uR3VhcmQgPSB7IF9ndWFyZEhhc2g6IHN0cmluZzsgaGFzaFRyYWNrZXI6IHN0cmluZyB8IHVuZGVmaW5lZDsgY2hlY2s6IChoYXNoOiBzdHJpbmcpID0+IGJvb2xlYW4gfTtcbi8qKlxuICogQ3JlYXRlcyBhIEhhc2hHdWFyZCBvYmplY3QuXG4gKiBAcGFyYW0gc0d1YXJkSGFzaCBUaGUgaGFzaCB1c2VkIGZvciB0aGUgZ3VhcmQuXG4gKiBAcGFyYW0gW2hhc2hUcmFrZXJdIE9wdGlvbmFsIGhhc2ggdHJhY2tlciB1c2VkIGZvciBhZGRpdGlvbmFsIGd1YXJkIGNoZWNrcy5cbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGhhc2ggZ3VhcmQuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUd1YXJkRnJvbUhhc2goc0d1YXJkSGFzaDogc3RyaW5nLCBoYXNoVHJha2VyPzogc3RyaW5nKTogTmF2aWdhdGlvbkd1YXJkIHtcblx0cmV0dXJuIHtcblx0XHRfZ3VhcmRIYXNoOiBzR3VhcmRIYXNoLnJlcGxhY2UoL1xcP1teP10qJC8sIFwiXCIpLCAvLyBSZW1vdmUgcXVlcnkgcGFydFxuXHRcdGhhc2hUcmFja2VyOiBoYXNoVHJha2VyID8gaGFzaFRyYWtlci5yZXBsYWNlKC9cXD9bXj9dKiQvLCBcIlwiKSA6IHVuZGVmaW5lZCxcblx0XHRjaGVjazogZnVuY3Rpb24gKHNIYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiBzSGFzaC5pbmRleE9mKHRoaXMuX2d1YXJkSGFzaCkgPT09IDAgfHwgKHRoaXMuaGFzaFRyYWNrZXIgPyBzSGFzaC5pbmRleE9mKHRoaXMuaGFzaFRyYWNrZXIpID09PSAwIDogZmFsc2UpO1xuXHRcdH1cblx0fTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGhhc2ggd2l0aG91dCBpdHMgaUFwcFN0YXRlIHBhcnQuXG4gKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2hcbiAqIEByZXR1cm5zIFRoZSBoYXNoIHdpdGhvdXQgdGhlIGlBcHBTdGF0ZVxuICovXG5mdW5jdGlvbiByZW1vdmVBcHBTdGF0ZUluSGFzaChzSGFzaDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHNIYXNoLnJlcGxhY2UobmV3IFJlZ0V4cChgWyY/XSoke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PVteJl0qYCksIFwiXCIpO1xufVxuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eVwiKVxuY2xhc3MgUm91dGVyUHJveHkgZXh0ZW5kcyBCYXNlT2JqZWN0IHtcblx0YklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cblx0YklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSA9IGZhbHNlO1xuXG5cdGJJc0d1YXJkQ3Jvc3NBbGxvd2VkID0gZmFsc2U7XG5cblx0c0lBcHBTdGF0ZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0X29TaGVsbFNlcnZpY2VzITogSVNoZWxsU2VydmljZXM7XG5cblx0ZmNsRW5hYmxlZCE6IGJvb2xlYW47XG5cblx0X2ZuQmxvY2tpbmdOYXZGaWx0ZXIhOiBGdW5jdGlvbjtcblxuXHRfZm5IYXNoR3VhcmQhOiAodGhpczogV2luZG93LCBwb3BTdGF0ZUV2ZW50OiBQb3BTdGF0ZUV2ZW50KSA9PiB1bmtub3duO1xuXG5cdF9iRGlzYWJsZU9uSGFzaENoYW5nZSE6IGJvb2xlYW47XG5cblx0X2JJZ25vcmVSZXN0b3JlITogYm9vbGVhbjtcblxuXHRfYkZvcmNlRm9jdXMhOiBib29sZWFuO1xuXG5cdF9vUm91dGVyITogUm91dGVyO1xuXG5cdF9vTWFuYWdlZEhpc3RvcnkhOiBSb3V0ZXJTdGF0ZVtdO1xuXG5cdF9vTmF2aWdhdGlvbkd1YXJkITogTmF2aWdhdGlvbkd1YXJkIHwgbnVsbDtcblxuXHRvUmVzb3VyY2VCdW5kbGU/OiBSZXNvdXJjZUJ1bmRsZTtcblxuXHRfb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24/OiBTeW5jaHJvbml6YXRpb247XG5cblx0X2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvID0gZmFsc2U7XG5cblx0X2JBcHBseVJlc3RvcmUgPSBmYWxzZTtcblxuXHRfcGF0aE1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdHJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gZmFsc2U7XG5cblx0cm91dGluZ0hpbnRzPzogUmVjb3JkPHN0cmluZywgeyBwYXJlbnRPZjogc3RyaW5nW10gfT47XG5cblx0YXBwTmFtZSE6IHN0cmluZztcblxuXHRpbml0KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gU2F2ZSB0aGUgbmFtZSBvZiB0aGUgYXBwIChpbmNsdWRpbmcgc3RhcnR1cCBwYXJhbWV0ZXJzKSBmb3IgcmVidWlsZGluZyBmdWxsIGhhc2hlcyBsYXRlclxuXHRcdG9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwic2hlbGxTZXJ2aWNlc1wiKVxuXHRcdFx0LnRoZW4oKCkgPT4gdGhpcy5hc3luY0luaXQob0FwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkKSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgc2hlbGwgc2VydmljZXNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0XHR0aGlzLl9mbkhhc2hHdWFyZCA9IHRoaXMuaGFzaEd1YXJkLmJpbmQodGhpcyk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCB0aGlzLl9mbkhhc2hHdWFyZCk7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9iSWdub3JlUmVzdG9yZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JGb3JjZUZvY3VzID0gdHJ1ZTsgLy8gVHJpZ2dlciB0aGUgZm9jdXMgbWVjaGFuaXNtIGZvciB0aGUgZmlyc3QgdmlldyBkaXNwbGF5ZWQgYnkgdGhlIGFwcFxuXHR9XG5cblx0YXN5bmNJbml0KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5fb1NoZWxsU2VydmljZXMgPSBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKTtcblx0XHR0aGlzLmluaXRSYXcob0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKSk7XG5cdFx0dGhpcy5yb3V0aW5nSGludHMgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0Um91dGluZ0hpbnRzKCk7XG5cdFx0Ly8gV2Ugd2FudCB0byB3YWl0IHVudGlsIHRoZSBpbml0aWFsIHJvdXRlTWF0Y2hlZCBpcyBkb25lIGJlZm9yZSBkb2luZyBhbnkgbmF2aWdhdGlvblxuXHRcdHRoaXMud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cblx0XHQvLyBTZXQgZmVMZXZlbD0wIGZvciB0aGUgZmlyc3QgQXBwbGljYXRpb24gcGFnZSBpbiB0aGUgaGlzdG9yeVxuXHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuXHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZlTGV2ZWw6IDBcblx0XHRcdFx0fSxcblx0XHRcdFx0aGlzdG9yeS5zdGF0ZVxuXHRcdFx0KSxcblx0XHRcdFwiXCIsXG5cdFx0XHR3aW5kb3cubG9jYXRpb24gYXMgdW5rbm93biBhcyBzdHJpbmdcblx0XHQpO1xuXHRcdHRoaXMuZmNsRW5hYmxlZCA9IGlzZmNsRW5hYmxlZDtcblxuXHRcdHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIgPSB0aGlzLl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIuYmluZCh0aGlzKTtcblx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcy5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdH1cblxuXHRkZXN0cm95KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9vU2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMudW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdFx0fVxuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYW4gaUFwcFN0YXRlIGluc2lkZSBhIGhhc2ggKG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSkuXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaFxuXHQgKiBAcGFyYW0gc0FwcFN0YXRlS2V5IFRoZSBpQXBwU3RhdGUgdG8gYWRkXG5cdCAqIEByZXR1cm5zIFRoZSBoYXNoIHdpdGggdGhlIGFwcCBzdGF0ZVxuXHQgKi9cblx0c2V0QXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZywgc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCBzTmV3SGFzaDogc3RyaW5nO1xuXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKGVudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU0pKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGFscmVhZHkgYW4gaUFwcFN0YXRlIHBhcmFtZXRlciBpbiB0aGUgaGFzaCwgcmVwbGFjZSBpdFxuXHRcdFx0c05ld0hhc2ggPSBzSGFzaC5yZXBsYWNlKFxuXHRcdFx0XHRuZXcgUmVnRXhwKGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PVteJl0qYCksXG5cdFx0XHRcdGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PSR7c0FwcFN0YXRlS2V5fWBcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEFkZCB0aGUgaUFwcFN0YXRlIHBhcmFtZXRlciBpbiB0aGUgaGFzaFxuXHRcdFx0aWYgKCFzSGFzaC5pbmNsdWRlcyhcIj9cIikpIHtcblx0XHRcdFx0c05ld0hhc2ggPSBgJHtzSGFzaH0/YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNOZXdIYXNoID0gYCR7c0hhc2h9JmA7XG5cdFx0XHR9XG5cdFx0XHRzTmV3SGFzaCArPSBgJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT0ke3NBcHBTdGF0ZUtleX1gO1xuXHRcdH1cblxuXHRcdHJldHVybiBzTmV3SGFzaDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBpQXBwU3RhdGUgcGFydCBmcm9tIGEgaGFzaCAob3IgbnVsbCBpZiBub3QgZm91bmQpLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2hcblx0ICogQHJldHVybnMgVGhlIGlBcHBTdGF0ZSBwYXJ0IG9mIHRoZSBoYXNoXG5cdCAqL1xuXHRmaW5kQXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRcdGNvbnN0IGFBcHBTdGF0ZSA9IHNIYXNoLm1hdGNoKG5ldyBSZWdFeHAoYFxcXFw/Lioke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PShbXiZdKilgKSk7XG5cdFx0cmV0dXJuIGFBcHBTdGF0ZSAmJiBhQXBwU3RhdGUubGVuZ3RoID4gMSA/IGFBcHBTdGF0ZVsxXSA6IG51bGw7XG5cdH1cblxuXHRwcml2YXRlIGdldERlY29kZWRXaW5kb3dIYXNoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGRlY29kZVVSSSh3aW5kb3cubG9jYXRpb24uaGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogUmF3IGluaXRpYWxpemF0aW9uIChmb3IgdW5pdCB0ZXN0cykuXG5cdCAqIEBwYXJhbSBvUm91dGVyIFRoZSByb3V0ZXIgdXNlZCBieSB0aGlzIHByb3h5XG5cdCAqL1xuXHRpbml0UmF3KG9Sb3V0ZXI6IFJvdXRlcik6IHZvaWQge1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSBvUm91dGVyO1xuXHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeSA9IFtdO1xuXHRcdHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQgPSBudWxsO1xuXG5cdFx0Y29uc3Qgc0N1cnJlbnRBcHBIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG5cdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2godGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0N1cnJlbnRBcHBIYXNoKSk7XG5cblx0XHR0aGlzLmFwcE5hbWUgPSB0aGlzLmdldEFwcE5hbWVGcm9tSGFzaCh0aGlzLmdldERlY29kZWRXaW5kb3dIYXNoKCkpO1xuXG5cdFx0Ly8gU2V0IHRoZSBpQXBwU3RhdGUgaWYgdGhlIGluaXRpYWwgaGFzaCBjb250YWlucyBvbmVcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSB0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChzQ3VycmVudEFwcEhhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiB0aGUgZnVsbCBhcHAtc3BlY2lmaWMgaGFzaCBwYXJ0IGZyb20gd2luZG93LmxvY2F0aW9uLmhhc2guXG5cdCAqXG5cdCAqIENvbXBhcmVkIHRvIHtAbGluayBnZXRIYXNofSB0aGlzIGZ1bmN0aW9uIGluY2x1ZGVzIHN1Yi1yb3V0ZXMgb2YgbmVzdGVkIGNvbXBvbmVudHMuXG5cdCAqIEByZXR1cm5zIFRoZSBhcHAtc3BlY2lmaWMgaGFzaCBwYXJ0IChpLmUuLCB3aXRob3V0IHRoZSBzaGVsbCBwYXJ0KSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vbmUuXG5cdCAqL1xuXHRnZXRGdWxsSGFzaCgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNwbGl0SGFzaCA9IHRoaXMuX29TaGVsbFNlcnZpY2VzLnNwbGl0SGFzaCh0aGlzLmdldERlY29kZWRXaW5kb3dIYXNoKCkpO1xuXG5cdFx0aWYgKFwiYXBwU3BlY2lmaWNSb3V0ZVwiIGluIHNwbGl0SGFzaCkge1xuXHRcdFx0cmV0dXJuIHNwbGl0SGFzaC5hcHBTcGVjaWZpY1JvdXRlPy5yZXBsYWNlKC9eJlxcLy8sIFwiXCIpID8/IFwiXCI7IC8vIHJlbW92ZSB0aGUgbGVhZGluZyBcIiYvXCJcblx0XHR9XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRnZXRIYXNoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkgPz8gXCJcIjtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRBcHBOYW1lRnJvbUhhc2goaGFzaDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLl9vU2hlbGxTZXJ2aWNlcz8uc3BsaXRIYXNoKGhhc2gpIGFzIHsgc2hlbGxQYXJ0OiBzdHJpbmc7IGFwcFNwZWNpZmljUm91dGU6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXHRcdHJldHVybiBzcGxpdEhhc2g/LnNoZWxsUGFydCA/PyBcIlwiO1xuXHR9XG5cblx0aXNGb2N1c0ZvcmNlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fYkZvcmNlRm9jdXM7XG5cdH1cblxuXHRzZXRGb2N1c0ZvcmNlZChiRm9yY2VkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSBiRm9yY2VkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgdmFyaWFibGUgc0lBcHBTdGF0ZUtleS5cblx0ICpcblx0ICovXG5cdHJlbW92ZUlBcHBTdGF0ZUtleSgpOiB2b2lkIHtcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSBudWxsO1xuXHR9XG5cblx0cHJpdmF0ZSByZW1vdmVSZXN0b3JlSGlzdG9yeUZsYWdGcm9tSGFzaChoYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBoYXNoLnJlcGxhY2UoXCJyZXN0b3JlSGlzdG9yeT10cnVlJlwiLCBcIlwiKS5yZXBsYWNlKC9bPyZdcmVzdG9yZUhpc3Rvcnk9dHJ1ZS8sIFwiXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGhhc2guXG5cdCAqIEBwYXJhbSBzSGFzaCBIYXNoIHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBJZiBzZXQgdG8gdHJ1ZSwgbm9uLWFuY2VzdG9yIGVudHJpZXMgaW4gaGlzdG9yeSB3aWxsIGJlIHJldGFpbmVkXG5cdCAqIEBwYXJhbSBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlIElmIHNldCB0byB0cnVlLCBjYWNoZSBwcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGlzIGRpc2FibGVkIGZvciB0aGUgY3VycmVudCBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBiRm9yY2VGb2N1cyBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGxvZ2ljIHRvIHNldCB0aGUgZm9jdXMgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWQgd2lsbCBiZSB0cmlnZ2VyZWQgKG9uUGFnZVJlYWR5KVxuXHQgKiBAcGFyYW0gYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIgSWYgbm90IHNldCB0byBmYWxzZSwgdGhlIGJhY2sgbmF2aWdhdGlvbiBpcyBzZXQgdG8gdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgKHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkKSB0aGF0IHJldHVybnMgJ3RydWUnIGlmIGEgbmF2aWdhdGlvbiB0b29rIHBsYWNlLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZG4ndCBoYXBwZW5cblx0ICovXG5cdGFzeW5jIG5hdlRvSGFzaChcblx0XHRzSGFzaDogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuLFxuXHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhbixcblx0XHRiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlcj86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0c0hhc2ggPSBzSGFzaC5zdGFydHNXaXRoKFwiL1wiKSA/IHNIYXNoLnN1YnN0cmluZygxKSA6IHNIYXNoO1xuXHRcdGlmIChiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlciAhPT0gZmFsc2UpIHtcblx0XHRcdGF3YWl0IHRoaXMuX29TaGVsbFNlcnZpY2VzLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0fVxuXHRcdHNIYXNoID0gdGhpcy5yZW1vdmVSZXN0b3JlSGlzdG9yeUZsYWdGcm9tSGFzaChzSGFzaCk7XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24ud2FpdEZvcigpLnRoZW4oYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiA9IHVuZGVmaW5lZDtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2ludGVybmFsTmF2VG9IYXNoKHNIYXNoLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlLCBiRm9yY2VGb2N1cyk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvKSB7XG5cdFx0XHRcdHRoaXMud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5faW50ZXJuYWxOYXZUb0hhc2goc0hhc2gsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUsIGJGb3JjZUZvY3VzKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBfaW50ZXJuYWxOYXZUb0hhc2goXG5cdFx0c0hhc2g6IHN0cmluZyxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlPzogYm9vbGVhbixcblx0XHRiRm9yY2VGb2N1cz86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gQWRkIHRoZSBhcHAgc3RhdGUgaW4gdGhlIGhhc2ggaWYgbmVlZGVkXG5cdFx0aWYgKHRoaXMuZmNsRW5hYmxlZCAmJiB0aGlzLnNJQXBwU3RhdGVLZXkgJiYgIXRoaXMuZmluZEFwcFN0YXRlSW5IYXNoKHNIYXNoKSkge1xuXHRcdFx0c0hhc2ggPSB0aGlzLnNldEFwcFN0YXRlSW5IYXNoKHNIYXNoLCB0aGlzLnNJQXBwU3RhdGVLZXkpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5jaGVja0hhc2hXaXRoR3VhcmQoc0hhc2gpKSB7XG5cdFx0XHRpZiAoIXRoaXMub1Jlc291cmNlQnVuZGxlKSB7XG5cdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UgaGF2ZSB0byB1c2UgYSBjb25maXJtIGhlcmUgZm9yIFVJIGNvbnNpc3RlbmN5IHJlYXNvbnMsIGFzIHdpdGggc29tZSBzY2VuYXJpb3Ncblx0XHRcdC8vIGluIHRoZSBFZGl0RmxvdyB3ZSByZWx5IG9uIGEgVUk1IG1lY2hhbmlzbSB0aGF0IGRpc3BsYXlzIGEgY29uZmlybSBkaWFsb2cuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYWxlcnRcblx0XHRcdGlmICghY29uZmlybSh0aGlzLm9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19ST1VURVJfUFJPWFlfU0FQRkVfRVhJVF9OT1RTQVZFRF9NRVNTQUdFXCIpKSkge1xuXHRcdFx0XHQvLyBUaGUgdXNlciBjbGlja2VkIG9uIENhbmNlbCAtLT4gY2FuY2VsIG5hdmlnYXRpb25cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJJc0d1YXJkQ3Jvc3NBbGxvd2VkID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBJbiBjYXNlIHRoZSBuYXZpZ2F0aW9uIHdpbGwgY2F1c2UgYSBuZXcgdmlldyB0byBiZSBkaXNwbGF5ZWQsIHdlIGZvcmNlIHRoZSBmb2N1c1xuXHRcdC8vIEkuZS4gaWYgdGhlIGtleXMgZm9yIHRoZSBoYXNoIHdlJ3JlIG5hdmlnYXRpbmcgdG8gaXMgYSBzdXBlcnNldCBvZiB0aGUgY3VycmVudCBoYXNoIGtleXMuXG5cdFx0Y29uc3Qgb05ld1N0YXRlID0gdGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0hhc2gpO1xuXHRcdGlmICghdGhpcy5fYkZvcmNlRm9jdXMpIHtcblx0XHRcdC8vIElmIHRoZSBmb2N1cyB3YXMgYWxyZWFkeSBmb3JjZWQsIGtlZXAgaXRcblx0XHRcdGNvbnN0IGFDdXJyZW50SGFzaEtleXMgPSBSb3V0ZXJQcm94eS5leHRyYWN0RW50aXR5U2V0c0Zyb21IYXNoKHRoaXMuZ2V0SGFzaCgpKTtcblx0XHRcdHRoaXMuX2JGb3JjZUZvY3VzID1cblx0XHRcdFx0YkZvcmNlRm9jdXMgfHxcblx0XHRcdFx0KGFDdXJyZW50SGFzaEtleXMubGVuZ3RoIDwgb05ld1N0YXRlLmtleXMubGVuZ3RoICYmXG5cdFx0XHRcdFx0YUN1cnJlbnRIYXNoS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcblx0XHRcdFx0XHRcdHJldHVybiBrZXkgPT09IG9OZXdTdGF0ZS5rZXlzW2luZGV4XTtcblx0XHRcdFx0XHR9KSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb0hpc3RvcnlBY3Rpb24gPSB0aGlzLl9wdXNoTmV3U3RhdGUob05ld1N0YXRlLCBmYWxzZSwgYlByZXNlcnZlSGlzdG9yeSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSk7XG5cdFx0dGhpcy5zdG9yZUZvY3VzSW5mb0ZvckN1cnJlbnRIYXNoKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fcmVidWlsZEJyb3dzZXJIaXN0b3J5KG9IaXN0b3J5QWN0aW9uLCBmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXJzIGJyb3dzZXIgaGlzdG9yeSBpZiBlbnRyaWVzIGhhdmUgYmVlbiBhZGRlZCB3aXRob3V0IHVzaW5nIHRoZSBSb3V0ZXJQcm94eS5cblx0ICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgaGlzdG9yeSBhY2NvcmRpbmdseS5cblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9uY2UgdGhlIGhpc3RvcnkgaXMgcmVidWlsdFxuXHQgKi9cblx0YXN5bmMgcmVzdG9yZUhpc3RvcnkoKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuXHRcdGlmICh0aGlzLl9iQXBwbHlSZXN0b3JlKSB7XG5cdFx0XHR0aGlzLl9iQXBwbHlSZXN0b3JlID0gZmFsc2U7XG5cdFx0XHRsZXQgc1RhcmdldEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRcdHNUYXJnZXRIYXNoID0gdGhpcy5yZW1vdmVSZXN0b3JlSGlzdG9yeUZsYWdGcm9tSGFzaChzVGFyZ2V0SGFzaCk7XG5cdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzVGFyZ2V0SGFzaCk7XG5cblx0XHRcdGNvbnN0IG9IaXN0b3J5QWN0aW9uID0gdGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuXG5cdFx0XHR0aGlzLnJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gdHJ1ZTtcblx0XHRcdHJldHVybiB0aGlzLl9yZWJ1aWxkQnJvd3Nlckhpc3Rvcnkob0hpc3RvcnlBY3Rpb24sIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBSZXN0b3JlSGlzdG9yeSBoYXMgYmVlbiB0cmlnZ2VyZWQgb24gdGhlIFJvdXRlclByb3h5LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGl0IGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0Y2hlY2tSZXN0b3JlSGlzdG9yeVdhc1RyaWdnZXJlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5yZXN0b3JlSGlzdG9yeVRyaWdnZXJlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNldHMgdGhlIGZsYWcgdGhhdCBzYXlzIGlmIFJlc3RvcmVIaXN0b3J5IGhhcyBiZWVuIHRyaWdnZXJlZCBvbiB0aGUgUm91dGVyUHJveHkuXG5cdCAqL1xuXHRyZXNldFJlc3RvcmVIaXN0b3J5RmxhZygpOiB2b2lkIHtcblx0XHR0aGlzLnJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKi9cblx0YXN5bmMgbmF2QmFjaygpOiBQcm9taXNlPHZvaWQgfCBib29sZWFuPiB7XG5cdFx0Y29uc3Qgc0N1cnJlbnRIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG5cdFx0bGV0IHNQcmV2aW91c0hhc2g7XG5cblx0XHQvLyBMb29rIGZvciB0aGUgY3VycmVudCBoYXNoIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRmb3IgKGxldCBpID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcblx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaV0uaGFzaCA9PT0gc0N1cnJlbnRIYXNoKSB7XG5cdFx0XHRcdHNQcmV2aW91c0hhc2ggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaSAtIDFdLmhhc2g7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzUHJldmlvdXNIYXNoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5uYXZUb0hhc2goc1ByZXZpb3VzSGFzaCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdlIGNvdWxkbid0IGZpbmQgYSBwcmV2aW91cyBoYXNoIGluIGhpc3Rvcnlcblx0XHRcdC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIG5hdmlnYXRpbmcgZnJvbSBhIHRyYW5zaWVudCBoYXNoIGluIGEgY3JlYXRlIGFwcCwgYW5kXG5cdFx0XHQvLyBpbiB0aGF0IGNhc2UgaGlzdG9yeS5iYWNrIHdvdWxkIGdvIGJhY2sgdG8gdGhlIEZMUFxuXHRcdFx0d2luZG93Lmhpc3RvcnkuYmFjaygpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSByb3V0ZSB3aXRoIHBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBzUm91dGVOYW1lIFRoZSByb3V0ZSBuYW1lIHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gb1BhcmFtZXRlcnMgUGFyYW1ldGVycyBmb3IgdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIG9QYXJhbWV0ZXJzLm5vUHJlc2VydmF0aW9uQ2FjaGVcblx0ICogQHBhcmFtIG9QYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGVcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqL1xuXHRhc3luYyBuYXZUbyhzUm91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogeyBub1ByZXNlcnZhdGlvbkNhY2hlPzogYm9vbGVhbjsgYklzU3RpY2t5TW9kZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlci5nZXRVUkwoc1JvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHRcdHJldHVybiB0aGlzLm5hdlRvSGFzaChzSGFzaCEsIGZhbHNlLCBvUGFyYW1ldGVycz8ubm9QcmVzZXJ2YXRpb25DYWNoZSwgZmFsc2UsICFvUGFyYW1ldGVycz8uYklzU3RpY2t5TW9kZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhpdHMgdGhlIGN1cnJlbnQgYXBwIGJ5IG5hdmlnYXRpbmcgYmFja1xuXHQgKiB0byB0aGUgcHJldmlvdXMgYXBwIChpZiBhbnkpIG9yIHRoZSBGTFAuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHdlIGV4aXQgdGhlIGFwcFxuXHQgKi9cblx0ZXhpdEZyb21BcHAoKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaGVsbFNlcnZpY2VzLmJhY2tUb1ByZXZpb3VzQXBwKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBoYXNoIGNhbiBoYXZlIGFuIGltcGFjdCBvbiB0aGUgY3VycmVudCBzdGF0ZVxuXHQgKiBpLmUuIGlmIHRoZSBoYXNoIGlzIGVxdWFsLCBjb21wYXRpYmxlIG9yIGFuIGFuY2VzdG9yIG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuXHQgKiBAcGFyYW0gc0hhc2ggYHRydWVgIGlmIHRoZXJlIGlzIGFuIGltcGFjdFxuXHQgKiBAcmV0dXJucyBJZiB0aGVyZSBpcyBhbiBpbXBhY3Rcblx0ICovXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShzSGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0aWYgKHNIYXNoWzBdID09PSBcIi9cIikge1xuXHRcdFx0c0hhc2ggPSBzSGFzaC5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXHRcdGNvbnN0IG9Mb2NhbEd1YXJkID0gY3JlYXRlR3VhcmRGcm9tSGFzaChzSGFzaCk7XG5cdFx0cmV0dXJuIG9Mb2NhbEd1YXJkLmNoZWNrKHRoaXMuZ2V0SGFzaCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG5cdCAqIEByZXR1cm5zIGBmYWxzZWAgaWYgYSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBpbiB0aGUgUm91dGVyUHJveHkgYW5kIGlzIG5vdCB5ZXQgZmluYWxpemVkXG5cdCAqL1xuXHRpc05hdmlnYXRpb25GaW5hbGl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICF0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBsYXN0IHN0YXRlIGFzIGEgZ3VhcmQuXG5cdCAqIEVhY2ggZnV0dXJlIG5hdmlnYXRpb24gd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhpcyBndWFyZCwgYW5kIGEgY29uZmlybWF0aW9uIGRpYWxvZyB3aWxsXG5cdCAqIGJlIGRpc3BsYXllZCBiZWZvcmUgdGhlIG5hdmlnYXRpb24gZ29lcyB0byBhbiBhbmNlc3RvciBvZiB0aGUgZ3VhcmQuXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCBmb3IgdGhlIGd1YXJkLlxuXHQgKiBAcGFyYW0gW2hhc2hUcmFrZXJdIE9wdGlvbmFsIGhhc2ggdHJhY2tlciB1c2VkIGZvciBhZGRpdGlvbmFsIGd1YXJkIGNoZWNrcy5cblx0ICovXG5cdHNldE5hdmlnYXRpb25HdWFyZChzSGFzaDogc3RyaW5nLCBoYXNoVHJha2VyPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IGNyZWF0ZUd1YXJkRnJvbUhhc2goc0hhc2gsIGhhc2hUcmFrZXIpO1xuXHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICovXG5cdGRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTogdm9pZCB7XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbmF2aWdhdGluZyBndWFyZCBpcyBhdmFpbGFibGVcblx0ICovXG5cdGhhc05hdmlnYXRpb25HdWFyZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fb05hdmlnYXRpb25HdWFyZCAhPT0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUZXN0cyBhIGhhc2ggYWdhaW5zdCB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoIHRvIGJlIHRlc3RlZFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbmF2aWdhdGluZyB0byB0aGUgaGFzaCBkb2Vzbid0IGNyb3NzIHRoZSBndWFyZFxuXHQgKi9cblx0Y2hlY2tIYXNoV2l0aEd1YXJkKHNIYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fb05hdmlnYXRpb25HdWFyZCA9PT0gbnVsbCB8fCB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkLmNoZWNrKHNIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHVzZXIgYWxsb3dlZCB0aGUgbmF2aWdhdGlvbiBndWFyZCB0byBiZSBjcm9zc2VkLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBiZWVuIGFsbG93ZWQgYnkgdGhlIHVzZXJcblx0ICovXG5cdGlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQWN0aXZhdGVzIHRoZSBzeW5jaHJvbml6YXRpb24gZm9yIHJvdXRlTWF0Y2hlZEV2ZW50LlxuXHQgKiBUaGUgbmV4dCBOYXZUb0hhc2ggY2FsbCB3aWxsIGNyZWF0ZSBhIFN5bmNocm9uaXphdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlIHJlc29sdmVkXG5cdCAqIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG9uUm91dGVNYXRjaGVkIGV2ZW50LCBwcmV2ZW50aW5nIGFub3RoZXIgTmF2VG9IYXNoIHRvIGhhcHBlbiBpbiBwYXJhbGxlbC5cblx0ICovXG5cdGFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpOiB2b2lkIHtcblx0XHR0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSB0aGUgcm91dGVNYXRjaCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCB1bmxvY2tpbmcgcG90ZW50aWFsIHBlbmRpbmcgTmF2VG9IYXNoIGNhbGxzLlxuXHQgKi9cblx0cmVzb2x2ZVJvdXRlTWF0Y2goKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbi5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2VzIHN1cmUgbm8gbmF2aWdhdGlvbiBjYW4gaGFwcGVuIGJlZm9yZSBhIHJvdXRlTWF0Y2ggaGFwcGVuZWQuXG5cdCAqL1xuXHR3YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKTogdm9pZCB7XG5cdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24gPSBuZXcgU3luY2hyb25pemF0aW9uKCk7XG5cdFx0dGhpcy5fYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSBmYWxzZTtcblx0fVxuXG5cdHN0YXRpYyBleHRyYWN0RW50aXR5U2V0c0Zyb21IYXNoKHNIYXNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cdFx0Y29uc3Qgc0hhc2hOb1BhcmFtcyA9IHNIYXNoLnNwbGl0KFwiP1wiKVswXTsgLy8gcmVtb3ZlIHBhcmFtc1xuXHRcdGNvbnN0IGFUb2tlbnMgPSBzSGFzaE5vUGFyYW1zLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGFUb2tlbnMuZm9yRWFjaCgoc1Rva2VuKSA9PiB7XG5cdFx0XHRpZiAoc1Rva2VuLmxlbmd0aCkge1xuXHRcdFx0XHRuYW1lcy5wdXNoKHNUb2tlbi5zcGxpdChcIihcIilbMF0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG5hbWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkcyBhIHN0YXRlIGZyb20gYSBoYXNoLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gYmUgdXNlZCBhcyBlbnRyeVxuXHQgKiBAcmV0dXJucyBUaGUgc3RhdGVcblx0ICovXG5cdF9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaDogc3RyaW5nKTogUm91dGVyU3RhdGUge1xuXHRcdGlmIChzSGFzaCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzSGFzaCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1N0YXRlOiBSb3V0ZXJTdGF0ZSA9IHtcblx0XHRcdGtleXM6IFJvdXRlclByb3h5LmV4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2goc0hhc2gpLFxuXHRcdFx0aGFzaDogc0hhc2gsXG5cdFx0XHRzY3JlZW5Nb2RlOiAwIC8vIHdpbGwgYmUgdXBkYXRlZCBpbiBhIHNlY1xuXHRcdH07XG5cblx0XHQvLyBSZXRyaWV2ZSBsYXlvdXQgKGlmIGFueSlcblx0XHRjb25zdCBhTGF5b3V0ID0gc0hhc2gubWF0Y2gobmV3IFJlZ0V4cChgXFxcXD8uKiR7ZW51bVVSTFBhcmFtcy5MQVlPVVRQQVJBTX09KFteJl0qKWApKTtcblx0XHRvU3RhdGUuc0xheW91dCA9IGFMYXlvdXQgJiYgYUxheW91dC5sZW5ndGggPiAxID8gYUxheW91dFsxXSA6IHVuZGVmaW5lZDtcblx0XHRpZiAob1N0YXRlLnNMYXlvdXQgPT09IFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiKSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDE7XG5cdFx0fSBlbHNlIGlmIChvU3RhdGUuc0xheW91dCA9PT0gXCJFbmRDb2x1bW5GdWxsU2NyZWVuXCIpIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gb1N0YXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBuZXcgc3RhdGUgaW50byB0aGUgaW50ZXJuYWwgaGlzdG9yeSBzdHJ1Y3R1cmUuXG5cdCAqIE1ha2VzIHN1cmUgdGhpcyBuZXcgc3RhdGUgaXMgYWRkZWQgYWZ0ZXIgYW4gYW5jZXN0b3IuXG5cdCAqIEFsc28gc2V0cyB0aGUgaUFwcFN0YXRlIGtleSBpbiB0aGUgd2hvbGUgaGlzdG9yeS5cblx0ICogQHBhcmFtIG9OZXdTdGF0ZSBUaGUgbmV3IHN0YXRlIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSBiUmVidWlsZE9ubHkgYHRydWVgIGlmIHdlJ3JlIHJlYnVpbGRpbmcgdGhlIGhpc3RvcnkgYWZ0ZXIgYSBzaGVsbCBtZW51IG5hdmlnYXRpb25cblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgSWYgc2V0IHRvIHRydWUsIG5vbi1hbmNlc3RvciBlbnRyaWVzIGluIGhpc3Rvcnkgd2lsbCBiZSByZXRhaW5lZFxuXHQgKiBAcGFyYW0gYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uIERpc2FibGUgdGhlIG1lY2hhbmlzbSB0byByZXRhaW5lZCBtYXJrZWQgZW50cmllcyBpbiBjYWNoZVxuXHQgKiBAcmV0dXJucyBUaGUgbmV3IHN0YXRlXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X3B1c2hOZXdTdGF0ZShcblx0XHRvTmV3U3RhdGU6IFJvdXRlclN0YXRlLFxuXHRcdGJSZWJ1aWxkT25seTogYm9vbGVhbixcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24/OiBib29sZWFuXG5cdCk6IEh5c3RvcnlBY3Rpb24ge1xuXHRcdGNvbnN0IHNDdXJyZW50SGFzaCA9IHRoaXMucmVtb3ZlUmVzdG9yZUhpc3RvcnlGbGFnRnJvbUhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdGxldCBsYXN0SW5kZXggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTtcblx0XHRsZXQgaVBvcENvdW50ID0gYlJlYnVpbGRPbmx5ID8gMSA6IDA7XG5cblx0XHQvLyAxLiBEbyBzb21lIGNsZWFudXAgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSA6IGluIGNhc2UgdGhlIHVzZXIgaGFzIG5hdmlnYXRlZCBiYWNrIGluIHRoZSBicm93c2VyIGhpc3RvcnksIHdlIG5lZWQgdG8gcmVtb3ZlXG5cdFx0Ly8gdGhlIHN0YXRlcyBhaGVhZCBpbiBoaXN0b3J5IGFuZCBtYWtlIHN1cmUgdGhlIHRvcCBzdGF0ZSBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBwYWdlXG5cdFx0Ly8gV2UgZG9uJ3QgZG8gdGhhdCB3aGVuIHJlc3RvcmluZyB0aGUgaGlzdG9yeSwgYXMgdGhlIGN1cnJlbnQgc3RhdGUgaGFzIGJlZW4gYWRkZWQgb24gdG9wIG9mIHRoZSBicm93c2VyIGhpc3Rvcnlcblx0XHQvLyBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0aWYgKCFiUmVidWlsZE9ubHkpIHtcblx0XHRcdHdoaWxlIChsYXN0SW5kZXggPj0gMCAmJiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbbGFzdEluZGV4XS5oYXNoICE9PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRsYXN0SW5kZXgtLTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaGlzdG9yeS4gVGhpcyBjYW4gaGFwcGVuIGlmIGEgYnJvd3NlciByZWxvYWRcblx0XHRcdFx0Ly8gaGFwcGVuZWQsIGNhdXNpbmcgYSByZWluaXRpYWxpemF0aW9uIG9mIHRoZSBtYW5hZ2VkIGhpc3RvcnkuXG5cdFx0XHRcdC8vIEluIHRoYXQgY2FzZSwgd2UgdXNlIHRoZSBjdXJyZW50IGxvY2F0aW9uIGFzIHRoZSBuZXcgc3RhcnRpbmcgcG9pbnQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaCh0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQ3VycmVudEhhc2gpKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IDAgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDIuIE1hcmsgdGhlIHRvcCBzdGF0ZSBhcyBwcmVzZXJ2ZWQgaWYgcmVxdWlyZWRcblx0XHRpZiAoYlByZXNlcnZlSGlzdG9yeSAmJiAhYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uKSB7XG5cdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLnByZXNlcnZlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gMy4gVGhlbiBwb3AgYWxsIHN0YXRlcyB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIG9mIHRoZSBuZXcgc3RhdGUsIG9yIHdlIGZpbmQgYSBzdGF0ZSB0aGF0IG5lZWQgdG8gYmUgcHJlc2VydmVkXG5cdFx0bGV0IG9MYXN0UmVtb3ZlZEl0ZW07XG5cdFx0d2hpbGUgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBvVG9wU3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uIHx8ICFvVG9wU3RhdGUucHJlc2VydmVkKSAmJlxuXHRcdFx0XHR0aGlzLl9jb21wYXJlQ2FjaGVTdGF0ZXMob1RvcFN0YXRlLCBvTmV3U3RhdGUpICE9PSBlbnVtU3RhdGUuQU5DRVNUT1Jcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGUgdG9wIHN0YXRlIGlzIG5vdCBhbiBhbmNlc3RvciBvZiBvTmV3U3RhdGUgYW5kIGlzIG5vdCBwcmVzZXJ2ZWQgLS0+IHdlIGNhbiBwb3AgaXRcblx0XHRcdFx0b0xhc3RSZW1vdmVkSXRlbSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0aVBvcENvdW50Kys7XG5cdFx0XHR9IGVsc2UgaWYgKG9Ub3BTdGF0ZS5wcmVzZXJ2ZWQgJiYgcmVtb3ZlQXBwU3RhdGVJbkhhc2gob1RvcFN0YXRlLmhhc2gpID09PSByZW1vdmVBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCkpIHtcblx0XHRcdFx0Ly8gV2UgdHJ5IHRvIGFkZCBhIHN0YXRlIHRoYXQgaXMgYWxyZWFkeSBpbiBjYWNoZSAoZHVlIHRvIHByZXNlcnZlZCBmbGFnKSBidXQgd2l0aCBhIGRpZmZlcmVudCBpYXBwLXN0YXRlXG5cdFx0XHRcdC8vIC0tPiB3ZSBzaG91bGQgZGVsZXRlIHRoZSBwcmV2aW91cyBlbnRyeSAoaXQgd2lsbCBiZSBsYXRlciByZXBsYWNlZCBieSB0aGUgbmV3IG9uZSkgYW5kIHN0b3AgcG9wcGluZ1xuXHRcdFx0XHRvTGFzdFJlbW92ZWRJdGVtID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRpUG9wQ291bnQrKztcblx0XHRcdFx0b05ld1N0YXRlLnByZXNlcnZlZCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnJlYWs7IC8vIEFuY2VzdG9yIG9yIHByZXNlcnZlZCBzdGF0ZSBmb3VuZCAtLT4gd2Ugc3RvcCBwb3BwaW5nIG91dCBzdGF0ZXNcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA0LiBpQXBwU3RhdGUgbWFuYWdlbWVudFxuXHRcdHRoaXMuc0lBcHBTdGF0ZUtleSA9IHRoaXMuZmluZEFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoKTtcblx0XHRpZiAoIXRoaXMuZmNsRW5hYmxlZCAmJiBvTGFzdFJlbW92ZWRJdGVtKSB7XG5cdFx0XHRjb25zdCBzUHJldmlvdXNJQXBwU3RhdGVLZXkgPSB0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChvTGFzdFJlbW92ZWRJdGVtLmhhc2gpO1xuXHRcdFx0Y29uc3Qgb0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9IHRoaXMuX2NvbXBhcmVDYWNoZVN0YXRlcyhvTGFzdFJlbW92ZWRJdGVtLCBvTmV3U3RhdGUpO1xuXHRcdFx0Ly8gaWYgY3VycmVudCBzdGF0ZSBkb2Vzbid0IGNvbnRhaW4gYSBpLWFwcHN0YXRlIGFuZCB0aGlzIHN0YXRlIHNob3VsZCByZXBsYWNlIGEgc3RhdGUgY29udGFpbmluZyBhIGlBcHBTdGF0ZVxuXHRcdFx0Ly8gdGhlbiB0aGUgcHJldmlvdXMgaUFwcFN0YXRlIGlzIHByZXNlcnZlZFxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5zSUFwcFN0YXRlS2V5ICYmXG5cdFx0XHRcdHNQcmV2aW91c0lBcHBTdGF0ZUtleSAmJlxuXHRcdFx0XHQob0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9PT0gZW51bVN0YXRlLkVRVUFMIHx8IG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPT09IGVudW1TdGF0ZS5DT01QQVRJQkxFKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9OZXdTdGF0ZS5oYXNoID0gdGhpcy5zZXRBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCwgc1ByZXZpb3VzSUFwcFN0YXRlS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA1LiBOb3cgd2UgY2FuIHB1c2ggdGhlIHN0YXRlIGF0IHRoZSB0b3Agb2YgdGhlIGludGVybmFsIGhpc3Rvcnlcblx0XHRjb25zdCBiSGFzU2FtZUhhc2ggPSBvTGFzdFJlbW92ZWRJdGVtICYmIG9OZXdTdGF0ZS5oYXNoID09PSBvTGFzdFJlbW92ZWRJdGVtLmhhc2g7XG5cdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPT09IDAgfHwgdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXS5oYXNoICE9PSBvTmV3U3RhdGUuaGFzaCkge1xuXHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2gob05ld1N0YXRlKTtcblx0XHRcdGlmIChvTGFzdFJlbW92ZWRJdGVtICYmIHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9MYXN0UmVtb3ZlZEl0ZW0uaGFzaCkgPT09IHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoKSkge1xuXHRcdFx0XHRvTmV3U3RhdGUuZm9jdXNDb250cm9sSWQgPSBvTGFzdFJlbW92ZWRJdGVtLmZvY3VzQ29udHJvbElkO1xuXHRcdFx0XHRvTmV3U3RhdGUuc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQgPSBvTGFzdFJlbW92ZWRJdGVtLnNlY29uZGFyeUZvY3VzQ29udHJvbElkO1xuXHRcdFx0XHRvTmV3U3RhdGUuZm9jdXNJbmZvID0gb0xhc3RSZW1vdmVkSXRlbS5mb2N1c0luZm87XG5cdFx0XHRcdG9OZXdTdGF0ZS5zZWNvbmRhcnlGb2N1c0luZm8gPSBvTGFzdFJlbW92ZWRJdGVtLnNlY29uZGFyeUZvY3VzSW5mbztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA2LiBEZXRlcm1pbmUgd2hpY2ggYWN0aW9ucyB0byBkbyBvbiB0aGUgaGlzdG9yeVxuXHRcdGlmIChpUG9wQ291bnQgPT09IDApIHtcblx0XHRcdC8vIE5vIHN0YXRlIHdhcyBwb3BwZWQgLS0+IGFwcGVuZFxuXHRcdFx0cmV0dXJuIHsgdHlwZTogXCJhcHBlbmRcIiB9O1xuXHRcdH0gZWxzZSBpZiAoaVBvcENvdW50ID09PSAxKSB7XG5cdFx0XHQvLyBPbmx5IDEgc3RhdGUgd2FzIHBvcHBlZCAtLT4gcmVwbGFjZSBjdXJyZW50IGhhc2ggdW5sZXNzIGhhc2ggaXMgdGhlIHNhbWUgKHRoZW4gbm90aGluZyB0byBkbylcblx0XHRcdHJldHVybiBiSGFzU2FtZUhhc2ggPyB7IHR5cGU6IFwibm9uZVwiIH0gOiB7IHR5cGU6IFwicmVwbGFjZVwiIH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE1vcmUgdGhhbiAxIHN0YXRlIHdhcyBwb3BwZWQgLS0+IGdvIGJha2MgaW4gaGlzdG9yeSBhbmQgcmVwbGFjZSBoYXNoIGlmIG5lY2Vzc2FyeVxuXHRcdFx0cmV0dXJuIGJIYXNTYW1lSGFzaCA/IHsgdHlwZTogXCJiYWNrXCIsIHN0ZXBzOiBpUG9wQ291bnQgLSAxIH0gOiB7IHR5cGU6IFwiYmFjay1yZXBsYWNlXCIsIHN0ZXBzOiBpUG9wQ291bnQgLSAxIH07XG5cdFx0fVxuXHR9XG5cblx0X2Jsb2NraW5nTmF2aWdhdGlvbkZpbHRlcigpOiBcIkN1c3RvbVwiIHwgXCJDb250aW51ZVwiIHtcblx0XHRyZXR1cm4gdGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPyBcIkN1c3RvbVwiIDogXCJDb250aW51ZVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGUgdGhlIHJvdXRpbmcgYnkgY2FsbGluZyB0aGUgcm91dGVyIHN0b3AgbWV0aG9kLlxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKTogdm9pZCB7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSB0cnVlO1xuXHRcdHRoaXMuX29Sb3V0ZXIuc3RvcCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuYWJsZSB0aGUgcm91dGluZyBieSBjYWxsaW5nIHRoZSByb3V0ZXIgaW5pdGlhbGl6ZSBtZXRob2QuXG5cdCAqIEBwYXJhbSBbYklnbm9yZUN1cnJlbnRIYXNoXSBJZ25vcmUgdGhlIGxhc3QgaGFzaCBldmVudCB0cmlnZ2VyZWQgYmVmb3JlIHRoZSByb3V0ZXIgaGFzIGluaXRpYWxpemVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKGJJZ25vcmVDdXJyZW50SGFzaDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdHRoaXMuX2JEaXNhYmxlT25IYXNoQ2hhbmdlID0gZmFsc2U7XG5cdFx0dGhpcy5fb1JvdXRlci5pbml0aWFsaXplKGJJZ25vcmVDdXJyZW50SGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogU3luY2hyb25pemVzIHRoZSBicm93c2VyIGhpc3Rvcnkgd2l0aCB0aGUgaW50ZXJuYWwgaGlzdG9yeSBvZiB0aGUgcm91dGVyUHJveHksIGFuZCB0cmlnZ2VycyBhIG5hdmlnYXRpb24gaWYgbmVlZGVkLlxuXHQgKiBAcGFyYW0gb0hpc3RvcnlBY3Rpb24gU3BlY2lmaWVzIHRoZSBuYXZpZ2F0aW9uIGFjdGlvbiB0byBiZSBwZXJmb3JtZWRcblx0ICogQHBhcmFtIGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgaW50ZXJuYWwgaGlzdG9yeSBpcyBjdXJyZW50bHkgYmVpbmcgcmVidWlsdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIChyZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCkgdGhhdCByZXR1cm5zICd0cnVlJyBpZiBhIG5hdmlnYXRpb24gdG9vayBwbGFjZSwgJ2ZhbHNlJyBpZiB0aGUgbmF2aWdhdGlvbiBkaWRuJ3QgaGFwcGVuXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbjogSHlzdG9yeUFjdGlvbiwgYlJlYnVpbGRPbmx5OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IHRydWU7XG5cdFx0XHRjb25zdCBvVGFyZ2V0U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLFxuXHRcdFx0XHRuZXdMZXZlbCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxO1xuXG5cdFx0XHRmdW5jdGlvbiByZXBsYWNlQXN5bmMoKTogdm9pZCB7XG5cdFx0XHRcdGlmICghYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHRcdFx0dGhhdC5fZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UodHJ1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQodGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIEZ1bmN0aW9uKShvVGFyZ2V0U3RhdGUuaGFzaCk7XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiBuZXdMZXZlbCB9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIik7XG5cblx0XHRcdFx0aWYgKGJSZWJ1aWxkT25seSkge1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Ly8gVGltZW91dCB0byBsZXQgJ2hhc2hjaGFuZ2UnIGV2ZW50IGJlIHByb2Nlc3NlZCBiZWZvcmUgYnkgdGhlIEhhc2hDaGFuZ2VyLCBzbyB0aGF0XG5cdFx0XHRcdFx0XHQvLyBvblJvdXRlTWF0Y2hlZCBub3RpZmljYXRpb24gaXNuJ3QgcmFpc2VkXG5cdFx0XHRcdFx0XHR0aGF0Ll9lbmFibGVFdmVudE9uSGFzaENoYW5nZSh0cnVlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdHJlc29sdmUodHJ1ZSk7IC8vIGEgbmF2aWdhdGlvbiBvY2N1cnJlZFxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBc3luYyBjYWxsYmFja3Mgd2hlbiBuYXZpZ2F0aW5nIGJhY2ssIGluIG9yZGVyIHRvIGxldCBhbGwgbm90aWZpY2F0aW9ucyBhbmQgZXZlbnRzIGdldCBwcm9jZXNzZWRcblx0XHRcdGZ1bmN0aW9uIGJhY2tSZXBsYWNlQXN5bmMoKTogdm9pZCB7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja1JlcGxhY2VBc3luYyk7XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIFRpbWVvdXQgdG8gbGV0ICdoYXNoY2hhbmdlJyBldmVudCBiZSBwcm9jZXNzZWQgYmVmb3JlIGJ5IHRoZSBIYXNoQ2hhbmdlclxuXHRcdFx0XHRcdHJlcGxhY2VBc3luYygpO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gYmFja0FzeW5jKCk6IHZvaWQge1xuXHRcdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tBc3luYyk7XG5cdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdHJlc29sdmUodHJ1ZSk7IC8vIGEgbmF2aWdhdGlvbiBvY2N1cnJlZFxuXHRcdFx0fVxuXG5cdFx0XHR0aGF0Ll9iSWdub3JlUmVzdG9yZSA9IHRydWU7XG5cblx0XHRcdHN3aXRjaCAob0hpc3RvcnlBY3Rpb24udHlwZSkge1xuXHRcdFx0XHRjYXNlIFwicmVwbGFjZVwiOlxuXHRcdFx0XHRcdGNvbnN0IGZvY3VzSW5mbyA9IGhpc3Rvcnkuc3RhdGU/LmZvY3VzSW5mbztcblx0XHRcdFx0XHQodGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIEZ1bmN0aW9uKShvVGFyZ2V0U3RhdGUuaGFzaCk7XG5cdFx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoXG5cdFx0XHRcdFx0XHRPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0ZmVMZXZlbDogbmV3TGV2ZWwsXG5cdFx0XHRcdFx0XHRcdFx0Zm9jdXNJbmZvOiBmb2N1c0luZm9cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0aGlzdG9yeS5zdGF0ZVxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImFwcGVuZFwiOlxuXHRcdFx0XHRcdHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5zZXRIYXNoKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImJhY2tcIjpcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tBc3luYyk7XG5cdFx0XHRcdFx0aGlzdG9yeS5nbygtb0hpc3RvcnlBY3Rpb24uc3RlcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJiYWNrLXJlcGxhY2VcIjpcblx0XHRcdFx0XHR0aGlzLl9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKTtcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tSZXBsYWNlQXN5bmMpO1xuXHRcdFx0XHRcdGhpc3RvcnkuZ28oLW9IaXN0b3J5QWN0aW9uLnN0ZXBzKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vIE5vIG5hdmlnYXRpb25cblx0XHRcdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHJlc29sdmUoZmFsc2UpOyAvLyBubyBuYXZpZ2F0aW9uIC0tPiByZXNvbHZlIHRvIGZhbHNlXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRMYXN0SGlzdG9yeUVudHJ5KCk6IFJvdXRlclN0YXRlIHtcblx0XHRyZXR1cm4gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXTtcblx0fVxuXG5cdHNldFBhdGhNYXBwaW5nKG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdHRoaXMuX3BhdGhNYXBwaW5ncyA9IG1hcHBpbmdzLmZpbHRlcigobWFwcGluZykgPT4ge1xuXHRcdFx0cmV0dXJuIG1hcHBpbmcub2xkUGF0aCAhPT0gbWFwcGluZy5uZXdQYXRoO1xuXHRcdH0pO1xuXHR9XG5cblx0aGFzaEd1YXJkKCk6IHZvaWQge1xuXHRcdGxldCBzSGFzaCA9IHRoaXMuZ2V0RGVjb2RlZFdpbmRvd0hhc2goKTtcblx0XHRjb25zdCBjdXJyZW50QXBwTmFtZSA9IHRoaXMuZ2V0QXBwTmFtZUZyb21IYXNoKHNIYXNoKTtcblx0XHRpZiAoY3VycmVudEFwcE5hbWUgIT0gdGhpcy5hcHBOYW1lKSB7XG5cdFx0XHQvLyBXaGVuIGRvaW5nIGV4dGVybmFsIG5hdmlnYXRpb24gaW4gYW5vdGhlciB3aW5kb3csIHRoZSBjdXJyZW50IHdpbmRvdyBsb2NhdGlvbiBpcyB0ZW1wb3JhcmlseSBtb2RpZmllZCB3aXRoIHRoZSBVUkwgb2YgdGhlIHRhcmdldCBhcHBcblx0XHRcdC8vIEluIHRoaXMgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byB1cGRhdGUgdGhlIGludGVybmFsbHkgbWFuYWdlZCBoaXN0b3J5LCBzbyB3ZSBzaW1wbHkgZG8gbm90aGluZ1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChzSGFzaC5pbmNsdWRlcyhcInJlc3RvcmVIaXN0b3J5PXRydWVcIikpIHtcblx0XHRcdHRoaXMuX2JBcHBseVJlc3RvcmUgPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoIXRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgaGFzaCBuZWVkcyB0byBiZSBjaGFuZ2VkICh0aGlzIGhhcHBlbnMgaW4gRkNMIHdoZW4gc3dpdGNoaW5nIGIvdyBlZGl0IGFuZCByZWFkLW9ubHkgd2l0aCAzIGNvbHVtbnMgb3Blbilcblx0XHRcdGNvbnN0IG1hcHBpbmcgPSB0aGlzLl9wYXRoTWFwcGluZ3MuZmluZCgobSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gc0hhc2guaW5jbHVkZXMobS5vbGRQYXRoKTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKG1hcHBpbmcpIHtcblx0XHRcdFx0Ly8gUmVwbGFjZSB0aGUgY3VycmVudCBoYXNoXG5cdFx0XHRcdHNIYXNoID0gc0hhc2gucmVwbGFjZShtYXBwaW5nLm9sZFBhdGgsIG1hcHBpbmcubmV3UGF0aCk7XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oe30sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiLCBlbmNvZGVVUkkoc0hhc2gpKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYUhhc2hTcGxpdCA9IHNIYXNoLnNwbGl0KFwiJi9cIik7XG5cdFx0XHRjb25zdCBzQXBwSGFzaCA9IGFIYXNoU3BsaXRbMV0gPyBhSGFzaFNwbGl0WzFdIDogXCJcIjtcblx0XHRcdGlmICh0aGlzLmNoZWNrSGFzaFdpdGhHdWFyZChzQXBwSGFzaCkpIHtcblx0XHRcdFx0Y29uc3Qgb05ld1N0YXRlID0gdGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0FwcEhhc2gpO1xuXHRcdFx0XHR0aGlzLl9wdXNoTmV3U3RhdGUob05ld1N0YXRlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wYXJlcyAyIHN0YXRlcy5cblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTFcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTJcblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbjpcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkVRVUFMIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGVxdWFsXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5DT01QQVRJQkxFIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGNvbXBhdGlibGVcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkFOQ0VTVE9SIGlmIG9TdGF0ZTEgaXMgYW4gYW5jZXN0b3Igb2Ygb1N0YXRlMlxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuRElGRkVSRU5UIGlmIHRoZSAyIHN0YXRlcyBhcmUgZGlmZmVyZW50XG5cdCAqL1xuXG5cdF9jb21wYXJlQ2FjaGVTdGF0ZXMob1N0YXRlMTogUm91dGVyU3RhdGUsIG9TdGF0ZTI6IFJvdXRlclN0YXRlKTogbnVtYmVyIHtcblx0XHQvLyBGaXJzdCBjb21wYXJlIG9iamVjdCBrZXlzXG5cdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPiBvU3RhdGUyLmtleXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDtcblx0XHR9XG5cdFx0bGV0IGVxdWFsID0gdHJ1ZTtcblx0XHRsZXQgaW5kZXg7XG5cblx0XHRmb3IgKGluZGV4ID0gMDsgZXF1YWwgJiYgaW5kZXggPCBvU3RhdGUxLmtleXMubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRpZiAob1N0YXRlMS5rZXlzW2luZGV4XSAhPT0gb1N0YXRlMi5rZXlzW2luZGV4XSkge1xuXHRcdFx0XHRlcXVhbCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghZXF1YWwpIHtcblx0XHRcdC8vIENoZWNrIHJvdXRpbmdIaW50c1xuXHRcdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPT09IDEgJiYgb1N0YXRlMi5rZXlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnJvdXRpbmdIaW50cz8uW29TdGF0ZTEua2V5c1swXV0pIHtcblx0XHRcdFx0aWYgKHRoaXMucm91dGluZ0hpbnRzW29TdGF0ZTEua2V5c1swXV0ucGFyZW50T2YgJiYgdGhpcy5yb3V0aW5nSGludHNbb1N0YXRlMS5rZXlzWzBdXS5wYXJlbnRPZi5pbmNsdWRlcyhvU3RhdGUyLmtleXNbMF0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5BTkNFU1RPUjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gU29tZSBvYmplY3RzIGtleXMgYXJlIGRpZmZlcmVudFxuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGtleXMgZnJvbSBvU3RhdGUxIGFyZSBpbiBvU3RhdGUyIC0tPiBjaGVjayBpZiBhbmNlc3RvclxuXHRcdGlmIChvU3RhdGUxLmtleXMubGVuZ3RoIDwgb1N0YXRlMi5rZXlzLmxlbmd0aCB8fCBvU3RhdGUxLnNjcmVlbk1vZGUgPCBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuQU5DRVNUT1I7XG5cdFx0fVxuXHRcdGlmIChvU3RhdGUxLnNjcmVlbk1vZGUgPiBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UOyAvLyBOb3Qgc3VyZSB0aGlzIGNhc2UgY2FuIGhhcHBlbi4uLlxuXHRcdH1cblxuXHRcdC8vIEF0IHRoaXMgc3RhZ2UsIHRoZSAyIHN0YXRlcyBoYXZlIHRoZSBzYW1lIG9iamVjdCBrZXlzIChpbiB0aGUgc2FtZSBvcmRlcikgYW5kIHNhbWUgc2NyZWVubW9kZVxuXHRcdC8vIFRoZXkgY2FuIGJlIGVpdGhlciBjb21wYXRpYmxlIG9yIGVxdWFsXG5cdFx0cmV0dXJuIG9TdGF0ZTEuc0xheW91dCA9PT0gb1N0YXRlMi5zTGF5b3V0ID8gZW51bVN0YXRlLkVRVUFMIDogZW51bVN0YXRlLkNPTVBBVElCTEU7XG5cdH1cblxuXHQvKipcblx0ICogU3BsaXQgdGhlIGFwcC1zcGVjaWZpYyByb3V0ZSBhdCB0aGUgXCImL1wiIHNlcGFyYXRvci5cblx0ICpcblx0ICogVGhlIGFwcC1zcGVjaWZpYyByb3V0ZSBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBzZWdtZW50cyBzZXBhcmF0ZWQgYnkgXCImL1wiLlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBzcGxpdEFwcFNwZWNpZmljUm91dGUoXCImL0VudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIik7XG5cdCAqIC8vIFtcIkVudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIl1cblx0ICpcblx0ICogc3BsaXRBcHBTcGVjaWZpY1JvdXRlKFwiJi9FbnRpdHkoJ2FiYycpL05leHRFbnRpdHkoJ3h5eicpJi9QcmVmaXgvTmVzdGVkUm91dGVcIik7XG5cdCAqIC8vIFtcIkVudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIiwgXCJQcmVmaXgvTmVzdGVkUm91dGVcIl1cblx0ICogQHBhcmFtIGFwcFNwZWNpZmljUm91dGVcdFRoZSBhcHAtc3BlY2lmaWMgcm91dGUuXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFwcC1zcGVjaWZpYyByb3V0ZSBzZWdtZW50cy5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIHNwbGl0QXBwU3BlY2lmaWNSb3V0ZShhcHBTcGVjaWZpY1JvdXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3Qgcm91dGVTcGxpdCA9IGFwcFNwZWNpZmljUm91dGU/LnNwbGl0KFwiJi9cIikgPz8gW107XG5cdFx0aWYgKCFyb3V0ZVNwbGl0WzBdKSB7XG5cdFx0XHRyb3V0ZVNwbGl0LnNoaWZ0KCk7IC8vIHJlbW92ZSB0aGUgbGVhZGluZyBlbXB0eSBzZWdtZW50ICh0aGUgYXBwLXNwZWNpZmljIHJvdXRlIHN0YXJ0cyB3aXRoIFwiJi9cIilcblx0XHR9XG5cdFx0cmV0dXJuIHJvdXRlU3BsaXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGJhY2sgZXhpdHMgdGhlIHByZXNlbnQgZ3VhcmQgc2V0LlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYmFjayBleGl0cyB0aGUgZ3VhcmRcblx0ICovXG5cdGNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCk6IGJvb2xlYW4ge1xuXHRcdC8vIFdlIHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBpbnN0ZWFkIG9mIEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpIGJlY2F1c2UgdGhlIGxhdHRlclxuXHRcdC8vIHJlcGxhY2VzIGNoYXJhY3RlcnMgaW4gdGhlIFVSTCAoZS5nLiAlMjQgcmVwbGFjZWQgYnkgJCkgYW5kIGl0IGNhdXNlcyBpc3N1ZXMgd2hlbiBjb21wYXJpbmdcblx0XHQvLyB3aXRoIHRoZSBVUkxzIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLmdldEZ1bGxIYXNoKCk7XG5cblx0XHRjb25zdCBzZWdtZW50cyA9IFJvdXRlclByb3h5LnNwbGl0QXBwU3BlY2lmaWNSb3V0ZShzcGxpdEhhc2gpO1xuXG5cdFx0aWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIHRoZXJlIGlzIGEgbmVzdGVkIHJvdXRlIGludm9sdmVkIC0+IGFzc3VtZSB3ZSBhcmUgc3RpbGwgaW5zaWRlIHRoZSBndWFyZFxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhc2ggPSBzZWdtZW50c1swXSA/PyBcIlwiO1xuXG5cdFx0bGV0IHByZXZpb3VzSGFzaDtcblx0XHRpZiAodGhpcy5fb05hdmlnYXRpb25HdWFyZCkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaV0uaGFzaCA9PT0gaGFzaCkge1xuXHRcdFx0XHRcdHByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gIXByZXZpb3VzSGFzaCB8fCAhdGhpcy5jaGVja0hhc2hXaXRoR3VhcmQocHJldmlvdXNIYXNoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGJhY2sgbmF2aWdhdGlvbiB3aWxsIGV4aXQgdGhlIGFwcC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiBiYWNrIGV4aXRzIHRoZSBhcHBcblx0ICovXG5cdGNoZWNrSWZCYWNrRXhpdHNBcHAoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgc3BsaXRIYXNoID0gdGhpcy5nZXRGdWxsSGFzaCgpO1xuXG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBSb3V0ZXJQcm94eS5zcGxpdEFwcFNwZWNpZmljUm91dGUoc3BsaXRIYXNoKTtcblxuXHRcdGlmIChzZWdtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyB0aGVyZSBpcyBhIG5lc3RlZCByb3V0ZSBpbnZvbHZlZCAtPiBhc3N1bWUgd2UgYXJlIHN0aWxsIGluc2lkZSB0aGUgYXBwXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGN1cnJlbnQgaGFzaCBpcyB0aGUgZmlyc3Qgb25lIGluIHRoZSBoaXN0b3J5LCB0aGVuIGEgbmF2YmFjayB3aWxsIGV4aXQgdGhlIGFwcFxuXHRcdGNvbnN0IGhhc2ggPSBzZWdtZW50c1swXSA/PyBcIlwiO1xuXHRcdHJldHVybiB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID4gMCAmJiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbMF0uaGFzaCA9PT0gaGFzaDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGxhc3QgMiBlbnRyaWVzIGluIHRoZSBoaXN0b3J5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGV5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqL1xuXHRjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0KCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIDwgMikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9DdXJyZW50U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdGNvbnN0IG9QcmV2aW91c1N0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAyXTtcblxuXHRcdHJldHVybiBvQ3VycmVudFN0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdID09PSBvUHJldmlvdXNTdGF0ZS5oYXNoLnNwbGl0KFwiP1wiKVswXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXN0b3JlcyB0aGUgZm9jdXMgZm9yIHRoZSBjdXJyZW50IGhhc2gsIGlmIHdlIGNhbiBmaW5kIGl0IGluIHRoZSBoaXN0b3J5LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGZvY3VzIHdhcyBzZXQsIGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdHJlc3RvcmVGb2N1c0ZvckN1cnJlbnRIYXNoKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gcmVtb3ZlQXBwU3RhdGVJbkhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdGNvbnN0IHN0YXRlRm9ySGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5maW5kKChzdGF0ZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHJlbW92ZUFwcFN0YXRlSW5IYXNoKHN0YXRlLmhhc2gpID09PSBjdXJyZW50SGFzaDtcblx0XHR9KTtcblxuXHRcdGxldCBmb2N1c0FwcGxpZWQgPSBmYWxzZTtcblx0XHRpZiAoc3RhdGVGb3JIYXNoPy5mb2N1c0NvbnRyb2xJZCkge1xuXHRcdFx0bGV0IGZvY3VzQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3RhdGVGb3JIYXNoLmZvY3VzQ29udHJvbElkKTtcblx0XHRcdGxldCBmb2N1c0luZm8gPSBzdGF0ZUZvckhhc2guZm9jdXNJbmZvO1xuXHRcdFx0aWYgKCghZm9jdXNDb250cm9sIHx8ICFmb2N1c0NvbnRyb2wuZ2V0Rm9jdXNEb21SZWYoKSkgJiYgc3RhdGVGb3JIYXNoLnNlY29uZGFyeUZvY3VzQ29udHJvbElkKSB7XG5cdFx0XHRcdC8vIFRoZSBjb250cm9sIGZvciBmb2N1cyBpcyBlaXRoZXIgbm90IGZvdW5kIG9yIGlzIG5vdCBkaXNwbGF5ZWQgb24gc2NyZWVuIChubyBmb2N1c0RvbVJlZilcblx0XHRcdFx0Ly8gLS0+IHRyeSB0aGUgc2Vjb25kYXJ5IGNvbnRyb2wgaWYgdGhlcmUncyBvbmVcblx0XHRcdFx0Zm9jdXNDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQpO1xuXHRcdFx0XHRmb2N1c0luZm8gPSBzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNJbmZvO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHQvLyBpZiB0aGUgY29udHJvbCBpcyBhIGJ1c3kgdGFibGUsIHdlIGRvbid0IHdhbnQgdG8gZm9jdXMgaXQuXG5cdFx0XHRcdC8vIHRhYmxlcyBoYXZlIHRoZWlyIG93biBoYW5kbGluZyB0byByZXN0b3JlIGZvY3VzLCBzbyB3ZSBkb24ndCB3YW50IHRvIGludGVyZmVyZSB3aXRoIHRoYXRcblx0XHRcdFx0Zm9jdXNDb250cm9sPy5nZXRQYXJlbnQoKT8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgJiZcblx0XHRcdFx0KGZvY3VzQ29udHJvbCBhcyBNVGFibGUgfCBVSVRhYmxlKS5nZXRCdXN5KClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRmb2N1c0NvbnRyb2w/LmZvY3VzKGZvY3VzSW5mbyk7XG5cdFx0XHRmb2N1c0FwcGxpZWQgPSBmb2N1c0NvbnRyb2wgIT09IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm9jdXNBcHBsaWVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN0b3JlcyB0aGUgSUQgb2YgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGNvbnRyb2wgaW4gdGhlIGhpc3RvcnkgZm9yIHRoZSBjdXJyZW50IGhhc2guXG5cdCAqXG5cdCAqL1xuXHRwcml2YXRlIHN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2goKTogdm9pZCB7XG5cdFx0Y29uc3QgY3VycmVudEhhc2ggPSByZW1vdmVBcHBTdGF0ZUluSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0Y29uc3Qgc3RhdGVGb3JIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LmZpbmQoKHN0YXRlKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc3RhdGUuaGFzaCkgPT09IGN1cnJlbnRIYXNoO1xuXHRcdH0pO1xuXHRcdGlmIChzdGF0ZUZvckhhc2gpIHtcblx0XHRcdGNvbnN0IGZvY3VzQ29udHJvbCA9IEVsZW1lbnQuZ2V0QWN0aXZlRWxlbWVudCgpO1xuXHRcdFx0c3RhdGVGb3JIYXNoLmZvY3VzQ29udHJvbElkID0gZm9jdXNDb250cm9sPy5nZXRJZCgpO1xuXHRcdFx0aWYgKGZvY3VzQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUaGUgc2Vjb25kYXJ5IGZvY3VzIGNvbnRyb2wgaXMgdGhlIHBhcmVudCB0YWJsZSBpZiB0aGVyZSdzIG9uZVxuXHRcdFx0XHRsZXQgcGFyZW50VGFibGUgPSBmb2N1c0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdHdoaWxlIChwYXJlbnRUYWJsZSAmJiAhcGFyZW50VGFibGUuaXNBPFVJVGFibGU+KFwic2FwLnVpLnRhYmxlLlRhYmxlXCIpICYmICFwYXJlbnRUYWJsZS5pc0E8TVRhYmxlPihcInNhcC5tLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0cGFyZW50VGFibGUgPSBwYXJlbnRUYWJsZS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQgPSBwYXJlbnRUYWJsZT8uZ2V0SWQoKTtcblx0XHRcdFx0c3RhdGVGb3JIYXNoLnNlY29uZGFyeUZvY3VzSW5mbyA9IHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9O1xuXHRcdFx0fVxuXHRcdFx0c3RhdGVGb3JIYXNoLmZvY3VzSW5mbyA9IGZvY3VzQ29udHJvbD8uZ2V0Rm9jdXNJbmZvKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmRzIGEgbGF5b3V0IHZhbHVlIGZvciBhIGhhc2ggaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEBwYXJhbSBoYXNoIFRoZSBoYXNoIHRvIGxvb2sgZm9yIGluIHRoZSBoaXN0b3J5LlxuXHQgKiBAcmV0dXJucyBBIGxheW91dCB2YWx1ZSBpZiBpdCBjb3VsZCBiZSBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZS5cblx0ICovXG5cdGZpbmRMYXlvdXRGb3JIYXNoKGhhc2g6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCF0aGlzLmZjbEVuYWJsZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIGFsbCBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gdGhlIGhhc2hcblx0XHRjb25zdCBoYXNoTm9QYXJhbSA9IGhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0Ly8gTG9vayBmb3IgdGhlIHN0YXRlIGJhY2t3YXJkcywgc28gdGhhdCB3ZSBmaW5kIHRoZSBsYXN0IHN0YXRlIGluIHRoZSBoaXN0b3J5IChlLmcuIGlmIHdlIGhhdmUgMiBzdGF0ZXMgd2l0aCB0aGUgc2FtZSBoYXNoIGJ1dCAyIGRpZmZlcmVudCBsYXlvdXRzKVxuXHRcdGxldCB0YXJnZXRTdGF0ZTogUm91dGVyU3RhdGUgfCB1bmRlZmluZWQ7XG5cdFx0Zm9yIChsZXQgaW5kZXggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaW5kZXggPj0gMCAmJiB0YXJnZXRTdGF0ZSA9PT0gdW5kZWZpbmVkOyBpbmRleC0tKSB7XG5cdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5W2luZGV4XS5oYXNoLnNwbGl0KFwiP1wiKVswXSA9PT0gaGFzaE5vUGFyYW0pIHtcblx0XHRcdFx0dGFyZ2V0U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaW5kZXhdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXRTdGF0ZT8uc0xheW91dDtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXJQcm94eTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7RUFjQSxNQUFNQSxTQUFTLEdBQUc7SUFDakJDLEtBQUssRUFBRSxDQUFDO0lBQ1JDLFVBQVUsRUFBRSxDQUFDO0lBQ2JDLFFBQVEsRUFBRSxDQUFDO0lBQ1hDLFNBQVMsRUFBRTtFQUNaLENBQUM7RUFDRCxNQUFNQyxhQUFhLEdBQUc7SUFDckJDLFdBQVcsRUFBRSxRQUFRO0lBQ3JCQyxjQUFjLEVBQUU7RUFDakIsQ0FBQztFQXdCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQyxtQkFBbUJBLENBQUNDLFVBQWtCLEVBQUVDLFVBQW1CLEVBQW1CO0lBQ3RGLE9BQU87TUFDTkMsVUFB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
928
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnVtU3RhdGUiLCJFUVVBTCIsIkNPTVBBVElCTEUiLCJBTkNFU1RPUiIsIkRJRkZFUkVOVCIsImVudW1VUkxQYXJhbXMiLCJMQVlPVVRQQVJBTSIsIklBUFBTVEFURVBBUkFNIiwiY3JlYXRlR3VhcmRGcm9tSGFzaCIsInNHdWFyZEhhc2giLCJoYXNoVHJha2VyIiwiX2d1YXJkSGFzaCIsInJlcGxhY2UiLCJoYXNoVHJhY2tlciIsInVuZGVmaW5lZCIsImNoZWNrIiwic0hhc2giLCJpbmRleE9mIiwicmVtb3ZlQXBwU3RhdGVJbkhhc2giLCJSZWdFeHAiLCJSb3V0ZXJQcm94eSIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9jbGFzcyIsIl9CYXNlT2JqZWN0IiwiX3RoaXMiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNhbGwiLCJiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmciLCJiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5IiwiYklzR3VhcmRDcm9zc0FsbG93ZWQiLCJzSUFwcFN0YXRlS2V5IiwiX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvIiwiX2JBcHBseVJlc3RvcmUiLCJfcGF0aE1hcHBpbmdzIiwicmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsImluaXQiLCJvQXBwQ29tcG9uZW50IiwiaXNmY2xFbmFibGVkIiwiZ2V0U2VydmljZSIsInRoZW4iLCJhc3luY0luaXQiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiX2ZuSGFzaEd1YXJkIiwiaGFzaEd1YXJkIiwiYmluZCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJfYkRpc2FibGVPbkhhc2hDaGFuZ2UiLCJfYklnbm9yZVJlc3RvcmUiLCJfYkZvcmNlRm9jdXMiLCJfb1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW5pdFJhdyIsImdldFJvdXRlciIsInJvdXRpbmdIaW50cyIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0Um91dGluZ0hpbnRzIiwid2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uIiwiaGlzdG9yeSIsInJlcGxhY2VTdGF0ZSIsIk9iamVjdCIsImFzc2lnbiIsImZlTGV2ZWwiLCJzdGF0ZSIsImxvY2F0aW9uIiwiZmNsRW5hYmxlZCIsIl9mbkJsb2NraW5nTmF2RmlsdGVyIiwiX2Jsb2NraW5nTmF2aWdhdGlvbkZpbHRlciIsInJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlciIsImRlc3Ryb3kiLCJ1bnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzZXRBcHBTdGF0ZUluSGFzaCIsInNBcHBTdGF0ZUtleSIsInNOZXdIYXNoIiwiaW5jbHVkZXMiLCJmaW5kQXBwU3RhdGVJbkhhc2giLCJhQXBwU3RhdGUiLCJtYXRjaCIsImdldERlY29kZWRXaW5kb3dIYXNoIiwiZGVjb2RlVVJJIiwiaGFzaCIsIm9Sb3V0ZXIiLCJfb1JvdXRlciIsIl9vTWFuYWdlZEhpc3RvcnkiLCJfb05hdmlnYXRpb25HdWFyZCIsInNDdXJyZW50QXBwSGFzaCIsImdldEhhc2giLCJwdXNoIiwiX2V4dHJhY3RTdGF0ZUZyb21IYXNoIiwiYXBwTmFtZSIsImdldEFwcE5hbWVGcm9tSGFzaCIsImdldEZ1bGxIYXNoIiwic3BsaXRIYXNoIiwiYXBwU3BlY2lmaWNSb3V0ZSIsImdldEhhc2hDaGFuZ2VyIiwic2hlbGxQYXJ0IiwiaXNGb2N1c0ZvcmNlZCIsInNldEZvY3VzRm9yY2VkIiwiYkZvcmNlZCIsInJlbW92ZUlBcHBTdGF0ZUtleSIsInJlbW92ZVJlc3RvcmVIaXN0b3J5RmxhZ0Zyb21IYXNoIiwibmF2VG9IYXNoIiwiYlByZXNlcnZlSGlzdG9yeSIsImJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUiLCJiRm9yY2VGb2N1cyIsImJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyIiwic2tpcEhhc2hHdWFyZENoZWNrIiwic3RhcnRzV2l0aCIsInN1YnN0cmluZyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwid2FpdEZvciIsIl9pbnRlcm5hbE5hdlRvSGFzaCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsIm9SZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImNvbmZpcm0iLCJnZXRUZXh0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJvTmV3U3RhdGUiLCJhQ3VycmVudEhhc2hLZXlzIiwiZXh0cmFjdEVudGl0eVNldHNGcm9tSGFzaCIsImtleXMiLCJldmVyeSIsImtleSIsImluZGV4Iiwib0hpc3RvcnlBY3Rpb24iLCJfcHVzaE5ld1N0YXRlIiwic3RvcmVGb2N1c0luZm9Gb3JDdXJyZW50SGFzaCIsIl9yZWJ1aWxkQnJvd3Nlckhpc3RvcnkiLCJyZXN0b3JlSGlzdG9yeSIsInNUYXJnZXRIYXNoIiwiY2hlY2tSZXN0b3JlSGlzdG9yeVdhc1RyaWdnZXJlZCIsInJlc2V0UmVzdG9yZUhpc3RvcnlGbGFnIiwibmF2QmFjayIsInNDdXJyZW50SGFzaCIsInNQcmV2aW91c0hhc2giLCJpIiwiYmFjayIsIm5hdlRvIiwic1JvdXRlTmFtZSIsIm9QYXJhbWV0ZXJzIiwiZ2V0VVJMIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImJJc1N0aWNreU1vZGUiLCJleGl0RnJvbUFwcCIsImJhY2tUb1ByZXZpb3VzQXBwIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5Iiwib0xvY2FsR3VhcmQiLCJpc05hdmlnYXRpb25GaW5hbGl6ZWQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsInJlc29sdmVSb3V0ZU1hdGNoIiwiU3luY2hyb25pemF0aW9uIiwic0hhc2hOb1BhcmFtcyIsInNwbGl0IiwiYVRva2VucyIsIm5hbWVzIiwiZm9yRWFjaCIsInNUb2tlbiIsIm9TdGF0ZSIsInNjcmVlbk1vZGUiLCJhTGF5b3V0Iiwic0xheW91dCIsImJSZWJ1aWxkT25seSIsImJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiIsImxhc3RJbmRleCIsImlQb3BDb3VudCIsInBvcCIsInByZXNlcnZlZCIsIm9MYXN0UmVtb3ZlZEl0ZW0iLCJvVG9wU3RhdGUiLCJfY29tcGFyZUNhY2hlU3RhdGVzIiwic1ByZXZpb3VzSUFwcFN0YXRlS2V5Iiwib0NvbXBhcmlzb25TdGF0ZVJlc3VsdCIsImJIYXNTYW1lSGFzaCIsImZvY3VzQ29udHJvbElkIiwic2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQiLCJmb2N1c0luZm8iLCJzZWNvbmRhcnlGb2N1c0luZm8iLCJ0eXBlIiwic3RlcHMiLCJfZGlzYWJsZUV2ZW50T25IYXNoQ2hhbmdlIiwic3RvcCIsIl9lbmFibGVFdmVudE9uSGFzaENoYW5nZSIsImJJZ25vcmVDdXJyZW50SGFzaCIsImluaXRpYWxpemUiLCJ0aGF0Iiwib1RhcmdldFN0YXRlIiwibmV3TGV2ZWwiLCJyZXBsYWNlQXN5bmMiLCJyZXBsYWNlSGFzaCIsInNldFRpbWVvdXQiLCJiYWNrUmVwbGFjZUFzeW5jIiwiYmFja0FzeW5jIiwic2V0SGFzaCIsImdvIiwiZ2V0TGFzdEhpc3RvcnlFbnRyeSIsInNldFBhdGhNYXBwaW5nIiwibWFwcGluZ3MiLCJmaWx0ZXIiLCJtYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjdXJyZW50QXBwTmFtZSIsImZpbmQiLCJtIiwiZW5jb2RlVVJJIiwiYUhhc2hTcGxpdCIsInNBcHBIYXNoIiwib1N0YXRlMSIsIm9TdGF0ZTIiLCJlcXVhbCIsInBhcmVudE9mIiwic3BsaXRBcHBTcGVjaWZpY1JvdXRlIiwicm91dGVTcGxpdCIsInNoaWZ0IiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJzZWdtZW50cyIsInByZXZpb3VzSGFzaCIsImNoZWNrSWZCYWNrRXhpdHNBcHAiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0Iiwib0N1cnJlbnRTdGF0ZSIsIm9QcmV2aW91c1N0YXRlIiwicmVzdG9yZUZvY3VzRm9yQ3VycmVudEhhc2giLCJjdXJyZW50SGFzaCIsInN0YXRlRm9ySGFzaCIsImZvY3VzQXBwbGllZCIsImZvY3VzQ29udHJvbCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldEZvY3VzRG9tUmVmIiwiZ2V0UGFyZW50IiwiaXNBIiwiZ2V0QnVzeSIsImZvY3VzIiwiZ2V0QWN0aXZlRWxlbWVudCIsImdldElkIiwicGFyZW50VGFibGUiLCJwcmV2ZW50U2Nyb2xsIiwiZ2V0Rm9jdXNJbmZvIiwiZmluZExheW91dEZvckhhc2giLCJoYXNoTm9QYXJhbSIsInRhcmdldFN0YXRlIiwiQmFzZU9iamVjdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiUm91dGVyUHJveHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IFN5bmNocm9uaXphdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TeW5jaHJvbml6YXRpb25cIjtcbmltcG9ydCB0eXBlIHsgSVNoZWxsU2VydmljZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2hlbGxTZXJ2aWNlc0ZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIE1UYWJsZSBmcm9tIFwic2FwL20vVGFibGVcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgVUlUYWJsZSBmcm9tIFwic2FwL3VpL3RhYmxlL1RhYmxlXCI7XG5cbmNvbnN0IGVudW1TdGF0ZSA9IHtcblx0RVFVQUw6IDAsXG5cdENPTVBBVElCTEU6IDEsXG5cdEFOQ0VTVE9SOiAyLFxuXHRESUZGRVJFTlQ6IDNcbn07XG5jb25zdCBlbnVtVVJMUGFyYW1zID0ge1xuXHRMQVlPVVRQQVJBTTogXCJsYXlvdXRcIixcblx0SUFQUFNUQVRFUEFSQU06IFwic2FwLWlhcHAtc3RhdGVcIlxufTtcblxudHlwZSBSb3V0ZXJTdGF0ZSA9IHtcblx0a2V5czogc3RyaW5nW107XG5cdGhhc2g6IHN0cmluZztcblx0cHJlc2VydmVkPzogYm9vbGVhbjtcblx0c0xheW91dD86IHN0cmluZztcblx0c2NyZWVuTW9kZTogbnVtYmVyO1xuXHRmb2N1c0NvbnRyb2xJZD86IHN0cmluZztcblx0c2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQ/OiBzdHJpbmc7XG5cdGZvY3VzSW5mbz86IHtcblx0XHRwcmV2ZW50U2Nyb2xsPzogYm9vbGVhbjtcblx0XHR0YXJnZXRJbmZvPzogdW5rbm93bjtcblx0fTtcblx0c2Vjb25kYXJ5Rm9jdXNJbmZvPzoge1xuXHRcdHByZXZlbnRTY3JvbGw/OiBib29sZWFuO1xuXHR9O1xufTtcblxudHlwZSBPdGhlckhpc3RvcnlBY3Rpb24gPSB7IHR5cGU6IFwiYXBwZW5kXCIgfCBcIm5vbmVcIiB8IFwicmVwbGFjZVwiIH07XG5leHBvcnQgdHlwZSBCYWNrSGlzdG9yeUFjdGlvbiA9IHsgdHlwZTogXCJiYWNrXCIgfCBcImJhY2stcmVwbGFjZVwiOyBzdGVwczogbnVtYmVyIH07XG50eXBlIEh5c3RvcnlBY3Rpb24gPSBCYWNrSGlzdG9yeUFjdGlvbiB8IE90aGVySGlzdG9yeUFjdGlvbjtcblxudHlwZSBOYXZpZ2F0aW9uR3VhcmQgPSB7IF9ndWFyZEhhc2g6IHN0cmluZzsgaGFzaFRyYWNrZXI6IHN0cmluZyB8IHVuZGVmaW5lZDsgY2hlY2s6IChoYXNoOiBzdHJpbmcpID0+IGJvb2xlYW4gfTtcbi8qKlxuICogQ3JlYXRlcyBhIEhhc2hHdWFyZCBvYmplY3QuXG4gKiBAcGFyYW0gc0d1YXJkSGFzaCBUaGUgaGFzaCB1c2VkIGZvciB0aGUgZ3VhcmQuXG4gKiBAcGFyYW0gW2hhc2hUcmFrZXJdIE9wdGlvbmFsIGhhc2ggdHJhY2tlciB1c2VkIGZvciBhZGRpdGlvbmFsIGd1YXJkIGNoZWNrcy5cbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGhhc2ggZ3VhcmQuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUd1YXJkRnJvbUhhc2goc0d1YXJkSGFzaDogc3RyaW5nLCBoYXNoVHJha2VyPzogc3RyaW5nKTogTmF2aWdhdGlvbkd1YXJkIHtcblx0cmV0dXJuIHtcblx0XHRfZ3VhcmRIYXNoOiBzR3VhcmRIYXNoLnJlcGxhY2UoL1xcP1teP10qJC8sIFwiXCIpLCAvLyBSZW1vdmUgcXVlcnkgcGFydFxuXHRcdGhhc2hUcmFja2VyOiBoYXNoVHJha2VyID8gaGFzaFRyYWtlci5yZXBsYWNlKC9cXD9bXj9dKiQvLCBcIlwiKSA6IHVuZGVmaW5lZCxcblx0XHRjaGVjazogZnVuY3Rpb24gKHNIYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiBzSGFzaC5pbmRleE9mKHRoaXMuX2d1YXJkSGFzaCkgPT09IDAgfHwgKHRoaXMuaGFzaFRyYWNrZXIgPyBzSGFzaC5pbmRleE9mKHRoaXMuaGFzaFRyYWNrZXIpID09PSAwIDogZmFsc2UpO1xuXHRcdH1cblx0fTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGhhc2ggd2l0aG91dCBpdHMgaUFwcFN0YXRlIHBhcnQuXG4gKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2hcbiAqIEByZXR1cm5zIFRoZSBoYXNoIHdpdGhvdXQgdGhlIGlBcHBTdGF0ZVxuICovXG5mdW5jdGlvbiByZW1vdmVBcHBTdGF0ZUluSGFzaChzSGFzaDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHNIYXNoLnJlcGxhY2UobmV3IFJlZ0V4cChgWyY/XSoke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PVteJl0qYCksIFwiXCIpO1xufVxuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eVwiKVxuY2xhc3MgUm91dGVyUHJveHkgZXh0ZW5kcyBCYXNlT2JqZWN0IHtcblx0YklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cblx0YklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSA9IGZhbHNlO1xuXG5cdGJJc0d1YXJkQ3Jvc3NBbGxvd2VkID0gZmFsc2U7XG5cblx0c0lBcHBTdGF0ZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0X29TaGVsbFNlcnZpY2VzITogSVNoZWxsU2VydmljZXM7XG5cblx0ZmNsRW5hYmxlZCE6IGJvb2xlYW47XG5cblx0X2ZuQmxvY2tpbmdOYXZGaWx0ZXIhOiBGdW5jdGlvbjtcblxuXHRfZm5IYXNoR3VhcmQhOiAodGhpczogV2luZG93LCBwb3BTdGF0ZUV2ZW50OiBQb3BTdGF0ZUV2ZW50KSA9PiB1bmtub3duO1xuXG5cdF9iRGlzYWJsZU9uSGFzaENoYW5nZSE6IGJvb2xlYW47XG5cblx0X2JJZ25vcmVSZXN0b3JlITogYm9vbGVhbjtcblxuXHRfYkZvcmNlRm9jdXMhOiBib29sZWFuO1xuXG5cdF9vUm91dGVyITogUm91dGVyO1xuXG5cdF9vTWFuYWdlZEhpc3RvcnkhOiBSb3V0ZXJTdGF0ZVtdO1xuXG5cdF9vTmF2aWdhdGlvbkd1YXJkITogTmF2aWdhdGlvbkd1YXJkIHwgbnVsbDtcblxuXHRvUmVzb3VyY2VCdW5kbGU/OiBSZXNvdXJjZUJ1bmRsZTtcblxuXHRfb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24/OiBTeW5jaHJvbml6YXRpb247XG5cblx0X2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvID0gZmFsc2U7XG5cblx0X2JBcHBseVJlc3RvcmUgPSBmYWxzZTtcblxuXHRfcGF0aE1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdHJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gZmFsc2U7XG5cblx0cm91dGluZ0hpbnRzPzogUmVjb3JkPHN0cmluZywgeyBwYXJlbnRPZjogc3RyaW5nW10gfT47XG5cblx0YXBwTmFtZSE6IHN0cmluZztcblxuXHRpbml0KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gU2F2ZSB0aGUgbmFtZSBvZiB0aGUgYXBwIChpbmNsdWRpbmcgc3RhcnR1cCBwYXJhbWV0ZXJzKSBmb3IgcmVidWlsZGluZyBmdWxsIGhhc2hlcyBsYXRlclxuXHRcdG9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwic2hlbGxTZXJ2aWNlc1wiKVxuXHRcdFx0LnRoZW4oKCkgPT4gdGhpcy5hc3luY0luaXQob0FwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkKSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgc2hlbGwgc2VydmljZXNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0XHR0aGlzLl9mbkhhc2hHdWFyZCA9IHRoaXMuaGFzaEd1YXJkLmJpbmQodGhpcyk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCB0aGlzLl9mbkhhc2hHdWFyZCk7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9iSWdub3JlUmVzdG9yZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JGb3JjZUZvY3VzID0gdHJ1ZTsgLy8gVHJpZ2dlciB0aGUgZm9jdXMgbWVjaGFuaXNtIGZvciB0aGUgZmlyc3QgdmlldyBkaXNwbGF5ZWQgYnkgdGhlIGFwcFxuXHR9XG5cblx0YXN5bmNJbml0KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaXNmY2xFbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5fb1NoZWxsU2VydmljZXMgPSBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKTtcblx0XHR0aGlzLmluaXRSYXcob0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKSk7XG5cdFx0dGhpcy5yb3V0aW5nSGludHMgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0Um91dGluZ0hpbnRzKCk7XG5cdFx0Ly8gV2Ugd2FudCB0byB3YWl0IHVudGlsIHRoZSBpbml0aWFsIHJvdXRlTWF0Y2hlZCBpcyBkb25lIGJlZm9yZSBkb2luZyBhbnkgbmF2aWdhdGlvblxuXHRcdHRoaXMud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cblx0XHQvLyBTZXQgZmVMZXZlbD0wIGZvciB0aGUgZmlyc3QgQXBwbGljYXRpb24gcGFnZSBpbiB0aGUgaGlzdG9yeVxuXHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuXHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZlTGV2ZWw6IDBcblx0XHRcdFx0fSxcblx0XHRcdFx0aGlzdG9yeS5zdGF0ZVxuXHRcdFx0KSxcblx0XHRcdFwiXCIsXG5cdFx0XHR3aW5kb3cubG9jYXRpb24gYXMgdW5rbm93biBhcyBzdHJpbmdcblx0XHQpO1xuXHRcdHRoaXMuZmNsRW5hYmxlZCA9IGlzZmNsRW5hYmxlZDtcblxuXHRcdHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIgPSB0aGlzLl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIuYmluZCh0aGlzKTtcblx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcy5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdH1cblxuXHRkZXN0cm95KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9vU2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMudW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdFx0fVxuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYW4gaUFwcFN0YXRlIGluc2lkZSBhIGhhc2ggKG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSkuXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaFxuXHQgKiBAcGFyYW0gc0FwcFN0YXRlS2V5IFRoZSBpQXBwU3RhdGUgdG8gYWRkXG5cdCAqIEByZXR1cm5zIFRoZSBoYXNoIHdpdGggdGhlIGFwcCBzdGF0ZVxuXHQgKi9cblx0c2V0QXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZywgc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCBzTmV3SGFzaDogc3RyaW5nO1xuXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKGVudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU0pKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGFscmVhZHkgYW4gaUFwcFN0YXRlIHBhcmFtZXRlciBpbiB0aGUgaGFzaCwgcmVwbGFjZSBpdFxuXHRcdFx0c05ld0hhc2ggPSBzSGFzaC5yZXBsYWNlKFxuXHRcdFx0XHRuZXcgUmVnRXhwKGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PVteJl0qYCksXG5cdFx0XHRcdGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PSR7c0FwcFN0YXRlS2V5fWBcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEFkZCB0aGUgaUFwcFN0YXRlIHBhcmFtZXRlciBpbiB0aGUgaGFzaFxuXHRcdFx0aWYgKCFzSGFzaC5pbmNsdWRlcyhcIj9cIikpIHtcblx0XHRcdFx0c05ld0hhc2ggPSBgJHtzSGFzaH0/YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNOZXdIYXNoID0gYCR7c0hhc2h9JmA7XG5cdFx0XHR9XG5cdFx0XHRzTmV3SGFzaCArPSBgJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT0ke3NBcHBTdGF0ZUtleX1gO1xuXHRcdH1cblxuXHRcdHJldHVybiBzTmV3SGFzaDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBpQXBwU3RhdGUgcGFydCBmcm9tIGEgaGFzaCAob3IgbnVsbCBpZiBub3QgZm91bmQpLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2hcblx0ICogQHJldHVybnMgVGhlIGlBcHBTdGF0ZSBwYXJ0IG9mIHRoZSBoYXNoXG5cdCAqL1xuXHRmaW5kQXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRcdGNvbnN0IGFBcHBTdGF0ZSA9IHNIYXNoLm1hdGNoKG5ldyBSZWdFeHAoYFxcXFw/Lioke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PShbXiZdKilgKSk7XG5cdFx0cmV0dXJuIGFBcHBTdGF0ZSAmJiBhQXBwU3RhdGUubGVuZ3RoID4gMSA/IGFBcHBTdGF0ZVsxXSA6IG51bGw7XG5cdH1cblxuXHRwcml2YXRlIGdldERlY29kZWRXaW5kb3dIYXNoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGRlY29kZVVSSSh3aW5kb3cubG9jYXRpb24uaGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogUmF3IGluaXRpYWxpemF0aW9uIChmb3IgdW5pdCB0ZXN0cykuXG5cdCAqIEBwYXJhbSBvUm91dGVyIFRoZSByb3V0ZXIgdXNlZCBieSB0aGlzIHByb3h5XG5cdCAqL1xuXHRpbml0UmF3KG9Sb3V0ZXI6IFJvdXRlcik6IHZvaWQge1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSBvUm91dGVyO1xuXHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeSA9IFtdO1xuXHRcdHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQgPSBudWxsO1xuXG5cdFx0Y29uc3Qgc0N1cnJlbnRBcHBIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG5cdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2godGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0N1cnJlbnRBcHBIYXNoKSk7XG5cblx0XHR0aGlzLmFwcE5hbWUgPSB0aGlzLmdldEFwcE5hbWVGcm9tSGFzaCh0aGlzLmdldERlY29kZWRXaW5kb3dIYXNoKCkpO1xuXG5cdFx0Ly8gU2V0IHRoZSBpQXBwU3RhdGUgaWYgdGhlIGluaXRpYWwgaGFzaCBjb250YWlucyBvbmVcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSB0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChzQ3VycmVudEFwcEhhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiB0aGUgZnVsbCBhcHAtc3BlY2lmaWMgaGFzaCBwYXJ0IGZyb20gd2luZG93LmxvY2F0aW9uLmhhc2guXG5cdCAqXG5cdCAqIENvbXBhcmVkIHRvIHtAbGluayBnZXRIYXNofSB0aGlzIGZ1bmN0aW9uIGluY2x1ZGVzIHN1Yi1yb3V0ZXMgb2YgbmVzdGVkIGNvbXBvbmVudHMuXG5cdCAqIEByZXR1cm5zIFRoZSBhcHAtc3BlY2lmaWMgaGFzaCBwYXJ0IChpLmUuLCB3aXRob3V0IHRoZSBzaGVsbCBwYXJ0KSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vbmUuXG5cdCAqL1xuXHRnZXRGdWxsSGFzaCgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNwbGl0SGFzaCA9IHRoaXMuX29TaGVsbFNlcnZpY2VzLnNwbGl0SGFzaCh0aGlzLmdldERlY29kZWRXaW5kb3dIYXNoKCkpO1xuXG5cdFx0aWYgKFwiYXBwU3BlY2lmaWNSb3V0ZVwiIGluIHNwbGl0SGFzaCkge1xuXHRcdFx0cmV0dXJuIHNwbGl0SGFzaC5hcHBTcGVjaWZpY1JvdXRlPy5yZXBsYWNlKC9eJlxcLy8sIFwiXCIpID8/IFwiXCI7IC8vIHJlbW92ZSB0aGUgbGVhZGluZyBcIiYvXCJcblx0XHR9XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRnZXRIYXNoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkgPz8gXCJcIjtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRBcHBOYW1lRnJvbUhhc2goaGFzaDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLl9vU2hlbGxTZXJ2aWNlcz8uc3BsaXRIYXNoKGhhc2gpIGFzIHsgc2hlbGxQYXJ0OiBzdHJpbmc7IGFwcFNwZWNpZmljUm91dGU6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXHRcdHJldHVybiBzcGxpdEhhc2g/LnNoZWxsUGFydCA/PyBcIlwiO1xuXHR9XG5cblx0aXNGb2N1c0ZvcmNlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fYkZvcmNlRm9jdXM7XG5cdH1cblxuXHRzZXRGb2N1c0ZvcmNlZChiRm9yY2VkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSBiRm9yY2VkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgdmFyaWFibGUgc0lBcHBTdGF0ZUtleS5cblx0ICpcblx0ICovXG5cdHJlbW92ZUlBcHBTdGF0ZUtleSgpOiB2b2lkIHtcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSBudWxsO1xuXHR9XG5cblx0cHJpdmF0ZSByZW1vdmVSZXN0b3JlSGlzdG9yeUZsYWdGcm9tSGFzaChoYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBoYXNoLnJlcGxhY2UoXCJyZXN0b3JlSGlzdG9yeT10cnVlJlwiLCBcIlwiKS5yZXBsYWNlKC9bPyZdcmVzdG9yZUhpc3Rvcnk9dHJ1ZS8sIFwiXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGhhc2guXG5cdCAqIEBwYXJhbSBzSGFzaCBIYXNoIHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBJZiBzZXQgdG8gdHJ1ZSwgbm9uLWFuY2VzdG9yIGVudHJpZXMgaW4gaGlzdG9yeSB3aWxsIGJlIHJldGFpbmVkXG5cdCAqIEBwYXJhbSBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlIElmIHNldCB0byB0cnVlLCBjYWNoZSBwcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGlzIGRpc2FibGVkIGZvciB0aGUgY3VycmVudCBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBiRm9yY2VGb2N1cyBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGxvZ2ljIHRvIHNldCB0aGUgZm9jdXMgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWQgd2lsbCBiZSB0cmlnZ2VyZWQgKG9uUGFnZVJlYWR5KVxuXHQgKiBAcGFyYW0gYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIgSWYgbm90IHNldCB0byBmYWxzZSwgdGhlIGJhY2sgbmF2aWdhdGlvbiBpcyBzZXQgdG8gdW5kZWZpbmVkXG5cdCAqIEBwYXJhbSBza2lwSGFzaEd1YXJkQ2hlY2tcblx0ICogQHJldHVybnMgUHJvbWlzZSAocmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWQpIHRoYXQgcmV0dXJucyAndHJ1ZScgaWYgYSBuYXZpZ2F0aW9uIHRvb2sgcGxhY2UsICdmYWxzZScgaWYgdGhlIG5hdmlnYXRpb24gZGlkbid0IGhhcHBlblxuXHQgKi9cblx0YXN5bmMgbmF2VG9IYXNoKFxuXHRcdHNIYXNoOiBzdHJpbmcsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0YkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZT86IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuLFxuXHRcdGJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyPzogYm9vbGVhbixcblx0XHRza2lwSGFzaEd1YXJkQ2hlY2s/OiBib29sZWFuXG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHNIYXNoID0gc0hhc2guc3RhcnRzV2l0aChcIi9cIikgPyBzSGFzaC5zdWJzdHJpbmcoMSkgOiBzSGFzaDtcblx0XHRpZiAoYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIgIT09IGZhbHNlKSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9vU2hlbGxTZXJ2aWNlcy5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdH1cblx0XHRzSGFzaCA9IHRoaXMucmVtb3ZlUmVzdG9yZUhpc3RvcnlGbGFnRnJvbUhhc2goc0hhc2gpO1xuXHRcdGlmICh0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uLndhaXRGb3IoKS50aGVuKGFzeW5jICgpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9pbnRlcm5hbE5hdlRvSGFzaChzSGFzaCwgYlByZXNlcnZlSGlzdG9yeSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSwgYkZvcmNlRm9jdXMsIHNraXBIYXNoR3VhcmRDaGVjayk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvKSB7XG5cdFx0XHRcdHRoaXMud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5faW50ZXJuYWxOYXZUb0hhc2goc0hhc2gsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUsIGJGb3JjZUZvY3VzLCBza2lwSGFzaEd1YXJkQ2hlY2spO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIF9pbnRlcm5hbE5hdlRvSGFzaChcblx0XHRzSGFzaDogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuLFxuXHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhbixcblx0XHRza2lwSGFzaEd1YXJkQ2hlY2s/OiBib29sZWFuXG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIEFkZCB0aGUgYXBwIHN0YXRlIGluIHRoZSBoYXNoIGlmIG5lZWRlZFxuXHRcdGlmICh0aGlzLmZjbEVuYWJsZWQgJiYgdGhpcy5zSUFwcFN0YXRlS2V5ICYmICF0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChzSGFzaCkpIHtcblx0XHRcdHNIYXNoID0gdGhpcy5zZXRBcHBTdGF0ZUluSGFzaChzSGFzaCwgdGhpcy5zSUFwcFN0YXRlS2V5KTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNIYXNoKSAmJiAhKHNraXBIYXNoR3VhcmRDaGVjayA/PyBmYWxzZSkpIHtcblx0XHRcdGlmICghdGhpcy5vUmVzb3VyY2VCdW5kbGUpIHtcblx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSBoYXZlIHRvIHVzZSBhIGNvbmZpcm0gaGVyZSBmb3IgVUkgY29uc2lzdGVuY3kgcmVhc29ucywgYXMgd2l0aCBzb21lIHNjZW5hcmlvc1xuXHRcdFx0Ly8gaW4gdGhlIEVkaXRGbG93IHdlIHJlbHkgb24gYSBVSTUgbWVjaGFuaXNtIHRoYXQgZGlzcGxheXMgYSBjb25maXJtIGRpYWxvZy5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hbGVydFxuXHRcdFx0aWYgKCFjb25maXJtKHRoaXMub1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1JPVVRFUl9QUk9YWV9TQVBGRV9FWElUX05PVFNBVkVEX01FU1NBR0VcIikpKSB7XG5cdFx0XHRcdC8vIFRoZSB1c2VyIGNsaWNrZWQgb24gQ2FuY2VsIC0tPiBjYW5jZWwgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEluIGNhc2UgdGhlIG5hdmlnYXRpb24gd2lsbCBjYXVzZSBhIG5ldyB2aWV3IHRvIGJlIGRpc3BsYXllZCwgd2UgZm9yY2UgdGhlIGZvY3VzXG5cdFx0Ly8gSS5lLiBpZiB0aGUga2V5cyBmb3IgdGhlIGhhc2ggd2UncmUgbmF2aWdhdGluZyB0byBpcyBhIHN1cGVyc2V0IG9mIHRoZSBjdXJyZW50IGhhc2gga2V5cy5cblx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaCk7XG5cdFx0aWYgKCF0aGlzLl9iRm9yY2VGb2N1cykge1xuXHRcdFx0Ly8gSWYgdGhlIGZvY3VzIHdhcyBhbHJlYWR5IGZvcmNlZCwga2VlcCBpdFxuXHRcdFx0Y29uc3QgYUN1cnJlbnRIYXNoS2V5cyA9IFJvdXRlclByb3h5LmV4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdFx0dGhpcy5fYkZvcmNlRm9jdXMgPVxuXHRcdFx0XHRiRm9yY2VGb2N1cyB8fFxuXHRcdFx0XHQoYUN1cnJlbnRIYXNoS2V5cy5sZW5ndGggPCBvTmV3U3RhdGUua2V5cy5sZW5ndGggJiZcblx0XHRcdFx0XHRhQ3VycmVudEhhc2hLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXk6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGtleSA9PT0gb05ld1N0YXRlLmtleXNbaW5kZXhdO1xuXHRcdFx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHRjb25zdCBvSGlzdG9yeUFjdGlvbiA9IHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlKTtcblx0XHR0aGlzLnN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2goKTtcblxuXHRcdHJldHVybiB0aGlzLl9yZWJ1aWxkQnJvd3Nlckhpc3Rvcnkob0hpc3RvcnlBY3Rpb24sIGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhcnMgYnJvd3NlciBoaXN0b3J5IGlmIGVudHJpZXMgaGF2ZSBiZWVuIGFkZGVkIHdpdGhvdXQgdXNpbmcgdGhlIFJvdXRlclByb3h5LlxuXHQgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBoaXN0b3J5IGFjY29yZGluZ2x5LlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgaGlzdG9yeSBpcyByZWJ1aWx0XG5cdCAqL1xuXHRhc3luYyByZXN0b3JlSGlzdG9yeSgpOiBQcm9taXNlPHZvaWQgfCBib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX2JBcHBseVJlc3RvcmUpIHtcblx0XHRcdHRoaXMuX2JBcHBseVJlc3RvcmUgPSBmYWxzZTtcblx0XHRcdGxldCBzVGFyZ2V0SGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdFx0c1RhcmdldEhhc2ggPSB0aGlzLnJlbW92ZVJlc3RvcmVIaXN0b3J5RmxhZ0Zyb21IYXNoKHNUYXJnZXRIYXNoKTtcblx0XHRcdGNvbnN0IG9OZXdTdGF0ZSA9IHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNUYXJnZXRIYXNoKTtcblxuXHRcdFx0Y29uc3Qgb0hpc3RvcnlBY3Rpb24gPSB0aGlzLl9wdXNoTmV3U3RhdGUob05ld1N0YXRlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG5cblx0XHRcdHRoaXMucmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIFJlc3RvcmVIaXN0b3J5IGhhcyBiZWVuIHRyaWdnZXJlZCBvbiB0aGUgUm91dGVyUHJveHkuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgaXQgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRjaGVja1Jlc3RvcmVIaXN0b3J5V2FzVHJpZ2dlcmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgZmxhZyB0aGF0IHNheXMgaWYgUmVzdG9yZUhpc3RvcnkgaGFzIGJlZW4gdHJpZ2dlcmVkIG9uIHRoZSBSb3V0ZXJQcm94eS5cblx0ICovXG5cdHJlc2V0UmVzdG9yZUhpc3RvcnlGbGFnKCk6IHZvaWQge1xuXHRcdHRoaXMucmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiB0aGUgaGlzdG9yeS5cblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqL1xuXHRhc3luYyBuYXZCYWNrKCk6IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+IHtcblx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRsZXQgc1ByZXZpb3VzSGFzaDtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSBjdXJyZW50IGhhc2ggaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGZvciAobGV0IGkgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpXS5oYXNoID09PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0c1ByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNQcmV2aW91c0hhc2gpIHtcblx0XHRcdHJldHVybiB0aGlzLm5hdlRvSGFzaChzUHJldmlvdXNIYXNoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCBhIHByZXZpb3VzIGhhc2ggaW4gaGlzdG9yeVxuXHRcdFx0Ly8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgdHJhbnNpZW50IGhhc2ggaW4gYSBjcmVhdGUgYXBwLCBhbmRcblx0XHRcdC8vIGluIHRoYXQgY2FzZSBoaXN0b3J5LmJhY2sgd291bGQgZ28gYmFjayB0byB0aGUgRkxQXG5cdFx0XHR3aW5kb3cuaGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHJvdXRlIHdpdGggcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIHNSb3V0ZU5hbWUgVGhlIHJvdXRlIG5hbWUgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBvUGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gb1BhcmFtZXRlcnMubm9QcmVzZXJ2YXRpb25DYWNoZVxuXHQgKiBAcGFyYW0gb1BhcmFtZXRlcnMuYklzU3RpY2t5TW9kZVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdGFzeW5jIG5hdlRvKHNSb3V0ZU5hbWU6IHN0cmluZywgb1BhcmFtZXRlcnM/OiB7IG5vUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuOyBiSXNTdGlja3lNb2RlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyLmdldFVSTChzUm91dGVOYW1lLCBvUGFyYW1ldGVycyk7XG5cdFx0cmV0dXJuIHRoaXMubmF2VG9IYXNoKHNIYXNoISwgZmFsc2UsIG9QYXJhbWV0ZXJzPy5ub1ByZXNlcnZhdGlvbkNhY2hlLCBmYWxzZSwgIW9QYXJhbWV0ZXJzPy5iSXNTdGlja3lNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGl0cyB0aGUgY3VycmVudCBhcHAgYnkgbmF2aWdhdGluZyBiYWNrXG5cdCAqIHRvIHRoZSBwcmV2aW91cyBhcHAgKGlmIGFueSkgb3IgdGhlIEZMUC5cblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gd2UgZXhpdCB0aGUgYXBwXG5cdCAqL1xuXHRleGl0RnJvbUFwcCgpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5fb1NoZWxsU2VydmljZXMuYmFja1RvUHJldmlvdXNBcHAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGhhc2ggY2FuIGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBjdXJyZW50IHN0YXRlXG5cdCAqIGkuZS4gaWYgdGhlIGhhc2ggaXMgZXF1YWwsIGNvbXBhdGlibGUgb3IgYW4gYW5jZXN0b3Igb2YgdGhlIGN1cnJlbnQgc3RhdGUuXG5cdCAqIEBwYXJhbSBzSGFzaCBgdHJ1ZWAgaWYgdGhlcmUgaXMgYW4gaW1wYWN0XG5cdCAqIEByZXR1cm5zIElmIHRoZXJlIGlzIGFuIGltcGFjdFxuXHQgKi9cblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNIYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRpZiAoc0hhc2hbMF0gPT09IFwiL1wiKSB7XG5cdFx0XHRzSGFzaCA9IHNIYXNoLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0xvY2FsR3VhcmQgPSBjcmVhdGVHdWFyZEZyb21IYXNoKHNIYXNoKTtcblx0XHRyZXR1cm4gb0xvY2FsR3VhcmQuY2hlY2sodGhpcy5nZXRIYXNoKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cblx0ICogQHJldHVybnMgYGZhbHNlYCBpZiBhIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGluIHRoZSBSb3V0ZXJQcm94eSBhbmQgaXMgbm90IHlldCBmaW5hbGl6ZWRcblx0ICovXG5cdGlzTmF2aWdhdGlvbkZpbmFsaXplZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gIXRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGxhc3Qgc3RhdGUgYXMgYSBndWFyZC5cblx0ICogRWFjaCBmdXR1cmUgbmF2aWdhdGlvbiB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGlzIGd1YXJkLCBhbmQgYSBjb25maXJtYXRpb24gZGlhbG9nIHdpbGxcblx0ICogYmUgZGlzcGxheWVkIGJlZm9yZSB0aGUgbmF2aWdhdGlvbiBnb2VzIHRvIGFuIGFuY2VzdG9yIG9mIHRoZSBndWFyZC5cblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoIGZvciB0aGUgZ3VhcmQuXG5cdCAqIEBwYXJhbSBbaGFzaFRyYWtlcl0gT3B0aW9uYWwgaGFzaCB0cmFja2VyIHVzZWQgZm9yIGFkZGl0aW9uYWwgZ3VhcmQgY2hlY2tzLlxuXHQgKi9cblx0c2V0TmF2aWdhdGlvbkd1YXJkKHNIYXNoOiBzdHJpbmcsIGhhc2hUcmFrZXI/OiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gY3JlYXRlR3VhcmRGcm9tSGFzaChzSGFzaCwgaGFzaFRyYWtlcik7XG5cdFx0dGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZCA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGVzIHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKi9cblx0ZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpOiB2b2lkIHtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIG5hdmlnYXRpb24gZ3VhcmQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBuYXZpZ2F0aW5nIGd1YXJkIGlzIGF2YWlsYWJsZVxuXHQgKi9cblx0aGFzTmF2aWdhdGlvbkd1YXJkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkICE9PSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRlc3RzIGEgaGFzaCBhZ2FpbnN0IHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gYmUgdGVzdGVkXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBuYXZpZ2F0aW5nIHRvIHRoZSBoYXNoIGRvZXNuJ3QgY3Jvc3MgdGhlIGd1YXJkXG5cdCAqL1xuXHRjaGVja0hhc2hXaXRoR3VhcmQoc0hhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID09PSBudWxsIHx8IHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQuY2hlY2soc0hhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgdXNlciBhbGxvd2VkIHRoZSBuYXZpZ2F0aW9uIGd1YXJkIHRvIGJlIGNyb3NzZWQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGJlZW4gYWxsb3dlZCBieSB0aGUgdXNlclxuXHQgKi9cblx0aXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBY3RpdmF0ZXMgdGhlIHN5bmNocm9uaXphdGlvbiBmb3Igcm91dGVNYXRjaGVkRXZlbnQuXG5cdCAqIFRoZSBuZXh0IE5hdlRvSGFzaCBjYWxsIHdpbGwgY3JlYXRlIGEgU3luY2hyb25pemF0aW9uIG9iamVjdCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWRcblx0ICogYnkgdGhlIGNvcnJlc3BvbmRpbmcgb25Sb3V0ZU1hdGNoZWQgZXZlbnQsIHByZXZlbnRpbmcgYW5vdGhlciBOYXZUb0hhc2ggdG8gaGFwcGVuIGluIHBhcmFsbGVsLlxuXHQgKi9cblx0YWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKCk6IHZvaWQge1xuXHRcdHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvID0gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNvbHZlIHRoZSByb3V0ZU1hdGNoIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIHVubG9ja2luZyBwb3RlbnRpYWwgcGVuZGluZyBOYXZUb0hhc2ggY2FsbHMuXG5cdCAqL1xuXHRyZXNvbHZlUm91dGVNYXRjaCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24pIHtcblx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZXMgc3VyZSBubyBuYXZpZ2F0aW9uIGNhbiBoYXBwZW4gYmVmb3JlIGEgcm91dGVNYXRjaCBoYXBwZW5lZC5cblx0ICovXG5cdHdhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpOiB2b2lkIHtcblx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiA9IG5ldyBTeW5jaHJvbml6YXRpb24oKTtcblx0XHR0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyA9IGZhbHNlO1xuXHR9XG5cblx0c3RhdGljIGV4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2goc0hhc2g6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcblx0XHRpZiAoc0hhc2ggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c0hhc2ggPSBcIlwiO1xuXHRcdH1cblx0XHRjb25zdCBzSGFzaE5vUGFyYW1zID0gc0hhc2guc3BsaXQoXCI/XCIpWzBdOyAvLyByZW1vdmUgcGFyYW1zXG5cdFx0Y29uc3QgYVRva2VucyA9IHNIYXNoTm9QYXJhbXMuc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0YVRva2Vucy5mb3JFYWNoKChzVG9rZW4pID0+IHtcblx0XHRcdGlmIChzVG9rZW4ubGVuZ3RoKSB7XG5cdFx0XHRcdG5hbWVzLnB1c2goc1Rva2VuLnNwbGl0KFwiKFwiKVswXSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gbmFtZXM7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGEgc3RhdGUgZnJvbSBhIGhhc2guXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCB0byBiZSB1c2VkIGFzIGVudHJ5XG5cdCAqIEByZXR1cm5zIFRoZSBzdGF0ZVxuXHQgKi9cblx0X2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNIYXNoOiBzdHJpbmcpOiBSb3V0ZXJTdGF0ZSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBvU3RhdGU6IFJvdXRlclN0YXRlID0ge1xuXHRcdFx0a2V5czogUm91dGVyUHJveHkuZXh0cmFjdEVudGl0eVNldHNGcm9tSGFzaChzSGFzaCksXG5cdFx0XHRoYXNoOiBzSGFzaCxcblx0XHRcdHNjcmVlbk1vZGU6IDAgLy8gd2lsbCBiZSB1cGRhdGVkIGluIGEgc2VjXG5cdFx0fTtcblxuXHRcdC8vIFJldHJpZXZlIGxheW91dCAoaWYgYW55KVxuXHRcdGNvbnN0IGFMYXlvdXQgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKGBcXFxcPy4qJHtlbnVtVVJMUGFyYW1zLkxBWU9VVFBBUkFNfT0oW14mXSopYCkpO1xuXHRcdG9TdGF0ZS5zTGF5b3V0ID0gYUxheW91dCAmJiBhTGF5b3V0Lmxlbmd0aCA+IDEgPyBhTGF5b3V0WzFdIDogdW5kZWZpbmVkO1xuXHRcdGlmIChvU3RhdGUuc0xheW91dCA9PT0gXCJNaWRDb2x1bW5GdWxsU2NyZWVuXCIpIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMTtcblx0XHR9IGVsc2UgaWYgKG9TdGF0ZS5zTGF5b3V0ID09PSBcIkVuZENvbHVtbkZ1bGxTY3JlZW5cIikge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDA7XG5cdFx0fVxuXHRcdHJldHVybiBvU3RhdGU7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIG5ldyBzdGF0ZSBpbnRvIHRoZSBpbnRlcm5hbCBoaXN0b3J5IHN0cnVjdHVyZS5cblx0ICogTWFrZXMgc3VyZSB0aGlzIG5ldyBzdGF0ZSBpcyBhZGRlZCBhZnRlciBhbiBhbmNlc3Rvci5cblx0ICogQWxzbyBzZXRzIHRoZSBpQXBwU3RhdGUga2V5IGluIHRoZSB3aG9sZSBoaXN0b3J5LlxuXHQgKiBAcGFyYW0gb05ld1N0YXRlIFRoZSBuZXcgc3RhdGUgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgd2UncmUgcmVidWlsZGluZyB0aGUgaGlzdG9yeSBhZnRlciBhIHNoZWxsIG1lbnUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBJZiBzZXQgdG8gdHJ1ZSwgbm9uLWFuY2VzdG9yIGVudHJpZXMgaW4gaGlzdG9yeSB3aWxsIGJlIHJldGFpbmVkXG5cdCAqIEBwYXJhbSBiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24gRGlzYWJsZSB0aGUgbWVjaGFuaXNtIHRvIHJldGFpbmVkIG1hcmtlZCBlbnRyaWVzIGluIGNhY2hlXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgc3RhdGVcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfcHVzaE5ld1N0YXRlKFxuXHRcdG9OZXdTdGF0ZTogUm91dGVyU3RhdGUsXG5cdFx0YlJlYnVpbGRPbmx5OiBib29sZWFuLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbj86IGJvb2xlYW5cblx0KTogSHlzdG9yeUFjdGlvbiB7XG5cdFx0Y29uc3Qgc0N1cnJlbnRIYXNoID0gdGhpcy5yZW1vdmVSZXN0b3JlSGlzdG9yeUZsYWdGcm9tSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0bGV0IGxhc3RJbmRleCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxO1xuXHRcdGxldCBpUG9wQ291bnQgPSBiUmVidWlsZE9ubHkgPyAxIDogMDtcblxuXHRcdC8vIDEuIERvIHNvbWUgY2xlYW51cCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5IDogaW4gY2FzZSB0aGUgdXNlciBoYXMgbmF2aWdhdGVkIGJhY2sgaW4gdGhlIGJyb3dzZXIgaGlzdG9yeSwgd2UgbmVlZCB0byByZW1vdmVcblx0XHQvLyB0aGUgc3RhdGVzIGFoZWFkIGluIGhpc3RvcnkgYW5kIG1ha2Ugc3VyZSB0aGUgdG9wIHN0YXRlIGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHBhZ2Vcblx0XHQvLyBXZSBkb24ndCBkbyB0aGF0IHdoZW4gcmVzdG9yaW5nIHRoZSBoaXN0b3J5LCBhcyB0aGUgY3VycmVudCBzdGF0ZSBoYXMgYmVlbiBhZGRlZCBvbiB0b3Agb2YgdGhlIGJyb3dzZXIgaGlzdG9yeVxuXHRcdC8vIGFuZCBpcyBub3QgcmVmbGVjdGVkIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRpZiAoIWJSZWJ1aWxkT25seSkge1xuXHRcdFx0d2hpbGUgKGxhc3RJbmRleCA+PSAwICYmIHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtsYXN0SW5kZXhdLmhhc2ggIT09IHNDdXJyZW50SGFzaCkge1xuXHRcdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucG9wKCk7XG5cdFx0XHRcdGxhc3RJbmRleC0tO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHQvLyBXZSBjb3VsZG4ndCBmaW5kIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBoaXN0b3J5LiBUaGlzIGNhbiBoYXBwZW4gaWYgYSBicm93c2VyIHJlbG9hZFxuXHRcdFx0XHQvLyBoYXBwZW5lZCwgY2F1c2luZyBhIHJlaW5pdGlhbGl6YXRpb24gb2YgdGhlIG1hbmFnZWQgaGlzdG9yeS5cblx0XHRcdFx0Ly8gSW4gdGhhdCBjYXNlLCB3ZSB1c2UgdGhlIGN1cnJlbnQgbG9jYXRpb24gYXMgdGhlIG5ldyBzdGFydGluZyBwb2ludCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wdXNoKHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNDdXJyZW50SGFzaCkpO1xuXHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogMCB9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gMi4gTWFyayB0aGUgdG9wIHN0YXRlIGFzIHByZXNlcnZlZCBpZiByZXF1aXJlZFxuXHRcdGlmIChiUHJlc2VydmVIaXN0b3J5ICYmICFiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24pIHtcblx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV0ucHJlc2VydmVkID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyAzLiBUaGVuIHBvcCBhbGwgc3RhdGVzIHVudGlsIHdlIGZpbmQgYW4gYW5jZXN0b3Igb2YgdGhlIG5ldyBzdGF0ZSwgb3Igd2UgZmluZCBhIHN0YXRlIHRoYXQgbmVlZCB0byBiZSBwcmVzZXJ2ZWRcblx0XHRsZXQgb0xhc3RSZW1vdmVkSXRlbTtcblx0XHR3aGlsZSAodGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IG9Ub3BTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24gfHwgIW9Ub3BTdGF0ZS5wcmVzZXJ2ZWQpICYmXG5cdFx0XHRcdHRoaXMuX2NvbXBhcmVDYWNoZVN0YXRlcyhvVG9wU3RhdGUsIG9OZXdTdGF0ZSkgIT09IGVudW1TdGF0ZS5BTkNFU1RPUlxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoZSB0b3Agc3RhdGUgaXMgbm90IGFuIGFuY2VzdG9yIG9mIG9OZXdTdGF0ZSBhbmQgaXMgbm90IHByZXNlcnZlZCAtLT4gd2UgY2FuIHBvcCBpdFxuXHRcdFx0XHRvTGFzdFJlbW92ZWRJdGVtID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRpUG9wQ291bnQrKztcblx0XHRcdH0gZWxzZSBpZiAob1RvcFN0YXRlLnByZXNlcnZlZCAmJiByZW1vdmVBcHBTdGF0ZUluSGFzaChvVG9wU3RhdGUuaGFzaCkgPT09IHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoKSkge1xuXHRcdFx0XHQvLyBXZSB0cnkgdG8gYWRkIGEgc3RhdGUgdGhhdCBpcyBhbHJlYWR5IGluIGNhY2hlIChkdWUgdG8gcHJlc2VydmVkIGZsYWcpIGJ1dCB3aXRoIGEgZGlmZmVyZW50IGlhcHAtc3RhdGVcblx0XHRcdFx0Ly8gLS0+IHdlIHNob3VsZCBkZWxldGUgdGhlIHByZXZpb3VzIGVudHJ5IChpdCB3aWxsIGJlIGxhdGVyIHJlcGxhY2VkIGJ5IHRoZSBuZXcgb25lKSBhbmQgc3RvcCBwb3BwaW5nXG5cdFx0XHRcdG9MYXN0UmVtb3ZlZEl0ZW0gPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkucG9wKCk7XG5cdFx0XHRcdGlQb3BDb3VudCsrO1xuXHRcdFx0XHRvTmV3U3RhdGUucHJlc2VydmVkID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRicmVhazsgLy8gQW5jZXN0b3Igb3IgcHJlc2VydmVkIHN0YXRlIGZvdW5kIC0tPiB3ZSBzdG9wIHBvcHBpbmcgb3V0IHN0YXRlc1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDQuIGlBcHBTdGF0ZSBtYW5hZ2VtZW50XG5cdFx0dGhpcy5zSUFwcFN0YXRlS2V5ID0gdGhpcy5maW5kQXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gpO1xuXHRcdGlmICghdGhpcy5mY2xFbmFibGVkICYmIG9MYXN0UmVtb3ZlZEl0ZW0pIHtcblx0XHRcdGNvbnN0IHNQcmV2aW91c0lBcHBTdGF0ZUtleSA9IHRoaXMuZmluZEFwcFN0YXRlSW5IYXNoKG9MYXN0UmVtb3ZlZEl0ZW0uaGFzaCk7XG5cdFx0XHRjb25zdCBvQ29tcGFyaXNvblN0YXRlUmVzdWx0ID0gdGhpcy5fY29tcGFyZUNhY2hlU3RhdGVzKG9MYXN0UmVtb3ZlZEl0ZW0sIG9OZXdTdGF0ZSk7XG5cdFx0XHQvLyBpZiBjdXJyZW50IHN0YXRlIGRvZXNuJ3QgY29udGFpbiBhIGktYXBwc3RhdGUgYW5kIHRoaXMgc3RhdGUgc2hvdWxkIHJlcGxhY2UgYSBzdGF0ZSBjb250YWluaW5nIGEgaUFwcFN0YXRlXG5cdFx0XHQvLyB0aGVuIHRoZSBwcmV2aW91cyBpQXBwU3RhdGUgaXMgcHJlc2VydmVkXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCF0aGlzLnNJQXBwU3RhdGVLZXkgJiZcblx0XHRcdFx0c1ByZXZpb3VzSUFwcFN0YXRlS2V5ICYmXG5cdFx0XHRcdChvQ29tcGFyaXNvblN0YXRlUmVzdWx0ID09PSBlbnVtU3RhdGUuRVFVQUwgfHwgb0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9PT0gZW51bVN0YXRlLkNPTVBBVElCTEUpXG5cdFx0XHQpIHtcblx0XHRcdFx0b05ld1N0YXRlLmhhc2ggPSB0aGlzLnNldEFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoLCBzUHJldmlvdXNJQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDUuIE5vdyB3ZSBjYW4gcHVzaCB0aGUgc3RhdGUgYXQgdGhlIHRvcCBvZiB0aGUgaW50ZXJuYWwgaGlzdG9yeVxuXHRcdGNvbnN0IGJIYXNTYW1lSGFzaCA9IG9MYXN0UmVtb3ZlZEl0ZW0gJiYgb05ld1N0YXRlLmhhc2ggPT09IG9MYXN0UmVtb3ZlZEl0ZW0uaGFzaDtcblx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLmhhc2ggIT09IG9OZXdTdGF0ZS5oYXNoKSB7XG5cdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaChvTmV3U3RhdGUpO1xuXHRcdFx0aWYgKG9MYXN0UmVtb3ZlZEl0ZW0gJiYgcmVtb3ZlQXBwU3RhdGVJbkhhc2gob0xhc3RSZW1vdmVkSXRlbS5oYXNoKSA9PT0gcmVtb3ZlQXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gpKSB7XG5cdFx0XHRcdG9OZXdTdGF0ZS5mb2N1c0NvbnRyb2xJZCA9IG9MYXN0UmVtb3ZlZEl0ZW0uZm9jdXNDb250cm9sSWQ7XG5cdFx0XHRcdG9OZXdTdGF0ZS5zZWNvbmRhcnlGb2N1c0NvbnRyb2xJZCA9IG9MYXN0UmVtb3ZlZEl0ZW0uc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQ7XG5cdFx0XHRcdG9OZXdTdGF0ZS5mb2N1c0luZm8gPSBvTGFzdFJlbW92ZWRJdGVtLmZvY3VzSW5mbztcblx0XHRcdFx0b05ld1N0YXRlLnNlY29uZGFyeUZvY3VzSW5mbyA9IG9MYXN0UmVtb3ZlZEl0ZW0uc2Vjb25kYXJ5Rm9jdXNJbmZvO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDYuIERldGVybWluZSB3aGljaCBhY3Rpb25zIHRvIGRvIG9uIHRoZSBoaXN0b3J5XG5cdFx0aWYgKGlQb3BDb3VudCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gc3RhdGUgd2FzIHBvcHBlZCAtLT4gYXBwZW5kXG5cdFx0XHRyZXR1cm4geyB0eXBlOiBcImFwcGVuZFwiIH07XG5cdFx0fSBlbHNlIGlmIChpUG9wQ291bnQgPT09IDEpIHtcblx0XHRcdC8vIE9ubHkgMSBzdGF0ZSB3YXMgcG9wcGVkIC0tPiByZXBsYWNlIGN1cnJlbnQgaGFzaCB1bmxlc3MgaGFzaCBpcyB0aGUgc2FtZSAodGhlbiBub3RoaW5nIHRvIGRvKVxuXHRcdFx0cmV0dXJuIGJIYXNTYW1lSGFzaCA/IHsgdHlwZTogXCJub25lXCIgfSA6IHsgdHlwZTogXCJyZXBsYWNlXCIgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTW9yZSB0aGFuIDEgc3RhdGUgd2FzIHBvcHBlZCAtLT4gZ28gYmFrYyBpbiBoaXN0b3J5IGFuZCByZXBsYWNlIGhhc2ggaWYgbmVjZXNzYXJ5XG5cdFx0XHRyZXR1cm4gYkhhc1NhbWVIYXNoID8geyB0eXBlOiBcImJhY2tcIiwgc3RlcHM6IGlQb3BDb3VudCAtIDEgfSA6IHsgdHlwZTogXCJiYWNrLXJlcGxhY2VcIiwgc3RlcHM6IGlQb3BDb3VudCAtIDEgfTtcblx0XHR9XG5cdH1cblxuXHRfYmxvY2tpbmdOYXZpZ2F0aW9uRmlsdGVyKCk6IFwiQ3VzdG9tXCIgfCBcIkNvbnRpbnVlXCIge1xuXHRcdHJldHVybiB0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA/IFwiQ3VzdG9tXCIgOiBcIkNvbnRpbnVlXCI7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZSB0aGUgcm91dGluZyBieSBjYWxsaW5nIHRoZSByb3V0ZXIgc3RvcCBtZXRob2QuXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2Rpc2FibGVFdmVudE9uSGFzaENoYW5nZSgpOiB2b2lkIHtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IHRydWU7XG5cdFx0dGhpcy5fb1JvdXRlci5zdG9wKCk7XG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlIHRoZSByb3V0aW5nIGJ5IGNhbGxpbmcgdGhlIHJvdXRlciBpbml0aWFsaXplIG1ldGhvZC5cblx0ICogQHBhcmFtIFtiSWdub3JlQ3VycmVudEhhc2hdIElnbm9yZSB0aGUgbGFzdCBoYXNoIGV2ZW50IHRyaWdnZXJlZCBiZWZvcmUgdGhlIHJvdXRlciBoYXMgaW5pdGlhbGl6ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UoYklnbm9yZUN1cnJlbnRIYXNoOiBib29sZWFuIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9vUm91dGVyLmluaXRpYWxpemUoYklnbm9yZUN1cnJlbnRIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTeW5jaHJvbml6ZXMgdGhlIGJyb3dzZXIgaGlzdG9yeSB3aXRoIHRoZSBpbnRlcm5hbCBoaXN0b3J5IG9mIHRoZSByb3V0ZXJQcm94eSwgYW5kIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiBpZiBuZWVkZWQuXG5cdCAqIEBwYXJhbSBvSGlzdG9yeUFjdGlvbiBTcGVjaWZpZXMgdGhlIG5hdmlnYXRpb24gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZFxuXHQgKiBAcGFyYW0gYlJlYnVpbGRPbmx5IGB0cnVlYCBpZiBpbnRlcm5hbCBoaXN0b3J5IGlzIGN1cnJlbnRseSBiZWluZyByZWJ1aWx0XG5cdCAqIEByZXR1cm5zIFByb21pc2UgKHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkKSB0aGF0IHJldHVybnMgJ3RydWUnIGlmIGEgbmF2aWdhdGlvbiB0b29rIHBsYWNlLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZG4ndCBoYXBwZW5cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBfcmVidWlsZEJyb3dzZXJIaXN0b3J5KG9IaXN0b3J5QWN0aW9uOiBIeXN0b3J5QWN0aW9uLCBiUmVidWlsZE9ubHk6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdHRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gdHJ1ZTtcblx0XHRcdGNvbnN0IG9UYXJnZXRTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV0sXG5cdFx0XHRcdG5ld0xldmVsID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7XG5cblx0XHRcdGZ1bmN0aW9uIHJlcGxhY2VBc3luYygpOiB2b2lkIHtcblx0XHRcdFx0aWYgKCFiUmVidWlsZE9ubHkpIHtcblx0XHRcdFx0XHR0aGF0Ll9lbmFibGVFdmVudE9uSGFzaENoYW5nZSh0cnVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCh0aGF0Ll9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkucmVwbGFjZUhhc2ggYXMgRnVuY3Rpb24pKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IG5ld0xldmVsIH0sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiKTtcblxuXHRcdFx0XHRpZiAoYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBUaW1lb3V0IHRvIGxldCAnaGFzaGNoYW5nZScgZXZlbnQgYmUgcHJvY2Vzc2VkIGJlZm9yZSBieSB0aGUgSGFzaENoYW5nZXIsIHNvIHRoYXRcblx0XHRcdFx0XHRcdC8vIG9uUm91dGVNYXRjaGVkIG5vdGlmaWNhdGlvbiBpc24ndCByYWlzZWRcblx0XHRcdFx0XHRcdHRoYXQuX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKHRydWUpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdC8vIEFzeW5jIGNhbGxiYWNrcyB3aGVuIG5hdmlnYXRpbmcgYmFjaywgaW4gb3JkZXIgdG8gbGV0IGFsbCBub3RpZmljYXRpb25zIGFuZCBldmVudHMgZ2V0IHByb2Nlc3NlZFxuXHRcdFx0ZnVuY3Rpb24gYmFja1JlcGxhY2VBc3luYygpOiB2b2lkIHtcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBiYWNrUmVwbGFjZUFzeW5jKTtcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gVGltZW91dCB0byBsZXQgJ2hhc2hjaGFuZ2UnIGV2ZW50IGJlIHByb2Nlc3NlZCBiZWZvcmUgYnkgdGhlIEhhc2hDaGFuZ2VyXG5cdFx0XHRcdFx0cmVwbGFjZUFzeW5jKCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBiYWNrQXN5bmMoKTogdm9pZCB7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja0FzeW5jKTtcblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdHRoYXQuX2JJZ25vcmVSZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0c3dpdGNoIChvSGlzdG9yeUFjdGlvbi50eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJyZXBsYWNlXCI6XG5cdFx0XHRcdFx0Y29uc3QgZm9jdXNJbmZvID0gaGlzdG9yeS5zdGF0ZT8uZm9jdXNJbmZvO1xuXHRcdFx0XHRcdCh0aGF0Ll9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkucmVwbGFjZUhhc2ggYXMgRnVuY3Rpb24pKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShcblx0XHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRmZUxldmVsOiBuZXdMZXZlbCxcblx0XHRcdFx0XHRcdFx0XHRmb2N1c0luZm86IGZvY3VzSW5mb1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRoaXN0b3J5LnN0YXRlXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpOyAvLyBhIG5hdmlnYXRpb24gb2NjdXJyZWRcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiYXBwZW5kXCI6XG5cdFx0XHRcdFx0dGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnNldEhhc2gob1RhcmdldFN0YXRlLmhhc2gpO1xuXHRcdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiBuZXdMZXZlbCB9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIik7XG5cdFx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpOyAvLyBhIG5hdmlnYXRpb24gb2NjdXJyZWRcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiYmFja1wiOlxuXHRcdFx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja0FzeW5jKTtcblx0XHRcdFx0XHRoaXN0b3J5LmdvKC1vSGlzdG9yeUFjdGlvbi5zdGVwcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImJhY2stcmVwbGFjZVwiOlxuXHRcdFx0XHRcdHRoaXMuX2Rpc2FibGVFdmVudE9uSGFzaENoYW5nZSgpO1xuXHRcdFx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja1JlcGxhY2VBc3luYyk7XG5cdFx0XHRcdFx0aGlzdG9yeS5nbygtb0hpc3RvcnlBY3Rpb24uc3RlcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Ly8gTm8gbmF2aWdhdGlvblxuXHRcdFx0XHRcdHRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZShmYWxzZSk7IC8vIG5vIG5hdmlnYXRpb24gLS0+IHJlc29sdmUgdG8gZmFsc2Vcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGdldExhc3RIaXN0b3J5RW50cnkoKTogUm91dGVyU3RhdGUge1xuXHRcdHJldHVybiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHR9XG5cblx0c2V0UGF0aE1hcHBpbmcobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKTogdm9pZCB7XG5cdFx0dGhpcy5fcGF0aE1hcHBpbmdzID0gbWFwcGluZ3MuZmlsdGVyKChtYXBwaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gbWFwcGluZy5vbGRQYXRoICE9PSBtYXBwaW5nLm5ld1BhdGg7XG5cdFx0fSk7XG5cdH1cblxuXHRoYXNoR3VhcmQoKTogdm9pZCB7XG5cdFx0bGV0IHNIYXNoID0gdGhpcy5nZXREZWNvZGVkV2luZG93SGFzaCgpO1xuXHRcdGNvbnN0IGN1cnJlbnRBcHBOYW1lID0gdGhpcy5nZXRBcHBOYW1lRnJvbUhhc2goc0hhc2gpO1xuXHRcdGlmIChjdXJyZW50QXBwTmFtZSAhPSB0aGlzLmFwcE5hbWUpIHtcblx0XHRcdC8vIFdoZW4gZG9pbmcgZXh0ZXJuYWwgbmF2aWdhdGlvbiBpbiBhbm90aGVyIHdpbmRvdywgdGhlIGN1cnJlbnQgd2luZG93IGxvY2F0aW9uIGlzIHRlbXBvcmFyaWx5IG1vZGlmaWVkIHdpdGggdGhlIFVSTCBvZiB0aGUgdGFyZ2V0IGFwcFxuXHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSB0aGUgaW50ZXJuYWxseSBtYW5hZ2VkIGhpc3RvcnksIHNvIHdlIHNpbXBseSBkbyBub3RoaW5nXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKFwicmVzdG9yZUhpc3Rvcnk9dHJ1ZVwiKSkge1xuXHRcdFx0dGhpcy5fYkFwcGx5UmVzdG9yZSA9IHRydWU7XG5cdFx0fSBlbHNlIGlmICghdGhpcy5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSBoYXNoIG5lZWRzIHRvIGJlIGNoYW5nZWQgKHRoaXMgaGFwcGVucyBpbiBGQ0wgd2hlbiBzd2l0Y2hpbmcgYi93IGVkaXQgYW5kIHJlYWQtb25seSB3aXRoIDMgY29sdW1ucyBvcGVuKVxuXHRcdFx0Y29uc3QgbWFwcGluZyA9IHRoaXMuX3BhdGhNYXBwaW5ncy5maW5kKChtKSA9PiB7XG5cdFx0XHRcdHJldHVybiBzSGFzaC5pbmNsdWRlcyhtLm9sZFBhdGgpO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAobWFwcGluZykge1xuXHRcdFx0XHQvLyBSZXBsYWNlIHRoZSBjdXJyZW50IGhhc2hcblx0XHRcdFx0c0hhc2ggPSBzSGFzaC5yZXBsYWNlKG1hcHBpbmcub2xkUGF0aCwgbWFwcGluZy5uZXdQYXRoKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7fSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIsIGVuY29kZVVSSShzSGFzaCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBhSGFzaFNwbGl0ID0gc0hhc2guc3BsaXQoXCImL1wiKTtcblx0XHRcdGNvbnN0IHNBcHBIYXNoID0gYUhhc2hTcGxpdFsxXSA/IGFIYXNoU3BsaXRbMV0gOiBcIlwiO1xuXHRcdFx0aWYgKHRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNBcHBIYXNoKSkge1xuXHRcdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQXBwSGFzaCk7XG5cdFx0XHRcdHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvbXBhcmVzIDIgc3RhdGVzLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1N0YXRlMVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1N0YXRlMlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uOlxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuRVFVQUwgaWYgb1N0YXRlMSBhbmQgb1N0YXRlMiBhcmUgZXF1YWxcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkNPTVBBVElCTEUgaWYgb1N0YXRlMSBhbmQgb1N0YXRlMiBhcmUgY29tcGF0aWJsZVxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuQU5DRVNUT1IgaWYgb1N0YXRlMSBpcyBhbiBhbmNlc3RvciBvZiBvU3RhdGUyXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5ESUZGRVJFTlQgaWYgdGhlIDIgc3RhdGVzIGFyZSBkaWZmZXJlbnRcblx0ICovXG5cblx0X2NvbXBhcmVDYWNoZVN0YXRlcyhvU3RhdGUxOiBSb3V0ZXJTdGF0ZSwgb1N0YXRlMjogUm91dGVyU3RhdGUpOiBudW1iZXIge1xuXHRcdC8vIEZpcnN0IGNvbXBhcmUgb2JqZWN0IGtleXNcblx0XHRpZiAob1N0YXRlMS5rZXlzLmxlbmd0aCA+IG9TdGF0ZTIua2V5cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UO1xuXHRcdH1cblx0XHRsZXQgZXF1YWwgPSB0cnVlO1xuXHRcdGxldCBpbmRleDtcblxuXHRcdGZvciAoaW5kZXggPSAwOyBlcXVhbCAmJiBpbmRleCA8IG9TdGF0ZTEua2V5cy5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGlmIChvU3RhdGUxLmtleXNbaW5kZXhdICE9PSBvU3RhdGUyLmtleXNbaW5kZXhdKSB7XG5cdFx0XHRcdGVxdWFsID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCFlcXVhbCkge1xuXHRcdFx0Ly8gQ2hlY2sgcm91dGluZ0hpbnRzXG5cdFx0XHRpZiAob1N0YXRlMS5rZXlzLmxlbmd0aCA9PT0gMSAmJiBvU3RhdGUyLmtleXMubGVuZ3RoID09PSAxICYmIHRoaXMucm91dGluZ0hpbnRzPy5bb1N0YXRlMS5rZXlzWzBdXSkge1xuXHRcdFx0XHRpZiAodGhpcy5yb3V0aW5nSGludHNbb1N0YXRlMS5rZXlzWzBdXS5wYXJlbnRPZiAmJiB0aGlzLnJvdXRpbmdIaW50c1tvU3RhdGUxLmtleXNbMF1dLnBhcmVudE9mLmluY2x1ZGVzKG9TdGF0ZTIua2V5c1swXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW51bVN0YXRlLkFOQ0VTVE9SO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBTb21lIG9iamVjdHMga2V5cyBhcmUgZGlmZmVyZW50XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDtcblx0XHR9XG5cblx0XHQvLyBBbGwga2V5cyBmcm9tIG9TdGF0ZTEgYXJlIGluIG9TdGF0ZTIgLS0+IGNoZWNrIGlmIGFuY2VzdG9yXG5cdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPCBvU3RhdGUyLmtleXMubGVuZ3RoIHx8IG9TdGF0ZTEuc2NyZWVuTW9kZSA8IG9TdGF0ZTIuc2NyZWVuTW9kZSkge1xuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5BTkNFU1RPUjtcblx0XHR9XG5cdFx0aWYgKG9TdGF0ZTEuc2NyZWVuTW9kZSA+IG9TdGF0ZTIuc2NyZWVuTW9kZSkge1xuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7IC8vIE5vdCBzdXJlIHRoaXMgY2FzZSBjYW4gaGFwcGVuLi4uXG5cdFx0fVxuXG5cdFx0Ly8gQXQgdGhpcyBzdGFnZSwgdGhlIDIgc3RhdGVzIGhhdmUgdGhlIHNhbWUgb2JqZWN0IGtleXMgKGluIHRoZSBzYW1lIG9yZGVyKSBhbmQgc2FtZSBzY3JlZW5tb2RlXG5cdFx0Ly8gVGhleSBjYW4gYmUgZWl0aGVyIGNvbXBhdGlibGUgb3IgZXF1YWxcblx0XHRyZXR1cm4gb1N0YXRlMS5zTGF5b3V0ID09PSBvU3RhdGUyLnNMYXlvdXQgPyBlbnVtU3RhdGUuRVFVQUwgOiBlbnVtU3RhdGUuQ09NUEFUSUJMRTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTcGxpdCB0aGUgYXBwLXNwZWNpZmljIHJvdXRlIGF0IHRoZSBcIiYvXCIgc2VwYXJhdG9yLlxuXHQgKlxuXHQgKiBUaGUgYXBwLXNwZWNpZmljIHJvdXRlIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIHNlZ21lbnRzIHNlcGFyYXRlZCBieSBcIiYvXCIuXG5cdCAqIEBleGFtcGxlXG5cdCAqIHNwbGl0QXBwU3BlY2lmaWNSb3V0ZShcIiYvRW50aXR5KCdhYmMnKS9OZXh0RW50aXR5KCd4eXonKVwiKTtcblx0ICogLy8gW1wiRW50aXR5KCdhYmMnKS9OZXh0RW50aXR5KCd4eXonKVwiXVxuXHQgKlxuXHQgKiBzcGxpdEFwcFNwZWNpZmljUm91dGUoXCImL0VudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JykmL1ByZWZpeC9OZXN0ZWRSb3V0ZVwiKTtcblx0ICogLy8gW1wiRW50aXR5KCdhYmMnKS9OZXh0RW50aXR5KCd4eXonKVwiLCBcIlByZWZpeC9OZXN0ZWRSb3V0ZVwiXVxuXHQgKiBAcGFyYW0gYXBwU3BlY2lmaWNSb3V0ZVx0VGhlIGFwcC1zcGVjaWZpYyByb3V0ZS5cblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgYXBwLXNwZWNpZmljIHJvdXRlIHNlZ21lbnRzLlxuXHQgKi9cblx0cHJpdmF0ZSBzdGF0aWMgc3BsaXRBcHBTcGVjaWZpY1JvdXRlKGFwcFNwZWNpZmljUm91dGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCByb3V0ZVNwbGl0ID0gYXBwU3BlY2lmaWNSb3V0ZT8uc3BsaXQoXCImL1wiKSA/PyBbXTtcblx0XHRpZiAoIXJvdXRlU3BsaXRbMF0pIHtcblx0XHRcdHJvdXRlU3BsaXQuc2hpZnQoKTsgLy8gcmVtb3ZlIHRoZSBsZWFkaW5nIGVtcHR5IHNlZ21lbnQgKHRoZSBhcHAtc3BlY2lmaWMgcm91dGUgc3RhcnRzIHdpdGggXCImL1wiKVxuXHRcdH1cblx0XHRyZXR1cm4gcm91dGVTcGxpdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYmFjayBleGl0cyB0aGUgcHJlc2VudCBndWFyZCBzZXQuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBiYWNrIGV4aXRzIHRoZSBndWFyZFxuXHQgKi9cblx0Y2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKTogYm9vbGVhbiB7XG5cdFx0Ly8gV2UgdXNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoIGluc3RlYWQgb2YgSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCkgYmVjYXVzZSB0aGUgbGF0dGVyXG5cdFx0Ly8gcmVwbGFjZXMgY2hhcmFjdGVycyBpbiB0aGUgVVJMIChlLmcuICUyNCByZXBsYWNlZCBieSAkKSBhbmQgaXQgY2F1c2VzIGlzc3VlcyB3aGVuIGNvbXBhcmluZ1xuXHRcdC8vIHdpdGggdGhlIFVSTHMgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGNvbnN0IHNwbGl0SGFzaCA9IHRoaXMuZ2V0RnVsbEhhc2goKTtcblxuXHRcdGNvbnN0IHNlZ21lbnRzID0gUm91dGVyUHJveHkuc3BsaXRBcHBTcGVjaWZpY1JvdXRlKHNwbGl0SGFzaCk7XG5cblx0XHRpZiAoc2VnbWVudHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gdGhlcmUgaXMgYSBuZXN0ZWQgcm91dGUgaW52b2x2ZWQgLT4gYXNzdW1lIHdlIGFyZSBzdGlsbCBpbnNpZGUgdGhlIGd1YXJkXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaGFzaCA9IHNlZ21lbnRzWzBdID8/IFwiXCI7XG5cblx0XHRsZXQgcHJldmlvdXNIYXNoO1xuXHRcdGlmICh0aGlzLl9vTmF2aWdhdGlvbkd1YXJkKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcblx0XHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpXS5oYXNoID09PSBoYXNoKSB7XG5cdFx0XHRcdFx0cHJldmlvdXNIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W2kgLSAxXS5oYXNoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAhcHJldmlvdXNIYXNoIHx8ICF0aGlzLmNoZWNrSGFzaFdpdGhHdWFyZChwcmV2aW91c0hhc2gpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgYmFjayBuYXZpZ2F0aW9uIHdpbGwgZXhpdCB0aGUgYXBwLlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGJhY2sgZXhpdHMgdGhlIGFwcFxuXHQgKi9cblx0Y2hlY2tJZkJhY2tFeGl0c0FwcCgpOiBib29sZWFuIHtcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLmdldEZ1bGxIYXNoKCk7XG5cblx0XHRjb25zdCBzZWdtZW50cyA9IFJvdXRlclByb3h5LnNwbGl0QXBwU3BlY2lmaWNSb3V0ZShzcGxpdEhhc2gpO1xuXG5cdFx0aWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIHRoZXJlIGlzIGEgbmVzdGVkIHJvdXRlIGludm9sdmVkIC0+IGFzc3VtZSB3ZSBhcmUgc3RpbGwgaW5zaWRlIHRoZSBhcHBcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgY3VycmVudCBoYXNoIGlzIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGhpc3RvcnksIHRoZW4gYSBuYXZiYWNrIHdpbGwgZXhpdCB0aGUgYXBwXG5cdFx0Y29uc3QgaGFzaCA9IHNlZ21lbnRzWzBdID8/IFwiXCI7XG5cdFx0cmV0dXJuIHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPiAwICYmIHRoaXMuX29NYW5hZ2VkSGlzdG9yeVswXS5oYXNoID09PSBoYXNoO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgbGFzdCAyIGVudHJpZXMgaW4gdGhlIGhpc3Rvcnkgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZXkgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cblx0ICovXG5cdGNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPCAyKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV07XG5cdFx0Y29uc3Qgb1ByZXZpb3VzU3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDJdO1xuXG5cdFx0cmV0dXJuIG9DdXJyZW50U3RhdGUuaGFzaC5zcGxpdChcIj9cIilbMF0gPT09IG9QcmV2aW91c1N0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc3RvcmVzIHRoZSBmb2N1cyBmb3IgdGhlIGN1cnJlbnQgaGFzaCwgaWYgd2UgY2FuIGZpbmQgaXQgaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgZm9jdXMgd2FzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQgKi9cblx0cmVzdG9yZUZvY3VzRm9yQ3VycmVudEhhc2goKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY3VycmVudEhhc2ggPSByZW1vdmVBcHBTdGF0ZUluSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0Y29uc3Qgc3RhdGVGb3JIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LmZpbmQoKHN0YXRlKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc3RhdGUuaGFzaCkgPT09IGN1cnJlbnRIYXNoO1xuXHRcdH0pO1xuXG5cdFx0bGV0IGZvY3VzQXBwbGllZCA9IGZhbHNlO1xuXHRcdGlmIChzdGF0ZUZvckhhc2g/LmZvY3VzQ29udHJvbElkKSB7XG5cdFx0XHRsZXQgZm9jdXNDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChzdGF0ZUZvckhhc2guZm9jdXNDb250cm9sSWQpO1xuXHRcdFx0bGV0IGZvY3VzSW5mbyA9IHN0YXRlRm9ySGFzaC5mb2N1c0luZm87XG5cdFx0XHRpZiAoKCFmb2N1c0NvbnRyb2wgfHwgIWZvY3VzQ29udHJvbC5nZXRGb2N1c0RvbVJlZigpKSAmJiBzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNDb250cm9sSWQpIHtcblx0XHRcdFx0Ly8gVGhlIGNvbnRyb2wgZm9yIGZvY3VzIGlzIGVpdGhlciBub3QgZm91bmQgb3IgaXMgbm90IGRpc3BsYXllZCBvbiBzY3JlZW4gKG5vIGZvY3VzRG9tUmVmKVxuXHRcdFx0XHQvLyAtLT4gdHJ5IHRoZSBzZWNvbmRhcnkgY29udHJvbCBpZiB0aGVyZSdzIG9uZVxuXHRcdFx0XHRmb2N1c0NvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKHN0YXRlRm9ySGFzaC5zZWNvbmRhcnlGb2N1c0NvbnRyb2xJZCk7XG5cdFx0XHRcdGZvY3VzSW5mbyA9IHN0YXRlRm9ySGFzaC5zZWNvbmRhcnlGb2N1c0luZm87XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdC8vIGlmIHRoZSBjb250cm9sIGlzIGEgYnVzeSB0YWJsZSwgd2UgZG9uJ3Qgd2FudCB0byBmb2N1cyBpdC5cblx0XHRcdFx0Ly8gdGFibGVzIGhhdmUgdGhlaXIgb3duIGhhbmRsaW5nIHRvIHJlc3RvcmUgZm9jdXMsIHNvIHdlIGRvbid0IHdhbnQgdG8gaW50ZXJmZXJlIHdpdGggdGhhdFxuXHRcdFx0XHRmb2N1c0NvbnRyb2w/LmdldFBhcmVudCgpPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSAmJlxuXHRcdFx0XHQoZm9jdXNDb250cm9sIGFzIE1UYWJsZSB8IFVJVGFibGUpLmdldEJ1c3koKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGZvY3VzQ29udHJvbD8uZm9jdXMoZm9jdXNJbmZvKTtcblx0XHRcdGZvY3VzQXBwbGllZCA9IGZvY3VzQ29udHJvbCAhPT0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBmb2N1c0FwcGxpZWQ7XG5cdH1cblxuXHQvKipcblx0ICogU3RvcmVzIHRoZSBJRCBvZiB0aGUgY3VycmVudGx5IGZvY3VzZWQgY29udHJvbCBpbiB0aGUgaGlzdG9yeSBmb3IgdGhlIGN1cnJlbnQgaGFzaC5cblx0ICpcblx0ICovXG5cdHByaXZhdGUgc3RvcmVGb2N1c0luZm9Gb3JDdXJyZW50SGFzaCgpOiB2b2lkIHtcblx0XHRjb25zdCBjdXJyZW50SGFzaCA9IHJlbW92ZUFwcFN0YXRlSW5IYXNoKHRoaXMuZ2V0SGFzaCgpKTtcblx0XHRjb25zdCBzdGF0ZUZvckhhc2ggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkuZmluZCgoc3RhdGUpID0+IHtcblx0XHRcdHJldHVybiByZW1vdmVBcHBTdGF0ZUluSGFzaChzdGF0ZS5oYXNoKSA9PT0gY3VycmVudEhhc2g7XG5cdFx0fSk7XG5cdFx0aWYgKHN0YXRlRm9ySGFzaCkge1xuXHRcdFx0Y29uc3QgZm9jdXNDb250cm9sID0gRWxlbWVudC5nZXRBY3RpdmVFbGVtZW50KCk7XG5cdFx0XHRzdGF0ZUZvckhhc2guZm9jdXNDb250cm9sSWQgPSBmb2N1c0NvbnRyb2w/LmdldElkKCk7XG5cdFx0XHRpZiAoZm9jdXNDb250cm9sKSB7XG5cdFx0XHRcdC8vIFRoZSBzZWNvbmRhcnkgZm9jdXMgY29udHJvbCBpcyB0aGUgcGFyZW50IHRhYmxlIGlmIHRoZXJlJ3Mgb25lXG5cdFx0XHRcdGxldCBwYXJlbnRUYWJsZSA9IGZvY3VzQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0d2hpbGUgKHBhcmVudFRhYmxlICYmICFwYXJlbnRUYWJsZS5pc0E8VUlUYWJsZT4oXCJzYXAudWkudGFibGUuVGFibGVcIikgJiYgIXBhcmVudFRhYmxlLmlzQTxNVGFibGU+KFwic2FwLm0uVGFibGVcIikpIHtcblx0XHRcdFx0XHRwYXJlbnRUYWJsZSA9IHBhcmVudFRhYmxlLmdldFBhcmVudCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0YXRlRm9ySGFzaC5zZWNvbmRhcnlGb2N1c0NvbnRyb2xJZCA9IHBhcmVudFRhYmxlPy5nZXRJZCgpO1xuXHRcdFx0XHRzdGF0ZUZvckhhc2guc2Vjb25kYXJ5Rm9jdXNJbmZvID0geyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH07XG5cdFx0XHR9XG5cdFx0XHRzdGF0ZUZvckhhc2guZm9jdXNJbmZvID0gZm9jdXNDb250cm9sPy5nZXRGb2N1c0luZm8oKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmluZHMgYSBsYXlvdXQgdmFsdWUgZm9yIGEgaGFzaCBpbiB0aGUgaGlzdG9yeS5cblx0ICogQHBhcmFtIGhhc2ggVGhlIGhhc2ggdG8gbG9vayBmb3IgaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEByZXR1cm5zIEEgbGF5b3V0IHZhbHVlIGlmIGl0IGNvdWxkIGJlIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlLlxuXHQgKi9cblx0ZmluZExheW91dEZvckhhc2goaGFzaDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIXRoaXMuZmNsRW5hYmxlZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgYWxsIHF1ZXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgaGFzaFxuXHRcdGNvbnN0IGhhc2hOb1BhcmFtID0gaGFzaC5zcGxpdChcIj9cIilbMF07XG5cblx0XHQvLyBMb29rIGZvciB0aGUgc3RhdGUgYmFja3dhcmRzLCBzbyB0aGF0IHdlIGZpbmQgdGhlIGxhc3Qgc3RhdGUgaW4gdGhlIGhpc3RvcnkgKGUuZy4gaWYgd2UgaGF2ZSAyIHN0YXRlcyB3aXRoIHRoZSBzYW1lIGhhc2ggYnV0IDIgZGlmZmVyZW50IGxheW91dHMpXG5cdFx0bGV0IHRhcmdldFN0YXRlOiBSb3V0ZXJTdGF0ZSB8IHVuZGVmaW5lZDtcblx0XHRmb3IgKGxldCBpbmRleCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxOyBpbmRleCA+PSAwICYmIHRhcmdldFN0YXRlID09PSB1bmRlZmluZWQ7IGluZGV4LS0pIHtcblx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaW5kZXhdLmhhc2guc3BsaXQoXCI/XCIpWzBdID09PSBoYXNoTm9QYXJhbSkge1xuXHRcdFx0XHR0YXJnZXRTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpbmRleF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldFN0YXRlPy5zTGF5b3V0O1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlclByb3h5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztFQWNBLE1BQU1BLFNBQVMsR0FBRztJQUNqQkMsS0FBSyxFQUFFLENBQUM7SUFDUkMsVUFBVSxFQUFFLENBQUM7SUFDYkMsUUFBUSxFQUFFLENBQUM7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
@@ -272,6 +272,7 @@ class RouterProxy extends BaseObject {
272
272
  * @param bDisablePreservationCache If set to true, cache preservation mechanism is disabled for the current navigation
273
273
  * @param bForceFocus If set to true, the logic to set the focus once the navigation is finalized will be triggered (onPageReady)
274
274
  * @param bPreserveShellBackNavigationHandler If not set to false, the back navigation is set to undefined
275
+ * @param skipHashGuardCheck
275
276
  * @returns Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
276
277
  */
277
278
  async navToHash(
@@ -279,7 +280,8 @@ class RouterProxy extends BaseObject {
279
280
  bPreserveHistory?: boolean,
280
281
  bDisablePreservationCache?: boolean,
281
282
  bForceFocus?: boolean,
282
- bPreserveShellBackNavigationHandler?: boolean
283
+ bPreserveShellBackNavigationHandler?: boolean,
284
+ skipHashGuardCheck?: boolean
283
285
  ): Promise<boolean> {
284
286
  sHash = sHash.startsWith("/") ? sHash.substring(1) : sHash;
285
287
  if (bPreserveShellBackNavigationHandler !== false) {
@@ -289,13 +291,13 @@ class RouterProxy extends BaseObject {
289
291
  if (this._oRouteMatchSynchronization) {
290
292
  return this._oRouteMatchSynchronization.waitFor().then(async () => {
291
293
  this._oRouteMatchSynchronization = undefined;
292
- return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
294
+ return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, skipHashGuardCheck);
293
295
  });
294
296
  } else {
295
297
  if (this._bActivateRouteMatchSynchro) {
296
298
  this.waitForRouteMatchBeforeNavigation();
297
299
  }
298
- return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
300
+ return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, skipHashGuardCheck);
299
301
  }
300
302
  }
301
303
 
@@ -303,14 +305,15 @@ class RouterProxy extends BaseObject {
303
305
  sHash: string,
304
306
  bPreserveHistory?: boolean,
305
307
  bDisablePreservationCache?: boolean,
306
- bForceFocus?: boolean
308
+ bForceFocus?: boolean,
309
+ skipHashGuardCheck?: boolean
307
310
  ): Promise<boolean> {
308
311
  // Add the app state in the hash if needed
309
312
  if (this.fclEnabled && this.sIAppStateKey && !this.findAppStateInHash(sHash)) {
310
313
  sHash = this.setAppStateInHash(sHash, this.sIAppStateKey);
311
314
  }
312
315
 
313
- if (!this.checkHashWithGuard(sHash)) {
316
+ if (!this.checkHashWithGuard(sHash) && !(skipHashGuardCheck ?? false)) {
314
317
  if (!this.oResourceBundle) {
315
318
  this.oResourceBundle = Library.getResourceBundleFor("sap.fe.core")!;
316
319
  }