@sapui5/sap.fe.core 1.101.1 → 1.102.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +5 -5
  4. package/src/sap/fe/core/AppComponent.ts +19 -18
  5. package/src/sap/fe/core/AppStateHandler.js +4 -4
  6. package/src/sap/fe/core/AppStateHandler.ts +9 -9
  7. package/src/sap/fe/core/CommonUtils.js +59 -93
  8. package/src/sap/fe/core/CommonUtils.ts +80 -99
  9. package/src/sap/fe/core/ExtensionAPI.js +2 -4
  10. package/src/sap/fe/core/ExtensionAPI.ts +1 -3
  11. package/src/sap/fe/core/PageController.js +14 -9
  12. package/src/sap/fe/core/PageController.ts +8 -2
  13. package/src/sap/fe/core/TemplateComponent.js +6 -6
  14. package/src/sap/fe/core/TemplateComponent.ts +5 -5
  15. package/src/sap/fe/core/TemplateModel.js +2 -2
  16. package/src/sap/fe/core/TemplateModel.ts +2 -2
  17. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +303 -75
  18. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +273 -64
  19. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  20. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  21. package/src/sap/fe/core/controllerextensions/EditFlow.js +234 -123
  22. package/src/sap/fe/core/controllerextensions/EditFlow.ts +176 -114
  23. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +34 -10
  24. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +44 -12
  25. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +30 -28
  26. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +38 -31
  27. package/src/sap/fe/core/controllerextensions/InternalRouting.js +157 -102
  28. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +155 -103
  29. package/src/sap/fe/core/controllerextensions/MassEdit.js +4 -3
  30. package/src/sap/fe/core/controllerextensions/MassEdit.ts +15 -14
  31. package/src/sap/fe/core/controllerextensions/MessageHandler.js +3 -3
  32. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +10 -2
  33. package/src/sap/fe/core/controllerextensions/Paginator.js +12 -3
  34. package/src/sap/fe/core/controllerextensions/Paginator.ts +11 -2
  35. package/src/sap/fe/core/controllerextensions/Share.js +19 -1
  36. package/src/sap/fe/core/controllerextensions/Share.ts +18 -0
  37. package/src/sap/fe/core/controllerextensions/SideEffects.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
  39. package/src/sap/fe/core/controllerextensions/ViewState.js +11 -1
  40. package/src/sap/fe/core/controllerextensions/ViewState.ts +10 -0
  41. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  42. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
  43. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  44. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +57 -106
  45. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
  46. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +6 -6
  47. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.js +4 -4
  48. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +3 -3
  49. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ManageDialog.fragment.xml +0 -0
  50. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  51. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1587 -0
  52. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +26 -13
  53. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +785 -0
  54. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +179 -22
  55. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1175 -0
  56. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +203 -98
  57. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
  58. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
  59. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +597 -0
  60. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +46 -27
  61. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
  62. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +20 -18
  63. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  64. package/src/sap/fe/core/controls/CommandExecution.js +14 -3
  65. package/src/sap/fe/core/controls/CommandExecution.ts +11 -2
  66. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +34 -29
  67. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +33 -29
  68. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -1
  69. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +1 -0
  70. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +11 -3
  71. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +17 -7
  72. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +9 -3
  73. package/src/sap/fe/core/controls/FileWrapper.js +49 -2
  74. package/src/sap/fe/core/controls/FileWrapper.ts +34 -1
  75. package/src/sap/fe/core/controls/FormElementWrapper.js +12 -2
  76. package/src/sap/fe/core/controls/FormElementWrapper.ts +12 -1
  77. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  78. package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
  79. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
  80. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
  81. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +28 -63
  82. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  83. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -36
  84. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -36
  85. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  86. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -1
  87. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
  88. package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
  89. package/src/sap/fe/core/converters/annotations/DataField.js +20 -4
  90. package/src/sap/fe/core/converters/annotations/DataField.ts +24 -2
  91. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -12
  92. package/src/sap/fe/core/converters/controls/Common/Action.ts +3 -9
  93. package/src/sap/fe/core/converters/controls/Common/Chart.js +10 -3
  94. package/src/sap/fe/core/converters/controls/Common/Chart.ts +8 -3
  95. package/src/sap/fe/core/converters/controls/Common/Form.js +12 -14
  96. package/src/sap/fe/core/converters/controls/Common/Form.ts +17 -19
  97. package/src/sap/fe/core/converters/controls/Common/Table.js +149 -66
  98. package/src/sap/fe/core/converters/controls/Common/Table.ts +136 -52
  99. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +22 -12
  100. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +23 -12
  101. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -5
  102. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +15 -10
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +26 -24
  104. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +35 -33
  105. package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
  106. package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
  107. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  108. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
  109. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +25 -25
  110. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +35 -38
  111. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
  112. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
  113. package/src/sap/fe/core/formatters/TableFormatter.js +73 -12
  114. package/src/sap/fe/core/formatters/TableFormatter.ts +70 -15
  115. package/src/sap/fe/core/fpm/Component.js +2 -2
  116. package/src/sap/fe/core/fpm/Component.ts +1 -1
  117. package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
  118. package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
  119. package/src/sap/fe/core/helpers/ClassSupport.js +1 -1
  120. package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
  121. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  122. package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
  123. package/src/sap/fe/core/helpers/MassEditHelper.js +399 -152
  124. package/src/sap/fe/core/helpers/MassEditHelper.ts +385 -163
  125. package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
  126. package/src/sap/fe/core/helpers/ModelHelper.ts +20 -30
  127. package/src/sap/fe/core/helpers/StableIdHelper.js +5 -1
  128. package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -4
  129. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  130. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  131. package/src/sap/fe/core/library.js +12 -3
  132. package/src/sap/fe/core/library.ts +9 -0
  133. package/src/sap/fe/core/messagebundle.properties +125 -180
  134. package/src/sap/fe/core/messagebundle_ar.properties +30 -63
  135. package/src/sap/fe/core/messagebundle_bg.properties +30 -63
  136. package/src/sap/fe/core/messagebundle_ca.properties +30 -63
  137. package/src/sap/fe/core/messagebundle_cs.properties +30 -63
  138. package/src/sap/fe/core/messagebundle_cy.properties +30 -63
  139. package/src/sap/fe/core/messagebundle_da.properties +31 -64
  140. package/src/sap/fe/core/messagebundle_de.properties +30 -63
  141. package/src/sap/fe/core/messagebundle_el.properties +31 -64
  142. package/src/sap/fe/core/messagebundle_en.properties +31 -64
  143. package/src/sap/fe/core/messagebundle_en_GB.properties +31 -64
  144. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +40 -73
  145. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +31 -64
  146. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +49 -82
  147. package/src/sap/fe/core/messagebundle_es.properties +30 -63
  148. package/src/sap/fe/core/messagebundle_es_MX.properties +30 -63
  149. package/src/sap/fe/core/messagebundle_et.properties +30 -63
  150. package/src/sap/fe/core/messagebundle_fi.properties +30 -63
  151. package/src/sap/fe/core/messagebundle_fr.properties +33 -66
  152. package/src/sap/fe/core/messagebundle_fr_CA.properties +30 -63
  153. package/src/sap/fe/core/messagebundle_hi.properties +30 -63
  154. package/src/sap/fe/core/messagebundle_hr.properties +30 -63
  155. package/src/sap/fe/core/messagebundle_hu.properties +29 -62
  156. package/src/sap/fe/core/messagebundle_id.properties +31 -64
  157. package/src/sap/fe/core/messagebundle_it.properties +30 -63
  158. package/src/sap/fe/core/messagebundle_iw.properties +30 -63
  159. package/src/sap/fe/core/messagebundle_ja.properties +30 -63
  160. package/src/sap/fe/core/messagebundle_kk.properties +30 -63
  161. package/src/sap/fe/core/messagebundle_ko.properties +30 -63
  162. package/src/sap/fe/core/messagebundle_lt.properties +30 -63
  163. package/src/sap/fe/core/messagebundle_lv.properties +30 -63
  164. package/src/sap/fe/core/messagebundle_ms.properties +31 -64
  165. package/src/sap/fe/core/messagebundle_nl.properties +31 -64
  166. package/src/sap/fe/core/messagebundle_no.properties +30 -63
  167. package/src/sap/fe/core/messagebundle_pl.properties +31 -64
  168. package/src/sap/fe/core/messagebundle_pt.properties +31 -64
  169. package/src/sap/fe/core/messagebundle_pt_PT.properties +30 -63
  170. package/src/sap/fe/core/messagebundle_ro.properties +30 -63
  171. package/src/sap/fe/core/messagebundle_ru.properties +30 -63
  172. package/src/sap/fe/core/messagebundle_sh.properties +30 -63
  173. package/src/sap/fe/core/messagebundle_sk.properties +30 -63
  174. package/src/sap/fe/core/messagebundle_sl.properties +32 -65
  175. package/src/sap/fe/core/messagebundle_sv.properties +30 -63
  176. package/src/sap/fe/core/messagebundle_th.properties +30 -63
  177. package/src/sap/fe/core/messagebundle_tr.properties +30 -63
  178. package/src/sap/fe/core/messagebundle_uk.properties +31 -64
  179. package/src/sap/fe/core/messagebundle_vi.properties +31 -64
  180. package/src/sap/fe/core/messagebundle_zh_CN.properties +30 -63
  181. package/src/sap/fe/core/messagebundle_zh_TW.properties +31 -64
  182. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +6 -3
  183. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -9
  184. package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
  185. package/src/sap/fe/core/services/NavigationServiceFactory.ts +8 -4
  186. package/src/sap/fe/core/services/RoutingServiceFactory.js +9 -6
  187. package/src/sap/fe/core/services/RoutingServiceFactory.ts +10 -9
  188. package/src/sap/fe/core/services/ShellServicesFactory.js +36 -1
  189. package/src/sap/fe/core/services/ShellServicesFactory.ts +38 -1
  190. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +5 -4
  191. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +34 -36
  192. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  193. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +1 -1
  194. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
  195. package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
  196. package/src/sap/fe/core/templating/FilterHelper.js +4 -4
  197. package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
  198. package/src/sap/fe/core/templating/PropertyHelper.js +58 -35
  199. package/src/sap/fe/core/templating/PropertyHelper.ts +19 -4
  200. package/src/sap/fe/core/templating/UIFormatters.js +16 -5
  201. package/src/sap/fe/core/templating/UIFormatters.ts +14 -5
  202. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  203. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  204. package/src/sap/fe/core/AnnotationHelper.js +0 -331
  205. package/src/sap/fe/core/AnnotationHelper.ts +0 -321
  206. package/src/sap/fe/core/RouterProxy.js +0 -938
  207. package/src/sap/fe/core/TransactionHelper.js +0 -1577
  208. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -406
  209. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -146
  210. package/src/sap/fe/core/actions/draft.js +0 -665
  211. package/src/sap/fe/core/actions/messageHandling.js +0 -579
  212. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  213. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  214. package/src/sap/fe/core/actions/operations.js +0 -1096
  215. package/src/sap/fe/core/actions/sticky.js +0 -130
  216. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  217. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync", "sap/fe/core/actions/collaboration/CollaborationCommon", "sap/fe/core/actions/draft", "sap/fe/core/BusyLocker", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/fe/templates/Feedback", "sap/ui/core/Core", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/odata/v4/ODataListBinding"], function (Log, ActivitySync, CollaborationCommon, draft, BusyLocker, CommonUtils, ClassSupport, EditState, ModelHelper, SemanticKeyHelper, FELibrary, Feedback, Core, coreLibrary, Message, ControllerExtension, OverrideExecution, ODataListBinding) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/fe/templates/Feedback", "sap/ui/core/Core", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/odata/v4/ODataListBinding"], function (Log, CommonUtils, BusyLocker, ActivitySync, CollaborationCommon, draft, ClassSupport, EditState, ModelHelper, SemanticKeyHelper, FELibrary, Feedback, Core, coreLibrary, Message, ControllerExtension, OverrideExecution, ODataListBinding) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _class, _class2;
@@ -31,6 +31,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
31
31
  return result;
32
32
  }
33
33
 
34
+ function _finallyRethrows(body, finalizer) {
35
+ try {
36
+ var result = body();
37
+ } catch (e) {
38
+ return finalizer(true, e);
39
+ }
40
+
41
+ if (result && result.then) {
42
+ return result.then(finalizer.bind(null, false), finalizer.bind(null, true));
43
+ }
44
+
45
+ return finalizer(false, result);
46
+ }
47
+
34
48
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
35
49
 
36
50
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
@@ -82,6 +96,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
82
96
 
83
97
  var transactionHelper = _this2._getTransactionHelper();
84
98
 
