@sapui5/sap.fe.core 1.136.2 → 1.136.5

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 (86) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +7 -1
  4. package/src/sap/fe/core/AppComponent.ts +10 -0
  5. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +2 -1
  6. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +1 -0
  7. package/src/sap/fe/core/controllerextensions/EditFlow.js +41 -20
  8. package/src/sap/fe/core/controllerextensions/EditFlow.ts +60 -25
  9. package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -5
  10. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +19 -1
  11. package/src/sap/fe/core/controllerextensions/SideEffects.js +5 -4
  12. package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -5
  13. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +4 -3
  14. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +10 -3
  15. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +9 -8
  16. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +11 -6
  17. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +9 -25
  18. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +20 -43
  19. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +2 -2
  20. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +1 -1
  21. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +7 -6
  22. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +9 -4
  23. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +4 -17
  24. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -19
  25. package/src/sap/fe/core/converters/controls/Common/Table.js +12 -2
  26. package/src/sap/fe/core/converters/controls/Common/Table.ts +18 -1
  27. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +3 -2
  28. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +2 -1
  29. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +19 -5
  30. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +28 -5
  31. package/src/sap/fe/core/fpm/manifest.json +1 -1
  32. package/src/sap/fe/core/helpers/DeleteHelper.js +4 -2
  33. package/src/sap/fe/core/helpers/DeleteHelper.ts +1 -1
  34. package/src/sap/fe/core/helpers/ModelHelper.js +9 -18
  35. package/src/sap/fe/core/helpers/ModelHelper.ts +12 -17
  36. package/src/sap/fe/core/library.js +1 -1
  37. package/src/sap/fe/core/messagebundle.properties +4 -0
  38. package/src/sap/fe/core/messagebundle_ar.properties +5 -3
  39. package/src/sap/fe/core/messagebundle_bg.properties +2 -0
  40. package/src/sap/fe/core/messagebundle_ca.properties +2 -0
  41. package/src/sap/fe/core/messagebundle_cnr.properties +2 -0
  42. package/src/sap/fe/core/messagebundle_cs.properties +2 -0
  43. package/src/sap/fe/core/messagebundle_cy.properties +2 -0
  44. package/src/sap/fe/core/messagebundle_da.properties +2 -0
  45. package/src/sap/fe/core/messagebundle_de.properties +2 -0
  46. package/src/sap/fe/core/messagebundle_el.properties +2 -0
  47. package/src/sap/fe/core/messagebundle_en.properties +2 -0
  48. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
  49. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +2 -0
  50. package/src/sap/fe/core/messagebundle_es.properties +3 -1
  51. package/src/sap/fe/core/messagebundle_es_MX.properties +2 -0
  52. package/src/sap/fe/core/messagebundle_et.properties +2 -0
  53. package/src/sap/fe/core/messagebundle_fi.properties +2 -0
  54. package/src/sap/fe/core/messagebundle_fr.properties +4 -2
  55. package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -0
  56. package/src/sap/fe/core/messagebundle_hi.properties +2 -0
  57. package/src/sap/fe/core/messagebundle_hr.properties +2 -0
  58. package/src/sap/fe/core/messagebundle_hu.properties +2 -0
  59. package/src/sap/fe/core/messagebundle_id.properties +4 -2
  60. package/src/sap/fe/core/messagebundle_it.properties +2 -0
  61. package/src/sap/fe/core/messagebundle_iw.properties +2 -0
  62. package/src/sap/fe/core/messagebundle_ja.properties +2 -0
  63. package/src/sap/fe/core/messagebundle_kk.properties +2 -0
  64. package/src/sap/fe/core/messagebundle_ko.properties +6 -4
  65. package/src/sap/fe/core/messagebundle_lt.properties +2 -0
  66. package/src/sap/fe/core/messagebundle_lv.properties +2 -0
  67. package/src/sap/fe/core/messagebundle_mk.properties +2 -0
  68. package/src/sap/fe/core/messagebundle_ms.properties +2 -0
  69. package/src/sap/fe/core/messagebundle_nl.properties +2 -0
  70. package/src/sap/fe/core/messagebundle_no.properties +2 -0
  71. package/src/sap/fe/core/messagebundle_pl.properties +2 -0
  72. package/src/sap/fe/core/messagebundle_pt.properties +2 -0
  73. package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -0
  74. package/src/sap/fe/core/messagebundle_ro.properties +2 -0
  75. package/src/sap/fe/core/messagebundle_ru.properties +2 -0
  76. package/src/sap/fe/core/messagebundle_sh.properties +2 -0
  77. package/src/sap/fe/core/messagebundle_sk.properties +2 -0
  78. package/src/sap/fe/core/messagebundle_sl.properties +2 -0
  79. package/src/sap/fe/core/messagebundle_sr.properties +2 -0
  80. package/src/sap/fe/core/messagebundle_sv.properties +2 -0
  81. package/src/sap/fe/core/messagebundle_th.properties +2 -0
  82. package/src/sap/fe/core/messagebundle_tr.properties +2 -0
  83. package/src/sap/fe/core/messagebundle_uk.properties +2 -0
  84. package/src/sap/fe/core/messagebundle_vi.properties +9 -7
  85. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
  86. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
@@ -48,18 +48,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
48
48
  * Manages the SideEffects to execute after the document creation.
49
49
  * @param listBinding ODataListBinding where the document has to be created
50
50
  * @param creationPromise The promise resolved once the document is created
51
+ * @param parentContext Optional parent context
51
52
  * @returns Promise resolves once the SideEffects has been triggered
52
53
  */
53
- _this.handleSideEffects = async (listBinding, creationPromise) => {
54
+ _this.handleSideEffects = async (listBinding, creationPromise, parentContext) => {
54
55
  try {
55
- const viewBindingContext = _this.getView().getBindingContext();
56
56
  const newContext = await creationPromise;
57
57
  // transient contexts are reliably removed once oNewContext.created() is resolved
58
58
  await newContext.created();
59
59
  // if there are transient contexts, we must avoid requesting side effects
60
60
  // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
61
61
  // if list binding is refreshed, transient contexts might be lost
62
- _this.requestSideEffectsForNavigationProperty(listBinding, viewBindingContext);
62
+ _this.requestSideEffectsForNavigationProperty(listBinding, parentContext ?? _this.getView().getBindingContext());
63
63
  } catch (error) {
64
64
  Log.error("Error while creating the document", error);
65
65
  }
@@ -270,9 +270,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
270
270
  * Requests the side effects required after deleting an object.
271
271
  * @param listBinding The list binding the deleted object belongs to
272
272
  * @param parentContext The context of the parent object of the deleted object
273
+ * @param ignoreTransientContexts If true, transient contexts are ignored
273
274
  */;
274
275
  _proto.requestSideEffectsOnDelete = function requestSideEffectsOnDelete(listBinding, parentContext) {
275
- if (parentContext && this.requestSideEffectsForNavigationProperty(listBinding, parentContext)) {
276
+ let ignoreTransientContexts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
277
+ if (parentContext && this.requestSideEffectsForNavigationProperty(listBinding, parentContext, ignoreTransientContexts)) {
276
278
  const stateMessagesPath = ModelHelper.getMessagesPath(listBinding.getModel().getMetaModel(), parentContext.getPath());
277
279
  // In case of a TreeTable, we need to refresh state messages for the ObjectPage, as some of these messages might be attached
278
280
  // to children of a deleted row which may not have been loaded yet, and therefore the model wouldn't clean up these messages
@@ -280,12 +282,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
280
282
  this.getAppComponent().getSideEffectsService().requestSideEffects([stateMessagesPath], parentContext);
281
283
  }
282
284
  }
283
- };
285
+ }
286
+
287
+ /**
288
+ * Requests the side effects required when structural change (create/delete) is done into a table.
289
+ * @param listBinding The list binding the deleted object belongs to
290
+ * @param parentContext The context of the parent object of the deleted object
291
+ * @param ignoreTransientContexts If true, transient contexts are ignored
292
+ * @returns True if side effects were requested, false otherwise
293
+ */;
284
294
  _proto.requestSideEffectsForNavigationProperty = function requestSideEffectsForNavigationProperty(listBinding, parentContext) {
295
+ let ignoreTransientContexts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
285
296
  if (parentContext) {
286
297
  const listBindingRelativePath = ModelHelper.getRelativeMetaPathForListBinding(parentContext, listBinding);
287
- if (!CommonUtils.hasTransientContext(listBinding) && listBindingRelativePath) {
288
- // if there are transient contexts, we must avoid requesting side effects
298
+ if ((ignoreTransientContexts || !CommonUtils.hasTransientContext(listBinding)) && listBindingRelativePath) {
299
+ // if there are transient contexts (and we don't ignore this check), we must avoid requesting side effects
289
300
  // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
290
301
  // if list binding is refreshed, transient contexts might be lost
291
302
  this.getAppComponent().getSideEffectsService().requestSideEffectsForNavigationProperty(listBindingRelativePath, parentContext);
@@ -311,10 +322,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
311
322
  _proto.deleteMultipleDocuments = async function deleteMultipleDocuments(contextsToDelete, parameters) {
312
323
  parameters.beforeDeleteCallBack = this.base.editFlow.onBeforeDelete;
313
324
  parameters.requestSideEffects = parameters.requestSideEffects !== false;
325
+ let tableAPI;
326
+ let isInlineCreationRows = false;
314
327
  const lockObject = this.getGlobalUIModel();
315
328
  const parentControl = this.getView().byId(parameters.controlId) ?? Element.getElementById(parameters.controlId);
316
329
  let inactiveContextsToDelete = [];
317
330
  if (parentControl?.isA("sap.ui.mdc.Table")) {
331
+ tableAPI = parentControl.getParent();
332
+ isInlineCreationRows = tableAPI.tableDefinition?.control?.creationMode === CreationMode.InlineCreationRows;
318
333
  inactiveContextsToDelete = contextsToDelete.filter(context => context.isInactive());
319
334
  }
320
335
  if (!parentControl) {
@@ -344,7 +359,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
344
359
  // keep promise chain pending until refresh of listbinding is completed
345
360
  result = this.getTransactionHelper().refreshListBinding(listBinding, this.getAppComponent());
346
361
  } else if (parameters.requestSideEffects) {
347
- this.requestSideEffectsOnDelete(listBinding, viewBindingContext);
362
+ this.requestSideEffectsOnDelete(listBinding, viewBindingContext, isInlineCreationRows);
348
363
  }
349
364
 
350
365
  // deleting at least one object should also set the UI to dirty
@@ -360,11 +375,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
360
375
  await this.base.editFlow.onAfterDelete({
361
376
  contexts: contextsToDelete
362
377
  });
363
- if (parentControl.isA("sap.ui.mdc.Table")) {
364
- const tableAPI = parentControl.getParent();
365
- if (tableAPI?.tableDefinition?.control?.creationMode === CreationMode.InlineCreationRows && inactiveContextsToDelete.length > 0) {
378
+ if (tableAPI) {
379
+ if (isInlineCreationRows && inactiveContextsToDelete.length > 0) {
366
380
  tableAPI.removeEmptyRowsMessages(inactiveContextsToDelete);
367
- await tableAPI.setUpEmptyRows(parentControl, false);
381
+ await tableAPI.setUpEmptyRows(tableAPI.getContent(), false);
368
382
  }
369
383
  }
370
384
  this._sendActivity(Activity.Delete, contextsToDelete);
@@ -376,7 +390,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
376
390
  await this.getTransactionHelper().refreshListBinding(listBinding, this.getAppComponent());
377
391
  } else if (parameters.requestSideEffects) {
378
392
  const viewBindingContext = this.getView().getBindingContext();
379
- this.requestSideEffectsOnDelete(listBinding, viewBindingContext);
393
+ this.requestSideEffectsOnDelete(listBinding, viewBindingContext, isInlineCreationRows);
380
394
  }
381
395
  Log.error("Error while deleting the document(s)", error);
382
396
  } finally {
@@ -553,6 +567,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
553
567
  return this._handleCreationMode(resolvedCreationMode, source, mInParameters, oDataListBinding, parentContext);
554
568
  };
555
569
  _proto._handleCreationMode = async function _handleCreationMode(resolvedCreationMode, vListBinding, parameters, oDataListBinding, parentContext) {
570
+ await this.syncTask();
556
571
  this._updatePathsInHistory([]);
557
572
  switch (resolvedCreationMode) {
558
573
  case CreationMode.External:
@@ -961,9 +976,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
961
976
  return newDocumentContext;
962
977
  });
963
978
 
964
- // Don't do this if the invocation comes from a deferred creation or if Save is pressed directly after filling the CreationRow
965
- if (parameters.bFromDeferred !== true && !parameters.skipSideEffects) {
966
- this.handleSideEffects(listBinding, creation);
979
+ // The SideEffects are requested only if the creation in the FLC case (dirty state is not set to true so SideEffects are relevant)
980
+ // or if the creation is not deferred.
981
+ if ((this._isFclEnabled() || parameters.bFromDeferred !== true) && !parameters.skipSideEffects) {
982
+ this.handleSideEffects(listBinding, creation, parameters.bFromDeferred ? listBinding.getContext() : undefined);
967
983
  }
968
984
  if (parameters.creationMode === CreationMode.Async) {
969
985
  navigation = routingListener.navigateForwardToContext(listBinding, {
@@ -1389,7 +1405,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1389
1405
  if (oContext.getModel().hasPendingChanges("$auto") && mParameters.mergePatchDraft) {
1390
1406
  oContext.getModel().submitBatch("$auto");
1391
1407
  }
1392
- const activeDocumentContext = await transactionHelper.saveDocument(rootContext, this.getAppComponent(), this._getResourceModel(), bExecuteSideEffectsOnError, aBindings, this.getMessageHandler(), this.getCreationMode());
1408
+ const activeDocumentContext = await transactionHelper.saveDocument(rootContext, this.getAppComponent(), this._getResourceModel(), bExecuteSideEffectsOnError, aBindings, this.getMessageHandler(), this.getCreationMode(), undefined, mParameters?.isStandardSave);
1393
1409
  this._removeStickySessionInternalProperties(sProgrammingModel);
1394
1410
  this._sendActivity(Activity.Activate, activeDocumentContext);
1395
1411
  this.base.collaborativeDraft.disconnect();
@@ -1905,6 +1921,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1905
1921
  }
1906
1922
  try {
1907
1923
  await this.syncTask();
1924
+ //Execute the registered deferred SideEffects before the POST of the action
1925
+ if (!Array.isArray(mParameters.contexts) && mParameters.contexts?.getBinding().isA("sap.ui.model.odata.v4.ODataContextBinding")) {
1926
+ await this.base._sideEffects.handlePageChangeContext(mParameters.contexts);
1927
+ }
1908
1928
  await this.base.editFlow.onBeforeExecuteAction({
1909
1929
  contexts: mParameters.contexts
1910
1930
  });
@@ -2176,14 +2196,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
2176
2196
  const isCollaborationDraftSupported = ModelHelper.isCollaborationDraftSupported(model.getMetaModel());
2177
2197
  let forceDisplayMode = false;
2178
2198
  const isActiveEntity = await context.requestObject("IsActiveEntity");
2179
- if (isCollaborationDraftSupported && isActiveEntity === false) {
2199
+ if (isCollaborationDraftSupported) {
2180
2200
  forceDisplayMode = !(await this.base.collaborativeDraft.activateCollaboration(context, isActiveEntity));
2181
2201
  } else {
2182
2202
  globalModel.setProperty("/hasCollaborationAuthorization", undefined);
2183
2203
  }
2184
2204
  this.fetchCollaborativeDraftUsersPromise = undefined;
2185
2205
  if (isActiveEntity === false && !forceDisplayMode) {
2186
- // in case the document is draft set it in edit mode
2206
+ // in case the document is draft, set it in edit mode
2207
+ // unless we don't have the authorization for a collaborative user
2187
2208
  this.setEditMode(EditMode.Editable);
2188
2209
  const hasActiveEntity = await context.requestObject("HasActiveEntity");
2189
2210
  this.setEditMode(undefined, !hasActiveEntity);
@@ -3073,4 +3094,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
3073
3094
  }(BaseControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeExecuteAction", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeExecuteAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterSave", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterCreate", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterEdit", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDiscard", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDelete", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec33, _dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec35, _dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterActionExecution", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterActionExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "customMassEditSave", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "customMassEditSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _class2)) || _class);
3074
3095
  return EditFlow;
3075
3096
  }, false);
3076
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiRWRpdEZsb3ciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJwdWJsaWNFeHRlbnNpb24iLCJfZGVjNCIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiX2RlYzExIiwiX2RlYzEyIiwiX2RlYzEzIiwiX2RlYzE0IiwiX2RlYzE1IiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiX2RlYzIzIiwiX2RlYzI0IiwiX2RlYzI1IiwiX2RlYzI2IiwiX2RlYzI3IiwiX2RlYzI4IiwiX2RlYzI5IiwiX2RlYzMwIiwiX2RlYzMxIiwiX2RlYzMyIiwiX2RlYzMzIiwiX2RlYzM0IiwiX2RlYzM1IiwiX2RlYzM2IiwiX2RlYzM3IiwiX2RlYzM4IiwiX2RlYzM5IiwiX2RlYzQwIiwiX2RlYzQxIiwiX2RlYzQyIiwiX2RlYzQzIiwiX2RlYzQ0IiwiSW5zdGVhZCIsIl9kZWM0NSIsIl9kZWM0NiIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQmFzZUNvbnRyb2xsZXJFeHRlbnMiLCJfdGhpcyIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY2FsbCIsInN5bmNUYXNrcyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJsaXN0QmluZGluZyIsImNyZWF0aW9uUHJvbWlzZSIsInZpZXdCaW5kaW5nQ29udGV4dCIsImdldFZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsIm5ld0NvbnRleHQiLCJjcmVhdGVkIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiZXJyb3IiLCJMb2ciLCJjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMiLCJ2YWxpZGF0aW9uTWVzc2FnZXMiLCJ0YWJsZSIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImdldENyZWF0aW9uUm93IiwiZGF0YSIsImN1c3RvbVZhbGlkaXR5IiwiZ2V0UHJvcGVydHkiLCJjdXN0b21NZXNzYWdlcyIsImZpZWxkQ29udHJvbCIsImZpbmFsVGFyZ2V0Iiwib2xkTWVzc2FnZXMiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZmlsdGVyIiwibWVzc2FnZSIsImdldENvZGUiLCJyZW1vdmVNZXNzYWdlcyIsImZvckVhY2giLCJ2YWxpZGF0aW9uTWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXQiLCJFbGVtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJmaWVsZElkIiwiZ2V0UGF0aCIsImdldEJpbmRpbmdQYXRoIiwiZ2V0VGFyZ2V0cyIsInNvbWUiLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsIk1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsInByb2Nlc3NvciIsImdldE1vZGVsIiwidHlwZSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJjb2RlIiwidGVjaG5pY2FsIiwicGVyc2lzdGVudCIsImV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYWRkQ29udHJvbElkIiwicHVzaCIsInRleHQiLCJnZXRNZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlRGlhbG9nIiwicmVzb2x2ZUNyZWF0aW9uTW9kZSIsImluaXRpYWxDcmVhdGlvbk1vZGUiLCJjcmVhdGVEYXRhIiwiQ3JlYXRpb25Nb2RlIiwiTmV3UGFnZSIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInByb2dyYW1taW5nTW9kZWwiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwiaXNSZWxhdGl2ZSIsImRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0IiwiZW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwibmV3QWN0aW9uIiwiRHJhZnQiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIkRyYWZ0Um9vdCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiTmV3QWN0aW9uIiwidG9TdHJpbmciLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYWN0aW9ucyIsInBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsImNyZWF0aW9uUGFyYW1ldGVycyIsImdldFRyYW5zYWN0aW9uSGVscGVyIiwiZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzIiwiZ2V0QXBwQ29tcG9uZW50IiwiQXN5bmMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uSW5pdCIsIl9oaWRkZW5EcmFmdCIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiSGlkZGVuRHJhZnQiLCJnZXRJbnRlcmZhY2UiLCJiYXNlIiwiZWRpdERvY3VtZW50IiwiY29udGV4dCIsInRyYW5zYWN0aW9uSGVscGVyIiwicm9vdFZpZXdDb250cm9sbGVyIiwiX2dldFJvb3RWaWV3Q29udHJvbGxlciIsIm1vZGVsIiwidmlld0RhdGEiLCJnZXRWaWV3RGF0YSIsImdyb3VwSWQiLCJtZXNzYWdlSGFuZGxpbmdLZXkiLCJyZWdpc3RlclRvSG9sZE1lc3NhZ2VzIiwicm9vdENvbnRleHQiLCJnZXRSb290Q29udGV4dCIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwicmlnaHRtb3N0Q29udGV4dCIsIl9pc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwidW5kZWZpbmVkIiwidHJhbnNhY3Rpb25EZXRhaWxzIiwibmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZSIsInJvb3RDb250ZXh0SW5mbyIsInJvb3RTaWJsaW5nUGF0aFByb21pc2UiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsInNpYmxpbmdJbmZvUHJvbWlzZSIsImNvbXB1dGVTaWJsaW5nSW5mbyIsInZpZXdMZXZlbCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwic3VibWl0QmF0Y2giLCJzaWJsaW5nSW5mbyIsIm5ld0RvY3VtZW50Q29udGV4dCIsImNvbnRleHRUb05hdmlnYXRlIiwiX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0IiwiX3VwZGF0ZVBhdGhzSW5IaXN0b3J5Iiwib3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiIsIlN0aWNreSIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJleGlzdGluZ0RyYWZ0UmV1c2VkIiwiY29sbGFib3JhdGl2ZURyYWZ0Iiwic2V0SW5pdGlhbFNoYXJlIiwib25BZnRlckVkaXQiLCJfaGFuZGxlTmV3Q29udGV4dCIsImVkaXRhYmxlIiwicmVjcmVhdGVDb250ZXh0IiwiZm9yY2VGb2N1cyIsInN0aWNreUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwiaGFuZGxlU3RpY2t5T24iLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0RG9jdW1lbnRNb2RpZmllZCIsInVuSG9sZEtleSIsIm92ZXJyaWRlVUlEZWNpc2lvbiIsInJlamVjdCIsInJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlIiwicGFyZW50Q29udGV4dCIsInN0YXRlTWVzc2FnZXNQYXRoIiwiZ2V0TWVzc2FnZXNQYXRoIiwiaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImxpc3RCaW5kaW5nUmVsYXRpdmVQYXRoIiwiZ2V0UmVsYXRpdmVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUiLCJpc0EiLCJpc0luYWN0aXZlIiwiZ2V0QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiQnVzeUxvY2tlciIsImxvY2siLCJzZWxlY3RlZENvbnRleHRzIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsInJlc3VsdCIsImNsZWFyU2VsZWN0aW9uIiwiaXNSb290IiwicmVmcmVzaExpc3RCaW5kaW5nIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCIsInJlY29tbWVuZGF0aW9ucyIsImlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMiLCJvbkFmdGVyRGVsZXRlIiwiY29udGV4dHMiLCJ0YWJsZUFQSSIsImdldFBhcmVudCIsInRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJyZW1vdmVFbXB0eVJvd3NNZXNzYWdlcyIsInNldFVwRW1wdHlSb3dzIiwiX3NlbmRBY3Rpdml0eSIsIkFjdGl2aXR5IiwiRGVsZXRlIiwidW5sb2NrIiwidXBkYXRlRG9jdW1lbnQiLCJ1cGRhdGVkQ29udGV4dCIsInVwZGF0ZVByb21pc2UiLCJvcmlnaW5hbEJpbmRpbmdDb250ZXh0IiwiaXNEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsInN5bmNUYXNrIiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJlbnRpdHlTZXROYW1lIiwiZ2V0T2JqZWN0Iiwic2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJjdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsImN1cnJlbnRTZW1hbnRpY1BhdGgiLCJzZW1hbnRpY1BhdGgiLCJzQ2hhbmdlZFBhdGgiLCJnZXRTZW1hbnRpY1BhdGgiLCJTYXZlZCIsIkNsZWFyIiwic2hvd01lc3NhZ2VzIiwiZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24iLCJjcmVhdGVEb2N1bWVudCIsInNvdXJjZSIsIm1JblBhcmFtZXRlcnMiLCJvRGF0YUxpc3RCaW5kaW5nIiwiZGF0YU1vZGVsIiwic2VsZWN0ZWRQcm9wZXJ0aWVzIiwiJHNlbGVjdCIsIiQkZ3JvdXBJZCIsIkV4dGVybmFsIiwibGlzdEJpbmRpbmdGcm9tUGF0aCIsImJpbmRMaXN0IiwiY3JlYXRlQXRFbmQiLCJyZXNvbHZlZENyZWF0aW9uTW9kZSIsImdldFJvdXRlclByb3h5IiwicmVtb3ZlSUFwcFN0YXRlS2V5Iiwic2luZ2xlRHJhZnRGb3JDcmVhdGUiLCJnZXRNYW5pZmVzdCIsImFwcCIsImdldFJvb3RCaW5kaW5nIiwiZ2V0SGVhZGVyQ29udGV4dCIsIm5ld0JpbmRpbmciLCJnZXRDb250ZXh0IiwiU29ydGVyIiwiRmlsdGVyIiwiZmlsdGVycyIsInBhdGgiLCJvcGVyYXRvciIsInZhbHVlMSIsImFuZCIsInJlcXVlc3RDb250ZXh0cyIsInRoZW4iLCJkZXN0cm95IiwiX2hhbmRsZUNyZWF0aW9uTW9kZSIsInZMaXN0QmluZGluZyIsImNyZWF0ZUV4dGVybmFsRG9jdW1lbnQiLCJvdXRib3VuZCIsImNyZWF0ZURlZmVycmVkRG9jdW1lbnQiLCJDcmVhdGlvblJvdyIsImNyZWF0aW9uUm93IiwiY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQiLCJza2lwU2lkZUVmZmVjdHMiLCJJbmxpbmUiLCJjcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudCIsInRhYmxlSWQiLCJDcmVhdGlvbkRpYWxvZyIsImNyZWF0aW9uRGlhbG9nRmllbGRzIiwiY3JlYXRlRGlhbG9nQW5kU2F2ZURvY3VtZW50IiwiU3luYyIsImNyZWF0ZVN5bmNBc3luY0RvY3VtZW50IiwiYkZyb21EZWZlcnJlZCIsImNyZWF0ZUFjdGlvbiIsInBvc3REb2N1bWVudENyZWF0aW9uIiwicHJlcmVxdWlzaXRlIiwicGFyYW1zIiwib25BZnRlckNyZWF0ZSIsIm1ldGFDb250ZXh0Iiwic3RhcnRpbmdFbnRpdHlTZXQiLCJnZXRJbnRlcm5hbE1vZGVsIiwic2V0UHJvcGVydHkiLCJpc0xpc3RCaW5kaW5nQW5hbHl0aWNhbCIsImZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkIiwic2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlIiwiQ3JlYXRlIiwiaXNEcmFmdFJvb3QiLCJpc0Nvbm5lY3RlZCIsImNyZWF0aW9uIiwiYXBwQ29tcG9uZW50IiwibmF2aWdhdGlvbiIsImNyZWF0aW9uUm93Q29udGV4dCIsImRvY3VtZW50VmFsaWRhdGlvbiIsImdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uIiwiZW50aXR5VHlwZSIsImNyZWF0aW9uUm93UGF5bG9hZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJhdHRhY2hFdmVudE9uY2UiLCJzY3JvbGxUb0luZGV4IiwiZ2V0TGVuZ3RoIiwiaGFuZGxlQ3JlYXRlRXZlbnRzIiwiT2JqZWN0IiwiYXNzaWduIiwia2V5cyIsInByb3BlcnR5UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiZmluZEluZGV4IiwicHJvcGVydHkiLCJuYW1lIiwibWFwIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImJ1c3lNb2RlIiwiYnVzeUlkIiwiZ2V0VGFibGVEZWZpbml0aW9uIiwiYW5ub3RhdGlvbiIsImlkIiwiYmVmb3JlQ3JlYXRlQ2FsbEJhY2siLCJvbkJlZm9yZUNyZWF0ZSIsInNraXBQYXJhbWV0ZXJEaWFsb2ciLCJnZXRTdGFydHVwTW9kZSIsIkF1dG9DcmVhdGUiLCJfZ2V0UmVzb3VyY2VNb2RlbCIsImNyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJuZXdUcmFuc2llbnRDb250ZXh0IiwiY3JlYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJjYXRjaCIsInRyYWNlIiwiZGVsZXRlIiwiYWxsIiwiaXNMb2NrZWQiLCJjb250ZXh0SW5kZXgiLCJnZXRJbmRleCIsImFnZ3JlZ2F0aW9uRGF0YSIsImdldEFnZ3JlZ2F0aW9uIiwiaXNDcmVhdGVJblBsYWNlIiwiY3JlYXRlSW5QbGFjZSIsInNldFRpbWVvdXQiLCJnZXRCdXN5IiwiZm9jdXNSb3ciLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0VGV4dCIsInBhcmVudEluZGV4Iiwic2F2ZWREb2N1bWVudENvbnRleHQiLCJhZnRlckNyZWF0ZUluRGlhbG9nIiwib25CZWZvcmVTYXZlIiwic2F2ZURvY3VtZW50Iiwib25BZnRlclNhdmUiLCJyZWZyZXNoIiwiaXRlbUluZGV4IiwiYWZ0ZXJDcmVhdGVDYWxsQmFjayIsImdldEludGVybmFsUm91dGluZyIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsInJvdXRpbmdMaXN0ZW5lciIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY29yZVJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm5hdlBhcmFtZXRlcnMiLCJ0cmFuc2llbnQiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNyZWF0aW9uRmFpbGVkIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJpbmNsdWRlcyIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsImNvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwiY3JlYXRlUGF0aCIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJ2YWxpZGF0ZURvY3VtZW50IiwiY3JlYXRpb25Sb3dPYmplY3RzIiwiY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMiLCJkYXRhRm9yQ3JlYXRlIiwiaXNGcm9tQ29weVBhc3RlIiwiY3JlYXRlQXNJbmFjdGl2ZSIsInRhcmdldExpc3RCaW5kaW5nIiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImNyZWF0aW9uUHJvbWlzZXMiLCJwcm9wZXJ0eVZhbHVlcyIsImNyZWF0ZVBhcmFtZXRlcnMiLCJpbmFjdGl2ZSIsIiRraW5kIiwiY3JlYXRlZENvbnRleHRzIiwiYWN0aXZlQ29udGV4dHMiLCJlcnIiLCJfbVBhcmFtZXRlcnMiLCJvbkJlZm9yZURpc2NhcmQiLCJvbkJlZm9yZUV4ZWN1dGVBY3Rpb24iLCJvbkFmdGVyRGlzY2FyZCIsIm9Db250ZXh0IiwibVBhcmFtZXRlcnMiLCJpbmxpbmVFZGl0RmxvdyIsImlzSW5saW5lRWRpdFBvc3NpYmxlIiwiaW5saW5lRWRpdFNhdmUiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwibWVyZ2VQYXRjaERyYWZ0IiwiX3N1Ym1pdE9wZW5DaGFuZ2VzIiwicmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuIiwiY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbiIsInNQcm9ncmFtbWluZ01vZGVsIiwiaXNGY2xFbmFibGVkIiwiX3NpZGVFZmZlY3RzIiwiaGFuZGxlUGFnZUNoYW5nZUNvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImFjdGl2ZURvY3VtZW50Q29udGV4dCIsImdldENyZWF0aW9uTW9kZSIsIl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwiQWN0aXZhdGUiLCJkaXNjb25uZWN0IiwiX3RyaWdnZXJDb25maWd1cmVkU3VydmV5IiwiU3RhbmRhcmRBY3Rpb25zIiwic2F2ZSIsIlRyaWdnZXJUeXBlIiwic3RhbmRhcmRBY3Rpb24iLCJEaXNwbGF5Iiwic3RvcmVEYXRhRm9yVGVsZW1ldHJ5IiwiX2NyZWF0ZVNpYmxpbmdJbmZvIiwicHJldmlvdXNTZW1hbnRpY1BhdGgiLCJuZXdTZW1hbnRpY1BhdGgiLCJwYXRoTWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwic3RheU9uQ3VycmVudFBhZ2VBZnRlclNhdmUiLCJ0YXJnZXRDb250ZXh0Iiwic2tpcEJpbmRpbmdUb1ZpZXciLCJvRXJyb3IiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwiY2FuY2VsRG9jdW1lbnQiLCJpc05ld0RvY3VtZW50Iiwic2tpcERpc2NhcmRQb3BvdmVyIiwiZW5hYmxlZCIsImNhbmNlbFBhcmFtZXRlcnMiLCJjYW5jZWxCdXR0b24iLCJiZWZvcmVDYW5jZWxDYWxsQmFjayIsImNhbmNlbFJlc3VsdCIsImlzRG9jdW1lbnRNb2RpZmllZCIsImdldEluc3RhbmNlZFZpZXdzIiwidmlldyIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiRGlzY2FyZCIsInNraXBCYWNrTmF2aWdhdGlvbiIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0Iiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsInN0YXlPbkN1cnJlbnRQYWdlQWZ0ZXJDYW5jZWwiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlIiwiYmluZGluZ1BhcmFtZXRlcnMiLCJjcmVhdGVSb290Q29udGV4dCIsImlzUm9vdENvbnRleHROZXciLCJkcmFmdFByb3BlcnRpZXMiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsImNsb3NlT25Ccm93c2VyTmF2aWdhdGlvbiIsImRldGFjaEFmdGVyUm91dGVNYXRjaGVkIiwiZGVsZXRlRG9jdW1lbnQiLCJvQXBwQ29tcG9uZW50Iiwic2libGluZ0NvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImNvbnRleHRCaW5kaW5nIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiRGVlcGxpbmsiLCJleGl0RnJvbUFwcCIsImFwcGx5RG9jdW1lbnQiLCJvTG9ja09iamVjdCIsImlzQ29udGludWUiLCJzaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyIsIlJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24iLCJDb250aW51ZSIsImNhbGxFeHRlbnNpb24iLCJpbnZva2VBY3Rpb24iLCJzQWN0aW9uTmFtZSIsIm1FeHRyYVBhcmFtcyIsImFQYXJ0cyIsInNPdmVybG9hZEVudGl0eVR5cGUiLCJvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyIsIm9WaWV3IiwiaXNBcnJheSIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udmVydGVkTWV0YWRhdGEiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlDb250YWluZXIiLCJpc0JvdW5kIiwib0NvbnRyb2wiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImlnbm9yZUVUYWciLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgiLCJlbmFibGVBdXRvU2Nyb2xsIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsImdldElkIiwicmVzcG9uc2UiLCJjYWxsQWN0aW9uIiwic3VjY2Vzc0Z1bGxFeGVjdXRpb24iLCJpc0Z1bGZpbGxlZCIsImxpc3RSZWZyZXNoZWQiLCJfcmVmcmVzaExpc3RJZlJlcXVpcmVkIiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsIkFjdGlvbiIsInZhbHVlIiwiYm91bmRDb250ZXh0IiwiYWN0aW9uIiwiZlJlc29sdmVyIiwiY29udmVydGVyVHlwZSIsIl9nZXRCb3VuZENvbnRleHQiLCJyZXR1cm5lZENvbnRleHQiLCJvTWV0YU1vZGVsIiwic0NvbnRleHRNZXRhUGF0aCIsIl9mblZhbGlkQ29udGV4dHMiLCJhcHBsaWNhYmxlQ29udGV4dHMiLCJlbGVtZW50Iiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJpbmZvIiwib25BZnRlckFjdGlvbkV4ZWN1dGlvbiIsIm9SZXN1bHQiLCJmUmVqZWN0b3IiLCJfYWN0aW9uTmFtZSIsImN1c3RvbU1hc3NFZGl0U2F2ZSIsInNlY3VyZWRFeGVjdXRpb24iLCJmbkZ1bmN0aW9uIiwiYkJ1c3lTZXQiLCJidXN5Iiwic2V0IiwiYkJ1c3lDaGVjayIsImNoZWNrIiwiYlVwZGF0ZXNEb2N1bWVudCIsInVwZGF0ZXNEb2N1bWVudCIsImZpbmFsbHkiLCJoYW5kbGVQYXRjaFNlbnQiLCJvRXZlbnQiLCJpbnRlcm5hbENvbnRleHQiLCJ1aUNvbnRleHQiLCJnZXRTb3VyY2UiLCJzZXRJZ25vcmVFVGFnIiwiaGFuZGxlSW5saW5lRWRpdFBhdGNoU2VudCIsInNvdXJjZUJpbmRpbmciLCJvUGF0Y2hQcm9taXNlIiwicGF0Y2hDb21wbGV0ZWRFdmVudCIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlU2VudCIsImV2ZW50IiwibmV3VGFzayIsImRlYnVnIiwiY29tcHV0ZU1vZGVsc0ZvckVkaXRNb2RlIiwiZ2xvYmFsTW9kZWwiLCJmb3JjZURpc3BsYXlNb2RlIiwiaXNBY3RpdmVFbnRpdHkiLCJyZXF1ZXN0T2JqZWN0IiwiYWN0aXZhdGVDb2xsYWJvcmF0aW9uIiwiZmV0Y2hDb2xsYWJvcmF0aXZlRHJhZnRVc2Vyc1Byb21pc2UiLCJoYXNBY3RpdmVFbnRpdHkiLCJsYXN0SW52b2tlZEFjdGlvbk5hbWUiLCJpc05ld0FjdGlvbkZvclN0aWNreSIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsInNvdXJjZUNvbnRyb2wiLCJnZXRSZXNvdXJjZU1vZGVsIiwiVHJhbnNhY3Rpb25IZWxwZXIiLCJtZXNzYWdlSGFuZGxlciIsImdldFBhZ2VJbnRlcm5hbE1vZGVsIiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsInBhZ2VJbnRlcm5hbENvbnRleHQiLCJVaU1vZGVsQ29uc3RhbnRzIiwiQ3JlYXRlTW9kZSIsIkRvY3VtZW50TW9kaWZpZWQiLCJtb2RpZmllZCIsImJpbmRpbmciLCJtZXNzYWdlSGFuZGxpbmdLZXlTZXRzIiwiYXR0YWNoRXZlbnQiLCJldmVudEluc3RhbmNlIiwiZmluZCIsInN1Y2Nlc3MiLCJkcmFmdFN0YXR1cyIsImVkaXRNb2RlIiwiaXNDcmVhdGlvbiIsImZvcmNlZCIsInNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJhY3Rpb25OYW1lIiwic3RpY2t5U2Vzc2lvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwiaW50ZXJuYWxNb2RlbCIsInNldE5hdmlnYXRpb25HdWFyZCIsInN1YnN0cmluZyIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJiaW5kIiwiaTE4bk1vZGVsIiwicmVnaXN0ZXJTdGlja3lTZXNzaW9uQ2FsbGJhY2tzIiwiZ2V0RGlydHlTdGF0ZVByb3ZpZGVyIiwiZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbiIsImdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uIiwiaGFuZGxlU3RpY2t5T2ZmIiwiZGlzY2FyZE5hdmlnYXRpb25HdWFyZCIsInVucmVnaXN0ZXJTdGlja3lTZXNzaW9uQ2FsbGJhY2tzIiwiZ2V0SHR0cEhlYWRlcnMiLCJuYXZpZ2F0aW9uQ29udGV4dCIsInRhcmdldEhhc2giLCJpbm5lckFwcFJvdXRlIiwicm91dGVyUHJveHkiLCJsY2xIYXNoVHJhY2tlciIsImlzRGlydHkiLCJpc1Nlc3Npb25PbiIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJzZXREaXJ0eUZsYWciLCJ3YXJuaW5nRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJhZnRlckNsb3NlIiwiYWRkU3R5bGVDbGFzcyIsInNldE1vZGVsIiwiYWRkRGVwZW5kZW50Iiwib3BlbiIsImN1cnJlbnRIYXNoIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJjbGVhclNlc3Npb25Db250ZXh0IiwiZGlzY2FyZGVkQ29udGV4dCIsInN0aWNreSIsImRpc2NhcmREb2N1bWVudCIsInJlc2V0Q2hhbmdlcyIsIl9yb3V0aW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInJlc29sdmVGdW5jdGlvbiIsInJlamVjdEZ1bmN0aW9uIiwiYWN0aW9uUHJvbWlzZSIsImN1cnJlbnRWaWV3IiwibWV0YU1vZGVsRGF0YSIsIm1ldGFNb2RlbEFjdGlvbiIsImFjdGlvblJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsIiRUeXBlIiwiJEtleSIsIm9EYXRhIiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImlzU2F2ZSIsImNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2ciLCJDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2ciLCJfc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93Iiwicm93QmluZGluZyIsImFjdGl2ZVJvd0luZGV4IiwiZ2V0Q291bnQiLCJhbGxSb3dDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImluZGV4Iiwic2luZ2xlQ29udGV4dCIsImNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzIiwiaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSIsInJlbGF0ZWRDb250ZXh0cyIsInRyaWdnZXJlZEFjdGlvbk5hbWUiLCJhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIiwic2VuZCIsInRyaWdnZXJUeXBlIiwidHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJvTW9kZWwiLCJvUmVxdWVzdG9yIiwid2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwicHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uIiwiaGlzdG9yeSIsImJhY2siLCJuYXZpZ2F0aW9uUGFyYW1ldGVycyIsInBlcnNpc3RPUFNjcm9sbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJFZGl0Rmxvd0FjdGlvbiIsInNob3dQbGFjZWhvbGRlciIsImtlZXBDdXJyZW50TGF5b3V0IiwiYlJlZnJlc2hBZnRlckFjdGlvbiIsInZpc2libGVWaWV3SWRzIiwiX2dldEFsbFZpc2libGVWaWV3cyIsImFNZXNzYWdlcyIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJvUmVzcG9uc2UiLCJvQmluZGluZyIsImFLZXlzIiwib0N1cnJlbnREYXRhIiwiYlJldHVybmVkQ29udGV4dElzU2FtZSIsImV2ZXJ5Iiwic0tleSIsInNFbnRpdHlTZXROYW1lIiwiYVNlbWFudGljS2V5cyIsInBhdGhzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJvdmVybG9hZEVudGl0eVR5cGUiLCJjb250ZXh0U2VnbWVudHMiLCJjdXJyZW50Q29udGV4dCIsInBvcCIsInVuc2hpZnQiLCJwYXJlbnRDb250ZXh0cyIsInBhdGhTZWdtZW50IiwicmV2ZXJzZSIsIm92ZXJsb2FkQ29udGV4dCIsIm1hcHBpbmdzIiwic2V0UGF0aE1hcHBpbmciLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsImRvTm90Q29tcHV0ZUlmUm9vdCIsInN0YXJ0c1dpdGgiLCJyaWdodE1vc3RDb250ZXh0VG9Vc2UiLCJkcmFmdCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJjcmVhdGVOZXh0RG9jdW1lbnQiLCJiaW5kaW5nQ29udGV4dFBhdGgiLCJsaXN0QmluZGluZ1BhdGgiLCJsYXN0SW5kZXhPZiIsIkJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBJUm93QmluZGluZ0ludGVyZmFjZSBmcm9tIFwic2FwL2ZlL2NvcmUvSVJvd0JpbmRpbmdJbnRlcmZhY2VcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CYXNlQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IFN0YW5kYXJkQWN0aW9ucywgVHJpZ2dlclR5cGUsIHRyaWdnZXJDb25maWd1cmVkU3VydmV5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ZlZWRiYWNrXCI7XG5pbXBvcnQgdHlwZSBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEN1c3RvbU1lc3NhZ2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUge1xuXHRDYW5jZWxQYXJhbWV0ZXJzLFxuXHRDcmVhdGVQYXJhbWV0ZXJzLFxuXHRFZGl0VHJhbnNhY3Rpb25FeGVjdXRpb25EZXRhaWxzXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9UcmFuc2FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IFRyYW5zYWN0aW9uSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9UcmFuc2FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMsIFJvb3RDb250ZXh0SW5mbywgU2libGluZ0luZm9ybWF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgVWlNb2RlbENvbnN0YW50cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZWRpdEZsb3dDb25zdGFudHNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IHR5cGUgeyBIaWRkZW5EcmFmdCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBEcmFmdFNpYmxpbmdQYWlyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIEZjbENvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L0ZjbC5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBSb290Vmlld0Jhc2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9Sb290Vmlld0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycywgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgTWFjcm9UYWJsZSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGQgZnJvbSBcInNhcC91aS9tZGMvTXVsdGlWYWx1ZUZpZWxkXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ3JlYXRpb25Sb3cgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvQ3JlYXRpb25Sb3dcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQsIGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEVudGl0eVR5cGUgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHsgQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nLCBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIH0gZnJvbSBcIi4uL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dcIjtcbmltcG9ydCB7IENyZWF0aW9uTW9kZSwgdHlwZSBCYXNlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IGlzRnVsZmlsbGVkIH0gZnJvbSBcIi4uL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25SZXN1bHQgfSBmcm9tIFwiLi9lZGl0Rmxvdy9vcGVyYXRpb25zL09EYXRhT3BlcmF0aW9uXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwiLi9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbCxcblx0Q29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0RHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXMsXG5cdEVkaXRNb2RlID0gRkVMaWJyYXJ5LkVkaXRNb2RlLFxuXHRTdGFydHVwTW9kZSA9IEZFTGlicmFyeS5TdGFydHVwTW9kZTtcblxudHlwZSBTYXZlRG9jdW1lbnRQYXJhbWV0ZXJzID0ge1xuXHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcj86IGJvb2xlYW47XG5cdG1lcmdlUGF0Y2hEcmFmdD86IGJvb2xlYW47XG5cdHNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbjtcblx0YmluZGluZ3M/OiBPRGF0YUxpc3RCaW5kaW5nW107XG59O1xuXG50eXBlIEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRkYXRhPzogb2JqZWN0O1xuXHR0YWJsZUlkPzogc3RyaW5nO1xuXHRvdXRib3VuZD86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjkwLjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcIilcbmNsYXNzIEVkaXRGbG93IGV4dGVuZHMgQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgc3luY1Rhc2tzOiBQcm9taXNlPHVua25vd24+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0cHJpdmF0ZSBhY3Rpb25Qcm9taXNlPzogUHJvbWlzZTx7IGNvbnRyb2xJZD86IHN0cmluZzsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9PjtcblxuXHRwcml2YXRlIGNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/OiBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2c7XG5cblx0cHJpdmF0ZSBfaGlkZGVuRHJhZnQ6IEhpZGRlbkRyYWZ0IHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgZmV0Y2hDb2xsYWJvcmF0aXZlRHJhZnRVc2Vyc1Byb21pc2U6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpLkhpZGRlbkRyYWZ0IGFzIEhpZGRlbkRyYWZ0O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRJbnRlcmZhY2UoKTogQmFzZU9iamVjdCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldEludGVyZmFjZSgpO1xuXHR9XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIHRoZSBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBlZGl0YWJsZSBjb250ZXh0XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRjb25zdCBncm91cElkID0gXCJlZGl0R3JvdXBcIjtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQoY29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVFZGl0KHsgY29udGV4dDogcm9vdENvbnRleHQgfSk7XG5cblx0XHRcdGxldCByaWdodG1vc3RDb250ZXh0ID0gdGhpcy5faXNGY2xFbmFibGVkKCkgPyAocm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IGNvbnRleHQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocmlnaHRtb3N0Q29udGV4dCkgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gd2UgY2hlY2sgdGhlIHJpZ2h0bW9zdENvbnRleHQgY2FuIGJlIHVzZWQgaW4gZHJhZnRcblx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0cmFuc2FjdGlvbkRldGFpbHM6IEVkaXRUcmFuc2FjdGlvbkV4ZWN1dGlvbkRldGFpbHMgPSB7fTtcblx0XHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dFByb21pc2UgPSB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQoXG5cdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGdyb3VwSWQsXG5cdFx0XHRcdHRyYW5zYWN0aW9uRGV0YWlsc1xuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJvb3RDb250ZXh0SW5mbyA9IHtcblx0XHRcdFx0cm9vdFNpYmxpbmdQYXRoUHJvbWlzZTogbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXG5cdFx0XHRsZXQgc2libGluZ0luZm9Qcm9taXNlO1xuXHRcdFx0Ly8gcmlnaHRtb3N0Q29udGV4dCA9PT0gcm9vdENvbnRleHQgPT4gd2UncmUgaW4gT1AuIElmIG5vdCwgd2UncmUgaW4gbXVsdGktY29sdW1uIGxheW91dCBvZiBGQ0xcblx0XHRcdGNvbnN0IGNvbXB1dGVTaWJsaW5nSW5mbyA9IHJpZ2h0bW9zdENvbnRleHQgIT09IHJvb3RDb250ZXh0IHx8ICh2aWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxO1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRzaWJsaW5nSW5mb1Byb21pc2UgPSB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0SW5mbyxcblx0XHRcdFx0XHRncm91cElkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRjb250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goZ3JvdXBJZCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IChhd2FpdCBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlKSBhcyBDb250ZXh0O1xuXHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlOiBDb250ZXh0IHwgdW5kZWZpbmVkID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbyAmJiBjb250ZXh0VG9OYXZpZ2F0ZSkge1xuXHRcdFx0XHRpZiAoc2libGluZ0luZm8gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCxcblx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdFx0XCIkYXV0b1wiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHRoaXMuX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCwgc2libGluZ0luZm8pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3RvcnkoW10pO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiA9IGZhbHNlO1xuXHRcdFx0aWYgKG5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgJiZcblx0XHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0XHR0cmFuc2FjdGlvbkRldGFpbHMuZXhpc3RpbmdEcmFmdFJldXNlZCAhPT0gdHJ1ZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBUaGUgaW5pdGlhbCBzaGFyZSBhY3Rpb24gc2hhbGwgYmUgY2FsbGVkICAoZXhjZXB0IGlmIHRoZSBkcmFmdCBhbHJlYWR5IGV4aXN0ZWQpXG5cdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5zZXRJbml0aWFsU2hhcmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJFZGl0KHsgY29udGV4dDogY29udGV4dFRvTmF2aWdhdGUgfSk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUgYXMgQ29udGV4dCwge1xuXHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHJlY3JlYXRlQ29udGV4dDogZmFsc2UsXG5cdFx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0bGV0IHN0aWNreUNvbnRleHQ6IENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIHVzZSB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IHVzZWQgdG8gYmluZCB0aGUgcGFnZVxuXHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG5ld0RvY3VtZW50Q29udGV4dD8uZ2V0TW9kZWwoKS5nZXRLZWVwQWxpdmVDb250ZXh0KG5ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmhhbmRsZVN0aWNreU9uKHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG92ZXJyaWRlTWVzc2FnZVVJRGVjaXNpb24gPSB0cnVlO1xuXG5cdFx0XHRcdC8vIFdlIGNoYW5nZSB0aGUgZWRpdCBtb2RlIGFmdGVyIHRoZSBwYWdlIGJpbmRpbmcgaGFzIGJlZW4gZG9uZSwgb3RoZXJ3aXNlIHRoZSBjcmVhdGlvbiBvZiBlbXB0eSByb3dzIG1pZ2h0IGZhaWwgKGFzIHRoZSB0YWJsZSBpcyBzdGlsbCBvbiB0aGUgYWN0aXZlIHZlcnNpb24pXG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5LCBvdmVycmlkZVVJRGVjaXNpb246IG92ZXJyaWRlTWVzc2FnZVVJRGVjaXNpb24gfSk7XG5cdFx0XHRyZXR1cm4gY29udGV4dFRvTmF2aWdhdGU7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBzaWRlIGVmZmVjdHMgcmVxdWlyZWQgYWZ0ZXIgZGVsZXRpbmcgYW4gb2JqZWN0LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyB0aGUgZGVsZXRlZCBvYmplY3QgYmVsb25ncyB0b1xuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgcGFyZW50IG9iamVjdCBvZiB0aGUgZGVsZXRlZCBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgcmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRpZiAocGFyZW50Q29udGV4dCAmJiB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZywgcGFyZW50Q29udGV4dCkpIHtcblx0XHRcdGNvbnN0IHN0YXRlTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdC8vIEluIGNhc2Ugb2YgYSBUcmVlVGFibGUsIHdlIG5lZWQgdG8gcmVmcmVzaCBzdGF0ZSBtZXNzYWdlcyBmb3IgdGhlIE9iamVjdFBhZ2UsIGFzIHNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgbWlnaHQgYmUgYXR0YWNoZWRcblx0XHRcdC8vIHRvIGNoaWxkcmVuIG9mIGEgZGVsZXRlZCByb3cgd2hpY2ggbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkIHlldCwgYW5kIHRoZXJlZm9yZSB0aGUgbW9kZWwgd291bGRuJ3QgY2xlYW4gdXAgdGhlc2UgbWVzc2FnZXNcblx0XHRcdGlmIChzdGF0ZU1lc3NhZ2VzUGF0aCAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3N0YXRlTWVzc2FnZXNQYXRoXSwgcGFyZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdGlmIChwYXJlbnRDb250ZXh0KSB7XG5cdFx0XHRjb25zdCBsaXN0QmluZGluZ1JlbGF0aXZlUGF0aCA9IE1vZGVsSGVscGVyLmdldFJlbGF0aXZlTWV0YVBhdGhGb3JMaXN0QmluZGluZyhwYXJlbnRDb250ZXh0LCBsaXN0QmluZGluZyk7XG5cdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpICYmIGxpc3RCaW5kaW5nUmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZ1JlbGF0aXZlUGF0aCwgcGFyZW50Q29udGV4dCk7XG5cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHNldmVyYWwgZG9jdW1lbnRzLlxuXHQgKiBAcGFyYW0gY29udGV4dHNUb0RlbGV0ZSBUaGUgY29udGV4dHMgb2YgdGhlIGRvY3VtZW50cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubm9EaWFsb2dcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudHMgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGFzeW5jIGRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGNvbnRleHRzVG9EZWxldGU6IENvbnRleHRbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdGNvbnRyb2xJZDogc3RyaW5nO1xuXHRcdFx0bm9EaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzID0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMuY29udHJvbElkKSA/PyBFbGVtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRsZXQgaW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlOiBDb250ZXh0W10gPSBbXTtcblx0XHRpZiAocGFyZW50Q29udHJvbD8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSA9IGNvbnRleHRzVG9EZWxldGUuZmlsdGVyKChjb250ZXh0KSA9PiBjb250ZXh0LmlzSW5hY3RpdmUoKSk7XG5cdFx0fVxuXHRcdGlmICghcGFyZW50Q29udHJvbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyIGNvbnRyb2xJZCBtaXNzaW5nIG9yIGluY29ycmVjdFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gcGFyZW50Q29udHJvbCBhcyBDb250cm9sO1xuXHRcdH1cblx0XHRjb25zdCBsaXN0QmluZGluZyA9IChwYXJlbnRDb250cm9sLmdldEJpbmRpbmcoXCJpdGVtc1wiKSB8fCAocGFyZW50Q29udHJvbCBhcyBUYWJsZSkuZ2V0Um93QmluZGluZygpKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IHRydWU7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocGFyYW1ldGVycz8uc2VsZWN0ZWRDb250ZXh0cz8uWzBdID8/IGNvbnRleHRzVG9EZWxldGVbMF0pID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oY29udGV4dHNUb0RlbGV0ZSwgcGFyYW1ldGVycyk7XG5cblx0XHRcdGxldCByZXN1bHQ7XG5cblx0XHRcdC8vIE11bHRpcGxlIG9iamVjdCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhIGxpc3Rcblx0XHRcdC8vIEZpcnN0IGNsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRhYmxlIGFzIGl0J3Mgbm90IHZhbGlkIGFueSBtb3JlXG5cdFx0XHRpZiAocGFyZW50Q29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRwYXJlbnRDb250cm9sLmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZW4gcmVmcmVzaCB0aGUgbGlzdC1iaW5kaW5nIChMUiksIG9yIHJlcXVpcmUgc2lkZS1lZmZlY3RzIChPUClcblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRyZXN1bHQgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKGxpc3RCaW5kaW5nLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShsaXN0QmluZGluZywgdmlld0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVsZXRpbmcgYXQgbGVhc3Qgb25lIG9iamVjdCBzaG91bGQgYWxzbyBzZXQgdGhlIFVJIHRvIGRpcnR5XG5cdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQgPSB0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlzUmVjb21tZW5kYXRpb25FbmFibGVkKCk7XG5cdFx0XHQvLyBXZSBjbGVhciByZWNvbW1lbmRhdGlvbiBkYXRhIGFuZCBjb250ZXh0cyBmcm9tIGludGVybmFsIG1vZGVsIGZvciB0aGUgZGVsZXRlZCBjb250ZXh0c1xuXHRcdFx0aWYgKGlzUmVjb21tZW5kYXRpb25FbmFibGVkKSB7XG5cdFx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyhjb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vdGlmeSBjb25zdW1lcnMgb2Ygd2hpY2ggY29udGV4dHMgd2VyZSBkZWxldGVkXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckRlbGV0ZSh7IGNvbnRleHRzOiBjb250ZXh0c1RvRGVsZXRlIH0pO1xuXG5cdFx0XHRpZiAocGFyZW50Q29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IHBhcmVudENvbnRyb2wuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0YWJsZUFQST8udGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0XHRpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUubGVuZ3RoID4gMFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR0YWJsZUFQSS5yZW1vdmVFbXB0eVJvd3NNZXNzYWdlcyhpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0XHRcdGF3YWl0IHRhYmxlQVBJLnNldFVwRW1wdHlSb3dzKHBhcmVudENvbnRyb2wsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBjb250ZXh0c1RvRGVsZXRlKTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHJlc3VsdDtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gV2Ugc3RpbGwgd2FudCB0byByZWZyZXNoIHRoZSBsaXN0YmluZGluZyBpbiBjYXNlIHdlIGRlbGV0ZWQgc29tZSBpbmZvcm1hdGlvbiBidXQgbm90IGV2ZXJ5dGhpbmcgKERyYWZ0cyBmb3IgZXhhbXBsZSlcblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKGxpc3RCaW5kaW5nLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nLCB2aWV3QmluZGluZ0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50KHMpXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgYW5kIGRpc3BsYXlzIHRoZSBlcnJvciBtZXNzYWdlcyBpZiB0aGVyZSBhcmUgZXJyb3JzIGR1cmluZyBhbiB1cGRhdGUuXG5cdCAqIEBwYXJhbSB1cGRhdGVkQ29udGV4dCBDb250ZXh0IG9mIHRoZSB1cGRhdGVkIGZpZWxkXG5cdCAqIEBwYXJhbSB1cGRhdGVQcm9taXNlIFByb21pc2UgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLiBUaGUgcHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoZSBkcmFmdCBzdGF0dXMgY2FuIGJlIHVwZGF0ZWQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkcmFmdCBzdGF0dXMgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyB1cGRhdGVEb2N1bWVudCh1cGRhdGVkQ29udGV4dDogQmluZGluZyB8IENvbnRleHQsIHVwZGF0ZVByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvcmlnaW5hbEJpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBpc0RyYWZ0ID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHVwZGF0ZWRDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKGFzeW5jICgpID0+IHtcblx0XHRcdGlmIChvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdXBkYXRlUHJvbWlzZTtcblx0XHRcdFx0Y29uc3QgY3VycmVudEJpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICghaXNEcmFmdCB8fCAhY3VycmVudEJpbmRpbmdDb250ZXh0IHx8IGN1cnJlbnRCaW5kaW5nQ29udGV4dCAhPT0gb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdC8vIElmIGEgbmF2aWdhdGlvbiBoYXBwZW5lZCB3aGlsZSBvUHJvbWlzZSB3YXMgYmVpbmcgcmVzb2x2ZWQsIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgY2hhbmdlZFxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlJ3JlIHN0aWxsIG9uIHRoZSBzYW1lIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY3VycmVudEJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldE5hbWUgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhtZXRhTW9kZWwsIGVudGl0eVNldE5hbWUpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0c2VtYW50aWNLZXlzPy5sZW5ndGggJiZcblx0XHRcdFx0XHRjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UgJiYgLy8gV2UgZG9uJ3QgdXNlIHRoZSBzZW1hbnRpYyBrZXkgZm9yIGEgbmV3IGRvY3VtZW50IChjcmVhdGlvbilcblx0XHRcdFx0XHRjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWVcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY1BhdGggPSBjdXJyZW50U2VtYW50aWNNYXBwaW5nPy5zZW1hbnRpY1BhdGgsXG5cdFx0XHRcdFx0XHRzQ2hhbmdlZFBhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoY3VycmVudEJpbmRpbmdDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHQvLyBjdXJyZW50U2VtYW50aWNQYXRoIGNvdWxkIGJlIG51bGwgaWYgd2UgaGF2ZSBuYXZpZ2F0ZWQgdmlhIGRlZXAgbGluayB0aGVuIHRoZXJlIGFyZSBubyBzZW1hbnRpY01hcHBpbmdzIHRvIGNhbGN1bGF0ZSBpdCBmcm9tXG5cdFx0XHRcdFx0aWYgKGN1cnJlbnRTZW1hbnRpY1BhdGggJiYgY3VycmVudFNlbWFudGljUGF0aCAhPT0gc0NoYW5nZWRQYXRoKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dCwgeyBlZGl0YWJsZTogdHJ1ZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRpZiAoaXNEcmFmdCAmJiBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24oc2VsZWN0ZWRDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZCk6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoc2VsZWN0ZWRDb250ZXh0cyAmJiBzZWxlY3RlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIE9uZSBwYXJlbnQgYXQgbW9zdCAhIVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIGEgbmV3IGRvY3VtZW50IGluIGEgVHJlZVRhYmxlIHdpdGggJHtzZWxlY3RlZENvbnRleHRzLmxlbmd0aH0gcGFyZW50c2ApO1xuXHRcdH1cblxuXHRcdHJldHVybiBzZWxlY3RlZENvbnRleHRzPy5sZW5ndGggPT09IDEgPyBzZWxlY3RlZENvbnRleHRzWzBdIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgU3luYyAtIHRoZSBjcmVhdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQsIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQXN5bmMgLSB0aGUgY3JlYXRpb24gYW5kIHRoZSBuYXZpZ2F0aW9uIHRvIHRoZSBpbnN0YW5jZSBhcmUgZG9uZSBpbiBwYXJhbGxlbFxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZCAtIHRoZSBjcmVhdGlvbiBpcyBkb25lIG9uIHRoZSB0YXJnZXQgcGFnZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBDcmVhdGlvblJvdyAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSBhc3luYyBzbyB0aGUgdXNlciBpcyBub3QgYmxvY2tlZFxuXHQvLyBtUGFyYW1ldGVycy5jcmVhdGlvblJvdyBJbnN0YW5jZSBvZiB0aGUgY3JlYXRpb24gcm93IC0gKFRPRE86IGdldCByaWQgYnV0IHVzZSBsaXN0IGJpbmRpbmdzIG9ubHkpXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBzb3VyY2UgIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggb3IgYSB0YWJsZSBidWlsZGluZyBibG9jayBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOjxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBOZXdQYWdlIC0gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgaXMgc2hvd24gaW4gYSBuZXcgcGFnZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgbWV0YWRhdGEgJ1N5bmMnLCAnQXN5bmMnLCBvciAnRGVmZXJyZWQnIGlzIHVzZWQ8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgSW5saW5lIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgd2l0aGluIHRoZSB0YWJsZS4gTm90IHN1cHBvcnRlZCBvbiBhIExpc3QgUmVwb3J0PGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXIgJ291dGJvdW5kJzxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBDcmVhdGlvbkRpYWxvZyAtIHRoZSBjcmVhdGlvbiBpcyBkb25lIGluIHRoZSB0YWJsZSwgd2l0aCBhIGRpYWxvZyBhbGxvd2luZyB0byBzcGVjaWZ5IHNvbWUgaW5pdGlhbCBwcm9wZXJ0eSB2YWx1ZXMgKHRoZSBwcm9wZXJ0aWVzIGFyZSBsaXN0ZWQgaW4gYGNyZWF0aW9uRGlhbG9nRmllbGRzYClcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGFibGVJZCBJRCBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMub3V0Ym91bmQgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdFeHRlcm5hbCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgU3BlY2lmaWVzIGlmIHRoZSBuZXcgZW50cnkgc2hvdWxkIGJlIGNyZWF0ZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgYSB0YWJsZSBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnSW5saW5lJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kYXRhIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJ1c3lNb2RlIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyBUaGUgY29udGV4dHMgdGhhdCBhcmUgc2VsZWN0ZWQgaW4gdGhlIHRhYmxlIGluaXRpYXRpbmcgdGhlIGNyZWF0aW9uLiBVc2VkIGluIGNhc2Ugb2YgYSBUcmVlVGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBwYXJlbnQgY29udGV4dCBvZiB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZSBXaGVuIGVuYWJsZWQsIGFuIGV4dHJhIHJlcXVlc3QgY2hlY2tzIGlmIGFueSBkcmFmdHMgZXhpc3QgdGhhdCB3ZXJlIG5ldmVyIHNhdmVkLiBJZiB1bnNhdmVkIGRyYWZ0cyBhcmUgZm91bmQsIHRoZSBuZXdlc3Qgb25lIGlzIG9wZW5lZC4gSWYgbm8gdW5zYXZlZCBkcmFmdHMgYXJlIGZvdW5kLCBhIG5ldyBlbnRpdHkgaXMgY3JlYXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyBEZWZpbmVzIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgZGlzcGxheWVkIGluIHRoZSBjcmVhdGlvbiBkaWFsb2cgd2hlbiB0aGUgY3JlYXRpb24gbW9kZSBpcyBzZXQgdG8gJ0NyZWF0aW9uRGlhbG9nJy48YnIvPlRoZSB2YWx1ZSBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByb3BlcnR5IG5hbWVzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY3JlYXRlRG9jdW1lbnQoXG5cdFx0c291cmNlOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nIHwgTWFjcm9UYWJsZSxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdFx0XHRidXN5TW9kZT86IHN0cmluZztcblx0XHRcdGNyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdGNyZWF0aW9uUm93PzogQ3JlYXRpb25Sb3c7XG5cdFx0XHRkYXRhPzogb2JqZWN0O1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdG91dGJvdW5kPzogc3RyaW5nO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRzaW5nbGVEcmFmdEZvckNyZWF0ZT86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG9EYXRhTGlzdEJpbmRpbmchOiBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdGxldCBwYXJlbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IGRhdGFNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0bGV0IHNlbGVjdGVkUHJvcGVydGllczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChkYXRhTW9kZWwgJiYgTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQoZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0c2VsZWN0ZWRQcm9wZXJ0aWVzID0gXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlcixJc0FjdGl2ZUVudGl0eSxIYXNBY3RpdmVFbnRpdHlcIjtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIiAmJiBzb3VyY2UuaXNBICYmIHNvdXJjZS5pc0E8SVJvd0JpbmRpbmdJbnRlcmZhY2U+KFwic2FwLmZlLmNvcmUuSVJvd0JpbmRpbmdJbnRlcmZhY2VcIikpIHtcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPSBzb3VyY2UuZ2V0Um93QmluZGluZyh7XG5cdFx0XHRcdCRzZWxlY3Q6IHNlbGVjdGVkUHJvcGVydGllcyxcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLldvcmtlcnNcIlxuXHRcdFx0fSk7XG5cdFx0XHRzb3VyY2UgPSBvRGF0YUxpc3RCaW5kaW5nO1xuXHRcdH1cblxuXHRcdGlmIChtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKSB7XG5cdFx0XHRpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb25zdCBsaXN0QmluZGluZ0Zyb21QYXRoID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKT8uYmluZExpc3Qoc291cmNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JHNlbGVjdDogc2VsZWN0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5Xb3JrZXJzXCJcblx0XHRcdFx0fSkgYXMgT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKCFsaXN0QmluZGluZ0Zyb21QYXRoKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPSBsaXN0QmluZGluZ0Zyb21QYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRlbGV0ZSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZS5pc0EgJiYgc291cmNlLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPSBzb3VyY2U7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIG9iamVjdCBvciBwYXRoIGV4cGVjdGVkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwob0RhdGFMaXN0QmluZGluZykpIHtcblx0XHRcdFx0cGFyZW50Q29udGV4dCA9IHRoaXMuZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24obUluUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCByZXNvbHZlZENyZWF0aW9uTW9kZSA9IHRoaXMucmVzb2x2ZUNyZWF0aW9uTW9kZShtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSwgb0RhdGFMaXN0QmluZGluZywgbUluUGFyYW1ldGVycy5kYXRhKTtcblxuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKS5yZW1vdmVJQXBwU3RhdGVLZXkoKTtcblxuXHRcdGlmIChcblx0XHRcdChtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlICE9PSB1bmRlZmluZWRcblx0XHRcdFx0PyBtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlXG5cdFx0XHRcdDogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNYW5pZmVzdCgpW1wic2FwLmZlXCJdPy5hcHA/LnNpbmdsZURyYWZ0Rm9yQ3JlYXRlKSAmJlxuXHRcdFx0b0RhdGFMaXN0QmluZGluZyA9PT0gb0RhdGFMaXN0QmluZGluZy5nZXRSb290QmluZGluZygpICYmXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSAhPT0gbnVsbFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgbmV3QmluZGluZyA9IG9EYXRhTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKT8uYmluZExpc3QoXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldENvbnRleHQoKSxcblx0XHRcdFx0bmV3IFNvcnRlcihcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0xhc3RDaGFuZ2VEYXRlVGltZVwiLCB0cnVlKSxcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0ZmlsdGVyczogW1xuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IFwiSXNBY3RpdmVFbnRpdHlcIixcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCJIYXNBY3RpdmVFbnRpdHlcIixcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdGFuZDogdHJ1ZVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ld0JpbmRpbmc/LnJlcXVlc3RDb250ZXh0cygwLCAxKTtcblx0XHRcdGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlTmV3Q29udGV4dChyZXN1bHRbMF0sIHsgZWRpdGFibGU6IHRydWUsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UgfSkudGhlbigoKSA9PiBuZXdCaW5kaW5nPy5kZXN0cm95KCkpO1xuXHRcdFx0fVxuXHRcdFx0bmV3QmluZGluZz8uZGVzdHJveSgpO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZUNyZWF0aW9uTW9kZShcblx0XHRcdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHNvdXJjZSBhcyBzdHJpbmcgfCBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLFxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5faGFuZGxlQ3JlYXRpb25Nb2RlKFxuXHRcdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGUsXG5cdFx0XHRzb3VyY2UgYXMgc3RyaW5nIHwgT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0cGFyZW50Q29udGV4dFxuXHRcdCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlQ3JlYXRpb25Nb2RlKFxuXHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlOiBzdHJpbmcsXG5cdFx0dkxpc3RCaW5kaW5nOiBzdHJpbmcgfCBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmFtZXRlcnM6IEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRvRGF0YUxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmVudENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWRcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3RvcnkoW10pO1xuXHRcdHN3aXRjaCAocmVzb2x2ZWRDcmVhdGlvbk1vZGUpIHtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkV4dGVybmFsOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFeHRlcm5hbERvY3VtZW50KHZMaXN0QmluZGluZywgcGFyYW1ldGVycy5vdXRib3VuZCk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5EZWZlcnJlZDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGVmZXJyZWREb2N1bWVudChvRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0LCBwYXJhbWV0ZXJzLmRhdGEpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c6XG5cdFx0XHRcdHJldHVybiBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93XG5cdFx0XHRcdFx0PyB0aGlzLmNyZWF0ZUNyZWF0ZVJvd0RvY3VtZW50KHtcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25Sb3c6IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3csXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kXG5cdFx0XHRcdFx0ICB9KVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuSW5saW5lOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nOlxuXHRcdFx0XHRpZiAob0RhdGFMaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0XHQvLyBDcmVhdGlvbiB3aXRoIGRpYWxvZyBpbiBhbiBPYmplY3RQYWdlXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGlhbG9nSW5saW5lRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nLFxuXHRcdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEsXG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpb24gd2l0aCBkaWFsb2cgaW4gYSBMaXN0UmVwb3J0XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGlhbG9nQW5kU2F2ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEsXG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRcdFx0YkZyb21EZWZlcnJlZDogcGFyYW1ldGVycy5iRnJvbURlZmVycmVkLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNyZWF0ZUFjdGlvbjogcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpFeGVjdXRlcyB0aGUgbWFuZGF0b3J5IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXG5cdCAqIEBwYXJhbSBwcmVyZXF1aXNpdGUgUHJvbWlzZSBvZiB0aGUgZG9jdW1lbnQgY3JlYXRpb24gYW5kIHRoZSBmb2xsb3dpbmcgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgcG9zdERvY3VtZW50Q3JlYXRpb24ocHJlcmVxdWlzaXRlOiBQcm9taXNlPFtDb250ZXh0LCB1bmtub3duXT4sIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKTtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyYW1zID0gYXdhaXQgcHJlcmVxdWlzaXRlO1xuXHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IHBhcmFtc1swXTtcblx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckNyZWF0ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBjb21wdXRlTW9kZWxzRm9yRWRpdE1vZGVcblx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdC8vIFdvcmthcm91bmQgdG8gdGVsbCB0aGUgT1AgdGhhdCB3ZSd2ZSBjcmVhdGVkIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBMUlxuXHRcdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRjb25zdCBuZXdBY3Rpb24gPSBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgbmV3QWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSB8fFxuXHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0FuYWx5dGljYWwobGlzdEJpbmRpbmcpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gQ3JlYXRpbmcgYSBuZXcgaXRlbSBpbiBhIGhpZXJhcmNoeS9hbmFseXRpY2FsIHRhYmxlIGZyb20gdGhlIExpc3RSZXBvcnQgKHNpbmNlIHRoZSBsaXN0QmluZGluZyBpcyBub3QgcmVsYXRpdmUpXG5cdFx0XHRcdC8vIC0tPiB3ZSB3YW50IHRvIGZvcmNlIHRoZSB1c2VyIHRvIGVpdGhlciBzYXZlIG9yIGRpc2NhcmQgdGhlIGRyYWZ0IGJlZm9yZSBsZWF2aW5nIHRoZSBPUFxuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZShsaXN0QmluZGluZyk7XG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgbmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3QobmV3RG9jdW1lbnRDb250ZXh0KSAmJlxuXHRcdFx0XHQhdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhlIGluaXRpYWwgc2hhcmUgYWN0aW9uIHNoYWxsIGJlIGNhbGxlZFxuXHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LnNldEluaXRpYWxTaGFyZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB2aWEgdGhlIGNyZWF0aW9uUm93LlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFRoZSBuZXcgZG9jdW1lbnQgaXMgY3JlYXRlZCBhdCB0aGUgZW5kLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvblJvdyBUaGUgY3JlYXRpb24gcm93XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZUNyZWF0ZVJvd0RvY3VtZW50KHBhcmFtZXRlcnM6IHtcblx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0Y3JlYXRpb25Sb3c6IENyZWF0aW9uUm93O1xuXHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgY3JlYXRpb246IFByb21pc2U8Q29udGV4dD47XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRjb25zdCBjcmVhdGlvblJvdyA9IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3c7XG5cdFx0Y29uc3QgdGFibGUgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldFBhcmVudCgpIGFzIFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBuYXZpZ2F0aW9uID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKCF0YWJsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRhYmxlLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSBcIkNyZWF0aW9uUm93XCIgd2l0aCBhIFRyZWVUYWJsZWApO1xuXHRcdH1cblx0XHRjb25zdCBjcmVhdGlvblJvd0NvbnRleHQgPSBjcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3QgZG9jdW1lbnRWYWxpZGF0aW9uID0gdGhpcy5nZXRDcmVhdGlvblJvd1ZhbGlkYXRpb25GdW5jdGlvbih0YWJsZSk7XG5cdFx0Ly8gZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBpcyBzZXQgdG8gZmFsc2UgaW4gbWFuaWZlc3QgY29udmVydGVyIChUYWJsZS50cykgaWYgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIGV4aXN0c1xuXHRcdGlmIChjcmVhdGlvblJvdy5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dGaWVsZFZhbGlkaXR5XCIsIHt9KTtcblx0XHR9XG5cblx0XHRjb25zdCB2YWxpZGF0aW9uTWVzc2FnZXMgPSBhd2FpdCB0aGlzLnN5bmNUYXNrKGRvY3VtZW50VmFsaWRhdGlvbik7XG5cdFx0aWYgKHZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aGlzLmNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyh2YWxpZGF0aW9uTWVzc2FnZXMsIHRhYmxlKTtcblx0XHRcdExvZy5lcnJvcihcIkN1c3RvbSBWYWxpZGF0aW9uIGZhaWxlZFwiKTtcblx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNyZWF0aW9uUm93Q29udGV4dC5nZXRQYXRoKCkpKS50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93UGF5bG9hZCA9IGNyZWF0aW9uUm93Q29udGV4dC5nZXRPYmplY3QoKTtcblxuXHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXG5cdFx0Ly9tb3ZlZCBhZnRlciBfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzIHRvIGF2b2lkIFwiJ2NyZWF0aW9uJyB1c2UgYmVmb3JlIGluaXRpYWxpemF0aW9uXCIgY29uc29sZSBlcnJvcnNcblx0XHQvL2FmdGVyIHZhbGlkYXRpb24gZXJyb3JzIG9jY3VycmVkXG5cdFx0bGlzdEJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID8gdGFibGUuZ2V0Um93QmluZGluZygpLmdldExlbmd0aCgpIDogMCk7XG5cdFx0fSk7XG5cblx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhsaXN0QmluZGluZyk7XG5cdFx0dHJ5IHtcblx0XHRcdGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGE6IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHRcdC4uLk9iamVjdC5rZXlzKGNyZWF0aW9uUm93UGF5bG9hZClcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHRcdFx0XHQocHJvcGVydHlQYXRoOiBzdHJpbmcpID0+XG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmRJbmRleCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUgPT09IHByb3BlcnR5UGF0aCkgPT09IC0xXG5cdFx0XHRcdFx0XHRcdCkgLy8gZW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdFx0Lm1hcCgocGF0aCkgPT4gKHsgW3BhdGhdOiBjcmVhdGlvblJvd1BheWxvYWRbcGF0aF0gfSkpXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdFx0YnVzeUlkOiAodGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQsXG5cdFx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBhcHBDb21wb25lbnQuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KTtcblx0XHRcdC8vIFNpZGVFZmZlY3RzIG9uIENyZWF0ZVxuXHRcdFx0Ly8gaWYgU2F2ZSBpcyBwcmVzc2VkIGRpcmVjdGx5IGFmdGVyIGZpbGxpbmcgdGhlIENyZWF0aW9uUm93LCBubyBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdFx0XHRpZiAoIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgY3JlYXRpb247XG5cdFx0XHRjb25zdCBjcmVhdGlvblJvd0xpc3RCaW5kaW5nID0gY3JlYXRpb25Sb3dDb250ZXh0LmdldEJpbmRpbmcoKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0Y29uc3QgbmV3VHJhbnNpZW50Q29udGV4dCA9IGNyZWF0aW9uUm93TGlzdEJpbmRpbmcuY3JlYXRlKCk7XG5cdFx0XHRjcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChuZXdUcmFuc2llbnRDb250ZXh0KTtcblxuXHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvcnMgVE8gYmUgY2hlY2tlZCB3aXRoIG1vZGVsIGNvbGxlYWd1ZXNcblx0XHRcdG5ld1RyYW5zaWVudENvbnRleHQuY3JlYXRlZCgpPy5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBmYXN0IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdH0pO1xuXHRcdFx0bmF2aWdhdGlvbiA9IGNyZWF0aW9uUm93Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0cmV0dXJuIGF3YWl0IHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCBuYXZpZ2F0aW9uXSksIGxpc3RCaW5kaW5nKTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gUmVzZXQgYnVzeSBpbmRpY2F0b3IgYWZ0ZXIgYSB2YWxpZGF0aW9uIGVycm9yXG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSk7XG5cdFx0XHR9XG5cdFx0XHRMb2cuZXJyb3IoXCJDcmVhdGlvblJvdyBuYXZpZ2F0aW9uIGVycm9yOiBcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBpbiBJbmxpbmUgbW9kZSBvciB3aXRoIGEgY3JlYXRpb24gaW5saW5lIGRpYWxvZyAoT2JqZWN0IHBhZ2UgY2FzZSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFRoZSBuZXcgZG9jdW1lbnQgaXMgY3JlYXRlZCBhdCB0aGUgZW5kXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy50YWJsZUlkIFRoZSBpZCBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCBQYXJlbnQgY29udGV4dCAoZm9yIFRyZWVUYWJsZSlcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSBJbnRpYWwgZGF0YSBmb3IgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgRmllbGRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY3JlYXRpb24gZGlhbG9nXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRGlhbG9nSW5saW5lRG9jdW1lbnQoXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuSW5saW5lIHwgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRkYXRhPzogb2JqZWN0O1xuXHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcblx0XHR9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCB0YWJsZTogVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKHBhcmFtZXRlcnMudGFibGVJZCkge1xuXHRcdFx0dGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMudGFibGVJZCkgYXMgVGFibGU7XG5cdFx0fVxuXHRcdGlmICh0YWJsZT8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdHRhYmxlLmdldFJvd0JpbmRpbmcoKS5hdHRhY2hFdmVudE9uY2UoXCJjcmVhdGVDb21wbGV0ZWRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgY3JlYXRpb247XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRJbmRleCA9IG5ld0NvbnRleHQuZ2V0SW5kZXgoKTtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EYXRhID0gbGlzdEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGNyZWF0ZUluUGxhY2U/OiBib29sZWFuIH0gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGNvbnN0IGlzQ3JlYXRlSW5QbGFjZSA9IGFnZ3JlZ2F0aW9uRGF0YT8uY3JlYXRlSW5QbGFjZSA/PyBmYWxzZTtcblxuXHRcdFx0XHRpZiAoY29udGV4dEluZGV4ICE9PSB1bmRlZmluZWQgJiYgY29udGV4dEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmICghdGFibGU/LmdldEJ1c3koKSkge1xuXHRcdFx0XHRcdFx0XHR0YWJsZT8uZm9jdXNSb3coY29udGV4dEluZGV4LCB0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0NyZWF0ZUluUGxhY2UpIHtcblx0XHRcdFx0XHQvLyBGb3IgY3JlYXRlIGluLXBsYWNlIG1vZGUgKHNlcnZlciBwb3NpdGlvbiksIGRpc3BsYXkgYSB3YXJuaW5nIG1lc3NhZ2UgaW4gY2FzZSB0aGUgbmV3bHkgY3JlYXRlZCBub2RlIGlzbid0IHZpc2libGVcblx0XHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyh0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCkuZ2V0VGV4dChcIkNfTkVXX0VMRU1FTlRfTk9UX0RJU1BMQVlFRFwiKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpICYmICFpc0NyZWF0ZUluUGxhY2UpIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgdHJlZSB0YWJsZSwgd2UgYWxzbyBzY3JvbGwgdG8ga2VlcCB0aGUgcGFyZW50IHZpc2libGVcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRDb250ZXh0ID0gbmV3Q29udGV4dC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudENvbnRleHQ/LmdldEluZGV4KCk7XG5cdFx0XHRcdFx0aWYgKHBhcmVudEluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFyZW50SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgocGFyZW50SW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhYmxlID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKGxpc3RCaW5kaW5nKTtcblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0e1xuXHRcdFx0XHQvL0NoZWNrIGlmIEFsbCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWRcblx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0YnVzeUlkOiAodGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQsXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQsXG5cdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHNcblx0XHRcdH0sXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXG5cdFx0aWYgKCFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIHRoaXMuc3luY1Rhc2soY3JlYXRpb24pXSksIGxpc3RCaW5kaW5nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHZpYSBhIGRpYWxvZyBhbmQgc2F2ZXMgaXQgaW1tZWRpYXRlbHkgKExpc3RSZXBvcnQgY2FzZSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IFBhcmVudCBjb250ZXh0IChmb3IgVHJlZVRhYmxlKVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEludGlhbCBkYXRhIGZvciBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyBGaWVsZHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjcmVhdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEaWFsb2dBbmRTYXZlRG9jdW1lbnQoXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRkYXRhPzogb2JqZWN0O1xuXHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcblx0XHR9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCB0YWJsZTogVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKHBhcmFtZXRlcnMudGFibGVJZCkge1xuXHRcdFx0dGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMudGFibGVJZCkgYXMgVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodGFibGU/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpICE9PSB0cnVlKSB7XG5cdFx0XHRcdHRhYmxlID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBzYXZlZERvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBhZnRlckNyZWF0ZUluRGlhbG9nID0gYXN5bmMgKG5ld0RvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyQ3JlYXRlKHsgY29udGV4dDogbmV3RG9jdW1lbnRDb250ZXh0IH0pO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Ly8gRXJyb3JzIGluIG9uQWZ0ZXJDcmVhdGUgYXJlIG5vdCBjYXVzaW5nIHRoZSBvdmVyYWxsIGZsb3cgdG8gZmFpbFxuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciBhZnRlciBjcmVhdGlvbjogXCIgKyBlcnJvcik7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZVNhdmUoeyBjb250ZXh0OiBuZXdEb2N1bWVudENvbnRleHQgfSk7XG5cdFx0XHRzYXZlZERvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5zYXZlRG9jdW1lbnQoXG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0W10sXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dHJ1ZVxuXHRcdFx0KTtcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJTYXZlKHtcblx0XHRcdFx0XHRjb250ZXh0OiBzYXZlZERvY3VtZW50Q29udGV4dFxuXHRcdFx0XHR9KTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdC8vIEVycm9ycyBpbiBvbkFmdGVyU2F2ZSBhcmUgbm90IGNhdXNpbmcgdGhlIG92ZXJhbGwgZmxvdyB0byBmYWlsXG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGFmdGVyIHNhdmU6IFwiICsgZXJyb3IpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBUcmVlVGFibGUsIHdlIGRvbid0IHVzZSB0aGUgbGlzdEJpbmRpbmcgZnJvbSB0aGUgTGlzdFJlcG9ydCB0byBjcmVhdGUgdGhlIG5ldyBpdGVtLFxuXHRcdFx0XHQvLyBTbyB3ZSBjYW4ndCBrbm93IHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IGl0ZW0gaW4gdGhlIGxpc3RCaW5kaW5nXG5cdFx0XHRcdC8vIC0tPiBXZSByZWZyZXNoIHRoZSB0YWJsZSBhbmQgc2Nyb2xsIHRvIHRoZSBwYXJlbnQgcG9zaXRpb25cblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICh0YWJsZUFQSSkge1xuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEluZGV4ID0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0Py5nZXRJbmRleCgpO1xuXHRcdFx0XHRcdHRhYmxlQVBJLnJlZnJlc2goKTtcblx0XHRcdFx0XHRpZiAocGFyZW50SW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0XHR0YWJsZT8uc2Nyb2xsVG9JbmRleChwYXJlbnRJbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgZmxhdCB0YWJsZSwgd2UgY2FuIHNjcm9sbCB0byB0aGUgbmV3bHkgY3JlYXRlZCBpdGVtXG5cdFx0XHRcdGNvbnN0IGl0ZW1JbmRleCA9IHNhdmVkRG9jdW1lbnRDb250ZXh0LmdldEluZGV4KCk7XG5cdFx0XHRcdGlmIChpdGVtSW5kZXggIT09IHVuZGVmaW5lZCAmJiBpdGVtSW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdHRhYmxlPy5zY3JvbGxUb0luZGV4KGl0ZW1JbmRleCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0Ly9DaGVjayBpZiBBbGwgcGFyYW1ldGVycyBhcmUgbmVlZGVkXG5cdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0YWZ0ZXJDcmVhdGVDYWxsQmFjazogYWZ0ZXJDcmVhdGVJbkRpYWxvZyxcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlLCAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2csXG5cdFx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCxcblx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkczogcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkc1xuXHRcdFx0fSxcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cblx0XHRhd2FpdCBQcm9taXNlLmFsbChbY3JlYXRpb24sIHRoaXMuc3luY1Rhc2soY3JlYXRpb24pXSk7XG5cdFx0aWYgKHNhdmVkRG9jdW1lbnRDb250ZXh0ICYmIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzICE9PSB0cnVlKSB7XG5cdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZywgc2F2ZWREb2N1bWVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZGVmZXJyZWQgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBPcHRpb25hbCBwYXJlbnQgY29udGV4dCB3aGVuIGNyZWF0aW5nIGEgbm9kZSBpbiBUcmVlVGFibGVcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURlZmVycmVkRG9jdW1lbnQobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCwgZGF0YT86IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobGlzdEJpbmRpbmcsIHtcblx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7IG1vZGU6IFwiRGVmZXJyZWRcIiwgcGFyZW50Q29udGV4dCwgbGlzdEJpbmRpbmcsIGRhdGEgfSxcblx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdH0pO1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzeW5jIG9yIGFzeW5jIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgc3luYyBvciBhc3luYyBjcmVhdGlvbiBtb2RlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgVGhpcyBkb2N1bWVudCBpcyBjcmVhdGVkIGFmdGVyIGEgZGVmZmVyZWQgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uICBUaGUgY3JlYXRlIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIGNyZWF0ZSBhY3Rpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSAgRGF0YSB0byBzYXZlIG9uIHRoZSBuZXcgZG9jdW1lbnRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgbmF2aWdhdGlvbjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3Qgcm91dGluZ0xpc3RlbmVyID0gdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKVxuXHRcdFx0LmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC4uLnBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0Li4ue1xuXHRcdFx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdClcblx0XHRcdC50aGVuKChuZXdEb2N1bWVudENvbnRleHQpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmIG5ld0RvY3VtZW50Q29udGV4dCAmJiBuZXdEb2N1bWVudENvbnRleHQuZ2V0QmluZGluZygpICE9PSBsaXN0QmluZGluZykge1xuXHRcdFx0XHRcdC8vIEluIEZDTCBjYXNlLCBpZiB0aGUgbmV3IGNvbnRleHQgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIGFuIGFjdGlvbiAobm90IHdpdGggdGhlIHN0YW5kYXJkIFBPU1QgY3JlYXRlKSwgd2UgbmVlZCB0byByZWZyZXNoXG5cdFx0XHRcdFx0Ly8gdGhlIG9yaWdpbmFsIGxpc3RCaW5kaW5nIHNvIHRoYXQgaXQgY29udGFpbnMgdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0ICh0aGlzIGlzIGRvbmUgYXV0b21hdGljYWxseSBieSB0aGUgbGlzdEJpbmRpbmcgZm9yIHN0YW5kYXJkIGNyZWF0ZSlcblx0XHRcdFx0XHRsaXN0QmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0fSk7XG5cblx0XHQvLyBEb24ndCBkbyB0aGlzIGlmIHRoZSBpbnZvY2F0aW9uIGNvbWVzIGZyb20gYSBkZWZlcnJlZCBjcmVhdGlvbiBvciBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3dcblx0XHRpZiAocGFyYW1ldGVycy5iRnJvbURlZmVycmVkICE9PSB0cnVlICYmICFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdH1cblxuXHRcdGlmIChwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkFzeW5jKSB7XG5cdFx0XHRuYXZpZ2F0aW9uID0gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChsaXN0QmluZGluZywge1xuXHRcdFx0XHRjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVyczogeyBtb2RlOiBcIkFzeW5jXCIsIGNyZWF0ZUNvbnRleHRQcm9taXNlOiBjcmVhdGlvbiB9LFxuXHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5hdmlnYXRpb24gPSBjcmVhdGlvbi50aGVuKGFzeW5jIChuZXdEb2N1bWVudENvbnRleHQpID0+IHtcblx0XHRcdFx0aWYgKCFuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRcdHJldHVybiByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVUb01lc3NhZ2VQYWdlKGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdFx0dGl0bGU6IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIFN5bmMgY3JlYXRpb24gd2FzIHRyaWdnZXJlZCBmb3IgYSBkZWZlcnJlZCBjcmVhdGlvbiwgd2UgZG9uJ3QgbmF2aWdhdGUgZm9yd2FyZFxuXHRcdFx0XHRcdC8vIGFzIHdlJ3JlIGFscmVhZHkgb24gdGhlIGNvcnJlc3BvbmRpbmcgT2JqZWN0UGFnZVxuXHRcdFx0XHRcdGNvbnN0IG5hdlBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZSxcblx0XHRcdFx0XHRcdHRyYW5zaWVudDpcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKSA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiA/IHRydWUgOiB1bmRlZmluZWRcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZFxuXHRcdFx0XHRcdFx0PyByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVUb0NvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LCBuYXZQYXJhbWV0ZXJzKVxuXHRcdFx0XHRcdFx0OiByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG5ld0RvY3VtZW50Q29udGV4dCwgbmF2UGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIG5hdmlnYXRpb25dKSwgbGlzdEJpbmRpbmcpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHQvLyBjcmVhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYnkgdXNlciBvciBmYWlsZWQgaW4gYmFja2VuZCA9PiBpbiBjYXNlIHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRyYW5zaWVudCBjb250ZXh0IGJlZm9yZSwgbmF2aWdhdGUgYmFja1xuXHRcdFx0Ly8gdGhlIHN3aXRjaC1zdGF0ZW1lbnQgYWJvdmUgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGhhcHBlbnMgaW4gY3JlYXRpb25Nb2RlcyBkZWZlcnJlZCBhbmQgYXN5bmMuIEJ1dCBpbiBmYWN0LCBpbiB0aGVzZSBjYXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBmcm9tIHJvdXRlTWF0Y2hlZCBpbiBPUCBjb21wb25lbnRcblx0XHRcdC8vIGNyZWF0ZURlZmVycmVkRG9jdW1lbnQgaXMgdHJpZ2dlcmVkLCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCAoY3JlYXRlRG9jdW1lbnQpIGFnYWluIC0gdGhpcyB0aW1lIHdpdGggY3JlYXRpb25Nb2RlIHN5bmMuIFRoZXJlZm9yZSwgYWxzbyBpbiB0aGF0IG1vZGUgd2UgbmVlZCB0byB0cmlnZ2VyIGJhY2sgbmF2aWdhdGlvbi5cblx0XHRcdC8vIFRoZSBvdGhlciBjYXNlcyBtaWdodCBzdGlsbCBiZSBuZWVkZWQgaW4gY2FzZSB0aGUgbmF2aWdhdGlvbiBmYWlscy5cblx0XHRcdGlmIChcblx0XHRcdFx0W1xuXHRcdFx0XHRcdENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2csXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCxcblx0XHRcdFx0XHRDb25zdGFudHMuQ3JlYXRpb25GYWlsZWQsXG5cdFx0XHRcdFx0Q29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkXG5cdFx0XHRcdF0uaW5jbHVkZXMoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcilcblx0XHRcdCkge1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGV4dGVybmFsIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIG91dGJvdW5kIFRoZSBvdXRib3VuZCBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRXh0ZXJuYWxEb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZywgb3V0Ym91bmQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBUT0RPOiBDYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChjdXJyZW50bHkgdXNpbmcgdGhlIHNhbWUgYXMgZm9yIG91dGJvdW5kIGNoZXZyb24gbmF2LCBhbmQgd2l0aG91dCBhbnkgY29udGV4dCAtIDNyZCBwYXJhbSlcblx0XHRpZiAob3V0Ym91bmQpIHtcblx0XHRcdGlmICh0eXBlb2YgbGlzdEJpbmRpbmcgIT09IFwic3RyaW5nXCIgJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSBcIkV4dGVybmFsXCIgd2l0aCBhIFRyZWVUYWJsZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyO1xuXHRcdFx0Y29uc3QgY3JlYXRlUGF0aCA9IE1vZGVsSGVscGVyLmdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyh0aGlzLmJhc2UuZ2V0VmlldygpLCBsaXN0QmluZGluZyk7XG5cdFx0XHRjb250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKGNvbnRyb2xsZXIsIG91dGJvdW5kLCB1bmRlZmluZWQsIGNyZWF0ZVBhdGgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB0byBleGVjdXRlIGFmdGVyIHRoZSBkb2N1bWVudCBjcmVhdGlvbi5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjcmVhdGlvblByb21pc2UgVGhlIHByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIFNpZGVFZmZlY3RzIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0aGFuZGxlU2lkZUVmZmVjdHMgPSBhc3luYyAobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0aW9uUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0Pik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgY3JlYXRpb25Qcm9taXNlO1xuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZywgdmlld0JpbmRpbmdDb250ZXh0KTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZXMgVGhlIGVycm9yIG1lc3NhZ2VzIGZvcm0gdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdGFyZ2V0ZWQgYnkgdGhlIG1lc3NhZ2VzXG5cdCAqL1xuXHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAodmFsaWRhdGlvbk1lc3NhZ2VzOiB7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdLCB0YWJsZTogVGFibGUpOiB2b2lkID0+IHtcblx0XHRjb25zdCBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRpdHkgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0Y29uc3QgY3VzdG9tTWVzc2FnZXM6IEN1c3RvbU1lc3NhZ2VbXSA9IFtdO1xuXHRcdGxldCBmaWVsZENvbnRyb2w7XG5cdFx0bGV0IGZpbmFsVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0Y29uc3Qgb2xkTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0Q29kZSgpID09PSBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pO1xuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhvbGRNZXNzYWdlcyk7XG5cblx0XHR2YWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgodmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcblx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdGZpZWxkQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0ZmluYWxUYXJnZXQgPSBgJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdC8vIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2UgaWYgc3RpbGwgbm90IGV4aXN0c1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IU1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSkubGVuZ3RoXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZTogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0dGVjaG5pY2FsOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogZmluYWxUYXJnZXRcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXJcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSk7XG5cdFx0XHRcdGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHR0ZXh0OiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGN1c3RvbU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGN1c3RvbU1lc3NhZ2VzXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlc29sdmVzIHRoZSBjcmVhdGlvbiBtb2RlXG5cdCAqIFByb3ZpZGVzIHRoZSBleHBlY3RlZCBjcmVhdGlvbiBtb2RlOlxuXHQgKiAtIHByZXNlcnZlcyB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGUgd2hlbiB0aGlzIG9uZSBpcyBub3QgYSBOZXdQYWdlXG5cdCAqIC0gY2FsY3VsYXRlcyB0aGUgbmV3IG9uZSBpZiB0aGUgY3JlYXRpb24gbW9kZSBpcyBhIE5ld1BhZ2UuXG5cdCAqIEBwYXJhbSBpbml0aWFsQ3JlYXRpb25Nb2RlIFRoZSBpbml0aWFsIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGNyZWF0ZURhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3Igb2JqZWN0IGNyZWF0aW9uXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgY3JlYXRpb24gbW9kZVxuXHQgKi9cblx0cmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChpbml0aWFsQ3JlYXRpb25Nb2RlOiBzdHJpbmcsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuXHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdFx0Ly8gTmV3QWN0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBOYXZpZ2F0aW9uUHJvcGVydHkgY29sbGVjdGlvblxuXHRcdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRuZXdBY3Rpb24gPSAoXG5cdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdD8gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ6IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHRcdCk/Lk5ld0FjdGlvbj8udG9TdHJpbmcoKTtcblxuXHRcdFx0XHRpZiAobmV3QWN0aW9uICYmIGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aC50YXJnZXRFbnRpdHlUeXBlLmFjdGlvbnNbbmV3QWN0aW9uXS5wYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdGFzeW5jIHZhbGlkYXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiB7IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbj86IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuXHQpOiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgcmVzdWx0IG9mXG5cdCAqIGEgY3JlYXRpb24gcm93J3MgY3VzdG9tIHZhbGlkYXRpb24gYXMgYSBwcm9taXNlLiBJZiBubyBjcmVhdGlvbiByb3cgaXMgaW52b2x2ZWRcblx0ICogdGhlIHJlc3VsdGluZyBmdW5jdGlvbiByZXR1cm5zIGEgcmVzb2x2ZWQgcHJvbWlzZS5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aXRoIHRoZSBjcmVhdGlvblJvd1xuXHQgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2Vcblx0ICovXG5cdGdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZCk6ICgpID0+IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gdGFibGU/LmdldENyZWF0aW9uUm93KCk7XG5cdFx0aWYgKGNyZWF0aW9uUm93ICYmIHRhYmxlKSB7XG5cdFx0XHRyZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4gPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGlvblJvd09iamVjdHMgPSAoY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KS5nZXRPYmplY3QoKTtcblx0XHRcdFx0ZGVsZXRlIGNyZWF0aW9uUm93T2JqZWN0c1tcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbGlkYXRlRG9jdW1lbnQodGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0ZGF0YTogY3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogdGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIGFzeW5jICgpID0+IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyB1c2VkIHRvIGNyZWF0ZSB0aGUgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBkYXRhRm9yQ3JlYXRlIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBuZXcgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBjcmVhdGVBdEVuZCBUcnVlIGlmIHRoZSBuZXcgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGFzIGluYWN0aXZlXG5cdCAqIEBwYXJhbSByZXF1ZXN0U2lkZUVmZmVjdHMgVHJ1ZSBieSBkZWZhdWx0LCBmYWxzZSBpZiBTaWRlRWZmZWN0cyBzaG91bGQgbm90IGJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0cy5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGRhdGFGb3JDcmVhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdFx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW4sXG5cdFx0aXNGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb24sXG5cdFx0Y3JlYXRlQXNJbmFjdGl2ZSA9IGZhbHNlLFxuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxDb250ZXh0W10+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdEJpbmRpbmcgPSBsaXN0QmluZGluZztcblx0XHRyZXF1ZXN0U2lkZUVmZmVjdHMgPSByZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YXJnZXRMaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0bGV0IG1ldGFQYXRoOiBzdHJpbmc7XG5cblx0XHRcdGlmICh0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHt0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyh0YXJnZXRMaXN0QmluZGluZyk7XG5cblx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRjb25zdCBjcmVhdGlvblByb21pc2VzID0gZGF0YUZvckNyZWF0ZS5tYXAoYXN5bmMgKHByb3BlcnR5VmFsdWVzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgPSB7IGRhdGE6IHt9LCBwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBkZWVwIGNyZWF0ZVxuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UGF0aCBpbiBwcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHttZXRhUGF0aH0vJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0cHJvcGVydHkgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdFx0XHQhcHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5kYXRhIVtwcm9wZXJ0eVBhdGhdID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdHRhcmdldExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGlzRnJvbUNvcHlQYXN0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKHRhcmdldExpc3RCaW5kaW5nKTtcblx0XHRcdH1cblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dHMgPSBjcmVhdGVkQ29udGV4dHMuZmlsdGVyKChuZXdDb250ZXh0KSA9PiAhbmV3Q29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoYWN0aXZlQ29udGV4dHMubWFwKGFzeW5jIChuZXdDb250ZXh0KSA9PiBuZXdDb250ZXh0LmNyZWF0ZWQoKSkpO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKHJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZywgdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSAmJiBhY3RpdmVDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2ZUNvbnRleHRzKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dFBhdGg/OiBzdHJpbmc7IGNyZWF0ZVBhcmFtZXRlcnM/OiB1bmtub3duW10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlU2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRhc3luYyBvbkJlZm9yZVNhdmUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURpc2NhcmQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSBhY3Rpb24gZXhlY3V0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRXhlY3V0ZUFjdGlvblxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHRoZSBhY3Rpb24gZXhlY3V0aW9uXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFeGVjdXRlQWN0aW9uKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfCBDb250ZXh0IHwgbnVsbCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlclNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IHdlIG9idGFpbmVkIGFmdGVyIHNhdmluZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkFmdGVyRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIGNvbnRleHQgb2J0YWluZWQgYWZ0ZXIgZGlzY2FyZGluZyB0aGUgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgd2UgZGlzY2FyZGVkIGEgbmV3IG9iamVjdFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckRlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRGVsZXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBJbmRpY2F0ZXMgd2hldGhlciBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGlnbm9yZWQgd2hlbiB1c2VyIGNsaWNrcyBvbiBTYXZlIGR1cmluZyBhbiBJbmxpbmUgY3JlYXRpb25cblx0Ly8gQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIExpc3QgYmluZGluZ3Mgb2YgdGhlIHRhYmxlcyBpbiB0aGUgdmlldy5cblx0Ly8gQm90aCBvZiB0aGUgYWJvdmUgcGFyYW1ldGVycyBhcmUgZm9yIHRoZSBzYW1lIHB1cnBvc2UuIFVzZXIgY2FuIGVudGVyIHNvbWUgaW5mb3JtYXRpb24gaW4gdGhlIGNyZWF0aW9uIHJvdyhzKSBidXQgZG9lcyBub3QgJ0FkZCByb3cnLCBpbnN0ZWFkIGNsaWNrcyBTYXZlLlxuXHQvLyBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBpbiB0aGUgdmlldy5cblxuXHQvKipcblx0ICogU2F2ZXMgYSBuZXcgZG9jdW1lbnQgYWZ0ZXIgY2hlY2tpbmcgaXQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2F2ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogU2F2ZURvY3VtZW50UGFyYW1ldGVycyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHNhdmVEb2N1bWVudCBpcyBjYWxsZWQgZnJvbSBpbmxpbmUgZWRpdCBrZXlib2FyZCBzaG9ydGN1dFxuXHRcdGlmIChcblx0XHRcdCF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpICYmXG5cdFx0XHR0aGlzLmJhc2UuaW5saW5lRWRpdEZsb3c/LmlzSW5saW5lRWRpdFBvc3NpYmxlKCkgJiZcblx0XHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2lzSW5saW5lRWRpdEFjdGl2ZVwiKVxuXHRcdCkge1xuXHRcdFx0dGhpcy5iYXNlLmlubGluZUVkaXRGbG93LmlubGluZUVkaXRTYXZlKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncyBhcyBPRGF0YUxpc3RCaW5kaW5nW107XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHRcdC8vIGlzIHNlbnQgdG8gdGhlIGJhY2tlbmRcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQgIT09IHRydWUpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0XHQvL3dlIG5lZWQgdG8gcmVxdWVzdCBmb3IgcmVjb21tZW5kYXRpb25zIGFuZCB0aGVuIGJyaW5nIHRoZSBkaWFsb2cgaGVyZVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9IGF3YWl0IHRoaXMuY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZVNhdmUoeyBjb250ZXh0OiByb290Q29udGV4dCB9KTtcblxuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0KChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdFx0cm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB8fFxuXHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdFxuXHRcdFx0KSB7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdCA/IG9Db250ZXh0IDogKHJvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFeGVjdXRlIHRoZSByZWdpc3RlcmVkIGRlZmVycmVkIFNpZGVFZmZlY3RzIHdoaWNoIGhhdmUgbm90IGJlIGV4ZWN1dGVkIHlldCBmb3IgdGhlIHBhZ2UgY29udGV4dFxuXHRcdFx0Ly8gQ2FuIG9jY3VyIHdoZW4gc2hvcnRjdXQgaXMgdXNlZCB0byBzYXZlIHRoZSBkb2N1bWVudC5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5fc2lkZUVmZmVjdHMuaGFuZGxlUGFnZUNoYW5nZUNvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0XHQvLyBUaGUgJGF1dG8gcXVldWUgY2FuIG9ubHkgaGF2ZSBwZW5kaW5nIGNoYW5nZXMgYXQgdGhpcyBwb2ludCB3aGVuIFNBVkUgd2FzIGNsaWNrZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY2hhbmdpbmcgYSBmaWVsZC5cblx0XHRcdC8vIEluIHRoaXMgY2FzZSB0aGUgJGF1dG8gcXVldWUgaXMgbG9ja2VkIHRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIHN1Ym1pdCBiYXRjaCBzaG91bGQgbm90IGNyZWF0ZSBhIHNlcGFyYXRlIGJhdGNoIHJlcXVlc3QuXG5cdFx0XHQvLyBJdCBpcyBkb25lIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHBhdGNoLCBkcmFmdHByZXBhcmUsIGRyYWZ0YWN0aXZhdGUgZWFjaCBoYXZlIHRoZWlyIG93biBjaGFuZ2VzZXRcblx0XHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikgJiYgbVBhcmFtZXRlcnMubWVyZ2VQYXRjaERyYWZ0KSB7XG5cdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGFjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLnNhdmVEb2N1bWVudChcblx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgYXMgYm9vbGVhbixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGl2YXRlLCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KFN0YW5kYXJkQWN0aW9ucy5zYXZlLCBUcmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlclNhdmUoe1xuXHRcdFx0XHRjb250ZXh0OiBhY3RpdmVEb2N1bWVudENvbnRleHRcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyB1cGRhdGUgdGVsZW1ldHJ5IGRhdGEgZm9yIGhvdyBwYWdlIHdhcyBzYXZlZCBhbmQgdGhlbiBkbyBzdG9yaW5nIG9mIHRoaXMgZGF0YSB0byBiYWNrZW5kIHRocm91Z2ggdGhlIHN0b3JlRGF0YSBmdW5jdGlvblxuXHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5zdG9yZURhdGFGb3JUZWxlbWV0cnkocmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdoZW4gc2F2aW5nLCB0aGUgc2VtYW50aWMga2V5cyBtYXkgaGF2ZSBjaGFuZ2VkLlxuXHRcdFx0XHRcdC8vIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBuZWVkIHRvIG1hbmFnZSB0aGUgc2VtYW50aWMgVVJMIGNoYW5nZSBpbiB0aGUgaGlzdG9yeVxuXHRcdFx0XHRcdGNvbnN0IHByZXZpb3VzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHRjb25zdCBuZXdTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoYWN0aXZlRG9jdW1lbnRDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHRpZiAocHJldmlvdXNTZW1hbnRpY1BhdGggJiYgbmV3U2VtYW50aWNQYXRoICYmIHByZXZpb3VzU2VtYW50aWNQYXRoICE9PSBuZXdTZW1hbnRpY1BhdGgpIHtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBwcmV2aW91c1NlbWFudGljUGF0aCwgbmV3UGF0aDogbmV3U2VtYW50aWNQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0aWYgKHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSB8fCB0aGlzLl9oaWRkZW5EcmFmdD8uc3RheU9uQ3VycmVudFBhZ2VBZnRlclNhdmUpIHtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IGFjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcgIT09IHRydWUpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRpZiAoIShvRXJyb3IgJiYgKG9FcnJvciBhcyB7IGNhbmNlbGVkPzogYm9vbGVhbiB9KS5jYW5jZWxlZCkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHRcdHRocm93IG9FcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgdGhlIFVJIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIHN3aXRjaCBmcm9tXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgc3dpdGNoIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IGVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdC8vdG9nZ2xlIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZWRpdCBkcmFmdHMgYW5kIGFjdGl2ZSBkb2N1bWVudHMgd2l0aCBkcmFmdClcblx0XHRpZiAoXG5cdFx0XHQhYklzRHJhZnQgfHxcblx0XHRcdCEoXG5cdFx0XHRcdCghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHx8XG5cdFx0XHRcdChvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5KVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdC8vc3RhcnQgUG9pbnQ6IGVkaXQgZHJhZnRcblx0XHRcdGVkaXRhYmxlID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHN0YXJ0IHBvaW50IGFjdGl2ZSBkb2N1bWVudFxuXHRcdFx0ZWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRjb25zdCBvUmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmICghc2libGluZ0luZm8gJiYgb0NvbnRleHQgIT09IG9SaWdodG1vc3RDb250ZXh0KSB7XG5cdFx0XHRcdC8vIFRyeSB0byBjb21wdXRlIHNpYmxpbmcgaW5mbyBmb3IgdGhlIHJvb3QgY29udGV4dCBpZiBpdCBmYWlscyBmb3IgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHRcdC8vIC0tPiBJbiBjYXNlIG9mIEZDTCwgaWYgd2UgdHJ5IHRvIHN3aXRjaCBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgYnV0IGEgY2hpbGQgZW50aXR5IGhhcyBubyBzaWJsaW5nLCB0aGUgc3dpdGNoIHdpbGwgY2xvc2UgdGhlIGNoaWxkIGNvbHVtblxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9Db250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2libGluZ0luZm8pIHtcblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0aWYgKGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG9Db250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nW3NpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogbGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQsIHsgZWRpdGFibGUsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlIC0gQ2Fubm90IGZpbmQgc2libGluZ1wiKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6JHtvRXJyb3J9YCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c2FwLm0uQnV0dG9ufSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gLSBDdXJyZW50bHkgdGhpcyBpcyBwYXNzZWQgYXMgY2FuY2VsQnV0dG9uIGludGVybmFsbHkgKHJlcGxhY2VkIGJ5IG1QYXJhbWV0ZXJzLmNvbnRyb2wgaW4gdGhlIEpTRG9jIGJlbG93KS4gQ3VycmVudGx5IGl0IGlzIGFsc28gbWFuZGF0b3J5LlxuXHQvLyBQbGFuIC0gVGhpcyBzaG91bGQgbm90IGJlIG1hbmRhdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYWN0IGFzIHJlZmVyZW5jZSBjb250cm9sIGZvciB0aGUgZGlzY2FyZCBwb3BvdmVyIE9SIHdlIGNhbiBzaG93IGEgZGlhbG9nIGluc3RlYWQgb2YgYSBwb3BvdmVyLlxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBlZGl0YWJsZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbCBUaGlzIGlzIHRoZSBjb250cm9sIHVzZWQgdG8gb3BlbiB0aGUgZGlzY2FyZCBwb3BvdmVyXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBhbmQgYWxsb3dzIGN1c3RvbSBoYW5kbGluZ1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZWRpdGFibGUgZG9jdW1lbnQgaGFzIGJlZW4gZGlzY2FyZGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjb250cm9sPzogQnV0dG9uO1xuXHRcdFx0Y2FuY2VsQnV0dG9uPzogQnV0dG9uO1xuXHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbjtcblx0XHRcdHNraXBCYWNrTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBpc05ld0RvY3VtZW50ID0gZmFsc2U7XG5cdFx0bVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyID0gdGhpcy5faGlkZGVuRHJhZnQ/LmVuYWJsZWQgPyB0cnVlIDogbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyO1xuXHRcdGNvbnN0IGNhbmNlbFBhcmFtZXRlcnM6IENhbmNlbFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciA9PT0gdHJ1ZSxcblx0XHRcdGNhbmNlbEJ1dHRvbjogKG1QYXJhbWV0ZXJzLmNvbnRyb2wgfHwgbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uKSEsXG5cdFx0XHRiZWZvcmVDYW5jZWxDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGlzY2FyZFxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHQ6IENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0KChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmIHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB8fFxuXHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdFxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID8gb0NvbnRleHQgOiAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5jZWxSZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdGNhbmNlbFBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdCA/IHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCkgJiYgIXJvb3RDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpIDogdGhpcy5nZXRDcmVhdGlvbk1vZGUoKSxcblx0XHRcdFx0dGhpcy5pc0RvY3VtZW50TW9kaWZpZWQoKSB8fCBzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgLy8gSW4gc3RpY2t5IG1vZGUgd2UgYWx3YXlzIGFzayBmb3IgY29uZmlybWF0aW9uXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKClcblx0XHRcdFx0LmdldEluc3RhbmNlZFZpZXdzKClcblx0XHRcdFx0LmZvckVhY2goKHZpZXcpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRpZiAoY29udGV4dD8uaXNLZWVwQWxpdmUoKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGlzY2FyZCh7XG5cdFx0XHRcdGNvbnRleHQ6IGNhbmNlbFJlc3VsdFxuXHRcdFx0fSk7XG5cdFx0XHQvLyB3ZSBmb3JjZSB0aGUgZWRpdCBzdGF0ZSBldmVuIGZvciBGQ0wgYmVjYXVzZSB0aGUgZHJhZnQgZGlzY2FyZCBtaWdodCBub3QgYmUgaW1wbGVtZW50ZWRcblx0XHRcdC8vIGFuZCB3ZSBtYXkganVzdCBkZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdGlmICghY2FuY2VsUmVzdWx0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQ29udGV4dCk7XG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHQvL2luIGNhc2Ugb2YgYSBuZXcgZG9jdW1lbnQsIG5vIGFjdGl2ZUNvbnRleHQgaXMgcmV0dXJuZWQgLS0+IG5hdmlnYXRlIGJhY2suXG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChyb290Q29udGV4dCk7XG5cdFx0XHRcdFx0aXNOZXdEb2N1bWVudCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBjYW5jZWxSZXN1bHQ7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQodGhpcy5faXNGY2xFbmFibGVkKCkgfHwgdGhpcy5faGlkZGVuRHJhZnQ/LnN0YXlPbkN1cnJlbnRQYWdlQWZ0ZXJDYW5jZWwpICYmXG5cdFx0XHRcdFx0c2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IG9BY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gbG9hZCB0aGUgc2VtYW50aWMga2V5cyBvZiB0aGUgYWN0aXZlIGNvbnRleHQsIGFzIHdlIG5lZWQgdGhlbVxuXHRcdFx0XHRcdC8vIGZvciB0aGUgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0Ly8gV2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gb2YgdGhlIGNvbnRleHQsIHNvIHRoYXQgaXQncyBjcmVhdGVkIGFuZCBib3VuZCBpbiB0aGUgc2FtZSBtaWNyb3Rhc2ssXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBhbGwgcHJvcGVydGllcyBhcmUgbG9hZGVkIHRvZ2V0aGVyIGJ5IGF1dG9FeHBhbmRTZWxlY3QsIHNvIHRoYXQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBFZGl0IG1vZGVcblx0XHRcdFx0XHQvLyAkJGluaGVyaXRFeHBhbmRTZWxlY3QgdGFrZXMgYWxsIGxvYWRlZCBwcm9wZXJ0aWVzIGludG8gYWNjb3VudCAoQkNQIDIwNzA0NjIyNjUpXG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldykge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEFjdGl2ZSBjb250ZXh0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgY2FuY2VsIG9mIGV4aXN0aW5nIGRvY3VtZW50LCBhbmQgaXQncyB0aGUgc2FtZSBhcyB0aGUgZWRpdGVkIGNvbnRleHRcblx0XHRcdFx0XHQvLyBTbywgd2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gYXMgaXQgbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgd2hlbiBjYWxsaW5nIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gYWxsIHZpZXcncyBjb250ZXh0c1xuXHRcdFx0XHRcdC8vIGVhcmxpZXIgaW4gdGhpcyBtZXRob2Rcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgIXRoaXMuX2hpZGRlbkRyYWZ0KSB7XG5cdFx0XHRcdC8vc2hvdyBEcmFmdCBkaXNjYXJkZWQgbWVzc2FnZSB0b2FzdCBvbmx5IGZvciBkcmFmdCBlbmFibGVkIGFwcHNcblx0XHRcdFx0dGhpcy5zaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGdldFJvb3RDb250ZXh0KGNvbnRleHQ6IENvbnRleHQsIGJpbmRpbmdQYXJhbWV0ZXJzPzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm9bXCJwYXJhbWV0ZXJzXCJdKTogUHJvbWlzZTxDb250ZXh0PiB7XG5cdFx0Y29uc3Qgdmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzO1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0aWYgKCh2aWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxKSB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCB8fCBwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRyZXR1cm4gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KFxuXHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyc1xuXHRcdFx0XHQpKSBhcyBDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY29udGV4dDtcblx0fVxuXG5cdGFzeW5jIGlzUm9vdENvbnRleHROZXcoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IHJvb3RDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRSb290Q29udGV4dChjb250ZXh0LCB7ICRzZWxlY3Q6IFwiSGFzQWN0aXZlRW50aXR5LElzQWN0aXZlRW50aXR5XCIgfSk7XG5cdFx0Ly8gV2hlbiB3ZSByZWZyZXNoIHRoZSByb290IGNvbnRleHQsIGl0IG1heSBub3QgaGF2ZSB0aGUgcHJvcGVydGllcyBIYXNBY3RpdmVFbnRpdHkgYW5kIElzQWN0aXZlRW50aXR5IHlldCwgc28gd2UgcmVxdWVzdCB0aGVtXG5cdFx0Y29uc3QgZHJhZnRQcm9wZXJ0aWVzID0gYXdhaXQgcm9vdENvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdKTtcblx0XHRyZXR1cm4gIWRyYWZ0UHJvcGVydGllc1swXSAmJiAhZHJhZnRQcm9wZXJ0aWVzWzFdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJyaW5ncyB1cCBhIG1lc3NhZ2UgdG9hc3Qgd2hlbiBhIGRyYWZ0IGlzIGRpc2NhcmRlZC5cblx0ICogQHBhcmFtIGlzTmV3RG9jdW1lbnQgVGhpcyBpcyBhIEJvb2xlYW4gZmxhZyB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgbmV3IG9yIGFscmVhZHkgZXhpc3RzLlxuXHQgKi9cblx0c2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UoaXNOZXdEb2N1bWVudD86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGlmIChpc05ld0RvY3VtZW50ID09IHRydWUpIHtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gaW4gc2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2Ugd2hlbiBubyBjb250ZXh0IGlzIHBhc3NlZC5cblx0ICovXG5cdHNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCgpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSwgeyBjbG9zZU9uQnJvd3Nlck5hdmlnYXRpb246IGZhbHNlIH0pO1xuXHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBjb250ZXh0IGNvcnJlc3BvbmRzIHRvIGEgZHJhZnQgcm9vdC5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29udGV4dCBwb2ludHMgdG8gYSBkcmFmdCByb290XG5cdCAqL1xuXHRwcml2YXRlIGlzRHJhZnRSb290KGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVNldCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM/OiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM6IGJvb2xlYW47XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0XHR0aXRsZT86IHN0cmluZztcblx0XHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdFx0XHR9ID0geyAuLi5tSW5QYXJhbWV0ZXJzLCBiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZSwgYmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZSB9LFxuXHRcdFx0bWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3Qob0NvbnRleHQpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWVcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBEZWxldGluZyBhbiBhY3RpdmUgZW50aXR5IHdoaWNoIGhhcyBhIGRyYWZ0IHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBMaXN0UmVwb3J0IChGQ0wgY2FzZSlcblx0XHRcdFx0Ly8gLS0+IG5lZWQgdG8gcmVtb3ZlIHRoZSBkcmFmdCBmcm9tIHRoZSBMUiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBhY3RpdmUgdmVyc2lvbiwgc28gdGhhdCB0aGUgTGlzdEJpbmRpbmcgaXMgcHJvcGVybHkgcmVmcmVzaGVkXG5cdFx0XHRcdC8vIFRoZSBjb25kaXRpb24gJ29Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCcgbWFrZXMgc3VyZSB0aGUgYWN0aXZlIHZlcnNpb24gaXNuJ3QgYWxyZWFkeSBkaXNwbGF5ZWQgaW4gdGhlIExSXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gYXN5bmMgKHBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUocGFyYW1ldGVycyk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0UGF0aCA9IGF3YWl0IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdENvbnRleHRUb1JlbW92ZSA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRQYXRoKTtcblx0XHRcdFx0XHRcdGRyYWZ0Q29udGV4dFRvUmVtb3ZlLnJlcGxhY2VXaXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVwbGFjaW5nIHRoZSBkcmFmdCBpbnN0YW5jZSBpbiB0aGUgTFIgT0RMQlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHQvLyAtLT4gTWFyayBVSSBkaXJ0eSBhbmQgbmF2aWdhdGUgYmFjayB0byBkaXNtaXNzIHRoZSBPUFxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0XHRpZiAoY29udGV4dEJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRpZiAoY29udGV4dEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0XHRcdC8vIEV2ZW4gaW4gdGhlIEZDTCBjYXNlLCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGxpc3RiaW5kaW5nIGluIHRoZSBMUiAobm90IE9QKSB0byB1cGRhdGUgdGhlIGNvdW50cyBpbiB0aGUgdGFicyBhbmQgcXVpY2tmaWx0ZXJzXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKGNvbnRleHRCaW5kaW5nLCBvQXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUoY29udGV4dEJpbmRpbmcsIGNvbnRleHRCaW5kaW5nLmdldENvbnRleHQoKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIG9Db250ZXh0KTtcblxuXHRcdFx0Ly8gQWZ0ZXIgZGVsZXRlIGlzIHN1Y2Nlc3NmdWxsLCB3ZSBuZWVkIHRvIGRldGFjaCB0aGUgc2V0QmFja05hdmlnYXRpb24gTWV0aG9kc1xuXHRcdFx0YXdhaXQgb0FwcENvbXBvbmVudD8uZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHRjb25zdCBpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCA9IHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQoKTtcblx0XHRcdC8vIFdlIGNsZWFyIHJlY29tbWVuZGF0aW9uIGRhdGEgYW5kIGNvbnRleHRzIGZyb20gaW50ZXJuYWwgbW9kZWwgZm9yIHRoZSBkZWxldGVkIGNvbnRleHRzXG5cdFx0XHRpZiAoaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzKFtvQ29udGV4dF0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90aWZ5IGNvbnN1bWVycyBvZiB3aGljaCBjb250ZXh0cyB3ZXJlIGRlbGV0ZWRcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGVsZXRlKHsgY29udGV4dHM6IFtvQ29udGV4dF0gfSk7XG5cblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQ/LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkRlZXBsaW5rKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwIGhhcyBiZWVuIGxhdW5jaGVkIHdpdGggc2VtYW50aWMga2V5cywgZGVsZXRpbmcgdGhlIG9iamVjdCB3ZSd2ZSBsYW5kZWQgb24gc2hhbGwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHRcdC8vIHRvIHRoZSBhcHAgd2UgY2FtZSBmcm9tIChleGNlcHQgZm9yIEZDTCwgd2hlcmUgd2UgbmF2aWdhdGUgdG8gTFIgYXMgdXN1YWwpXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmV4aXRGcm9tQXBwKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRWxzZSBuYXZpZ2F0ZSBiYWNrIGZyb20gdGhlIHBhZ2UuIEluIEZDTCwgdGhpcyBpcyBkb25lIHdoZW4gdGhlIGtlcHQtYWxpdmUgY29udGV4dCBpcyBkZXN0cm95ZWQgKGNhbGxiYWNrKVxuXHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdCB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcyBhbmQgbmF2aWdhdGUgYmFjay5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc0NvbnRpbnVlID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyhmYWxzZSk7XG5cdFx0XHRpZiAoaXNDb250aW51ZSA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgeyBjYWxsRXh0ZW5zaW9uOiB0cnVlIH0pO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uXSBCb29sZWFuIHZhbHVlIGZvciBzdGF0aWMgYWN0aW9uLCB1bmRlZmluZWQgZm9yIG90aGVyIGFjdGlvbnNcblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGVdIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHQvLyBDdXJyZW50bHkgdGhlIHBhcmFtZXRlciBpc05hdmlnYWJsZSBpcyB1c2VkIGludGVybmFsbHkgYW5kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVzTmF2aWdhdGlvbiBhcyBpdCBpcyBhIG1vcmUgYXB0IG5hbWUgZm9yIHRoaXMgcGFyYW1cblxuXHQvKipcblx0ICogSW52b2tlcyBhbiBhY3Rpb24gKGJvdW5kIG9yIHVuYm91bmQpIGFuZCB0cmFja3MgdGhlIGNoYW5nZXMgc28gdGhhdCBvdGhlciBwYWdlcyBjYW4gYmUgcmVmcmVzaGVkIGFuZCBzaG93IHRoZSB1cGRhdGVkIGRhdGEgdXBvbiBuYXZpZ2F0aW9uLlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgQW4gb3B0aW9uYWwgYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGVyZSBlYWNoIG9iamVjdCBoYXMgYSBuYW1lIG9mIHN0cmluZyB0eXBlIGFuZCBhIHZhbHVlIHRoYXQgY2FuIGJlIG9mIGFueSBkYXRhIHR5cGUuXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtIGluIHBhcmFtZXRlclZhbHVlc1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250ZXh0cyBGb3IgYSBib3VuZCBhY3Rpb24sIGEgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm1vZGVsIEZvciBhbiB1bmJvdW5kIGFjdGlvbiwgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWwgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBOYXZpZ2F0aW9uIHRha2VzIHBsYWNlIHRvIHRoZSBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubGFiZWwgQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvbi4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgYWN0aW9uIGhhcyBhIHBhcmFtZXRlciBhbmQgYSBwYXJhbWV0ZXIgZGlhbG9nIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGUgbGFiZWwgd2lsbCBiZSB1c2VkIGZvciB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBhbmQgZm9yIHRoZSBjb25maXJtYXRpb24gYnV0dG9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udHJvbElkIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUV4dHJhUGFyYW1zIFBSSVZBVEVcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIG9uY2UgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gSWYgcmVzb2x2ZWQsIHRoZSBwcm9taXNlIHJldHVybnM6XG5cdCAqICAtIElmIHRoZSBwYXJhbWV0ZXIgY29udGV4dHMgaXMgYW4gYXJyYXk6IGFuIGFycmF5IG9mIG9iamVjdHMsIGVhY2ggb2JqZWN0IGNvbnRhaW5pbmcgYSBrZXkgXCJzdGF0dXNcIiwgYXMgd2VsbCBhcyBcInZhbHVlXCIgcmVmZXJlbmNpbmcgdGhlIGFjdGlvbiBzdGF0dXMgYW5kIHRoZSBjb250ZXh0XG5cdCAqICAtIElmIHRoZSBwYXJhbWV0ZXIgY29udGV4dHMgaXMgbm90IGFuIGFycmF5OiBhIHNpbmdsZSBjb250ZXh0XG5cdCAqIFRoZSBjb250ZXh0KHMpIHByb3ZpZGVkIGluIHRoZSBwcm9taXNlIGlzIChhcmUpIGVpdGhlciB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQgb2YgdGhlIGFjdGlvbiBvciB0aGUgYm91bmQgY29udGV4dCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGludm9rZUFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRjb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W107XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRub3RBcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IHt9XG5cdCk6IFByb21pc2U8XG5cdFx0fCB7XG5cdFx0XHRcdHZhbHVlOiBDb250ZXh0O1xuXHRcdFx0XHRzdGF0dXM6IFwiZnVsZmlsbGVkXCI7XG5cdFx0ICB9W11cblx0XHR8IENvbnRleHRcblx0PiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6XG5cdFx0XHR8IHtcblx0XHRcdFx0XHRmUmVzb2x2ZXI6IEZ1bmN0aW9uO1xuXHRcdFx0XHRcdGZSZWplY3RvcjogRnVuY3Rpb247XG5cdFx0XHQgIH1cblx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblxuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQoKG1JblBhcmFtZXRlcnMgYXMgQ29udGV4dCk/LmlzQSAmJiAobUluUGFyYW1ldGVycyBhcyBDb250ZXh0KT8uaXNBPENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHx8XG5cdFx0XHRBcnJheS5pc0FycmF5KG1JblBhcmFtZXRlcnMpIHx8XG5cdFx0XHRtRXh0cmFQYXJhbXMgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgY29udGV4dHM6IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZCA9IG1JblBhcmFtZXRlcnMgYXMgT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkO1xuXHRcdFx0bUluUGFyYW1ldGVycyA9IG1FeHRyYVBhcmFtcyB8fCB7fTtcblx0XHRcdGlmIChjb250ZXh0cykge1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IG51bGw7XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHR2aWV3OiBGRVZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0aXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRpc0JvdW5kPzogYm9vbGVhbjtcblx0XHRcdGlnbm9yZUVUYWc/OiBib29sZWFuO1xuXHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIHZpZXc6IHRoaXMuYmFzZS5nZXRWaWV3KCkgfSB8fCB7IHZpZXc6IHRoaXMuYmFzZS5nZXRWaWV3KCkgfTtcblxuXHRcdG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlID0gbVBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIHx8IG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHRoZSByZWZlcmVuY2VkIGFjdGlvbiBpcyBib3VuZCBvciB1bmJvdW5kXG5cdFx0Y29uc3QgY29udmVydGVkTWV0YWRhdGEgPSBjb252ZXJ0VHlwZXModGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdC8vIFRoZSBFbnRpdHlDb250YWluZXIgbWF5IE5PVCBiZSBtaXNzaW5nLCBzbyBpdCBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgdW5kZWZpbmVkLCBidXQgc2luY2UgaW4gb3VyIGNvbnZlcnRlZCBNZXRhZGF0YVxuXHRcdC8vIGl0IGNhbiBiZSB1bmRlZmluZWQsIEkgbmVlZCB0aGlzIHdvcmthcm91bmQgaGVyZSBvZiBhZGRpbmcgXCJcIiBzaW5jZSBpbmRleE9mIGRvZXMgbm90IGFjY2VwdCBzb21ldGhpbmcgdGhhdCdzXG5cdFx0Ly8gdW5kZWZpbmVkLlxuXHRcdGlmIChzQWN0aW9uTmFtZS5pbmNsdWRlcyhcIlwiICsgY29udmVydGVkTWV0YWRhdGEuZW50aXR5Q29udGFpbmVyLm5hbWUpKSB7XG5cdFx0XHQvLyBVbmJvdW5kIGFjdGlvbnMgYXJlIGFsd2F5cyByZWZlcmVuY2VkIHZpYSB0aGUgYWN0aW9uIGltcG9ydCBhbmQgd2UgZm91bmQgdGhlIEVudGl0eUNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUgc29cblx0XHRcdC8vIGFuIHVuYm91bmQgYWN0aW9uIGlzIHJlZmVyZW5jZWQhXG5cdFx0XHRtUGFyYW1ldGVycy5pc0JvdW5kID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE5vIGVudGl0eSBjb250YWluZXIgaW4gdGhlIHNBY3Rpb25OYW1lLCBzbyBlaXRoZXIgYSBib3VuZCBvciBzdGF0aWMgYWN0aW9uIGlzIHJlZmVyZW5jZWQgd2hpY2ggaXMgYWxzbyBib3VuZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICghbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSAmJiBtUGFyYW1ldGVycy5jb250ZXh0cyAmJiBtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSA9IG1QYXJhbWV0ZXJzLm1vZGVsXG5cdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHQuZ2V0TWV0YUNvbnRleHQoKEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cykuZ2V0UGF0aCgpKVxuXHRcdFx0XHQuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0fVxuXHRcdGxldCBvQ29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBDb250cm9sO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgc3RpY2t5IHNlc3Npb24gaXMgZW5hYmxlZCB3ZSB0cmlnZ2VyIGFjdGlvbnMgd2l0aG91dCBlVGFnXG5cdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZyA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCIoXCIpKSB7XG5cdFx0XHQvLyBnZXQgZW50aXR5IHR5cGUgb2YgYWN0aW9uIG92ZXJsb2FkIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aW9uIHBhdGhcblx0XHRcdC8vIEV4YW1wbGUgc0FjdGlvbk5hbWUgPSBcIjxBY3Rpb25OYW1lPihDb2xsZWN0aW9uKDxPdmVybG9hZEVudGl0eVR5cGU+KSlcIlxuXHRcdFx0Ly8gc0FjdGlvbk5hbWUgPSBhUGFydHNbMF0gLS0+IDxBY3Rpb25OYW1lPlxuXHRcdFx0Ly8gc092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1syXSAtLT4gPE92ZXJsb2FkRW50aXR5VHlwZT5cblx0XHRcdGFQYXJ0cyA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKTtcblx0XHRcdHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdO1xuXHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0ucmVwbGFjZUFsbChcIilcIiwgXCJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gJiYgb0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IG9Db250cm9sLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IHRhYmxlQVBJLmdldFJvd0JpbmRpbmcoKS5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gdGhpcy5fZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0LFxuXHRcdFx0XHRcdG9Db250cm9sLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5nZXRJZCgpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRXhlY3V0ZUFjdGlvbih7IGNvbnRleHRzOiBtUGFyYW1ldGVycy5jb250ZXh0cyB9KTtcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvbihzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdFx0XHRjb25zdCBzdWNjZXNzRnVsbEV4ZWN1dGlvbiA9IHJlc3BvbnNlLmZpbHRlcihpc0Z1bGZpbGxlZCk7XG5cdFx0XHRpZiAocmVzcG9uc2UubGVuZ3RoICE9PSBzdWNjZXNzRnVsbEV4ZWN1dGlvbi5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gS2VlcCB0aGUgc2FtZSB3b3JrZmxvdyB0aGFuIGJlZm9yZVxuXHRcdFx0XHQvLyBJZiBhdCBsZWFzdCBvbmUgcHJvbWlzZSBpcyByZWplY3RlZCwgd2UgcmVqZWN0IHRoZSB3aG9sZSBwcm9taXNlXG5cdFx0XHRcdHRocm93IHJlc3BvbnNlO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGxpc3RSZWZyZXNoZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMgJiYgQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cykgJiYgbVBhcmFtZXRlcnMuaXNCb3VuZCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRsaXN0UmVmcmVzaGVkID0gYXdhaXQgdGhpcy5fcmVmcmVzaExpc3RJZlJlcXVpcmVkKFxuXHRcdFx0XHRcdHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgc3VjY2Vzc0Z1bGxFeGVjdXRpb24pLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShcblx0XHRcdFx0XHRBY3Rpdml0eS5BY3Rpb24sXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMsXG5cdFx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdFx0bGlzdFJlZnJlc2hlZCxcblx0XHRcdFx0XHRPYmplY3Qua2V5cyhzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHQuZ2V0T2JqZWN0KCkpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZSwgVHJpZ2dlclR5cGUuYWN0aW9uKTtcblxuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZXNvbHZlcihzdWNjZXNzRnVsbEV4ZWN1dGlvbik7XG5cdFx0XHR9XG5cdFx0XHQvKlxuXHRcdFx0XHRcdFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0VE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHRUaGlzIHdvcmthcm91bmQgaXMgb25seSBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3luY2hyb25pemF0aW9uLlxuXHRcdFx0XHRcdE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0aXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHR3ZSBleHBsaWNpdGx5IGRvbid0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGUgbGlzdCByZXBvcnQgYnV0IG9ubHkgY2FsbCBpdCBmcm9tIHRoZSBvYmplY3QgcGFnZVxuXHRcdFx0XHRcdGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHR3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHR3ZSBuZWVkIGEgY29udGV4dCB0byBzZXQgdGhlIHVwcGVyIHBhZ2VzIHRvIGRpcnR5IC0gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgd2UgdXNlIHRoZVxuXHRcdFx0XHRcdGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQqL1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGlmICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuY29udmVydGVyVHlwZSAhPT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0aWYgKHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0XHRcdFx0PyBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHRcblx0XHRcdFx0XHRcdDogc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUucmV0dXJuZWRDb250ZXh0ID8/IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLmJvdW5kQ29udGV4dDtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRjb25zdCBzQ29udGV4dE1ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0Y29uc3QgX2ZuVmFsaWRDb250ZXh0cyA9IChjb250ZXh0czogQ29udGV4dFtdLCBhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W10pOiBDb250ZXh0W10gPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHRzLmZpbHRlcigoZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoYXBwbGljYWJsZUNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFwcGxpY2FibGVDb250ZXh0cy5pbmNsdWRlcyhlbGVtZW50KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbkNvbnRleHQgPSBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKVxuXHRcdFx0XHRcdFx0PyBfZm5WYWxpZENvbnRleHRzKG1QYXJhbWV0ZXJzLmNvbnRleHRzLCBtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMpWzBdXG5cdFx0XHRcdFx0XHQ6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0Py5nZXRQYXRoKCkgIT09IGNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZVxuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgYWN0aW9uIHJldHVybnMgYSBkcmFmdCBjb250ZXh0LCB3ZSBhbHJlYWR5IHRha2UgY2FyZSBkdXJpbmcgbmF2aWdhdGlvbiB0byBlaXRoZXIgY3JlYXRlIGEgbmV3XG5cdFx0XHRcdFx0XHRcdC8vIChmdWxsIHNjcmVlbikgb3IgdG8gdXNlIHRoZSBsaXN0IGJpbmRpbmcgY29udGV4dCBhZnRlciByZWZyZXNoIChhbmQgbm90IHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCkuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBkcmFmdCBpcyBkaXNjYXJkZWQgb3IgYWN0aXZhdGVkLCBoYXZpbmcgdGhlIGNvbnRleHQgc3RpbGwgYXMgZGVwZW5kZW50IGNvbnRleHQgY2F1c2UgaXNzdWVzXG5cdFx0XHRcdFx0XHRcdC8vIChlLmcuIGlmIGEgc2lkZSBlZmZlY3QgaXMgdHJpZ2dlcmVkKS4gVGhlcmVmb3JlLCB3ZSBkZXN0cm95IHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCBoZXJlLFxuXHRcdFx0XHRcdFx0XHQvLyBhbmQgdG8gYmUgY29tcGF0aWJsZSB3ZSByZXR1cm4gYSBuZXcgY29udGV4dCB3aXRoIHRoZSBzYW1lIHBhdGguXG5cdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiZcblx0XHRcdFx0XHRcdFx0XHQoY29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSB8fCB0aGlzLl9pc0ZjbEVuYWJsZWQoKSlcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dC5nZXRCaW5kaW5nKCkuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuaW5mbyhcIk5hdmlnYXRpb24gdG8gdGhlIHNhbWUgY29udGV4dCBpcyBub3QgYWxsb3dlZFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyQWN0aW9uRXhlY3V0aW9uKHNBY3Rpb25OYW1lKTtcblxuXHRcdFx0Ly8gS2VlcCB0aGlzIHdlaXJkIHJldHVybmVkIHZhbHVlIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnNcblx0XHRcdC8vIGludm9rZUFjdGlvbiBpcyBwdWJsaWMgYW5kIHdlIGNhbid0IGNoYW5nZSB0aGUgcmV0dXJuZWQgdmFsdWUgZm9yIHRoZSBhY3Rpb25cblx0XHRcdGlmICghQXJyYXkuaXNBcnJheShtSW5QYXJhbWV0ZXJzPy5jb250ZXh0cykgJiYgc3VjY2Vzc0Z1bGxFeGVjdXRpb24ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQgPz8gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLm1hcCgob1Jlc3VsdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4geyAuLi5vUmVzdWx0LCAuLi57IHZhbHVlOiBvUmVzdWx0LnZhbHVlLnJldHVybmVkQ29udGV4dCA/PyBvUmVzdWx0LnZhbHVlLmJvdW5kQ29udGV4dCB9IH07XG5cdFx0XHR9KTtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdH1cblx0XHRcdGlmIChlcnIgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRGlhbG9nIGNhbmNlbGxlZFwiKTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSG9vayB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBhZnRlciB0aGUgYWN0aW9uIGV4ZWN1dGlvbi5cblx0ICogQHBhcmFtIF9hY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAc2luY2UgMS4xMTQuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyQWN0aW9uRXhlY3V0aW9uKF9hY3Rpb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvL3RvIGJlIG92ZXJyaWRkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBvbiB0aGUgbWFzcyBlZGl0IHNhdmUuXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIElmIHlvdSBkZWNpZGUgdG8gZG8geW91ciBvd24gc2F2ZSBwcm9jZXNzaW5nLCB5b3UgY2FuIHJldHVybiBgdHJ1ZWAgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBzYXZlIGJlaGF2aW9yLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycyBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gY3VzdG9tTWFzc0VkaXRTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuYUNvbnRleHRzIEFycmF5IGNvbnRhaW5pbmcgdGhlIHNlbGVjdGVkIGNvbnRleHRzIGZvciB0aGUgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMub1VwZGF0ZURhdGEgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5UGF0aCBhbmQgaXRzIHZhbHVlXG5cdCAqIEByZXR1cm5zIGB0cnVlYCB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGV4ZWN1dGlvbiwgYGZhbHNlYCB0byBrZWVwIHRoZSBzdGFuZGFyZCBiZWhhdmlvclxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjEzMC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZClcblx0YXN5bmMgY3VzdG9tTWFzc0VkaXRTYXZlKF9tUGFyYW1ldGVyczogeyBhQ29udGV4dHM6IENvbnRleHRbXTsgb1VwZGF0ZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICogQHBhcmFtIGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LnNldCBUcmlnZ2VycyBhIGJ1c3kgaW5kaWNhdG9yIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5jaGVjayBFeGVjdXRlcyBmdW5jdGlvbiBvbmx5IGlmIGFwcGxpY2F0aW9uIGlzbid0IGJ1c3kuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQgaWYgdGhlIGV4ZWN1dGlvbiBpcyBwcm9oaWJpdGVkIGFuZCByZXNvbHZlZCBieSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZm5GdW5jdGlvbi5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycz8uYnVzeT8uc2V0ID8/IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnM/LmJ1c3k/LmNoZWNrID8/IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gbVBhcmFtZXRlcnM/LnVwZGF0ZXNEb2N1bWVudCA/PyBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCBhcyBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCxcblx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHRpZiAoYkJ1c3lDaGVjayAmJiBCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQXBwbGljYXRpb24gYWxyZWFkeSBidXN5IHRoZXJlZm9yZSBleGVjdXRpb24gcmVqZWN0ZWRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgaGF2ZSB0byBzZXQgYnVzeSBhbmQgZHJhZnQgaW5kaWNhdG9yIGltbWVkaWF0ZWx5IGFsc28gdGhlIGZ1bmN0aW9uIG1pZ2h0IGJlIGV4ZWN1dGVkIGxhdGVyIGluIHF1ZXVlXG5cdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdH1cblxuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKGZuRnVuY3Rpb24gYXMgKCkgPT4gdW5rbm93biB8IFByb21pc2U8dW5rbm93bj4pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IHVua25vd24pOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBwYXRjaFNlbnQgZXZlbnQ6IHJlZ2lzdGVyIGRvY3VtZW50IG1vZGlmaWNhdGlvbi5cblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0aGFuZGxlUGF0Y2hTZW50KG9FdmVudDogT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCk6IHZvaWQge1xuXHRcdC8vIEluIGNvbGxhYm9yYXRpdmUgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24sIGRpc2FibGUgRVRhZyBjaGVjayBmb3IgUEFUQ0ggcmVxdWVzdHNcblx0XHRjb25zdCBpbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCB1aUNvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKTtcblx0XHRjb25zdCBpZ25vcmVFVGFnID0gdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpIHx8IGludGVybmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoaWdub3JlRVRhZykge1xuXHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKHRydWUpO1xuXHRcdH1cblx0XHRpZiAodWlDb250ZXh0Py5nZXRQcm9wZXJ0eShcImlzRWRpdGFibGVcIikgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyB0aGUgdmlldyBpcyBub3QgaW4gZWRpdCBtb2RlIHRoaXMgbXVzdCBiZSBpbmxpbmUgZWRpdFxuXHRcdFx0dGhpcy5iYXNlLmlubGluZUVkaXRGbG93LmhhbmRsZUlubGluZUVkaXRQYXRjaFNlbnQob0V2ZW50KTtcblx0XHR9IGVsc2UgaWYgKCFpbnRlcm5hbENvbnRleHQ/LmdldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIikpIHtcblx0XHRcdGNvbnN0IHNvdXJjZUJpbmRpbmcgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgdW5rbm93biBhcyBPRGF0YUxpc3RCaW5kaW5nOyAvLyBGSVhNRTogVUk1IHR5cGUgc2F5cyB0aGlzIHNob3VsZCBiZSBhbiBPRGF0YUNvbnRleHRCaW5kaW5nXG5cdFx0XHQvLyBDcmVhdGUgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIHRoZSBwYXRoIGlzIGNvbXBsZXRlZFxuXHRcdFx0Y29uc3Qgb1BhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmF0dGFjaEV2ZW50T25jZShcInBhdGNoQ29tcGxldGVkXCIsIChwYXRjaENvbXBsZXRlZEV2ZW50OiBVSTVFdmVudDx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4pID0+IHtcblx0XHRcdFx0XHQvLyBSZS1lbmFibGUgRVRhZyBjaGVja3Ncblx0XHRcdFx0XHRpZiAoaWdub3JlRVRhZykge1xuXHRcdFx0XHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdFx0c291cmNlQmluZGluZyxcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnVwZGF0ZURvY3VtZW50KHNvdXJjZUJpbmRpbmcsIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGVTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0aGFuZGxlQ3JlYXRlU2VudChldmVudDogVUk1RXZlbnQ8eyBjb250ZXh0OiBDb250ZXh0IH0+KTogdm9pZCB7XG5cdFx0Y29uc3QgY29udGV4dCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSwgZmFsc2UsIGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBhIHRhc2sgaW4gc3luYyB3aXRoIG90aGVyIHRhc2tzIGNyZWF0ZWQgdmlhIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFJldHVybnMgdGhlIHByb21pc2UgY2hhaW4gb2YgdGhlIHRhc2suXG5cdCAqIEBwYXJhbSBbbmV3VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgdGFzayBpcyBjb21wbGV0ZWRcblx0ICovXG5cdGFzeW5jIHN5bmNUYXNrPFQ+KG5ld1Rhc2s/OiAoKCkgPT4gVCkgfCBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG5cdFx0aWYgKG5ld1Rhc2spIHtcblx0XHRcdGlmICh0eXBlb2YgbmV3VGFzayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRoaXMuc3luY1Rhc2tzID0gdGhpcy5zeW5jVGFza3MudGhlbihuZXdUYXNrKS5jYXRjaChmdW5jdGlvbiAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc3luY1Rhc2tzID0gdGhpcy5zeW5jVGFza3Ncblx0XHRcdFx0XHQudGhlbihhc3luYyAoKSA9PiBuZXdUYXNrKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZGVidWcoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2tzIGFzIFByb21pc2U8VD47XG5cdH1cblxuXHQvKipcblx0ICogdXBkYXRlcyB0aGUgVUkgYW5kIGludGVybmFsIG1vZGVscyBhY2NvcmRpbmcgdGhlIGVkaXQgbW9kZSAuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBkaXNwbGF5ZWQgb3IgZWRpdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXQgbW9kZSBpcyBjb21wdXRlZFxuXHQgKi9cblxuXHRhc3luYyBjb21wdXRlTW9kZWxzRm9yRWRpdE1vZGUoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cblx0XHRcdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsIS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRcdGxldCBmb3JjZURpc3BsYXlNb2RlID0gZmFsc2U7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cblx0XHRcdFx0aWYgKGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkICYmIGlzQWN0aXZlRW50aXR5ID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdGZvcmNlRGlzcGxheU1vZGUgPSAhKGF3YWl0IHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuYWN0aXZhdGVDb2xsYWJvcmF0aW9uKGNvbnRleHQsIGlzQWN0aXZlRW50aXR5KSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaGFzQ29sbGFib3JhdGlvbkF1dGhvcml6YXRpb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmZldGNoQ29sbGFib3JhdGl2ZURyYWZ0VXNlcnNQcm9taXNlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdGlmIChpc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UgJiYgIWZvcmNlRGlzcGxheU1vZGUpIHtcblx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgaGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhaGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZXRlcm1pbmluZyB0aGUgZWRpdE1vZGUgZm9yIGRyYWZ0XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgbGFzdEludm9rZWRBY3Rpb25OYW1lID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIik7XG5cdFx0XHRpZiAobGFzdEludm9rZWRBY3Rpb25OYW1lICYmIHRoaXMuaXNOZXdBY3Rpb25Gb3JTdGlja3kobGFzdEludm9rZWRBY3Rpb25OYW1lLCBjb250ZXh0KSkge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCB0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T24oY29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXModGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpLCBjb250ZXh0LmdldE1vZGVsKCkpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBtZXRob2QgdG8gZGVsZXRlIGEgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0cy5cblx0ICogQHBhcmFtIGNvbnRleHRzIFRoZSBjb250ZXh0KHMpIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgUGFyYW1ldGVycyBmb3IgZGVsZXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy50aXRsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kZXNjcmlwdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKFxuXHRcdGNvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzPzogYm9vbGVhbjtcblx0XHRcdG5vRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmcgfCB7IHBhdGg6IHN0cmluZyB9O1xuXHRcdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzPzogbnVtYmVyO1xuXHRcdFx0dW5TYXZlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bG9ja2VkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPzogRHJhZnRTaWJsaW5nUGFpcltdO1xuXHRcdFx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZT86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdC8vIGFzIHNlbGVjdGVkIGNvbnRleHRzIG1heSBpbmNsdWRlIGluYWN0aXZlIGNvbnRleHQgd2UgbmVlZCB0byBjb21wdXRlIHRoaXMgcGFyYW1ldGVyIGFnYWluIHRvIGVuc3VyZSBkZWxldGUgaGVscGVyIHdvcmtzIHByb3Blcmx5XG5cdFx0XHRwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdGlmIChwYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0Y29uc3Qgc291cmNlQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdFx0aWYgKHNvdXJjZUNvbnRyb2wgJiYgIXNvdXJjZUNvbnRyb2wuaXNBPE11bHRpVmFsdWVGaWVsZD4oXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBkZWxldGUgaXMgdHJpZ2dlcmVkIGZyb20gYSBNdWx0aVZhbHVlRmllbGQsIHdlIGRvbid0IHVzZSB0aGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhcyB0aGUgTVZGIGRvZXNuJ3QgaGF2ZVxuXHRcdFx0XHQvLyBzdWNoIGEgY29udGV4dCBvZiBpdHMgb3duLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgaXRzIHBhcmVudCBjb250ZXh0IChlLmcuIGZyb20gdGhlIGVtYmVkZGluZyBUYWJsZSlcblx0XHRcdFx0cGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IHNvdXJjZUNvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0YXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQoY29udGV4dHMsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHJlc291cmNlTW9kZWwsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VNb2RlbCgpOiBSZXNvdXJjZU1vZGVsIHtcblx0XHRyZXR1cm4gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFRyYW5zYWN0aW9uSGVscGVyKCk6IHR5cGVvZiBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdFx0cmV0dXJuIFRyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXNzYWdlSGFuZGxlcigpOiBNZXNzYWdlSGFuZGxlciB7XG5cdFx0aWYgKHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgaGFuZGxlclwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhZ2VJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwicGFnZUludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgcGFnZUludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpIGFzIENvbnRleHQ7XG5cdFx0dGhpcy5nZXRQYWdlSW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuQ3JlYXRlTW9kZSwgYkNyZWF0aW9uTW9kZSwgcGFnZUludGVybmFsQ29udGV4dCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IG9yIG5vdC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0Z2V0Q3JlYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhZ2VJbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBDb250ZXh0O1xuXHRcdHJldHVybiAhIXBhZ2VJbnRlcm5hbENvbnRleHQuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdGlzRG9jdW1lbnRNb2RpZmllZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQuXG5cdCAqIEBwYXJhbSBtb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgbW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCBoYXMgYmVlbiBtb2RpZmllZCBieSBjcmVhdGluZyBhIHN1Yi1vYmplY3QuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIG9uIHdoaWNoIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGhlIG1vZGlmaWVkIGZsYWcgb25seSBvbiByZWxhdGl2ZSBsaXN0QmluZGluZ3MsIGkuZS4gd2hlbiBjcmVhdGluZyBhIHN1Yi1vYmplY3Rcblx0XHQvLyBJZiB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlLCB0aGVuIGl0J3MgYSBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0LCBhbmQgYnkgZGVmYXVsdCBhIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3QgaXNuJ3QgY29uc2lkZXJlZCBhcyBtb2RpZmllZFxuXHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqIEBwYXJhbSBiaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlRXZlbnRzKGJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZyk7XG5cdFx0Ly8gV2Ugc3RvcmUga2V5IHNldHMgKGNvbnRleHQgKyBrZXkpIGFzIHRoZSBjcmVhdGlvbiBpbnRlcmFjdGlvbiBtaWdodCBpbnZvbHZlIG11bHRpcGxlIGNyZWF0aW9ucy5cblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXlTZXRzOiB7IGNvbnRleHQ6IENvbnRleHQ7IG1lc3NhZ2VIYW5kbGluZ0tleTogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZVNlbnRcIiwgKGV2ZW50SW5zdGFuY2U6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbjsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY29udGV4dCA9IGV2ZW50SW5zdGFuY2UuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHRcdGxldCBtZXNzYWdlSGFuZGxpbmdLZXkgPSBtZXNzYWdlSGFuZGxpbmdLZXlTZXRzLmZpbmQoKGluZm8pID0+IGluZm8uY29udGV4dCA9PT0gY29udGV4dCk/Lm1lc3NhZ2VIYW5kbGluZ0tleTtcblx0XHRcdGlmICghbWVzc2FnZUhhbmRsaW5nS2V5KSB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleVNldHMucHVzaCh7IGNvbnRleHQsIG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlQ29tcGxldGVkXCIsIChvRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbjsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgc3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpLFxuXHRcdFx0XHRjb250ZXh0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKHN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IG1lc3NhZ2VIYW5kbGluZ0tleVNldHMuZmluZCgoaW5mbykgPT4gaW5mby5jb250ZXh0ID09PSBjb250ZXh0KT8ubWVzc2FnZUhhbmRsaW5nS2V5O1xuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGluZ0tleSkge1xuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZSAoZGlzcGxheWVkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UpLlxuXHQgKiBAcGFyYW0gZHJhZnRTdGF0dXMgVGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlXG5cdCAqL1xuXHRzZXREcmFmdFN0YXR1cyhkcmFmdFN0YXR1czogc3RyaW5nKTogdm9pZCB7XG5cdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBkcmFmdFN0YXR1cywgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBmcm9tIGEgYmluZGluZyBvciBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBzb3VyY2UgVGhlIGJpbmRpbmcgb3IgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICovXG5cdHByaXZhdGUgZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICogQHBhcmFtIGVkaXRNb2RlIFRoZSBlZGl0IG1vZGVcblx0ICogQHBhcmFtIGlzQ3JlYXRpb24gVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG5ld2x5IGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RWRpdE1vZGUoZWRpdE1vZGU/OiBzdHJpbmcsIGlzQ3JlYXRpb24/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKGVkaXRNb2RlKSB7XG5cdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIGVkaXRNb2RlID09PSBcIkVkaXRhYmxlXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRpZiAoZWRpdE1vZGUgIT09IFwiRWRpdGFibGVcIikge1xuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNDcmVhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmbGFnIHRvIGZvcmNlIFNhdmUgb3IgRGlzY2FyZCB3aGVuIGxlYXZpbmcgYSBkcmFmdC5cblx0ICogQHBhcmFtIGZvcmNlZFxuXHQgKi9cblx0cHJpdmF0ZSBmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZChmb3JjZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZFwiLCBmb3JjZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHdlIHNob3VsZCBmb3JjZSB0aGUgdXNlciB0byBTYXZlIG9yIERpc2NhcmQgd2hlbiBsZWF2aW5nIGEgZHJhZnQsIG9yIGlmIGtlZXBpbmcgdGhlIGRyYWZ0IGlzIGFsbG93ZWQuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYga2VlcGluZyB0aGUgZHJhZnQgaXMgbm90IGFsbG93ZWRcblx0ICovXG5cdHNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2ZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkXCIpID09PSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbiBhY3Rpb24gY29ycmVzcG9uZHMgdG8gYSBjcmVhdGUgYWN0aW9uIGZvciBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgYSBjcmVhdGUgYWN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGlzTmV3QWN0aW9uRm9yU3RpY2t5KGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdGNvbnN0IHN0aWNreVNlc3Npb24gPSBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDtcblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5OZXdBY3Rpb24gPT09IGFjdGlvbk5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMgJiYgc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMuaW5jbHVkZXMoYWN0aW9uTmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyBNb3ZlIGFsbCBzdGlja3ktcmVsYXRlZCBiZWxvdyB0byBhIHN0aWNreSBzZXNzaW9uIG1hbmFnZXIgY2xhc3NcblxuXHQvKipcblx0ICogRW5hYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgaGFuZGxlU3RpY2t5T24oY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IGhhc2hUcmFja2VyID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChjb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpY2FyZCBtZXNzYWdlIGJveCBpbiBjYXNlIG9mIHN0aWNreVxuXHRcdFx0XHRhd2FpdCBhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMsIGNvbnRleHQpKTtcblxuXHRcdFx0XHQvLyBBdHRhY2ggc3RpY2t5IHNlc3Npb24gY2FsbGJhY2tzXG5cdFx0XHRcdGNvbnN0IGkxOG5Nb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LnJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyhcblx0XHRcdFx0XHR0aGlzLmdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQsIGludGVybmFsTW9kZWwsIGhhc2hUcmFja2VyKSxcblx0XHRcdFx0XHR0aGlzLmdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oY29udGV4dCwgaTE4bk1vZGVsKSxcblx0XHRcdFx0XHR0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTdGlja3lPZmYoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LnVucmVnaXN0ZXJTdGlja3lTZXNzaW9uQ2FsbGJhY2tzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQudW5yZWdpc3RlclN0aWNreVNlc3Npb25DYWxsYmFja3MoKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCBtb2RlbC5nZXRIdHRwSGVhZGVycyh0cnVlKVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIERpcnR5U3RhdGVQcm92aWRlciBpbiB0aGUgU2hlbGwuXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgVGhlIG1vZGVsIFwiaW50ZXJuYWxcIlxuXHQgKiBAcGFyYW0gaGFzaFRyYWNrZXIgSGFzaCB0cmFja2VyXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgaGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiAobmF2aWdhdGlvbkNvbnRleHQ6IHsgaW5uZXJBcHBSb3V0ZTogc3RyaW5nIH0pOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBEaXJ0eVN0YXRlUHJvdmlkZXIgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB0YXJnZXRIYXNoID0gbmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZTtcblx0XHRcdFx0Y29uc3Qgcm91dGVyUHJveHkgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IGxjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGlzRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGlzU2Vzc2lvbk9uID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFpc1Nlc3Npb25Pbikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFeGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXJvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGhhc2hUcmFja2VyID09PSB0YXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHRhcmdldEhhc2gpIHx8IHJvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGFzaFRyYWNrZXIgPSBsY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpc0RpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gYSBzdGlja3kgc2Vzc2lvbiB0aW1lcyBvdXQuXG5cdCAqIEBwYXJhbSBzdGlja3lDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHBhcmFtIGkxOG5Nb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihzdGlja3lDb250ZXh0OiBDb250ZXh0LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpOiB1bmRlZmluZWQgfCBib29sZWFuID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChzdGlja3lDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIFNlc3Npb25UaW1lb3V0IGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2FybmluZ0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHR3YXJuaW5nRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KHdhcm5pbmdEaWFsb2cpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIG9uUm91dGVNYXRjaGVkIGV2ZW50IGluIGNhc2Ugb2Ygc3RpY2t5IGVkaXRpb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQ6IENvbnRleHQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuICgpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIWN1cnJlbnRIYXNoIHx8ICFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoY3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5jbGVhclNlc3Npb25Db250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmRzIGEgc3RpY2t5IHNlc3Npb24gYnkgZGlzY2FyZGluZyBjaGFuZ2VzLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXNDcmVhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCk7IC8vIFN0b3JlIHRoaXMgdmFsdWUgaW4gYSB2YXJpYWJsZSwgYXMgaXQgd2lsbCBiZSByZXNldCBpbiBoYW5kbGVTdGlja3lPZmZcblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpOyAvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBiZWZvcmUgY2FsbGluZyB0aGUgYXN5bmMgbWV0aG9kIG9uIHRoZSBzZXJ2ZXIsIG90aGVyd2lzZSB0aGV5IHdpbGwgY29uZmxpY3Qgd2l0aCBSb3V0ZVByb3h5LnJlc3RvcmVIaXN0b3J5IHRoYXQgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXG5cdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQoY29udGV4dCk7XG5cdFx0aWYgKGRpc2NhcmRlZENvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0XHRpZiAoIWlzQ3JlYXRpb24pIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb24uXG5cdCAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbFJvdXRpbmcoKTogSW50ZXJuYWxSb3V0aW5nIHtcblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk6IFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHR9XG5cblx0X2dldFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBjcmVhdGVBY3Rpb25Qcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcpOiB7IGZSZXNvbHZlcjogRnVuY3Rpb247IGZSZWplY3RvcjogRnVuY3Rpb24gfSB7XG5cdFx0bGV0IHJlc29sdmVGdW5jdGlvbjogRnVuY3Rpb24sIHJlamVjdEZ1bmN0aW9uOiBGdW5jdGlvbjtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZTxQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZUZ1bmN0aW9uID0gcmVzb2x2ZTtcblx0XHRcdHJlamVjdEZ1bmN0aW9uID0gcmVqZWN0O1xuXHRcdH0pLnRoZW4oKHJlc3BvbnNlOiBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oeyBjb250cm9sSWQgfSwgdGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKGFjdGlvbk5hbWUsIHJlc3BvbnNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiByZXNvbHZlRnVuY3Rpb24hLCBmUmVqZWN0b3I6IHJlamVjdEZ1bmN0aW9uISB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0cmVzcG9uc2U6IFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdXG5cdCk6IHsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID49IDEpIHtcblx0XHRcdGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbERhdGEgPSAoY3VycmVudFZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXREYXRhKCkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsQWN0aW9uID0gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXSBhcyBNZXRhTW9kZWxBY3Rpb25bXSB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGFjdGlvblJldHVyblR5cGUgPSBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZSA/IG1ldGFNb2RlbEFjdGlvbj8uWzBdLiRSZXR1cm5UeXBlLiRUeXBlIDogbnVsbDtcblx0XHRcdGNvbnN0IGtleXMgPVxuXHRcdFx0XHRhY3Rpb25SZXR1cm5UeXBlICYmIChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpXG5cdFx0XHRcdFx0PyAobWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKS4kS2V5XG5cdFx0XHRcdFx0OiBbXTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG9EYXRhOiByZXNwb25zZVswXS52YWx1ZS5ib3VuZENvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRcdGtleXNcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRhc3luYyBnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpOiBQcm9taXNlPHsgY29udHJvbElkPzogc3RyaW5nOyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2coaXNTYXZlOiBib29sZWFuKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cpIHtcblx0XHRcdHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyA9IG5ldyBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2coe1xuXHRcdFx0XHR2aWV3OiB0aGlzLmdldFZpZXcoKVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/Lm9wZW4oaXNTYXZlKTtcblx0fVxuXG5cdF9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGU6IFRhYmxlKTogdm9pZCB7XG5cdFx0Y29uc3Qgcm93QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRjb25zdCBhY3RpdmVSb3dJbmRleDogbnVtYmVyID0gcm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKHRhYmxlLmRhdGEoXCJ0YWJsZVR5cGVcIikgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGlmIChhY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChhY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKiBJbiBhIHJlc3BvbnNpdmUgdGFibGUsIHRoZSBlbXB0eSByb3dzIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWJsZS4gQnV0IHdoZW4gd2UgY3JlYXRlIG1vcmUsIHRoZXkgYXBwZWFyIGJlbG93IHRoZSBuZXcgbGluZS5cblx0XHRcdCAqIFNvIHdlIGNoZWNrIHRoZSBmaXJzdCBpbmFjdGl2ZSByb3cgZmlyc3QsIHRoZW4gd2Ugc2V0IHRoZSBmb2N1cyBvbiBpdCB3aGVuIHdlIHByZXNzIHRoZSBidXR0b24uXG5cdFx0XHQgKiBUaGlzIGRvZXNuJ3QgaW1wYWN0IHRoZSBHcmlkVGFibGUgYmVjYXVzZSB0aGV5IGFwcGVhciBhdCB0aGUgZW5kLCBhbmQgd2UgYWxyZWFkeSBmb2N1cyB0aGUgYmVmb3JlLXRoZS1sYXN0IHJvdyAoYmVjYXVzZSAyIGVtcHR5IHJvd3MgZXhpc3QpXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFsbFJvd0NvbnRleHRzID0gcm93QmluZGluZy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdGlmICghYWxsUm93Q29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBmb2N1c1JvdyA9IGFjdGl2ZVJvd0luZGV4LFxuXHRcdFx0XHRpbmRleCA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHNpbmdsZUNvbnRleHQgb2YgYWxsUm93Q29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNpbmdsZUNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZGV4IDwgZm9jdXNSb3cpIHtcblx0XHRcdFx0XHRmb2N1c1JvdyA9IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9jdXNSb3cgPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoZm9jdXNSb3cpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coZm9jdXNSb3csIHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzKHRhYmxlOiBUYWJsZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0aWYgKFxuXHRcdFx0dGFibGVBUEk/LnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSAmJlxuXHRcdFx0IXRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIilcblx0XHQpIHtcblx0XHRcdC8vIFdpdGggdGhlIHBhcmFtZXRlciwgd2UgZG9uJ3QgaGF2ZSBlbXB0eSByb3dzIGluIEVkaXQgbW9kZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUgc2V0dGluZyB0aGUgZm9jdXMgb24gdGhlbVxuXHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGUsIHRydWUpO1xuXHRcdH1cblx0XHR0aGlzLl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGUpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0dHJpZ2dlcmVkQWN0aW9uTmFtZT86IHN0cmluZyxcblx0XHRyZWZyZXNoTGlzdEJpbmRpbmc/OiBib29sZWFuLFxuXHRcdGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM/OiBzdHJpbmdbXVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZW50ID0gQXJyYXkuaXNBcnJheShyZWxhdGVkQ29udGV4dHMpID8gcmVsYXRlZENvbnRleHRzLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpIDogcmVsYXRlZENvbnRleHRzPy5nZXRQYXRoKCk7XG5cdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5zZW5kKHsgYWN0aW9uLCBjb250ZW50LCB0cmlnZ2VyZWRBY3Rpb25OYW1lLCByZWZyZXNoTGlzdEJpbmRpbmcsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMgfSk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IFRyaWdnZXJUeXBlKTogdm9pZCB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5iYXNlLmdldFZpZXcoKSwgc0FjdGlvbk5hbWUsIHRyaWdnZXJUeXBlKTtcblx0fVxuXG5cdGFzeW5jIF9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IChvTW9kZWwub1JlcXVlc3RvciBhcyB1bmtub3duIGFzIHsgd2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0czogRnVuY3Rpb24gfSkud2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyhcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhbGwgY2hhbmdlcyB3ZXJlIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcblx0XHRcdGlmIChvTW9kZWwuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdWJtaXQgb2Ygb3BlbiBjaGFuZ2VzIGZhaWxlZFwiKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCByb3V0ZXJQcm94eSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChyb3V0ZXJQcm94eS5jaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpKSB7XG5cdFx0XHRzdGlja3kucHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dmlldyxcblx0XHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5TdGlja3lcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGlzdG9yeS5iYWNrKCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogeyBlZGl0YWJsZTogYm9vbGVhbjsgcmVjcmVhdGVDb250ZXh0OiBib29sZWFuOyBmb3JjZUZvY3VzPzogYm9vbGVhbiB9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0cGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0cmVjcmVhdGVDb250ZXh0OiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWNyZWF0ZUNvbnRleHQsXG5cdFx0XHRyZWFzb246IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0Zm9yY2VGb2N1czogbmF2aWdhdGlvblBhcmFtZXRlcnMuZm9yY2VGb2N1cyA/PyBmYWxzZSxcblx0XHRcdGtlZXBDdXJyZW50TGF5b3V0OiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3XG5cdCAqIEBwYXJhbSBwYXJhbXMgVGhlIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIHBhcmFtcy5jb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbXMuaXNOYXZpZ2FibGUgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIG5hdmlnYWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gbmVlZHMgdG8gcmV0dXJucyB0aGUgYm91bmQgY29udGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IEZFVmlldywgcGFyYW1zOiB7IGNvbnRyb2xJZD86IHN0cmluZzsgaXNOYXZpZ2FibGU/OiBib29sZWFuIH0pOiBib29sZWFuIHtcblx0XHQvL1RoaXMgd2VpcmQgY29uZGl0aW9uIGlzIG5lZWRlZCB0byBhdm9pZCBuYXZpZ2F0aW9uIGluIGNhc2Ugb2Ygc29tZSBhY3Rpb25zIGludG8gdGhlIHRhYmxlXG5cdFx0Ly8gdGhpcyBkZWZpbml0ZWx5IG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgdG8gZ2V0IGNsZWFyIGNvbmRpdGlvbiB3aGVyZSBuYXZpZ2F0aW9uIG5lZWRzIHRvIGJlIGRvbmUgb3Igbm90XG5cdFx0Ly8gU05PVzogRElOQzAyNzg0OTBcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSB2aWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdGFzeW5jIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCB2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHZpc2libGVWaWV3SWRzID0gdGhpcy5faXNGY2xFbmFibGVkKClcblx0XHRcdFx0PyAodGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgRmNsQ29udHJvbGxlcikuX2dldEFsbFZpc2libGVWaWV3cygpLm1hcCgodmlldykgPT4gdmlldy5nZXRJZCgpKVxuXHRcdFx0XHQ6IFt0aGlzLmdldFZpZXcoKS5nZXRJZCgpXTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRMb2cuaW5mbyhcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgbWVzc2FnZSBvZiBhTWVzc2FnZXMpIHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChtZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmICh2aXNpYmxlVmlld0lkcy5pbmNsdWRlcyhvQ29udHJvbC5nZXRJZCgpKSkge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlLm9EYXRhXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uua2V5c1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgVHJ1ZSBQcm9taXNlIGlmIHRoZSBsaXN0IHdhcyByZWZyZXNoZWRcblx0ICovXG5cdGFzeW5jIF9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0b1Jlc3BvbnNlPzogeyBvRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzPzogc3RyaW5nW10gfCBudWxsIH0sXG5cdFx0b0NvbnRleHQ/OiBDb250ZXh0XG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhIHx8ICFvUmVzcG9uc2Uua2V5cykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKG9CaW5kaW5nLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBwYXRocyA9IGFTZW1hbnRpY0tleXMubWFwKChvS2V5KSA9PiBvS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0YXdhaXQgb0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHBhdGhzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIGxhdGVzdCBjb250ZXh0IGluIHRoZSBtZXRhZGF0YSBoaWVyYXJjaHkgZnJvbSByb290QmluZGluZyB0byBnaXZlbiBjb250ZXh0IHBvaW50aW5nIHRvIGdpdmVuIGVudGl0eVR5cGVcblx0ICogaWYgYW55IHN1Y2ggY29udGV4dCBleGlzdHMuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgb3JpZ2luYWwgY29udGV4dC5cblx0ICogTm90ZTogSXQgaXMgb25seSBuZWVkZWQgYXMgd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcuIENvcnJlY3QgbW9kZWxsaW5nIHdvdWxkIGltcGx5IGEgRGF0YUZpZWxkRm9yQWN0aW9uIGluIGEgTGluZUl0ZW1cblx0ICogdG8gcG9pbnQgdG8gYW4gb3ZlcmxvYWQgZGVmaW5lZCBlaXRoZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgRW50aXR5VHlwZSBvciBhIGNvbGxlY3Rpb24gb2YgdGhlIHNhbWUuXG5cdCAqIEBwYXJhbSByb290Q29udGV4dCBUaGUgY29udGV4dCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gb3ZlcmxvYWRFbnRpdHlUeXBlIFRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHkgdHlwZSB0byBzZWFyY2ggZm9yXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eVxuXHQgKi9cblx0X2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgocm9vdENvbnRleHQ6IENvbnRleHQsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBvdmVybG9hZEVudGl0eVR5cGU6IHN0cmluZyk6IENvbnRleHQge1xuXHRcdGNvbnN0IG1vZGVsOiBPRGF0YU1vZGVsID0gcm9vdENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IGNvbnRleHRTZWdtZW50czogc3RyaW5nW10gPSBsaXN0QmluZGluZy5nZXRQYXRoKCkuc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBjdXJyZW50Q29udGV4dDogQ29udGV4dCA9IHJvb3RDb250ZXh0O1xuXG5cdFx0Ly8gV2UgZXhwZWN0IHRoYXQgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgbGlzdEJpbmRpbmcgaXMgdGhlIExpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZS4gUmVtb3ZlIHRoaXMgZnJvbSBjb250ZXh0U2VnbWVudHNcblx0XHQvLyBiZWNhdXNlIGl0IGlzIGluY29ycmVjdCB0byBleGVjdXRlIGJpbmRDb250ZXh0IG9uIGEgbGlzdC4gV2UgZG8gbm90IGFueXdheSBuZWVkIHRvIHNlYXJjaCB0aGlzIGNvbnRleHQgZm9yIHRoZSBvdmVybG9hZC5cblx0XHRjb250ZXh0U2VnbWVudHMucG9wKCk7XG5cdFx0aWYgKGNvbnRleHRTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cyA9IFtcIlwiXTsgLy8gRG9uJ3QgbGVhdmUgY29udGV4dFNlZ21lbnRzIHVuZGVmaW5lZFxuXHRcdH1cblxuXHRcdGlmIChjb250ZXh0U2VnbWVudHNbMF0gIT09IFwiXCIpIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cy51bnNoaWZ0KFwiXCIpOyAvLyB0byBhbHNvIGdldCB0aGUgcm9vdCBjb250ZXh0LCBpLmUuIHRoZSBiaW5kaW5nQ29udGV4dCBvZiB0aGUgdGFibGVcblx0XHR9XG5cdFx0Ly8gbG9hZCBhbGwgdGhlIHBhcmVudCBjb250ZXh0cyBpbnRvIGFuIGFycmF5XG5cdFx0Y29uc3QgcGFyZW50Q29udGV4dHM6IENvbnRleHRbXSA9IGNvbnRleHRTZWdtZW50c1xuXHRcdFx0Lm1hcCgocGF0aFNlZ21lbnQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRpZiAocGF0aFNlZ21lbnQgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KHBhdGhTZWdtZW50LCBjdXJyZW50Q29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpbmcgYSBuZXcgY29udGV4dCB1c2luZyBiaW5kQ29udGV4dCguLi4pLmdldEJvdW5kQ29udGV4dCgpIGRvZXMgbm90IHdvcmsgaWYgdGhlIGV0YWcgaXMgbmVlZGVkLiBBY2NvcmRpbmcgdG8gbW9kZWwgY29sbGVhZ3Vlcyxcblx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgYWx3YXlzIHVzZSBhbiBleGlzdGluZyBjb250ZXh0IGlmIHBvc3NpYmxlLlxuXHRcdFx0XHRcdC8vIEN1cnJlbnRseSwgdGhlIG9ubHkgZXhhbXBsZSB3ZSBrbm93IGFib3V0IGlzIHVzaW5nIHRoZSByb290Q29udGV4dCAtIGFuZCBpbiB0aGlzIGNhc2UsIHdlIGNhbiBvYnZpb3VzbHkgcmV1c2UgdGhhdCBleGlzdGluZyBjb250ZXh0LlxuXHRcdFx0XHRcdC8vIElmIG90aGVyIGV4YW1wbGVzIHNob3VsZCBjb21lIHVwLCB0aGUgYmVzdCBwb3NzaWJsZSB3b3JrIGFyb3VuZCB3b3VsZCBiZSB0byByZXF1ZXN0IHNvbWUgZGF0YSB0byBnZXQgYW4gZXhpc3RpbmcgY29udGV4dC4gVG8ga2VlcCB0aGVcblx0XHRcdFx0XHQvLyByZXF1ZXN0IGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlLCB3ZSBzaG91bGQgcmVxdWVzdCBvbmx5IHRoZSBmaXJzdCBrZXkgcHJvcGVydHkuIEFzIHRoaXMgd291bGQgaW50cm9kdWNlIGFzeW5jaHJvbmlzbSwgYW5kIGFueXdheVxuXHRcdFx0XHRcdC8vIHRoZSB3aG9sZSBsb2dpYyBpcyBvbmx5IHBhcnQgb2Ygd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcsIHdlIHdhaXQgdW50aWwgd2UgaGF2ZSBhbiBleGFtcGxlIG5lZWRpbmcgaXQgYmVmb3JlIGltcGxlbWVudGluZyB0aGlzLlxuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRDb250ZXh0O1xuXHRcdFx0fSlcblx0XHRcdC5yZXZlcnNlKCk7XG5cdFx0Ly8gc2VhcmNoIGZvciBjb250ZXh0IGJhY2t3YXJkc1xuXHRcdGNvbnN0IG92ZXJsb2FkQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCA9IHBhcmVudENvbnRleHRzLmZpbmQoXG5cdFx0XHQocGFyZW50Q29udGV4dDogQ29udGV4dCkgPT5cblx0XHRcdFx0KG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChwYXJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiJFR5cGVcIikgYXMgdW5rbm93biBhcyBzdHJpbmcpID09PSBvdmVybG9hZEVudGl0eVR5cGVcblx0XHQpO1xuXHRcdHJldHVybiBvdmVybG9hZENvbnRleHQgfHwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpITtcblx0fVxuXG5cdF9jcmVhdGVTaWJsaW5nSW5mbyhjdXJyZW50Q29udGV4dDogQ29udGV4dCwgbmV3Q29udGV4dDogQ29udGV4dCk6IFNpYmxpbmdJbmZvcm1hdGlvbiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG5ld0NvbnRleHQsXG5cdFx0XHRwYXRoTWFwcGluZzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2xkUGF0aDogY3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld0NvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0X3VwZGF0ZVBhdGhzSW5IaXN0b3J5KG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXRQYXRoTWFwcGluZyhtYXBwaW5ncyk7XG5cblx0XHQvLyBBbHNvIHVwZGF0ZSB0aGUgc2VtYW50aWMgbWFwcGluZyBpbiB0aGUgcm91dGluZyBzZXJ2aWNlXG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdGlmIChtYXBwaW5ncy5sZW5ndGggJiYgbGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ub2xkUGF0aCkge1xuXHRcdFx0bGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoID0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHR9XG5cdH1cblxuXHRfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRuZXdEb2N1bWVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0c2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZFxuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhjb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gbmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBjb250ZXh0LmdldFBhdGgoKSA9PT0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgPyBjb250ZXh0IDogc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoXG5cdCAqIGZvciBhbGwgaW50ZXJtZWRpYXRlIHBhdGhzIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG5cdCAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdFxuXHQgKiBAcGFyYW0gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSBkb05vdENvbXB1dGVJZlJvb3QgSWYgdHJ1ZSwgd2UgZG9uJ3QgY29tcHV0ZSBzaWJsaW5nSW5mbyBpZiB0aGUgcm9vdCBhbmQgdGhlIHJpZ2h0bW9zdCBjb250ZXh0cyBhcmUgdGhlIHNhbWVcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgcm9vdCBjb250ZXh0IGluZm9ybWF0aW9uIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW4sXG5cdFx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRcdGdyb3VwSWQ/OiBzdHJpbmdcblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGxldCByaWdodE1vc3RDb250ZXh0VG9Vc2UgPSByaWdodG1vc3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KSAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0Ly8gd2UgY2hlY2sgdGhlIHJpZ2h0TW9zdEN1cnJlbnRDb250ZXh0IGNhbiBiZSB1c2VkIGluIGRyYWZ0XG5cdFx0XHRyaWdodE1vc3RDb250ZXh0VG9Vc2UgPSByb290Q3VycmVudENvbnRleHQ7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRNb3N0Q29udGV4dFRvVXNlLmdldFBhdGgoKSA9PT0gcm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRyZXR1cm4gZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihyb290Q3VycmVudENvbnRleHQsIHJpZ2h0TW9zdENvbnRleHRUb1VzZSwgcm9vdENvbnRleHRJbmZvLCBncm91cElkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgbm90IGluIGRyYWZ0IG1vZGUsIHdlIGp1c3QgcmVjcmVhdGUgYSBjb250ZXh0IGZyb20gdGhlIHBhdGggb2YgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHQvLyBObyBwYXRoIG1hcHBpbmcgaXMgbmVlZGVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbC5iaW5kQ29udGV4dChyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldEJvdW5kQ29udGV4dCgpLFxuXHRcdFx0XHRwYXRoTWFwcGluZzogW11cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0X2lzRmNsRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCk7XG5cdH1cblxuXHRhc3luYyBjaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uKCk6IFByb21pc2U8UmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vVGhlIGV4aXN0aW5nIHJlY29tbWVuZGF0aW9ucyBjaGVjayBpcyBub3cgcHJlc2VudCBmdXJ0aGVyIGluIHRoZSBmbG93IGZvciBzaG93aW5nIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKHRydWUpO1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3Nlbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgTmV4dCBEb2N1bWVudC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZWQgb25jZSBjcmVhdGUgbmV4dCBoYXBwZW5zLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTmV4dERvY3VtZW50KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0UGF0aCA9IHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmdQYXRoID0gYmluZGluZ0NvbnRleHRQYXRoPy5zdWJzdHJpbmcoMCwgYmluZGluZ0NvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiKFwiKSk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRG9jdW1lbnQobGlzdEJpbmRpbmdQYXRoIGFzIHN0cmluZywgeyBjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5OZXdQYWdlIH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEyRUEsTUFBTUEsZ0JBQWdCLEdBQUdDLFNBQVMsQ0FBQ0QsZ0JBQWdCO0lBQ2xERSxTQUFTLEdBQUdELFNBQVMsQ0FBQ0MsU0FBUztJQUMvQkMsV0FBVyxHQUFHRixTQUFTLENBQUNFLFdBQVc7SUFDbkNDLFFBQVEsR0FBR0gsU0FBUyxDQUFDRyxRQUFRO0lBQzdCQyxXQUFXLEdBQUdKLFNBQVMsQ0FBQ0ksV0FBVztFQTBCcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEEsSUFPTUMs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
3097
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiRWRpdEZsb3ciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJwdWJsaWNFeHRlbnNpb24iLCJfZGVjNCIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiX2RlYzExIiwiX2RlYzEyIiwiX2RlYzEzIiwiX2RlYzE0IiwiX2RlYzE1IiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiX2RlYzIzIiwiX2RlYzI0IiwiX2RlYzI1IiwiX2RlYzI2IiwiX2RlYzI3IiwiX2RlYzI4IiwiX2RlYzI5IiwiX2RlYzMwIiwiX2RlYzMxIiwiX2RlYzMyIiwiX2RlYzMzIiwiX2RlYzM0IiwiX2RlYzM1IiwiX2RlYzM2IiwiX2RlYzM3IiwiX2RlYzM4IiwiX2RlYzM5IiwiX2RlYzQwIiwiX2RlYzQxIiwiX2RlYzQyIiwiX2RlYzQzIiwiX2RlYzQ0IiwiSW5zdGVhZCIsIl9kZWM0NSIsIl9kZWM0NiIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQmFzZUNvbnRyb2xsZXJFeHRlbnMiLCJfdGhpcyIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY2FsbCIsInN5bmNUYXNrcyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJsaXN0QmluZGluZyIsImNyZWF0aW9uUHJvbWlzZSIsInBhcmVudENvbnRleHQiLCJuZXdDb250ZXh0IiwiY3JlYXRlZCIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldFZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsImVycm9yIiwiTG9nIiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwidmFsaWRhdGlvbk1lc3NhZ2VzIiwidGFibGUiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsImRhdGEiLCJjdXN0b21WYWxpZGl0eSIsImdldFByb3BlcnR5IiwiY3VzdG9tTWVzc2FnZXMiLCJmaWVsZENvbnRyb2wiLCJmaW5hbFRhcmdldCIsIm9sZE1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRDb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJmb3JFYWNoIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZmllbGRJZCIsImdldFBhdGgiLCJnZXRCaW5kaW5nUGF0aCIsImdldFRhcmdldHMiLCJzb21lIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInR5cGUiLCJNZXNzYWdlVHlwZSIsIkVycm9yIiwiY29kZSIsInRlY2huaWNhbCIsInBlcnNpc3RlbnQiLCJleGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyIsImFkZENvbnRyb2xJZCIsInB1c2giLCJ0ZXh0IiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJzaG93TWVzc2FnZURpYWxvZyIsInJlc29sdmVDcmVhdGlvbk1vZGUiLCJpbml0aWFsQ3JlYXRpb25Nb2RlIiwiY3JlYXRlRGF0YSIsIkNyZWF0aW9uTW9kZSIsIk5ld1BhZ2UiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJwcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsImlzUmVsYXRpdmUiLCJkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJnZXRNZXRhQ29udGV4dCIsImVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsIm5ld0FjdGlvbiIsIkRyYWZ0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIk5ld0FjdGlvbiIsInRvU3RyaW5nIiwidGFyZ2V0RW50aXR5VHlwZSIsImFjdGlvbnMiLCJwYXJhbWV0ZXJzIiwiRGVmZXJyZWQiLCJjcmVhdGlvblBhcmFtZXRlcnMiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsImdldENyZWF0aW9uUGFyYW1ldGVycyIsImdldEFwcENvbXBvbmVudCIsIkFzeW5jIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJvbkluaXQiLCJfaGlkZGVuRHJhZnQiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsImdldENhcGFiaWxpdGllcyIsIkhpZGRlbkRyYWZ0IiwiZ2V0SW50ZXJmYWNlIiwiYmFzZSIsImVkaXREb2N1bWVudCIsImNvbnRleHQiLCJ0cmFuc2FjdGlvbkhlbHBlciIsInJvb3RWaWV3Q29udHJvbGxlciIsIl9nZXRSb290Vmlld0NvbnRyb2xsZXIiLCJtb2RlbCIsInZpZXdEYXRhIiwiZ2V0Vmlld0RhdGEiLCJncm91cElkIiwibWVzc2FnZUhhbmRsaW5nS2V5IiwicmVnaXN0ZXJUb0hvbGRNZXNzYWdlcyIsInJvb3RDb250ZXh0IiwiZ2V0Um9vdENvbnRleHQiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsInJpZ2h0bW9zdENvbnRleHQiLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsInVuZGVmaW5lZCIsInRyYW5zYWN0aW9uRGV0YWlscyIsIm5ld0RvY3VtZW50Q29udGV4dFByb21pc2UiLCJyb290Q29udGV4dEluZm8iLCJyb290U2libGluZ1BhdGhQcm9taXNlIiwiX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJzaWJsaW5nSW5mb1Byb21pc2UiLCJjb21wdXRlU2libGluZ0luZm8iLCJ2aWV3TGV2ZWwiLCJfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInN1Ym1pdEJhdGNoIiwic2libGluZ0luZm8iLCJuZXdEb2N1bWVudENvbnRleHQiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsIl9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdCIsIl91cGRhdGVQYXRoc0luSGlzdG9yeSIsIm92ZXJyaWRlTWVzc2FnZVVJRGVjaXNpb24iLCJTdGlja3kiLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiZXhpc3RpbmdEcmFmdFJldXNlZCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsInNldEluaXRpYWxTaGFyZSIsIm9uQWZ0ZXJFZGl0IiwiX2hhbmRsZU5ld0NvbnRleHQiLCJlZGl0YWJsZSIsInJlY3JlYXRlQ29udGV4dCIsImZvcmNlRm9jdXMiLCJzdGlja3lDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsImhhbmRsZVN0aWNreU9uIiwic2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsInNldERvY3VtZW50TW9kaWZpZWQiLCJ1bkhvbGRLZXkiLCJvdmVycmlkZVVJRGVjaXNpb24iLCJyZWplY3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZSIsImlnbm9yZVRyYW5zaWVudENvbnRleHRzIiwic3RhdGVNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwibGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGgiLCJnZXRSZWxhdGl2ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJDb21tb25VdGlscyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImNvbnRleHRzVG9EZWxldGUiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIm9uQmVmb3JlRGVsZXRlIiwidGFibGVBUEkiLCJpc0lubGluZUNyZWF0aW9uUm93cyIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUiLCJpc0EiLCJnZXRQYXJlbnQiLCJ0YWJsZURlZmluaXRpb24iLCJjb250cm9sIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwiaXNJbmFjdGl2ZSIsImdldEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwic2VsZWN0ZWRDb250ZXh0cyIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJyZXN1bHQiLCJjbGVhclNlbGVjdGlvbiIsInZpZXdCaW5kaW5nQ29udGV4dCIsImlzUm9vdCIsInJlZnJlc2hMaXN0QmluZGluZyIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQiLCJyZWNvbW1lbmRhdGlvbnMiLCJpZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzIiwib25BZnRlckRlbGV0ZSIsImNvbnRleHRzIiwicmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMiLCJzZXRVcEVtcHR5Um93cyIsImdldENvbnRlbnQiLCJfc2VuZEFjdGl2aXR5IiwiQWN0aXZpdHkiLCJEZWxldGUiLCJ1bmxvY2siLCJ1cGRhdGVEb2N1bWVudCIsInVwZGF0ZWRDb250ZXh0IiwidXBkYXRlUHJvbWlzZSIsIm9yaWdpbmFsQmluZGluZ0NvbnRleHQiLCJpc0RyYWZ0IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwic3luY1Rhc2siLCJzZXREcmFmdFN0YXR1cyIsIlNhdmluZyIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsImVudGl0eVNldE5hbWUiLCJnZXRPYmplY3QiLCJzZW1hbnRpY0tleXMiLCJTZW1hbnRpY0tleUhlbHBlciIsImdldFNlbWFudGljS2V5cyIsImN1cnJlbnRTZW1hbnRpY01hcHBpbmciLCJfZ2V0U2VtYW50aWNNYXBwaW5nIiwiY3VycmVudFNlbWFudGljUGF0aCIsInNlbWFudGljUGF0aCIsInNDaGFuZ2VkUGF0aCIsImdldFNlbWFudGljUGF0aCIsIlNhdmVkIiwiQ2xlYXIiLCJzaG93TWVzc2FnZXMiLCJnZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbiIsImNyZWF0ZURvY3VtZW50Iiwic291cmNlIiwibUluUGFyYW1ldGVycyIsIm9EYXRhTGlzdEJpbmRpbmciLCJkYXRhTW9kZWwiLCJzZWxlY3RlZFByb3BlcnRpZXMiLCIkc2VsZWN0IiwiJCRncm91cElkIiwiRXh0ZXJuYWwiLCJsaXN0QmluZGluZ0Zyb21QYXRoIiwiYmluZExpc3QiLCJjcmVhdGVBdEVuZCIsInJlc29sdmVkQ3JlYXRpb25Nb2RlIiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJzaW5nbGVEcmFmdEZvckNyZWF0ZSIsImdldE1hbmlmZXN0IiwiYXBwIiwiZ2V0Um9vdEJpbmRpbmciLCJnZXRIZWFkZXJDb250ZXh0IiwibmV3QmluZGluZyIsImdldENvbnRleHQiLCJTb3J0ZXIiLCJGaWx0ZXIiLCJmaWx0ZXJzIiwicGF0aCIsIm9wZXJhdG9yIiwidmFsdWUxIiwiYW5kIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImRlc3Ryb3kiLCJfaGFuZGxlQ3JlYXRpb25Nb2RlIiwidkxpc3RCaW5kaW5nIiwiY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCIsIm91dGJvdW5kIiwiY3JlYXRlRGVmZXJyZWREb2N1bWVudCIsIkNyZWF0aW9uUm93IiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVDcmVhdGVSb3dEb2N1bWVudCIsInNraXBTaWRlRWZmZWN0cyIsIklubGluZSIsImNyZWF0ZURpYWxvZ0lubGluZURvY3VtZW50IiwidGFibGVJZCIsIkNyZWF0aW9uRGlhbG9nIiwiY3JlYXRpb25EaWFsb2dGaWVsZHMiLCJjcmVhdGVEaWFsb2dBbmRTYXZlRG9jdW1lbnQiLCJTeW5jIiwiY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQiLCJiRnJvbURlZmVycmVkIiwiY3JlYXRlQWN0aW9uIiwicG9zdERvY3VtZW50Q3JlYXRpb24iLCJwcmVyZXF1aXNpdGUiLCJwYXJhbXMiLCJvbkFmdGVyQ3JlYXRlIiwibWV0YUNvbnRleHQiLCJzdGFydGluZ0VudGl0eVNldCIsImdldEludGVybmFsTW9kZWwiLCJzZXRQcm9wZXJ0eSIsImlzTGlzdEJpbmRpbmdBbmFseXRpY2FsIiwiZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJDcmVhdGUiLCJpc0RyYWZ0Um9vdCIsImlzQ29ubmVjdGVkIiwiY3JlYXRpb24iLCJhcHBDb21wb25lbnQiLCJuYXZpZ2F0aW9uIiwiY3JlYXRpb25Sb3dDb250ZXh0IiwiZG9jdW1lbnRWYWxpZGF0aW9uIiwiZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24iLCJlbnRpdHlUeXBlIiwiY3JlYXRpb25Sb3dQYXlsb2FkIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImF0dGFjaEV2ZW50T25jZSIsInNjcm9sbFRvSW5kZXgiLCJnZXRMZW5ndGgiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJPYmplY3QiLCJhc3NpZ24iLCJrZXlzIiwicHJvcGVydHlQYXRoIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJmaW5kSW5kZXgiLCJwcm9wZXJ0eSIsIm5hbWUiLCJtYXAiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiaWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImdldFN0YXJ0dXBNb2RlIiwiQXV0b0NyZWF0ZSIsIl9nZXRSZXNvdXJjZU1vZGVsIiwiY3JlYXRpb25Sb3dMaXN0QmluZGluZyIsIm5ld1RyYW5zaWVudENvbnRleHQiLCJjcmVhdGUiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNhdGNoIiwidHJhY2UiLCJkZWxldGUiLCJhbGwiLCJpc0xvY2tlZCIsImNvbnRleHRJbmRleCIsImdldEluZGV4IiwiYWdncmVnYXRpb25EYXRhIiwiZ2V0QWdncmVnYXRpb24iLCJpc0NyZWF0ZUluUGxhY2UiLCJjcmVhdGVJblBsYWNlIiwic2V0VGltZW91dCIsImdldEJ1c3kiLCJmb2N1c1JvdyIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJnZXRUZXh0IiwicGFyZW50SW5kZXgiLCJzYXZlZERvY3VtZW50Q29udGV4dCIsImFmdGVyQ3JlYXRlSW5EaWFsb2ciLCJvbkJlZm9yZVNhdmUiLCJzYXZlRG9jdW1lbnQiLCJvbkFmdGVyU2F2ZSIsInJlZnJlc2giLCJpdGVtSW5kZXgiLCJhZnRlckNyZWF0ZUNhbGxCYWNrIiwiZ2V0SW50ZXJuYWxSb3V0aW5nIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMiLCJtb2RlIiwicm91dGluZ0xpc3RlbmVyIiwiY3JlYXRlQ29udGV4dFByb21pc2UiLCJjb3JlUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibmF2UGFyYW1ldGVycyIsInRyYW5zaWVudCIsIm5hdmlnYXRlVG9Db250ZXh0IiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwiQ3JlYXRpb25GYWlsZWQiLCJPbkJlZm9yZUNyZWF0ZUZhaWxlZCIsImluY2x1ZGVzIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiY29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJjcmVhdGVQYXRoIiwiZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInZhbGlkYXRlRG9jdW1lbnQiLCJjcmVhdGlvblJvd09iamVjdHMiLCJjcmVhdGVNdWx0aXBsZURvY3VtZW50cyIsImRhdGFGb3JDcmVhdGUiLCJpc0Zyb21Db3B5UGFzdGUiLCJjcmVhdGVBc0luYWN0aXZlIiwidGFyZ2V0TGlzdEJpbmRpbmciLCJtZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiY3JlYXRpb25Qcm9taXNlcyIsInByb3BlcnR5VmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsImluYWN0aXZlIiwiJGtpbmQiLCJjcmVhdGVkQ29udGV4dHMiLCJhY3RpdmVDb250ZXh0cyIsImVyciIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlRGlzY2FyZCIsIm9uQmVmb3JlRXhlY3V0ZUFjdGlvbiIsIm9uQWZ0ZXJEaXNjYXJkIiwib0NvbnRleHQiLCJtUGFyYW1ldGVycyIsImlubGluZUVkaXRGbG93IiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJpbmxpbmVFZGl0U2F2ZSIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJtZXJnZVBhdGNoRHJhZnQiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4iLCJjaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uIiwic1Byb2dyYW1taW5nTW9kZWwiLCJpc0ZjbEVuYWJsZWQiLCJfc2lkZUVmZmVjdHMiLCJoYW5kbGVQYWdlQ2hhbmdlQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiZ2V0Q3JlYXRpb25Nb2RlIiwiaXNTdGFuZGFyZFNhdmUiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIkFjdGl2YXRlIiwiZGlzY29ubmVjdCIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsInN0b3JlRGF0YUZvclRlbGVtZXRyeSIsIl9jcmVhdGVTaWJsaW5nSW5mbyIsInByZXZpb3VzU2VtYW50aWNQYXRoIiwibmV3U2VtYW50aWNQYXRoIiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsInN0YXlPbkN1cnJlbnRQYWdlQWZ0ZXJTYXZlIiwidGFyZ2V0Q29udGV4dCIsInNraXBCaW5kaW5nVG9WaWV3Iiwib0Vycm9yIiwiY2FuY2VsZWQiLCJ0b2dnbGVEcmFmdEFjdGl2ZSIsIm9Db250ZXh0RGF0YSIsImJJc0RyYWZ0IiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJvUmlnaHRtb3N0Q29udGV4dCIsImxhc3RTZW1hbnRpY01hcHBpbmciLCJ0ZWNobmljYWxQYXRoIiwidGFyZ2V0UGF0aCIsImNhbmNlbERvY3VtZW50IiwiaXNOZXdEb2N1bWVudCIsInNraXBEaXNjYXJkUG9wb3ZlciIsImVuYWJsZWQiLCJjYW5jZWxQYXJhbWV0ZXJzIiwiY2FuY2VsQnV0dG9uIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjYW5jZWxSZXN1bHQiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInZpZXciLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJzdGF5T25DdXJyZW50UGFnZUFmdGVyQ2FuY2VsIiwiX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMiLCJzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZSIsImJpbmRpbmdQYXJhbWV0ZXJzIiwiY3JlYXRlUm9vdENvbnRleHQiLCJpc1Jvb3RDb250ZXh0TmV3IiwiZHJhZnRQcm9wZXJ0aWVzIiwicmVxdWVzdFByb3BlcnR5IiwicmVzb3VyY2VNb2RlbCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJzaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQiLCJjbG9zZU9uQnJvd3Nlck5hdmlnYXRpb24iLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImRlbGV0ZURvY3VtZW50Iiwib0FwcENvbXBvbmVudCIsInNpYmxpbmdDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJkcmFmdFBhdGgiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImRyYWZ0Q29udGV4dFRvUmVtb3ZlIiwicmVwbGFjZVdpdGgiLCJjb250ZXh0QmluZGluZyIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsIkRlZXBsaW5rIiwiZXhpdEZyb21BcHAiLCJhcHBseURvY3VtZW50Iiwib0xvY2tPYmplY3QiLCJpc0NvbnRpbnVlIiwic2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2ciLCJSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIiwiQ29udGludWUiLCJjYWxsRXh0ZW5zaW9uIiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJvVmlldyIsImlzQXJyYXkiLCJpc05hdmlnYWJsZSIsInJlcXVpcmVzTmF2aWdhdGlvbiIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwiZW50aXR5Q29udGFpbmVyIiwiaXNCb3VuZCIsIm9Db250cm9sIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJpZ25vcmVFVGFnIiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoIiwiZW5hYmxlQXV0b1Njcm9sbCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJnZXRJZCIsInJlc3BvbnNlIiwiY2FsbEFjdGlvbiIsInN1Y2Nlc3NGdWxsRXhlY3V0aW9uIiwiaXNGdWxmaWxsZWQiLCJsaXN0UmVmcmVzaGVkIiwiX3JlZnJlc2hMaXN0SWZSZXF1aXJlZCIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJBY3Rpb24iLCJ2YWx1ZSIsImJvdW5kQ29udGV4dCIsImFjdGlvbiIsImZSZXNvbHZlciIsImNvbnZlcnRlclR5cGUiLCJfZ2V0Qm91bmRDb250ZXh0IiwicmV0dXJuZWRDb250ZXh0Iiwib01ldGFNb2RlbCIsInNDb250ZXh0TWV0YVBhdGgiLCJfZm5WYWxpZENvbnRleHRzIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZWxlbWVudCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiaW5mbyIsIm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24iLCJvUmVzdWx0IiwiZlJlamVjdG9yIiwiX2FjdGlvbk5hbWUiLCJjdXN0b21NYXNzRWRpdFNhdmUiLCJzZWN1cmVkRXhlY3V0aW9uIiwiZm5GdW5jdGlvbiIsImJCdXN5U2V0IiwiYnVzeSIsInNldCIsImJCdXN5Q2hlY2siLCJjaGVjayIsImJVcGRhdGVzRG9jdW1lbnQiLCJ1cGRhdGVzRG9jdW1lbnQiLCJmaW5hbGx5IiwiaGFuZGxlUGF0Y2hTZW50Iiwib0V2ZW50IiwiaW50ZXJuYWxDb250ZXh0IiwidWlDb250ZXh0IiwiZ2V0U291cmNlIiwic2V0SWdub3JlRVRhZyIsImhhbmRsZUlubGluZUVkaXRQYXRjaFNlbnQiLCJzb3VyY2VCaW5kaW5nIiwib1BhdGNoUHJvbWlzZSIsInBhdGNoQ29tcGxldGVkRXZlbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2giLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsImhhbmRsZUNyZWF0ZVNlbnQiLCJldmVudCIsIm5ld1Rhc2siLCJkZWJ1ZyIsImNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZSIsImdsb2JhbE1vZGVsIiwiZm9yY2VEaXNwbGF5TW9kZSIsImlzQWN0aXZlRW50aXR5IiwicmVxdWVzdE9iamVjdCIsImFjdGl2YXRlQ29sbGFib3JhdGlvbiIsImZldGNoQ29sbGFib3JhdGl2ZURyYWZ0VXNlcnNQcm9taXNlIiwiaGFzQWN0aXZlRW50aXR5IiwibGFzdEludm9rZWRBY3Rpb25OYW1lIiwiaXNOZXdBY3Rpb25Gb3JTdGlja3kiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJzb3VyY2VDb250cm9sIiwiZ2V0UmVzb3VyY2VNb2RlbCIsIlRyYW5zYWN0aW9uSGVscGVyIiwibWVzc2FnZUhhbmRsZXIiLCJnZXRQYWdlSW50ZXJuYWxNb2RlbCIsInNldENyZWF0aW9uTW9kZSIsImJDcmVhdGlvbk1vZGUiLCJwYWdlSW50ZXJuYWxDb250ZXh0IiwiVWlNb2RlbENvbnN0YW50cyIsIkNyZWF0ZU1vZGUiLCJEb2N1bWVudE1vZGlmaWVkIiwibW9kaWZpZWQiLCJiaW5kaW5nIiwibWVzc2FnZUhhbmRsaW5nS2V5U2V0cyIsImF0dGFjaEV2ZW50IiwiZXZlbnRJbnN0YW5jZSIsImZpbmQiLCJzdWNjZXNzIiwiZHJhZnRTdGF0dXMiLCJlZGl0TW9kZSIsImlzQ3JlYXRpb24iLCJmb3JjZWQiLCJzaGFsbEZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkIiwiYWN0aW9uTmFtZSIsInN0aWNreVNlc3Npb24iLCJBZGRpdGlvbmFsTmV3QWN0aW9ucyIsImhhc05hdmlnYXRpb25HdWFyZCIsImhhc2hUcmFja2VyIiwiZ2V0SGFzaCIsImludGVybmFsTW9kZWwiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiYmluZCIsImkxOG5Nb2RlbCIsInJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyIsImdldERpcnR5U3RhdGVQcm92aWRlciIsImdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24iLCJnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbiIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJ1bnJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyIsImdldEh0dHBIZWFkZXJzIiwibmF2aWdhdGlvbkNvbnRleHQiLCJ0YXJnZXRIYXNoIiwiaW5uZXJBcHBSb3V0ZSIsInJvdXRlclByb3h5IiwibGNsSGFzaFRyYWNrZXIiLCJpc0RpcnR5IiwiaXNTZXNzaW9uT24iLCJpc05hdmlnYXRpb25GaW5hbGl6ZWQiLCJjaGVja0hhc2hXaXRoR3VhcmQiLCJpc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyIiwic2V0RGlydHlGbGFnIiwid2FybmluZ0RpYWxvZyIsIkRpYWxvZyIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInByZXNzIiwiYWZ0ZXJDbG9zZSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRNb2RlbCIsImFkZERlcGVuZGVudCIsIm9wZW4iLCJjdXJyZW50SGFzaCIsImRpc2NhcmRTdGlja3lTZXNzaW9uIiwiY2xlYXJTZXNzaW9uQ29udGV4dCIsImRpc2NhcmRlZENvbnRleHQiLCJzdGlja3kiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZXNldENoYW5nZXMiLCJfcm91dGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJyZXNvbHZlRnVuY3Rpb24iLCJyZWplY3RGdW5jdGlvbiIsImFjdGlvblByb21pc2UiLCJjdXJyZW50VmlldyIsIm1ldGFNb2RlbERhdGEiLCJtZXRhTW9kZWxBY3Rpb24iLCJhY3Rpb25SZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCIkVHlwZSIsIiRLZXkiLCJvRGF0YSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJpc1NhdmUiLCJjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nIiwiX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsInJvd0JpbmRpbmciLCJhY3RpdmVSb3dJbmRleCIsImdldENvdW50IiwiYWxsUm93Q29udGV4dHMiLCJnZXRBbGxDdXJyZW50Q29udGV4dHMiLCJpbmRleCIsInNpbmdsZUNvbnRleHQiLCJjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyIsImlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUiLCJyZWxhdGVkQ29udGV4dHMiLCJ0cmlnZ2VyZWRBY3Rpb25OYW1lIiwiYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyIsInNlbmQiLCJ0cmlnZ2VyVHlwZSIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwib01vZGVsIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsInByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbiIsImhpc3RvcnkiLCJiYWNrIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwZXJzaXN0T1BTY3JvbGwiLCJyZWFzb24iLCJOYXZpZ2F0aW9uUmVhc29uIiwiRWRpdEZsb3dBY3Rpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJrZWVwQ3VycmVudExheW91dCIsImJSZWZyZXNoQWZ0ZXJBY3Rpb24iLCJ2aXNpYmxlVmlld0lkcyIsIl9nZXRBbGxWaXNpYmxlVmlld3MiLCJhTWVzc2FnZXMiLCJ2YWxpZGF0aW9uIiwiZ2V0Q29udHJvbElkIiwib1Jlc3BvbnNlIiwib0JpbmRpbmciLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJwYXRocyIsIm9LZXkiLCIkUHJvcGVydHlQYXRoIiwib3ZlcmxvYWRFbnRpdHlUeXBlIiwiY29udGV4dFNlZ21lbnRzIiwiY3VycmVudENvbnRleHQiLCJwb3AiLCJ1bnNoaWZ0IiwicGFyZW50Q29udGV4dHMiLCJwYXRoU2VnbWVudCIsInJldmVyc2UiLCJvdmVybG9hZENvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwicmlnaHRNb3N0Q29udGV4dFRvVXNlIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiY3JlYXRlTmV4dERvY3VtZW50IiwiYmluZGluZ0NvbnRleHRQYXRoIiwibGlzdEJpbmRpbmdQYXRoIiwibGFzdEluZGV4T2YiLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgSVJvd0JpbmRpbmdJbnRlcmZhY2UgZnJvbSBcInNhcC9mZS9jb3JlL0lSb3dCaW5kaW5nSW50ZXJmYWNlXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21NZXNzYWdlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB0eXBlIHtcblx0Q2FuY2VsUGFyYW1ldGVycyxcblx0Q3JlYXRlUGFyYW1ldGVycyxcblx0RWRpdFRyYW5zYWN0aW9uRXhlY3V0aW9uRGV0YWlsc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvVHJhbnNhY3Rpb25IZWxwZXJcIjtcbmltcG9ydCBUcmFuc2FjdGlvbkhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvVHJhbnNhY3Rpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzLCBSb290Q29udGV4dEluZm8sIFNpYmxpbmdJbmZvcm1hdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgc3RpY2t5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9zdGlja3lcIjtcbmltcG9ydCB0eXBlIHsgSGlkZGVuRHJhZnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgRHJhZnRTaWJsaW5nUGFpciB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgUm9vdFZpZXdCYXNlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvUm9vdFZpZXdCYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMsIFNlbWFudGljTWFwcGluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIE1hY3JvVGFibGUgZnJvbSBcInNhcC9mZS9tYWNyb3MvVGFibGVcIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQVBJXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIENyZWF0aW9uUm93IGZyb20gXCJzYXAvdWkvbWRjL3RhYmxlL0NyZWF0aW9uUm93XCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IFNvcnRlciBmcm9tIFwic2FwL3VpL21vZGVsL1NvcnRlclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDb250ZXh0LCBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxFbnRpdHlUeXBlIH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcIi4uL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB7IENvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZywgUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB9IGZyb20gXCIuLi9jb250cm9scy9SZWNvbW1lbmRhdGlvbnMvQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nXCI7XG5pbXBvcnQgeyBDcmVhdGlvbk1vZGUsIHR5cGUgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBpc0Z1bGZpbGxlZCB9IGZyb20gXCIuLi9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgT3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4vZWRpdEZsb3cvb3BlcmF0aW9ucy9PRGF0YU9wZXJhdGlvblwiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcIi4vcm91dGluZy9OYXZpZ2F0aW9uUmVhc29uXCI7XG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0U3RhcnR1cE1vZGUgPSBGRUxpYnJhcnkuU3RhcnR1cE1vZGU7XG5cbnR5cGUgU2F2ZURvY3VtZW50UGFyYW1ldGVycyA9IHtcblx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I/OiBib29sZWFuO1xuXHRtZXJnZVBhdGNoRHJhZnQ/OiBib29sZWFuO1xuXHRza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW47XG5cdGJpbmRpbmdzPzogT0RhdGFMaXN0QmluZGluZ1tdO1xuXHRpc1N0YW5kYXJkU2F2ZT86IGJvb2xlYW47XG59O1xuXG50eXBlIEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRkYXRhPzogb2JqZWN0O1xuXHR0YWJsZUlkPzogc3RyaW5nO1xuXHRvdXRib3VuZD86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjkwLjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcIilcbmNsYXNzIEVkaXRGbG93IGV4dGVuZHMgQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgc3luY1Rhc2tzOiBQcm9taXNlPHVua25vd24+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0cHJpdmF0ZSBhY3Rpb25Qcm9taXNlPzogUHJvbWlzZTx7IGNvbnRyb2xJZD86IHN0cmluZzsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9PjtcblxuXHRwcml2YXRlIGNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/OiBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2c7XG5cblx0cHJpdmF0ZSBfaGlkZGVuRHJhZnQ6IEhpZGRlbkRyYWZ0IHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgZmV0Y2hDb2xsYWJvcmF0aXZlRHJhZnRVc2Vyc1Byb21pc2U6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpLkhpZGRlbkRyYWZ0IGFzIEhpZGRlbkRyYWZ0O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRJbnRlcmZhY2UoKTogQmFzZU9iamVjdCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldEludGVyZmFjZSgpO1xuXHR9XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIHRoZSBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBlZGl0YWJsZSBjb250ZXh0XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRjb25zdCBncm91cElkID0gXCJlZGl0R3JvdXBcIjtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQoY29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVFZGl0KHsgY29udGV4dDogcm9vdENvbnRleHQgfSk7XG5cblx0XHRcdGxldCByaWdodG1vc3RDb250ZXh0ID0gdGhpcy5faXNGY2xFbmFibGVkKCkgPyAocm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IGNvbnRleHQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocmlnaHRtb3N0Q29udGV4dCkgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gd2UgY2hlY2sgdGhlIHJpZ2h0bW9zdENvbnRleHQgY2FuIGJlIHVzZWQgaW4gZHJhZnRcblx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0cmFuc2FjdGlvbkRldGFpbHM6IEVkaXRUcmFuc2FjdGlvbkV4ZWN1dGlvbkRldGFpbHMgPSB7fTtcblx0XHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dFByb21pc2UgPSB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQoXG5cdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGdyb3VwSWQsXG5cdFx0XHRcdHRyYW5zYWN0aW9uRGV0YWlsc1xuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJvb3RDb250ZXh0SW5mbyA9IHtcblx0XHRcdFx0cm9vdFNpYmxpbmdQYXRoUHJvbWlzZTogbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXG5cdFx0XHRsZXQgc2libGluZ0luZm9Qcm9taXNlO1xuXHRcdFx0Ly8gcmlnaHRtb3N0Q29udGV4dCA9PT0gcm9vdENvbnRleHQgPT4gd2UncmUgaW4gT1AuIElmIG5vdCwgd2UncmUgaW4gbXVsdGktY29sdW1uIGxheW91dCBvZiBGQ0xcblx0XHRcdGNvbnN0IGNvbXB1dGVTaWJsaW5nSW5mbyA9IHJpZ2h0bW9zdENvbnRleHQgIT09IHJvb3RDb250ZXh0IHx8ICh2aWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxO1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRzaWJsaW5nSW5mb1Byb21pc2UgPSB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0SW5mbyxcblx0XHRcdFx0XHRncm91cElkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRjb250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goZ3JvdXBJZCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IChhd2FpdCBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlKSBhcyBDb250ZXh0O1xuXHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlOiBDb250ZXh0IHwgdW5kZWZpbmVkID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbyAmJiBjb250ZXh0VG9OYXZpZ2F0ZSkge1xuXHRcdFx0XHRpZiAoc2libGluZ0luZm8gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCxcblx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdFx0XCIkYXV0b1wiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHRoaXMuX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCwgc2libGluZ0luZm8pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3RvcnkoW10pO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiA9IGZhbHNlO1xuXHRcdFx0aWYgKG5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgJiZcblx0XHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0XHR0cmFuc2FjdGlvbkRldGFpbHMuZXhpc3RpbmdEcmFmdFJldXNlZCAhPT0gdHJ1ZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBUaGUgaW5pdGlhbCBzaGFyZSBhY3Rpb24gc2hhbGwgYmUgY2FsbGVkICAoZXhjZXB0IGlmIHRoZSBkcmFmdCBhbHJlYWR5IGV4aXN0ZWQpXG5cdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5zZXRJbml0aWFsU2hhcmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJFZGl0KHsgY29udGV4dDogY29udGV4dFRvTmF2aWdhdGUgfSk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUgYXMgQ29udGV4dCwge1xuXHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHJlY3JlYXRlQ29udGV4dDogZmFsc2UsXG5cdFx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0bGV0IHN0aWNreUNvbnRleHQ6IENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIHVzZSB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IHVzZWQgdG8gYmluZCB0aGUgcGFnZVxuXHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG5ld0RvY3VtZW50Q29udGV4dD8uZ2V0TW9kZWwoKS5nZXRLZWVwQWxpdmVDb250ZXh0KG5ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmhhbmRsZVN0aWNreU9uKHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG92ZXJyaWRlTWVzc2FnZVVJRGVjaXNpb24gPSB0cnVlO1xuXG5cdFx0XHRcdC8vIFdlIGNoYW5nZSB0aGUgZWRpdCBtb2RlIGFmdGVyIHRoZSBwYWdlIGJpbmRpbmcgaGFzIGJlZW4gZG9uZSwgb3RoZXJ3aXNlIHRoZSBjcmVhdGlvbiBvZiBlbXB0eSByb3dzIG1pZ2h0IGZhaWwgKGFzIHRoZSB0YWJsZSBpcyBzdGlsbCBvbiB0aGUgYWN0aXZlIHZlcnNpb24pXG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5LCBvdmVycmlkZVVJRGVjaXNpb246IG92ZXJyaWRlTWVzc2FnZVVJRGVjaXNpb24gfSk7XG5cdFx0XHRyZXR1cm4gY29udGV4dFRvTmF2aWdhdGU7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBzaWRlIGVmZmVjdHMgcmVxdWlyZWQgYWZ0ZXIgZGVsZXRpbmcgYW4gb2JqZWN0LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyB0aGUgZGVsZXRlZCBvYmplY3QgYmVsb25ncyB0b1xuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgcGFyZW50IG9iamVjdCBvZiB0aGUgZGVsZXRlZCBvYmplY3Rcblx0ICogQHBhcmFtIGlnbm9yZVRyYW5zaWVudENvbnRleHRzIElmIHRydWUsIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgaWdub3JlZFxuXHQgKi9cblx0cHJpdmF0ZSByZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRcdGlnbm9yZVRyYW5zaWVudENvbnRleHRzID0gZmFsc2Vcblx0KTogdm9pZCB7XG5cdFx0aWYgKHBhcmVudENvbnRleHQgJiYgdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQsIGlnbm9yZVRyYW5zaWVudENvbnRleHRzKSkge1xuXHRcdFx0Y29uc3Qgc3RhdGVNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgobGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgcGFyZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgd2UgbmVlZCB0byByZWZyZXNoIHN0YXRlIG1lc3NhZ2VzIGZvciB0aGUgT2JqZWN0UGFnZSwgYXMgc29tZSBvZiB0aGVzZSBtZXNzYWdlcyBtaWdodCBiZSBhdHRhY2hlZFxuXHRcdFx0Ly8gdG8gY2hpbGRyZW4gb2YgYSBkZWxldGVkIHJvdyB3aGljaCBtYXkgbm90IGhhdmUgYmVlbiBsb2FkZWQgeWV0LCBhbmQgdGhlcmVmb3JlIHRoZSBtb2RlbCB3b3VsZG4ndCBjbGVhbiB1cCB0aGVzZSBtZXNzYWdlc1xuXHRcdFx0aWYgKHN0YXRlTWVzc2FnZXNQYXRoICYmIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpLnJlcXVlc3RTaWRlRWZmZWN0cyhbc3RhdGVNZXNzYWdlc1BhdGhdLCBwYXJlbnRDb250ZXh0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIHNpZGUgZWZmZWN0cyByZXF1aXJlZCB3aGVuIHN0cnVjdHVyYWwgY2hhbmdlIChjcmVhdGUvZGVsZXRlKSBpcyBkb25lIGludG8gYSB0YWJsZS5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdGhlIGRlbGV0ZWQgb2JqZWN0IGJlbG9uZ3MgdG9cblx0ICogQHBhcmFtIHBhcmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHBhcmVudCBvYmplY3Qgb2YgdGhlIGRlbGV0ZWQgb2JqZWN0XG5cdCAqIEBwYXJhbSBpZ25vcmVUcmFuc2llbnRDb250ZXh0cyBJZiB0cnVlLCB0cmFuc2llbnQgY29udGV4dHMgYXJlIGlnbm9yZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpZiBzaWRlIGVmZmVjdHMgd2VyZSByZXF1ZXN0ZWQsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmVudENvbnRleHQ6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdGlnbm9yZVRyYW5zaWVudENvbnRleHRzID0gZmFsc2Vcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKHBhcmVudENvbnRleHQpIHtcblx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nUmVsYXRpdmVQYXRoID0gTW9kZWxIZWxwZXIuZ2V0UmVsYXRpdmVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHBhcmVudENvbnRleHQsIGxpc3RCaW5kaW5nKTtcblx0XHRcdGlmICgoaWdub3JlVHJhbnNpZW50Q29udGV4dHMgfHwgIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSAmJiBsaXN0QmluZGluZ1JlbGF0aXZlUGF0aCkge1xuXHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzIChhbmQgd2UgZG9uJ3QgaWdub3JlIHRoaXMgY2hlY2spLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmdSZWxhdGl2ZVBhdGgsIHBhcmVudENvbnRleHQpO1xuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIGNvbnRleHRzVG9EZWxldGUgVGhlIGNvbnRleHRzIG9mIHRoZSBkb2N1bWVudHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFja1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm5vRGlhbG9nXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRjb250ZXh0c1RvRGVsZXRlOiBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ6IHN0cmluZztcblx0XHRcdG5vRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0cz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyA9IHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzICE9PSBmYWxzZTtcblx0XHRsZXQgdGFibGVBUEk6IFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBpc0lubGluZUNyZWF0aW9uUm93cyA9IGZhbHNlO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBwYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCkgPz8gRWxlbWVudC5nZXRFbGVtZW50QnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0bGV0IGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdID0gW107XG5cdFx0aWYgKHBhcmVudENvbnRyb2w/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0YWJsZUFQSSA9IHBhcmVudENvbnRyb2wuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRpc0lubGluZUNyZWF0aW9uUm93cyA9IHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzO1xuXHRcdFx0aW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlID0gY29udGV4dHNUb0RlbGV0ZS5maWx0ZXIoKGNvbnRleHQpID0+IGNvbnRleHQuaXNJbmFjdGl2ZSgpKTtcblx0XHR9XG5cdFx0aWYgKCFwYXJlbnRDb250cm9sKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSBwYXJlbnRDb250cm9sIGFzIENvbnRyb2w7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gKHBhcmVudENvbnRyb2wuZ2V0QmluZGluZyhcIml0ZW1zXCIpIHx8IChwYXJlbnRDb250cm9sIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0cGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChwYXJhbWV0ZXJzPy5zZWxlY3RlZENvbnRleHRzPy5bMF0gPz8gY29udGV4dHNUb0RlbGV0ZVswXSkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihjb250ZXh0c1RvRGVsZXRlLCBwYXJhbWV0ZXJzKTtcblxuXHRcdFx0bGV0IHJlc3VsdDtcblxuXHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdHBhcmVudENvbnRyb2wuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlbiByZWZyZXNoIHRoZSBsaXN0LWJpbmRpbmcgKExSKSwgb3IgcmVxdWlyZSBzaWRlLWVmZmVjdHMgKE9QKVxuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdHJlc3VsdCA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcobGlzdEJpbmRpbmcsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nLCB2aWV3QmluZGluZ0NvbnRleHQsIGlzSW5saW5lQ3JlYXRpb25Sb3dzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVsZXRpbmcgYXQgbGVhc3Qgb25lIG9iamVjdCBzaG91bGQgYWxzbyBzZXQgdGhlIFVJIHRvIGRpcnR5XG5cdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQgPSB0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlzUmVjb21tZW5kYXRpb25FbmFibGVkKCk7XG5cdFx0XHQvLyBXZSBjbGVhciByZWNvbW1lbmRhdGlvbiBkYXRhIGFuZCBjb250ZXh0cyBmcm9tIGludGVybmFsIG1vZGVsIGZvciB0aGUgZGVsZXRlZCBjb250ZXh0c1xuXHRcdFx0aWYgKGlzUmVjb21tZW5kYXRpb25FbmFibGVkKSB7XG5cdFx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyhjb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vdGlmeSBjb25zdW1lcnMgb2Ygd2hpY2ggY29udGV4dHMgd2VyZSBkZWxldGVkXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckRlbGV0ZSh7IGNvbnRleHRzOiBjb250ZXh0c1RvRGVsZXRlIH0pO1xuXG5cdFx0XHRpZiAodGFibGVBUEkpIHtcblx0XHRcdFx0aWYgKGlzSW5saW5lQ3JlYXRpb25Sb3dzICYmIGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dGFibGVBUEkucmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMoaW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyh0YWJsZUFQSS5nZXRDb250ZW50KCksIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBjb250ZXh0c1RvRGVsZXRlKTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHJlc3VsdDtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gV2Ugc3RpbGwgd2FudCB0byByZWZyZXNoIHRoZSBsaXN0YmluZGluZyBpbiBjYXNlIHdlIGRlbGV0ZWQgc29tZSBpbmZvcm1hdGlvbiBidXQgbm90IGV2ZXJ5dGhpbmcgKERyYWZ0cyBmb3IgZXhhbXBsZSlcblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKGxpc3RCaW5kaW5nLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nLCB2aWV3QmluZGluZ0NvbnRleHQsIGlzSW5saW5lQ3JlYXRpb25Sb3dzKTtcblx0XHRcdH1cblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIGVycm9ycyBkdXJpbmcgYW4gdXBkYXRlLlxuXHQgKiBAcGFyYW0gdXBkYXRlZENvbnRleHQgQ29udGV4dCBvZiB0aGUgdXBkYXRlZCBmaWVsZFxuXHQgKiBAcGFyYW0gdXBkYXRlUHJvbWlzZSBQcm9taXNlIHRvIGRldGVybWluZSB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBzbyB0aGUgZHJhZnQgc3RhdHVzIGNhbiBiZSB1cGRhdGVkLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdXBkYXRlRG9jdW1lbnQodXBkYXRlZENvbnRleHQ6IEJpbmRpbmcgfCBDb250ZXh0LCB1cGRhdGVQcm9taXNlOiBQcm9taXNlPHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgaXNEcmFmdCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbCh1cGRhdGVkQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAob3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHVwZGF0ZVByb21pc2U7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWlzRHJhZnQgfHwgIWN1cnJlbnRCaW5kaW5nQ29udGV4dCB8fCBjdXJyZW50QmluZGluZ0NvbnRleHQgIT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMobWV0YU1vZGVsLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHNlbWFudGljS2V5cz8ubGVuZ3RoICYmXG5cdFx0XHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlICYmIC8vIFdlIGRvbid0IHVzZSB0aGUgc2VtYW50aWMga2V5IGZvciBhIG5ldyBkb2N1bWVudCAoY3JlYXRpb24pXG5cdFx0XHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNQYXRoID0gY3VycmVudFNlbWFudGljTWFwcGluZz8uc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0c0NoYW5nZWRQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGN1cnJlbnRCaW5kaW5nQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gY3VycmVudFNlbWFudGljUGF0aCBjb3VsZCBiZSBudWxsIGlmIHdlIGhhdmUgbmF2aWdhdGVkIHZpYSBkZWVwIGxpbmsgdGhlbiB0aGVyZSBhcmUgbm8gc2VtYW50aWNNYXBwaW5ncyB0byBjYWxjdWxhdGUgaXQgZnJvbVxuXHRcdFx0XHRcdGlmIChjdXJyZW50U2VtYW50aWNQYXRoICYmIGN1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQsIHsgZWRpdGFibGU6IHRydWUsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0aWYgKGlzRHJhZnQgJiYgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uKHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQpOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHNlbGVjdGVkQ29udGV4dHMgJiYgc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyBPbmUgcGFyZW50IGF0IG1vc3QgISFcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhIG5ldyBkb2N1bWVudCBpbiBhIFRyZWVUYWJsZSB3aXRoICR7c2VsZWN0ZWRDb250ZXh0cy5sZW5ndGh9IHBhcmVudHNgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc2VsZWN0ZWRDb250ZXh0cz8ubGVuZ3RoID09PSAxID8gc2VsZWN0ZWRDb250ZXh0c1swXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gc291cmNlICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIG9yIGEgdGFibGUgYnVpbGRpbmcgYmxvY2sgZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzo8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJywgb3IgJ0RlZmVycmVkJyBpcyB1c2VkPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIHdpdGhpbiB0aGUgdGFibGUuIE5vdCBzdXBwb3J0ZWQgb24gYSBMaXN0IFJlcG9ydDxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGluIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCc8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25EaWFsb2cgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBpbiB0aGUgdGFibGUsIHdpdGggYSBkaWFsb2cgYWxsb3dpbmcgdG8gc3BlY2lmeSBzb21lIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzICh0aGUgcHJvcGVydGllcyBhcmUgbGlzdGVkIGluIGBjcmVhdGlvbkRpYWxvZ0ZpZWxkc2ApXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRhYmxlSWQgSUQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm91dGJvdW5kIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnRXh0ZXJuYWwnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5idXN5TW9kZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgVGhlIGNvbnRleHRzIHRoYXQgYXJlIHNlbGVjdGVkIGluIHRoZSB0YWJsZSBpbml0aWF0aW5nIHRoZSBjcmVhdGlvbi4gVXNlZCBpbiBjYXNlIG9mIGEgVHJlZVRhYmxlIHRvIGRldGVybWluZSB0aGUgcGFyZW50IGNvbnRleHQgb2YgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgV2hlbiBlbmFibGVkLCBhbiBleHRyYSByZXF1ZXN0IGNoZWNrcyBpZiBhbnkgZHJhZnRzIGV4aXN0IHRoYXQgd2VyZSBuZXZlciBzYXZlZC4gSWYgdW5zYXZlZCBkcmFmdHMgYXJlIGZvdW5kLCB0aGUgbmV3ZXN0IG9uZSBpcyBvcGVuZWQuIElmIG5vIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgYSBuZXcgZW50aXR5IGlzIGNyZWF0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgRGVmaW5lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGUgY3JlYXRpb24gZGlhbG9nIHdoZW4gdGhlIGNyZWF0aW9uIG1vZGUgaXMgc2V0IHRvICdDcmVhdGlvbkRpYWxvZycuPGJyLz5UaGUgdmFsdWUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdHNvdXJjZTogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyB8IE1hY3JvVGFibGUsXG5cdFx0bUluUGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0c2luZ2xlRHJhZnRGb3JDcmVhdGU/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBvRGF0YUxpc3RCaW5kaW5nITogT0RhdGFMaXN0QmluZGluZztcblx0XHRsZXQgcGFyZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBkYXRhTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdGxldCBzZWxlY3RlZFByb3BlcnRpZXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRpZiAoZGF0YU1vZGVsICYmIE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKGRhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdHNlbGVjdGVkUHJvcGVydGllcyA9IFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRBZG1pbmlzdHJhdGl2ZVVzZXIsSXNBY3RpdmVFbnRpdHksSGFzQWN0aXZlRW50aXR5XCI7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgJiYgc291cmNlLmlzQSAmJiBzb3VyY2UuaXNBPElSb3dCaW5kaW5nSW50ZXJmYWNlPihcInNhcC5mZS5jb3JlLklSb3dCaW5kaW5nSW50ZXJmYWNlXCIpKSB7XG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nID0gc291cmNlLmdldFJvd0JpbmRpbmcoe1xuXHRcdFx0XHQkc2VsZWN0OiBzZWxlY3RlZFByb3BlcnRpZXMsXG5cdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5Xb3JrZXJzXCJcblx0XHRcdH0pO1xuXHRcdFx0c291cmNlID0gb0RhdGFMaXN0QmluZGluZztcblx0XHR9XG5cblx0XHRpZiAobUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCkge1xuXHRcdFx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Y29uc3QgbGlzdEJpbmRpbmdGcm9tUGF0aCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmJpbmRMaXN0KHNvdXJjZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuXHRcdFx0XHRcdCRzZWxlY3Q6IHNlbGVjdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uV29ya2Vyc1wiXG5cdFx0XHRcdH0pIGFzIE9EYXRhTGlzdEJpbmRpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICghbGlzdEJpbmRpbmdGcm9tUGF0aCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nID0gbGlzdEJpbmRpbmdGcm9tUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRkZWxldGUgbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZDtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIiAmJiBzb3VyY2UuaXNBICYmIHNvdXJjZS5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nID0gc291cmNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBvYmplY3Qgb3IgcGF0aCBleHBlY3RlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKG9EYXRhTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHBhcmVudENvbnRleHQgPSB0aGlzLmdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uKG1JblBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPSB0aGlzLnJlc29sdmVDcmVhdGlvbk1vZGUobUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsIG9EYXRhTGlzdEJpbmRpbmcsIG1JblBhcmFtZXRlcnMuZGF0YSk7XG5cblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAoXG5cdFx0XHQobUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gbUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZVxuXHRcdFx0XHQ6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWFuaWZlc3QoKVtcInNhcC5mZVwiXT8uYXBwPy5zaW5nbGVEcmFmdEZvckNyZWF0ZSkgJiZcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPT09IG9EYXRhTGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKSAmJlxuXHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkgIT09IG51bGxcblx0XHQpIHtcblx0XHRcdGNvbnN0IG5ld0JpbmRpbmcgPSBvRGF0YUxpc3RCaW5kaW5nLmdldE1vZGVsKCk/LmJpbmRMaXN0KFxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRDb250ZXh0KCksXG5cdFx0XHRcdG5ldyBTb3J0ZXIoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9MYXN0Q2hhbmdlRGF0ZVRpbWVcIiwgdHJ1ZSksXG5cdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdGZpbHRlcnM6IFtcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIklzQWN0aXZlRW50aXR5XCIsXG5cdFx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdHZhbHVlMTogZmFsc2Vcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IFwiSGFzQWN0aXZlRW50aXR5XCIsXG5cdFx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdHZhbHVlMTogZmFsc2Vcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRhbmQ6IHRydWVcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBuZXdCaW5kaW5nPy5yZXF1ZXN0Q29udGV4dHMoMCwgMSk7XG5cdFx0XHRpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZU5ld0NvbnRleHQocmVzdWx0WzBdLCB7IGVkaXRhYmxlOiB0cnVlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlIH0pLnRoZW4oKCkgPT4gbmV3QmluZGluZz8uZGVzdHJveSgpKTtcblx0XHRcdH1cblx0XHRcdG5ld0JpbmRpbmc/LmRlc3Ryb3koKTtcblx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRzb3VyY2UgYXMgc3RyaW5nIHwgT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdFx0bUluUGFyYW1ldGVycyxcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyxcblx0XHRcdFx0cGFyZW50Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2hhbmRsZUNyZWF0aW9uTW9kZShcblx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0c291cmNlIGFzIHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRtSW5QYXJhbWV0ZXJzLFxuXHRcdFx0b0RhdGFMaXN0QmluZGluZyxcblx0XHRcdHBhcmVudENvbnRleHRcblx0XHQpO1xuXHR9XG5cblx0YXN5bmMgX2hhbmRsZUNyZWF0aW9uTW9kZShcblx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZTogc3RyaW5nLFxuXHRcdHZMaXN0QmluZGluZzogc3RyaW5nIHwgT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBJbnRlcm5hbENyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0b0RhdGFMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShbXSk7XG5cdFx0c3dpdGNoIChyZXNvbHZlZENyZWF0aW9uTW9kZSkge1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWw6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUV4dGVybmFsRG9jdW1lbnQodkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLm91dGJvdW5kKTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEZWZlcnJlZERvY3VtZW50KG9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQsIHBhcmFtZXRlcnMuZGF0YSk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnMuY3JlYXRpb25Sb3dcblx0XHRcdFx0XHQ/IHRoaXMuY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQoe1xuXHRcdFx0XHRcdFx0XHRjcmVhdGlvblJvdzogcGFyYW1ldGVycy5jcmVhdGlvblJvdyxcblx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmRcblx0XHRcdFx0XHQgIH0pXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZURpYWxvZ0lubGluZURvY3VtZW50KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGFcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c6XG5cdFx0XHRcdGlmIChvRGF0YUxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdC8vIENyZWF0aW9uIHdpdGggZGlhbG9nIGluIGFuIE9iamVjdFBhZ2Vcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2csXG5cdFx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSxcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDcmVhdGlvbiB3aXRoIGRpYWxvZyBpbiBhIExpc3RSZXBvcnRcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dBbmRTYXZlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSxcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5TeW5jOlxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQXN5bmM6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZVN5bmNBc3luY0RvY3VtZW50KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogcmVzb2x2ZWRDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdFx0XHRiRnJvbURlZmVycmVkOiBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQsXG5cdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y3JlYXRlQWN0aW9uOiBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRcdHBhcmVudENvbnRleHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSAke3Jlc29sdmVkQ3JlYXRpb25Nb2RlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKkV4ZWN1dGVzIHRoZSBtYW5kYXRvcnkgY29uZmlndXJhdGlvbiBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZC5cblx0ICogQHBhcmFtIHByZXJlcXVpc2l0ZSBQcm9taXNlIG9mIHRoZSBkb2N1bWVudCBjcmVhdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY29uZmlndXJhdGlvbiBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyBwb3N0RG9jdW1lbnRDcmVhdGlvbihwcmVyZXF1aXNpdGU6IFByb21pc2U8W0NvbnRleHQsIHVua25vd25dPiwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBwYXJhbXMgPSBhd2FpdCBwcmVyZXF1aXNpdGU7XG5cdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0ID0gcGFyYW1zWzBdO1xuXHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyQ3JlYXRlKHsgY29udGV4dDogbmV3RG9jdW1lbnRDb250ZXh0IH0pO1xuXHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpOyAvLyBUaGUgY3JlYXRlTW9kZSBmbGFnIHdpbGwgYmUgc2V0IGluIGNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZVxuXHRcdGlmICghbGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCB0byB0ZWxsIHRoZSBPUCB0aGF0IHdlJ3ZlIGNyZWF0ZWQgYSBuZXcgb2JqZWN0IGZyb20gdGhlIExSXG5cdFx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRcdGNvbnN0IG5ld0FjdGlvbiA9IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBuZXdBY3Rpb24pO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpIHx8XG5cdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nQW5hbHl0aWNhbChsaXN0QmluZGluZylcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBDcmVhdGluZyBhIG5ldyBpdGVtIGluIGEgaGllcmFyY2h5L2FuYWx5dGljYWwgdGFibGUgZnJvbSB0aGUgTGlzdFJlcG9ydCAoc2luY2UgdGhlIGxpc3RCaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSlcblx0XHRcdFx0Ly8gLS0+IHdlIHdhbnQgdG8gZm9yY2UgdGhlIHVzZXIgdG8gZWl0aGVyIHNhdmUgb3IgZGlzY2FyZCB0aGUgZHJhZnQgYmVmb3JlIGxlYXZpbmcgdGhlIE9QXG5cdFx0XHRcdHRoaXMuZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nKTtcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChuZXdEb2N1bWVudENvbnRleHQpICYmXG5cdFx0XHRcdCF0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGUgaW5pdGlhbCBzaGFyZSBhY3Rpb24gc2hhbGwgYmUgY2FsbGVkXG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuc2V0SW5pdGlhbFNoYXJlKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHZpYSB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFRoZSBjcmVhdGlvbiByb3dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQocGFyYW1ldGVyczoge1xuXHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRjcmVhdGlvblJvdzogQ3JlYXRpb25Sb3c7XG5cdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0fSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBjcmVhdGlvbjogUHJvbWlzZTxDb250ZXh0Pjtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdztcblx0XHRjb25zdCB0YWJsZSA9IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCkgYXMgVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0bGV0IG5hdmlnYXRpb24gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRpZiAoIXRhYmxlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiQ3JlYXRpb25Sb3dcIiB3aXRoIGEgVHJlZVRhYmxlYCk7XG5cdFx0fVxuXHRcdGNvbnN0IGNyZWF0aW9uUm93Q29udGV4dCA9IGNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRjb25zdCBkb2N1bWVudFZhbGlkYXRpb24gPSB0aGlzLmdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlKTtcblx0XHQvLyBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIGlzIHNldCB0byBmYWxzZSBpbiBtYW5pZmVzdCBjb252ZXJ0ZXIgKFRhYmxlLnRzKSBpZiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gZXhpc3RzXG5cdFx0aWYgKGNyZWF0aW9uUm93LmRhdGEoXCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhXCIpID09PSBcInRydWVcIikge1xuXHRcdFx0dGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlcyA9IGF3YWl0IHRoaXMuc3luY1Rhc2soZG9jdW1lbnRWYWxpZGF0aW9uKTtcblx0XHRpZiAodmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKHZhbGlkYXRpb25NZXNzYWdlcywgdGFibGUpO1xuXHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0Ly8gaWYgY3VzdG9tIHZhbGlkYXRpb24gZmFpbHMsIHdlIGxlYXZlIHRoZSBtZXRob2QgaW1tZWRpYXRlbHlcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY3JlYXRpb25Sb3dDb250ZXh0LmdldFBhdGgoKSkpLnRhcmdldEVudGl0eVR5cGU7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dQYXlsb2FkID0gY3JlYXRpb25Sb3dDb250ZXh0LmdldE9iamVjdCgpO1xuXG5cdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHQvL21vdmVkIGFmdGVyIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMgdG8gYXZvaWQgXCInY3JlYXRpb24nIHVzZSBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIiBjb25zb2xlIGVycm9yc1xuXHRcdC8vYWZ0ZXIgdmFsaWRhdGlvbiBlcnJvcnMgb2NjdXJyZWRcblx0XHRsaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0YXdhaXQgY3JlYXRpb247XG5cdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPyB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwKTtcblx0XHR9KTtcblxuXHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKGxpc3RCaW5kaW5nKTtcblx0XHR0cnkge1xuXHRcdFx0Y3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGF0YTogT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRcdHt9LFxuXHRcdFx0XHRcdFx0Li4uT2JqZWN0LmtleXMoY3JlYXRpb25Sb3dQYXlsb2FkKVxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdFx0XHRcdChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT5cblx0XHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gcHJvcGVydHlQYXRoKSA9PT0gLTFcblx0XHRcdFx0XHRcdFx0KSAvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0XHQubWFwKChwYXRoKSA9PiAoeyBbcGF0aF06IGNyZWF0aW9uUm93UGF5bG9hZFtwYXRoXSB9KSlcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IGFwcENvbXBvbmVudC5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlLCAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpO1xuXHRcdFx0Ly8gU2lkZUVmZmVjdHMgb24gQ3JlYXRlXG5cdFx0XHQvLyBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3csIG5vIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0XHRcdGlmICghcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdGNvbnN0IGNyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBuZXdUcmFuc2llbnRDb250ZXh0ID0gY3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdGNyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG5ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0bmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCk/LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0fSk7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIG5hdmlnYXRpb25dKSwgbGlzdEJpbmRpbmcpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdH1cblx0XHRcdExvZy5lcnJvcihcIkNyZWF0aW9uUm93IG5hdmlnYXRpb24gZXJyb3I6IFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGluIElubGluZSBtb2RlIG9yIHdpdGggYSBjcmVhdGlvbiBpbmxpbmUgZGlhbG9nIChPYmplY3QgcGFnZSBjYXNlKS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IFBhcmVudCBjb250ZXh0IChmb3IgVHJlZVRhYmxlKVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEludGlhbCBkYXRhIGZvciBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyBGaWVsZHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjcmVhdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUgfCBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHR0YWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZTtcblx0XHR9XG5cdFx0aWYgKHRhYmxlPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0dGFibGUuZ2V0Um93QmluZGluZygpLmF0dGFjaEV2ZW50T25jZShcImNyZWF0ZUNvbXBsZXRlZFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBhd2FpdCBjcmVhdGlvbjtcblx0XHRcdFx0Y29uc3QgY29udGV4dEluZGV4ID0gbmV3Q29udGV4dC5nZXRJbmRleCgpO1xuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRhdGEgPSBsaXN0QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzIHsgY3JlYXRlSW5QbGFjZT86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZDtcblx0XHRcdFx0Y29uc3QgaXNDcmVhdGVJblBsYWNlID0gYWdncmVnYXRpb25EYXRhPy5jcmVhdGVJblBsYWNlID8/IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChjb250ZXh0SW5kZXggIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aWYgKCF0YWJsZT8uZ2V0QnVzeSgpKSB7XG5cdFx0XHRcdFx0XHRcdHRhYmxlPy5mb2N1c1Jvdyhjb250ZXh0SW5kZXgsIHRydWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQ3JlYXRlSW5QbGFjZSkge1xuXHRcdFx0XHRcdC8vIEZvciBjcmVhdGUgaW4tcGxhY2UgbW9kZSAoc2VydmVyIHBvc2l0aW9uKSwgZGlzcGxheSBhIHdhcm5pbmcgbWVzc2FnZSBpbiBjYXNlIHRoZSBuZXdseSBjcmVhdGVkIG5vZGUgaXNuJ3QgdmlzaWJsZVxuXHRcdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHRoaXMuX2dldFJlc291cmNlTW9kZWwoKS5nZXRUZXh0KFwiQ19ORVdfRUxFTUVOVF9OT1RfRElTUExBWUVEXCIpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykgJiYgIWlzQ3JlYXRlSW5QbGFjZSkge1xuXHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSB0cmVlIHRhYmxlLCB3ZSBhbHNvIHNjcm9sbCB0byBrZWVwIHRoZSBwYXJlbnQgdmlzaWJsZVxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudENvbnRleHQgPSBuZXdDb250ZXh0LmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50Q29udGV4dD8uZ2V0SW5kZXgoKTtcblx0XHRcdFx0XHRpZiAocGFyZW50SW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0XHR0YWJsZT8uc2Nyb2xsVG9JbmRleChwYXJlbnRJbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFibGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHR7XG5cdFx0XHRcdC8vQ2hlY2sgaWYgQWxsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZFxuXHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCxcblx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkczogcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkc1xuXHRcdFx0fSxcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cblx0XHRpZiAoIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgdGhpcy5zeW5jVGFzayhjcmVhdGlvbildKSwgbGlzdEJpbmRpbmcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgdmlhIGEgZGlhbG9nIGFuZCBzYXZlcyBpdCBpbW1lZGlhdGVseSAoTGlzdFJlcG9ydCBjYXNlKS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBUaGUgbmV3IGRvY3VtZW50IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudGFibGVJZCBUaGUgaWQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgUGFyZW50IGNvbnRleHQgKGZvciBUcmVlVGFibGUpXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgSW50aWFsIGRhdGEgZm9yIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIEZpZWxkcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNyZWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURpYWxvZ0FuZFNhdmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHR0YWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0YWJsZT8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgIT09IHRydWUpIHtcblx0XHRcdFx0dGFibGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHNhdmVkRG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IGFmdGVyQ3JlYXRlSW5EaWFsb2cgPSBhc3luYyAobmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJDcmVhdGUoeyBjb250ZXh0OiBuZXdEb2N1bWVudENvbnRleHQgfSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHQvLyBFcnJvcnMgaW4gb25BZnRlckNyZWF0ZSBhcmUgbm90IGNhdXNpbmcgdGhlIG92ZXJhbGwgZmxvdyB0byBmYWlsXG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGFmdGVyIGNyZWF0aW9uOiBcIiArIGVycm9yKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHRcdHNhdmVkRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnNhdmVEb2N1bWVudChcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRbXSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlclNhdmUoe1xuXHRcdFx0XHRcdGNvbnRleHQ6IHNhdmVkRG9jdW1lbnRDb250ZXh0XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Ly8gRXJyb3JzIGluIG9uQWZ0ZXJTYXZlIGFyZSBub3QgY2F1c2luZyB0aGUgb3ZlcmFsbCBmbG93IHRvIGZhaWxcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgYWZ0ZXIgc2F2ZTogXCIgKyBlcnJvcik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgd2UgZG9uJ3QgdXNlIHRoZSBsaXN0QmluZGluZyBmcm9tIHRoZSBMaXN0UmVwb3J0IHRvIGNyZWF0ZSB0aGUgbmV3IGl0ZW0sXG5cdFx0XHRcdC8vIFNvIHdlIGNhbid0IGtub3cgdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgaXRlbSBpbiB0aGUgbGlzdEJpbmRpbmdcblx0XHRcdFx0Ly8gLS0+IFdlIHJlZnJlc2ggdGhlIHRhYmxlIGFuZCBzY3JvbGwgdG8gdGhlIHBhcmVudCBwb3NpdGlvblxuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHRhYmxlQVBJKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50SW5kZXggPSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQ/LmdldEluZGV4KCk7XG5cdFx0XHRcdFx0dGFibGVBUEkucmVmcmVzaCgpO1xuXHRcdFx0XHRcdGlmIChwYXJlbnRJbmRleCAhPT0gdW5kZWZpbmVkICYmIHBhcmVudEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRcdHRhYmxlPy5zY3JvbGxUb0luZGV4KHBhcmVudEluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBmbGF0IHRhYmxlLCB3ZSBjYW4gc2Nyb2xsIHRvIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW1cblx0XHRcdFx0Y29uc3QgaXRlbUluZGV4ID0gc2F2ZWREb2N1bWVudENvbnRleHQuZ2V0SW5kZXgoKTtcblx0XHRcdFx0aWYgKGl0ZW1JbmRleCAhPT0gdW5kZWZpbmVkICYmIGl0ZW1JbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgoaXRlbUluZGV4KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0e1xuXHRcdFx0XHQvL0NoZWNrIGlmIEFsbCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWRcblx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0YnVzeUlkOiAodGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQsXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRhZnRlckNyZWF0ZUNhbGxCYWNrOiBhZnRlckNyZWF0ZUluRGlhbG9nLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZyxcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblxuXHRcdGF3YWl0IFByb21pc2UuYWxsKFtjcmVhdGlvbiwgdGhpcy5zeW5jVGFzayhjcmVhdGlvbildKTtcblx0XHRpZiAoc2F2ZWREb2N1bWVudENvbnRleHQgJiYgcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgIT09IHRydWUpIHtcblx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLCBzYXZlZERvY3VtZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkZWZlcnJlZCBkb2N1bWVudC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IE9wdGlvbmFsIHBhcmVudCBjb250ZXh0IHdoZW4gY3JlYXRpbmcgYSBub2RlIGluIFRyZWVUYWJsZVxuXHQgKiBAcGFyYW0gZGF0YVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRGVmZXJyZWREb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0LCBkYXRhPzogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChsaXN0QmluZGluZywge1xuXHRcdFx0Y3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM6IHsgbW9kZTogXCJEZWZlcnJlZFwiLCBwYXJlbnRDb250ZXh0LCBsaXN0QmluZGluZywgZGF0YSB9LFxuXHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0fSk7XG5cdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN5bmMgb3IgYXN5bmMgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBzeW5jIG9yIGFzeW5jIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCBUaGlzIGRvY3VtZW50IGlzIGNyZWF0ZWQgYWZ0ZXIgYSBkZWZmZXJlZCBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gIFRoZSBjcmVhdGUgaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgY3JlYXRlIGFjdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhICBEYXRhIHRvIHNhdmUgb24gdGhlIG5ldyBkb2N1bWVudFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZVN5bmNBc3luY0RvY3VtZW50KFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0ZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHR9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBuYXZpZ2F0aW9uOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCByb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldEludGVybmFsUm91dGluZygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpXG5cdFx0XHQuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0XHQuLi57XG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkgJiYgbmV3RG9jdW1lbnRDb250ZXh0ICYmIG5ld0RvY3VtZW50Q29udGV4dC5nZXRCaW5kaW5nKCkgIT09IGxpc3RCaW5kaW5nKSB7XG5cdFx0XHRcdFx0Ly8gSW4gRkNMIGNhc2UsIGlmIHRoZSBuZXcgY29udGV4dCBoYXMgYmVlbiBjcmVhdGVkIHdpdGggYW4gYWN0aW9uIChub3Qgd2l0aCB0aGUgc3RhbmRhcmQgUE9TVCBjcmVhdGUpLCB3ZSBuZWVkIHRvIHJlZnJlc2hcblx0XHRcdFx0XHQvLyB0aGUgb3JpZ2luYWwgbGlzdEJpbmRpbmcgc28gdGhhdCBpdCBjb250YWlucyB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QgKHRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBsaXN0QmluZGluZyBmb3Igc3RhbmRhcmQgY3JlYXRlKVxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KTtcblxuXHRcdC8vIFRoZSBTaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkIG9ubHkgaWYgdGhlIGNyZWF0aW9uIGluIHRoZSBGTEMgY2FzZSAoZGlydHkgc3RhdGUgaXMgbm90IHNldCB0byB0cnVlIHNvIFNpZGVFZmZlY3RzIGFyZSByZWxldmFudClcblx0XHQvLyBvciBpZiB0aGUgY3JlYXRpb24gaXMgbm90IGRlZmVycmVkLlxuXHRcdGlmICgodGhpcy5faXNGY2xFbmFibGVkKCkgfHwgcGFyYW1ldGVycy5iRnJvbURlZmVycmVkICE9PSB0cnVlKSAmJiAhcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uLCBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgPyBsaXN0QmluZGluZy5nZXRDb250ZXh0KCkgOiB1bmRlZmluZWQpO1xuXHRcdH1cblxuXHRcdGlmIChwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkFzeW5jKSB7XG5cdFx0XHRuYXZpZ2F0aW9uID0gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChsaXN0QmluZGluZywge1xuXHRcdFx0XHRjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVyczogeyBtb2RlOiBcIkFzeW5jXCIsIGNyZWF0ZUNvbnRleHRQcm9taXNlOiBjcmVhdGlvbiB9LFxuXHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5hdmlnYXRpb24gPSBjcmVhdGlvbi50aGVuKGFzeW5jIChuZXdEb2N1bWVudENvbnRleHQpID0+IHtcblx0XHRcdFx0aWYgKCFuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRcdHJldHVybiByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVUb01lc3NhZ2VQYWdlKGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdFx0dGl0bGU6IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIFN5bmMgY3JlYXRpb24gd2FzIHRyaWdnZXJlZCBmb3IgYSBkZWZlcnJlZCBjcmVhdGlvbiwgd2UgZG9uJ3QgbmF2aWdhdGUgZm9yd2FyZFxuXHRcdFx0XHRcdC8vIGFzIHdlJ3JlIGFscmVhZHkgb24gdGhlIGNvcnJlc3BvbmRpbmcgT2JqZWN0UGFnZVxuXHRcdFx0XHRcdGNvbnN0IG5hdlBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZSxcblx0XHRcdFx0XHRcdHRyYW5zaWVudDpcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKSA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiA/IHRydWUgOiB1bmRlZmluZWRcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZFxuXHRcdFx0XHRcdFx0PyByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVUb0NvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LCBuYXZQYXJhbWV0ZXJzKVxuXHRcdFx0XHRcdFx0OiByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG5ld0RvY3VtZW50Q29udGV4dCwgbmF2UGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIG5hdmlnYXRpb25dKSwgbGlzdEJpbmRpbmcpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHQvLyBjcmVhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYnkgdXNlciBvciBmYWlsZWQgaW4gYmFja2VuZCA9PiBpbiBjYXNlIHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRyYW5zaWVudCBjb250ZXh0IGJlZm9yZSwgbmF2aWdhdGUgYmFja1xuXHRcdFx0Ly8gdGhlIHN3aXRjaC1zdGF0ZW1lbnQgYWJvdmUgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGhhcHBlbnMgaW4gY3JlYXRpb25Nb2RlcyBkZWZlcnJlZCBhbmQgYXN5bmMuIEJ1dCBpbiBmYWN0LCBpbiB0aGVzZSBjYXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBmcm9tIHJvdXRlTWF0Y2hlZCBpbiBPUCBjb21wb25lbnRcblx0XHRcdC8vIGNyZWF0ZURlZmVycmVkRG9jdW1lbnQgaXMgdHJpZ2dlcmVkLCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCAoY3JlYXRlRG9jdW1lbnQpIGFnYWluIC0gdGhpcyB0aW1lIHdpdGggY3JlYXRpb25Nb2RlIHN5bmMuIFRoZXJlZm9yZSwgYWxzbyBpbiB0aGF0IG1vZGUgd2UgbmVlZCB0byB0cmlnZ2VyIGJhY2sgbmF2aWdhdGlvbi5cblx0XHRcdC8vIFRoZSBvdGhlciBjYXNlcyBtaWdodCBzdGlsbCBiZSBuZWVkZWQgaW4gY2FzZSB0aGUgbmF2aWdhdGlvbiBmYWlscy5cblx0XHRcdGlmIChcblx0XHRcdFx0W1xuXHRcdFx0XHRcdENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2csXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCxcblx0XHRcdFx0XHRDb25zdGFudHMuQ3JlYXRpb25GYWlsZWQsXG5cdFx0XHRcdFx0Q29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkXG5cdFx0XHRcdF0uaW5jbHVkZXMoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcilcblx0XHRcdCkge1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGV4dGVybmFsIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIG91dGJvdW5kIFRoZSBvdXRib3VuZCBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRXh0ZXJuYWxEb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZywgb3V0Ym91bmQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBUT0RPOiBDYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChjdXJyZW50bHkgdXNpbmcgdGhlIHNhbWUgYXMgZm9yIG91dGJvdW5kIGNoZXZyb24gbmF2LCBhbmQgd2l0aG91dCBhbnkgY29udGV4dCAtIDNyZCBwYXJhbSlcblx0XHRpZiAob3V0Ym91bmQpIHtcblx0XHRcdGlmICh0eXBlb2YgbGlzdEJpbmRpbmcgIT09IFwic3RyaW5nXCIgJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSBcIkV4dGVybmFsXCIgd2l0aCBhIFRyZWVUYWJsZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyO1xuXHRcdFx0Y29uc3QgY3JlYXRlUGF0aCA9IE1vZGVsSGVscGVyLmdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyh0aGlzLmJhc2UuZ2V0VmlldygpLCBsaXN0QmluZGluZyk7XG5cdFx0XHRjb250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKGNvbnRyb2xsZXIsIG91dGJvdW5kLCB1bmRlZmluZWQsIGNyZWF0ZVBhdGgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB0byBleGVjdXRlIGFmdGVyIHRoZSBkb2N1bWVudCBjcmVhdGlvbi5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjcmVhdGlvblByb21pc2UgVGhlIHByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBPcHRpb25hbCBwYXJlbnQgY29udGV4dFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIFNpZGVFZmZlY3RzIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0aGFuZGxlU2lkZUVmZmVjdHMgPSBhc3luYyAoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0Y3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+LFxuXHRcdHBhcmVudENvbnRleHQ/OiBDb250ZXh0IHwgbnVsbFxuXHQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uUHJvbWlzZTtcblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0YXdhaXQgbmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHRwYXJlbnRDb250ZXh0ID8/ICh0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkKVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZXMgVGhlIGVycm9yIG1lc3NhZ2VzIGZvcm0gdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdGFyZ2V0ZWQgYnkgdGhlIG1lc3NhZ2VzXG5cdCAqL1xuXHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAodmFsaWRhdGlvbk1lc3NhZ2VzOiB7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdLCB0YWJsZTogVGFibGUpOiB2b2lkID0+IHtcblx0XHRjb25zdCBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRpdHkgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0Y29uc3QgY3VzdG9tTWVzc2FnZXM6IEN1c3RvbU1lc3NhZ2VbXSA9IFtdO1xuXHRcdGxldCBmaWVsZENvbnRyb2w7XG5cdFx0bGV0IGZpbmFsVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0Y29uc3Qgb2xkTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0Q29kZSgpID09PSBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pO1xuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhvbGRNZXNzYWdlcyk7XG5cblx0XHR2YWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgodmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcblx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdGZpZWxkQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0ZmluYWxUYXJnZXQgPSBgJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdC8vIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2UgaWYgc3RpbGwgbm90IGV4aXN0c1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IU1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSkubGVuZ3RoXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZTogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0dGVjaG5pY2FsOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogZmluYWxUYXJnZXRcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXJcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSk7XG5cdFx0XHRcdGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHR0ZXh0OiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGN1c3RvbU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGN1c3RvbU1lc3NhZ2VzXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlc29sdmVzIHRoZSBjcmVhdGlvbiBtb2RlXG5cdCAqIFByb3ZpZGVzIHRoZSBleHBlY3RlZCBjcmVhdGlvbiBtb2RlOlxuXHQgKiAtIHByZXNlcnZlcyB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGUgd2hlbiB0aGlzIG9uZSBpcyBub3QgYSBOZXdQYWdlXG5cdCAqIC0gY2FsY3VsYXRlcyB0aGUgbmV3IG9uZSBpZiB0aGUgY3JlYXRpb24gbW9kZSBpcyBhIE5ld1BhZ2UuXG5cdCAqIEBwYXJhbSBpbml0aWFsQ3JlYXRpb25Nb2RlIFRoZSBpbml0aWFsIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGNyZWF0ZURhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3Igb2JqZWN0IGNyZWF0aW9uXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgY3JlYXRpb24gbW9kZVxuXHQgKi9cblx0cmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChpbml0aWFsQ3JlYXRpb25Nb2RlOiBzdHJpbmcsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuXHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdFx0Ly8gTmV3QWN0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBOYXZpZ2F0aW9uUHJvcGVydHkgY29sbGVjdGlvblxuXHRcdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRuZXdBY3Rpb24gPSAoXG5cdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdD8gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ6IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHRcdCk/Lk5ld0FjdGlvbj8udG9TdHJpbmcoKTtcblxuXHRcdFx0XHRpZiAobmV3QWN0aW9uICYmIGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aC50YXJnZXRFbnRpdHlUeXBlLmFjdGlvbnNbbmV3QWN0aW9uXS5wYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdGFzeW5jIHZhbGlkYXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiB7IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbj86IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuXHQpOiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgcmVzdWx0IG9mXG5cdCAqIGEgY3JlYXRpb24gcm93J3MgY3VzdG9tIHZhbGlkYXRpb24gYXMgYSBwcm9taXNlLiBJZiBubyBjcmVhdGlvbiByb3cgaXMgaW52b2x2ZWRcblx0ICogdGhlIHJlc3VsdGluZyBmdW5jdGlvbiByZXR1cm5zIGEgcmVzb2x2ZWQgcHJvbWlzZS5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aXRoIHRoZSBjcmVhdGlvblJvd1xuXHQgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2Vcblx0ICovXG5cdGdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZCk6ICgpID0+IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gdGFibGU/LmdldENyZWF0aW9uUm93KCk7XG5cdFx0aWYgKGNyZWF0aW9uUm93ICYmIHRhYmxlKSB7XG5cdFx0XHRyZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4gPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGlvblJvd09iamVjdHMgPSAoY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KS5nZXRPYmplY3QoKTtcblx0XHRcdFx0ZGVsZXRlIGNyZWF0aW9uUm93T2JqZWN0c1tcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbGlkYXRlRG9jdW1lbnQodGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0ZGF0YTogY3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogdGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIGFzeW5jICgpID0+IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyB1c2VkIHRvIGNyZWF0ZSB0aGUgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBkYXRhRm9yQ3JlYXRlIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBuZXcgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBjcmVhdGVBdEVuZCBUcnVlIGlmIHRoZSBuZXcgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGFzIGluYWN0aXZlXG5cdCAqIEBwYXJhbSByZXF1ZXN0U2lkZUVmZmVjdHMgVHJ1ZSBieSBkZWZhdWx0LCBmYWxzZSBpZiBTaWRlRWZmZWN0cyBzaG91bGQgbm90IGJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0cy5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGRhdGFGb3JDcmVhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdFx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW4sXG5cdFx0aXNGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb24sXG5cdFx0Y3JlYXRlQXNJbmFjdGl2ZSA9IGZhbHNlLFxuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxDb250ZXh0W10+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdEJpbmRpbmcgPSBsaXN0QmluZGluZztcblx0XHRyZXF1ZXN0U2lkZUVmZmVjdHMgPSByZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YXJnZXRMaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0bGV0IG1ldGFQYXRoOiBzdHJpbmc7XG5cblx0XHRcdGlmICh0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHt0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyh0YXJnZXRMaXN0QmluZGluZyk7XG5cblx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRjb25zdCBjcmVhdGlvblByb21pc2VzID0gZGF0YUZvckNyZWF0ZS5tYXAoYXN5bmMgKHByb3BlcnR5VmFsdWVzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgPSB7IGRhdGE6IHt9LCBwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBkZWVwIGNyZWF0ZVxuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UGF0aCBpbiBwcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHttZXRhUGF0aH0vJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0cHJvcGVydHkgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdFx0XHQhcHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5kYXRhIVtwcm9wZXJ0eVBhdGhdID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdHRhcmdldExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGlzRnJvbUNvcHlQYXN0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKHRhcmdldExpc3RCaW5kaW5nKTtcblx0XHRcdH1cblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dHMgPSBjcmVhdGVkQ29udGV4dHMuZmlsdGVyKChuZXdDb250ZXh0KSA9PiAhbmV3Q29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoYWN0aXZlQ29udGV4dHMubWFwKGFzeW5jIChuZXdDb250ZXh0KSA9PiBuZXdDb250ZXh0LmNyZWF0ZWQoKSkpO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKHJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZywgdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSAmJiBhY3RpdmVDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2ZUNvbnRleHRzKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dFBhdGg/OiBzdHJpbmc7IGNyZWF0ZVBhcmFtZXRlcnM/OiB1bmtub3duW10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlU2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRhc3luYyBvbkJlZm9yZVNhdmUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURpc2NhcmQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSBhY3Rpb24gZXhlY3V0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRXhlY3V0ZUFjdGlvblxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHRoZSBhY3Rpb24gZXhlY3V0aW9uXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFeGVjdXRlQWN0aW9uKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfCBDb250ZXh0IHwgbnVsbCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlclNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IHdlIG9idGFpbmVkIGFmdGVyIHNhdmluZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkFmdGVyRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIGNvbnRleHQgb2J0YWluZWQgYWZ0ZXIgZGlzY2FyZGluZyB0aGUgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgd2UgZGlzY2FyZGVkIGEgbmV3IG9iamVjdFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckRlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRGVsZXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBJbmRpY2F0ZXMgd2hldGhlciBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGlnbm9yZWQgd2hlbiB1c2VyIGNsaWNrcyBvbiBTYXZlIGR1cmluZyBhbiBJbmxpbmUgY3JlYXRpb25cblx0Ly8gQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIExpc3QgYmluZGluZ3Mgb2YgdGhlIHRhYmxlcyBpbiB0aGUgdmlldy5cblx0Ly8gQm90aCBvZiB0aGUgYWJvdmUgcGFyYW1ldGVycyBhcmUgZm9yIHRoZSBzYW1lIHB1cnBvc2UuIFVzZXIgY2FuIGVudGVyIHNvbWUgaW5mb3JtYXRpb24gaW4gdGhlIGNyZWF0aW9uIHJvdyhzKSBidXQgZG9lcyBub3QgJ0FkZCByb3cnLCBpbnN0ZWFkIGNsaWNrcyBTYXZlLlxuXHQvLyBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBpbiB0aGUgdmlldy5cblxuXHQvKipcblx0ICogU2F2ZXMgYSBuZXcgZG9jdW1lbnQgYWZ0ZXIgY2hlY2tpbmcgaXQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2F2ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogU2F2ZURvY3VtZW50UGFyYW1ldGVycyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHNhdmVEb2N1bWVudCBpcyBjYWxsZWQgZnJvbSBpbmxpbmUgZWRpdCBrZXlib2FyZCBzaG9ydGN1dFxuXHRcdGlmIChcblx0XHRcdCF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpICYmXG5cdFx0XHR0aGlzLmJhc2UuaW5saW5lRWRpdEZsb3c/LmlzSW5saW5lRWRpdFBvc3NpYmxlKCkgJiZcblx0XHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2lzSW5saW5lRWRpdEFjdGl2ZVwiKVxuXHRcdCkge1xuXHRcdFx0dGhpcy5iYXNlLmlubGluZUVkaXRGbG93LmlubGluZUVkaXRTYXZlKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncyBhcyBPRGF0YUxpc3RCaW5kaW5nW107XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHRcdC8vIGlzIHNlbnQgdG8gdGhlIGJhY2tlbmRcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQgIT09IHRydWUpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0XHQvL3dlIG5lZWQgdG8gcmVxdWVzdCBmb3IgcmVjb21tZW5kYXRpb25zIGFuZCB0aGVuIGJyaW5nIHRoZSBkaWFsb2cgaGVyZVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9IGF3YWl0IHRoaXMuY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZVNhdmUoeyBjb250ZXh0OiByb290Q29udGV4dCB9KTtcblxuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0KChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdFx0cm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB8fFxuXHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdFxuXHRcdFx0KSB7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdCA/IG9Db250ZXh0IDogKHJvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFeGVjdXRlIHRoZSByZWdpc3RlcmVkIGRlZmVycmVkIFNpZGVFZmZlY3RzIHdoaWNoIGhhdmUgbm90IGJlIGV4ZWN1dGVkIHlldCBmb3IgdGhlIHBhZ2UgY29udGV4dFxuXHRcdFx0Ly8gQ2FuIG9jY3VyIHdoZW4gc2hvcnRjdXQgaXMgdXNlZCB0byBzYXZlIHRoZSBkb2N1bWVudC5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5fc2lkZUVmZmVjdHMuaGFuZGxlUGFnZUNoYW5nZUNvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0XHQvLyBUaGUgJGF1dG8gcXVldWUgY2FuIG9ubHkgaGF2ZSBwZW5kaW5nIGNoYW5nZXMgYXQgdGhpcyBwb2ludCB3aGVuIFNBVkUgd2FzIGNsaWNrZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY2hhbmdpbmcgYSBmaWVsZC5cblx0XHRcdC8vIEluIHRoaXMgY2FzZSB0aGUgJGF1dG8gcXVldWUgaXMgbG9ja2VkIHRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIHN1Ym1pdCBiYXRjaCBzaG91bGQgbm90IGNyZWF0ZSBhIHNlcGFyYXRlIGJhdGNoIHJlcXVlc3QuXG5cdFx0XHQvLyBJdCBpcyBkb25lIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHBhdGNoLCBkcmFmdHByZXBhcmUsIGRyYWZ0YWN0aXZhdGUgZWFjaCBoYXZlIHRoZWlyIG93biBjaGFuZ2VzZXRcblx0XHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikgJiYgbVBhcmFtZXRlcnMubWVyZ2VQYXRjaERyYWZ0KSB7XG5cdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBhcyBib29sZWFuLFxuXHRcdFx0XHRhQmluZGluZ3MsXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKSxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRtUGFyYW1ldGVycz8uaXNTdGFuZGFyZFNhdmVcblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGl2YXRlLCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KFN0YW5kYXJkQWN0aW9ucy5zYXZlLCBUcmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlclNhdmUoe1xuXHRcdFx0XHRjb250ZXh0OiBhY3RpdmVEb2N1bWVudENvbnRleHRcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyB1cGRhdGUgdGVsZW1ldHJ5IGRhdGEgZm9yIGhvdyBwYWdlIHdhcyBzYXZlZCBhbmQgdGhlbiBkbyBzdG9yaW5nIG9mIHRoaXMgZGF0YSB0byBiYWNrZW5kIHRocm91Z2ggdGhlIHN0b3JlRGF0YSBmdW5jdGlvblxuXHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5zdG9yZURhdGFGb3JUZWxlbWV0cnkocmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdoZW4gc2F2aW5nLCB0aGUgc2VtYW50aWMga2V5cyBtYXkgaGF2ZSBjaGFuZ2VkLlxuXHRcdFx0XHRcdC8vIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBuZWVkIHRvIG1hbmFnZSB0aGUgc2VtYW50aWMgVVJMIGNoYW5nZSBpbiB0aGUgaGlzdG9yeVxuXHRcdFx0XHRcdGNvbnN0IHByZXZpb3VzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHRjb25zdCBuZXdTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoYWN0aXZlRG9jdW1lbnRDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHRpZiAocHJldmlvdXNTZW1hbnRpY1BhdGggJiYgbmV3U2VtYW50aWNQYXRoICYmIHByZXZpb3VzU2VtYW50aWNQYXRoICE9PSBuZXdTZW1hbnRpY1BhdGgpIHtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBwcmV2aW91c1NlbWFudGljUGF0aCwgbmV3UGF0aDogbmV3U2VtYW50aWNQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0aWYgKHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSB8fCB0aGlzLl9oaWRkZW5EcmFmdD8uc3RheU9uQ3VycmVudFBhZ2VBZnRlclNhdmUpIHtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IGFjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcgIT09IHRydWUpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRpZiAoIShvRXJyb3IgJiYgKG9FcnJvciBhcyB7IGNhbmNlbGVkPzogYm9vbGVhbiB9KS5jYW5jZWxlZCkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHRcdHRocm93IG9FcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgdGhlIFVJIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIHN3aXRjaCBmcm9tXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgc3dpdGNoIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IGVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdC8vdG9nZ2xlIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZWRpdCBkcmFmdHMgYW5kIGFjdGl2ZSBkb2N1bWVudHMgd2l0aCBkcmFmdClcblx0XHRpZiAoXG5cdFx0XHQhYklzRHJhZnQgfHxcblx0XHRcdCEoXG5cdFx0XHRcdCghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHx8XG5cdFx0XHRcdChvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5KVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdC8vc3RhcnQgUG9pbnQ6IGVkaXQgZHJhZnRcblx0XHRcdGVkaXRhYmxlID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHN0YXJ0IHBvaW50IGFjdGl2ZSBkb2N1bWVudFxuXHRcdFx0ZWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRjb25zdCBvUmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmICghc2libGluZ0luZm8gJiYgb0NvbnRleHQgIT09IG9SaWdodG1vc3RDb250ZXh0KSB7XG5cdFx0XHRcdC8vIFRyeSB0byBjb21wdXRlIHNpYmxpbmcgaW5mbyBmb3IgdGhlIHJvb3QgY29udGV4dCBpZiBpdCBmYWlscyBmb3IgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHRcdC8vIC0tPiBJbiBjYXNlIG9mIEZDTCwgaWYgd2UgdHJ5IHRvIHN3aXRjaCBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgYnV0IGEgY2hpbGQgZW50aXR5IGhhcyBubyBzaWJsaW5nLCB0aGUgc3dpdGNoIHdpbGwgY2xvc2UgdGhlIGNoaWxkIGNvbHVtblxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9Db250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2libGluZ0luZm8pIHtcblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0aWYgKGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG9Db250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nW3NpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogbGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQsIHsgZWRpdGFibGUsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlIC0gQ2Fubm90IGZpbmQgc2libGluZ1wiKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6JHtvRXJyb3J9YCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c2FwLm0uQnV0dG9ufSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gLSBDdXJyZW50bHkgdGhpcyBpcyBwYXNzZWQgYXMgY2FuY2VsQnV0dG9uIGludGVybmFsbHkgKHJlcGxhY2VkIGJ5IG1QYXJhbWV0ZXJzLmNvbnRyb2wgaW4gdGhlIEpTRG9jIGJlbG93KS4gQ3VycmVudGx5IGl0IGlzIGFsc28gbWFuZGF0b3J5LlxuXHQvLyBQbGFuIC0gVGhpcyBzaG91bGQgbm90IGJlIG1hbmRhdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYWN0IGFzIHJlZmVyZW5jZSBjb250cm9sIGZvciB0aGUgZGlzY2FyZCBwb3BvdmVyIE9SIHdlIGNhbiBzaG93IGEgZGlhbG9nIGluc3RlYWQgb2YgYSBwb3BvdmVyLlxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBlZGl0YWJsZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbCBUaGlzIGlzIHRoZSBjb250cm9sIHVzZWQgdG8gb3BlbiB0aGUgZGlzY2FyZCBwb3BvdmVyXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBhbmQgYWxsb3dzIGN1c3RvbSBoYW5kbGluZ1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZWRpdGFibGUgZG9jdW1lbnQgaGFzIGJlZW4gZGlzY2FyZGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjb250cm9sPzogQnV0dG9uO1xuXHRcdFx0Y2FuY2VsQnV0dG9uPzogQnV0dG9uO1xuXHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbjtcblx0XHRcdHNraXBCYWNrTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBpc05ld0RvY3VtZW50ID0gZmFsc2U7XG5cdFx0bVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyID0gdGhpcy5faGlkZGVuRHJhZnQ/LmVuYWJsZWQgPyB0cnVlIDogbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyO1xuXHRcdGNvbnN0IGNhbmNlbFBhcmFtZXRlcnM6IENhbmNlbFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciA9PT0gdHJ1ZSxcblx0XHRcdGNhbmNlbEJ1dHRvbjogKG1QYXJhbWV0ZXJzLmNvbnRyb2wgfHwgbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uKSEsXG5cdFx0XHRiZWZvcmVDYW5jZWxDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGlzY2FyZFxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHQ6IENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0KChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmIHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB8fFxuXHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdFxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID8gb0NvbnRleHQgOiAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5jZWxSZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdGNhbmNlbFBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdCA/IHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCkgJiYgIXJvb3RDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpIDogdGhpcy5nZXRDcmVhdGlvbk1vZGUoKSxcblx0XHRcdFx0dGhpcy5pc0RvY3VtZW50TW9kaWZpZWQoKSB8fCBzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgLy8gSW4gc3RpY2t5IG1vZGUgd2UgYWx3YXlzIGFzayBmb3IgY29uZmlybWF0aW9uXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKClcblx0XHRcdFx0LmdldEluc3RhbmNlZFZpZXdzKClcblx0XHRcdFx0LmZvckVhY2goKHZpZXcpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRpZiAoY29udGV4dD8uaXNLZWVwQWxpdmUoKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGlzY2FyZCh7XG5cdFx0XHRcdGNvbnRleHQ6IGNhbmNlbFJlc3VsdFxuXHRcdFx0fSk7XG5cdFx0XHQvLyB3ZSBmb3JjZSB0aGUgZWRpdCBzdGF0ZSBldmVuIGZvciBGQ0wgYmVjYXVzZSB0aGUgZHJhZnQgZGlzY2FyZCBtaWdodCBub3QgYmUgaW1wbGVtZW50ZWRcblx0XHRcdC8vIGFuZCB3ZSBtYXkganVzdCBkZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdGlmICghY2FuY2VsUmVzdWx0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQ29udGV4dCk7XG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHQvL2luIGNhc2Ugb2YgYSBuZXcgZG9jdW1lbnQsIG5vIGFjdGl2ZUNvbnRleHQgaXMgcmV0dXJuZWQgLS0+IG5hdmlnYXRlIGJhY2suXG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChyb290Q29udGV4dCk7XG5cdFx0XHRcdFx0aXNOZXdEb2N1bWVudCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBjYW5jZWxSZXN1bHQ7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQodGhpcy5faXNGY2xFbmFibGVkKCkgfHwgdGhpcy5faGlkZGVuRHJhZnQ/LnN0YXlPbkN1cnJlbnRQYWdlQWZ0ZXJDYW5jZWwpICYmXG5cdFx0XHRcdFx0c2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IG9BY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gbG9hZCB0aGUgc2VtYW50aWMga2V5cyBvZiB0aGUgYWN0aXZlIGNvbnRleHQsIGFzIHdlIG5lZWQgdGhlbVxuXHRcdFx0XHRcdC8vIGZvciB0aGUgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0Ly8gV2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gb2YgdGhlIGNvbnRleHQsIHNvIHRoYXQgaXQncyBjcmVhdGVkIGFuZCBib3VuZCBpbiB0aGUgc2FtZSBtaWNyb3Rhc2ssXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBhbGwgcHJvcGVydGllcyBhcmUgbG9hZGVkIHRvZ2V0aGVyIGJ5IGF1dG9FeHBhbmRTZWxlY3QsIHNvIHRoYXQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBFZGl0IG1vZGVcblx0XHRcdFx0XHQvLyAkJGluaGVyaXRFeHBhbmRTZWxlY3QgdGFrZXMgYWxsIGxvYWRlZCBwcm9wZXJ0aWVzIGludG8gYWNjb3VudCAoQkNQIDIwNzA0NjIyNjUpXG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldykge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEFjdGl2ZSBjb250ZXh0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgY2FuY2VsIG9mIGV4aXN0aW5nIGRvY3VtZW50LCBhbmQgaXQncyB0aGUgc2FtZSBhcyB0aGUgZWRpdGVkIGNvbnRleHRcblx0XHRcdFx0XHQvLyBTbywgd2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gYXMgaXQgbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgd2hlbiBjYWxsaW5nIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gYWxsIHZpZXcncyBjb250ZXh0c1xuXHRcdFx0XHRcdC8vIGVhcmxpZXIgaW4gdGhpcyBtZXRob2Rcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgIXRoaXMuX2hpZGRlbkRyYWZ0KSB7XG5cdFx0XHRcdC8vc2hvdyBEcmFmdCBkaXNjYXJkZWQgbWVzc2FnZSB0b2FzdCBvbmx5IGZvciBkcmFmdCBlbmFibGVkIGFwcHNcblx0XHRcdFx0dGhpcy5zaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGdldFJvb3RDb250ZXh0KGNvbnRleHQ6IENvbnRleHQsIGJpbmRpbmdQYXJhbWV0ZXJzPzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm9bXCJwYXJhbWV0ZXJzXCJdKTogUHJvbWlzZTxDb250ZXh0PiB7XG5cdFx0Y29uc3Qgdmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzO1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0aWYgKCh2aWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxKSB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCB8fCBwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRyZXR1cm4gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KFxuXHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyc1xuXHRcdFx0XHQpKSBhcyBDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY29udGV4dDtcblx0fVxuXG5cdGFzeW5jIGlzUm9vdENvbnRleHROZXcoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IHJvb3RDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRSb290Q29udGV4dChjb250ZXh0LCB7ICRzZWxlY3Q6IFwiSGFzQWN0aXZlRW50aXR5LElzQWN0aXZlRW50aXR5XCIgfSk7XG5cdFx0Ly8gV2hlbiB3ZSByZWZyZXNoIHRoZSByb290IGNvbnRleHQsIGl0IG1heSBub3QgaGF2ZSB0aGUgcHJvcGVydGllcyBIYXNBY3RpdmVFbnRpdHkgYW5kIElzQWN0aXZlRW50aXR5IHlldCwgc28gd2UgcmVxdWVzdCB0aGVtXG5cdFx0Y29uc3QgZHJhZnRQcm9wZXJ0aWVzID0gYXdhaXQgcm9vdENvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdKTtcblx0XHRyZXR1cm4gIWRyYWZ0UHJvcGVydGllc1swXSAmJiAhZHJhZnRQcm9wZXJ0aWVzWzFdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJyaW5ncyB1cCBhIG1lc3NhZ2UgdG9hc3Qgd2hlbiBhIGRyYWZ0IGlzIGRpc2NhcmRlZC5cblx0ICogQHBhcmFtIGlzTmV3RG9jdW1lbnQgVGhpcyBpcyBhIEJvb2xlYW4gZmxhZyB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgbmV3IG9yIGFscmVhZHkgZXhpc3RzLlxuXHQgKi9cblx0c2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UoaXNOZXdEb2N1bWVudD86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGlmIChpc05ld0RvY3VtZW50ID09IHRydWUpIHtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gaW4gc2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2Ugd2hlbiBubyBjb250ZXh0IGlzIHBhc3NlZC5cblx0ICovXG5cdHNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCgpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSwgeyBjbG9zZU9uQnJvd3Nlck5hdmlnYXRpb246IGZhbHNlIH0pO1xuXHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBjb250ZXh0IGNvcnJlc3BvbmRzIHRvIGEgZHJhZnQgcm9vdC5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29udGV4dCBwb2ludHMgdG8gYSBkcmFmdCByb290XG5cdCAqL1xuXHRwcml2YXRlIGlzRHJhZnRSb290KGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVNldCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM/OiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM6IGJvb2xlYW47XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0XHR0aXRsZT86IHN0cmluZztcblx0XHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdFx0XHR9ID0geyAuLi5tSW5QYXJhbWV0ZXJzLCBiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZSwgYmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZSB9LFxuXHRcdFx0bWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3Qob0NvbnRleHQpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWVcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBEZWxldGluZyBhbiBhY3RpdmUgZW50aXR5IHdoaWNoIGhhcyBhIGRyYWZ0IHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBMaXN0UmVwb3J0IChGQ0wgY2FzZSlcblx0XHRcdFx0Ly8gLS0+IG5lZWQgdG8gcmVtb3ZlIHRoZSBkcmFmdCBmcm9tIHRoZSBMUiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBhY3RpdmUgdmVyc2lvbiwgc28gdGhhdCB0aGUgTGlzdEJpbmRpbmcgaXMgcHJvcGVybHkgcmVmcmVzaGVkXG5cdFx0XHRcdC8vIFRoZSBjb25kaXRpb24gJ29Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCcgbWFrZXMgc3VyZSB0aGUgYWN0aXZlIHZlcnNpb24gaXNuJ3QgYWxyZWFkeSBkaXNwbGF5ZWQgaW4gdGhlIExSXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gYXN5bmMgKHBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUocGFyYW1ldGVycyk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0UGF0aCA9IGF3YWl0IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdENvbnRleHRUb1JlbW92ZSA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRQYXRoKTtcblx0XHRcdFx0XHRcdGRyYWZ0Q29udGV4dFRvUmVtb3ZlLnJlcGxhY2VXaXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVwbGFjaW5nIHRoZSBkcmFmdCBpbnN0YW5jZSBpbiB0aGUgTFIgT0RMQlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHQvLyAtLT4gTWFyayBVSSBkaXJ0eSBhbmQgbmF2aWdhdGUgYmFjayB0byBkaXNtaXNzIHRoZSBPUFxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0XHRpZiAoY29udGV4dEJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRpZiAoY29udGV4dEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0XHRcdC8vIEV2ZW4gaW4gdGhlIEZDTCBjYXNlLCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGxpc3RiaW5kaW5nIGluIHRoZSBMUiAobm90IE9QKSB0byB1cGRhdGUgdGhlIGNvdW50cyBpbiB0aGUgdGFicyBhbmQgcXVpY2tmaWx0ZXJzXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKGNvbnRleHRCaW5kaW5nLCBvQXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUoY29udGV4dEJpbmRpbmcsIGNvbnRleHRCaW5kaW5nLmdldENvbnRleHQoKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIG9Db250ZXh0KTtcblxuXHRcdFx0Ly8gQWZ0ZXIgZGVsZXRlIGlzIHN1Y2Nlc3NmdWxsLCB3ZSBuZWVkIHRvIGRldGFjaCB0aGUgc2V0QmFja05hdmlnYXRpb24gTWV0aG9kc1xuXHRcdFx0YXdhaXQgb0FwcENvbXBvbmVudD8uZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHRjb25zdCBpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCA9IHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQoKTtcblx0XHRcdC8vIFdlIGNsZWFyIHJlY29tbWVuZGF0aW9uIGRhdGEgYW5kIGNvbnRleHRzIGZyb20gaW50ZXJuYWwgbW9kZWwgZm9yIHRoZSBkZWxldGVkIGNvbnRleHRzXG5cdFx0XHRpZiAoaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzKFtvQ29udGV4dF0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90aWZ5IGNvbnN1bWVycyBvZiB3aGljaCBjb250ZXh0cyB3ZXJlIGRlbGV0ZWRcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGVsZXRlKHsgY29udGV4dHM6IFtvQ29udGV4dF0gfSk7XG5cblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQ/LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkRlZXBsaW5rKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwIGhhcyBiZWVuIGxhdW5jaGVkIHdpdGggc2VtYW50aWMga2V5cywgZGVsZXRpbmcgdGhlIG9iamVjdCB3ZSd2ZSBsYW5kZWQgb24gc2hhbGwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHRcdC8vIHRvIHRoZSBhcHAgd2UgY2FtZSBmcm9tIChleGNlcHQgZm9yIEZDTCwgd2hlcmUgd2UgbmF2aWdhdGUgdG8gTFIgYXMgdXN1YWwpXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmV4aXRGcm9tQXBwKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRWxzZSBuYXZpZ2F0ZSBiYWNrIGZyb20gdGhlIHBhZ2UuIEluIEZDTCwgdGhpcyBpcyBkb25lIHdoZW4gdGhlIGtlcHQtYWxpdmUgY29udGV4dCBpcyBkZXN0cm95ZWQgKGNhbGxiYWNrKVxuXHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdCB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcyBhbmQgbmF2aWdhdGUgYmFjay5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc0NvbnRpbnVlID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyhmYWxzZSk7XG5cdFx0XHRpZiAoaXNDb250aW51ZSA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgeyBjYWxsRXh0ZW5zaW9uOiB0cnVlIH0pO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uXSBCb29sZWFuIHZhbHVlIGZvciBzdGF0aWMgYWN0aW9uLCB1bmRlZmluZWQgZm9yIG90aGVyIGFjdGlvbnNcblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGVdIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHQvLyBDdXJyZW50bHkgdGhlIHBhcmFtZXRlciBpc05hdmlnYWJsZSBpcyB1c2VkIGludGVybmFsbHkgYW5kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVzTmF2aWdhdGlvbiBhcyBpdCBpcyBhIG1vcmUgYXB0IG5hbWUgZm9yIHRoaXMgcGFyYW1cblxuXHQvKipcblx0ICogSW52b2tlcyBhbiBhY3Rpb24gKGJvdW5kIG9yIHVuYm91bmQpIGFuZCB0cmFja3MgdGhlIGNoYW5nZXMgc28gdGhhdCBvdGhlciBwYWdlcyBjYW4gYmUgcmVmcmVzaGVkIGFuZCBzaG93IHRoZSB1cGRhdGVkIGRhdGEgdXBvbiBuYXZpZ2F0aW9uLlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgQW4gb3B0aW9uYWwgYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGVyZSBlYWNoIG9iamVjdCBoYXMgYSBuYW1lIG9mIHN0cmluZyB0eXBlIGFuZCBhIHZhbHVlIHRoYXQgY2FuIGJlIG9mIGFueSBkYXRhIHR5cGUuXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtIGluIHBhcmFtZXRlclZhbHVlc1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250ZXh0cyBGb3IgYSBib3VuZCBhY3Rpb24sIGEgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm1vZGVsIEZvciBhbiB1bmJvdW5kIGFjdGlvbiwgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWwgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBOYXZpZ2F0aW9uIHRha2VzIHBsYWNlIHRvIHRoZSBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubGFiZWwgQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvbi4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgYWN0aW9uIGhhcyBhIHBhcmFtZXRlciBhbmQgYSBwYXJhbWV0ZXIgZGlhbG9nIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGUgbGFiZWwgd2lsbCBiZSB1c2VkIGZvciB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBhbmQgZm9yIHRoZSBjb25maXJtYXRpb24gYnV0dG9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udHJvbElkIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUV4dHJhUGFyYW1zIFBSSVZBVEVcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIG9uY2UgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gSWYgcmVzb2x2ZWQsIHRoZSBwcm9taXNlIHJldHVybnM6XG5cdCAqICAtIElmIHRoZSBwYXJhbWV0ZXIgY29udGV4dHMgaXMgYW4gYXJyYXk6IGFuIGFycmF5IG9mIG9iamVjdHMsIGVhY2ggb2JqZWN0IGNvbnRhaW5pbmcgYSBrZXkgXCJzdGF0dXNcIiwgYXMgd2VsbCBhcyBcInZhbHVlXCIgcmVmZXJlbmNpbmcgdGhlIGFjdGlvbiBzdGF0dXMgYW5kIHRoZSBjb250ZXh0XG5cdCAqICAtIElmIHRoZSBwYXJhbWV0ZXIgY29udGV4dHMgaXMgbm90IGFuIGFycmF5OiBhIHNpbmdsZSBjb250ZXh0XG5cdCAqIFRoZSBjb250ZXh0KHMpIHByb3ZpZGVkIGluIHRoZSBwcm9taXNlIGlzIChhcmUpIGVpdGhlciB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQgb2YgdGhlIGFjdGlvbiBvciB0aGUgYm91bmQgY29udGV4dCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGludm9rZUFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRjb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W107XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRub3RBcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IHt9XG5cdCk6IFByb21pc2U8XG5cdFx0fCB7XG5cdFx0XHRcdHZhbHVlOiBDb250ZXh0O1xuXHRcdFx0XHRzdGF0dXM6IFwiZnVsZmlsbGVkXCI7XG5cdFx0ICB9W11cblx0XHR8IENvbnRleHRcblx0PiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6XG5cdFx0XHR8IHtcblx0XHRcdFx0XHRmUmVzb2x2ZXI6IEZ1bmN0aW9uO1xuXHRcdFx0XHRcdGZSZWplY3RvcjogRnVuY3Rpb247XG5cdFx0XHQgIH1cblx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblxuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQoKG1JblBhcmFtZXRlcnMgYXMgQ29udGV4dCk/LmlzQSAmJiAobUluUGFyYW1ldGVycyBhcyBDb250ZXh0KT8uaXNBPENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHx8XG5cdFx0XHRBcnJheS5pc0FycmF5KG1JblBhcmFtZXRlcnMpIHx8XG5cdFx0XHRtRXh0cmFQYXJhbXMgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgY29udGV4dHM6IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZCA9IG1JblBhcmFtZXRlcnMgYXMgT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkO1xuXHRcdFx0bUluUGFyYW1ldGVycyA9IG1FeHRyYVBhcmFtcyB8fCB7fTtcblx0XHRcdGlmIChjb250ZXh0cykge1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IG51bGw7XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHR2aWV3OiBGRVZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0aXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRpc0JvdW5kPzogYm9vbGVhbjtcblx0XHRcdGlnbm9yZUVUYWc/OiBib29sZWFuO1xuXHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIHZpZXc6IHRoaXMuYmFzZS5nZXRWaWV3KCkgfSB8fCB7IHZpZXc6IHRoaXMuYmFzZS5nZXRWaWV3KCkgfTtcblxuXHRcdG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlID0gbVBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIHx8IG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHRoZSByZWZlcmVuY2VkIGFjdGlvbiBpcyBib3VuZCBvciB1bmJvdW5kXG5cdFx0Y29uc3QgY29udmVydGVkTWV0YWRhdGEgPSBjb252ZXJ0VHlwZXModGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdC8vIFRoZSBFbnRpdHlDb250YWluZXIgbWF5IE5PVCBiZSBtaXNzaW5nLCBzbyBpdCBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgdW5kZWZpbmVkLCBidXQgc2luY2UgaW4gb3VyIGNvbnZlcnRlZCBNZXRhZGF0YVxuXHRcdC8vIGl0IGNhbiBiZSB1bmRlZmluZWQsIEkgbmVlZCB0aGlzIHdvcmthcm91bmQgaGVyZSBvZiBhZGRpbmcgXCJcIiBzaW5jZSBpbmRleE9mIGRvZXMgbm90IGFjY2VwdCBzb21ldGhpbmcgdGhhdCdzXG5cdFx0Ly8gdW5kZWZpbmVkLlxuXHRcdGlmIChzQWN0aW9uTmFtZS5pbmNsdWRlcyhcIlwiICsgY29udmVydGVkTWV0YWRhdGEuZW50aXR5Q29udGFpbmVyLm5hbWUpKSB7XG5cdFx0XHQvLyBVbmJvdW5kIGFjdGlvbnMgYXJlIGFsd2F5cyByZWZlcmVuY2VkIHZpYSB0aGUgYWN0aW9uIGltcG9ydCBhbmQgd2UgZm91bmQgdGhlIEVudGl0eUNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUgc29cblx0XHRcdC8vIGFuIHVuYm91bmQgYWN0aW9uIGlzIHJlZmVyZW5jZWQhXG5cdFx0XHRtUGFyYW1ldGVycy5pc0JvdW5kID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE5vIGVudGl0eSBjb250YWluZXIgaW4gdGhlIHNBY3Rpb25OYW1lLCBzbyBlaXRoZXIgYSBib3VuZCBvciBzdGF0aWMgYWN0aW9uIGlzIHJlZmVyZW5jZWQgd2hpY2ggaXMgYWxzbyBib3VuZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICghbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSAmJiBtUGFyYW1ldGVycy5jb250ZXh0cyAmJiBtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSA9IG1QYXJhbWV0ZXJzLm1vZGVsXG5cdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHQuZ2V0TWV0YUNvbnRleHQoKEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cykuZ2V0UGF0aCgpKVxuXHRcdFx0XHQuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0fVxuXHRcdGxldCBvQ29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBDb250cm9sO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgc3RpY2t5IHNlc3Npb24gaXMgZW5hYmxlZCB3ZSB0cmlnZ2VyIGFjdGlvbnMgd2l0aG91dCBlVGFnXG5cdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZyA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCIoXCIpKSB7XG5cdFx0XHQvLyBnZXQgZW50aXR5IHR5cGUgb2YgYWN0aW9uIG92ZXJsb2FkIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aW9uIHBhdGhcblx0XHRcdC8vIEV4YW1wbGUgc0FjdGlvbk5hbWUgPSBcIjxBY3Rpb25OYW1lPihDb2xsZWN0aW9uKDxPdmVybG9hZEVudGl0eVR5cGU+KSlcIlxuXHRcdFx0Ly8gc0FjdGlvbk5hbWUgPSBhUGFydHNbMF0gLS0+IDxBY3Rpb25OYW1lPlxuXHRcdFx0Ly8gc092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1syXSAtLT4gPE92ZXJsb2FkRW50aXR5VHlwZT5cblx0XHRcdGFQYXJ0cyA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKTtcblx0XHRcdHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdO1xuXHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0ucmVwbGFjZUFsbChcIilcIiwgXCJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gJiYgb0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IG9Db250cm9sLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IHRhYmxlQVBJLmdldFJvd0JpbmRpbmcoKS5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gdGhpcy5fZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0LFxuXHRcdFx0XHRcdG9Db250cm9sLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5nZXRJZCgpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Ly9FeGVjdXRlIHRoZSByZWdpc3RlcmVkIGRlZmVycmVkIFNpZGVFZmZlY3RzIGJlZm9yZSB0aGUgUE9TVCBvZiB0aGUgYWN0aW9uXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKSAmJlxuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cz8uZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpXG5cdFx0XHQpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLl9zaWRlRWZmZWN0cy5oYW5kbGVQYWdlQ2hhbmdlQ29udGV4dChtUGFyYW1ldGVycy5jb250ZXh0cyk7XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVFeGVjdXRlQWN0aW9uKHsgY29udGV4dHM6IG1QYXJhbWV0ZXJzLmNvbnRleHRzIH0pO1xuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uKHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSwgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpKTtcblx0XHRcdGNvbnN0IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uID0gcmVzcG9uc2UuZmlsdGVyKGlzRnVsZmlsbGVkKTtcblx0XHRcdGlmIChyZXNwb25zZS5sZW5ndGggIT09IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBLZWVwIHRoZSBzYW1lIHdvcmtmbG93IHRoYW4gYmVmb3JlXG5cdFx0XHRcdC8vIElmIGF0IGxlYXN0IG9uZSBwcm9taXNlIGlzIHJlamVjdGVkLCB3ZSByZWplY3QgdGhlIHdob2xlIHByb21pc2Vcblx0XHRcdFx0dGhyb3cgcmVzcG9uc2U7XG5cdFx0XHR9XG5cdFx0XHRsZXQgbGlzdFJlZnJlc2hlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cyAmJiBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKSAmJiBtUGFyYW1ldGVycy5pc0JvdW5kID09PSB0cnVlKSB7XG5cdFx0XHRcdGxpc3RSZWZyZXNoZWQgPSBhd2FpdCB0aGlzLl9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0XHRcdFx0dGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBzdWNjZXNzRnVsbEV4ZWN1dGlvbiksXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KFxuXHRcdFx0XHRcdEFjdGl2aXR5LkFjdGlvbixcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyxcblx0XHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0XHRsaXN0UmVmcmVzaGVkLFxuXHRcdFx0XHRcdE9iamVjdC5rZXlzKHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLmJvdW5kQ29udGV4dC5nZXRPYmplY3QoKSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lLCBUcmlnZ2VyVHlwZS5hY3Rpb24pO1xuXG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKHN1Y2Nlc3NGdWxsRXhlY3V0aW9uKTtcblx0XHRcdH1cblx0XHRcdC8qXG5cdFx0XHRcdFx0V2Ugc2V0IHRoZSAodXBwZXIpIHBhZ2VzIHRvIGRpcnR5IGFmdGVyIGFuIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb25cblx0XHRcdFx0XHRUT0RPOiBnZXQgcmlkIG9mIHRoaXMgd29ya2Fyb3VuZFxuXHRcdFx0XHRcdFRoaXMgd29ya2Fyb3VuZCBpcyBvbmx5IG5lZWRlZCBhcyBsb25nIGFzIHRoZSBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzeW5jaHJvbml6YXRpb24uXG5cdFx0XHRcdFx0T25jZSB0aGlzIGlzIHN1cHBvcnRlZCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgcGFnZXMgdG8gZGlydHkgYW55bW9yZSBhcyB0aGUgY29udGV4dCBpdHNlbGZcblx0XHRcdFx0XHRpcyBhbHJlYWR5IHJlZnJlc2hlZCAoaXQncyBqdXN0IG5vdCByZWZsZWN0ZWQgaW4gdGhlIG9iamVjdCBwYWdlKVxuXHRcdFx0XHRcdHdlIGV4cGxpY2l0bHkgZG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoZSBsaXN0IHJlcG9ydCBidXQgb25seSBjYWxsIGl0IGZyb20gdGhlIG9iamVjdCBwYWdlXG5cdFx0XHRcdFx0YXMgaWYgaXQgaXMgY2FsbGVkIGluIHRoZSBsaXN0IHJlcG9ydCBpdCdzIG5vdCBuZWVkZWQgLSBhcyB3ZSBhbnl3YXkgd2lsbCByZW1vdmUgdGhpcyBsb2dpY1xuXHRcdFx0XHRcdHdlIGNhbiBsaXZlIHdpdGggdGhpc1xuXHRcdFx0XHRcdHdlIG5lZWQgYSBjb250ZXh0IHRvIHNldCB0aGUgdXBwZXIgcGFnZXMgdG8gZGlydHkgLSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB3ZSB1c2UgdGhlXG5cdFx0XHRcdFx0Zmlyc3Qgb25lIGFzIHRoZXkgYXJlIGFueXdheSBzaWJsaW5nc1xuXHRcdFx0XHRcdCovXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKS5jb252ZXJ0ZXJUeXBlICE9PSBcIkxpc3RSZXBvcnRcIikge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRpZiAoc3VjY2Vzc0Z1bGxFeGVjdXRpb24ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dCA9IHRoaXMuX2dldEJvdW5kQ29udGV4dChvVmlldywgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQ/IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLmJvdW5kQ29udGV4dFxuXHRcdFx0XHRcdFx0OiBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQgPz8gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0O1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRjb25zdCBfZm5WYWxpZENvbnRleHRzID0gKGNvbnRleHRzOiBDb250ZXh0W10sIGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXSk6IENvbnRleHRbXSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dHMuZmlsdGVyKChlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChhcHBsaWNhYmxlQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYXBwbGljYWJsZUNvbnRleHRzLmluY2x1ZGVzKGVsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpXG5cdFx0XHRcdFx0XHQ/IF9mblZhbGlkQ29udGV4dHMobVBhcmFtZXRlcnMuY29udGV4dHMsIG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cylbMF1cblx0XHRcdFx0XHRcdDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRNZXRhUGF0aCA9IG9BY3Rpb25Db250ZXh0ICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRcdFx0XHRcdGlmIChzQ29udGV4dE1ldGFQYXRoICE9IHVuZGVmaW5lZCAmJiBzQ29udGV4dE1ldGFQYXRoID09PSBzQWN0aW9uQ29udGV4dE1ldGFQYXRoKSB7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQ/LmdldFBhdGgoKSAhPT0gY29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBhY3Rpb24gcmV0dXJucyBhIGRyYWZ0IGNvbnRleHQsIHdlIGFscmVhZHkgdGFrZSBjYXJlIGR1cmluZyBuYXZpZ2F0aW9uIHRvIGVpdGhlciBjcmVhdGUgYSBuZXdcblx0XHRcdFx0XHRcdFx0Ly8gKGZ1bGwgc2NyZWVuKSBvciB0byB1c2UgdGhlIGxpc3QgYmluZGluZyBjb250ZXh0IGFmdGVyIHJlZnJlc2ggKGFuZCBub3QgdGhlIHJldHVybiB2YWx1ZSBjb250ZXh0KS5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGRyYWZ0IGlzIGRpc2NhcmRlZCBvciBhY3RpdmF0ZWQsIGhhdmluZyB0aGUgY29udGV4dCBzdGlsbCBhcyBkZXBlbmRlbnQgY29udGV4dCBjYXVzZSBpc3N1ZXNcblx0XHRcdFx0XHRcdFx0Ly8gKGUuZy4gaWYgYSBzaWRlIGVmZmVjdCBpcyB0cmlnZ2VyZWQpLiBUaGVyZWZvcmUsIHdlIGRlc3Ryb3kgdGhlIHJldHVybiB2YWx1ZSBjb250ZXh0IGhlcmUsXG5cdFx0XHRcdFx0XHRcdC8vIGFuZCB0byBiZSBjb21wYXRpYmxlIHdlIHJldHVybiBhIG5ldyBjb250ZXh0IHdpdGggdGhlIHNhbWUgcGF0aC5cblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJlxuXHRcdFx0XHRcdFx0XHRcdChjb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlIHx8IHRoaXMuX2lzRmNsRW5hYmxlZCgpKVxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0LmdldEJpbmRpbmcoKS5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24oc0FjdGlvbk5hbWUpO1xuXG5cdFx0XHQvLyBLZWVwIHRoaXMgd2VpcmQgcmV0dXJuZWQgdmFsdWUgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29uc1xuXHRcdFx0Ly8gaW52b2tlQWN0aW9uIGlzIHB1YmxpYyBhbmQgd2UgY2FuJ3QgY2hhbmdlIHRoZSByZXR1cm5lZCB2YWx1ZSBmb3IgdGhlIGFjdGlvblxuXHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KG1JblBhcmFtZXRlcnM/LmNvbnRleHRzKSAmJiBzdWNjZXNzRnVsbEV4ZWN1dGlvbi5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmV0dXJuIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLnJldHVybmVkQ29udGV4dCA/PyBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3VjY2Vzc0Z1bGxFeGVjdXRpb24ubWFwKChvUmVzdWx0KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7IC4uLm9SZXN1bHQsIC4uLnsgdmFsdWU6IG9SZXN1bHQudmFsdWUucmV0dXJuZWRDb250ZXh0ID8/IG9SZXN1bHQudmFsdWUuYm91bmRDb250ZXh0IH0gfTtcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZWplY3RvcigpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGVyciA9PT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJEaWFsb2cgY2FuY2VsbGVkXCIpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIb29rIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGFmdGVyIHRoZSBhY3Rpb24gZXhlY3V0aW9uLlxuXHQgKiBAcGFyYW0gX2FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBzaW5jZSAxLjExNC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24oX2FjdGlvbk5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vdG8gYmUgb3ZlcnJpZGRlblxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIG9uIHRoZSBtYXNzIGVkaXQgc2F2ZS5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogSWYgeW91IGRlY2lkZSB0byBkbyB5b3VyIG93biBzYXZlIHByb2Nlc3NpbmcsIHlvdSBjYW4gcmV0dXJuIGB0cnVlYCB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IHNhdmUgYmVoYXZpb3IuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWR9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBjdXN0b21NYXNzRWRpdFNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5hQ29udGV4dHMgQXJyYXkgY29udGFpbmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dHMgZm9yIHRoZSBtYXNzIGVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5vVXBkYXRlRGF0YSBBIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgcHJvcGVydHlQYXRoIGFuZCBpdHMgdmFsdWVcblx0ICogQHJldHVybnMgYHRydWVgIHRvIHByZXZlbnQgdGhlIGRlZmF1bHQgZXhlY3V0aW9uLCBgZmFsc2VgIHRvIGtlZXAgdGhlIHN0YW5kYXJkIGJlaGF2aW9yXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTMwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkKVxuXHRhc3luYyBjdXN0b21NYXNzRWRpdFNhdmUoX21QYXJhbWV0ZXJzOiB7IGFDb250ZXh0czogQ29udGV4dFtdOyBvVXBkYXRlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZWN1cmVkIGV4ZWN1dGlvbiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24uIEVuc3VyZXMgdGhhdCB0aGUgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCB3aGVuIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgZnVsZmlsbGVkLlxuXHQgKiBAcGFyYW0gZm5GdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuIFNob3VsZCByZXR1cm4gYSBwcm9taXNlIHRoYXQgaXMgc2V0dGxlZCBhZnRlciBjb21wbGV0aW9uIG9mIHRoZSBleGVjdXRpb24uIElmIG5vdGhpbmcgaXMgcmV0dXJuZWQsIGltbWVkaWF0ZSBjb21wbGV0aW9uIGlzIGFzc3VtZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBEZWZpbml0aW9ucyBvZiB0aGUgcHJlY29uZGl0aW9ucyB0byBiZSBjaGVja2VkIGJlZm9yZSBleGVjdXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kgRGVmaW5lcyB0aGUgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0IFRyaWdnZXJzIGEgYnVzeSBpbmRpY2F0b3Igd2hlbiB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LmNoZWNrIEV4ZWN1dGVzIGZ1bmN0aW9uIG9ubHkgaWYgYXBwbGljYXRpb24gaXNuJ3QgYnVzeS5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnVwZGF0ZXNEb2N1bWVudCBUaGlzIG9wZXJhdGlvbiB1cGRhdGVzIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpdGhvdXQgdXNpbmcgdGhlIGJvdW5kIG1vZGVsIGFuZCBjb250ZXh0LiBBcyBhIHJlc3VsdCwgdGhlIGRyYWZ0IHN0YXR1cyBpcyB1cGRhdGVkIGlmIGEgZHJhZnQgZG9jdW1lbnQgZXhpc3RzLCBhbmQgdGhlIHVzZXIgaGFzIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgZWRpdGluZyBwcm9jZXNzLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZWplY3RlZCBpZiB0aGUgZXhlY3V0aW9uIGlzIHByb2hpYml0ZWQgYW5kIHJlc29sdmVkIGJ5IHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBmbkZ1bmN0aW9uLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzZWN1cmVkRXhlY3V0aW9uKFxuXHRcdGZuRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRcdG1QYXJhbWV0ZXJzPzoge1xuXHRcdFx0YnVzeT86IHtcblx0XHRcdFx0c2V0PzogYm9vbGVhbjtcblx0XHRcdFx0Y2hlY2s/OiBib29sZWFuO1xuXHRcdFx0fTtcblx0XHRcdHVwZGF0ZXNEb2N1bWVudD86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiQnVzeVNldCA9IG1QYXJhbWV0ZXJzPy5idXN5Py5zZXQgPz8gdHJ1ZSxcblx0XHRcdGJCdXN5Q2hlY2sgPSBtUGFyYW1ldGVycz8uYnVzeT8uY2hlY2sgPz8gdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSBtUGFyYW1ldGVycz8udXBkYXRlc0RvY3VtZW50ID8/IGZhbHNlLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0IGFzIENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LFxuXHRcdFx0bWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdGlmIChiQnVzeUNoZWNrICYmIEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBcHBsaWNhdGlvbiBhbHJlYWR5IGJ1c3kgdGhlcmVmb3JlIGV4ZWN1dGlvbiByZWplY3RlZFwiKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIHRvIHNldCBidXN5IGFuZCBkcmFmdCBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgYWxzbyB0aGUgZnVuY3Rpb24gbWlnaHQgYmUgZXhlY3V0ZWQgbGF0ZXIgaW4gcXVldWVcblx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soZm5GdW5jdGlvbiBhcyAoKSA9PiB1bmtub3duIHwgUHJvbWlzZTx1bmtub3duPilcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKG9FcnJvcjogdW5rbm93bik6IHZvaWQgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBPRGF0YUNvbnRleHRCaW5kaW5nJFBhdGNoU2VudEV2ZW50KTogdm9pZCB7XG5cdFx0Ly8gSW4gY29sbGFib3JhdGl2ZSBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiwgZGlzYWJsZSBFVGFnIGNoZWNrIGZvciBQQVRDSCByZXF1ZXN0c1xuXHRcdGNvbnN0IGludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IHVpQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpO1xuXHRcdGNvbnN0IGlnbm9yZUVUYWcgPSB0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgfHwgaW50ZXJuYWxDb250ZXh0LmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdGlmIChpZ25vcmVFVGFnKSB7XG5cdFx0XHQoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBCaW5kaW5nKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLnNldElnbm9yZUVUYWcodHJ1ZSk7XG5cdFx0fVxuXHRcdGlmICh1aUNvbnRleHQ/LmdldFByb3BlcnR5KFwiaXNFZGl0YWJsZVwiKSA9PT0gZmFsc2UpIHtcblx0XHRcdC8vIHRoZSB2aWV3IGlzIG5vdCBpbiBlZGl0IG1vZGUgdGhpcyBtdXN0IGJlIGlubGluZSBlZGl0XG5cdFx0XHR0aGlzLmJhc2UuaW5saW5lRWRpdEZsb3cuaGFuZGxlSW5saW5lRWRpdFBhdGNoU2VudChvRXZlbnQpO1xuXHRcdH0gZWxzZSBpZiAoIWludGVybmFsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiKSkge1xuXHRcdFx0Y29uc3Qgc291cmNlQmluZGluZyA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyB1bmtub3duIGFzIE9EYXRhTGlzdEJpbmRpbmc7IC8vIEZJWE1FOiBVSTUgdHlwZSBzYXlzIHRoaXMgc2hvdWxkIGJlIGFuIE9EYXRhQ29udGV4dEJpbmRpbmdcblx0XHRcdC8vIENyZWF0ZSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gdGhlIHBhdGggaXMgY29tcGxldGVkXG5cdFx0XHRjb25zdCBvUGF0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKHBhdGNoQ29tcGxldGVkRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbiB9PikgPT4ge1xuXHRcdFx0XHRcdC8vIFJlLWVuYWJsZSBFVGFnIGNoZWNrc1xuXHRcdFx0XHRcdGlmIChpZ25vcmVFVGFnKSB7XG5cdFx0XHRcdFx0XHQoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBCaW5kaW5nKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLnNldElnbm9yZUVUYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvRXZlbnQuZ2V0U291cmNlKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2goXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0XHRzb3VyY2VCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBwYXRjaENvbXBsZXRlZEV2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRcdFx0aWYgKGJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMudXBkYXRlRG9jdW1lbnQoc291cmNlQmluZGluZywgb1BhdGNoUHJvbWlzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZVNlbnQgZXZlbnQ6IHJlZ2lzdGVyIGRvY3VtZW50IG1vZGlmaWNhdGlvbi5cblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRoYW5kbGVDcmVhdGVTZW50KGV2ZW50OiBVSTVFdmVudDx7IGNvbnRleHQ6IENvbnRleHQgfT4pOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZXh0ID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKGZhbHNlLCBmYWxzZSwgY29udGV4dC5nZXRQYXRoKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBlcmZvcm1zIGEgdGFzayBpbiBzeW5jIHdpdGggb3RoZXIgdGFza3MgY3JlYXRlZCB2aWEgdGhpcyBmdW5jdGlvbi5cblx0ICogUmV0dXJucyB0aGUgcHJvbWlzZSBjaGFpbiBvZiB0aGUgdGFzay5cblx0ICogQHBhcmFtIFtuZXdUYXNrXSBPcHRpb25hbCwgYSBwcm9taXNlIG9yIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHlcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSB0YXNrIGlzIGNvbXBsZXRlZFxuXHQgKi9cblx0YXN5bmMgc3luY1Rhc2s8VD4obmV3VGFzaz86ICgoKSA9PiBUKSB8IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcblx0XHRpZiAobmV3VGFzaykge1xuXHRcdFx0aWYgKHR5cGVvZiBuZXdUYXNrID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrcy50aGVuKG5ld1Rhc2spLmNhdGNoKGZ1bmN0aW9uIChlcnI6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cuZGVidWcoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrc1xuXHRcdFx0XHRcdC50aGVuKGFzeW5jICgpID0+IG5ld1Rhc2spXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5kZWJ1ZyhlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFza3MgYXMgUHJvbWlzZTxUPjtcblx0fVxuXG5cdC8qKlxuXHQgKiB1cGRhdGVzIHRoZSBVSSBhbmQgaW50ZXJuYWwgbW9kZWxzIGFjY29yZGluZyB0aGUgZWRpdCBtb2RlIC5cblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGRpc3BsYXllZCBvciBlZGl0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZWRpdCBtb2RlIGlzIGNvbXB1dGVkXG5cdCAqL1xuXG5cdGFzeW5jIGNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZShjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblxuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTtcblxuXHRcdFx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkID0gTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwhLmdldE1ldGFNb2RlbCgpKTtcblx0XHRcdFx0bGV0IGZvcmNlRGlzcGxheU1vZGUgPSBmYWxzZTtcblx0XHRcdFx0Y29uc3QgaXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJJc0FjdGl2ZUVudGl0eVwiKTtcblxuXHRcdFx0XHRpZiAoaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRmb3JjZURpc3BsYXlNb2RlID0gIShhd2FpdCB0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmFjdGl2YXRlQ29sbGFib3JhdGlvbihjb250ZXh0LCBpc0FjdGl2ZUVudGl0eSkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2hhc0NvbGxhYm9yYXRpb25BdXRob3JpemF0aW9uXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5mZXRjaENvbGxhYm9yYXRpdmVEcmFmdFVzZXJzUHJvbWlzZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKGlzQWN0aXZlRW50aXR5ID09PSBmYWxzZSAmJiAhZm9yY2VEaXNwbGF5TW9kZSkge1xuXHRcdFx0XHRcdC8vIGluIGNhc2UgdGhlIGRvY3VtZW50IGlzIGRyYWZ0LCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0Ly8gdW5sZXNzIHdlIGRvbid0IGhhdmUgdGhlIGF1dGhvcml6YXRpb24gZm9yIGEgY29sbGFib3JhdGl2ZSB1c2VyXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgaGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhaGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZXRlcm1pbmluZyB0aGUgZWRpdE1vZGUgZm9yIGRyYWZ0XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgbGFzdEludm9rZWRBY3Rpb25OYW1lID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIik7XG5cdFx0XHRpZiAobGFzdEludm9rZWRBY3Rpb25OYW1lICYmIHRoaXMuaXNOZXdBY3Rpb25Gb3JTdGlja3kobGFzdEludm9rZWRBY3Rpb25OYW1lLCBjb250ZXh0KSkge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCB0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T24oY29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXModGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpLCBjb250ZXh0LmdldE1vZGVsKCkpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBtZXRob2QgdG8gZGVsZXRlIGEgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0cy5cblx0ICogQHBhcmFtIGNvbnRleHRzIFRoZSBjb250ZXh0KHMpIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgUGFyYW1ldGVycyBmb3IgZGVsZXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy50aXRsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kZXNjcmlwdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKFxuXHRcdGNvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzPzogYm9vbGVhbjtcblx0XHRcdG5vRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmcgfCB7IHBhdGg6IHN0cmluZyB9O1xuXHRcdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzPzogbnVtYmVyO1xuXHRcdFx0dW5TYXZlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bG9ja2VkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPzogRHJhZnRTaWJsaW5nUGFpcltdO1xuXHRcdFx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZT86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdC8vIGFzIHNlbGVjdGVkIGNvbnRleHRzIG1heSBpbmNsdWRlIGluYWN0aXZlIGNvbnRleHQgd2UgbmVlZCB0byBjb21wdXRlIHRoaXMgcGFyYW1ldGVyIGFnYWluIHRvIGVuc3VyZSBkZWxldGUgaGVscGVyIHdvcmtzIHByb3Blcmx5XG5cdFx0XHRwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdGlmIChwYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0Y29uc3Qgc291cmNlQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdFx0aWYgKHNvdXJjZUNvbnRyb2wgJiYgIXNvdXJjZUNvbnRyb2wuaXNBPE11bHRpVmFsdWVGaWVsZD4oXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBkZWxldGUgaXMgdHJpZ2dlcmVkIGZyb20gYSBNdWx0aVZhbHVlRmllbGQsIHdlIGRvbid0IHVzZSB0aGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhcyB0aGUgTVZGIGRvZXNuJ3QgaGF2ZVxuXHRcdFx0XHQvLyBzdWNoIGEgY29udGV4dCBvZiBpdHMgb3duLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgaXRzIHBhcmVudCBjb250ZXh0IChlLmcuIGZyb20gdGhlIGVtYmVkZGluZyBUYWJsZSlcblx0XHRcdFx0cGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IHNvdXJjZUNvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0YXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQoY29udGV4dHMsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHJlc291cmNlTW9kZWwsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VNb2RlbCgpOiBSZXNvdXJjZU1vZGVsIHtcblx0XHRyZXR1cm4gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFRyYW5zYWN0aW9uSGVscGVyKCk6IHR5cGVvZiBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdFx0cmV0dXJuIFRyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXNzYWdlSGFuZGxlcigpOiBNZXNzYWdlSGFuZGxlciB7XG5cdFx0aWYgKHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgaGFuZGxlclwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhZ2VJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwicGFnZUludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgcGFnZUludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpIGFzIENvbnRleHQ7XG5cdFx0dGhpcy5nZXRQYWdlSW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuQ3JlYXRlTW9kZSwgYkNyZWF0aW9uTW9kZSwgcGFnZUludGVybmFsQ29udGV4dCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IG9yIG5vdC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0Z2V0Q3JlYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhZ2VJbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBDb250ZXh0O1xuXHRcdHJldHVybiAhIXBhZ2VJbnRlcm5hbENvbnRleHQuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdGlzRG9jdW1lbnRNb2RpZmllZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQuXG5cdCAqIEBwYXJhbSBtb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgbW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCBoYXMgYmVlbiBtb2RpZmllZCBieSBjcmVhdGluZyBhIHN1Yi1vYmplY3QuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIG9uIHdoaWNoIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGhlIG1vZGlmaWVkIGZsYWcgb25seSBvbiByZWxhdGl2ZSBsaXN0QmluZGluZ3MsIGkuZS4gd2hlbiBjcmVhdGluZyBhIHN1Yi1vYmplY3Rcblx0XHQvLyBJZiB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlLCB0aGVuIGl0J3MgYSBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0LCBhbmQgYnkgZGVmYXVsdCBhIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3QgaXNuJ3QgY29uc2lkZXJlZCBhcyBtb2RpZmllZFxuXHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqIEBwYXJhbSBiaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlRXZlbnRzKGJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZyk7XG5cdFx0Ly8gV2Ugc3RvcmUga2V5IHNldHMgKGNvbnRleHQgKyBrZXkpIGFzIHRoZSBjcmVhdGlvbiBpbnRlcmFjdGlvbiBtaWdodCBpbnZvbHZlIG11bHRpcGxlIGNyZWF0aW9ucy5cblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXlTZXRzOiB7IGNvbnRleHQ6IENvbnRleHQ7IG1lc3NhZ2VIYW5kbGluZ0tleTogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZVNlbnRcIiwgKGV2ZW50SW5zdGFuY2U6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbjsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY29udGV4dCA9IGV2ZW50SW5zdGFuY2UuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHRcdGxldCBtZXNzYWdlSGFuZGxpbmdLZXkgPSBtZXNzYWdlSGFuZGxpbmdLZXlTZXRzLmZpbmQoKGluZm8pID0+IGluZm8uY29udGV4dCA9PT0gY29udGV4dCk/Lm1lc3NhZ2VIYW5kbGluZ0tleTtcblx0XHRcdGlmICghbWVzc2FnZUhhbmRsaW5nS2V5KSB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleVNldHMucHVzaCh7IGNvbnRleHQsIG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlQ29tcGxldGVkXCIsIChvRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbjsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgc3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpLFxuXHRcdFx0XHRjb250ZXh0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKHN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IG1lc3NhZ2VIYW5kbGluZ0tleVNldHMuZmluZCgoaW5mbykgPT4gaW5mby5jb250ZXh0ID09PSBjb250ZXh0KT8ubWVzc2FnZUhhbmRsaW5nS2V5O1xuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGluZ0tleSkge1xuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZSAoZGlzcGxheWVkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UpLlxuXHQgKiBAcGFyYW0gZHJhZnRTdGF0dXMgVGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlXG5cdCAqL1xuXHRzZXREcmFmdFN0YXR1cyhkcmFmdFN0YXR1czogc3RyaW5nKTogdm9pZCB7XG5cdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBkcmFmdFN0YXR1cywgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBmcm9tIGEgYmluZGluZyBvciBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBzb3VyY2UgVGhlIGJpbmRpbmcgb3IgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICovXG5cdHByaXZhdGUgZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICogQHBhcmFtIGVkaXRNb2RlIFRoZSBlZGl0IG1vZGVcblx0ICogQHBhcmFtIGlzQ3JlYXRpb24gVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG5ld2x5IGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RWRpdE1vZGUoZWRpdE1vZGU/OiBzdHJpbmcsIGlzQ3JlYXRpb24/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKGVkaXRNb2RlKSB7XG5cdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIGVkaXRNb2RlID09PSBcIkVkaXRhYmxlXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRpZiAoZWRpdE1vZGUgIT09IFwiRWRpdGFibGVcIikge1xuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNDcmVhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmbGFnIHRvIGZvcmNlIFNhdmUgb3IgRGlzY2FyZCB3aGVuIGxlYXZpbmcgYSBkcmFmdC5cblx0ICogQHBhcmFtIGZvcmNlZFxuXHQgKi9cblx0cHJpdmF0ZSBmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZChmb3JjZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZFwiLCBmb3JjZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHdlIHNob3VsZCBmb3JjZSB0aGUgdXNlciB0byBTYXZlIG9yIERpc2NhcmQgd2hlbiBsZWF2aW5nIGEgZHJhZnQsIG9yIGlmIGtlZXBpbmcgdGhlIGRyYWZ0IGlzIGFsbG93ZWQuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYga2VlcGluZyB0aGUgZHJhZnQgaXMgbm90IGFsbG93ZWRcblx0ICovXG5cdHNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2ZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkXCIpID09PSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbiBhY3Rpb24gY29ycmVzcG9uZHMgdG8gYSBjcmVhdGUgYWN0aW9uIGZvciBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgYSBjcmVhdGUgYWN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGlzTmV3QWN0aW9uRm9yU3RpY2t5KGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdGNvbnN0IHN0aWNreVNlc3Npb24gPSBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDtcblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5OZXdBY3Rpb24gPT09IGFjdGlvbk5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMgJiYgc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMuaW5jbHVkZXMoYWN0aW9uTmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyBNb3ZlIGFsbCBzdGlja3ktcmVsYXRlZCBiZWxvdyB0byBhIHN0aWNreSBzZXNzaW9uIG1hbmFnZXIgY2xhc3NcblxuXHQvKipcblx0ICogRW5hYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgaGFuZGxlU3RpY2t5T24oY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IGhhc2hUcmFja2VyID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChjb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpY2FyZCBtZXNzYWdlIGJveCBpbiBjYXNlIG9mIHN0aWNreVxuXHRcdFx0XHRhd2FpdCBhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMsIGNvbnRleHQpKTtcblxuXHRcdFx0XHQvLyBBdHRhY2ggc3RpY2t5IHNlc3Npb24gY2FsbGJhY2tzXG5cdFx0XHRcdGNvbnN0IGkxOG5Nb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LnJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyhcblx0XHRcdFx0XHR0aGlzLmdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQsIGludGVybmFsTW9kZWwsIGhhc2hUcmFja2VyKSxcblx0XHRcdFx0XHR0aGlzLmdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oY29udGV4dCwgaTE4bk1vZGVsKSxcblx0XHRcdFx0XHR0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTdGlja3lPZmYoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LnVucmVnaXN0ZXJTdGlja3lTZXNzaW9uQ2FsbGJhY2tzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQudW5yZWdpc3RlclN0aWNreVNlc3Npb25DYWxsYmFja3MoKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCBtb2RlbC5nZXRIdHRwSGVhZGVycyh0cnVlKVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIERpcnR5U3RhdGVQcm92aWRlciBpbiB0aGUgU2hlbGwuXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgVGhlIG1vZGVsIFwiaW50ZXJuYWxcIlxuXHQgKiBAcGFyYW0gaGFzaFRyYWNrZXIgSGFzaCB0cmFja2VyXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgaGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiAobmF2aWdhdGlvbkNvbnRleHQ6IHsgaW5uZXJBcHBSb3V0ZTogc3RyaW5nIH0pOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBEaXJ0eVN0YXRlUHJvdmlkZXIgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB0YXJnZXRIYXNoID0gbmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZTtcblx0XHRcdFx0Y29uc3Qgcm91dGVyUHJveHkgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IGxjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGlzRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGlzU2Vzc2lvbk9uID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFpc1Nlc3Npb25Pbikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFeGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXJvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGhhc2hUcmFja2VyID09PSB0YXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHRhcmdldEhhc2gpIHx8IHJvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGFzaFRyYWNrZXIgPSBsY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpc0RpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gYSBzdGlja3kgc2Vzc2lvbiB0aW1lcyBvdXQuXG5cdCAqIEBwYXJhbSBzdGlja3lDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHBhcmFtIGkxOG5Nb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihzdGlja3lDb250ZXh0OiBDb250ZXh0LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpOiB1bmRlZmluZWQgfCBib29sZWFuID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChzdGlja3lDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIFNlc3Npb25UaW1lb3V0IGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2FybmluZ0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHR3YXJuaW5nRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KHdhcm5pbmdEaWFsb2cpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIG9uUm91dGVNYXRjaGVkIGV2ZW50IGluIGNhc2Ugb2Ygc3RpY2t5IGVkaXRpb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQ6IENvbnRleHQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuICgpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIWN1cnJlbnRIYXNoIHx8ICFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoY3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5jbGVhclNlc3Npb25Db250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmRzIGEgc3RpY2t5IHNlc3Npb24gYnkgZGlzY2FyZGluZyBjaGFuZ2VzLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXNDcmVhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCk7IC8vIFN0b3JlIHRoaXMgdmFsdWUgaW4gYSB2YXJpYWJsZSwgYXMgaXQgd2lsbCBiZSByZXNldCBpbiBoYW5kbGVTdGlja3lPZmZcblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpOyAvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBiZWZvcmUgY2FsbGluZyB0aGUgYXN5bmMgbWV0aG9kIG9uIHRoZSBzZXJ2ZXIsIG90aGVyd2lzZSB0aGV5IHdpbGwgY29uZmxpY3Qgd2l0aCBSb3V0ZVByb3h5LnJlc3RvcmVIaXN0b3J5IHRoYXQgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXG5cdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQoY29udGV4dCk7XG5cdFx0aWYgKGRpc2NhcmRlZENvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0XHRpZiAoIWlzQ3JlYXRpb24pIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb24uXG5cdCAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbFJvdXRpbmcoKTogSW50ZXJuYWxSb3V0aW5nIHtcblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk6IFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHR9XG5cblx0X2dldFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBjcmVhdGVBY3Rpb25Qcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcpOiB7IGZSZXNvbHZlcjogRnVuY3Rpb247IGZSZWplY3RvcjogRnVuY3Rpb24gfSB7XG5cdFx0bGV0IHJlc29sdmVGdW5jdGlvbjogRnVuY3Rpb24sIHJlamVjdEZ1bmN0aW9uOiBGdW5jdGlvbjtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZTxQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZUZ1bmN0aW9uID0gcmVzb2x2ZTtcblx0XHRcdHJlamVjdEZ1bmN0aW9uID0gcmVqZWN0O1xuXHRcdH0pLnRoZW4oKHJlc3BvbnNlOiBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oeyBjb250cm9sSWQgfSwgdGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKGFjdGlvbk5hbWUsIHJlc3BvbnNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiByZXNvbHZlRnVuY3Rpb24hLCBmUmVqZWN0b3I6IHJlamVjdEZ1bmN0aW9uISB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0cmVzcG9uc2U6IFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdXG5cdCk6IHsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID49IDEpIHtcblx0XHRcdGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbERhdGEgPSAoY3VycmVudFZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXREYXRhKCkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsQWN0aW9uID0gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXSBhcyBNZXRhTW9kZWxBY3Rpb25bXSB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGFjdGlvblJldHVyblR5cGUgPSBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZSA/IG1ldGFNb2RlbEFjdGlvbj8uWzBdLiRSZXR1cm5UeXBlLiRUeXBlIDogbnVsbDtcblx0XHRcdGNvbnN0IGtleXMgPVxuXHRcdFx0XHRhY3Rpb25SZXR1cm5UeXBlICYmIChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpXG5cdFx0XHRcdFx0PyAobWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKS4kS2V5XG5cdFx0XHRcdFx0OiBbXTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG9EYXRhOiByZXNwb25zZVswXS52YWx1ZS5ib3VuZENvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRcdGtleXNcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRhc3luYyBnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpOiBQcm9taXNlPHsgY29udHJvbElkPzogc3RyaW5nOyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2coaXNTYXZlOiBib29sZWFuKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cpIHtcblx0XHRcdHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyA9IG5ldyBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2coe1xuXHRcdFx0XHR2aWV3OiB0aGlzLmdldFZpZXcoKVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/Lm9wZW4oaXNTYXZlKTtcblx0fVxuXG5cdF9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGU6IFRhYmxlKTogdm9pZCB7XG5cdFx0Y29uc3Qgcm93QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRjb25zdCBhY3RpdmVSb3dJbmRleDogbnVtYmVyID0gcm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKHRhYmxlLmRhdGEoXCJ0YWJsZVR5cGVcIikgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGlmIChhY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChhY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKiBJbiBhIHJlc3BvbnNpdmUgdGFibGUsIHRoZSBlbXB0eSByb3dzIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWJsZS4gQnV0IHdoZW4gd2UgY3JlYXRlIG1vcmUsIHRoZXkgYXBwZWFyIGJlbG93IHRoZSBuZXcgbGluZS5cblx0XHRcdCAqIFNvIHdlIGNoZWNrIHRoZSBmaXJzdCBpbmFjdGl2ZSByb3cgZmlyc3QsIHRoZW4gd2Ugc2V0IHRoZSBmb2N1cyBvbiBpdCB3aGVuIHdlIHByZXNzIHRoZSBidXR0b24uXG5cdFx0XHQgKiBUaGlzIGRvZXNuJ3QgaW1wYWN0IHRoZSBHcmlkVGFibGUgYmVjYXVzZSB0aGV5IGFwcGVhciBhdCB0aGUgZW5kLCBhbmQgd2UgYWxyZWFkeSBmb2N1cyB0aGUgYmVmb3JlLXRoZS1sYXN0IHJvdyAoYmVjYXVzZSAyIGVtcHR5IHJvd3MgZXhpc3QpXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFsbFJvd0NvbnRleHRzID0gcm93QmluZGluZy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdGlmICghYWxsUm93Q29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBmb2N1c1JvdyA9IGFjdGl2ZVJvd0luZGV4LFxuXHRcdFx0XHRpbmRleCA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHNpbmdsZUNvbnRleHQgb2YgYWxsUm93Q29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNpbmdsZUNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZGV4IDwgZm9jdXNSb3cpIHtcblx0XHRcdFx0XHRmb2N1c1JvdyA9IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9jdXNSb3cgPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoZm9jdXNSb3cpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coZm9jdXNSb3csIHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzKHRhYmxlOiBUYWJsZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0aWYgKFxuXHRcdFx0dGFibGVBUEk/LnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSAmJlxuXHRcdFx0IXRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIilcblx0XHQpIHtcblx0XHRcdC8vIFdpdGggdGhlIHBhcmFtZXRlciwgd2UgZG9uJ3QgaGF2ZSBlbXB0eSByb3dzIGluIEVkaXQgbW9kZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUgc2V0dGluZyB0aGUgZm9jdXMgb24gdGhlbVxuXHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGUsIHRydWUpO1xuXHRcdH1cblx0XHR0aGlzLl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGUpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0dHJpZ2dlcmVkQWN0aW9uTmFtZT86IHN0cmluZyxcblx0XHRyZWZyZXNoTGlzdEJpbmRpbmc/OiBib29sZWFuLFxuXHRcdGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM/OiBzdHJpbmdbXVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZW50ID0gQXJyYXkuaXNBcnJheShyZWxhdGVkQ29udGV4dHMpID8gcmVsYXRlZENvbnRleHRzLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpIDogcmVsYXRlZENvbnRleHRzPy5nZXRQYXRoKCk7XG5cdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5zZW5kKHsgYWN0aW9uLCBjb250ZW50LCB0cmlnZ2VyZWRBY3Rpb25OYW1lLCByZWZyZXNoTGlzdEJpbmRpbmcsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMgfSk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IFRyaWdnZXJUeXBlKTogdm9pZCB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5iYXNlLmdldFZpZXcoKSwgc0FjdGlvbk5hbWUsIHRyaWdnZXJUeXBlKTtcblx0fVxuXG5cdGFzeW5jIF9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IChvTW9kZWwub1JlcXVlc3RvciBhcyB1bmtub3duIGFzIHsgd2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0czogRnVuY3Rpb24gfSkud2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyhcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhbGwgY2hhbmdlcyB3ZXJlIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcblx0XHRcdGlmIChvTW9kZWwuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdWJtaXQgb2Ygb3BlbiBjaGFuZ2VzIGZhaWxlZFwiKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCByb3V0ZXJQcm94eSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChyb3V0ZXJQcm94eS5jaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpKSB7XG5cdFx0XHRzdGlja3kucHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dmlldyxcblx0XHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5TdGlja3lcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGlzdG9yeS5iYWNrKCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogeyBlZGl0YWJsZTogYm9vbGVhbjsgcmVjcmVhdGVDb250ZXh0OiBib29sZWFuOyBmb3JjZUZvY3VzPzogYm9vbGVhbiB9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0cGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0cmVjcmVhdGVDb250ZXh0OiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWNyZWF0ZUNvbnRleHQsXG5cdFx0XHRyZWFzb246IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0Zm9yY2VGb2N1czogbmF2aWdhdGlvblBhcmFtZXRlcnMuZm9yY2VGb2N1cyA/PyBmYWxzZSxcblx0XHRcdGtlZXBDdXJyZW50TGF5b3V0OiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3XG5cdCAqIEBwYXJhbSBwYXJhbXMgVGhlIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIHBhcmFtcy5jb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbXMuaXNOYXZpZ2FibGUgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIG5hdmlnYWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gbmVlZHMgdG8gcmV0dXJucyB0aGUgYm91bmQgY29udGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IEZFVmlldywgcGFyYW1zOiB7IGNvbnRyb2xJZD86IHN0cmluZzsgaXNOYXZpZ2FibGU/OiBib29sZWFuIH0pOiBib29sZWFuIHtcblx0XHQvL1RoaXMgd2VpcmQgY29uZGl0aW9uIGlzIG5lZWRlZCB0byBhdm9pZCBuYXZpZ2F0aW9uIGluIGNhc2Ugb2Ygc29tZSBhY3Rpb25zIGludG8gdGhlIHRhYmxlXG5cdFx0Ly8gdGhpcyBkZWZpbml0ZWx5IG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgdG8gZ2V0IGNsZWFyIGNvbmRpdGlvbiB3aGVyZSBuYXZpZ2F0aW9uIG5lZWRzIHRvIGJlIGRvbmUgb3Igbm90XG5cdFx0Ly8gU05PVzogRElOQzAyNzg0OTBcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSB2aWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdGFzeW5jIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCB2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHZpc2libGVWaWV3SWRzID0gdGhpcy5faXNGY2xFbmFibGVkKClcblx0XHRcdFx0PyAodGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgRmNsQ29udHJvbGxlcikuX2dldEFsbFZpc2libGVWaWV3cygpLm1hcCgodmlldykgPT4gdmlldy5nZXRJZCgpKVxuXHRcdFx0XHQ6IFt0aGlzLmdldFZpZXcoKS5nZXRJZCgpXTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRMb2cuaW5mbyhcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgbWVzc2FnZSBvZiBhTWVzc2FnZXMpIHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChtZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmICh2aXNpYmxlVmlld0lkcy5pbmNsdWRlcyhvQ29udHJvbC5nZXRJZCgpKSkge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlLm9EYXRhXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uua2V5c1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgVHJ1ZSBQcm9taXNlIGlmIHRoZSBsaXN0IHdhcyByZWZyZXNoZWRcblx0ICovXG5cdGFzeW5jIF9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0b1Jlc3BvbnNlPzogeyBvRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzPzogc3RyaW5nW10gfCBudWxsIH0sXG5cdFx0b0NvbnRleHQ/OiBDb250ZXh0XG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhIHx8ICFvUmVzcG9uc2Uua2V5cykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKG9CaW5kaW5nLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBwYXRocyA9IGFTZW1hbnRpY0tleXMubWFwKChvS2V5KSA9PiBvS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0YXdhaXQgb0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHBhdGhzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIGxhdGVzdCBjb250ZXh0IGluIHRoZSBtZXRhZGF0YSBoaWVyYXJjaHkgZnJvbSByb290QmluZGluZyB0byBnaXZlbiBjb250ZXh0IHBvaW50aW5nIHRvIGdpdmVuIGVudGl0eVR5cGVcblx0ICogaWYgYW55IHN1Y2ggY29udGV4dCBleGlzdHMuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgb3JpZ2luYWwgY29udGV4dC5cblx0ICogTm90ZTogSXQgaXMgb25seSBuZWVkZWQgYXMgd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcuIENvcnJlY3QgbW9kZWxsaW5nIHdvdWxkIGltcGx5IGEgRGF0YUZpZWxkRm9yQWN0aW9uIGluIGEgTGluZUl0ZW1cblx0ICogdG8gcG9pbnQgdG8gYW4gb3ZlcmxvYWQgZGVmaW5lZCBlaXRoZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgRW50aXR5VHlwZSBvciBhIGNvbGxlY3Rpb24gb2YgdGhlIHNhbWUuXG5cdCAqIEBwYXJhbSByb290Q29udGV4dCBUaGUgY29udGV4dCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gb3ZlcmxvYWRFbnRpdHlUeXBlIFRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHkgdHlwZSB0byBzZWFyY2ggZm9yXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eVxuXHQgKi9cblx0X2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgocm9vdENvbnRleHQ6IENvbnRleHQsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBvdmVybG9hZEVudGl0eVR5cGU6IHN0cmluZyk6IENvbnRleHQge1xuXHRcdGNvbnN0IG1vZGVsOiBPRGF0YU1vZGVsID0gcm9vdENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IGNvbnRleHRTZWdtZW50czogc3RyaW5nW10gPSBsaXN0QmluZGluZy5nZXRQYXRoKCkuc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBjdXJyZW50Q29udGV4dDogQ29udGV4dCA9IHJvb3RDb250ZXh0O1xuXG5cdFx0Ly8gV2UgZXhwZWN0IHRoYXQgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgbGlzdEJpbmRpbmcgaXMgdGhlIExpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZS4gUmVtb3ZlIHRoaXMgZnJvbSBjb250ZXh0U2VnbWVudHNcblx0XHQvLyBiZWNhdXNlIGl0IGlzIGluY29ycmVjdCB0byBleGVjdXRlIGJpbmRDb250ZXh0IG9uIGEgbGlzdC4gV2UgZG8gbm90IGFueXdheSBuZWVkIHRvIHNlYXJjaCB0aGlzIGNvbnRleHQgZm9yIHRoZSBvdmVybG9hZC5cblx0XHRjb250ZXh0U2VnbWVudHMucG9wKCk7XG5cdFx0aWYgKGNvbnRleHRTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cyA9IFtcIlwiXTsgLy8gRG9uJ3QgbGVhdmUgY29udGV4dFNlZ21lbnRzIHVuZGVmaW5lZFxuXHRcdH1cblxuXHRcdGlmIChjb250ZXh0U2VnbWVudHNbMF0gIT09IFwiXCIpIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cy51bnNoaWZ0KFwiXCIpOyAvLyB0byBhbHNvIGdldCB0aGUgcm9vdCBjb250ZXh0LCBpLmUuIHRoZSBiaW5kaW5nQ29udGV4dCBvZiB0aGUgdGFibGVcblx0XHR9XG5cdFx0Ly8gbG9hZCBhbGwgdGhlIHBhcmVudCBjb250ZXh0cyBpbnRvIGFuIGFycmF5XG5cdFx0Y29uc3QgcGFyZW50Q29udGV4dHM6IENvbnRleHRbXSA9IGNvbnRleHRTZWdtZW50c1xuXHRcdFx0Lm1hcCgocGF0aFNlZ21lbnQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRpZiAocGF0aFNlZ21lbnQgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KHBhdGhTZWdtZW50LCBjdXJyZW50Q29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpbmcgYSBuZXcgY29udGV4dCB1c2luZyBiaW5kQ29udGV4dCguLi4pLmdldEJvdW5kQ29udGV4dCgpIGRvZXMgbm90IHdvcmsgaWYgdGhlIGV0YWcgaXMgbmVlZGVkLiBBY2NvcmRpbmcgdG8gbW9kZWwgY29sbGVhZ3Vlcyxcblx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgYWx3YXlzIHVzZSBhbiBleGlzdGluZyBjb250ZXh0IGlmIHBvc3NpYmxlLlxuXHRcdFx0XHRcdC8vIEN1cnJlbnRseSwgdGhlIG9ubHkgZXhhbXBsZSB3ZSBrbm93IGFib3V0IGlzIHVzaW5nIHRoZSByb290Q29udGV4dCAtIGFuZCBpbiB0aGlzIGNhc2UsIHdlIGNhbiBvYnZpb3VzbHkgcmV1c2UgdGhhdCBleGlzdGluZyBjb250ZXh0LlxuXHRcdFx0XHRcdC8vIElmIG90aGVyIGV4YW1wbGVzIHNob3VsZCBjb21lIHVwLCB0aGUgYmVzdCBwb3NzaWJsZSB3b3JrIGFyb3VuZCB3b3VsZCBiZSB0byByZXF1ZXN0IHNvbWUgZGF0YSB0byBnZXQgYW4gZXhpc3RpbmcgY29udGV4dC4gVG8ga2VlcCB0aGVcblx0XHRcdFx0XHQvLyByZXF1ZXN0IGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlLCB3ZSBzaG91bGQgcmVxdWVzdCBvbmx5IHRoZSBmaXJzdCBrZXkgcHJvcGVydHkuIEFzIHRoaXMgd291bGQgaW50cm9kdWNlIGFzeW5jaHJvbmlzbSwgYW5kIGFueXdheVxuXHRcdFx0XHRcdC8vIHRoZSB3aG9sZSBsb2dpYyBpcyBvbmx5IHBhcnQgb2Ygd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcsIHdlIHdhaXQgdW50aWwgd2UgaGF2ZSBhbiBleGFtcGxlIG5lZWRpbmcgaXQgYmVmb3JlIGltcGxlbWVudGluZyB0aGlzLlxuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRDb250ZXh0O1xuXHRcdFx0fSlcblx0XHRcdC5yZXZlcnNlKCk7XG5cdFx0Ly8gc2VhcmNoIGZvciBjb250ZXh0IGJhY2t3YXJkc1xuXHRcdGNvbnN0IG92ZXJsb2FkQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCA9IHBhcmVudENvbnRleHRzLmZpbmQoXG5cdFx0XHQocGFyZW50Q29udGV4dDogQ29udGV4dCkgPT5cblx0XHRcdFx0KG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChwYXJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiJFR5cGVcIikgYXMgdW5rbm93biBhcyBzdHJpbmcpID09PSBvdmVybG9hZEVudGl0eVR5cGVcblx0XHQpO1xuXHRcdHJldHVybiBvdmVybG9hZENvbnRleHQgfHwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpITtcblx0fVxuXG5cdF9jcmVhdGVTaWJsaW5nSW5mbyhjdXJyZW50Q29udGV4dDogQ29udGV4dCwgbmV3Q29udGV4dDogQ29udGV4dCk6IFNpYmxpbmdJbmZvcm1hdGlvbiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG5ld0NvbnRleHQsXG5cdFx0XHRwYXRoTWFwcGluZzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2xkUGF0aDogY3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld0NvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0X3VwZGF0ZVBhdGhzSW5IaXN0b3J5KG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXRQYXRoTWFwcGluZyhtYXBwaW5ncyk7XG5cblx0XHQvLyBBbHNvIHVwZGF0ZSB0aGUgc2VtYW50aWMgbWFwcGluZyBpbiB0aGUgcm91dGluZyBzZXJ2aWNlXG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdGlmIChtYXBwaW5ncy5sZW5ndGggJiYgbGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ub2xkUGF0aCkge1xuXHRcdFx0bGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoID0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHR9XG5cdH1cblxuXHRfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRuZXdEb2N1bWVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0c2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZFxuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhjb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gbmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBjb250ZXh0LmdldFBhdGgoKSA9PT0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgPyBjb250ZXh0IDogc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoXG5cdCAqIGZvciBhbGwgaW50ZXJtZWRpYXRlIHBhdGhzIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG5cdCAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdFxuXHQgKiBAcGFyYW0gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSBkb05vdENvbXB1dGVJZlJvb3QgSWYgdHJ1ZSwgd2UgZG9uJ3QgY29tcHV0ZSBzaWJsaW5nSW5mbyBpZiB0aGUgcm9vdCBhbmQgdGhlIHJpZ2h0bW9zdCBjb250ZXh0cyBhcmUgdGhlIHNhbWVcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgcm9vdCBjb250ZXh0IGluZm9ybWF0aW9uIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW4sXG5cdFx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRcdGdyb3VwSWQ/OiBzdHJpbmdcblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGxldCByaWdodE1vc3RDb250ZXh0VG9Vc2UgPSByaWdodG1vc3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KSAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0Ly8gd2UgY2hlY2sgdGhlIHJpZ2h0TW9zdEN1cnJlbnRDb250ZXh0IGNhbiBiZSB1c2VkIGluIGRyYWZ0XG5cdFx0XHRyaWdodE1vc3RDb250ZXh0VG9Vc2UgPSByb290Q3VycmVudENvbnRleHQ7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRNb3N0Q29udGV4dFRvVXNlLmdldFBhdGgoKSA9PT0gcm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRyZXR1cm4gZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihyb290Q3VycmVudENvbnRleHQsIHJpZ2h0TW9zdENvbnRleHRUb1VzZSwgcm9vdENvbnRleHRJbmZvLCBncm91cElkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgbm90IGluIGRyYWZ0IG1vZGUsIHdlIGp1c3QgcmVjcmVhdGUgYSBjb250ZXh0IGZyb20gdGhlIHBhdGggb2YgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHQvLyBObyBwYXRoIG1hcHBpbmcgaXMgbmVlZGVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbC5iaW5kQ29udGV4dChyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldEJvdW5kQ29udGV4dCgpLFxuXHRcdFx0XHRwYXRoTWFwcGluZzogW11cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0X2lzRmNsRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCk7XG5cdH1cblxuXHRhc3luYyBjaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uKCk6IFByb21pc2U8UmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vVGhlIGV4aXN0aW5nIHJlY29tbWVuZGF0aW9ucyBjaGVjayBpcyBub3cgcHJlc2VudCBmdXJ0aGVyIGluIHRoZSBmbG93IGZvciBzaG93aW5nIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKHRydWUpO1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3Nlbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgTmV4dCBEb2N1bWVudC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZWQgb25jZSBjcmVhdGUgbmV4dCBoYXBwZW5zLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTmV4dERvY3VtZW50KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0UGF0aCA9IHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmdQYXRoID0gYmluZGluZ0NvbnRleHRQYXRoPy5zdWJzdHJpbmcoMCwgYmluZGluZ0NvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiKFwiKSk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRG9jdW1lbnQobGlzdEJpbmRpbmdQYXRoIGFzIHN0cmluZywgeyBjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5OZXdQYWdlIH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEyRUEsTUFBTUEsZ0JBQWdCLEdBQUdDLFNBQVMsQ0FBQ0QsZ0JBQWdCO0lBQ2xERSxTQUFTLEdBQUdELFNBQVMsQ0FBQ0MsU0FBUztJQUMvQkMsV0FBVyxHQUFHRixTQUFTLENBQUNFLFdBQVc7SUFDbkNDLFFBQVEsR0FBR0gsU0FBUyxDQUFDRyxRQUFRO0lBQzdCQyxXQUFXLEdBQUdKLFNBQVMsQ0FBQ0ksV0FBVztFQTJCcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEEsSUFPTUMsUUFBUSxJQUFBQyxJQUFBLEdBRGJDLGNBQWMsQ0FBQywyQ0FBMkMsQ0FBQyxFQUFBQyxLQUFBLEdBYzFEQyxjQUFjLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBd0JoQkMsZUFBZSxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUNqQkMsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQW1SaEJILGVBQWUsQ0FB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