99
+ var oRootViewController = _this2._getRootViewController();
100
+
101
+ var rightmostContext;
102
+
85
103
  var _temp6 = _catch(function () {
86
104
  return Promise.resolve(_this2.base.editFlow.onBeforeEdit({
87
105
  context: oContext
@@ -89,9 +107,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
89
107
  return Promise.resolve(transactionHelper.editDocument(oContext, _this2.getView(), _this2._getMessageHandler())).then(function (oNewDocumentContext) {
90
108
  var sProgrammingModel = _this2._getProgrammingModel(oContext);
91
109
 
92
- if (sProgrammingModel === ProgrammingModel.Sticky) {
93
- _this2._getInternalModel().setProperty("/sessionOn", true);
94
- }
110
+ _this2._setStickySessionInternalProperties(sProgrammingModel, oContext.getModel());
95
111
 
96
112
  var _temp4 = function () {
97
113
  if (oNewDocumentContext) {
@@ -113,11 +129,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
113
129
 
114
130
  var _contextToNavigate = oNewDocumentContext;
115
131
 
116
- var oRootViewController = _this2._getRootViewController();
117
-
118
132
  var _temp9 = function () {
119
- if (oRootViewController.isFclEnabled()) {
120
- return Promise.resolve(_this2._computeSiblingInformation(oContext, oRootViewController.getRightmostContext(), sProgrammingModel)).then(function (siblingInfo) {
133
+ if (_this2._isFclEnabled()) {
134
+ rightmostContext = oRootViewController.getRightmostContext();
135
+ return Promise.resolve(_this2._computeSiblingInformation(oContext, rightmostContext, sProgrammingModel, true)).then(function (siblingInfo) {
121
136
  var _siblingInfo;
122
137
 
123
138
  siblingInfo = (_siblingInfo = siblingInfo) !== null && _siblingInfo !== void 0 ? _siblingInfo : _this2._createSiblingInfo(oContext, oNewDocumentContext);
@@ -189,7 +204,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
189
204
  return this._syncTask(function () {
190
205
  if (originalBindingContext) {
191
206
  transactionHelper.handleDocumentModifications();
192
- EditState.setEditStateDirty();
207
+
208
+ if (!_this3._isFclEnabled()) {
209
+ EditState.setEditStateDirty();
210
+ }
193
211
 
194
212
  if (bIsDraft) {
195
213
  _this3._setDraftStatus(DraftStatus.Saving);
@@ -211,9 +229,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
211
229
  if (aSemanticKeys && aSemanticKeys.length) {
212
230
  var oCurrentSemanticMapping = _this3._getSemanticMapping(),
213
231
  sCurrentSemanticPath = oCurrentSemanticMapping && oCurrentSemanticMapping.semanticPath,
214
- sChangedPath = SemanticKeyHelper.getSemanticPath(oBindingContext, true);
232
+ sChangedPath = SemanticKeyHelper.getSemanticPath(oBindingContext, true); // sCurrentSemanticPath could be null if we have navigated via deep link then there are no semanticMappings to calculate it from
233
+
215
234
 
216
- if (sCurrentSemanticPath !== sChangedPath) {
235
+ if (sCurrentSemanticPath && sCurrentSemanticPath !== sChangedPath) {
217
236
  return _this3._handleNewContext(oBindingContext, true, false, true).then(function () {
218
237
  _this3._setDraftStatus(DraftStatus.Saved);
219
238
  });
@@ -268,8 +287,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
268
287
  var transactionHelper = this._getTransactionHelper(),
269
288
  oLockObject = this._getGlobalUIModel();
270
289
 
271
- var oTable;
272
- var iCountTableItems = 0;
290
+ var oTable; //should be Table but there are missing methods into the def
291
+
273
292
  var mParameters = mInParameters;
274
293
 
275
294
  var oResourceBundle = this._getResourceBundle();
@@ -422,7 +441,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
422
441
  }
423
442
 
424
443
  var oModel = oListBinding.getModel();
425
- iCountTableItems = oListBinding.iMaxLength || 0;
426
444
  var sCreationMode = mParameters.creationMode;
427
445
  return Promise.resolve(_this4._getProgrammingModel(oListBinding)).then(function (programmingModel) {
428
446
  sProgrammingModel = programmingModel;
@@ -590,14 +608,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
590
608
  break;
591
609
  }
592
610
 
593
- if (sProgrammingModel === ProgrammingModel.Sticky) {
594
- _this4._getInternalModel().setProperty("/sessionOn", true);
595
- }
596
-
597
611
  var bIsNewPageCreation = mParameters.creationMode !== CreationMode.CreationRow && mParameters.creationMode !== CreationMode.Inline;
598
612
 
599
613
  if (oCreation) {
600
614
  return Promise.all([oCreation, oNavigation]).then(function (aParams) {
615
+ _this4._setStickySessionInternalProperties(sProgrammingModel, oModel);
616
+
601
617
  if (bIsNewPageCreation) {
602
618
  _this4._setEditMode(EditMode.Editable, bIsNewPageCreation);
603
619
  } else {
@@ -607,7 +623,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
607
623
  var oNewDocumentContext = aParams[0];
608
624
 
609
625
  if (oNewDocumentContext) {
610
- EditState.setEditStateDirty();
626
+ if (!_this4._isFclEnabled()) {
627
+ EditState.setEditStateDirty();
628
+ }
611
629
 
612
630
  _this4._sendActivity(Activity.Create, oNewDocumentContext);
613
631
 
@@ -616,7 +634,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
616
634
  }
617
635
  }
618
636
  }).catch(function (oError) {
619
- if (oError && (oError.navigateBackFromTransientState || oError == Constants.CancelActionDialog)) {
637
+ if (oError && (oError.navigateBackFromTransientState || oError == Constants.CancelActionDialog || oError.canceled || oError.rejectedItems && oError.rejectedItems[0].canceled)) {
620
638
  oRoutingListener.navigateBackFromTransientState();
621
639
  }
622
640
 
@@ -628,20 +646,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
628
646
  if (oTable && oTable.isA("sap.ui.mdc.Table")) {
629
647
  var fnFocusOrScroll = mParameters.creationMode === CreationMode.Inline ? oTable.focusRow.bind(oTable) : oTable.scrollToIndex.bind(oTable);
630
648
  oTable.getRowBinding().attachEventOnce("change", function () {
631
- switch (mParameters.createAtEnd) {
632
- case true:
633
- if (oTable.data("tableType") === "ResponsiveTable" && oTable.getThreshold()) {
634
- fnFocusOrScroll(oTable.getThreshold(), true);
635
- } else {
636
- fnFocusOrScroll(iCountTableItems, true);
637
- }
638
-
639
- break;
640
-
641
- case false:
642
- fnFocusOrScroll(0, true);
643
- break;
644
- }
649
+ fnFocusOrScroll(mParameters.createAtEnd ? oTable.getRowBinding().getLength() : 0, true);
645
650
  });
646
651
  }
647
652
 
@@ -801,11 +806,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
801
806
  return Promise.resolve(transactionHelper.saveDocument(oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, _this6._getMessageHandler())).then(function (activeDocumentContext) {
802
807
  _this6._removeContextsFromPages();
803
808
 
804
- if (sProgrammingModel === ProgrammingModel.Sticky) {
805
- _this6._getInternalModel().setProperty("/sessionOn", false);
806
-
807
- _this6._handleStickyOff();
808
- }
809
+ _this6._removeStickySessionInternalProperties(sProgrammingModel);
809
810
 
810
811
  _this6._sendActivity(Activity.Activate, activeDocumentContext);
811
812
 
@@ -848,7 +849,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
848
849
  var _temp11 = function () {
849
850
  if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) && oRootViewController.isFclEnabled()) {
850
851
  // No need to try to get rightmost context in case of a new object
851
- return Promise.resolve(_this6._computeSiblingInformation(oContext, oRootViewController.getRightmostContext(), sProgrammingModel)).then(function (_this5$_computeSiblin) {
852
+ return Promise.resolve(_this6._computeSiblingInformation(oContext, oRootViewController.getRightmostContext(), sProgrammingModel, true)).then(function (_this5$_computeSiblin) {
852
853
  siblingInfo = _this5$_computeSiblin;
853
854
  });
854
855
  }
@@ -860,7 +861,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
860
861
  });
861
862
  });
862
863
  }, function (oError) {
863
- Log.error("Error while saving the document", oError);
864
+ if (!(oError && oError.canceled)) {
865
+ Log.error("Error while saving the document", oError);
866
+ }
867
+
864
868
  return Promise.reject(oError);
865
869
  }));
866
870
  } catch (e) {
@@ -892,7 +896,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
892
896
  var oRootViewController = _this8._getRootViewController();
893
897
 
894
898
  var oRightmostContext = oRootViewController.isFclEnabled() ? oRootViewController.getRightmostContext() : oContext;
895
- return Promise.resolve(_this8._computeSiblingInformation(oContext, oRightmostContext, ProgrammingModel.Draft)).then(function (siblingInfo) {
899
+ return Promise.resolve(_this8._computeSiblingInformation(oContext, oRightmostContext, ProgrammingModel.Draft, false)).then(function (siblingInfo) {
896
900
  return function () {
897
901
  if (siblingInfo) {
898
902
  _this8._setEditMode(bEditable ? EditMode.Editable : EditMode.Display, false); //switch to edit mode only if a draft is available
@@ -965,22 +969,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
965
969
 
966
970
  _this10._removeContextsFromPages();
967
971
 
968
- if (sProgrammingModel === ProgrammingModel.Sticky) {
969
- _this10._getInternalModel().setProperty("/sessionOn", false);
970
-
971
- _this10._handleStickyOff();
972
- }
973
-
974
- _this10._sendActivity(Activity.Discard, oActiveDocumentContext);
972
+ _this10._removeStickySessionInternalProperties(sProgrammingModel);
975
973
 
976
974
  _this10._setEditMode(EditMode.Display, false);
977
975
 
978
- _this10._setDraftStatus(DraftStatus.Clear);
976
+ _this10._setDraftStatus(DraftStatus.Clear); // we force the edit state even for FCL because the draft discard might not be implemented
977
+ // and we may just delete the draft
978
+
979
979
 
980
+ EditState.setEditStateDirty();
980
981
  return function () {
981
982
  if (!oActiveDocumentContext) {
982
- //in case of a new document, no activeContext is returned --> navigate back.
983
- EditState.setEditStateDirty();
983
+ _this10._sendActivity(Activity.Discard, undefined); //in case of a new document, no activeContext is returned --> navigate back.
984
+
984
985
 
985
986
  var _temp16 = function () {
986
987
  if (!mInParameters.skipBackNavigation) {
@@ -990,9 +991,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
990
991
 
991
992
  if (_temp16 && _temp16.then) return _temp16.then(function () {});
992
993
  } else {
994
+ _this10._sendActivity(Activity.Discard, oActiveDocumentContext);
995
+
993
996
  var _contextToNavigate3 = oActiveDocumentContext;
994
997
 
995
- if (oRootViewController.isFclEnabled()) {
998
+ if (_this10._isFclEnabled()) {
996
999
  var _siblingInfo4;
997
1000
 
998
1001
  _siblingInfo3 = (_siblingInfo4 = _siblingInfo3) !== null && _siblingInfo4 !== void 0 ? _siblingInfo4 : _this10._createSiblingInfo(oContext, oActiveDocumentContext);
@@ -1032,12 +1035,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1032
1035
 
1033
1036
  var sProgrammingModel = _this10._getProgrammingModel(oContext);
1034
1037
 
1035
- var oRootViewController = _this10._getRootViewController();
1036
-
1037
1038
  var _temp14 = function () {
1038
- if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) && oRootViewController.isFclEnabled()) {
1039
- // No need to try to get rightmost context in case of a new object
1040
- return Promise.resolve(_this10._computeSiblingInformation(oContext, oRootViewController.getRightmostContext(), sProgrammingModel)).then(function (_this9$_computeSiblin) {
1039
+ if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) && _this10._isFclEnabled()) {
1040
+ var _oRootViewController = _this10._getRootViewController(); // No need to try to get rightmost context in case of a new object
1041
+
1042
+
1043
+ return Promise.resolve(_this10._computeSiblingInformation(oContext, _oRootViewController.getRightmostContext(), sProgrammingModel, true)).then(function (_this9$_computeSiblin) {
1041
1044
  _siblingInfo3 = _this9$_computeSiblin;
1042
1045
  });
1043
1046
  }
@@ -1073,7 +1076,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1073
1076
  var _this11 = this;
1074
1077
 
1075
1078
  var oAppComponent = CommonUtils.getAppComponent(this.getView());
1076
- var sPath = oContext.getPath();
1077
1079
  var mParameters = mInParameters;
1078
1080
 
1079
1081
  if (!mParameters) {
@@ -1088,9 +1090,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1088
1090
  return this._deleteDocumentTransaction(oContext, mParameters).then(function () {
1089
1091
  // Single objet deletion is triggered from an OP header button (not from a list)
1090
1092
  // --> Mark UI dirty and navigate back to dismiss the OP
1091
- EditState.setEditStateDirty();
1093
+ if (!_this11._isFclEnabled()) {
1094
+ EditState.setEditStateDirty();
1095
+ }
1092
1096
 
1093
- _this11._sendActivity(Activity.Delete, sPath);
1097
+ _this11._sendActivity(Activity.Delete, oContext);
1094
1098
 
1095
1099
  _this11._getRoutingListener().navigateBackFromContext(oContext); // After delete is successfull, we need to dettch the setBackNavigation Methods
1096
1100
 
@@ -1115,21 +1119,36 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1115
1119
  ;
1116
1120
 
1117
1121
  _proto.applyDocument = function applyDocument(oContext) {
1118
- var _this12 = this;
1122
+ try {
1123
+ var _this13 = this;
1119
1124
 
1120
- var oLockObject = this._getGlobalUIModel();
1125
+ var oLockObject = _this13._getGlobalUIModel();
1121
1126
 
1122
- BusyLocker.lock(oLockObject);
1123
- return this._submitOpenChanges(oContext) // check if there are any validation/parse errors
1124
- .then(this._checkForValidationErrors.bind(this, oContext)).then(function () {
1125
- _this12._getMessageHandler().showMessageDialog();
1127
+ BusyLocker.lock(oLockObject);
1126
1128
 
1127
- _this12._getRoutingListener().navigateBackFromContext(oContext);
1128
- }).finally(function () {
1129
- if (BusyLocker.isLocked(oLockObject)) {
1130
- BusyLocker.unlock(oLockObject);
1131
- }
1132
- });
1129
+ var _temp18 = _finallyRethrows(function () {
1130
+ return Promise.resolve(_this13._syncTask()).then(function () {
1131
+ return Promise.resolve(_this13._submitOpenChanges(oContext)).then(function () {
1132
+ return Promise.resolve(_this13._checkForValidationErrors()).then(function () {
1133
+ return Promise.resolve(_this13._getMessageHandler().showMessageDialog()).then(function () {
1134
+ return Promise.resolve(_this13._getRoutingListener().navigateBackFromContext(oContext)).then(function () {});
1135
+ });
1136
+ });
1137
+ });
1138
+ });
1139
+ }, function (_wasThrown, _result8) {
1140
+ if (BusyLocker.isLocked(oLockObject)) {
1141
+ BusyLocker.unlock(oLockObject);
1142
+ }
1143
+
1144
+ if (_wasThrown) throw _result8;
1145
+ return _result8;
1146
+ });
1147
+
1148
+ return Promise.resolve(_temp18 && _temp18.then ? _temp18.then(function () {}) : void 0);
1149
+ } catch (e) {
1150
+ return Promise.reject(e);
1151
+ }
1133
1152
  } // Internal only params ---
1134
1153
  // @param {boolean} [mParameters.bStaticAction] Boolean value for static action, undefined for other actions
1135
1154
  // @param {boolean} [mParameters.isNavigable] Boolean value indicating whether navigation is required after the action has been executed
@@ -1156,7 +1175,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1156
1175
  ;
1157
1176
 
1158
1177
  _proto.invokeAction = function invokeAction(sActionName, mInParameters, mExtraParams) {
1159
- var _this13 = this;
1178
+ var _this14 = this;
1160
1179
 
1161
1180
  var oControl;
1162
1181
 
@@ -1265,14 +1284,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1265
1284
  // if the returned context for the bound action is different than the context on which action was called,
1266
1285
  // refresh the corresponding list binding
1267
1286
  if (mParameters.contexts) {
1268
- return _this13._refreshListIfRequired(_this13._getActionResponseDataAndKeys(sActionName, oResponse), mParameters.contexts[0]).then(function () {
1287
+ return _this14._refreshListIfRequired(_this14._getActionResponseDataAndKeys(sActionName, oResponse), mParameters.contexts[0]).then(function () {
1269
1288
  return oResponse;
1270
1289
  });
1271
1290
  }
1272
1291
  }).then(function (oResponse) {
1273
- _this13._sendActivity(Activity.Action, mParameters.contexts);
1292
+ _this14._sendActivity(Activity.Action, mParameters.contexts);
1274
1293
 
1275
- _this13._triggerConfiguredSurvey(sActionName, triggerType.action);
1294
+ _this14._triggerConfiguredSurvey(sActionName, triggerType.action);
1276
1295
 
1277
1296
  if (oCurrentActionCallBacks) {
1278
1297
  oCurrentActionCallBacks.fResolver(oResponse);
@@ -1292,9 +1311,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1292
1311
 
1293
1312
 
1294
1313
  if (mParameters.contexts) {
1295
- EditState.setEditStateDirty();
1314
+ if (!_this14._isFclEnabled()) {
1315
+ EditState.setEditStateDirty();
1316
+ }
1296
1317
 
1297
- _this13._getInternalModel().setProperty("/sCustomAction", sActionName);
1318
+ _this14._getInternalModel().setProperty("/sCustomAction", sActionName);
1298
1319
  }
1299
1320
 
1300
1321
  if (mParameters.isNavigable) {
@@ -1312,7 +1333,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1312
1333
 
1313
1334
  if (sContextMetaPath != undefined && sContextMetaPath === sActionContextMetaPath) {
1314
1335
  if (oActionContext.getPath() !== vContext.getPath()) {
1315
- _this13._getRoutingListener().navigateForwardToContext(vContext, {
1336
+ _this14._getRoutingListener().navigateForwardToContext(vContext, {
1316
1337
  noHistoryEntry: false
1317
1338
  });
1318
1339
  } else {
@@ -1329,7 +1350,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1329
1350
  if (err == Constants.CancelActionDialog) {
1330
1351
  return Promise.reject("Dialog cancelled.");
1331
1352
  } else {
1332
- return Promise.reject("Error in EditFlow.invokeAction:" + err);
1353
+ if (!(err && (err.canceled || err.rejectedItems && err.rejectedItems[0].canceled))) {
1354
+ return Promise.reject("Error in EditFlow.invokeAction:" + err);
1355
+ }
1333
1356
  }
1334
1357
  });
1335
1358
  }
@@ -1352,7 +1375,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1352
1375
  ;
1353
1376
 
1354
1377
  _proto.securedExecution = function securedExecution(fnFunction, mParameters) {
1355
- var _this14 = this;
1378
+ var _this15 = this;
1356
1379
 
1357
1380
  var bBusySet = mParameters && mParameters.busy && mParameters.busy.set !== undefined ? mParameters.busy.set : true,
1358
1381
  bBusyCheck = mParameters && mParameters.busy && mParameters.busy.check !== undefined ? mParameters.busy.check : true,
@@ -1378,17 +1401,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1378
1401
 
1379
1402
  return this._syncTask(fnFunction).then(function () {
1380
1403
  if (bUpdatesDocument) {
1381
- _this14._getTransactionHelper().handleDocumentModifications();
1404
+ _this15._getTransactionHelper().handleDocumentModifications();
1382
1405
 
1383
- EditState.setEditStateDirty();
1406
+ if (!_this15._isFclEnabled()) {
1407
+ EditState.setEditStateDirty();
1408
+ }
1384
1409
 
1385
1410
  if (bIsDraft) {
1386
- _this14._setDraftStatus(DraftStatus.Saved);
1411
+ _this15._setDraftStatus(DraftStatus.Saved);
1387
1412
  }
1388
1413
  }
1389
1414
  }).catch(function (oError) {
1390
1415
  if (bUpdatesDocument && bIsDraft) {
1391
- _this14._setDraftStatus(DraftStatus.Clear);
1416
+ _this15._setDraftStatus(DraftStatus.Clear);
1392
1417
  }
1393
1418
 
1394
1419
  return Promise.reject(oError);
@@ -1397,7 +1422,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1397
1422
  BusyLocker.unlock(oLockObject);
1398
1423
  }
1399
1424
 
1400
- return _this14._getMessageHandler().showMessageDialog();
1425
+ return _this15._getMessageHandler().showMessageDialog();
1401
1426
  });
1402
1427
  }
1403
1428
  /**
@@ -1408,19 +1433,50 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1408
1433
  ;
1409
1434
 
1410
1435
  _proto.handlePatchSent = function handlePatchSent(oEvent) {
1411
- // Create a promise that will be resolved or rejected when the path is completed
1412
- var oPatchPromise = new Promise(function (resolve, reject) {
1413
- oEvent.getSource().attachEventOnce("patchCompleted", function (oEvent) {
1414
- var bSuccess = oEvent.getParameter("success");
1436
+ var _this$base$getView, _this$base$getView$ge;
1415
1437
 
1416
- if (bSuccess) {
1417
- resolve();
1418
- } else {
1419
- reject();
1420
- }
1438
+ if (!((_this$base$getView = this.base.getView()) !== null && _this$base$getView !== void 0 && (_this$base$getView$ge = _this$base$getView.getBindingContext("internal")) !== null && _this$base$getView$ge !== void 0 && _this$base$getView$ge.getProperty("skipPatchHandlers"))) {
1439
+ // Create a promise that will be resolved or rejected when the path is completed
1440
+ var oPatchPromise = new Promise(function (resolve, reject) {
1441
+ oEvent.getSource().attachEventOnce("patchCompleted", function (oEvent) {
1442
+ var bSuccess = oEvent.getParameter("success");
1443
+
1444
+ if (bSuccess) {
1445
+ resolve();
1446
+ } else {
1447
+ reject();
1448
+ }
1449
+ });
1421
1450
  });
1422
- });
1423
- this.updateDocument(oEvent.getSource(), oPatchPromise);
1451
+ this.updateDocument(oEvent.getSource(), oPatchPromise);
1452
+ }
1453
+ }
1454
+ /**
1455
+ * Handles the CreateActivate event.
1456
+ *
1457
+ * @param oEvent
1458
+ */
1459
+ ;
1460
+
1461
+ _proto.handleCreateActivate = function handleCreateActivate(oEvent) {
1462
+ var oBinding = oEvent.getSource();
1463
+
1464
+ var transactionHelper = this._getTransactionHelper();
1465
+
1466
+ var bAtEnd = true;
1467
+ var bInactive = true;
1468
+
1469
+ var oResourceBundle = this._getResourceBundle();
1470
+
1471
+ var oParams = {
1472
+ creationMode: CreationMode.Inline,
1473
+ createAtEnd: bAtEnd,
1474
+ inactive: bInactive,
1475
+ keepTransientContextOnFailed: false,
1476
+ // currently not fully supported
1477
+ busyMode: "None"
1478
+ };
1479
+ transactionHelper.createDocument(oBinding, oParams, oResourceBundle, this._getMessageHandler(), false, this.getView());
1424
1480
  } //////////////////////////////////////
1425
1481
  // Private methods
1426
1482
  //////////////////////////////////////
@@ -1510,7 +1566,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1510
1566
  return this.base.getView().getController()._editFlow.getMessageHandler();
1511
1567
  };
1512
1568
 
1513
- _proto._sendActivity = function _sendActivity(action, content) {
1569
+ _proto._sendActivity = function _sendActivity(action, relatedContexts) {
1570
+ var content = Array.isArray(relatedContexts) ? relatedContexts.map(function (context) {
1571
+ return context.getPath();
1572
+ }) : relatedContexts === null || relatedContexts === void 0 ? void 0 : relatedContexts.getPath();
1514
1573
  send(this.getView(), action, content);
1515
1574
  };
1516
1575
 
@@ -1532,20 +1591,36 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1532
1591
  };
1533
1592
 
1534
1593
  _proto._submitOpenChanges = function _submitOpenChanges(oContext) {
1535
- var oModel = oContext.getModel(),
1536
- oLockObject = this._getGlobalUIModel(); //Currently we are using only 1 updateGroupId, hence submitting the batch directly here
1537
-
1594
+ try {
1595
+ var _this17 = this;
1596
+
1597
+ var oModel = oContext.getModel(),
1598
+ oLockObject = _this17._getGlobalUIModel();
1599
+
1600
+ return Promise.resolve(_finallyRethrows(function () {
1601
+ // Submit any leftover changes that are not yet submitted
1602
+ // Currently we are using only 1 updateGroupId, hence submitting the batch directly here
1603
+ return Promise.resolve(oModel.submitBatch("$auto")).then(function () {
1604
+ // Wait for all currently running changes
1605
+ // For the time being we agreed with the v4 model team to use an internal method. We'll replace it once
1606
+ // a public or restricted method was provided
1607
+ return Promise.resolve(oModel.oRequestor.waitForRunningChangeRequests("$auto")).then(function () {
1608
+ if (oModel.hasPendingChanges("$auto")) {
1609
+ throw new Error("submit of open changes failed");
1610
+ }
1611
+ }); // Check if all changes were submitted successfully
1612
+ });
1613
+ }, function (_wasThrown2, _result9) {
1614
+ if (BusyLocker.isLocked(oLockObject)) {
1615
+ BusyLocker.unlock(oLockObject);
1616
+ }
1538
1617
 
1539
- return oModel.submitBatch("$auto").then(function () {
1540
- if (oModel.hasPendingChanges("$auto")) {
1541
- // the submit was not successful
1542
- return Promise.reject("submit of open changes failed");
1543
- }
1544
- }).finally(function () {
1545
- if (BusyLocker.isLocked(oLockObject)) {
1546
- BusyLocker.unlock(oLockObject);
1547
- }
1548
- });
1618
+ if (_wasThrown2) throw _result9;
1619
+ return _result9;
1620
+ }));
1621
+ } catch (e) {
1622
+ return Promise.reject(e);
1623
+ }
1549
1624
  };
1550
1625
 
1551
1626
  _proto._handleStickyOn = function _handleStickyOn(oContext) {
@@ -1564,12 +1639,35 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1564
1639
  return this.base.getView().getController()._editFlow.discardStickySession(oContext);
1565
1640
  };
1566
1641
 
1642
+ _proto._setStickySessionInternalProperties = function _setStickySessionInternalProperties(programmingModel, model) {
1643
+ if (programmingModel === ProgrammingModel.Sticky) {
1644
+ var internalModel = this._getInternalModel();
1645
+
1646
+ internalModel.setProperty("/sessionOn", true);
1647
+ internalModel.setProperty("/stickySessionToken", model.getHttpHeaders(true)["SAP-ContextId"]);
1648
+ }
1649
+ };
1650
+
1651
+ _proto._removeStickySessionInternalProperties = function _removeStickySessionInternalProperties(programmingModel) {
1652
+ if (programmingModel === ProgrammingModel.Sticky) {
1653
+ var internalModel = this._getInternalModel();
1654
+
1655
+ internalModel.setProperty("/sessionOn", false);
1656
+ internalModel.setProperty("/stickySessionToken", undefined);
1657
+
1658
+ this._handleStickyOff();
1659
+ }
1660
+ };
1661
+
1567
1662
  _proto._handleNewContext = function _handleNewContext(oContext, bEditable, bRecreateContext, bDraftNavigation, bForceFocus, bNavigateToSiblingEntity) {
1568
1663
  try {
1569
- var _this16 = this;
1664
+ var _this19 = this;
1570
1665
 
1571
- EditState.setEditStateDirty();
1572
- return Promise.resolve(_this16._getRoutingListener().navigateToContext(oContext, {
1666
+ if (!_this19._isFclEnabled()) {
1667
+ EditState.setEditStateDirty();
1668
+ }
1669
+
1670
+ return Promise.resolve(_this19._getRoutingListener().navigateToContext(oContext, {
1573
1671
  checkNoHashChange: true,
1574
1672
  editable: bEditable,
1575
1673
  bPersistOPScroll: true,
@@ -1601,10 +1699,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1601
1699
  ;
1602
1700
 
1603
1701
  _proto._checkForValidationErrors = function _checkForValidationErrors() {
1604
- var _this17 = this;
1702
+ var _this20 = this;
1605
1703
 
1606
1704
  return this._syncTask().then(function () {
1607
- var sViewId = _this17.base.getView().getId();
1705
+ var sViewId = _this20.base.getView().getId();
1608
1706
 
1609
1707
  var aMessages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
1610
1708
  var oControl;
@@ -1642,7 +1740,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1642
1740
  ;
1643
1741
 
1644
1742
  _proto._refreshListIfRequired = function _refreshListIfRequired(oResponse, oContext) {
1645
- var _this18 = this;
1743
+ var _this21 = this;
1646
1744
 
1647
1745
  if (!oContext || !oResponse || !oResponse.oData) {
1648
1746
  return Promise.resolve();
@@ -1670,7 +1768,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1670
1768
  });
1671
1769
  oBinding.refresh();
1672
1770
  } else {
1673
- var oAppComponent = CommonUtils.getAppComponent(_this18.getView());
1771
+ var oAppComponent = CommonUtils.getAppComponent(_this21.getView());
1674
1772
  oAppComponent.getSideEffectsService().requestSideEffects([{
1675
1773
  $NavigationPropertyPath: oBinding.getPath()
1676
1774
  }], oBinding.getContext()).then(function () {
@@ -1713,7 +1811,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1713
1811
  var aPages = [];
1714
1812
  var oAppComponent = CommonUtils.getAppComponent(this.getView());
1715
1813
 
1716
- if (oAppComponent._isFclEnabled()) {
1814
+ if (this._isFclEnabled()) {
1717
1815
  var oFCL = oAppComponent.getRootContainer();
1718
1816
  aPages = aPages.concat(oFCL.getMidColumnPages() || []);
1719
1817
  aPages = aPages.concat(oFCL.getEndColumnPages() || []);
@@ -1762,6 +1860,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1762
1860
  throw "context found - stop SubSections loop";
1763
1861
  }
1764
1862
 
1863
+ if (oSubSection.getBindingContext() === null) {
1864
+ oSubSection.setBindingContext(undefined);
1865
+ }
1866
+
1765
1867
  var aActions = oSubSection.getAggregation("actions");
1766
1868
  oActionBindingContext = _checkActions(aActions);
1767
1869
  });
@@ -1821,11 +1923,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1821
1923
  * @param {object} rootCurrentContext The context for the root of the draft
1822
1924
  * @param {object} rightmostCurrentContext The context of the sub-object
1823
1925
  * @param {string} sProgrammingModel The programming model
1824
- * @returns {Promise} returns the siblingInformation object
1926
+ * @param {boolean} doNotComputeIfRoot If true, we don't compute siblingInfo if the root and the rightmost contexts are the same
1927
+ * @returns {Promise} Returns the siblingInformation object
1825
1928
  */
1826
1929
  ;
1827
1930
 
1828
- _proto._computeSiblingInformation = function _computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, sProgrammingModel) {
1931
+ _proto._computeSiblingInformation = function _computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, sProgrammingModel, doNotComputeIfRoot) {
1829
1932
  try {
1830
1933
  if (!rightmostCurrentContext.getPath().startsWith(rootCurrentContext.getPath())) {
1831
1934
  // Wrong usage !!
@@ -1833,6 +1936,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1833
1936
  throw new Error("Cannot compute rightmost sibling context");
1834
1937
  }
1835
1938
 
1939
+ if (doNotComputeIfRoot && rightmostCurrentContext.getPath() === rootCurrentContext.getPath()) {
1940
+ return Promise.resolve(undefined);
1941
+ }
1942
+
1836
1943
  var model = rootCurrentContext.getModel();
1837
1944
 
1838
1945
  if (sProgrammingModel === ProgrammingModel.Draft) {
@@ -1850,8 +1957,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync",
1850
1957
  }
1851
1958
  };
1852
1959
 
1960
+ _proto._isFclEnabled = function _isFclEnabled() {
1961
+ return CommonUtils.getAppComponent(this.getView())._isFclEnabled();
1962
+ };
1963
+
1853
1964
  return EditFlow;
1854
1965
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "toggleDraftActive", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "toggleDraftActive"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handlePatchSent", [_dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "handlePatchSent"), _class2.prototype)), _class2)) || _class);
1855
1966
  return EditFlow;
1856
1967
  }, false);
1857
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIk1lc3NhZ2VUeXBlIiwiY29yZUxpYnJhcnkiLCJFZGl0RmxvdyIsImRlZmluZVVJNUNsYXNzIiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImVkaXREb2N1bWVudCIsIm9Db250ZXh0IiwiYkRyYWZ0TmF2aWdhdGlvbiIsInRyYW5zYWN0aW9uSGVscGVyIiwiX2dldFRyYW5zYWN0aW9uSGVscGVyIiwiYmFzZSIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwiY29udGV4dCIsImdldFZpZXciLCJfZ2V0TWVzc2FnZUhhbmRsZXIiLCJvTmV3RG9jdW1lbnRDb250ZXh0Iiwic1Byb2dyYW1taW5nTW9kZWwiLCJfZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIlN0aWNreSIsIl9nZXRJbnRlcm5hbE1vZGVsIiwic2V0UHJvcGVydHkiLCJfc2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsInNob3dNZXNzYWdlRGlhbG9nIiwiX2hhbmRsZU5ld0NvbnRleHQiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsIl9oYW5kbGVTdGlja3lPbiIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiaXNGY2xFbmFibGVkIiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJnZXRSaWdodG1vc3RDb250ZXh0Iiwic2libGluZ0luZm8iLCJfY3JlYXRlU2libGluZ0luZm8iLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJwYXRoTWFwcGluZyIsInRhcmdldENvbnRleHQiLCJnZXRQYXRoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImFDb250ZXh0cyIsIm1QYXJhbWV0ZXJzIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImdldENvbnRyb2xsZXIiLCJfZWRpdEZsb3ciLCJ1cGRhdGVEb2N1bWVudCIsIm9Qcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiYklzRHJhZnQiLCJEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIl9zeW5jVGFzayIsImhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucyIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiX3NldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwib0JpbmRpbmdDb250ZXh0Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0VudGl0eVNldE5hbWUiLCJnZXRNZXRhQ29udGV4dCIsImdldE9iamVjdCIsImFTZW1hbnRpY0tleXMiLCJTZW1hbnRpY0tleUhlbHBlciIsImdldFNlbWFudGljS2V5cyIsImxlbmd0aCIsIm9DdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsInNDdXJyZW50U2VtYW50aWNQYXRoIiwic2VtYW50aWNQYXRoIiwic0NoYW5nZWRQYXRoIiwiZ2V0U2VtYW50aWNQYXRoIiwiU2F2ZWQiLCJDbGVhciIsImNhdGNoIiwiZmluYWxseSIsInNob3dNZXNzYWdlcyIsImNyZWF0ZURvY3VtZW50Iiwidkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9Mb2NrT2JqZWN0IiwiX2dldEdsb2JhbFVJTW9kZWwiLCJvVGFibGUiLCJpQ291bnRUYWJsZUl0ZW1zIiwib1Jlc291cmNlQnVuZGxlIiwiX2dldFJlc291cmNlQnVuZGxlIiwiYlNob3VsZEJ1c3lMb2NrIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lIiwiQ3JlYXRpb25Sb3ciLCJFeHRlcm5hbCIsIm9FeGVjQ3VzdG9tVmFsaWRhdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJvQ29udHJvbGxlciIsInNDcmVhdGVQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJoYW5kbGVycyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm91dGJvdW5kIiwidW5kZWZpbmVkIiwiY3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dPYmplY3RzIiwiZ2V0UGFyZW50IiwidmFsaWRhdGVEb2N1bWVudCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInRhYmxlSWQiLCJieUlkIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJvTGlzdEJpbmRpbmciLCJvQ3JlYXRpb25Qcm9taXNlIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsImFWYWxpZGF0aW9uTWVzc2FnZXMiLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwibUN1c3RvbVZhbGlkaXR5IiwiZ2V0UHJvcGVydHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJhQ3VzdG9tTWVzc2FnZXMiLCJvRmllbGRDb250cm9sIiwic1RhcmdldCIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmb3JFYWNoIiwib01lc3NhZ2UiLCJjb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJvVmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiZ2V0Q29udHJvbCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImZpbHRlciIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsInByb2Nlc3NvciIsInR5cGUiLCJFcnJvciIsInRlY2huaWNhbCIsInBlcnNpc3RlbnQiLCJhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImN1c3RvbU1lc3NhZ2VzIiwiQnVzeUxvY2tlciIsImxvY2siLCJPRGF0YUxpc3RCaW5kaW5nIiwiU3luYyIsImNyZWF0ZUF0RW5kIiwib01vZGVsIiwiaU1heExlbmd0aCIsInNDcmVhdGlvbk1vZGUiLCJwcm9ncmFtbWluZ01vZGVsIiwiTmV3UGFnZSIsImlzUmVsYXRpdmUiLCJzUGF0aCIsInNOZXdBY3Rpb24iLCJhUGFyYW1ldGVycyIsIkRlZmVycmVkIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRIZWFkZXJDb250ZXh0IiwiYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsIkFzeW5jIiwib0NyZWF0aW9uIiwibUFyZ3MiLCJvQ3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dDb250ZXh0Iiwib1ZhbGlkYXRpb25DaGVjayIsIm9QYXlsb2FkIiwib1JvdXRpbmdMaXN0ZW5lciIsIl9nZXRSb3V0aW5nTGlzdGVuZXIiLCJPYmplY3QiLCJrZXlzIiwic1Byb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsIl9oYW5kbGVDcmVhdGVFdmVudHMiLCJwYXJlbnRDb250cm9sIiwiYmVmb3JlQ3JlYXRlQ2FsbEJhY2siLCJvbkJlZm9yZUNyZWF0ZSIsIm9OYXZpZ2F0aW9uIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiYkRlZmVycmVkQ29udGV4dCIsImVkaXRhYmxlIiwiYkZvcmNlRm9jdXMiLCJhc3luY0NvbnRleHQiLCJjcmVhdGVBY3Rpb24iLCJ0cmFuc2llbnQiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm9DcmVhdGlvblJvd0xpc3RCaW5kaW5nIiwiZ2V0QmluZGluZyIsImJTa2lwU2lkZUVmZmVjdHMiLCJvTmV3VHJhbnNpZW50Q29udGV4dCIsImNyZWF0ZSIsInNldEJpbmRpbmdDb250ZXh0IiwidHJhY2UiLCJkZWxldGUiLCJpc0xvY2tlZCIsInVubG9jayIsInJlamVjdCIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImFsbCIsImFQYXJhbXMiLCJfc2VuZEFjdGl2aXR5IiwiQWN0aXZpdHkiLCJDcmVhdGUiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJpc0EiLCJmbkZvY3VzT3JTY3JvbGwiLCJmb2N1c1JvdyIsImJpbmQiLCJzY3JvbGxUb0luZGV4IiwiZ2V0Um93QmluZGluZyIsImF0dGFjaEV2ZW50T25jZSIsImdldFRocmVzaG9sZCIsIm9uQmVmb3JlU2F2ZSIsIm9uQmVmb3JlRGlzY2FyZCIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJhY3RpdmVEb2N1bWVudENvbnRleHQiLCJfcmVtb3ZlQ29udGV4dHNGcm9tUGFnZXMiLCJfaGFuZGxlU3RpY2t5T2ZmIiwiQWN0aXZhdGUiLCJfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJzdGFuZGFyZEFjdGlvbnMiLCJzYXZlIiwidHJpZ2dlclR5cGUiLCJzdGFuZGFyZEFjdGlvbiIsIkRpc3BsYXkiLCJ0b2dnbGVEcmFmdEFjdGl2ZSIsIm9Db250ZXh0RGF0YSIsImJFZGl0YWJsZSIsIklzQWN0aXZlRW50aXR5IiwiSGFzQWN0aXZlRW50aXR5IiwiSGFzRHJhZnRFbnRpdHkiLCJvUmlnaHRtb3N0Q29udGV4dCIsImxhc3RTZW1hbnRpY01hcHBpbmciLCJ0ZWNobmljYWxQYXRoIiwidGFyZ2V0UGF0aCIsIm5ld1BhdGgiLCJvbGRQYXRoIiwiY2FuY2VsRG9jdW1lbnQiLCJjYW5jZWxCdXR0b24iLCJjb250cm9sIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiRGlzY2FyZCIsInNraXBCYWNrTmF2aWdhdGlvbiIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwiX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMiLCJza2lwQmluZGluZ1RvVmlldyIsImRlbGV0ZURvY3VtZW50IiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsIl9kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwiRGVsZXRlIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiYXBwbHlEb2N1bWVudCIsImludm9rZUFjdGlvbiIsInNBY3Rpb25OYW1lIiwibUV4dHJhUGFyYW1zIiwib0NvbnRyb2wiLCJvQ3VycmVudENvbnRyb2wiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJvVmlldyIsIkFycmF5IiwiaXNBcnJheSIsImFyZ3VtZW50cyIsImNvbnRleHRzIiwibW9kZWwiLCJpc05hdmlnYWJsZSIsInJlcXVpcmVzTmF2aWdhdGlvbiIsImNvbnRyb2xJZCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiaW5kZXhPZiIsInNwbGl0IiwicmVwbGFjZUFsbCIsImJTdGF0aWNBY3Rpb24iLCJpc1RhYmxlQm91bmQiLCJzQmluZGluZ1BhdGgiLCJwYXRoIiwic1RhYmxlQ29udGV4dEVudGl0eVR5cGUiLCJvQWN0aW9uT3ZlcmxvYWRDb250ZXh0IiwiX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21TdWJTZWN0aW9ucyIsImVuYWJsZUF1dG9TY3JvbGwiLCJfY3JlYXRlQWN0aW9uUHJvbWlzZSIsInNJZCIsImJHZXRCb3VuZENvbnRleHQiLCJfZ2V0Qm91bmRDb250ZXh0IiwiYk9iamVjdFBhZ2UiLCJnZXRWaWV3RGF0YSIsImNvbnZlcnRlclR5cGUiLCJjYWxsQWN0aW9uIiwib1Jlc3BvbnNlIiwiX3JlZnJlc2hMaXN0SWZSZXF1aXJlZCIsIl9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiQWN0aW9uIiwiYWN0aW9uIiwiZlJlc29sdmVyIiwidkNvbnRleHQiLCJzQ29udGV4dE1ldGFQYXRoIiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwibm9IaXN0b3J5RW50cnkiLCJpbmZvIiwiZXJyIiwiZlJlamVjdG9yIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiaGFuZGxlUGF0Y2hTZW50Iiwib0V2ZW50Iiwib1BhdGNoUHJvbWlzZSIsImdldFNvdXJjZSIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwic0VkaXRNb2RlIiwiYkNyZWF0aW9uTW9kZSIsInNldEVkaXRNb2RlIiwic0RyYWZ0U3RhdGUiLCJzZXREcmFmdFN0YXR1cyIsImdldFJvdXRpbmdMaXN0ZW5lciIsImdldEdsb2JhbFVJTW9kZWwiLCJ2VGFzayIsInN5bmNUYXNrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJvQmluZGluZyIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsImdldFRyYW5zYWN0aW9uSGVscGVyIiwiZ2V0SW50ZXJuYWxNb2RlbCIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInNDb250cm9sSWQiLCJjcmVhdGVBY3Rpb25Qcm9taXNlIiwiX2dldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJfZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImdldE1lc3NhZ2VIYW5kbGVyIiwiY29udGVudCIsInNlbmQiLCJ0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJzdWJtaXRCYXRjaCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiaGFuZGxlU3RpY2t5T24iLCJoYW5kbGVTdGlja3lPZmYiLCJfb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJfZGlzY2FyZFN0aWNreVNlc3Npb24iLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImJSZWNyZWF0ZUNvbnRleHQiLCJiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiYlBlcnNpc3RPUFNjcm9sbCIsInNob3dQbGFjZWhvbGRlciIsImtlZXBDdXJyZW50TGF5b3V0IiwidmlldyIsInBhcmFtcyIsInZpZXdMZXZlbCIsImJSZWZyZXNoQWZ0ZXJBY3Rpb24iLCJzVmlld0lkIiwiZ2V0SWQiLCJhTWVzc2FnZXMiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJpIiwidmFsaWRhdGlvbiIsImdldENvbnRyb2xJZCIsIm9EYXRhIiwiYUtleXMiLCJvQ3VycmVudERhdGEiLCJiUmV0dXJuZWRDb250ZXh0SXNTYW1lIiwiZXZlcnkiLCJzS2V5IiwiaXNSb290IiwicmVmcmVzaCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0Q29udGV4dCIsImFSZXF1ZXN0UHJvbWlzZXMiLCJtYXAiLCJvS2V5IiwicmVxdWVzdE9iamVjdCIsIiRQcm9wZXJ0eVBhdGgiLCJhUGFnZXMiLCJfaXNGY2xFbmFibGVkIiwib0ZDTCIsImdldFJvb3RDb250YWluZXIiLCJjb25jYXQiLCJnZXRNaWRDb2x1bW5QYWdlcyIsImdldEVuZENvbHVtblBhZ2VzIiwib05hdkNvbnRhaW5lciIsImdldFBhZ2VzIiwib1BhZ2UiLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsIl9jaGVja0FjdGlvbnMiLCJhQWN0aW9ucyIsIm9BY3Rpb25CaW5kaW5nQ29udGV4dCIsIm9BY3Rpb24iLCJfY2hlY2tTdWJTZWN0aW9ucyIsImFTdWJTZWN0aW9ucyIsIm9TdWJTZWN0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJjdXJyZW50Q29udGV4dCIsIm5ld0NvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJzdGFydHNXaXRoIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ2pCTyxrQkFBZ0JBLElBQWhCLEVBQXNCQyxPQUF0QixFQUErQjtBQUNyQyxRQUFJO0FBQ0gsVUFBSUMsTUFBTSxHQUFHRixJQUFJLEVBQWpCO0FBQ0EsS0FGRCxDQUVFLE9BQU1HLENBQU4sRUFBUztBQUNWLGFBQU9GLE9BQU8sQ0FBQ0UsQ0FBRCxDQUFkO0FBQ0E7O0FBQ0QsUUFBSUQsTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQXJCLEVBQTJCO0FBQzFCLGFBQU9GLE1BQU0sQ0FBQ0UsSUFBUCxDQUFZLEtBQUssQ0FBakIsRUFBb0JILE9BQXBCLENBQVA7QUFDQTs7QUFDRCxXQUFPQyxNQUFQO0FBQ0E7Ozs7Ozs7O0FBL2hCRCxNQUFNRyxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBL0I7QUFBQSxNQUNDRSxnQkFBZ0IsR0FBR0QsU0FB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UixLQUFLLENBQUMwSixXQUFOLENBQWtCSix1QkFBdUIsQ0FBQ3RhLE9BQXhCLEVBQWxCLEVBQXFEMmEsZUFBckQsRUFEVDtBQUVON2EsWUFBQUEsV0FBVyxFQUFFO0FBRlAsV0FBUDtBQUlBO0FBQ0QsTzs7Ozs7O0lBaHREcUI4YSxtQjtTQW10RFJwZCxRIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBGbGV4aWJsZUNvbHVtbkxheW91dCBmcm9tIFwic2FwL2YvRmxleGlibGVDb2x1bW5MYXlvdXRcIjtcbmltcG9ydCB7IHNlbmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgQWN0aXZpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCBkcmFmdCwgeyBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9kcmFmdFwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyLCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgc3RhbmRhcmRBY3Rpb25zLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSwgdHJpZ2dlclR5cGUgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9GZWVkYmFja1wiO1xuaW1wb3J0IE5hdkNvbnRhaW5lciBmcm9tIFwic2FwL20vTmF2Q29udGFpbmVyXCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlLFxuXHRQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0TWVzc2FnZVR5cGUgPSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0cHJpdmF0ZSBmbkRpcnR5U3RhdGVQcm92aWRlcj86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXQ/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBtUGF0Y2hQcm9taXNlcz86IGFueTtcblx0cHJpdmF0ZSBfZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2VkaXREb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudChvQ29udGV4dCwgdGhpcy5nZXRWaWV3KCksIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuX2dldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gb05ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHRydWUsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgc3RpY2t5T24gaGFuZGxlciBtdXN0IGJlIHNldCBhZnRlciB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiBkb25lLFxuXHRcdFx0XHRcdFx0Ly8gYXMgdGhlIFVSTCBtYXkgY2hhbmdlIGluIHRoZSBjYXNlIG9mIEZDTFxuXHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T24ob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBlZGl0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKGFDb250ZXh0czogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGVcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHMsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgYW5kIGRpc3BsYXlzIHRoZSBlcnJvciBtZXNzYWdlcyBpZiB0aGVyZSBhcmUgZXJyb3JzIGR1cmluZyBhbiB1cGRhdGUuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgdXBkYXRlZCBmaWVsZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1Byb21pc2UgUHJvbWlzZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhlIGRyYWZ0IHN0YXR1cyBjYW4gYmUgdXBkYXRlZC5cblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSBkcmFmdCBzdGF0dXMgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjdXBkYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0dXBkYXRlRG9jdW1lbnQob0NvbnRleHQ6IG9iamVjdCwgb1Byb21pc2U6IFByb21pc2U8YW55Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBvcmlnaW5hbEJpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBiSXNEcmFmdCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKCkgPT4ge1xuXHRcdFx0aWYgKG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dHJhbnNhY3Rpb25IZWxwZXIuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCk7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXG5cdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdHJldHVybiBvUHJvbWlzZVxuXHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRcdC8vIEluIHRoYXQgY2FzZSwgd2Ugc2hvdWxkbid0IGRvIGFueXRoaW5nXG5cdFx0XHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0aWYgKGJJc0RyYWZ0ICYmIG9CaW5kaW5nQ29udGV4dCAmJiBvQmluZGluZ0NvbnRleHQgPT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdHNFbnRpdHlTZXROYW1lID0gKG9NZXRhTW9kZWwgYXMgYW55KS5nZXRNZXRhQ29udGV4dChvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdFx0XHRcdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0XHRcdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvQ3VycmVudFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpLFxuXHRcdFx0XHRcdFx0XHRcdFx0c0N1cnJlbnRTZW1hbnRpY1BhdGggPSBvQ3VycmVudFNlbWFudGljTWFwcGluZyAmJiBvQ3VycmVudFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRzQ2hhbmdlZFBhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0JpbmRpbmdDb250ZXh0LCB0cnVlKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChzQ3VycmVudFNlbWFudGljUGF0aCAhPT0gc0NoYW5nZWRQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlTmV3Q29udGV4dChvQmluZGluZ0NvbnRleHQsIHRydWUsIGZhbHNlLCB0cnVlKS50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoYklzRHJhZnQgJiYgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgU3luYyAtIHRoZSBjcmVhdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQsIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQXN5bmMgLSB0aGUgY3JlYXRpb24gYW5kIHRoZSBuYXZpZ2F0aW9uIHRvIHRoZSBpbnN0YW5jZSBhcmUgZG9uZSBpbiBwYXJhbGxlbFxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZCAtIHRoZSBjcmVhdGlvbiBpcyBkb25lIG9uIHRoZSB0YXJnZXQgcGFnZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBDcmVhdGlvblJvdyAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSBhc3luYyBzbyB0aGUgdXNlciBpcyBub3QgYmxvY2tlZFxuXHQvLyBtUGFyYW1ldGVycy5jcmVhdGlvblJvdyBJbnN0YW5jZSBvZiB0aGUgY3JlYXRpb24gcm93IC0gKFRPRE86IGdldCByaWQgYnV0IHVzZSBsaXN0IGJpbmRpbmdzIG9ubHkpXG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcGFyYW1cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nfHN0cmluZ30gdkxpc3RCaW5kaW5nICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIHttYXB9IG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdCAqICAgICAgICAgICAgICAgICAgICBOZXdQYWdlIC0gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgaXMgc2hvd24gaW4gYSBuZXcgcGFnZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgbWV0YWRhdGEgJ1N5bmMnLCAnQXN5bmMnIG9yICdEZWZlcnJlZCcgaXMgdXNlZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgSW5saW5lIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIChpbiBhIHRhYmxlKVxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgdmlhIHRoZSBwYXJhbWV0ZXIgJ291dGJvdW5kJ1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgU3BlY2lmaWVzIGlmIHRoZSBuZXcgZW50cnkgc2hvdWxkIGJlIGNyZWF0ZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgYSB0YWJsZSBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnSW5saW5lJ1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY3JlYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Y3JlYXRlRG9jdW1lbnQoXG5cdFx0dkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRsZXQgb1RhYmxlOiBUYWJsZTtcblx0XHRsZXQgaUNvdW50VGFibGVJdGVtcyA9IDA7XG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3QgYlNob3VsZEJ1c3lMb2NrID1cblx0XHRcdCFtUGFyYW1ldGVycyB8fFxuXHRcdFx0KG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJlxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJlxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCk7XG5cdFx0bGV0IG9FeGVjQ3VzdG9tVmFsaWRhdGlvbiA9IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnJlbW92ZUlBcHBTdGF0ZUtleSgpO1xuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKSB7XG5cdFx0XHQvLyBDcmVhdGUgYnkgbmF2aWdhdGluZyB0byBhbiBleHRlcm5hbCB0YXJnZXRcblx0XHRcdC8vIFRPRE86IENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKGN1cnJlbnRseSB1c2luZyB0aGUgc2FtZSBhcyBmb3Igb3V0Ym91bmQgY2hldnJvbiBuYXYsIGFuZCB3aXRob3V0IGFueSBjb250ZXh0IC0gM3JkIHBhcmFtKVxuXHRcdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKCkudGhlbigoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLFxuXHRcdFx0XHRcdHNDcmVhdGVQYXRoID0gTW9kZWxIZWxwZXIuZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHRoaXMuZ2V0VmlldygpLCB2TGlzdEJpbmRpbmcpO1xuXG5cdFx0XHRcdChvQ29udHJvbGxlciBhcyBhbnkpLmhhbmRsZXJzLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlciwgbVBhcmFtZXRlcnMub3V0Ym91bmQsIHVuZGVmaW5lZCwgc0NyZWF0ZVBhdGgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93KSB7XG5cdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3dPYmplY3RzID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRPYmplY3QoKTtcblx0XHRcdGRlbGV0ZSBvQ3JlYXRpb25Sb3dPYmplY3RzW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdG9UYWJsZSA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldFBhcmVudCgpO1xuXHRcdFx0b0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gdHJhbnNhY3Rpb25IZWxwZXIudmFsaWRhdGVEb2N1bWVudChcblx0XHRcdFx0b1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkYXRhOiBvQ3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogKG9UYWJsZS5nZXRDcmVhdGlvblJvdygpIGFzIGFueSkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0VmlldygpXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIGlzIHNldCB0byBmYWxzZSBpbiBtYW5pZmVzdCBjb252ZXJ0ZXIgKFRhYmxlLnRzKSBpZiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gZXhpc3RzXG5cdFx0XHRpZiAoKG9UYWJsZS5nZXRDcmVhdGlvblJvdygpIGFzIGFueSkuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUgJiYgbVBhcmFtZXRlcnMudGFibGVJZCkge1xuXHRcdFx0b1RhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nfSBvTGlzdEJpbmRpbmdcblx0XHQgKiBAcGFyYW0ge29iamVjdH0gb0NyZWF0aW9uUHJvbWlzZVxuXHRcdCAqL1xuXHRcdGNvbnN0IGhhbmRsZVNpZGVFZmZlY3RzID0gKG9MaXN0QmluZGluZzogYW55LCBvQ3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KSA9PiB7XG5cdFx0XHRvQ3JlYXRpb25Qcm9taXNlXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvTmV3Q29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KG9MaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYVZhbGlkYXRpb25NZXNzYWdlcyBFcnJvciBtZXNzYWdlcyBmcm9tIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0Y29uc3QgY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gb1RhYmxlICYmIChvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKSBhcyBhbnkpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0XHRjb25zdCBtQ3VzdG9tVmFsaWRpdHkgPSBvVGFibGUgJiYgb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IGFDdXN0b21NZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvRmllbGRDb250cm9sO1xuXHRcdFx0bGV0IHNUYXJnZXQ6IHN0cmluZztcblxuXHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9NZXNzYWdlLmNvZGUgPT09IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0YVZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChvVmFsaWRhdGlvbk1lc3NhZ2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBIYW5kbGUgQm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdGlmIChvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldCkge1xuXHRcdFx0XHRcdG9GaWVsZENvbnRyb2wgPSBDb3JlLmdldENvbnRyb2wobUN1c3RvbVZhbGlkaXR5W29WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRcdHNUYXJnZXQgPSBvRmllbGRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKSArIFwiL1wiICsgb0ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpO1xuXHRcdFx0XHRcdC8vIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2UgaWYgc3RpbGwgbm90IGV4aXN0c1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NZXNzYWdlLnRhcmdldCA9PT0gc1RhcmdldDtcblx0XHRcdFx0XHRcdFx0fSkubGVuZ3RoID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXIuYWRkTWVzc2FnZXMoXG5cdFx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiBvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yOiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcdFx0XHRcdFx0XHRcdGNvZGU6IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0dGVjaG5pY2FsOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRwZXJzaXN0ZW50OiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHNUYXJnZXRcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIEFkZCBjb250cm9sSWQgaW4gb3JkZXIgdG8gZ2V0IHRoZSBmb2N1cyBoYW5kbGluZyBvZiB0aGUgZXJyb3IgcG9wb3ZlciBydW5hYmxlXG5cdFx0XHRcdFx0Y29uc3QgYUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzID0gb01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NZXNzYWdlLnRhcmdldCA9PT0gc1RhcmdldDtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlc1swXS5hZGRDb250cm9sSWQobUN1c3RvbVZhbGlkaXR5W29WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKTtcblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBVbmJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFDdXN0b21NZXNzYWdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdGNvZGU6IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHR0ZXh0OiBvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3Jcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChhQ3VzdG9tTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRjdXN0b21NZXNzYWdlczogYUN1c3RvbU1lc3NhZ2VzXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRiU2hvdWxkQnVzeUxvY2sgJiYgQnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2sob0V4ZWNDdXN0b21WYWxpZGF0aW9uKVxuXHRcdFx0LnRoZW4oKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoYVZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Y3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKGFWYWxpZGF0aW9uTWVzc2FnZXMpO1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkN1c3RvbSBWYWxpZGF0aW9uIGZhaWxlZFwiKTtcblx0XHRcdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBzUHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nO1xuXHRcdFx0XHRsZXQgb0xpc3RCaW5kaW5nOiBhbnk7XG5cblx0XHRcdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0XHRpZiAodkxpc3RCaW5kaW5nICYmIHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHQvLyB3ZSBhbHJlYWR5IGdldCBhIGxpc3QgYmluZGluZyB1c2UgdGhpcyBvbmVcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHZMaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLlN5bmM7XG5cdFx0XHRcdFx0ZGVsZXRlIG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRcdFx0aUNvdW50VGFibGVJdGVtcyA9IG9MaXN0QmluZGluZy5pTWF4TGVuZ3RoIHx8IDA7XG5cdFx0XHRcdGNvbnN0IHNDcmVhdGlvbk1vZGUgPSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGU7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9MaXN0QmluZGluZykpXG5cdFx0XHRcdFx0LnRoZW4oKHByb2dyYW1taW5nTW9kZWw6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPSBwcm9ncmFtbWluZ01vZGVsO1xuXHRcdFx0XHRcdFx0aWYgKHNDcmVhdGlvbk1vZGUgJiYgc0NyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHRcdFx0XHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc0NyZWF0aW9uTW9kZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0XHRcdC8vIE5ld0FjdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTmF2aWdhdGlvblByb3BlcnR5IGNvbGxlY3Rpb25cblx0XHRcdFx0XHRcdFx0aWYgKCFvTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc1BhdGggPSBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBhYnNlbmNlIG9mIE5ld0FjdGlvbiBvciBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLCBjcmVhdGlvbiBpcyBhc3luY1xuXHRcdFx0XHRcdFx0XHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChzUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNOZXdBY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIgKyBzTmV3QWN0aW9uICsgXCIvQCR1aTUub3ZlcmxvYWQvMC8kUGFyYW1ldGVyXCIpIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gYmluZGluZyBwYXJhbWV0ZXIgKGVnOiBfaXQpIGlzIG5vdCBjb25zaWRlcmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYVBhcmFtZXRlcnMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IENvbW1vblV0aWxzLmdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyhcblx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdHNNZXRhUGF0aCxcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRpZiAoYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnRoZW4oKHNDcmVhdGlvbk1vZGU6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IG9DcmVhdGlvbjogYW55O1xuXHRcdFx0XHRcdFx0bGV0IG1BcmdzOiBhbnk7XG5cdFx0XHRcdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3cgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdztcblx0XHRcdFx0XHRcdGxldCBvQ3JlYXRpb25Sb3dDb250ZXh0OiBhbnk7XG5cdFx0XHRcdFx0XHRsZXQgb1ZhbGlkYXRpb25DaGVjayA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0bGV0IG9QYXlsb2FkOiBhbnk7XG5cdFx0XHRcdFx0XHRsZXQgc01ldGFQYXRoOiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1JvdXRpbmdMaXN0ZW5lciA9IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpO1xuXG5cdFx0XHRcdFx0XHRpZiAoc0NyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkRlZmVycmVkKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0XHRcdFx0XHRvQ3JlYXRpb25Sb3dDb250ZXh0ID0gb0NyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ3JlYXRpb25Sb3dDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gcHJlZmlsbCBkYXRhIGZyb20gY3JlYXRpb24gcm93XG5cdFx0XHRcdFx0XHRcdFx0b1BheWxvYWQgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEgPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRPYmplY3Qua2V5cyhvUGF5bG9hZCkuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHkgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9cIiArIHNQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gZW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5LiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFbc1Byb3BlcnR5UGF0aF0gPSBvUGF5bG9hZFtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRvVmFsaWRhdGlvbkNoZWNrID0gdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKC8qb0NyZWF0aW9uUm93Q29udGV4dCovKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAoc0NyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93IHx8IHNDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUpIHtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID0gXCJMb2NhbFwiO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHRcdFx0XHRcdFx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlQ3JlYXRlRXZlbnRzKG9MaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRvQ3JlYXRpb24gPSBvVmFsaWRhdGlvbkNoZWNrLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxldCBvTmF2aWdhdGlvbjtcblx0XHRcdFx0XHRcdHN3aXRjaCAoc0NyZWF0aW9uTW9kZSkge1xuXHRcdFx0XHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5EZWZlcnJlZDpcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9MaXN0QmluZGluZywge1xuXHRcdFx0XHRcdFx0XHRcdFx0YkRlZmVycmVkQ29udGV4dDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQXN5bmM6XG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFzeW5jQ29udGV4dDogb0NyZWF0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5TeW5jOlxuXHRcdFx0XHRcdFx0XHRcdG1BcmdzID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG1QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0bUFyZ3MudHJhbnNpZW50ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvQ3JlYXRpb24udGhlbihmdW5jdGlvbiAob05ld0RvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVUb01lc3NhZ2VQYWdlKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfRURJVEZMT1dfU0FQRkVfQ1JFQVRJT05fRkFJTEVEX0RFU0NSSVBUSU9OXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQsIG1BcmdzKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuSW5saW5lOlxuXHRcdFx0XHRcdFx0XHRcdGhhbmRsZVNpZGVFZmZlY3RzKG9MaXN0QmluZGluZywgb0NyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zeW5jVGFzayhvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0XHRcdFx0XHQvLyB0aGUgY3JlYXRpb24gcm93IHNoYWxsIGJlIGNsZWFyZWQgb25jZSB0aGUgdmFsaWRhdGlvbiBjaGVjayB3YXMgc3VjY2Vzc2Z1bCBhbmRcblx0XHRcdFx0XHRcdFx0XHQvLyB0aGVyZWZvcmUgdGhlIFBPU1QgY2FuIGJlIHNlbnQgYXN5bmMgdG8gdGhlIGJhY2tlbmRcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9WYWxpZGF0aW9uQ2hlY2tcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldEJpbmRpbmcoKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJTa2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRoYW5kbGVTaWRlRWZmZWN0cyhvTGlzdEJpbmRpbmcsIG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3VHJhbnNpZW50Q29udGV4dCA9IG9DcmVhdGlvblJvd0xpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQob05ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9OZXdUcmFuc2llbnRDb250ZXh0LmNyZWF0ZWQoKS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DcmVhdGlvblJvd0NvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKG9FcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFJlc2V0IGJ1c3kgaW5kaWNhdG9yIGFmdGVyIGEgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkNyZWF0aW9uUm93IG5hdmlnYXRpb24gZXJyb3I6IFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBQcm9taXNlLnJlamVjdChcIlVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgXCIgKyBzQ3JlYXRpb25Nb2RlKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIHRydWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29uc3QgYklzTmV3UGFnZUNyZWF0aW9uID1cblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0XHRcdFx0aWYgKG9DcmVhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW29DcmVhdGlvbiwgb05hdmlnYXRpb25dKVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKChhUGFyYW1zOiBbYW55LCBhbnldKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYklzTmV3UGFnZUNyZWF0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCBiSXNOZXdQYWdlQ3JlYXRpb24pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dCA9IGFQYXJhbXNbMF07XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgb05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9oYW5kbGVTdGlja3lPbihvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9FcnJvciAmJiAob0Vycm9yLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSB8fCBvRXJyb3IgPT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAob1RhYmxlICYmIG9UYWJsZS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZm5Gb2N1c09yU2Nyb2xsID1cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSA/IG9UYWJsZS5mb2N1c1Jvdy5iaW5kKG9UYWJsZSkgOiBvVGFibGUuc2Nyb2xsVG9JbmRleC5iaW5kKG9UYWJsZSk7XG5cdFx0XHRcdFx0b1RhYmxlLmdldFJvd0JpbmRpbmcoKS5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0c3dpdGNoIChtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCkge1xuXHRcdFx0XHRcdFx0XHRjYXNlIHRydWU6XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9UYWJsZS5kYXRhKFwidGFibGVUeXBlXCIpID09PSBcIlJlc3BvbnNpdmVUYWJsZVwiICYmIG9UYWJsZS5nZXRUaHJlc2hvbGQoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm5Gb2N1c09yU2Nyb2xsKG9UYWJsZS5nZXRUaHJlc2hvbGQoKSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZuRm9jdXNPclNjcm9sbChpQ291bnRUYWJsZUl0ZW1zLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgZmFsc2U6XG5cdFx0XHRcdFx0XHRcdFx0Zm5Gb2N1c09yU2Nyb2xsKDAsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJTaG91bGRCdXN5TG9jayAmJiBCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ1NhdmUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdTYXZlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBzYXZlZC5cblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVTYXZlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlU2F2ZShtUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnQ3JlYXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHttYXB9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuY29udGV4dFBhdGggUGF0aCBwb2ludGluZyB0byB0aGUgY29udGV4dCBvbiB3aGljaCBDcmVhdGUgYWN0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBtUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVDcmVhdGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25CZWZvcmVDcmVhdGUobVBhcmFtZXRlcnM/OiB7IGNvbnRleHRQYXRoPzogc3RyaW5nOyBjcmVhdGVQYXJhbWV0ZXJzPzogYW55W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRWRpdCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdFZGl0JyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBtUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVFZGl0XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlRWRpdChtUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGlzY2FyZCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBtUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlRGlzY2FyZChtUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGVsZXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBtUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVEZWxldGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25CZWZvcmVEZWxldGUobVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgSW5kaWNhdGVzIHdoZXRoZXIgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBpZ25vcmVkIHdoZW4gdXNlciBjbGlja3Mgb24gU2F2ZSBkdXJpbmcgYW4gSW5saW5lIGNyZWF0aW9uXG5cdC8vIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5iaW5kaW5ncyBMaXN0IGJpbmRpbmdzIG9mIHRoZSB0YWJsZXMgaW4gdGhlIHZpZXcuXG5cdC8vIEJvdGggb2YgdGhlIGFib3ZlIHBhcmFtZXRlcnMgYXJlIGZvciB0aGUgc2FtZSBwdXJwb3NlLiBVc2VyIGNhbiBlbnRlciBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBjcmVhdGlvbiByb3cocykgYnV0IGRvZXMgbm90ICdBZGQgcm93JywgaW5zdGVhZCBjbGlja3MgU2F2ZS5cblx0Ly8gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgaW4gdGhlIHZpZXcuXG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcGFyYW1cblx0LyoqXG5cdCAqIFNhdmVzIGEgbmV3IGRvY3VtZW50IGFmdGVyIGNoZWNraW5nIGl0LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3NhdmVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSB0aGlzLl9nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3N5bmNUYXNrKCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZVNhdmUoeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblxuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiZcblx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLCBzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLnNhdmVEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IsXG5cdFx0XHRcdGFCaW5kaW5ncyxcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy5fcmVtb3ZlQ29udGV4dHNGcm9tUGFnZXMoKTtcblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuX2hhbmRsZVN0aWNreU9mZigvKm9Db250ZXh0Ki8pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzdGFuZGFyZEFjdGlvbnMuc2F2ZSwgdHJpZ2dlclR5cGUuc3RhbmRhcmRBY3Rpb24pO1xuXG5cdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdGlmIChhY3RpdmVEb2N1bWVudENvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IGFjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IGFjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdH1cblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgYkVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRiRWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRiRWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQpO1xuXHRcdFx0aWYgKHNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKGJFZGl0YWJsZSA/IEVkaXRNb2RlLkVkaXRhYmxlIDogRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpOyAvL3N3aXRjaCB0byBlZGl0IG1vZGUgb25seSBpZiBhIGRyYWZ0IGlzIGF2YWlsYWJsZVxuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBvQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSBzaWJsaW5nSW5mby5wYXRoTWFwcGluZ1tzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IGxhc3RTZW1hbnRpY01hcHBpbmchLnNlbWFudGljUGF0aCwgbmV3UGF0aDogdGFyZ2V0UGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LCBiRWRpdGFibGUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlIC0gQ2Fubm90IGZpbmQgc2libGluZ1wiKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdCgoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZTpcIiArIG9FcnJvcikgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzYXAubS5CdXR0b259IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiAtIEN1cnJlbnRseSB0aGlzIGlzIHBhc3NlZCBhcyBjYW5jZWxCdXR0b24gaW50ZXJuYWxseSAocmVwbGFjZWQgYnkgbVBhcmFtZXRlcnMuY29udHJvbCBpbiB0aGUgSlNEb2MgYmVsb3cpLiBDdXJyZW50bHkgaXQgaXMgYWxzbyBtYW5kYXRvcnkuXG5cdC8vIFBsYW4gLSBUaGlzIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5LiBJZiBub3QgcHJvdmlkZWQsIHdlIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBhY3QgYXMgcmVmZXJlbmNlIGNvbnRyb2wgZm9yIHRoZSBkaXNjYXJkIHBvcG92ZXIgT1Igd2UgY2FuIHNob3cgYSBkaWFsb2cgaW5zdGVhZCBvZiBhIHBvcG92ZXIuXG5cblx0LyoqXG5cdCAqIERpc2NhcmQgdGhlIGVkaXRhYmxlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0ge21hcH0gbVBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuY29udHJvbCBUaGlzIGlzIHRoZSBjb250cm9sIHVzZWQgdG8gb3BlbiB0aGUgZGlzY2FyZCBwb3BvdmVyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBhbmQgYWxsb3dzIGN1c3RvbSBoYW5kbGluZ1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIGVkaXRhYmxlIGRvY3VtZW50IGhhcyBiZWVuIGRpc2NhcmRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY2FuY2VsRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiB7IGNvbnRyb2w6IG9iamVjdDsgc2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbiB9KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBtSW5QYXJhbWV0ZXJzOiBhbnkgPSBtUGFyYW1ldGVycztcblx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblxuXHRcdG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uID0gbVBhcmFtZXRlcnMuY29udHJvbCB8fCBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbjtcblx0XHRtSW5QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGlzY2FyZDtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSwgc1Byb2dyYW1taW5nTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FuY2VsRG9jdW1lbnQoXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLFxuXHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKClcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblxuXHRcdFx0dGhpcy5fcmVtb3ZlQ29udGV4dHNGcm9tUGFnZXMoKTtcblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuX2hhbmRsZVN0aWNreU9mZigvKm9Db250ZXh0Ki8pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cblx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0aWYgKCFvQWN0aXZlRG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdGlmICghbUluUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIHNlbWFudGljIGtleXMgb2YgdGhlIGFjdGl2ZSBjb250ZXh0LCBhcyB3ZSBuZWVkIHRoZW1cblx0XHRcdFx0XHQvLyBmb3IgdGhlIG5hdmlnYXRpb25cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdC8vIFdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIG9mIHRoZSBjb250ZXh0LCBzbyB0aGF0IGl0J3MgY3JlYXRlZCBhbmQgYm91bmQgaW4gdGhlIHNhbWUgbWljcm90YXNrLFxuXHRcdFx0XHRcdC8vIHNvIHRoYXQgYWxsIHByb3BlcnRpZXMgYXJlIGxvYWRlZCB0b2dldGhlciBieSBhdXRvRXhwYW5kU2VsZWN0LCBzbyB0aGF0IHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gRWRpdCBtb2RlXG5cdFx0XHRcdFx0Ly8gJCRpbmhlcml0RXhwYW5kU2VsZWN0IHRha2VzIGFsbCBsb2FkZWQgcHJvcGVydGllcyBpbnRvIGFjY291bnQgKEJDUCAyMDcwNDYyMjY1KVxuXHRcdFx0XHRcdGlmICghbUluUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldykge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIHRydWUsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly9hY3RpdmUgY29udGV4dCBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGNhbmNlbCBvZiBleGlzdGluZyBkb2N1bWVudFxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBFbnRpdHlTZXQgdG8gd2hpY2ggdGhlIG9iamVjdCBiZWxvbmdzXG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgdGhlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNkZWxldGVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbUluUGFyYW1ldGVyczogeyB0aXRsZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRjb25zdCBzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnM7XG5cdFx0aWYgKCFtUGFyYW1ldGVycykge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gZmFsc2U7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdHJldHVybiB0aGlzLl9kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycylcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Ly8gU2luZ2xlIG9iamV0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGFuIE9QIGhlYWRlciBidXR0b24gKG5vdCBmcm9tIGEgbGlzdClcblx0XHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgc1BhdGgpO1xuXG5cdFx0XHRcdHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0Ly8gQWZ0ZXIgZGVsZXRlIGlzIHN1Y2Nlc3NmdWxsLCB3ZSBuZWVkIHRvIGRldHRjaCB0aGUgc2V0QmFja05hdmlnYXRpb24gTWV0aG9kc1xuXHRcdFx0XHRpZiAob0FwcENvbXBvbmVudCkge1xuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0IHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGFuZCBuYXZpZ2F0ZSBiYWNrLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjYXBwbHlEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhcHBseURvY3VtZW50KG9Db250ZXh0OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdHJldHVybiAoXG5cdFx0XHR0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dClcblx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSB2YWxpZGF0aW9uL3BhcnNlIGVycm9yc1xuXHRcdFx0XHQudGhlbih0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMuYmluZCh0aGlzLCBvQ29udGV4dCkpXG5cdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRcdFx0dGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbl0gQm9vbGVhbiB2YWx1ZSBmb3Igc3RhdGljIGFjdGlvbiwgdW5kZWZpbmVkIGZvciBvdGhlciBhY3Rpb25zXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlXSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0Ly8gQ3VycmVudGx5IHRoZSBwYXJhbWV0ZXIgaXNOYXZpZ2FibGUgaXMgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG91bGQgYmUgY2hhbmdlZCB0byByZXF1aXJlc05hdmlnYXRpb24gYXMgaXQgaXMgYSBtb3JlIGFwdCBuYW1lIGZvciB0aGlzIHBhcmFtXG5cblx0LyoqXG5cdCAqIEludm9rZXMgYW4gYWN0aW9uIChib3VuZCBvciB1bmJvdW5kKSBhbmQgdHJhY2tzIHRoZSBjaGFuZ2VzIHNvIHRoYXQgb3RoZXIgcGFnZXMgY2FuIGJlIHJlZnJlc2hlZCBhbmQgc2hvdyB0aGUgdXBkYXRlZCBkYXRhIHVwb24gbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG1JblBhcmFtZXRlcnMuY29udGV4dHMgRm9yIGEgYm91bmQgYWN0aW9uLCBhIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWQgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBtSW5QYXJhbWV0ZXJzLm1vZGVsIEZvciBhbiB1bmJvdW5kIGFjdGlvbiwgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWwgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG1JblBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gTmF2aWdhdGlvbiB0YWtlcyBwbGFjZSB0byB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtSW5QYXJhbWV0ZXJzLmxhYmVsIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlIGFjdGlvbiBoYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGRpYWxvZyBpcyBzaG93biB0byB0aGUgdXNlci4gVGhlIGxhYmVsIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYW5kIGZvciB0aGUgY29uZmlybWF0aW9uIGJ1dHRvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbUluUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2ludm9rZUFjdGlvblxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICogQGZpbmFsXG5cdCAqKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGludm9rZUFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRjb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W107XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRtRXh0cmFQYXJhbXM/OiBhbnlcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG9Db250cm9sOiBhbnk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGxldCBvQ3VycmVudENvbnRyb2w7XG5cdFx0bGV0IG9CaW5kaW5nQ29udGV4dDtcblx0XHRsZXQgYVBhcnRzO1xuXHRcdGxldCBzT3ZlcmxvYWRFbnRpdHlUeXBlO1xuXHRcdGxldCBvQ3VycmVudEFjdGlvbkNhbGxCYWNrczogYW55O1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnMgfHwge307XG5cblx0XHQvLyBEdWUgdG8gYSBtaXN0YWtlIHRoZSBpbnZva2VBY3Rpb24gaW4gdGhlIGV4dGVuc2lvbkFQSSBoYWQgYSBkaWZmZXJlbnQgQVBJIHRoYW4gdGhpcyBvbmUuXG5cdFx0Ly8gVGhlIG9uZSBmcm9tIHRoZSBleHRlbnNpb25BUEkgZG9lc24ndCBleGlzdCBhbnltb3JlIGFzIHdlIGV4cG9zZSB0aGUgZnVsbCBlZGl0IGZsb3cgbm93IGJ1dFxuXHRcdC8vIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IHRoZSBvbGQgc2lnbmF0dXJlXG5cdFx0aWYgKChtUGFyYW1ldGVycy5pc0EgJiYgbVBhcmFtZXRlcnMuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHx8IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMpIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcblx0XHRcdGNvbnN0IGNvbnRleHRzID0gbVBhcmFtZXRlcnM7XG5cdFx0XHRtUGFyYW1ldGVycyA9IG1FeHRyYVBhcmFtcyB8fCB7fTtcblx0XHRcdGlmIChjb250ZXh0cykge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IGNvbnRleHRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMubW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlID0gbVBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIHx8IG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlO1xuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0b0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoaXMgc2VsZWN0ZWQgY29udGV4dHMgdXBkYXRlIGlzIGRvbmUgd2l0aGluIHRoZSBvcGVyYXRpb24sIHNob3VsZCBiZSBtb3ZlZCBvdXRcblx0XHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluZGV4T2YoXCIoXCIpID4gLTEpIHtcblx0XHRcdC8vIGdldCBlbnRpdHkgdHlwZSBvZiBhY3Rpb24gb3ZlcmxvYWQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBhY3Rpb24gcGF0aFxuXHRcdFx0Ly8gRXhhbXBsZSBzQWN0aW9uTmFtZSA9IFwiPEFjdGlvbk5hbWU+KENvbGxlY3Rpb24oPE92ZXJsb2FkRW50aXR5VHlwZT4pKVwiXG5cdFx0XHQvLyBzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXSAtLT4gPEFjdGlvbk5hbWU+XG5cdFx0XHQvLyBzT3ZlcmxvYWRFbnRpdHlUeXBlID0gYVBhcnRzWzJdIC0tPiA8T3ZlcmxvYWRFbnRpdHlUeXBlPlxuXHRcdFx0YVBhcnRzID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpO1xuXHRcdFx0c0FjdGlvbk5hbWUgPSBhUGFydHNbMF07XG5cdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlID0gKGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0gYXMgYW55KS5yZXBsYWNlQWxsKFwiKVwiLCBcIlwiKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbikge1xuXHRcdFx0aWYgKG9Db250cm9sLmlzVGFibGVCb3VuZCgpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0NvbnRyb2wuZ2V0Um93QmluZGluZygpLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGF0aCA9IG9Db250cm9sLmRhdGEoXCJyb3dzQmluZGluZ0luZm9cIikucGF0aCxcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KSh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLCBzQmluZGluZ1BhdGgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IHNUYWJsZUNvbnRleHRFbnRpdHlUeXBlID0gbVBhcmFtZXRlcnMuY29udGV4dHNcblx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRNZXRhQ29udGV4dChtUGFyYW1ldGVycy5jb250ZXh0cy5nZXRQYXRoKCkpXG5cdFx0XHRcdFx0LmdldE9iamVjdChcIiRUeXBlXCIpO1xuXHRcdFx0XHRpZiAoc092ZXJsb2FkRW50aXR5VHlwZSAhPT0gc1RhYmxlQ29udGV4dEVudGl0eVR5cGUpIHtcblx0XHRcdFx0XHQvLyBzZWFyY2ggZm9yIGNvbnRleHQgaW4gY29udHJvbCB0cmVlIGhpZXJhcmNoeVxuXHRcdFx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9Db250cm9sO1xuXHRcdFx0XHRcdHdoaWxlIChvQ3VycmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCA9IG9DdXJyZW50Q29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQgJiZcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQob0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiJFR5cGVcIikgPT09XG5cdFx0XHRcdFx0XHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0JpbmRpbmdDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIGNoZWNrIHBhcmVudFxuXHRcdFx0XHRcdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ3VycmVudENvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIGNvbnRleHQgd2FzIG5vdCBmb3VuZCBpbiBVSSBoaWVyYXJjaHkgZ29pbmcgc3RyYWlnaHQgdXB3YXJkcyAtIHRyeSB0byBmaW5kIGl0IGluIFN1YlNlY3Rpb25zXG5cdFx0XHRcdFx0aWYgKCFvQ3VycmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25PdmVybG9hZENvbnRleHQgPSB0aGlzLl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tU3ViU2VjdGlvbnMob0NvbnRyb2wsIHNPdmVybG9hZEVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25PdmVybG9hZENvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9BY3Rpb25PdmVybG9hZENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQ29udGV4dCBub3QgZm91bmQgZm9yIGVudGl0eSB0eXBlIFwiICsgc092ZXJsb2FkRW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5fY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgb0NvbnRyb2wuc0lkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCA9IHRoaXMuX2dldEJvdW5kQ29udGV4dChvVmlldywgbVBhcmFtZXRlcnMpO1xuXHRcdC8vIE5lZWQgdG8ga25vdyB0aGF0IHRoZSBhY3Rpb24gaXMgY2FsbGVkIGZyb20gT2JqZWN0UGFnZSBmb3IgY2hhbmdlU2V0IElzb2xhdGVkIHdvcmthcm91bmRcblx0XHRtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSA9IChvVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuY29udmVydGVyVHlwZSA9PT0gXCJPYmplY3RQYWdlXCI7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKClcblx0XHRcdC50aGVuKHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24uYmluZCh0cmFuc2FjdGlvbkhlbHBlciwgc0FjdGlvbk5hbWUsIG1QYXJhbWV0ZXJzLCB0aGlzLmdldFZpZXcoKSwgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSkpXG5cdFx0XHQudGhlbigob1Jlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gaWYgdGhlIHJldHVybmVkIGNvbnRleHQgZm9yIHRoZSBib3VuZCBhY3Rpb24gaXMgZGlmZmVyZW50IHRoYW4gdGhlIGNvbnRleHQgb24gd2hpY2ggYWN0aW9uIHdhcyBjYWxsZWQsXG5cdFx0XHRcdC8vIHJlZnJlc2ggdGhlIGNvcnJlc3BvbmRpbmcgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0XHRcdFx0XHR0aGlzLl9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0XHQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9SZXNwb25zZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKChvUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aW9uLCBtUGFyYW1ldGVycy5jb250ZXh0cyk7XG5cdFx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lLCB0cmlnZ2VyVHlwZS5hY3Rpb24pO1xuXG5cdFx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZXNvbHZlcihvUmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8qXG5cdFx0XHRcdFx0IFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0IFRPRE86IGdldCByaWQgb2YgdGhpcyB3b3JrYXJvdW5kXG5cdFx0XHRcdFx0IFRoaXMgd29ya2Fyb3VuZCBpcyBvbmx5IG5lZWRlZCBhcyBsb25nIGFzIHRoZSBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzeW5jaHJvbml6YXRpb24uXG5cdFx0XHRcdFx0IE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0IGlzIGFscmVhZHkgcmVmcmVzaGVkIChpdCdzIGp1c3Qgbm90IHJlZmxlY3RlZCBpbiB0aGUgb2JqZWN0IHBhZ2UpXG5cdFx0XHRcdFx0IHdlIGV4cGxpY2l0bHkgZG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoZSBsaXN0IHJlcG9ydCBidXQgb25seSBjYWxsIGl0IGZyb20gdGhlIG9iamVjdCBwYWdlXG5cdFx0XHRcdFx0IGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHQgd2UgY2FuIGxpdmUgd2l0aCB0aGlzXG5cdFx0XHRcdFx0IHdlIG5lZWQgYSBjb250ZXh0IHRvIHNldCB0aGUgdXBwZXIgcGFnZXMgdG8gZGlydHkgLSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB3ZSB1c2UgdGhlXG5cdFx0XHRcdFx0IGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRcdGxldCB2Q29udGV4dCA9IG9SZXNwb25zZTtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHR2Q29udGV4dCA9IHZDb250ZXh0WzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHZDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICE9PSB2Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQodkNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vSGlzdG9yeUVudHJ5OiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyID09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJEaWFsb2fCoGNhbmNlbGxlZC5cIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiRXJyb3IgaW4gRWRpdEZsb3cuaW52b2tlQWN0aW9uOlwiICsgZXJyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5idXN5LmNoZWNrIEV4ZWN1dGVzIGZ1bmN0aW9uIG9ubHkgaWYgYXBwbGljYXRpb24gaXNuJ3QgYnVzeS5cblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzZWN1cmVkRXhlY3V0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTAuMFxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5idXN5ICYmIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0ICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LnNldCA6IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuYnVzeSAmJiBtUGFyYW1ldGVycy5idXN5LmNoZWNrICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LmNoZWNrIDogdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIGFueSkudXBkYXRlc0RvY3VtZW50KSB8fCBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhmbkZ1bmN0aW9uKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCkuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCk7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0aWYgKGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBhbnkpIHtcblx0XHQvLyBDcmVhdGUgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIHRoZSBwYXRoIGlzIGNvbXBsZXRlZFxuXHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0dGhpcy51cGRhdGVEb2N1bWVudChvRXZlbnQuZ2V0U291cmNlKCksIG9QYXRjaFByb21pc2UpO1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHJpdmF0ZSBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0Lypcblx0XHRcdCBUTyBCRSBDSEVDS0VEIC8gRElTQ1VTU0VEXG5cdFx0XHQgX2NyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIGFuZCBkZWxldGVNdWx0aURvY3VtZW50IC0gY291bGRuJ3Qgd2UgY29tYmluZSB0aGVtIHdpdGggY3JlYXRlIGFuZCBkZWxldGUgZG9jdW1lbnQ/XG5cdFx0XHQgX2NyZWF0ZUFjdGlvblByb21pc2UgYW5kIGRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIC0+IG5leHQgc3RlcFxuXG5cdFx0XHQgKi9cblxuXHRfc2V0RWRpdE1vZGUoc0VkaXRNb2RlOiBhbnksIGJDcmVhdGlvbk1vZGU/OiBib29sZWFuKSB7XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuc2V0RWRpdE1vZGUoc0VkaXRNb2RlLCBiQ3JlYXRpb25Nb2RlKTtcblx0fVxuXG5cdF9zZXREcmFmdFN0YXR1cyhzRHJhZnRTdGF0ZTogYW55KSB7XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoc0RyYWZ0U3RhdGUpO1xuXHR9XG5cblx0X2dldFJvdXRpbmdMaXN0ZW5lcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0Um91dGluZ0xpc3RlbmVyKCk7XG5cdH1cblxuXHRfZ2V0R2xvYmFsVUlNb2RlbCgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHR9XG5cdF9zeW5jVGFzayh2VGFzaz86IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5zeW5jVGFzayh2VGFzayk7XG5cdH1cblxuXHRfZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHR9XG5cblx0X2RlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHRfaGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5oYW5kbGVDcmVhdGVFdmVudHMob0JpbmRpbmcpO1xuXHR9XG5cblx0X2dldFRyYW5zYWN0aW9uSGVscGVyKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHR9XG5cblx0X2dldEludGVybmFsTW9kZWwoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEludGVybmFsTW9kZWwoKTtcblx0fVxuXG5cdF9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0fVxuXG5cdF9nZXRSZXNvdXJjZUJ1bmRsZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLm9SZXNvdXJjZUJ1bmRsZTtcblx0fVxuXG5cdF9nZXRTZW1hbnRpY01hcHBpbmcoKTogU2VtYW50aWNNYXBwaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jcmVhdGVBY3Rpb25Qcm9taXNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKlxuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSByZXNvbHZlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlcm5hbGx5IHJlc29sdmUgdGhlIHByb21pc2Vcblx0ICovXG5cblx0X2NyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWU6IGFueSwgc0NvbnRyb2xJZDogYW55KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmNyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWUsIHNDb250cm9sSWQpO1xuXHR9XG5cblx0X2dldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHR9XG5cblx0X2RlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHR9XG5cblx0X2dldE1lc3NhZ2VIYW5kbGVyKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRNZXNzYWdlSGFuZGxlcigpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShhY3Rpb246IEFjdGl2aXR5LCBjb250ZW50OiBzdHJpbmcgfCBzdHJpbmdbXSB8IENvbnRleHQgfCBDb250ZXh0W10gfCB1bmRlZmluZWQpIHtcblx0XHRzZW5kKHRoaXMuZ2V0VmlldygpLCBhY3Rpb24sIGNvbnRlbnQpO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiB0cmlnZ2VyVHlwZSkge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5c1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1Jlc3BvbnNlIFRoZSBib3VuZCBhY3Rpb24ncyByZXNwb25zZSBkYXRhIG9yIHJlc3BvbnNlIGNvbnRleHRcblx0ICogQHJldHVybnMge29iamVjdH0gT2JqZWN0IHdpdGggZGF0YSBhbmQgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHMgb2YgdGhlIHJlc3BvbnNlXG5cdCAqL1xuXHRfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvUmVzcG9uc2U6IG9iamVjdCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpO1xuXHR9XG5cblx0X3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKTtcblx0XHQvL0N1cnJlbnRseSB3ZSBhcmUgdXNpbmcgb25seSAxIHVwZGF0ZUdyb3VwSWQsIGhlbmNlIHN1Ym1pdHRpbmcgdGhlIGJhdGNoIGRpcmVjdGx5IGhlcmVcblx0XHRyZXR1cm4gb01vZGVsXG5cdFx0XHQuc3VibWl0QmF0Y2goXCIkYXV0b1wiKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0XHQvLyB0aGUgc3VibWl0IHdhcyBub3Qgc3VjY2Vzc2Z1bFxuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcInN1Ym1pdCBvZiBvcGVuIGNoYW5nZXMgZmFpbGVkXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0X2hhbmRsZVN0aWNreU9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9uKG9Db250ZXh0KTtcblx0fVxuXG5cdF9oYW5kbGVTdGlja3lPZmYoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JblNlc3Npb24oKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93Lm9uQmFja05hdmlnYXRpb25JblNlc3Npb24oKTtcblx0fVxuXG5cdF9kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogYW55LFxuXHRcdGJFZGl0YWJsZTogYm9vbGVhbixcblx0XHRiUmVjcmVhdGVDb250ZXh0OiBib29sZWFuLFxuXHRcdGJEcmFmdE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuLFxuXHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eT86IGJvb2xlYW5cblx0KSB7XG5cdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRhd2FpdCB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWUsXG5cdFx0XHRlZGl0YWJsZTogYkVkaXRhYmxlLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogdHJ1ZSxcblx0XHRcdGJSZWNyZWF0ZUNvbnRleHQ6IGJSZWNyZWF0ZUNvbnRleHQsXG5cdFx0XHRiRHJhZnROYXZpZ2F0aW9uOiBiRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBmYWxzZSxcblx0XHRcdGJGb3JjZUZvY3VzOiBiRm9yY2VGb2N1cyxcblx0XHRcdGtlZXBDdXJyZW50TGF5b3V0OiB0cnVlLFxuXHRcdFx0Yk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5OiBiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHlcblx0XHR9KTtcblx0fVxuXG5cdF9nZXRCb3VuZENvbnRleHQodmlldzogYW55LCBwYXJhbXM6IGFueSkge1xuXHRcdGNvbnN0IHZpZXdMZXZlbCA9ICh2aWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS52aWV3TGV2ZWw7XG5cdFx0Y29uc3QgYlJlZnJlc2hBZnRlckFjdGlvbiA9IHZpZXdMZXZlbCA+IDEgfHwgKHZpZXdMZXZlbCA9PT0gMSAmJiBwYXJhbXMuY29udHJvbElkKTtcblx0XHRyZXR1cm4gIXBhcmFtcy5pc05hdmlnYWJsZSB8fCAhIWJSZWZyZXNoQWZ0ZXJBY3Rpb247XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHRcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnNcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKCkudGhlbigoKSA9PiB7XG5cdFx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gc2FwLnVpLmdldENvcmUoKS5nZXRNZXNzYWdlTWFuYWdlcigpLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdGxldCBvQ29udHJvbDtcblx0XHRcdGxldCBvTWVzc2FnZTtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJObyB2YWxpZGF0aW9uIGVycm9ycyBmb3VuZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhTWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0b01lc3NhZ2UgPSBhTWVzc2FnZXNbaV07XG5cdFx0XHRcdGlmIChvTWVzc2FnZS52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2wgPSBDb3JlLmJ5SWQob01lc3NhZ2UuZ2V0Q29udHJvbElkKCkpO1xuXHRcdFx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdFx0aWYgKG9Db250cm9sLmdldElkKCkgPT09IHNWaWV3SWQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwidmFsaWRhdGlvbiBlcnJvcnMgZXhpc3RcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfcmVmcmVzaExpc3RJZlJlcXVpcmVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb1Jlc3BvbnNlIFRoZSByZXNwb25zZSBvZiB0aGUgYm91bmQgYWN0aW9uIGFuZCB0aGUgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IEFsd2F5cyByZXNvbHZlcyB0byBwYXJhbSBvUmVzcG9uc2Vcblx0ICovXG5cdF9yZWZyZXNoTGlzdElmUmVxdWlyZWQob1Jlc3BvbnNlOiBhbnksIG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0aWYgKCFvQ29udGV4dCB8fCAhb1Jlc3BvbnNlIHx8ICFvUmVzcG9uc2Uub0RhdGEpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Ly8gcmVmcmVzaCBvbmx5IGxpc3RzXG5cdFx0aWYgKG9CaW5kaW5nICYmIG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvUmVzcG9uc2Uub0RhdGE7XG5cdFx0XHRjb25zdCBhS2V5cyA9IG9SZXNwb25zZS5rZXlzO1xuXHRcdFx0Y29uc3Qgb0N1cnJlbnREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRsZXQgYlJldHVybmVkQ29udGV4dElzU2FtZSA9IHRydWU7XG5cdFx0XHQvLyBlbnN1cmUgY29udGV4dCBpcyBpbiB0aGUgcmVzcG9uc2Vcblx0XHRcdGlmIChPYmplY3Qua2V5cyhvQ29udGV4dERhdGEpLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBjaGVjayBpZiBjb250ZXh0IGluIHJlc3BvbnNlIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBib3VuZCBjb250ZXh0XG5cdFx0XHRcdGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSBhS2V5cy5ldmVyeShmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9DdXJyZW50RGF0YVtzS2V5XSA9PT0gb0NvbnRleHREYXRhW3NLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoKG9CaW5kaW5nIGFzIGFueSkuaXNSb290KCkpIHtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IG9CaW5kaW5nLmdldFBhdGgoKSB9XSwgb0JpbmRpbmcuZ2V0Q29udGV4dCgpIGFzIENvbnRleHQpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiLCBlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55LFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhUmVxdWVzdFByb21pc2VzID0gYVNlbWFudGljS2V5cy5tYXAoZnVuY3Rpb24gKG9LZXk6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdE9iamVjdChvS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChhUmVxdWVzdFByb21pc2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8vIFVnbHkgV29ya2Fyb3VuZCB0byBvdmVyY29tZSBtZGMgZmllbGQgaXNzdWUsIHdlIHJlbW92ZSB0aGUgYmluZGluZyBjb250ZXh0IGJlZm9yZVxuXHQvLyBzd2l0Y2hpbmcgdG8gZGlzcGxheSBtb2RlIHRvIGF2b2lkIHRoZSBmaWVsZCByZWFkcyBhZGRpdGlvbmFsIHZhbHVlcyBmb3Igbm9uIGV4aXN0aW5nXG5cdC8vIGRyYWZ0cyBvciBzdGlja3kgc2Vzc2lvbnMgaW4gdGhlIGJhY2tlbmRcblx0X3JlbW92ZUNvbnRleHRzRnJvbVBhZ2VzKCkge1xuXHRcdGxldCBhUGFnZXM6IGFueVtdID0gW107XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRpZiAob0FwcENvbXBvbmVudC5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9GQ0wgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKSBhcyBGbGV4aWJsZUNvbHVtbkxheW91dDtcblx0XHRcdGFQYWdlcyA9IGFQYWdlcy5jb25jYXQob0ZDTC5nZXRNaWRDb2x1bW5QYWdlcygpIHx8IFtdKTtcblx0XHRcdGFQYWdlcyA9IGFQYWdlcy5jb25jYXQob0ZDTC5nZXRFbmRDb2x1bW5QYWdlcygpIHx8IFtdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb05hdkNvbnRhaW5lciA9IG9BcHBDb21wb25lbnQuZ2V0Um9vdENvbnRhaW5lcigpIGFzIE5hdkNvbnRhaW5lcjtcblx0XHRcdGFQYWdlcyA9IG9OYXZDb250YWluZXIuZ2V0UGFnZXMoKSB8fCBbXTtcblx0XHR9XG5cblx0XHRhUGFnZXMuZm9yRWFjaChmdW5jdGlvbiAob1BhZ2U6IGFueSkge1xuXHRcdFx0aWYgKG9QYWdlLmlzQShcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiKSkge1xuXHRcdFx0XHRvUGFnZSA9IG9QYWdlLmdldENvbXBvbmVudEluc3RhbmNlKCk7IC8vIFRoZSBiaW5kaW5nIGNvbnRleHQgaXMgc2V0IGF0IHRoZSBjb21wb25lbnQgbGV2ZWwsIG5vdCB0aGUgY29tcG9uZW50IGNvbnRhaW5lclxuXHRcdFx0fVxuXG5cdFx0XHRpZiAob1BhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRvUGFnZS5zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tU3ViU2VjdGlvbnMob0NvbnRyb2w6IGFueSwgc092ZXJsb2FkRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdFx0bGV0IG9DdXJyZW50Q29udHJvbDogYW55O1xuXG5cdFx0ZnVuY3Rpb24gX2NoZWNrQWN0aW9ucyhhQWN0aW9uczogQXJyYXk8b2JqZWN0Pikge1xuXHRcdFx0bGV0IG9BY3Rpb25CaW5kaW5nQ29udGV4dDogYW55O1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YUFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob0FjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0b0FjdGlvbkJpbmRpbmdDb250ZXh0ID0gb0FjdGlvbi5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9BY3Rpb25CaW5kaW5nQ29udGV4dFxuXHRcdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHRcdFx0LmdldE1ldGFDb250ZXh0KG9BY3Rpb25CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdFx0XHRcdC5nZXRPYmplY3QoXCIkVHlwZVwiKSA9PT0gc092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgXCJjb250ZXh0IGZvdW5kIC0gc3RvcCBhY3Rpb25zIGxvb3BcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGlvbkJpbmRpbmdDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIF9jaGVja1N1YlNlY3Rpb25zKGFTdWJTZWN0aW9uczogQXJyYXk8b2JqZWN0Pikge1xuXHRcdFx0bGV0IG9BY3Rpb25CaW5kaW5nQ29udGV4dDogYW55O1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YVN1YlNlY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob0FjdGlvbkJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBcImNvbnRleHQgZm91bmQgLSBzdG9wIFN1YlNlY3Rpb25zIGxvb3BcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYUFjdGlvbnMgPSBvU3ViU2VjdGlvbi5nZXRBZ2dyZWdhdGlvbihcImFjdGlvbnNcIik7XG5cdFx0XHRcdFx0b0FjdGlvbkJpbmRpbmdDb250ZXh0ID0gX2NoZWNrQWN0aW9ucyhhQWN0aW9ucyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gb0FjdGlvbkJpbmRpbmdDb250ZXh0ID8gb0FjdGlvbkJpbmRpbmdDb250ZXh0IDogdW5kZWZpbmVkO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGlvbkJpbmRpbmdDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0NvbnRyb2wgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJpbnB1dCBwYXJhbWV0ZXIgb0NvbnRyb2wgdW5kZWZpbmVkIHdoZW4gdHJ5aW5nIHRvIGRldGVybWluZSB0aGUgYWN0aW9uIG92ZXJsb2FkIGNvbnRleHRcIik7XG5cdFx0XHR9XG5cblx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9Db250cm9sO1xuXHRcdFx0d2hpbGUgKCFvQ3VycmVudENvbnRyb2wuaXNBKFwic2FwLnV4YXAuT2JqZWN0UGFnZVNlY3Rpb25cIikpIHtcblx0XHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0N1cnJlbnRDb250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIW9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RQYWdlU2VjdGlvbiBub3QgZm91bmQgaW4gVUkgaGllcmFyY2h5XCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gb0N1cnJlbnRDb250cm9sLmdldEFnZ3JlZ2F0aW9uKFwic3ViU2VjdGlvbnNcIik7XG5cdFx0XHRcdHJldHVybiBfY2hlY2tTdWJTZWN0aW9ucyhhU3ViU2VjdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IENvbnRleHQsIG5ld0NvbnRleHQ6IENvbnRleHQpOiBTaWJsaW5nSW5mb3JtYXRpb24ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBuZXdDb250ZXh0LFxuXHRcdFx0cGF0aE1hcHBpbmc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9sZFBhdGg6IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxuXG5cdF91cGRhdGVQYXRoc0luSGlzdG9yeShtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXRQYXRoTWFwcGluZyhtYXBwaW5ncyk7XG5cblx0XHQvLyBBbHNvIHVwZGF0ZSB0aGUgc2VtYW50aWMgbWFwcGluZyBpbiB0aGUgcm91dGluZyBzZXJ2aWNlXG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdGlmIChtYXBwaW5ncy5sZW5ndGggJiYgbGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ub2xkUGF0aCkge1xuXHRcdFx0bGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoID0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2RzIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3ViLW9iamVjdCBwYWdlLCBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aCBmb3Jcblx0ICogYWxsIGludGVybWVkaWF0ZXMgcGF0aHMgYmV0d2VlbiB0aGUgT1AgYW5kIHRoZSBzdWItT1AuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0ge29iamVjdH0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Yi1vYmplY3Rcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQcm9ncmFtbWluZ01vZGVsIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gcmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuXHQgKi9cblx0YXN5bmMgX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmdcblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCkgYXMgQ29udGV4dCxcblx0XHRcdFx0cGF0aE1hcHBpbmc6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0RmxvdztcbiJdfQ==
1968
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJmaW5hbGl6ZXIiLCJiaW5kIiwiQ3JlYXRpb25Nb2RlIiwiRkVMaWJyYXJ5IiwiUHJvZ3JhbW1pbmdNb2RlbCIsIkNvbnN0YW50cyIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJNZXNzYWdlVHlwZSIsImNvcmVMaWJyYXJ5IiwiRWRpdEZsb3ciLCJkZWZpbmVVSTVDbGFzcyIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJlZGl0RG9jdW1lbnQiLCJvQ29udGV4dCIsImJEcmFmdE5hdmlnYXRpb24iLCJ0cmFuc2FjdGlvbkhlbHBlciIsIl9nZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwicmlnaHRtb3N0Q29udGV4dCIsImJhc2UiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsImNvbnRleHQiLCJnZXRWaWV3IiwiX2dldE1lc3NhZ2VIYW5kbGVyIiwib05ld0RvY3VtZW50Q29udGV4dCIsInNQcm9ncmFtbWluZ01vZGVsIiwiX2dldFByb2dyYW1taW5nTW9kZWwiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsImdldE1vZGVsIiwiX3NldEVkaXRNb2RlIiwiRWRpdGFibGUiLCJzaG93TWVzc2FnZURpYWxvZyIsIl9oYW5kbGVOZXdDb250ZXh0IiwiY29udGV4dFRvTmF2aWdhdGUiLCJTdGlja3kiLCJfaGFuZGxlU3RpY2t5T24iLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwic2libGluZ0luZm8iLCJfY3JlYXRlU2libGluZ0luZm8iLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJwYXRoTWFwcGluZyIsInRhcmdldENvbnRleHQiLCJnZXRQYXRoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImFDb250ZXh0cyIsIm1QYXJhbWV0ZXJzIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImdldENvbnRyb2xsZXIiLCJfZWRpdEZsb3ciLCJ1cGRhdGVEb2N1bWVudCIsIm9Qcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiYklzRHJhZnQiLCJEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIl9zeW5jVGFzayIsImhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucyIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiX3NldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwib0JpbmRpbmdDb250ZXh0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXROYW1lIiwiZ2V0TWV0YUNvbnRleHQiLCJnZXRPYmplY3QiLCJhU2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJsZW5ndGgiLCJvQ3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJzQ3VycmVudFNlbWFudGljUGF0aCIsInNlbWFudGljUGF0aCIsInNDaGFuZ2VkUGF0aCIsImdldFNlbWFudGljUGF0aCIsIlNhdmVkIiwiQ2xlYXIiLCJjYXRjaCIsImZpbmFsbHkiLCJzaG93TWVzc2FnZXMiLCJjcmVhdGVEb2N1bWVudCIsInZMaXN0QmluZGluZyIsIm1JblBhcmFtZXRlcnMiLCJvTG9ja09iamVjdCIsIl9nZXRHbG9iYWxVSU1vZGVsIiwib1RhYmxlIiwib1Jlc291cmNlQnVuZGxlIiwiX2dldFJlc291cmNlQnVuZGxlIiwiYlNob3VsZEJ1c3lMb2NrIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lIiwiQ3JlYXRpb25Sb3ciLCJFeHRlcm5hbCIsIm9FeGVjQ3VzdG9tVmFsaWRhdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJvQ29udHJvbGxlciIsInNDcmVhdGVQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJoYW5kbGVycyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm91dGJvdW5kIiwidW5kZWZpbmVkIiwiY3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dPYmplY3RzIiwiZ2V0UGFyZW50IiwidmFsaWRhdGVEb2N1bWVudCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInNldFByb3BlcnR5IiwidGFibGVJZCIsImJ5SWQiLCJoYW5kbGVTaWRlRWZmZWN0cyIsIm9MaXN0QmluZGluZyIsIm9DcmVhdGlvblByb21pc2UiLCJvTmV3Q29udGV4dCIsImNyZWF0ZWQiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYVZhbGlkYXRpb25NZXNzYWdlcyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJtQ3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsIm9NZXNzYWdlTWFuYWdlciIsIkNvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFDdXN0b21NZXNzYWdlcyIsIm9GaWVsZENvbnRyb2wiLCJzVGFyZ2V0IiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZvckVhY2giLCJvTWVzc2FnZSIsImNvZGUiLCJyZW1vdmVNZXNzYWdlcyIsIm9WYWxpZGF0aW9uTWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRDb250cm9sIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZmlsdGVyIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZSIsIm1lc3NhZ2VUZXh0IiwicHJvY2Vzc29yIiwidHlwZSIsIkVycm9yIiwidGVjaG5pY2FsIiwicGVyc2lzdGVudCIsImFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyIsImFkZENvbnRyb2xJZCIsInB1c2giLCJ0ZXh0IiwiY3VzdG9tTWVzc2FnZXMiLCJCdXN5TG9ja2VyIiwibG9jayIsIk9EYXRhTGlzdEJpbmRpbmciLCJTeW5jIiwiY3JlYXRlQXRFbmQiLCJvTW9kZWwiLCJzQ3JlYXRpb25Nb2RlIiwicHJvZ3JhbW1pbmdNb2RlbCIsIk5ld1BhZ2UiLCJpc1JlbGF0aXZlIiwic1BhdGgiLCJzTmV3QWN0aW9uIiwiYVBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsImFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMiLCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJBc3luYyIsIm9DcmVhdGlvbiIsIm1BcmdzIiwib0NyZWF0aW9uUm93Iiwib0NyZWF0aW9uUm93Q29udGV4dCIsIm9WYWxpZGF0aW9uQ2hlY2siLCJvUGF5bG9hZCIsIm9Sb3V0aW5nTGlzdGVuZXIiLCJfZ2V0Um91dGluZ0xpc3RlbmVyIiwiT2JqZWN0Iiwia2V5cyIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJfaGFuZGxlQ3JlYXRlRXZlbnRzIiwicGFyZW50Q29udHJvbCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJvTmF2aWdhdGlvbiIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJlZGl0YWJsZSIsImJGb3JjZUZvY3VzIiwiYXN5bmNDb250ZXh0IiwiY3JlYXRlQWN0aW9uIiwidHJhbnNpZW50IiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJvQ3JlYXRpb25Sb3dMaXN0QmluZGluZyIsImdldEJpbmRpbmciLCJiU2tpcFNpZGVFZmZlY3RzIiwib05ld1RyYW5zaWVudENvbnRleHQiLCJjcmVhdGUiLCJzZXRCaW5kaW5nQ29udGV4dCIsInRyYWNlIiwiZGVsZXRlIiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJyZWplY3QiLCJiSXNOZXdQYWdlQ3JlYXRpb24iLCJhbGwiLCJhUGFyYW1zIiwiX3NlbmRBY3Rpdml0eSIsIkFjdGl2aXR5IiwiQ3JlYXRlIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiY2FuY2VsZWQiLCJyZWplY3RlZEl0ZW1zIiwiaXNBIiwiZm5Gb2N1c09yU2Nyb2xsIiwiZm9jdXNSb3ciLCJzY3JvbGxUb0luZGV4IiwiZ2V0Um93QmluZGluZyIsImF0dGFjaEV2ZW50T25jZSIsImdldExlbmd0aCIsIm9uQmVmb3JlU2F2ZSIsIm9uQmVmb3JlRGlzY2FyZCIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJhY3RpdmVEb2N1bWVudENvbnRleHQiLCJfcmVtb3ZlQ29udGV4dHNGcm9tUGFnZXMiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIkFjdGl2YXRlIiwiX3RyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwic3RhbmRhcmRBY3Rpb25zIiwic2F2ZSIsInRyaWdnZXJUeXBlIiwic3RhbmRhcmRBY3Rpb24iLCJEaXNwbGF5IiwiaXNGY2xFbmFibGVkIiwidG9nZ2xlRHJhZnRBY3RpdmUiLCJvQ29udGV4dERhdGEiLCJiRWRpdGFibGUiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJuZXdQYXRoIiwib2xkUGF0aCIsImNhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwiY29udHJvbCIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIl9mZXRjaFNlbWFudGljS2V5VmFsdWVzIiwic2tpcEJpbmRpbmdUb1ZpZXciLCJkZWxldGVEb2N1bWVudCIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJfZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsIkRlbGV0ZSIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsImFwcGx5RG9jdW1lbnQiLCJpbnZva2VBY3Rpb24iLCJzQWN0aW9uTmFtZSIsIm1FeHRyYVBhcmFtcyIsIm9Db250cm9sIiwib0N1cnJlbnRDb250cm9sIiwiYVBhcnRzIiwic092ZXJsb2FkRW50aXR5VHlwZSIsIm9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzIiwib1ZpZXciLCJBcnJheSIsImlzQXJyYXkiLCJhcmd1bWVudHMiLCJjb250ZXh0cyIsIm1vZGVsIiwiaXNOYXZpZ2FibGUiLCJyZXF1aXJlc05hdmlnYXRpb24iLCJjb250cm9sSWQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImluZGV4T2YiLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiaXNUYWJsZUJvdW5kIiwic0JpbmRpbmdQYXRoIiwicGF0aCIsInNUYWJsZUNvbnRleHRFbnRpdHlUeXBlIiwib0FjdGlvbk92ZXJsb2FkQ29udGV4dCIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tU3ViU2VjdGlvbnMiLCJlbmFibGVBdXRvU2Nyb2xsIiwiX2NyZWF0ZUFjdGlvblByb21pc2UiLCJzSWQiLCJiR2V0Qm91bmRDb250ZXh0IiwiX2dldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiZ2V0Vmlld0RhdGEiLCJjb252ZXJ0ZXJUeXBlIiwiY2FsbEFjdGlvbiIsIm9SZXNwb25zZSIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsIkFjdGlvbiIsImFjdGlvbiIsImZSZXNvbHZlciIsIl9nZXRJbnRlcm5hbE1vZGVsIiwidkNvbnRleHQiLCJzQ29udGV4dE1ldGFQYXRoIiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwibm9IaXN0b3J5RW50cnkiLCJpbmZvIiwiZXJyIiwiZlJlamVjdG9yIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiaGFuZGxlUGF0Y2hTZW50Iiwib0V2ZW50Iiwib1BhdGNoUHJvbWlzZSIsImdldFNvdXJjZSIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlQWN0aXZhdGUiLCJvQmluZGluZyIsImJBdEVuZCIsImJJbmFjdGl2ZSIsIm9QYXJhbXMiLCJpbmFjdGl2ZSIsInNFZGl0TW9kZSIsImJDcmVhdGlvbk1vZGUiLCJzZXRFZGl0TW9kZSIsInNEcmFmdFN0YXRlIiwic2V0RHJhZnRTdGF0dXMiLCJnZXRSb3V0aW5nTGlzdGVuZXIiLCJnZXRHbG9iYWxVSU1vZGVsIiwidlRhc2siLCJzeW5jVGFzayIsImdldFByb2dyYW1taW5nTW9kZWwiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwiaGFuZGxlQ3JlYXRlRXZlbnRzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRJbnRlcm5hbE1vZGVsIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwic0NvbnRyb2xJZCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJfZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsIl9kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJyZWxhdGVkQ29udGV4dHMiLCJjb250ZW50IiwibWFwIiwic2VuZCIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5IiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsInN1Ym1pdEJhdGNoIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImhhbmRsZVN0aWNreU9uIiwiX2hhbmRsZVN0aWNreU9mZiIsImhhbmRsZVN0aWNreU9mZiIsIl9vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwib25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsIl9kaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImRpc2NhcmRTdGlja3lTZXNzaW9uIiwiaW50ZXJuYWxNb2RlbCIsImdldEh0dHBIZWFkZXJzIiwiYlJlY3JlYXRlQ29udGV4dCIsImJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eSIsIm5hdmlnYXRlVG9Db250ZXh0IiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJ2aWV3IiwicGFyYW1zIiwidmlld0xldmVsIiwiYlJlZnJlc2hBZnRlckFjdGlvbiIsInNWaWV3SWQiLCJnZXRJZCIsImFNZXNzYWdlcyIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImkiLCJ2YWxpZGF0aW9uIiwiZ2V0Q29udHJvbElkIiwib0RhdGEiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJpc1Jvb3QiLCJyZWZyZXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJnZXRDb250ZXh0IiwiYVJlcXVlc3RQcm9taXNlcyIsIm9LZXkiLCJyZXF1ZXN0T2JqZWN0IiwiJFByb3BlcnR5UGF0aCIsImFQYWdlcyIsIm9GQ0wiLCJnZXRSb290Q29udGFpbmVyIiwiY29uY2F0IiwiZ2V0TWlkQ29sdW1uUGFnZXMiLCJnZXRFbmRDb2x1bW5QYWdlcyIsIm9OYXZDb250YWluZXIiLCJnZXRQYWdlcyIsIm9QYWdlIiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJfY2hlY2tBY3Rpb25zIiwiYUFjdGlvbnMiLCJvQWN0aW9uQmluZGluZ0NvbnRleHQiLCJvQWN0aW9uIiwiX2NoZWNrU3ViU2VjdGlvbnMiLCJhU3ViU2VjdGlvbnMiLCJvU3ViU2VjdGlvbiIsImdldEFnZ3JlZ2F0aW9uIiwiY3VycmVudENvbnRleHQiLCJuZXdDb250ZXh0IiwibWFwcGluZ3MiLCJzZXRQYXRoTWFwcGluZyIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IiwiZG9Ob3RDb21wdXRlSWZSb290Iiwic3RhcnRzV2l0aCIsImRyYWZ0IiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQWdqQk8sa0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7QUFDckMsUUFBSTtBQUNILFVBQUlDLE1BQU0sR0FBR0YsSUFBSSxF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emIsWUFBQUEsV0FBVyxFQUFFO0FBRlAsV0FBUDtBQUlBO0FBQ0QsTzs7Ozs7V0FDRE4sYSxHQUFBLHlCQUF5QjtBQUN4QixhQUFPc0UsV0FBVyxDQUFDQyxlQUFaLENBQTRCLEtBQUtyRixPQUFMLEVBQTVCLEVBQTRDYyxhQUE1QyxFQUFQO0FBQ0EsSzs7O0lBOXdEcUJnYyxtQjtTQWl4RFJqZSxRIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBGbGV4aWJsZUNvbHVtbkxheW91dCBmcm9tIFwic2FwL2YvRmxleGlibGVDb2x1bW5MYXlvdXRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBzZW5kIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCBkcmFmdCwgeyBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyLCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgc3RhbmRhcmRBY3Rpb25zLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSwgdHJpZ2dlclR5cGUgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9GZWVkYmFja1wiO1xuaW1wb3J0IE5hdkNvbnRhaW5lciBmcm9tIFwic2FwL20vTmF2Q29udGFpbmVyXCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlLFxuXHRQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0TWVzc2FnZVR5cGUgPSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0cHJpdmF0ZSBmbkRpcnR5U3RhdGVQcm92aWRlcj86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXQ/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBtUGF0Y2hQcm9taXNlcz86IGFueTtcblx0cHJpdmF0ZSBfZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2VkaXREb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblx0XHRsZXQgcmlnaHRtb3N0Q29udGV4dDtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudChvQ29udGV4dCwgdGhpcy5nZXRWaWV3KCksIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsLCBvQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpO1xuXG5cdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIHJpZ2h0bW9zdENvbnRleHQsIHNQcm9ncmFtbWluZ01vZGVsLCB0cnVlKTtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9IG9OZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB0cnVlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHRcdC8vIGFzIHRoZSBVUkwgbWF5IGNoYW5nZSBpbiB0aGUgY2FzZSBvZiBGQ0xcblx0XHRcdFx0XHRcdHRoaXMuX2hhbmRsZVN0aWNreU9uKG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHM6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmIChtUGFyYW1ldGVycykge1xuXHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoYUNvbnRleHRzLCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIGVycm9ycyBkdXJpbmcgYW4gdXBkYXRlLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIHVwZGF0ZWQgZmllbGRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Qcm9taXNlIFByb21pc2UgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLiBUaGUgcHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoZSBkcmFmdCBzdGF0dXMgY2FuIGJlIHVwZGF0ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3VwZGF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHVwZGF0ZURvY3VtZW50KG9Db250ZXh0OiBvYmplY3QsIG9Qcm9taXNlOiBQcm9taXNlPGFueT4pOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgYklzRHJhZnQgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKCgpID0+IHtcblx0XHRcdGlmIChvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHRyZXR1cm4gb1Byb21pc2Vcblx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gSWYgYSBuYXZpZ2F0aW9uIGhhcHBlbmVkIHdoaWxlIG9Qcm9taXNlIHdhcyBiZWluZyByZXNvbHZlZCwgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VkXG5cdFx0XHRcdFx0XHQvLyBJbiB0aGF0IGNhc2UsIHdlIHNob3VsZG4ndCBkbyBhbnl0aGluZ1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRcdGlmIChiSXNEcmFmdCAmJiBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0ID09PSBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRzRW50aXR5U2V0TmFtZSA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YUNvbnRleHQob0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRcdFx0XHRcdFx0YVNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzRW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdFx0XHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKSxcblx0XHRcdFx0XHRcdFx0XHRcdHNDdXJyZW50U2VtYW50aWNQYXRoID0gb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcgJiYgb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0c0NoYW5nZWRQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9CaW5kaW5nQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gc0N1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRcdFx0XHRpZiAoc0N1cnJlbnRTZW1hbnRpY1BhdGggJiYgc0N1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZU5ld0NvbnRleHQob0JpbmRpbmdDb250ZXh0LCB0cnVlLCBmYWxzZSwgdHJ1ZSkudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKGJJc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ3xzdHJpbmd9IHZMaXN0QmluZGluZyAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSB7bWFwfSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJyBvciAnRGVmZXJyZWQnIGlzIHVzZWRcblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSAoaW4gYSB0YWJsZSlcblx0ICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gc3BlY2lmaWVkIHZpYSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCdcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMub3V0Ym91bmQgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdFeHRlcm5hbCdcblx0ICogQHBhcmFtIHtib29sZWFufSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NyZWF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGNyZWF0ZURvY3VtZW50KFxuXHRcdHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdG91dGJvdW5kPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLl9nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0bGV0IG9UYWJsZTogYW55OyAvL3Nob3VsZCBiZSBUYWJsZSBidXQgdGhlcmUgYXJlIG1pc3NpbmcgbWV0aG9kcyBpbnRvIHRoZSBkZWZcblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnM7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBiU2hvdWxkQnVzeUxvY2sgPVxuXHRcdFx0IW1QYXJhbWV0ZXJzIHx8XG5cdFx0XHQobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKTtcblx0XHRsZXQgb0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdC8vIENyZWF0ZSBieSBuYXZpZ2F0aW5nIHRvIGFuIGV4dGVybmFsIHRhcmdldFxuXHRcdFx0Ly8gVE9ETzogQ2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbiAoY3VycmVudGx5IHVzaW5nIHRoZSBzYW1lIGFzIGZvciBvdXRib3VuZCBjaGV2cm9uIG5hdiwgYW5kIHdpdGhvdXQgYW55IGNvbnRleHQgLSAzcmQgcGFyYW0pXG5cdFx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdFx0c0NyZWF0ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcodGhpcy5nZXRWaWV3KCksIHZMaXN0QmluZGluZyk7XG5cblx0XHRcdFx0KG9Db250cm9sbGVyIGFzIGFueSkuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBtUGFyYW1ldGVycy5vdXRib3VuZCwgdW5kZWZpbmVkLCBzQ3JlYXRlUGF0aCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd09iamVjdHMgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpO1xuXHRcdFx0ZGVsZXRlIG9DcmVhdGlvblJvd09iamVjdHNbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0b1RhYmxlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCk7XG5cdFx0XHRvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSB0cmFuc2FjdGlvbkhlbHBlci52YWxpZGF0ZURvY3VtZW50KFxuXHRcdFx0XHRvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGE6IG9DcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiAob1RhYmxlLmdldENyZWF0aW9uUm93KCkgYXMgYW55KS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KClcblx0XHRcdCk7XG5cblx0XHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRcdGlmICgob1RhYmxlLmdldENyZWF0aW9uUm93KCkgYXMgYW55KS5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJiBtUGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHRvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmd9IG9MaXN0QmluZGluZ1xuXHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ3JlYXRpb25Qcm9taXNlXG5cdFx0ICovXG5cdFx0Y29uc3QgaGFuZGxlU2lkZUVmZmVjdHMgPSAob0xpc3RCaW5kaW5nOiBhbnksIG9DcmVhdGlvblByb21pc2U6IFByb21pc2U8Q29udGV4dD4pID0+IHtcblx0XHRcdG9DcmVhdGlvblByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9OZXdDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0XHRyZXR1cm4gb05ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhVmFsaWRhdGlvbk1lc3NhZ2VzIEVycm9yIG1lc3NhZ2VzIGZyb20gY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0XHQgKi9cblx0XHRjb25zdCBjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAoYVZhbGlkYXRpb25NZXNzYWdlczogYW55W10pID0+IHtcblx0XHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBvVGFibGUgJiYgKG9UYWJsZS5nZXRDcmVhdGlvblJvdygpIGFzIGFueSkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKTtcblx0XHRcdGNvbnN0IG1DdXN0b21WYWxpZGl0eSA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIpO1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpO1xuXHRcdFx0Y29uc3QgYUN1c3RvbU1lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdFx0bGV0IG9GaWVsZENvbnRyb2w7XG5cdFx0XHRsZXQgc1RhcmdldDogc3RyaW5nO1xuXG5cdFx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob01lc3NhZ2UuY29kZSA9PT0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRhVmFsaWRhdGlvbk1lc3NhZ2VzLmZvckVhY2goKG9WYWxpZGF0aW9uTWVzc2FnZTogYW55KSA9PiB7XG5cdFx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdFx0aWYgKG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdFx0b0ZpZWxkQ29udHJvbCA9IENvcmUuZ2V0Q29udHJvbChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpIGFzIENvbnRyb2w7XG5cdFx0XHRcdFx0c1RhcmdldCA9IG9GaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpICsgXCIvXCIgKyBvRmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIik7XG5cdFx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHR9KS5sZW5ndGggPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHR0ZWNobmljYWw6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldDogc1RhcmdldFxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQWRkIGNvbnRyb2xJZCBpbiBvcmRlciB0byBnZXQgdGhlIGZvY3VzIGhhbmRsaW5nIG9mIHRoZSBlcnJvciBwb3BvdmVyIHJ1bmFibGVcblx0XHRcdFx0XHRjb25zdCBhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpO1xuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIFVuYm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdHRleHQ6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGFDdXN0b21NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRcdGN1c3RvbU1lc3NhZ2VzOiBhQ3VzdG9tTWVzc2FnZXNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGJTaG91bGRCdXN5TG9jayAmJiBCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhvRXhlY0N1c3RvbVZhbGlkYXRpb24pXG5cdFx0XHQudGhlbigoYVZhbGlkYXRpb25NZXNzYWdlczogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChhVmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMoYVZhbGlkYXRpb25NZXNzYWdlcyk7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmc7XG5cdFx0XHRcdGxldCBvTGlzdEJpbmRpbmc6IGFueTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0XHRcdGlmICh2TGlzdEJpbmRpbmcgJiYgdHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IHZMaXN0QmluZGluZztcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgdkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuU3luYztcblx0XHRcdFx0XHRkZWxldGUgbVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBvYmplY3Qgb3IgcGF0aCBleHBlY3RlZFwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBzQ3JlYXRpb25Nb2RlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlO1xuXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTGlzdEJpbmRpbmcpKVxuXHRcdFx0XHRcdC50aGVuKChwcm9ncmFtbWluZ01vZGVsOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID0gcHJvZ3JhbW1pbmdNb2RlbDtcblx0XHRcdFx0XHRcdGlmIChzQ3JlYXRpb25Nb2RlICYmIHNDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHVzZSB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGVcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNDcmVhdGlvbk1vZGU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRcdFx0XHRcdGlmICghb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNQYXRoID0gb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGlmIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMgaXMgcHJlc2VudCwgdGhlbiBjcmVhdGlvbiBpcyAnRGVmZXJyZWQnXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRcdFx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvblwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICApO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzTmV3QWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgc05ld0FjdGlvbiArIFwiL0AkdWk1Lm92ZXJsb2FkLzAvJFBhcmFtZXRlclwiKSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMgPSBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMoXG5cdFx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRzTWV0YVBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KClcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5Bc3luYztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50aGVuKChzQ3JlYXRpb25Nb2RlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGxldCBvQ3JlYXRpb246IGFueTtcblx0XHRcdFx0XHRcdGxldCBtQXJnczogYW55O1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93ID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3c7XG5cdFx0XHRcdFx0XHRsZXQgb0NyZWF0aW9uUm93Q29udGV4dDogYW55O1xuXHRcdFx0XHRcdFx0bGV0IG9WYWxpZGF0aW9uQ2hlY2sgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdGxldCBvUGF5bG9hZDogYW55O1xuXHRcdFx0XHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKTtcblxuXHRcdFx0XHRcdFx0aWYgKHNDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5EZWZlcnJlZCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoc0NyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93KSB7XG5cdFx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93Q29udGV4dCA9IG9DcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NyZWF0aW9uUm93Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0XHRcdC8vIHByZWZpbGwgZGF0YSBmcm9tIGNyZWF0aW9uIHJvd1xuXHRcdFx0XHRcdFx0XHRcdG9QYXlsb2FkID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhID0ge307XG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMob1BheWxvYWQpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvXCIgKyBzUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhW3NQcm9wZXJ0eVBhdGhdID0gb1BheWxvYWRbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0b1ZhbGlkYXRpb25DaGVjayA9IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygvKm9DcmVhdGlvblJvd0NvbnRleHQqLyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHNDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyB8fCBzQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lKSB7XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0XHRcdC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTG9jYWxcIjtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2hhbmRsZUNyZWF0ZUV2ZW50cyhvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uID0gb1ZhbGlkYXRpb25DaGVjay50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGU7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgb05hdmlnYXRpb247XG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHNDcmVhdGlvbk1vZGUpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0XHRcdFx0XHRcdGJEZWZlcnJlZENvbnRleHQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhc3luY0NvbnRleHQ6IG9DcmVhdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdFx0XHRcdFx0XHRtQXJncyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1BcmdzLnRyYW5zaWVudCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uLnRoZW4oZnVuY3Rpb24gKG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTmV3RG9jdW1lbnRDb250ZXh0LCBtQXJncyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0XHRcdFx0XHRoYW5kbGVTaWRlRWZmZWN0cyhvTGlzdEJpbmRpbmcsIG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc3luY1Rhc2sob0NyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c6XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIGNyZWF0aW9uIHJvdyBzaGFsbCBiZSBjbGVhcmVkIG9uY2UgdGhlIHZhbGlkYXRpb24gY2hlY2sgd2FzIHN1Y2Nlc3NmdWwgYW5kXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlcmVmb3JlIHRoZSBQT1NUIGNhbiBiZSBzZW50IGFzeW5jIHRvIHRoZSBiYWNrZW5kXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvVmFsaWRhdGlvbkNoZWNrXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd0xpc3RCaW5kaW5nID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRCaW5kaW5nKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5iU2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld1RyYW5zaWVudENvbnRleHQgPSBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9OZXdUcmFuc2llbnRDb250ZXh0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvTmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBmYXN0IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDcmVhdGlvblJvdyBuYXZpZ2F0aW9uIGVycm9yOiBcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gUHJvbWlzZS5yZWplY3QoXCJVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiICsgc0NyZWF0aW9uTW9kZSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJJc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdFx0XHRcdGlmIChvQ3JlYXRpb24pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtvQ3JlYXRpb24sIG9OYXZpZ2F0aW9uXSlcblx0XHRcdFx0XHRcdFx0XHQudGhlbigoYVBhcmFtczogW2FueSwgYW55XSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgb01vZGVsKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGJJc05ld1BhZ2VDcmVhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgYklzTmV3UGFnZUNyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhUGFyYW1zWzBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T24ob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0Vycm9yICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChvRXJyb3IubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0Vycm9yID09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRXJyb3IuY2FuY2VsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob0Vycm9yLnJlamVjdGVkSXRlbXMgJiYgb0Vycm9yLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKVxuXHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IGZuRm9jdXNPclNjcm9sbCA9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUgPyBvVGFibGUuZm9jdXNSb3cuYmluZChvVGFibGUpIDogb1RhYmxlLnNjcm9sbFRvSW5kZXguYmluZChvVGFibGUpO1xuXHRcdFx0XHRcdG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGZuRm9jdXNPclNjcm9sbChtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwLCB0cnVlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRiU2hvdWxkQnVzeUxvY2sgJiYgQnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVTYXZlXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG1QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlU2F2ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVNhdmUobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0NyZWF0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7bWFwfSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIHtBcnJheX0gbVBhcmFtZXRlcnMuY3JlYXRlUGFyYW1ldGVycyBBcnJheSBvZiB2YWx1ZXMgdGhhdCBhcmUgZmlsbGVkIGluIHRoZSBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlQ3JlYXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IGFueVtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0VkaXQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRWRpdFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZUVkaXQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZURpc2NhcmQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIHtBcnJheX0gbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGVsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlRGVsZXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzYXZlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2F2ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncztcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcygpO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3RpdmF0ZSwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHN0YW5kYXJkQWN0aW9ucy5zYXZlLCB0cmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdGlmICghKG9FcnJvciAmJiBvRXJyb3IuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdH1cblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgYkVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRiRWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRiRWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShiRWRpdGFibGUgPyBFZGl0TW9kZS5FZGl0YWJsZSA6IEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTsgLy9zd2l0Y2ggdG8gZWRpdCBtb2RlIG9ubHkgaWYgYSBkcmFmdCBpcyBhdmFpbGFibGVcblxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nIS5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgYkVkaXRhYmxlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZSAtIENhbm5vdCBmaW5kIHNpYmxpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6XCIgKyBvRXJyb3IpIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c2FwLm0uQnV0dG9ufSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gLSBDdXJyZW50bHkgdGhpcyBpcyBwYXNzZWQgYXMgY2FuY2VsQnV0dG9uIGludGVybmFsbHkgKHJlcGxhY2VkIGJ5IG1QYXJhbWV0ZXJzLmNvbnRyb2wgaW4gdGhlIEpTRG9jIGJlbG93KS4gQ3VycmVudGx5IGl0IGlzIGFsc28gbWFuZGF0b3J5LlxuXHQvLyBQbGFuIC0gVGhpcyBzaG91bGQgbm90IGJlIG1hbmRhdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYWN0IGFzIHJlZmVyZW5jZSBjb250cm9sIGZvciB0aGUgZGlzY2FyZCBwb3BvdmVyIE9SIHdlIGNhbiBzaG93IGEgZGlhbG9nIGluc3RlYWQgb2YgYSBwb3BvdmVyLlxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBlZGl0YWJsZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIHttYXB9IG1QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmNvbnRyb2wgVGhpcyBpcyB0aGUgY29udHJvbCB1c2VkIHRvIG9wZW4gdGhlIGRpc2NhcmQgcG9wb3ZlclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NhbmNlbERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogeyBjb250cm9sOiBvYmplY3Q7IHNraXBEaXNjYXJkUG9wb3Zlcj86IGJvb2xlYW4gfSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3QgbUluUGFyYW1ldGVyczogYW55ID0gbVBhcmFtZXRlcnM7XG5cdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cblx0XHRtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiA9IG1QYXJhbWV0ZXJzLmNvbnRyb2wgfHwgbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b247XG5cdFx0bUluUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURpc2NhcmQ7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRpZiAoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbmNlbERvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0bUluUGFyYW1ldGVycyxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cblx0XHRcdHRoaXMuX3JlbW92ZUNvbnRleHRzRnJvbVBhZ2VzKCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0Ly8gd2UgZm9yY2UgdGhlIGVkaXQgc3RhdGUgZXZlbiBmb3IgRkNMIGJlY2F1c2UgdGhlIGRyYWZ0IGRpc2NhcmQgbWlnaHQgbm90IGJlIGltcGxlbWVudGVkXG5cdFx0XHQvLyBhbmQgd2UgbWF5IGp1c3QgZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdGlmICghb0FjdGl2ZURvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgdW5kZWZpbmVkKTtcblx0XHRcdFx0Ly9pbiBjYXNlIG9mIGEgbmV3IGRvY3VtZW50LCBubyBhY3RpdmVDb250ZXh0IGlzIHJldHVybmVkIC0tPiBuYXZpZ2F0ZSBiYWNrLlxuXHRcdFx0XHRpZiAoIW1JblBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IG9BY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1JblBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCB0cnVlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vYWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnRcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkaXNjYXJkaW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIHtvYmplY3R9IG1JblBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbUluUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZGVsZXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM6IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGlmICghbVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IGZhbHNlO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRyZXR1cm4gdGhpcy5fZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHRcdC8vIC0tPiBNYXJrIFVJIGRpcnR5IGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdFx0dGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHQvLyBBZnRlciBkZWxldGUgaXMgc3VjY2Vzc2Z1bGwsIHdlIG5lZWQgdG8gZGV0dGNoIHRoZSBzZXRCYWNrTmF2aWdhdGlvbiBNZXRob2RzXG5cdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNhcHBseURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uXSBCb29sZWFuIHZhbHVlIGZvciBzdGF0aWMgYWN0aW9uLCB1bmRlZmluZWQgZm9yIG90aGVyIGFjdGlvbnNcblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGVdIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHQvLyBDdXJyZW50bHkgdGhlIHBhcmFtZXRlciBpc05hdmlnYWJsZSBpcyB1c2VkIGludGVybmFsbHkgYW5kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVzTmF2aWdhdGlvbiBhcyBpdCBpcyBhIG1vcmUgYXB0IG5hbWUgZm9yIHRoaXMgcGFyYW1cblxuXHQvKipcblx0ICogSW52b2tlcyBhbiBhY3Rpb24gKGJvdW5kIG9yIHVuYm91bmQpIGFuZCB0cmFja3MgdGhlIGNoYW5nZXMgc28gdGhhdCBvdGhlciBwYWdlcyBjYW4gYmUgcmVmcmVzaGVkIGFuZCBzaG93IHRoZSB1cGRhdGVkIGRhdGEgdXBvbiBuYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbUluUGFyYW1ldGVycy5jb250ZXh0cyBGb3IgYSBib3VuZCBhY3Rpb24sIGEgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbUluUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBOYXZpZ2F0aW9uIHRha2VzIHBsYWNlIHRvIHRoZSBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMubGFiZWwgQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvbi4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgYWN0aW9uIGhhcyBhIHBhcmFtZXRlciBhbmQgYSBwYXJhbWV0ZXIgZGlhbG9nIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGUgbGFiZWwgd2lsbCBiZSB1c2VkIGZvciB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBhbmQgZm9yIHRoZSBjb25maXJtYXRpb24gYnV0dG9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtSW5QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FeHRyYVBhcmFtcyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjaW52b2tlQWN0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICoqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aW52b2tlQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVycz86IHtcblx0XHRcdGNvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXTtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IGFueVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0NvbnRyb2w6IGFueTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IG9DdXJyZW50Q29udHJvbDtcblx0XHRsZXQgb0JpbmRpbmdDb250ZXh0O1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOiBhbnk7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblxuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoKG1QYXJhbWV0ZXJzLmlzQSAmJiBtUGFyYW1ldGVycy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHwgQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycykgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0Y29uc3QgY29udGV4dHMgPSBtUGFyYW1ldGVycztcblx0XHRcdG1QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5tb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhpcyBzZWxlY3RlZCBjb250ZXh0cyB1cGRhdGUgaXMgZG9uZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiwgc2hvdWxkIGJlIG1vdmVkIG91dFxuXHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5kZXhPZihcIihcIikgPiAtMSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSAoYVBhcnRzW2FQYXJ0cy5sZW5ndGggLSAxXSBhcyBhbnkpLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNUYWJsZUJvdW5kKCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0NvbnRyb2wuZGF0YShcInJvd3NCaW5kaW5nSW5mb1wiKS5wYXRoLFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHNCaW5kaW5nUGF0aCk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0xpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNPdmVybG9hZEVudGl0eVR5cGUpIHtcblx0XHRcdFx0Y29uc3Qgc1RhYmxlQ29udGV4dEVudGl0eVR5cGUgPSBtUGFyYW1ldGVycy5jb250ZXh0c1xuXHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFDb250ZXh0KG1QYXJhbWV0ZXJzLmNvbnRleHRzLmdldFBhdGgoKSlcblx0XHRcdFx0XHQuZ2V0T2JqZWN0KFwiJFR5cGVcIik7XG5cdFx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICE9PSBzVGFibGVDb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBpbiBjb250cm9sIHRyZWUgaGllcmFyY2h5XG5cdFx0XHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0NvbnRyb2w7XG5cdFx0XHRcdFx0d2hpbGUgKG9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0ID0gb0N1cnJlbnRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCAmJlxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCIkVHlwZVwiKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQmluZGluZ0NvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgcGFyZW50XG5cdFx0XHRcdFx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9DdXJyZW50Q29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gY29udGV4dCB3YXMgbm90IGZvdW5kIGluIFVJIGhpZXJhcmNoeSBnb2luZyBzdHJhaWdodCB1cHdhcmRzIC0gdHJ5IHRvIGZpbmQgaXQgaW4gU3ViU2VjdGlvbnNcblx0XHRcdFx0XHRpZiAoIW9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbk92ZXJsb2FkQ29udGV4dCA9IHRoaXMuX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21TdWJTZWN0aW9ucyhvQ29udHJvbCwgc092ZXJsb2FkRW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbk92ZXJsb2FkQ29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0FjdGlvbk92ZXJsb2FkQ29udGV4dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJDb250ZXh0IG5vdCBmb3VuZCBmb3IgZW50aXR5IHR5cGUgXCIgKyBzT3ZlcmxvYWRFbnRpdHlUeXBlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLl9jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5zSWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0ID0gdGhpcy5fZ2V0Qm91bmRDb250ZXh0KG9WaWV3LCBtUGFyYW1ldGVycyk7XG5cdFx0Ly8gTmVlZCB0byBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyBjYWxsZWQgZnJvbSBPYmplY3RQYWdlIGZvciBjaGFuZ2VTZXQgSXNvbGF0ZWQgd29ya2Fyb3VuZFxuXHRcdG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5jb252ZXJ0ZXJUeXBlID09PSBcIk9iamVjdFBhZ2VcIjtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4odHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvbi5iaW5kKHRyYW5zYWN0aW9uSGVscGVyLCBzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMsIHRoaXMuZ2V0VmlldygpLCB0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpKSlcblx0XHRcdC50aGVuKChvUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBpZiB0aGUgcmV0dXJuZWQgY29udGV4dCBmb3IgdGhlIGJvdW5kIGFjdGlvbiBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY29udGV4dCBvbiB3aGljaCBhY3Rpb24gd2FzIGNhbGxlZCxcblx0XHRcdFx0Ly8gcmVmcmVzaCB0aGUgY29ycmVzcG9uZGluZyBsaXN0IGJpbmRpbmdcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHRcdHRoaXMuX2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0c1swXVxuXHRcdFx0XHRcdCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Jlc3BvbnNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9SZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3Rpb24sIG1QYXJhbWV0ZXJzLmNvbnRleHRzKTtcblx0XHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIHRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Lypcblx0XHRcdFx0XHQgV2Ugc2V0IHRoZSAodXBwZXIpIHBhZ2VzIHRvIGRpcnR5IGFmdGVyIGFuIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb25cblx0XHRcdFx0XHQgVE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHQgVGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHQgT25jZSB0aGlzIGlzIHN1cHBvcnRlZCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgcGFnZXMgdG8gZGlydHkgYW55bW9yZSBhcyB0aGUgY29udGV4dCBpdHNlbGZcblx0XHRcdFx0XHQgaXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHQgd2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHQgYXMgaWYgaXQgaXMgY2FsbGVkIGluIHRoZSBsaXN0IHJlcG9ydCBpdCdzIG5vdCBuZWVkZWQgLSBhcyB3ZSBhbnl3YXkgd2lsbCByZW1vdmUgdGhpcyBsb2dpY1xuXHRcdFx0XHRcdCB3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHQgd2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHQgZmlyc3Qgb25lIGFzIHRoZXkgYXJlIGFueXdheSBzaWJsaW5nc1xuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRcdGxldCB2Q29udGV4dCA9IG9SZXNwb25zZTtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHR2Q29udGV4dCA9IHZDb250ZXh0WzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHZDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICE9PSB2Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQodkNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vSGlzdG9yeUVudHJ5OiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyID09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJEaWFsb2fCoGNhbmNlbGxlZC5cIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCEoZXJyICYmIChlcnIuY2FuY2VsZWQgfHwgKGVyci5yZWplY3RlZEl0ZW1zICYmIGVyci5yZWplY3RlZEl0ZW1zWzBdLmNhbmNlbGVkKSkpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJFcnJvciBpbiBFZGl0Rmxvdy5pbnZva2VBY3Rpb246XCIgKyBlcnIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5idXN5LmNoZWNrIEV4ZWN1dGVzIGZ1bmN0aW9uIG9ubHkgaWYgYXBwbGljYXRpb24gaXNuJ3QgYnVzeS5cblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzZWN1cmVkRXhlY3V0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTAuMFxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5idXN5ICYmIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0ICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LnNldCA6IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuYnVzeSAmJiBtUGFyYW1ldGVycy5idXN5LmNoZWNrICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LmNoZWNrIDogdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIGFueSkudXBkYXRlc0RvY3VtZW50KSB8fCBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhmbkZ1bmN0aW9uKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCkuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0aGFuZGxlUGF0Y2hTZW50KG9FdmVudDogYW55KSB7XG5cdFx0aWYgKCEodGhpcy5iYXNlLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LmdldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIikpIHtcblx0XHRcdC8vIENyZWF0ZSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gdGhlIHBhdGggaXMgY29tcGxldGVkXG5cdFx0XHRjb25zdCBvUGF0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51cGRhdGVEb2N1bWVudChvRXZlbnQuZ2V0U291cmNlKCksIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBDcmVhdGVBY3RpdmF0ZSBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0aGFuZGxlQ3JlYXRlQWN0aXZhdGUob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBvQmluZGluZyA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgYkF0RW5kID0gdHJ1ZTtcblx0XHRjb25zdCBiSW5hY3RpdmUgPSB0cnVlO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3Qgb1BhcmFtczogYW55ID0ge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuSW5saW5lLFxuXHRcdFx0Y3JlYXRlQXRFbmQ6IGJBdEVuZCxcblx0XHRcdGluYWN0aXZlOiBiSW5hY3RpdmUsXG5cdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdGJ1c3lNb2RlOiBcIk5vbmVcIlxuXHRcdH07XG5cdFx0dHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQob0JpbmRpbmcsIG9QYXJhbXMsIG9SZXNvdXJjZUJ1bmRsZSwgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSwgZmFsc2UsIHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qXG5cdFx0XHQgVE8gQkUgQ0hFQ0tFRCAvIERJU0NVU1NFRFxuXHRcdFx0IF9jcmVhdGVNdWx0aXBsZURvY3VtZW50cyBhbmQgZGVsZXRlTXVsdGlEb2N1bWVudCAtIGNvdWxkbid0IHdlIGNvbWJpbmUgdGhlbSB3aXRoIGNyZWF0ZSBhbmQgZGVsZXRlIGRvY3VtZW50P1xuXHRcdFx0IF9jcmVhdGVBY3Rpb25Qcm9taXNlIGFuZCBkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSAtPiBuZXh0IHN0ZXBcblxuXHRcdFx0ICovXG5cblx0X3NldEVkaXRNb2RlKHNFZGl0TW9kZTogYW55LCBiQ3JlYXRpb25Nb2RlPzogYm9vbGVhbikge1xuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LnNldEVkaXRNb2RlKHNFZGl0TW9kZSwgYkNyZWF0aW9uTW9kZSk7XG5cdH1cblxuXHRfc2V0RHJhZnRTdGF0dXMoc0RyYWZ0U3RhdGU6IGFueSkge1xuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKHNEcmFmdFN0YXRlKTtcblx0fVxuXG5cdF9nZXRSb3V0aW5nTGlzdGVuZXIoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldFJvdXRpbmdMaXN0ZW5lcigpO1xuXHR9XG5cblx0X2dldEdsb2JhbFVJTW9kZWwoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEdsb2JhbFVJTW9kZWwoKTtcblx0fVxuXHRfc3luY1Rhc2sodlRhc2s/OiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuc3luY1Rhc2sodlRhc2spO1xuXHR9XG5cblx0X2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0fVxuXG5cdF9kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0X2hhbmRsZUNyZWF0ZUV2ZW50cyhvQmluZGluZzogYW55KSB7XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuaGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nKTtcblx0fVxuXG5cdF9nZXRUcmFuc2FjdGlvbkhlbHBlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0fVxuXG5cdF9nZXRJbnRlcm5hbE1vZGVsKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VCdW5kbGUoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGU7XG5cdH1cblxuXHRfZ2V0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY3JlYXRlQWN0aW9uUHJvbWlzZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICpcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXG5cdF9jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lOiBhbnksIHNDb250cm9sSWQ6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBzQ29udHJvbElkKTtcblx0fVxuXG5cdF9nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0fVxuXG5cdF9kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTtcblx0fVxuXG5cdF9nZXRNZXNzYWdlSGFuZGxlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0TWVzc2FnZUhhbmRsZXIoKTtcblx0fVxuXG5cdF9zZW5kQWN0aXZpdHkoYWN0aW9uOiBBY3Rpdml0eSwgcmVsYXRlZENvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdIHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3QgY29udGVudCA9IEFycmF5LmlzQXJyYXkocmVsYXRlZENvbnRleHRzKSA/IHJlbGF0ZWRDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKSA6IHJlbGF0ZWRDb250ZXh0cz8uZ2V0UGF0aCgpO1xuXHRcdHNlbmQodGhpcy5nZXRWaWV3KCksIGFjdGlvbiwgY29udGVudCk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IHRyaWdnZXJUeXBlKSB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5nZXRWaWV3KCksIHNBY3Rpb25OYW1lLCB0cmlnZ2VyVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdF9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG9SZXNwb25zZTogb2JqZWN0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSk7XG5cdH1cblxuXHRhc3luYyBfc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQ6IGFueSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IG9Nb2RlbC5vUmVxdWVzdG9yLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZVN0aWNreU9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9uKG9Db250ZXh0KTtcblx0fVxuXG5cdF9oYW5kbGVTdGlja3lPZmYoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JblNlc3Npb24oKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93Lm9uQmFja05hdmlnYXRpb25JblNlc3Npb24oKTtcblx0fVxuXG5cdF9kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dCk7XG5cdH1cblxuXHRfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBhbnksIG1vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCAobW9kZWwuZ2V0SHR0cEhlYWRlcnModHJ1ZSkgYXMgYW55KVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IGFueSkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuX2dldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLl9oYW5kbGVTdGlja3lPZmYoLypvQ29udGV4dCovKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogYW55LFxuXHRcdGJFZGl0YWJsZTogYm9vbGVhbixcblx0XHRiUmVjcmVhdGVDb250ZXh0OiBib29sZWFuLFxuXHRcdGJEcmFmdE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuLFxuXHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eT86IGJvb2xlYW5cblx0KSB7XG5cdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IGJFZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRiUmVjcmVhdGVDb250ZXh0OiBiUmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRiRm9yY2VGb2N1czogYkZvcmNlRm9jdXMsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZSxcblx0XHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IGFueSwgcGFyYW1zOiBhbnkpIHtcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSAodmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdGlvbiBlcnJvcnMsIGFuZCByZWplY3RzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIGVycm9yc1xuXHQgKi9cblxuXHRfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCkge1xuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cdFx0XHRsZXQgb01lc3NhZ2U7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiTm8gdmFsaWRhdGlvbiBlcnJvcnMgZm91bmRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYU1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdG9NZXNzYWdlID0gYU1lc3NhZ2VzW2ldO1xuXHRcdFx0XHRpZiAob01lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gQ29yZS5ieUlkKG9NZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29udHJvbC5nZXRJZCgpID09PSBzVmlld0lkKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX3JlZnJlc2hMaXN0SWZSZXF1aXJlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBib3VuZCBjb250ZXh0IG9uIHdoaWNoIHRoZSBhY3Rpb24gd2FzIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBbHdheXMgcmVzb2x2ZXMgdG8gcGFyYW0gb1Jlc3BvbnNlXG5cdCAqL1xuXHRfcmVmcmVzaExpc3RJZlJlcXVpcmVkKG9SZXNwb25zZTogYW55LCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdC8vIHJlZnJlc2ggb25seSBsaXN0c1xuXHRcdGlmIChvQmluZGluZyAmJiBvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1Jlc3BvbnNlLm9EYXRhO1xuXHRcdFx0Y29uc3QgYUtleXMgPSBvUmVzcG9uc2Uua2V5cztcblx0XHRcdGNvbnN0IG9DdXJyZW50RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0bGV0IGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSB0cnVlO1xuXHRcdFx0Ly8gZW5zdXJlIGNvbnRleHQgaXMgaW4gdGhlIHJlc3BvbnNlXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbnRleHREYXRhKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gY2hlY2sgaWYgY29udGV4dCBpbiByZXNwb25zZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgYm91bmQgY29udGV4dFxuXHRcdFx0XHRiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvQ3VycmVudERhdGFbc0tleV0gPT09IG9Db250ZXh0RGF0YVtzS2V5XTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghYlJldHVybmVkQ29udGV4dElzU2FtZSkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKChvQmluZGluZyBhcyBhbnkpLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBvQmluZGluZy5nZXRQYXRoKCkgfV0sIG9CaW5kaW5nLmdldENvbnRleHQoKSBhcyBDb250ZXh0KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIiwgZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcmVzb2x2ZSB3aXRoIG9SZXNwb25zZSB0byBub3QgZGlzdHVyYiB0aGUgcHJvbWlzZSBjaGFpbiBhZnRlcndhcmRzXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0X2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSxcblx0XHRcdHNFbnRpdHlTZXROYW1lID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzRW50aXR5U2V0TmFtZSk7XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cyAmJiBhU2VtYW50aWNLZXlzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYVJlcXVlc3RQcm9taXNlcyA9IGFTZW1hbnRpY0tleXMubWFwKGZ1bmN0aW9uIChvS2V5OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RPYmplY3Qob0tleS4kUHJvcGVydHlQYXRoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlcXVlc3RQcm9taXNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvLyBVZ2x5IFdvcmthcm91bmQgdG8gb3ZlcmNvbWUgbWRjIGZpZWxkIGlzc3VlLCB3ZSByZW1vdmUgdGhlIGJpbmRpbmcgY29udGV4dCBiZWZvcmVcblx0Ly8gc3dpdGNoaW5nIHRvIGRpc3BsYXkgbW9kZSB0byBhdm9pZCB0aGUgZmllbGQgcmVhZHMgYWRkaXRpb25hbCB2YWx1ZXMgZm9yIG5vbiBleGlzdGluZ1xuXHQvLyBkcmFmdHMgb3Igc3RpY2t5IHNlc3Npb25zIGluIHRoZSBiYWNrZW5kXG5cdF9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcygpIHtcblx0XHRsZXQgYVBhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvRkNMID0gb0FwcENvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKCkgYXMgRmxleGlibGVDb2x1bW5MYXlvdXQ7XG5cdFx0XHRhUGFnZXMgPSBhUGFnZXMuY29uY2F0KG9GQ0wuZ2V0TWlkQ29sdW1uUGFnZXMoKSB8fCBbXSk7XG5cdFx0XHRhUGFnZXMgPSBhUGFnZXMuY29uY2F0KG9GQ0wuZ2V0RW5kQ29sdW1uUGFnZXMoKSB8fCBbXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9OYXZDb250YWluZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKSBhcyBOYXZDb250YWluZXI7XG5cdFx0XHRhUGFnZXMgPSBvTmF2Q29udGFpbmVyLmdldFBhZ2VzKCkgfHwgW107XG5cdFx0fVxuXG5cdFx0YVBhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG9QYWdlOiBhbnkpIHtcblx0XHRcdGlmIChvUGFnZS5pc0EoXCJzYXAudWkuY29yZS5Db21wb25lbnRDb250YWluZXJcIikpIHtcblx0XHRcdFx0b1BhZ2UgPSBvUGFnZS5nZXRDb21wb25lbnRJbnN0YW5jZSgpOyAvLyBUaGUgYmluZGluZyBjb250ZXh0IGlzIHNldCBhdCB0aGUgY29tcG9uZW50IGxldmVsLCBub3QgdGhlIGNvbXBvbmVudCBjb250YWluZXJcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9QYWdlLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0b1BhZ2Uuc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbVN1YlNlY3Rpb25zKG9Db250cm9sOiBhbnksIHNPdmVybG9hZEVudGl0eVR5cGU6IHN0cmluZykge1xuXHRcdGxldCBvQ3VycmVudENvbnRyb2w6IGFueTtcblxuXHRcdGZ1bmN0aW9uIF9jaGVja0FjdGlvbnMoYUFjdGlvbnM6IEFycmF5PG9iamVjdD4pIHtcblx0XHRcdGxldCBvQWN0aW9uQmluZGluZ0NvbnRleHQ6IGFueTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGFBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9BY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdG9BY3Rpb25CaW5kaW5nQ29udGV4dCA9IG9BY3Rpb24uZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHRcblx0XHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXRhQ29udGV4dChvQWN0aW9uQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKVxuXHRcdFx0XHRcdFx0XHQuZ2V0T2JqZWN0KFwiJFR5cGVcIikgPT09IHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHRocm93IFwiY29udGV4dCBmb3VuZCAtIHN0b3AgYWN0aW9ucyBsb29wXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3Rpb25CaW5kaW5nQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBfY2hlY2tTdWJTZWN0aW9ucyhhU3ViU2VjdGlvbnM6IEFycmF5PG9iamVjdD4pIHtcblx0XHRcdGxldCBvQWN0aW9uQmluZGluZ0NvbnRleHQ6IGFueTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGFTdWJTZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9BY3Rpb25CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgXCJjb250ZXh0IGZvdW5kIC0gc3RvcCBTdWJTZWN0aW9ucyBsb29wXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvU3ViU2VjdGlvbi5nZXRCaW5kaW5nQ29udGV4dCgpID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBhQWN0aW9ucyA9IG9TdWJTZWN0aW9uLmdldEFnZ3JlZ2F0aW9uKFwiYWN0aW9uc1wiKTtcblx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHQgPSBfY2hlY2tBY3Rpb25zKGFBY3Rpb25zKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQgPyBvQWN0aW9uQmluZGluZ0NvbnRleHQgOiB1bmRlZmluZWQ7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQ29udHJvbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImlucHV0IHBhcmFtZXRlciBvQ29udHJvbCB1bmRlZmluZWQgd2hlbiB0cnlpbmcgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gb3ZlcmxvYWQgY29udGV4dFwiKTtcblx0XHRcdH1cblxuXHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0NvbnRyb2w7XG5cdFx0XHR3aGlsZSAoIW9DdXJyZW50Q29udHJvbC5pc0EoXCJzYXAudXhhcC5PYmplY3RQYWdlU2VjdGlvblwiKSkge1xuXHRcdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ3VycmVudENvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghb0N1cnJlbnRDb250cm9sKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk9iamVjdFBhZ2VTZWN0aW9uIG5vdCBmb3VuZCBpbiBVSSBoaWVyYXJjaHlcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSBvQ3VycmVudENvbnRyb2wuZ2V0QWdncmVnYXRpb24oXCJzdWJTZWN0aW9uc1wiKTtcblx0XHRcdFx0cmV0dXJuIF9jaGVja1N1YlNlY3Rpb25zKGFTdWJTZWN0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdF9jcmVhdGVTaWJsaW5nSW5mbyhjdXJyZW50Q29udGV4dDogQ29udGV4dCwgbmV3Q29udGV4dDogQ29udGV4dCk6IFNpYmxpbmdJbmZvcm1hdGlvbiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG5ld0NvbnRleHQsXG5cdFx0XHRwYXRoTWFwcGluZzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2xkUGF0aDogY3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld0NvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0X3VwZGF0ZVBhdGhzSW5IaXN0b3J5KG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldFBhdGhNYXBwaW5nKG1hcHBpbmdzKTtcblxuXHRcdC8vIEFsc28gdXBkYXRlIHRoZSBzZW1hbnRpYyBtYXBwaW5nIGluIHRoZSByb3V0aW5nIHNlcnZpY2Vcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0aWYgKG1hcHBpbmdzLmxlbmd0aCAmJiBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5vbGRQYXRoKSB7XG5cdFx0XHRsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZHMgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWItb2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoIGZvclxuXHQgKiBhbGwgaW50ZXJtZWRpYXRlcyBwYXRocyBiZXR3ZWVuIHRoZSBPUCBhbmQgdGhlIHN1Yi1PUC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3ViLW9iamVjdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gZG9Ob3RDb21wdXRlSWZSb290IElmIHRydWUsIHdlIGRvbid0IGNvbXB1dGUgc2libGluZ0luZm8gaWYgdGhlIHJvb3QgYW5kIHRoZSByaWdodG1vc3QgY29udGV4dHMgYXJlIHRoZSBzYW1lXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCkgYXMgQ29udGV4dCxcblx0XHRcdFx0cGF0aE1hcHBpbmc6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0RmxvdztcbiJdfQ==