@sapui5/sap.fe.core 1.141.2 → 1.142.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +4 -1
  3. package/src/sap/fe/core/ActionRuntime.js +48 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +61 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +94 -8
  7. package/src/sap/fe/core/AppStateHandler.js +9 -8
  8. package/src/sap/fe/core/AppStateHandler.ts +13 -9
  9. package/src/sap/fe/core/BaseController.js +8 -5
  10. package/src/sap/fe/core/BaseController.ts +6 -1
  11. package/src/sap/fe/core/CommonUtils.js +4 -123
  12. package/src/sap/fe/core/CommonUtils.ts +3 -172
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -10
  14. package/src/sap/fe/core/ExtensionAPI.ts +2 -14
  15. package/src/sap/fe/core/PageController.js +64 -43
  16. package/src/sap/fe/core/PageController.ts +62 -47
  17. package/src/sap/fe/core/TemplateComponent.js +20 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +24 -2
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
  21. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
  23. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
  24. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
  25. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +4 -1
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -0
  27. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
  28. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
  29. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -39
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +91 -54
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -3
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -3
  33. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
  34. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +8 -9
  41. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
  44. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
  45. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +9 -5
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +7 -7
  49. package/src/sap/fe/core/controllerextensions/Share.js +5 -5
  50. package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
  53. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
  54. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
  55. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +33 -11
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +45 -14
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +7 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +6 -5
  65. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  66. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +10 -6
  70. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -5
  71. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +11 -9
  72. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +22 -9
  73. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  74. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  75. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +31 -2
  76. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +34 -1
  77. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  78. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  79. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  80. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  81. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  82. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  83. package/src/sap/fe/core/converters/common/AnnotationConverter.js +88 -35
  84. package/src/sap/fe/core/converters/controls/Common/Action.js +57 -20
  85. package/src/sap/fe/core/converters/controls/Common/Action.ts +71 -21
  86. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  87. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  88. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  89. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  90. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -57
  91. package/src/sap/fe/core/converters/controls/Common/Table.ts +110 -56
  92. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  93. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  94. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  95. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +172 -78
  96. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
  98. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  100. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  101. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  102. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  103. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  104. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  105. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  106. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  107. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  108. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
  110. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  112. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  113. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  114. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  115. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  118. package/src/sap/fe/core/fpm/Component.js +8 -1
  119. package/src/sap/fe/core/fpm/Component.ts +8 -0
  120. package/src/sap/fe/core/fpm/manifest.json +1 -1
  121. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  122. package/src/sap/fe/core/helpers/AppStartupHelper.ts +91 -32
  123. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  124. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  125. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  126. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  127. package/src/sap/fe/core/helpers/ModelHelper.js +48 -9
  128. package/src/sap/fe/core/helpers/ModelHelper.ts +55 -10
  129. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  130. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  131. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  132. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  133. package/src/sap/fe/core/library.js +30 -3
  134. package/src/sap/fe/core/library.ts +28 -1
  135. package/src/sap/fe/core/messagebundle.properties +8 -1
  136. package/src/sap/fe/core/messagebundle_ar.properties +7 -0
  137. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  138. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  139. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  140. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  141. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  143. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  144. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  146. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +5 -0
  148. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  149. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  152. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  153. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  154. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  159. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  167. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_no.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  175. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  184. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  185. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  186. package/src/sap/fe/core/rootView/Fcl.controller.ts +28 -6
  187. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  188. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  189. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  190. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  191. package/src/sap/fe/core/services/RoutingServiceFactory.js +16 -7
  192. package/src/sap/fe/core/services/RoutingServiceFactory.ts +23 -10
  193. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  194. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  195. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +62 -6
  196. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +74 -11
  197. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  198. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  200. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  201. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  202. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  203. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  204. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  205. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  206. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  207. package/ui5.yaml +2 -0
@@ -30,6 +30,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
30
30
  var isPathAnnotationExpression = TypeGuards.isPathAnnotationExpression;
31
31
  var isNavigationProperty = TypeGuards.isNavigationProperty;
32
32
  var isAnnotationOfType = TypeGuards.isAnnotationOfType;
33
+ var isAnnotationOfTerm = TypeGuards.isAnnotationOfTerm;
33
34
  var replaceSpecialChars = StableIdHelper.replaceSpecialChars;
34
35
  var UI = BindingHelper.UI;
35
36
  var KeyHelper = Key.KeyHelper;
@@ -37,6 +38,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
37
38
  var IssueCategoryType = IssueManager.IssueCategoryType;
38
39
  var IssueCategory = IssueManager.IssueCategory;
39
40
  var isReferencePropertyStaticallyHidden = DataFieldHelper.isReferencePropertyStaticallyHidden;
41
+ var getConnectedFieldsData = DataFieldHelper.getConnectedFieldsData;
40
42
  var insertCustomElements = ConfigurableObject.insertCustomElements;
41
43
  var Placement = ConfigurableObject.Placement;
42
44
  var OverrideType = ConfigurableObject.OverrideType;
@@ -48,6 +50,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
48
50
  var isDataField = DataField.isDataField;
49
51
  var hasFieldGroupTarget = DataField.hasFieldGroupTarget;
50
52
  var hasDataPointTarget = DataField.hasDataPointTarget;
53
+ var hasConnectedFieldsTarget = DataField.hasConnectedFieldsTarget;
51
54
  var getTargetValueOnDataPoint = DataField.getTargetValueOnDataPoint;
52
55
  var getSemanticObjectPath = DataField.getSemanticObjectPath;
53
56
  var getDataFieldDataType = DataField.getDataFieldDataType;
@@ -96,7 +99,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
96
99
  _exports.ColumnType = ColumnType;
97
100
  function getTableColumns(lineItemAnnotation, tableType, visualizationPath, converterContext) {
98
101
  const annotationColumns = getColumnsFromAnnotations(lineItemAnnotation, tableType, visualizationPath, converterContext);
99
- const manifestColumns = getColumnsFromManifest(converterContext.getManifestControlConfiguration(visualizationPath).columns ?? {}, annotationColumns, converterContext, converterContext.getAnnotationEntityType(lineItemAnnotation));
102
+ const manifestColumns = getColumnsFromManifest(converterContext.getManifestControlConfiguration(visualizationPath).columns ?? {}, annotationColumns, converterContext, converterContext.getAnnotationEntityType(lineItemAnnotation), tableType);
100
103
  const tableColumns = insertCustomElements(annotationColumns, manifestColumns, {
101
104
  width: OverrideType.overwrite,
102
105
  widthIncludingColumnHeader: OverrideType.overwrite,
@@ -180,7 +183,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
180
183
  * @param tableColumn The table column which adds the text
181
184
  */
182
185
  function addTextArrangentInfoToProperty(property, propertyDataModelObjectPath, tableColumns, tableColumn) {
183
- const displayMode = getDisplayMode(property),
186
+ const displayMode = getDisplayMode(property, propertyDataModelObjectPath.targetEntityType),
184
187
  textPropertyPath = getAssociatedTextPropertyPath(property);
185
188
  if (textPropertyPath && displayMode !== "Value") {
186
189
  const textPropertyDataModelObjectPath = enhanceDataModelPath(propertyDataModelObjectPath, textPropertyPath);
@@ -264,7 +267,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
264
267
  // In case a property has defined a #TextOnly text arrangement that points to a text property (and not a 'hard coded text') don't only create the complex property with the text property as a child property,
265
268
  // but also the property itself as it can be used as within the sortConditions or on custom columns.
266
269
  // This step must be valid also from the columns added via LineItems or from a column available on the p13n.
267
- if (getDisplayMode(property) === "Description") {
270
+ if (getDisplayMode(property, entityType) === "Description") {
268
271
  restrictionsOnProperties?.nonSortableProperties.push(property.name);
269
272
  if (isPathAnnotationExpression(property?.annotations?.Common?.Text)) {
270
273
  annotationColumns.push(getColumnDefinitionFromProperty(property, converterContext.getEntitySetBasedAnnotationPath(property.fullyQualifiedName), property.name, false, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, tableType, restrictionsOnProperties, tableCreationMode));
@@ -286,6 +289,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
286
289
  * @param aggregationHelper The aggregationHelper for the entity
287
290
  * @param converterContext The converter context
288
291
  * @param displayModeOfDescriptionPropertiesMap The map of properties referenced as description on a text arrangement annotation
292
+ * @param tableType The type of the table
289
293
  * @param restrictionsOnProperties The existing restrictions on properties
290
294
  * @param tableCreationMode The creation mode of the table
291
295
  * @param relatedPropertiesInfo The properties identified so far for the column
@@ -303,8 +307,10 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
303
307
  const propertyTypeConfig = getTypeConfig(property, dataType);
304
308
  const isAPropertyFromTextOnlyAnnotation = displayModeOfDescriptionPropertiesMap[relativePath] === "Description";
305
309
  const sortable = (!isHidden || isAPropertyFromTextOnlyAnnotation) && !restrictionsOnProperties?.nonSortableProperties.includes(relativePath);
310
+ const isAnalyticalTable = aggregationHelper.isAnalyticsSupported() && tableType === "AnalyticalTable";
306
311
  const filterable = !restrictionsOnProperties?.nonFilterableProperties.includes(relativePath);
307
- const groupable = aggregationHelper.isAnalyticsSupported() && tableType === "AnalyticalTable" ? !!aggregationHelper.isPropertyGroupable(property) : sortable;
312
+ // groupable properties on an analytical table should consider hidden properties and text only annotations as other table types do
313
+ const groupable = isAnalyticalTable ? !!aggregationHelper.isPropertyGroupable(property) && (!isHidden || isAPropertyFromTextOnlyAnnotation) : sortable;
308
314
  const typeConfig = {
309
315
  className: property.type || dataType,
310
316
  formatOptions: propertyTypeConfig.formatOptions,
@@ -346,15 +352,33 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
346
352
  };
347
353
  _addToolTip(property, column);
348
354
  _setExportSettingsForDataPoint(property, column);
349
- if (aggregationHelper.isAnalyticsSupported() && ModelHelper.isObjectPathDraftSupported(converterContext.getDataModelObjectPath()) && (relativePath === "HasActiveEntity" || relativePath === "HasDraftEntity" || relativePath === "IsActiveEntity")) {
350
- // In case of analytical table on a draft-enabled entity, we always consider the HasDraftEntity, HasActiveEntity and IsActiveEntity properties as
351
- // technically groupable, as we need to load them for our internal logic.
355
+ if (isAnalyticalTable) {
356
+ setTechnicalExtension(column, property, aggregationHelper, converterContext, relativePath);
357
+ }
358
+ return column;
359
+ };
360
+
361
+ /**
362
+ * Sets the technical extension for analytics scenarios.
363
+ * @param column The table column
364
+ * @param property The property linked to the column
365
+ * @param aggregationHelper The aggregation helper
366
+ * @param converterContext The converter context
367
+ * @param relativePath The relative path of the property
368
+ */
369
+ const setTechnicalExtension = function (column, property, aggregationHelper, converterContext, relativePath) {
370
+ const isDraftSupported = ModelHelper.isObjectPathDraftSupported(converterContext.getDataModelObjectPath());
371
+ const draftProperties = ["HasActiveEntity", "HasDraftEntity", "IsActiveEntity"];
372
+ const isDraftProperty = draftProperties.includes(relativePath);
373
+ const isGroupableProperty = !!aggregationHelper.isPropertyGroupable(property);
374
+ if (isDraftSupported && isDraftProperty ||
375
+ // column.isGroupable can be false when the property is hidden but it could be technically groupable
376
+ isGroupableProperty && !column.isGroupable) {
352
377
  column.extension = {
353
378
  technicallyAggregatable: false,
354
379
  technicallyGroupable: true
355
380
  };
356
381
  }
357
- return column;
358
382
  };
359
383
 
360
384
  /**
@@ -371,7 +395,8 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
371
395
  // This is required when we have a text only annotation to compute the export settings from the text instead of the value
372
396
  column = relatedPropertiesInfo.properties[relatedPropertyNames[0]].annotationProperty;
373
397
  }
374
- const dataType = getDataFieldDataType(column);
398
+ const isConnectedFields = isAnnotationOfType(column, "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") && isAnnotationOfTerm(column.Target.$target, "com.sap.vocabularies.UI.v1.ConnectedFields");
399
+ const dataType = isConnectedFields ? "String" : getDataFieldDataType(column);
375
400
  if (isProperty(column)) {
376
401
  unitProperty = getAssociatedUnitProperty(column);
377
402
  currencyProperty = getAssociatedCurrencyProperty(column);
@@ -539,22 +564,23 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
539
564
  };
540
565
 
541
566
  /**
542
- * Returns hidden binding expressions for a field group.
543
- * @param dataFieldGroup DataField defined in the annotations
544
- * @returns Compile binding of field group expressions.
567
+ * Returns hidden binding expressions for a field group or connected fields.
568
+ * @param dataField DataField defined in the annotations
569
+ * @returns Compile binding of field group/connected fields expressions.
545
570
  */
546
- const _getFieldGroupHiddenExpressions = function (dataFieldGroup) {
547
- const fieldGroupHiddenExpressions = [];
548
- if (dataFieldGroup.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && dataFieldGroup.Target?.$target?.$Type === "com.sap.vocabularies.UI.v1.FieldGroupType") {
549
- if (dataFieldGroup?.annotations?.UI?.Hidden) {
550
- return compileExpression(not(equal(getExpressionFromAnnotation(dataFieldGroup.annotations.UI.Hidden), true)));
571
+ const _getHiddenExpressions = function (dataField) {
572
+ const collectionFieldsHiddenExpression = [];
573
+ if (isAnnotationOfType(dataField, "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") && (isAnnotationOfTerm(dataField.Target.$target, "com.sap.vocabularies.UI.v1.ConnectedFields") || isAnnotationOfTerm(dataField.Target.$target, "com.sap.vocabularies.UI.v1.FieldGroup"))) {
574
+ if (dataField?.annotations?.UI?.Hidden) {
575
+ return compileExpression(not(equal(getExpressionFromAnnotation(dataField.annotations.UI.Hidden), true)));
551
576
  } else {
552
- dataFieldGroup.Target.$target.Data?.forEach(innerDataField => {
553
- fieldGroupHiddenExpressions.push(_getVisibleExpression({
577
+ const collectionData = hasFieldGroupTarget(dataField) ? dataField.Target.$target.Data : getConnectedFieldsData(dataField.Target.$target);
578
+ collectionData?.forEach(innerDataField => {
579
+ collectionFieldsHiddenExpression.push(_getVisibleExpression({
554
580
  targetObject: innerDataField
555
581
  }));
556
582
  });
557
- return compileExpression(ifElse(or(...fieldGroupHiddenExpressions), constant(true), constant(false)));
583
+ return compileExpression(ifElse(or(...collectionFieldsHiddenExpression), constant(true), constant(false)));
558
584
  }
559
585
  } else {
560
586
  return undefined;
@@ -563,7 +589,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
563
589
 
564
590
  /**
565
591
  * Returns the label for the property and dataField.
566
- * @param [property] Property, DataField or Navigation Property defined in the annotations
592
+ * @param [property] Property, DataField, or Navigation Property defined in the annotations
567
593
  * @param isGroup
568
594
  * @returns Label of the property or DataField
569
595
  */
@@ -584,7 +610,24 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
584
610
  }
585
611
  return property?.Label?.toString() ?? compileExpression(getExpressionFromAnnotation(property.Value?.$target?.annotations?.Common?.Label, [], property.Value?.$target?.name));
586
612
  } else if (property.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") {
587
- return property.Label?.toString() ?? compileExpression(getExpressionFromAnnotation(property.Target?.$target?.Value?.$target?.annotations?.Common?.Label?.valueOf()));
613
+ if (property.Label?.toString()) {
614
+ return property.Label?.toString();
615
+ }
616
+ const target = property.Target.$target;
617
+ switch (target?.$Type) {
618
+ // if it is a DataFieldForAnnotation pointing to a DataPoint we look at the dataPoint's label
619
+ case "com.sap.vocabularies.UI.v1.DataPointType":
620
+ if (target?.Value?.$target) {
621
+ return compileExpression(getExpressionFromAnnotation(target.Value?.$target?.annotations?.Common?.Label?.valueOf()));
622
+ }
623
+ break;
624
+ // if it is a DataFieldForAnnotation pointing to a FieldGroup or a ConnectedFields we look at the dataFieldAbstract's label
625
+ case "com.sap.vocabularies.UI.v1.FieldGroupType":
626
+ case "com.sap.vocabularies.UI.v1.ConnectedFieldsType":
627
+ return target.Label?.toString() ?? "";
628
+ default:
629
+ return "";
630
+ }
588
631
  } else {
589
632
  return property.Label?.toString();
590
633
  }
@@ -615,6 +658,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
615
658
  * @param converterContext The converter context.
616
659
  * @param entityType The entity type for the LineItem
617
660
  * @param displayModeOfDescriptionPropertiesMap The map of properties referenced as text on a text arrangement annotation.
661
+ * @param tableType The type of the table
618
662
  * @param tableCreationMode The creation mode of the table
619
663
  * @param restrictionsOnProperties The existing restrictions on properties
620
664
  * @returns The array of columns created.
@@ -954,26 +998,56 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
954
998
  if (isAnnotationOfType(dataFieldTarget, "com.sap.vocabularies.UI.v1.FieldGroupType")) {
955
999
  const fieldGroupData = dataFieldTarget.Data;
956
1000
  //If a FieldGroup contains a semanticKey or required property, importance set to High
957
- if (fieldGroupData.some(function (fieldGroupDataField) {
1001
+ const hasHighKey = fieldGroupData.some(fieldGroupDataField => {
958
1002
  return isDataFieldTypes(fieldGroupDataField) && highKeys.includes(fieldGroupDataField.Value?.$target?.fullyQualifiedName);
959
- })) {
1003
+ });
1004
+ if (hasHighKey) {
960
1005
  return Importance.High;
961
- } else {
962
- //If the DataFieldForAnnotation has an Importance we take it
963
- if (dataField?.annotations?.UI?.Importance) {
964
- return _getDataFieldImportance(dataField);
965
- }
966
- // else the highest importance (if any) is returned
967
- fieldsWithImportance = fieldGroupData.filter(function (item) {
968
- return item?.annotations?.UI?.Importance;
969
- });
970
- return _getMaxImportance(fieldsWithImportance);
1006
+ }
1007
+ //If the DataFieldForAnnotation has an Importance we take it
1008
+ if (dataField?.annotations?.UI?.Importance) {
1009
+ return _getDataFieldImportance(dataField);
1010
+ }
1011
+ // else the highest importance (if any) is returned
1012
+ fieldsWithImportance = fieldGroupData.filter(function (item) {
1013
+ return item?.annotations?.UI?.Importance;
1014
+ });
1015
+ return _getMaxImportance(fieldsWithImportance);
1016
+ }
1017
+ if (isAnnotationOfType(dataFieldTarget, "com.sap.vocabularies.UI.v1.ConnectedFieldsType")) {
1018
+ const connectedFieldsData = getConnectedFieldsData(dataFieldTarget);
1019
+ // If the connectedFields contains a required property, importance set to High
1020
+ const requiredKeys = requiredProperties.map(p => p.$target?.fullyQualifiedName);
1021
+ const hasRequiredHighKey = connectedFieldsData.some(connectedDataField => {
1022
+ return isDataFieldTypes(connectedDataField) && requiredKeys.includes(connectedDataField.Value?.$target?.fullyQualifiedName);
1023
+ });
1024
+ if (hasRequiredHighKey) {
1025
+ return Importance.High;
1026
+ }
1027
+ //If the DataFieldForAnnotation has an Importance we take it
1028
+ if (dataField?.annotations?.UI?.Importance) {
1029
+ return _getDataFieldImportance(dataField);
971
1030
  }
972
1031
  }
973
1032
  }
974
1033
  return highKeys.includes(dataField.Value?.$target?.fullyQualifiedName) ? Importance.High : _getDataFieldImportance(dataField);
975
1034
  }
976
1035
 
1036
+ /**
1037
+ * Gets the disableStrictHandling setting for an action from manifest configuration.
1038
+ * @param dataField The DataFieldForAction
1039
+ * @param key The action key
1040
+ * @param tableManifestSettings The table manifest configuration
1041
+ * @returns DisableStrictHandling setting or undefined
1042
+ */
1043
+ _exports.getImportance = getImportance;
1044
+ function getEnableStrictHandlingFromManifest(dataField, key, tableManifestSettings) {
1045
+ if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction") {
1046
+ return tableManifestSettings.actions?.[key]?.disableStrictHandling;
1047
+ }
1048
+ return undefined;
1049
+ }
1050
+
977
1051
  /**
978
1052
  * Returns line items from metadata annotations.
979
1053
  * @param lineItemAnnotation Collection of data fields with their annotations
@@ -982,7 +1056,6 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
982
1056
  * @param converterContext The converter context
983
1057
  * @returns The columns from the annotations
984
1058
  */
985
- _exports.getImportance = getImportance;
986
1059
  const getColumnsFromAnnotations = function (lineItemAnnotation, tableType, visualizationPath, converterContext) {
987
1060
  const entityType = converterContext.getAnnotationEntityType(lineItemAnnotation),
988
1061
  annotationColumns = [],
@@ -1023,10 +1096,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1023
1096
  if (situationsNavProp && formatOptions) {
1024
1097
  formatOptions.hasSituationsIndicator = true;
1025
1098
  }
1026
- let fieldGroupHiddenExpressions;
1027
- if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && dataField.Target?.$target?.$Type === "com.sap.vocabularies.UI.v1.FieldGroupType") {
1028
- fieldGroupHiddenExpressions = _getFieldGroupHiddenExpressions(dataField);
1029
- }
1099
+ const collectionFieldsHiddenExpression = _getHiddenExpressions(dataField);
1030
1100
  const isMultiValue = _isColumnMultiValued(dataField, tableConverterContext);
1031
1101
  if (!isMultiValue && _isExportableColumn(dataField)) {
1032
1102
  //exclude the types listed above for the Export (generates error on Export as PDF)
@@ -1051,13 +1121,15 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1051
1121
  }
1052
1122
  const sortable = !isMultiValue && _isColumnSortable(dataField, relativePath, restrictionsOnProperties.nonSortableProperties, relatedPropertiesInfo);
1053
1123
  const availability = isReferencePropertyStaticallyHidden(dataField) ? "Hidden" : "Default";
1124
+ const columnKey = KeyHelper.generateKeyFromDataField(dataField);
1054
1125
  const column = {
1055
- key: KeyHelper.generateKeyFromDataField(dataField),
1126
+ key: columnKey,
1127
+ //KeyHelper.generateKeyFromDataField(dataField),
1056
1128
  type: ColumnType.Annotation,
1057
1129
  label: label ?? name,
1058
1130
  groupLabel: isGroup ? getLabel(dataField) : undefined,
1059
1131
  group: isGroup ? groupPath : undefined,
1060
- FieldGroupHiddenExpressions: fieldGroupHiddenExpressions,
1132
+ collectionFieldsHiddenExpression: collectionFieldsHiddenExpression,
1061
1133
  annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
1062
1134
  semanticObjectPath: semanticObjectAnnotationPath,
1063
1135
  availability: availability,
@@ -1081,6 +1153,10 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1081
1153
  dataType: dataType ?? "Edm.String",
1082
1154
  isMultiValue
1083
1155
  };
1156
+ const strictHandlingSettingForColumn = getEnableStrictHandlingFromManifest(dataField, columnKey, tableManifestSettings);
1157
+ if (strictHandlingSettingForColumn !== undefined) {
1158
+ column.disableStrictHandling = strictHandlingSettingForColumn;
1159
+ }
1084
1160
  const tooltip = _getTooltip(dataField) ?? label;
1085
1161
  if (tooltip) {
1086
1162
  column.tooltip = tooltip;
@@ -1145,15 +1221,20 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1145
1221
  };
1146
1222
 
1147
1223
  /**
1148
- * Determines if the field group has to be flagged as required.
1224
+ * Determines if the dataField has to be flagged as required.
1149
1225
  * @param converterContext The converter context
1150
- * @param fieldGroup The fieldGroup being processed
1226
+ * @param dataField The dataField being processed
1151
1227
  * @param tableCreationMode The creation mode of the underlying table
1152
- * @returns True if the fieldGroup is required.
1228
+ * @returns True if the dataField is required.
1153
1229
  */
1154
- const isRequiredFieldGroup = function (converterContext, fieldGroup, tableCreationMode) {
1155
- const fieldGroupData = fieldGroup.Data;
1156
- return fieldGroupData.some(function (item) {
1230
+ const isRequired = function (converterContext, dataField, tableCreationMode) {
1231
+ let dataFieldData;
1232
+ if (isAnnotationOfTerm(dataField, "com.sap.vocabularies.UI.v1.ConnectedFields")) {
1233
+ dataFieldData = getConnectedFieldsData(dataField);
1234
+ } else {
1235
+ dataFieldData = dataField.Data;
1236
+ }
1237
+ return dataFieldData.some(function (item) {
1157
1238
  // we exclude boolean type, the end-user may want to keep the underlying check box empty on purpose
1158
1239
  if (isDataField(item) && item?.Value?.$target.type !== "Edm.Boolean") {
1159
1240
  return isStaticallyMandatory(item) || tableCreationMode === CreationMode.InlineCreationRows && isAnnotatedRequiredProperty(item.Value.$target.fullyQualifiedName, converterContext);
@@ -1171,13 +1252,13 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1171
1252
  const isRequiredDataFieldForAnnotation = function (converterContext, dataFieldForAnnotation, tableCreationMode) {
1172
1253
  const dataFieldTarget = dataFieldForAnnotation.Target.$target;
1173
1254
  const DataFieldForAnnotationFieldControlNotMandatory = hasFieldControlNotMandatory(dataFieldForAnnotation);
1174
- // Check if the DataFieldForAnnotation points to a FieldGroup
1175
- if (hasFieldGroupTarget(dataFieldForAnnotation)) {
1176
- if (isRequiredFieldGroup(converterContext, dataFieldTarget, tableCreationMode)) {
1255
+ // Check if the DataFieldForAnnotation points to a FieldGroup or a connectedFields
1256
+ if (hasFieldGroupTarget(dataFieldForAnnotation) || hasConnectedFieldsTarget(dataFieldForAnnotation)) {
1257
+ if (isRequired(converterContext, dataFieldTarget, tableCreationMode)) {
1177
1258
  return true;
1178
1259
  }
1179
- const fieldGroupData = dataFieldTarget.Data;
1180
- return fieldGroupData.some(innerDataField => {
1260
+ const collectionData = hasFieldGroupTarget(dataFieldForAnnotation) ? dataFieldTarget.Data : getConnectedFieldsData(dataFieldTarget);
1261
+ return collectionData.some(innerDataField => {
1181
1262
  return isRequiredColumn(converterContext, innerDataField, tableCreationMode);
1182
1263
  });
1183
1264
  }
@@ -1264,10 +1345,12 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1264
1345
  * @param annotationColumns
1265
1346
  * @param converterContext
1266
1347
  * @param entityType
1348
+ * @param tableType
1267
1349
  * @returns The columns from the manifest
1268
1350
  */
1269
- const getColumnsFromManifest = function (columns, annotationColumns, converterContext, entityType) {
1351
+ const getColumnsFromManifest = function (columns, annotationColumns, converterContext, entityType, tableType) {
1270
1352
  const internalColumns = {};
1353
+ const aggregationHelper = new AggregationHelper(entityType, converterContext);
1271
1354
  function isColumnOverride(column, key) {
1272
1355
  return annotationColumns.some(annotationColumn => annotationColumn.key === key);
1273
1356
  }
@@ -1282,9 +1365,10 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1282
1365
  propertyInfos.forEach(property => {
1283
1366
  annotationTableColumns.forEach(prop => {
1284
1367
  if (prop.name === property) {
1285
- prop.sortable = !restrictionsOnProperties.nonSortableProperties.includes(property.replace("Property::", ""));
1286
- prop.isGroupable = prop.sortable;
1287
- prop.filterable = !restrictionsOnProperties.nonFilterableProperties.includes(property.replace("Property::", ""));
1368
+ const entityPropertyName = property.replace("Property::", "");
1369
+ prop.sortable = !restrictionsOnProperties.nonSortableProperties.includes(entityPropertyName);
1370
+ prop.isGroupable = aggregationHelper.isAnalyticsSupported() && tableType === "AnalyticalTable" ? !!aggregationHelper.isPropertyNameGroupable(entityPropertyName) : prop.sortable;
1371
+ prop.filterable = !restrictionsOnProperties.nonFilterableProperties.includes(entityPropertyName);
1288
1372
  prop.isPartOfCustomColumn = true;
1289
1373
  }
1290
1374
  });
@@ -1569,7 +1653,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1569
1653
  restrictionsOnProperties.nonSortableProperties.push(relativePath);
1570
1654
  } else if (isDataFieldForAnnotation(lineItem) && hasFieldGroupTarget(lineItem)) {
1571
1655
  lineItem.Target.$target.Data.forEach(field => {
1572
- if (isDataField(field) && getDisplayMode(field.Value.$target) === "Description") {
1656
+ if (isDataField(field) && getDisplayMode(field.Value.$target, propertyDataModelObjectPath.targetEntityType) === "Description") {
1573
1657
  const inheredPropertyDataModelObjectPath = enhanceDataModelPath(converterContext.getDataModelObjectPath(), field.Value.path);
1574
1658
  const isInheredPropertyNavigated = inheredPropertyDataModelObjectPath.navigationProperties.length !== converterContext.getDataModelObjectPath().navigationProperties.length;
1575
1659
  if (isInheredPropertyNavigated) {
@@ -1689,4 +1773,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1689
1773
  }
1690
1774
  return _exports;
1691
1775
  }, false);
1692
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwiX2V4cG9ydHMiLCJnZXRUYWJsZUNvbHVtbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ0YWJsZVR5cGUiLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImNvbHVtbnMiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwid2lkdGgiLCJPdmVycmlkZVR5cGUiLCJvdmVyd3JpdGUiLCJ3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImltcG9ydGFuY2UiLCJob3Jpem9udGFsQWxpZ24iLCJhdmFpbGFiaWxpdHkiLCJpc05hdmlnYWJsZSIsInNldHRpbmdzIiwiZm9ybWF0T3B0aW9ucyIsImV4cG9ydFNldHRpbmdzIiwiYWRkQ29tcHV0ZWRDb2x1bW5zIiwiZmluZENvbHVtbkJ5UGF0aCIsInBhdGgiLCJmaW5kIiwiY29sdW1uIiwiYW5ub3RhdGlvbkNvbHVtbiIsInByb3BlcnR5SW5mb3MiLCJ1bmRlZmluZWQiLCJyZWxhdGl2ZVBhdGgiLCJ1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JFYWNoIiwib0NvbHVtbiIsInRhYmxlQ29sdW1uIiwicHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJwcm9wZXJ0eSIsInRhcmdldE9iamVjdCIsImFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5IiwidGltZXpvbmVQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5IiwidGltZXpvbmUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRpbWV6b25lIiwib1RpbWV6b25lQ29sdW1uIiwibmFtZSIsInRpbWV6b25lVGV4dCIsInRvU3RyaW5nIiwiYWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ1bml0Q29sdW1uIiwidW5pdCIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidW5pdFRleHQiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dFByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwidGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRleHRSZWxhdGl2ZVBhdGgiLCJ0ZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsInR5cGUiLCJnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJlbnRpdHlUeXBlIiwidGFibGVDcmVhdGlvbk1vZGUiLCJkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIiwicmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwicHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkIiwiYWdncmVnYXRpb25IZWxwZXIiLCJBZ2dyZWdhdGlvbkhlbHBlciIsImdyb3VwYWJsZVByb3BlcnRpZXMiLCJnZXRHcm91cGFibGVQcm9wZXJ0aWVzIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJtYXAiLCIkdGFyZ2V0IiwiZmlsdGVyIiwidGFyZ2V0IiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSIsInRleHRQcm9wIiwiaXNQcm9wZXJ0eUdyb3VwYWJsZSIsInByb3AiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiZXhpc3RzIiwic29tZSIsInRhcmdldFR5cGUiLCJpbmNsdWRlcyIsInJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsInByb3BlcnRpZXMiLCJhZGRpdGlvbmFsUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiYWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJsZW5ndGgiLCJkYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlIiwiYW5ub3RhdGlvblByb3BlcnR5IiwiYWRkaXRpb25hbFByb3BlcnR5SW5mb3MiLCJhZGRpdGlvbmFsUHJvcGVydHlOYW1lIiwicHVzaCIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiVGV4dCIsInJlbGF0ZWRDb2x1bW5zIiwiX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIiwiY29uY2F0IiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJyZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlIiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImlzSGlkZGVuIiwiaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4iLCJncm91cFBhdGgiLCJfc2xpY2VBdFNsYXNoIiwiaXNHcm91cCIsImxhYmVsIiwiZ2V0TGFiZWwiLCJkYXRhVHlwZSIsImdldERhdGFGaWVsZERhdGFUeXBlIiwicHJvcGVydHlUeXBlQ29uZmlnIiwiZ2V0VHlwZUNvbmZpZyIsImlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbiIsInNvcnRhYmxlIiwiZmlsdGVyYWJsZSIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZ3JvdXBhYmxlIiwidHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsImNvbnN0cmFpbnRzIiwiX2lzRXhwb3J0YWJsZUNvbHVtbiIsImNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzIiwiY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzIiwiX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyIsImtleSIsInJlcGxhY2VTcGVjaWFsQ2hhcnMiLCJBbm5vdGF0aW9uIiwiZ3JvdXBMYWJlbCIsImdyb3VwIiwiYW5ub3RhdGlvblBhdGgiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJpc0dyb3VwYWJsZSIsImlzS2V5IiwiY2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImdldEltcG9ydGFuY2UiLCJVSSIsIkRhdGFGaWVsZERlZmF1bHQiLCJyZXF1aXJlZCIsImlzUmVxdWlyZWRDb2x1bW4iLCJhZGRpdGlvbmFsTGFiZWxzIiwiX2FkZFRvb2xUaXAiLCJfc2V0RXhwb3J0U2V0dGluZ3NGb3JEYXRhUG9pbnQiLCJNb2RlbEhlbHBlciIsImlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkIiwiZXh0ZW5zaW9uIiwidGVjaG5pY2FsbHlBZ2dyZWdhdGFibGUiLCJ0ZWNobmljYWxseUdyb3VwYWJsZSIsInVuaXRQcm9wZXJ0eSIsInV0YyIsImlzQVRpbWV6b25lIiwiY3VycmVuY3lQcm9wZXJ0eSIsInNjYWxlIiwiaXNQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldFN0YXRpY1VuaXRPckN1cnJlbmN5IiwiZ2V0U3RhdGljVGltZXpvbmUiLCJpc1RpbWV6b25lIiwiZXhwb3J0VHlwZSIsImdldEV4cG9ydERhdGFUeXBlIiwiaW5wdXRGb3JtYXQiLCJnZXREYXRlSW5wdXRGb3JtYXQiLCJkZWxpbWl0ZXIiLCJnZXREZWxpbWl0ZXIiLCJ0ZW1wbGF0ZSIsIndyYXAiLCJhdXRvU2NhbGUiLCJyZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MiLCJzZXR0aW5nIiwic291cmNlIiwicHJvcGVydHlUeXBlIiwiZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5IiwiJFR5cGUiLCJUYXJnZXQiLCJWYWx1ZSIsIkNvcmUiLCJNZWRpYVR5cGUiLCJ0ZXJtIiwiaXNVUkwiLCJfaXNWYWxpZENvbHVtbiIsImRhdGFGaWVsZCIsIklubGluZSIsIl9nZXRWaXNpYmxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZE1vZGVsUGF0aCIsInByb3BlcnR5VmFsdWUiLCJpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkIiwiY29uc3RhbnQiLCJpc0FuYWx5dGljYWxMZWFmIiwiYW5kIiwibm90IiwiZXF1YWwiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJIaWRkZW4iLCJpZkVsc2UiLCJvciIsIl9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJkYXRhRmllbGRHcm91cCIsImZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImNvbXBpbGVFeHByZXNzaW9uIiwiRGF0YSIsImlubmVyRGF0YUZpZWxkIiwiYXJndW1lbnRzIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkYXRhRmllbGREZWZhdWx0IiwicXVhbGlmaWVyIiwiTGFiZWwiLCJpc0RhdGFGaWVsZFR5cGVzIiwidmFsdWVPZiIsIl9nZXRUb29sdGlwIiwiUXVpY2tJbmZvIiwiZGF0YXBvaW50VGFyZ2V0IiwiZ2V0Um93U3RhdHVzVmlzaWJpbGl0eSIsImNvbE5hbWUiLCJpc1NlbWFudGljS2V5SW5GaWVsZEdyb3VwIiwiZm9ybWF0UmVzdWx0IiwicGF0aEluTW9kZWwiLCJ0YWJsZUZvcm1hdHRlcnMiLCJnZXRFcnJvclN0YXR1c1RleHRWaXNpYmlsaXR5Rm9ybWF0dGVyIiwiZXhpc3RpbmdDb2x1bW5zIiwicmVsYXRlZFByb3BlcnR5TmFtZU1hcCIsImdldEFic29sdXRlQW5ub3RhdGlvblBhdGgiLCJyZWxhdGVkQ29sdW1uIiwicHJvcGVydHlPYmplY3RQYXRoIiwiaXNNdWx0aVZhbHVlRmllbGQiLCJuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoIiwiY29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMiLCJuZXdOYW1lIiwicHJvcGVydHlJbmZvIiwiX2dldEFubm90YXRpb25Db2x1bW5OYW1lIiwiS2V5SGVscGVyIiwiZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkIiwiX2dldFNob3dEYXRhRmllbGRzTGFiZWwiLCJmaWVsZEdyb3VwTmFtZSIsImNvbHVtbktleXMiLCJzaG93RGF0YUZpZWxkc0xhYmVsIiwiX2dldFJlbGF0aXZlUGF0aCIsInZhbHVlIiwiaXNMYXN0U2xhc2giLCJpc0xhc3RQYXJ0IiwiaVNsYXNoSW5kZXgiLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJfaXNDb2x1bW5NdWx0aVZhbHVlZCIsIl9pc0NvbHVtblNvcnRhYmxlIiwicHJvcGVydHlQYXRoIiwibm9uU29ydGFibGVDb2x1bW5zIiwicHJvcE5hbWUiLCJmaWx0ZXJGdW5jdGlvbnMiLCJfZ2V0RmlsdGVyRnVuY3Rpb25zIiwiQ29udmVydGVyQ29udGV4dCIsImVudGl0eVNldCIsImdldEVudGl0eVNldCIsIlR5cGVHdWFyZHMiLCJpc0VudGl0eVNldCIsIkNhcGFiaWxpdGllcyIsIkZpbHRlckZ1bmN0aW9ucyIsImdldEVudGl0eUNvbnRhaW5lciIsIl9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlIiwidGV4dExpbmVzRWRpdCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXMiLCJzZW1hbnRpY0tleXMiLCJhU2VtYW50aWNLZXlWYWx1ZXMiLCJiU2VtYW50aWNLZXlGb3VuZCIsImkiLCJ2YWx1ZXMiLCJzZW1hbnRpY0tleUZvdW5kIiwiX2ZpbmRQcm9wZXJ0aWVzIiwic2VtYW50aWNLZXlWYWx1ZXMiLCJmaWVsZEdyb3VwUHJvcGVydGllcyIsInNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAiLCJzUHJvcGVydHlQYXRoIiwidG1wIiwiZmllbGRHcm91cFByb3BlcnR5UGF0aCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAiLCJhUHJvcGVydGllcyIsIl9wcm9wZXJ0aWVzRm91bmQiLCJnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4iLCJzZW1hbnRpY0tleSIsInNlbWFudGljS2V5SW5GaWVsZEdyb3VwIiwiZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoIiwic2hvd0Vycm9yT2JqZWN0U3RhdHVzIiwiaGFzRHJhZnRJbmRpY2F0b3IiLCJfZ2V0SW1wTnVtYmVyIiwiSW1wb3J0YW5jZSIsIl9nZXREYXRhRmllbGRJbXBvcnRhbmNlIiwic3BsaXQiLCJOb25lIiwidGFyZ2V0VmFsdWVmcm9tRFAiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsIl9nZXRNYXhJbXBvcnRhbmNlIiwiZmllbGRzIiwibWF4SW1wTnVtYmVyIiwiaW1wTnVtYmVyIiwiRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UiLCJmaWVsZCIsInRhcmdldEVudGl0eVR5cGUiLCJTZW1hbnRpY0tleSIsInJlcXVpcmVkUHJvcGVydGllcyIsImdldFJlcXVpcmVkUHJvcGVydGllcyIsImhpZ2hLZXlzIiwiZmllbGRzV2l0aEltcG9ydGFuY2UiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJkYXRhRmllbGRUYXJnZXQiLCJmaWVsZEdyb3VwRGF0YSIsImZpZWxkR3JvdXBEYXRhRmllbGQiLCJIaWdoIiwiaXRlbSIsImdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyIsInRhYmxlTWFuaWZlc3RTZXR0aW5ncyIsImRlZmF1bHRDcmVhdGlvbk1vZGUiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRTYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsIm1hY3JvcyIsInRhYmxlIiwiQ3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwidGFibGVTZXR0aW5ncyIsImNyZWF0aW9uTW9kZSIsImdldEFubm90YXRpb25zQnlUZXJtIiwiZ2V0RW50aXR5VHlwZSIsInRhYmxlQ29udmVydGVyQ29udGV4dCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsImlzRmllbGRHcm91cENvbHVtbiIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwic2l0dWF0aW9uc05hdlByb3BzIiwibmF2aWdhdGlvblByb3BlcnR5IiwiaXNDb2xsZWN0aW9uIiwiU0FQT2JqZWN0Tm9kZVR5cGUiLCJOYW1lIiwic2l0dWF0aW9uc05hdlByb3AiLCJoYXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiaXNNdWx0aVZhbHVlIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwiRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiSFRNTDUiLCJDc3NEZWZhdWx0cyIsImlzUGFydE9mTGluZUl0ZW0iLCJ0b29sdGlwIiwicmVsYXRlZFByb3BlcnR5TmFtZSIsImRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIiwiY3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seSIsIl9nZXRQcm9wZXJ0eU5hbWVzIiwibWF0Y2hlZFByb3BlcnRpZXMiLCJBcnJheSIsImlzQXJyYXkiLCJyZXNvbHZlUGF0aCIsImlzUmVxdWlyZWRGaWVsZEdyb3VwIiwiZmllbGRHcm91cCIsImlzRGF0YUZpZWxkIiwiaXNTdGF0aWNhbGx5TWFuZGF0b3J5IiwiaXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5IiwiaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24iLCJkYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkR3JvdXBUYXJnZXQiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJWaXN1YWxpemF0aW9uIiwiaXNSZXF1aXJlZERhdGFQb2ludCIsImlzUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0IiwiZGF0YVBvaW50IiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsIkFuYWx5dGljYWxMaXN0UGFnZSIsIklzRWRpdGFibGUiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCJfYXBwZW5kQ3VzdG9tVGVtcGxhdGUiLCJleHBvcnRQcm9wZXJ0aWVzIiwiam9pbiIsImludGVybmFsQ29sdW1ucyIsImlzQ29sdW1uT3ZlcnJpZGUiLCJpc1Nsb3RDb2x1bW4iLCJtYW5pZmVzdENvbHVtbiIsIlNsb3QiLCJpc0N1c3RvbUNvbHVtbiIsIl91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zIiwiYW5ub3RhdGlvblRhYmxlQ29sdW1ucyIsInJlcGxhY2UiLCJpc1BhcnRPZkN1c3RvbUNvbHVtbiIsInZhbGlkYXRlS2V5IiwiYmFzZVRhYmxlQ29sdW1uIiwicG9zaXRpb24iLCJhbmNob3IiLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW4iLCJkaXNhYmxlRXhwb3J0IiwiZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MiLCJ0b29sdGlwVGV4dCIsImZldGNoVGV4dEZyb21NZXRhTW9kZWwiLCJoZWFkZXJUZXh0IiwiaGVhZGVyIiwiY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3MiLCJiYXNlTWFuaWZlc3RDb2x1bW4iLCJIb3Jpem9udGFsQWxpZ24iLCJCZWdpbiIsImlkIiwiY3VzdG9tVGFibGVDb2x1bW4iLCJEZWZhdWx0IiwibWVzc2FnZSIsImdldERpYWdub3N0aWNzIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiTWFuaWZlc3QiLCJJc3N1ZVNldmVyaXR5IiwiTG93IiwiSXNzdWVDYXRlZ29yeVR5cGUiLCJBbm5vdGF0aW9uQ29sdW1ucyIsIkludmFsaWRLZXkiLCJjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvciIsInNpdHVhdGlvbnNJbmRpY2F0b3JDb2x1bW4iLCJwcm9wZXJ0eUtleSIsImlzU2l0dWF0aW9uc0luZGljYXRvciIsIkNvbXB1dGVkIiwiY2xpcGJvYXJkU2V0dGluZ3MiLCJpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uIiwiZmluZEluZGV4Iiwic3BsaWNlIiwiY29sdW1uc1dpdGhEcmFmdEluZGljYXRvciIsImlzRHJhZnROb2RlIiwiaXNEcmFmdFJvb3QiLCJjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3IiLCJkcmFmdEluZGljYXRvckNvbHVtbiIsImlzRHJhZnRJbmRpY2F0b3IiLCJjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIiLCJnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbiIsImNhcGFiaWxpdGllcyIsIkluc2VydFJlc3RyaWN0aW9ucyIsIlJlcXVpcmVkUHJvcGVydGllcyIsImlzQ3VycmVuY3kiLCJleHBvcnREYXRhVHlwZSIsIm5hdlByb3BlcnR5IiwibGluZUl0ZW0iLCJpc1Byb3BlcnR5TmF2aWdhdGVkIiwiaW5oZXJlZFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsImlzSW5oZXJlZFByb3BlcnR5TmF2aWdhdGVkIiwidGFyZ2V0TWFwcGluZyIsImlzVHlwZURlZmluaXRpb24iLCJFRE1fVFlQRV9NQVBQSU5HIiwidW5kZXJseWluZ1R5cGUiLCJzZXRVcENvbnN0cmFpbnRzIiwicGFyc2VBc1N0cmluZyIsImVtcHR5U3RyaW5nIiwibnVsbGFibGUiLCJwYXJzZUtlZXBzRW1wdHlTdHJpbmciLCJyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMiLCJleGlzdGluZ0NvbHVtbiIsImNvbHVtbktleSIsImNvbHVtbkZyb21Bbm5vdGF0aW9ucyIsImVuYWJsZVdyYXBwaW5nIiwiY3VzdG9tRXhwb3J0U2V0dGluZ3MiLCJ0ZXh0QWxpZ24iLCJ0cnVlVmFsdWUiLCJmYWxzZVZhbHVlIiwidmFsdWVNYXAiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbHVtbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5LCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNfRWRtXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljS2V5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7XG5cdERhdGFGaWVsZCxcblx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdERhdGFQb2ludCxcblx0RGF0YVBvaW50VHlwZVR5cGVzLFxuXHRGaWVsZEdyb3VwLFxuXHRMaW5lSXRlbVxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcywgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7XG5cdEVETV9UWVBFX01BUFBJTkcsXG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0bm90LFxuXHRvcixcblx0cGF0aEluTW9kZWwsXG5cdHNldFVwQ29uc3RyYWludHNcbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHtcblx0QXZhaWxhYmlsaXR5VHlwZSxcblx0Q3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uLFxuXHRDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSxcblx0Rm9ybWF0T3B0aW9uc1R5cGUsXG5cdFRhYmxlQ29sdW1uU2V0dGluZ3MsXG5cdFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IENyZWF0aW9uTW9kZSwgSG9yaXpvbnRhbEFsaWduLCBJbXBvcnRhbmNlLCBUZW1wbGF0ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbXBsZXhQcm9wZXJ0eUluZm8gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7XG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyxcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHksXG5cdGdldERhdGFGaWVsZERhdGFUeXBlLFxuXHRnZXRTZW1hbnRpY09iamVjdFBhdGgsXG5cdGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQsXG5cdGhhc0RhdGFQb2ludFRhcmdldCxcblx0aGFzRmllbGRHcm91cFRhcmdldCxcblx0aXNEYXRhRmllbGQsXG5cdGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0aXNEYXRhRmllbGRUeXBlcyxcblx0aXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCxcblx0aXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25IZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYWJsZU9iamVjdCwgQ3VzdG9tRWxlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBPdmVycmlkZVR5cGUsIFBsYWNlbWVudCwgaW5zZXJ0Q3VzdG9tRWxlbWVudHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVDYXRlZ29yeVR5cGUsIElzc3VlU2V2ZXJpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgS2V5SGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9LZXlcIjtcbmltcG9ydCB7IFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCAqIGFzIFR5cGVHdWFyZHMgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHtcblx0aXNBbm5vdGF0aW9uT2ZUeXBlLFxuXHRpc05hdmlnYXRpb25Qcm9wZXJ0eSxcblx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdGlzUHJvcGVydHksXG5cdGlzVHlwZURlZmluaXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHtcblx0ZW5oYW5jZURhdGFNb2RlbFBhdGgsXG5cdGdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uLFxuXHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHR0eXBlIERhdGFNb2RlbE9iamVjdFBhdGhcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0RGlzcGxheU1vZGUsIHR5cGUgRGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLCB0eXBlIFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0VudGl0eVNldEhlbHBlclwiO1xuaW1wb3J0IHsgaGFzRmllbGRDb250cm9sTm90TWFuZGF0b3J5LCBpc1N0YXRpY2FsbHlNYW5kYXRvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGdldFN0YXRpY1RpbWV6b25lLFxuXHRnZXRTdGF0aWNVbml0T3JDdXJyZW5jeSxcblx0aXNUaW1lem9uZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgaXNNdWx0aVZhbHVlRmllbGQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB0eXBlIHsgRGVmYXVsdFR5cGVGb3JFZG1UeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3R5cGUvRURNXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IE1EQ1RhYmxlUHJvcGVydHlJbmZvIGFzIFByb3BlcnR5SW5mbywgVmlzdWFsU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgU2ltcGxlVHlwZSBmcm9tIFwic2FwL3VpL21vZGVsL1NpbXBsZVR5cGVcIjtcblxuLy8gQ3VzdG9tIENvbHVtbiBmcm9tIE1hbmlmZXN0XG50eXBlIE1hbmlmZXN0RGVmaW5lZEN1c3RvbUNvbHVtbiA9IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiAmIHtcblx0dHlwZT86IENvbHVtblR5cGUuRGVmYXVsdDtcbn07XG5cbi8vIFNsb3QgQ29sdW1uIGZyb20gQnVpbGRpbmcgQmxvY2tcbnR5cGUgRnJhZ21lbnREZWZpbmVkU2xvdENvbHVtbiA9IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiAmIHtcblx0dHlwZTogQ29sdW1uVHlwZS5TbG90O1xufTtcbi8vIFByb3BlcnRpZXMgYWxsIENvbHVtblR5cGVzIGhhdmU6XG50eXBlIEJhc2VUYWJsZUNvbHVtbiA9IENvbmZpZ3VyYWJsZU9iamVjdCAmIHtcblx0dHlwZTogQ29sdW1uVHlwZTsgLy9PcmlnaW4gb2YgdGhlIHNvdXJjZSB3aGVyZSB3ZSBhcmUgZ2V0dGluZyB0aGUgdGVtcGxhdGVkIGluZm9ybWF0aW9uIGZyb21cblx0d2lkdGg/OiBzdHJpbmc7XG5cdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyPzogYm9vbGVhbjtcblx0aW1wb3J0YW5jZT86IEltcG9ydGFuY2U7XG5cdGhvcml6b250YWxBbGlnbj86IEhvcml6b250YWxBbGlnbjtcblx0YXZhaWxhYmlsaXR5PzogQXZhaWxhYmlsaXR5VHlwZTtcblx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRvb2x0aXA/OiBzdHJpbmc7XG5cdGRpc2FibGVFeHBvcnQ/OiBib29sZWFuO1xufTtcblxuLy8gUHJvcGVydGllcyBvbiBDdXN0b20gQ29sdW1ucyBhbmQgU2xvdCBDb2x1bW5zXG5leHBvcnQgdHlwZSBDdXN0b21CYXNlZFRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRpZDogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGhlYWRlcj86IHN0cmluZztcblx0dGVtcGxhdGU6IHN0cmluZyB8IENvbnRyb2w7XG5cdHByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0ZXhwb3J0U2V0dGluZ3M/OiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGw7XG5cdGZvcm1hdE9wdGlvbnM6IEZvcm1hdE9wdGlvbnNUeXBlO1xuXHRpc0dyb3VwYWJsZTogYm9vbGVhbjtcblx0aXNOYXZpZ2FibGU6IGJvb2xlYW47XG5cdHNvcnRhYmxlOiBib29sZWFuO1xuXHR2aXN1YWxTZXR0aW5nczogeyB3aWR0aENhbGN1bGF0aW9uOiBudWxsIH07XG5cdHByb3BlcnRpZXM/OiBzdHJpbmdbXTtcblx0cmVxdWlyZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcbn07XG5cbmV4cG9ydCB0eXBlIENvbXB1dGVkVGFibGVDb2x1bW4gPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdG5hbWU6IHN0cmluZztcblx0bGFiZWw6IHN0cmluZztcblx0cHJvcGVydHlLZXk6IHN0cmluZztcblx0aXNEcmFmdEluZGljYXRvcj86IGJvb2xlYW47XG5cdGlzU2l0dWF0aW9uc0luZGljYXRvcj86IGJvb2xlYW47XG5cdGZvcm1hdE9wdGlvbnM/OiBGb3JtYXRPcHRpb25zVHlwZSB8IG51bGw7XG5cdHByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0ZXhwb3J0U2V0dGluZ3M/OiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGw7XG5cdGNsaXBib2FyZFNldHRpbmdzPzogT2JqZWN0IHwgbnVsbDtcblx0cmVxdWlyZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcbn07XG5cbi8vIFByb3BlcnRpZXMgZGVyaXZlZCBmcm9tIE1hbmlmZXN0IHRvIG92ZXJyaWRlIEFubm90YXRpb24gY29uZmlndXJhdGlvbnNcbnR5cGUgQW5ub3RhdGlvblRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUgPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdHNldHRpbmdzPzogVGFibGVDb2x1bW5TZXR0aW5ncztcblx0Zm9ybWF0T3B0aW9ucz86IEZvcm1hdE9wdGlvbnNUeXBlO1xuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZUNvbnN0cmFpbnRzID0gUGFydGlhbDx7XG5cdHNjYWxlOiBudW1iZXI7XG5cdHByZWNpc2lvbjogbnVtYmVyO1xuXHRtYXhMZW5ndGg6IG51bWJlcjtcblx0bnVsbGFibGU6IGJvb2xlYW47XG5cdG1pbmltdW06IHN0cmluZztcblx0bWF4aW11bTogc3RyaW5nO1xuXHRpc0RpZ2l0U2VxdWVuY2U6IGJvb2xlYW47XG59PjtcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlUeXBlRm9ybWF0T3B0aW9ucyA9IFBhcnRpYWw8e1xuXHRwYXJzZUFzU3RyaW5nOiBib29sZWFuO1xuXHRlbXB0eVN0cmluZzogc3RyaW5nO1xuXHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IGJvb2xlYW47XG5cdHN0eWxlOiBzdHJpbmc7XG59PjtcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlUeXBlQ29uZmlnID0ge1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25zdHJhaW50cz86IFByb3BlcnR5VHlwZUNvbnN0cmFpbnRzO1xuXHRmb3JtYXRPcHRpb25zPzogUHJvcGVydHlUeXBlRm9ybWF0T3B0aW9ucztcblx0dHlwZUluc3RhbmNlPzogU2ltcGxlVHlwZTtcblx0YmFzZVR5cGU/OiBzdHJpbmc7XG5cdGNsYXNzTmFtZT86IGtleW9mIHR5cGVvZiBEZWZhdWx0VHlwZUZvckVkbVR5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IFByb3BlcnR5SW5mb1tcImV4cG9ydFNldHRpbmdzXCJdICYge1xuXHRkYXRhUG9pbnRUYXJnZXRWYWx1ZT86IHN0cmluZztcblx0aXNDdXJyZW5jeT86IGJvb2xlYW47XG59O1xuXG4vLyBQcm9wZXJ0aWVzIGZvciBBbm5vdGF0aW9uIENvbHVtbnNcbmV4cG9ydCB0eXBlIEFubm90YXRpb25UYWJsZUNvbHVtbiA9IFByb3BlcnR5SW5mbyAmXG5cdEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlICYge1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRcdHJlbGF0aXZlUGF0aDogc3RyaW5nO1xuXHRcdHRvb2x0aXA/OiBzdHJpbmc7XG5cdFx0Z3JvdXBMYWJlbD86IHN0cmluZztcblx0XHRncm91cD86IHN0cmluZztcblx0XHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0XHRzaG93RGF0YUZpZWxkc0xhYmVsPzogYm9vbGVhbjtcblx0XHRyZXF1aXJlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRcdGlzR3JvdXBhYmxlPzogYm9vbGVhbjtcblx0XHR1bml0VGV4dD86IHN0cmluZztcblx0XHR0aW1lem9uZVRleHQ/OiBzdHJpbmc7XG5cdFx0dGltZXpvbmU/OiBzdHJpbmc7XG5cdFx0c2VtYW50aWNPYmplY3RQYXRoPzogc3RyaW5nO1xuXHRcdHRleHRBcnJhbmdlbWVudD86IHtcblx0XHRcdHRleHRQcm9wZXJ0eTogc3RyaW5nO1xuXHRcdFx0bW9kZTogRGlzcGxheU1vZGU7XG5cdFx0fTtcblx0XHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRcdHR5cGVDb25maWc/OiBQcm9wZXJ0eVR5cGVDb25maWc7XG5cdFx0aXNQYXJ0T2ZMaW5lSXRlbT86IGJvb2xlYW47IC8vIHRlbXBvcmFyeSBpbmRpY2F0b3IgdG8gb25seSBhbGxvdyBmaWx0ZXJpbmcgb24gbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIHdoZW4gdGhleSdyZSBwYXJ0IG9mIGEgbGluZSBpdGVtXG5cdFx0aXNQYXJ0T2ZDdXN0b21Db2x1bW4/OiBib29sZWFuO1xuXHRcdGFkZGl0aW9uYWxMYWJlbHM/OiBzdHJpbmdbXTtcblx0XHRleHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZT86IHN0cmluZztcblx0XHRleHRlbnNpb24/OiBFeHRlbnNpb25Gb3JBbmFseXRpY3M7XG5cdFx0aXNNdWx0aVZhbHVlPzogYm9vbGVhbjtcblx0XHRkZXNjcmlwdGlvblByb3BlcnR5Pzogc3RyaW5nO1xuXHRcdG1vZGU/OiBEaXNwbGF5TW9kZTtcblx0XHR2YWx1ZVByb3BlcnR5Pzogc3RyaW5nO1xuXHR9O1xuXG5leHBvcnQgdHlwZSBFeHRlbnNpb25Gb3JBbmFseXRpY3MgPSBQcm9wZXJ0eUluZm9bXCJleHRlbnNpb25cIl0gJiB7XG5cdGFkZGl0aW9uYWxQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbHVtbiA9IEN1c3RvbUJhc2VkVGFibGVDb2x1bW4gfCBBbm5vdGF0aW9uVGFibGVDb2x1bW4gfCBDb21wdXRlZFRhYmxlQ29sdW1uO1xuXG50eXBlIE1hbmlmZXN0Q29sdW1uID0gQ3VzdG9tRWxlbWVudDxDdXN0b21CYXNlZFRhYmxlQ29sdW1uIHwgQW5ub3RhdGlvblRhYmxlQ29sdW1uRm9yT3ZlcnJpZGU+O1xuXG5leHBvcnQgZW51bSBDb2x1bW5UeXBlIHtcblx0RGVmYXVsdCA9IFwiRGVmYXVsdFwiLCAvLyBEZWZhdWx0IFR5cGUgKEN1c3RvbSBDb2x1bW4pXG5cdEFubm90YXRpb24gPSBcIkFubm90YXRpb25cIixcblx0U2xvdCA9IFwiU2xvdFwiLFxuXHRDb21wdXRlZCA9IFwiQ29tcHV0ZWRcIlxufVxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBjb2x1bW5zLCBhbm5vdGF0aW9uLWJhc2VkIGFzIHdlbGwgYXMgbWFuaWZlc3QtYmFzZWQuXG4gKiBUaGV5IGFyZSBzb3J0ZWQgYW5kIHNvbWUgcHJvcGVydGllcyBjYW4gYmUgb3ZlcndyaXR0ZW4gdmlhIHRoZSBtYW5pZmVzdCAoY2hlY2sgb3V0IHRoZSBrZXlzIHRoYXQgY2FuIGJlIG92ZXJ3cml0dGVuKS5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0eXBlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgUmV0dXJucyBhbGwgdGFibGUgY29sdW1ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGVtcGxhdGluZyBvciBwZXJzb25hbGl6YXRpb24gb3IgdGhlaXIgb3JpZ2luXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUNvbHVtbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCBhbm5vdGF0aW9uQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB0YWJsZVR5cGUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgbWFuaWZlc3RDb2x1bW5zID0gZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb248VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24+KHZpc3VhbGl6YXRpb25QYXRoKS5jb2x1bW5zID8/IHt9LFxuXHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pXG5cdCk7XG5cblx0Y29uc3QgdGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMgYXMgVGFibGVDb2x1bW5bXSxcblx0XHRtYW5pZmVzdENvbHVtbnMgYXMgUmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudDxUYWJsZUNvbHVtbj4+LFxuXHRcdHtcblx0XHRcdHdpZHRoOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRpbXBvcnRhbmNlOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0aG9yaXpvbnRhbEFsaWduOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0aXNOYXZpZ2FibGU6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRzZXR0aW5nczogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGZvcm1hdE9wdGlvbnM6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZVxuXHRcdH1cblx0KTtcblxuXHRyZXR1cm4gYWRkQ29tcHV0ZWRDb2x1bW5zKHRhYmxlQ29sdW1ucywgdGFibGVUeXBlLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29sdW1uQnlQYXRoKHBhdGg6IHN0cmluZywgdGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdKTogVGFibGVDb2x1bW4gfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gdGFibGVDb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4ge1xuXHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcGF0aDtcblx0fSk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgJ3VuaXQnLCAndGV4dEFycmFuZ2VtZW50JywgJ3RpbWV6b25lJyBhbmQgJ2V4cG9ydHNldHRpbmdzJyBwcm9wZXJ0aWVzIGluIGNvbHVtbnMgd2hlbiBuZWNlc3NhcnkuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSBjb2x1bW5zIHRvIGJlIHVwZGF0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgdGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdKTogdm9pZCB7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpKS5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChvQ29sdW1uKSA9PiB7XG5cdFx0Y29uc3QgdGFibGVDb2x1bW4gPSBvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRpZiAodGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIHRhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbE9iamVjdFBhdGgsIHRhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCk7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdFx0XHRpZiAocHJvcGVydHkpIHtcblx0XHRcdFx0YWRkQ3VycmVuY3lPclVvTVRvUHJvcGVydHkocHJvcGVydHksIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgdGFibGVDb2x1bW5zLCB0YWJsZUNvbHVtbik7XG5cdFx0XHRcdGNvbnN0IHRpbWV6b25lUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRcdGNvbnN0IHRpbWV6b25lID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXHRcdFx0XHRpZiAodGltZXpvbmVQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGNvbnN0IG9UaW1lem9uZUNvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgodGltZXpvbmVQcm9wZXJ0eS5uYW1lLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0XHRcdHRhYmxlQ29sdW1uLnRpbWV6b25lID0gb1RpbWV6b25lQ29sdW1uPy5uYW1lO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lKSB7XG5cdFx0XHRcdFx0dGFibGVDb2x1bW4udGltZXpvbmVUZXh0ID0gdGltZXpvbmUudG9TdHJpbmcoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZGRUZXh0QXJyYW5nZW50SW5mb1RvUHJvcGVydHkocHJvcGVydHksIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgdGFibGVDb2x1bW5zLCB0YWJsZUNvbHVtbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBcInVuaXRcIiBwcm9wZXJ0eSBpbnRvIHRoZSBjb2x1bW5zIHdoZW4gbmVjY2VzYXJ5IGZvciBjb2x1bW5zIHdpdGggdW5pdCBvZiBtZWFzdXJlIGFuZCBjdXJyZW5jaWVzLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIG9uIHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggVGhlIHByb3BlcnR5IERhdGFNb2RlbE9iamVjdFBhdGguXG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgZGlzcGxheWVkIG9uIHRoZSB0YWJsZVxuICogQHBhcmFtIHRhYmxlQ29sdW1uIFRoZSB0YWJsZSBjb2x1bW4gd2hpY2ggYWRkcyB0aGUgY3VycmVuY3kgb3IgdW5pdFxuICovXG5mdW5jdGlvbiBhZGRDdXJyZW5jeU9yVW9NVG9Qcm9wZXJ0eShcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlQ29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5cbik6IHZvaWQge1xuXHRjb25zdCBjdXJyZW5jeU9yVW9NUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgocHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoKHByb3BlcnR5KTtcblx0aWYgKGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSkge1xuXHRcdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCBjdXJyZW5jeU9yVW9NUHJvcGVydHkpO1xuXHRcdGNvbnN0IGN1cnJlbmN5T3JVb01SZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKGN1cnJlbmN5T3JVb01Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGlmIChjdXJyZW5jeU9yVW9NUmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCB1bml0Q29sdW1uID0gZmluZENvbHVtbkJ5UGF0aChjdXJyZW5jeU9yVW9NUmVsYXRpdmVQYXRoLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0dGFibGVDb2x1bW4udW5pdCA9IHVuaXRDb2x1bW4/Lm5hbWU7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IHVuaXQgPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRcdGlmICh1bml0KSB7XG5cdFx0XHR0YWJsZUNvbHVtbi51bml0VGV4dCA9IGAke3VuaXR9YDtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBBZGQgdGhlIFwidGV4dEFycmFuZ2VtZW50XCIgb2JqZWN0IHRvIGNvbHVtbnMgd2hlbiBuZWNlc3NhcnkgZm9yIGNvbHVtbnMgY29udGFpbmluZyB0ZXh0LCBzdWNoIGFzIGRlc2NyaXB0aW9ucy5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBieSB0aGUgY29sdW1uXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBwcm9wZXJ0eSBEYXRhTW9kZWxPYmplY3RQYXRoLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGRpc3BsYXllZCBvbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbiBUaGUgdGFibGUgY29sdW1uIHdoaWNoIGFkZHMgdGhlIHRleHRcbiAqL1xuZnVuY3Rpb24gYWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5KFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0dGFibGVDb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtblxuKTogdm9pZCB7XG5cdGNvbnN0IGRpc3BsYXlNb2RlID0gZ2V0RGlzcGxheU1vZGUocHJvcGVydHkpLFxuXHRcdHRleHRQcm9wZXJ0eVBhdGggPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdGlmICh0ZXh0UHJvcGVydHlQYXRoICYmIGRpc3BsYXlNb2RlICE9PSBcIlZhbHVlXCIpIHtcblx0XHRjb25zdCB0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgdGV4dFByb3BlcnR5UGF0aCk7XG5cdFx0Y29uc3QgdGV4dFJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgodGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0aWYgKHRleHRSZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHRleHRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRleHRSZWxhdGl2ZVBhdGgsIHRhYmxlQ29sdW1ucyk7XG5cdFx0XHRpZiAodGV4dENvbHVtbiAmJiB0ZXh0Q29sdW1uLm5hbWUgIT09IHRhYmxlQ29sdW1uLm5hbWUpIHtcblx0XHRcdFx0dGFibGVDb2x1bW4udGV4dEFycmFuZ2VtZW50ID0ge1xuXHRcdFx0XHRcdHRleHRQcm9wZXJ0eTogdGV4dENvbHVtbi5uYW1lLFxuXHRcdFx0XHRcdG1vZGU6IGRpc3BsYXlNb2RlXG5cdFx0XHRcdH07XG5cdFx0XHRcdC8vIElmIHRleHQgcHJvcGVydGllcyBhcmUgdXNlZCBidXQgaGlkZGVuLCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSB0byB0aGUgZXhwb3J0IGFzIHRoZXJlIGFyZSB1c2VkIGluIHRoZSBwYXN0ZVxuXHRcdFx0XHRpZiAoIXRleHRDb2x1bW4uZXhwb3J0U2V0dGluZ3MpIHtcblx0XHRcdFx0XHR0ZXh0Q29sdW1uLmV4cG9ydFNldHRpbmdzID0geyB0eXBlOiBcIlN0cmluZ1wiIH07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29sdW1ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBUaGUgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkIGJhc2VkIG9uIExpbmVJdGVtIGFubm90YXRpb25zLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdGFibGUuXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbWFwIG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyBkZXNjcmlwdGlvbiBvbiBhIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyBUaGUgY29sdW1uIGZyb20gdGhlIGVudGl0eVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uIChcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSxcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0aWYgKGFubm90YXRpb25Db2x1bW5zID09PSB1bmRlZmluZWQpIHtcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyA9IFtdO1xuXHR9XG5cblx0bGV0IHByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZDogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGdyb3VwYWJsZVByb3BlcnRpZXMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRHcm91cGFibGVQcm9wZXJ0aWVzKCk7XG5cdC8vRm9yIEFuYWx5dGljYWwgdGFibGUsIHdlIGV4Y2x1ZGUgYWxsIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGdyb3VwYWJsZSBhbmQgdXNlZCBhcyBUZXh0IGluIGEgZ3JvdXBhYmxlIFByb3BlcnR5LlxuXHRpZiAodGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiICYmIGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkgJiYgZ3JvdXBhYmxlUHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZCA9IGdyb3VwYWJsZVByb3BlcnRpZXNcblx0XHRcdC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS4kdGFyZ2V0KVxuXHRcdFx0LmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQgIT09IHVuZGVmaW5lZClcblx0XHRcdC5tYXAoKHRhcmdldCkgPT4gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSh0YXJnZXQgYXMgUHJvcGVydHkpKVxuXHRcdFx0LmZpbHRlcigodGV4dFByb3ApID0+IHRleHRQcm9wICYmICFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5R3JvdXBhYmxlKHRleHRQcm9wKSlcblx0XHRcdC5tYXAoKHByb3ApID0+IHByb3A/Lm5hbWUpXG5cdFx0XHQuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSB1bmRlZmluZWQpIGFzIHN0cmluZ1tdO1xuXHR9XG5cdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHQvLyBDYXRjaCBhbHJlYWR5IGV4aXN0aW5nIGNvbHVtbnMgLSB3aGljaCB3ZXJlIGFkZGVkIGJlZm9yZSBieSBMaW5lSXRlbSBBbm5vdGF0aW9uc1xuXHRcdGNvbnN0IGV4aXN0cyA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbHVtbi5uYW1lID09PSBwcm9wZXJ0eS5uYW1lO1xuXHRcdH0pO1xuXHRcdC8vIGlmIHRhcmdldCB0eXBlIGV4aXN0cywgaXQgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBzaG91bGQgYmUgaWdub3JlZFxuXHRcdGlmICghcHJvcGVydHkudGFyZ2V0VHlwZSAmJiAhZXhpc3RzICYmICFwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQuaW5jbHVkZXMocHJvcGVydHkubmFtZSkpIHtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRhYmxlVHlwZVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHQvLyBJbmNsdWRlIHRoZSB0ZXh0IHByb3BlcnRpZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdGV4dCBhcnJhbmdlbWVudFxuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0XHRhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLCByZWxhdGVkUHJvcGVydGllc0luZm8sIG5hbWUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNvbHVtbkluZm8gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mb1xuXHRcdFx0KTtcblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8ucHJvcGVydHlJbmZvcyA9IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzO1xuXHRcdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlKSB7XG5cdFx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBDb2xsZWN0IGluZm9ybWF0aW9uIG9mIHJlbGF0ZWQgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbbmFtZV0uYW5ub3RhdGlvblByb3BlcnR5O1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MgPSBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2goKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbCBvdmVyd3JpdGUgYXMgd2UgcmVxdWlyZSBvbmx5IG9uZSBuZXcgUHJvcGVydHlJbmZvIGZvciBhIHJlbGF0ZWQgUHJvcGVydHkuXG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXHRcdC8vIEluIGNhc2UgYSBwcm9wZXJ0eSBoYXMgZGVmaW5lZCBhICNUZXh0T25seSB0ZXh0IGFycmFuZ2VtZW50IHRoYXQgcG9pbnRzIHRvIGEgdGV4dCBwcm9wZXJ0eSAoYW5kIG5vdCBhICdoYXJkIGNvZGVkIHRleHQnKSBkb24ndCBvbmx5IGNyZWF0ZSB0aGUgY29tcGxleCBwcm9wZXJ0eSB3aXRoIHRoZSB0ZXh0IHByb3BlcnR5IGFzIGEgY2hpbGQgcHJvcGVydHksXG5cdFx0Ly8gYnV0IGFsc28gdGhlIHByb3BlcnR5IGl0c2VsZiBhcyBpdCBjYW4gYmUgdXNlZCBhcyB3aXRoaW4gdGhlIHNvcnRDb25kaXRpb25zIG9yIG9uIGN1c3RvbSBjb2x1bW5zLlxuXHRcdC8vIFRoaXMgc3RlcCBtdXN0IGJlIHZhbGlkIGFsc28gZnJvbSB0aGUgY29sdW1ucyBhZGRlZCB2aWEgTGluZUl0ZW1zIG9yIGZyb20gYSBjb2x1bW4gYXZhaWxhYmxlIG9uIHRoZSBwMTNuLlxuXHRcdGlmIChnZXREaXNwbGF5TW9kZShwcm9wZXJ0eSkgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eS5uYW1lKTtcblx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCkpIHtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChcblx0XHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdC8vIENyZWF0ZSBhIHByb3BlcnR5SW5mbyBmb3IgZWFjaCByZWxhdGVkIHByb3BlcnR5LlxuXHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0dGFibGVUeXBlLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHQpO1xuXHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbnMuY29uY2F0KHJlbGF0ZWRDb2x1bW5zKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgY29sdW1uIGRlZmluaXRpb24gZnJvbSBhIHByb3BlcnR5LlxuICogQHBhcmFtIHByb3BlcnR5IEVudGl0eSB0eXBlIHByb3BlcnR5IGZvciB3aGljaCB0aGUgY29sdW1uIGlzIGNyZWF0ZWRcbiAqIEBwYXJhbSBmdWxsUHJvcGVydHlQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eVxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0gdXNlRGF0YUZpZWxkUHJlZml4IFNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIFwiRGF0YUZpZWxkOjpcIiwgZWxzZSBpdCB3aWxsIGJlIHByZWZpeGVkIHdpdGggXCJQcm9wZXJ0eTo6XCJcbiAqIEBwYXJhbSBhdmFpbGFibGVGb3JBZGFwdGF0aW9uIERlY2lkZXMgd2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIGFkYXB0YXRpb25cbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkhlbHBlciBUaGUgYWdncmVnYXRpb25IZWxwZXIgZm9yIHRoZSBlbnRpdHlcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIG1hcCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb25cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyIGZvciB0aGUgY29sdW1uXG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSBUaGUgTURDIHBhdGggdXNlZCBmb3IgdGhlIDE6biBwcm9wZXJ0eSB0byBhbGxvdyBmaWx0ZXJpbmcgZnJvbSBNRENcbiAqIEByZXR1cm5zIFRoZSBhbm5vdGF0aW9uIGNvbHVtbiBkZWZpbml0aW9uXG4gKi9cbmNvbnN0IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0ZnVsbFByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZyxcblx0dXNlRGF0YUZpZWxkUHJlZml4OiBib29sZWFuLFxuXHRhdmFpbGFibGVGb3JBZGFwdGF0aW9uOiBib29sZWFuLFxuXHRhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHR0YWJsZVR5cGU/OiBUYWJsZVR5cGUsXG5cdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcz86IFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0dGFibGVDcmVhdGlvbk1vZGU/OiBDcmVhdGlvbk1vZGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz86IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWU/OiBzdHJpbmdcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbiB7XG5cdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPSBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgcHJvcGVydHkpO1xuXHRjb25zdCBpc0hpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHByb3BlcnR5KTtcblx0Y29uc3QgZ3JvdXBQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwcm9wZXJ0eS5uYW1lID8gX3NsaWNlQXRTbGFzaChwcm9wZXJ0eS5uYW1lLCB0cnVlLCBmYWxzZSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IGlzR3JvdXA6IGJvb2xlYW4gPSBncm91cFBhdGggIT0gcHJvcGVydHkubmFtZTtcblx0Y29uc3QgbGFiZWwgPSBnZXRMYWJlbChwcm9wZXJ0eSwgaXNHcm91cCk7XG5cdGNvbnN0IGRhdGFUeXBlID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUocHJvcGVydHkpO1xuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCBkYXRhVHlwZSk7XG5cdGNvbnN0IGlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbiA9IGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbcmVsYXRpdmVQYXRoXSA9PT0gXCJEZXNjcmlwdGlvblwiO1xuXHRjb25zdCBzb3J0YWJsZSA9XG5cdFx0KCFpc0hpZGRlbiB8fCBpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24pICYmICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vblNvcnRhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhyZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCBmaWx0ZXJhYmxlID0gIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocmVsYXRpdmVQYXRoKTtcblx0Y29uc3QgZ3JvdXBhYmxlID1cblx0XHRhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpICYmIHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIlxuXHRcdFx0PyAhIWFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHkpXG5cdFx0XHQ6IHNvcnRhYmxlO1xuXHRjb25zdCB0eXBlQ29uZmlnID0ge1xuXHRcdGNsYXNzTmFtZTogcHJvcGVydHkudHlwZSB8fCBkYXRhVHlwZSxcblx0XHRmb3JtYXRPcHRpb25zOiBwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyxcblx0XHRjb25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdH07XG5cdGxldCBleHBvcnRTZXR0aW5nczogUHJvcGVydHlJbmZvW1wiZXhwb3J0U2V0dGluZ3NcIl0gPSBudWxsO1xuXHRpZiAoX2lzRXhwb3J0YWJsZUNvbHVtbihwcm9wZXJ0eSkpIHtcblx0XHRleHBvcnRTZXR0aW5ncyA9IGNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzKHByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllc0luZm8pO1xuXHR9XG5cdGNvbnN0IGF2YWlsYWJpbGl0eSA9ICFpc0hpZGRlbiAmJiBhdmFpbGFibGVGb3JBZGFwdGF0aW9uID8gXCJBZGFwdGF0aW9uXCIgOiBcIkhpZGRlblwiO1xuXHRjb25zdCBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyhyZWxhdGl2ZVBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAocmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSkge1xuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWU7XG5cdH1cblx0Y29uc3QgbmFtZSA9IHVzZURhdGFGaWVsZFByZWZpeCA/IHJlbGF0aXZlUGF0aCA6IGBQcm9wZXJ0eTo6JHtyZWxhdGl2ZVBhdGh9YDtcblx0Y29uc3Qga2V5ID0gKHVzZURhdGFGaWVsZFByZWZpeCA/IFwiRGF0YUZpZWxkOjpcIiA6IFwiUHJvcGVydHk6OlwiKSArIHJlcGxhY2VTcGVjaWFsQ2hhcnMocmVsYXRpdmVQYXRoKTtcblxuXHRjb25zdCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbiA9IHtcblx0XHRrZXk6IGtleSxcblx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0ZGF0YVR5cGU6IGRhdGFUeXBlID8/IHByb3BlcnR5LnR5cGUsXG5cdFx0bGFiZWw6IGxhYmVsID8/IHByb3BlcnR5Lm5hbWUsXG5cdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IGdldExhYmVsKHByb3BlcnR5KSA6IHVuZGVmaW5lZCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IHVuZGVmaW5lZCxcblx0XHRhbm5vdGF0aW9uUGF0aDogZnVsbFByb3BlcnR5UGF0aCxcblx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0YXZhaWxhYmlsaXR5OiBhdmFpbGFiaWxpdHksXG5cdFx0bmFtZTogbmFtZSxcblx0XHRyZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcblx0XHRzb3J0YWJsZTogc29ydGFibGUsXG5cdFx0ZmlsdGVyYWJsZTogZmlsdGVyYWJsZSxcblx0XHRpc0dyb3VwYWJsZTogZ3JvdXBhYmxlLFxuXHRcdGlzS2V5OiBwcm9wZXJ0eS5pc0tleSxcblx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHR5cGVDb25maWc6IHR5cGVDb25maWcgYXMgUHJvcGVydHlUeXBlQ29uZmlnLFxuXHRcdGltcG9ydGFuY2U6IGdldEltcG9ydGFuY2UoY29udmVydGVyQ29udGV4dCwgcHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0KSxcblx0XHRyZXF1aXJlZDogaXNSZXF1aXJlZENvbHVtbihjb252ZXJ0ZXJDb250ZXh0LCBwcm9wZXJ0eSwgdGFibGVDcmVhdGlvbk1vZGUpLFxuXHRcdGFkZGl0aW9uYWxMYWJlbHM6IGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVsc1xuXHR9O1xuXHRfYWRkVG9vbFRpcChwcm9wZXJ0eSwgY29sdW1uKTtcblx0X3NldEV4cG9ydFNldHRpbmdzRm9yRGF0YVBvaW50KHByb3BlcnR5LCBjb2x1bW4pO1xuXG5cdGlmIChcblx0XHRhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpICYmXG5cdFx0TW9kZWxIZWxwZXIuaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpICYmXG5cdFx0KHJlbGF0aXZlUGF0aCA9PT0gXCJIYXNBY3RpdmVFbnRpdHlcIiB8fCByZWxhdGl2ZVBhdGggPT09IFwiSGFzRHJhZnRFbnRpdHlcIiB8fCByZWxhdGl2ZVBhdGggPT09IFwiSXNBY3RpdmVFbnRpdHlcIilcblx0KSB7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhbmFseXRpY2FsIHRhYmxlIG9uIGEgZHJhZnQtZW5hYmxlZCBlbnRpdHksIHdlIGFsd2F5cyBjb25zaWRlciB0aGUgSGFzRHJhZnRFbnRpdHksIEhhc0FjdGl2ZUVudGl0eSBhbmQgSXNBY3RpdmVFbnRpdHkgcHJvcGVydGllcyBhc1xuXHRcdC8vIHRlY2huaWNhbGx5IGdyb3VwYWJsZSwgYXMgd2UgbmVlZCB0byBsb2FkIHRoZW0gZm9yIG91ciBpbnRlcm5hbCBsb2dpYy5cblx0XHRjb2x1bW4uZXh0ZW5zaW9uID0ge1xuXHRcdFx0dGVjaG5pY2FsbHlBZ2dyZWdhdGFibGU6IGZhbHNlLFxuXHRcdFx0dGVjaG5pY2FsbHlHcm91cGFibGU6IHRydWVcblx0XHR9O1xuXHR9XG5cdHJldHVybiBjb2x1bW47XG59O1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgZXhwb3J0IHNldHRpbmdzIGZvciBhIGdpdmVuIGNvbHVtbi5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGdpdmVuIGNvbHVtbiBmcm9tIGEgbGluZSBpdGVtIGFzIGEgZGF0YSBmaWVsZCBvciBhIHByb3BlcnR5IGZyb20gdGhlIGVudGl0eSB0eXBlXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgbGlua2VkIHRvIHRoZSBjb2x1bW4gKG5hbWVkIGFsc28gY29tcGxleCBwcm9wZXJ0eSlcbiAqIEByZXR1cm5zIFRoZSBleHBvcnQgc2V0dGluZ3MgaW4gYSB0aGUgZ2l2ZW4gY29sdW1uXG4gKi9cbmNvbnN0IGNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzID0gZnVuY3Rpb24gKFxuXHRjb2x1bW46IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvPzogQ29tcGxleFByb3BlcnR5SW5mb1xuKTogQ29sdW1uRXhwb3J0U2V0dGluZ3Mge1xuXHRsZXQgdW5pdFByb3BlcnR5LCB0aW1lem9uZVByb3BlcnR5LCB1bml0VGV4dCwgdGltZXpvbmVUZXh0LCB1dGMsIGlzQVRpbWV6b25lLCBjdXJyZW5jeVByb3BlcnR5LCBzY2FsZTtcblx0Y29uc3QgcmVsYXRlZFByb3BlcnR5TmFtZXMgPSByZWxhdGVkUHJvcGVydGllc0luZm8gPyBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcykgOiBbXTtcblx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyAmJiByZWxhdGVkUHJvcGVydHlOYW1lcz8ubGVuZ3RoID09PSAxKSB7XG5cdFx0Ly8gQ3JlYXRlIHRoZSBleHBvcnQgc2V0dGluZ3Mgb2YgYSBjb2x1bW4gYmFzZWQgb24gdGhlIHJlbGF0ZWQgKGNoaWxkKSBwcm9wZXJ0eSBpbiBjYXNlIHRoZXJlIGlzIG9ubHkgb25lLlxuXHRcdC8vIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiB3ZSBoYXZlIGEgdGV4dCBvbmx5IGFubm90YXRpb24gdG8gY29tcHV0ZSB0aGUgZXhwb3J0IHNldHRpbmdzIGZyb20gdGhlIHRleHQgaW5zdGVhZCBvZiB0aGUgdmFsdWVcblx0XHRjb2x1bW4gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lc1swXV0uYW5ub3RhdGlvblByb3BlcnR5O1xuXHR9XG5cdGNvbnN0IGRhdGFUeXBlID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUoY29sdW1uKTtcblx0aWYgKGlzUHJvcGVydHkoY29sdW1uKSkge1xuXHRcdHVuaXRQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkoY29sdW1uKTtcblx0XHRjdXJyZW5jeVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkoY29sdW1uKTtcblx0XHR0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkoY29sdW1uKTtcblx0XHR1bml0VGV4dCA9IGdldFN0YXRpY1VuaXRPckN1cnJlbmN5KGNvbHVtbik7XG5cdFx0dGltZXpvbmVUZXh0ID0gZ2V0U3RhdGljVGltZXpvbmUoY29sdW1uKTtcblx0XHRpc0FUaW1lem9uZSA9IGlzVGltZXpvbmUoY29sdW1uKTtcblx0XHRzY2FsZSA9IGNvbHVtbi5zY2FsZTtcblx0fVxuXHR1bml0UHJvcGVydHkgPSByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzPy51bml0UHJvcGVydHkgPz8gdW5pdFByb3BlcnR5Py5uYW1lID8/IGN1cnJlbmN5UHJvcGVydHk/Lm5hbWU7XG5cdHRpbWV6b25lUHJvcGVydHkgPSByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzPy50aW1lem9uZVByb3BlcnR5ID8/IHRpbWV6b25lUHJvcGVydHk/Lm5hbWU7XG5cdHNjYWxlID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8uc2NhbGUgPz8gc2NhbGU7XG5cdGNvbnN0IGV4cG9ydFR5cGUgPSBnZXRFeHBvcnREYXRhVHlwZShkYXRhVHlwZSwgaXNBVGltZXpvbmUsICEhY3VycmVuY3lQcm9wZXJ0eSwgcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncyk7XG5cdGlmICh0aW1lem9uZVByb3BlcnR5IHx8IChleHBvcnRUeXBlID09PSBcIkRhdGVUaW1lXCIgJiYgIXRpbWV6b25lVGV4dCkpIHtcblx0XHR1dGMgPSBmYWxzZTtcblx0fVxuXHRjb25zdCBleHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSB7XG5cdFx0dHlwZTogZXhwb3J0VHlwZSxcblx0XHRpbnB1dEZvcm1hdDogZ2V0RGF0ZUlucHV0Rm9ybWF0KGRhdGFUeXBlKSxcblx0XHRkZWxpbWl0ZXI6IGdldERlbGltaXRlcihkYXRhVHlwZSksXG5cdFx0c2NhbGU6IHNjYWxlLFxuXHRcdHVuaXRQcm9wZXJ0eTogdW5pdFByb3BlcnR5LFxuXHRcdHVuaXQ6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MudW5pdCA/PyB1bml0VGV4dCxcblx0XHR0aW1lem9uZVByb3BlcnR5OiB0aW1lem9uZVByb3BlcnR5LFxuXHRcdHRpbWV6b25lOiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLnRpbWV6b25lID8/IHRpbWV6b25lVGV4dD8udG9TdHJpbmcoKSxcblx0XHR0ZW1wbGF0ZTogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy50ZW1wbGF0ZSxcblx0XHQvL29ubHkgaW4gY2FzZSBvZiBjb21wbGV4IHByb3BlcnRpZXMsIHdyYXAgdGhlIGNlbGwgY29udGVudFx0b24gdGhlIGV4Y2VsIGV4cG9ydGVkIGZpbGVcblx0XHR3cmFwOiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLndyYXAsXG5cdFx0dXRjOiB1dGMsXG5cdFx0cHJvcGVydHk6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MucHJvcGVydHlcblx0fTtcblx0aWYgKGV4cG9ydFNldHRpbmdzLnVuaXRQcm9wZXJ0eSB8fCBleHBvcnRTZXR0aW5ncy51bml0KSB7XG5cdFx0ZXhwb3J0U2V0dGluZ3MuYXV0b1NjYWxlID0gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gcmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzKGV4cG9ydFNldHRpbmdzKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZXhwb3J0IGZvcm1hdCB0ZW1wbGF0ZSBmb3IgY29sdW1ucyB3aXRoIGRhdGVzLlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtblxuICogQHJldHVybnMgVGhlIGlucHV0Rm9ybWF0XG4gKi9cbmNvbnN0IGdldERhdGVJbnB1dEZvcm1hdCA9IGZ1bmN0aW9uIChkYXRhVHlwZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiBkYXRhVHlwZSA9PT0gXCJFZG0uRGF0ZVwiID8gXCJZWVlZLU1NLUREXCIgOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGRlbGltaXRlciBpbiBudW1lcmljIGNvbHVtbnMuXG4gKiBUaGUgZGVsaW1pdGVyIGlzIHVzZWQgdG8gZGlzcGxheSB0aG91c2FuZHMgc2VwYXJhdG9yIGluIG51bWVyaWMgY29sdW1ucy5cbiAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRydWUgdG8gZGlzcGxheSB0aG91c2FuZHMgc2VwYXJhdG9yIGluIG51bWVyaWMgY29sdW1uc1xuICovXG5jb25zdCBnZXREZWxpbWl0ZXIgPSBmdW5jdGlvbiAoZGF0YVR5cGU/OiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGRhdGFUeXBlID09PSBcIkVkbS5JbnQ2NFwiID8gdHJ1ZSA6IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB1bmRlZmluZWQgdmFsdWVzIGZyb20gdGhlIGV4cG9ydCBzZXR0aW5ncyBvYmplY3Qgb2YgYSBjb2x1bW4uXG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGV4cG9ydCBzZXR0aW5ncyBjb25maWd1cmF0aW9ucyBmb3IgYSBjb2x1bW5cbiAqIEByZXR1cm5zIFRoZSBleHBvcnQgc2V0dGluZ3MgY29uZmlndXJhdGlvbnMgd2l0aG91dCB1bmRlZmluZWQgdmFsdWVzXG4gKi9cbmNvbnN0IHJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyA9IGZ1bmN0aW9uIChleHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MpOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB7XG5cdC8vUmVtb3ZlIHVuZGVmaW5lZCBzZXR0aW5ncyBmcm9tIGV4cG9ydFNldHRpbmcgb2JqZWN0XG5cdGZvciAoY29uc3Qgc2V0dGluZyBpbiBleHBvcnRTZXR0aW5ncykge1xuXHRcdGlmIChleHBvcnRTZXR0aW5nc1tzZXR0aW5nIGFzIGtleW9mIENvbHVtbkV4cG9ydFNldHRpbmdzXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRkZWxldGUgZXhwb3J0U2V0dGluZ3Nbc2V0dGluZyBhcyBrZXlvZiBDb2x1bW5FeHBvcnRTZXR0aW5nc107XG5cdFx0fVxuXHR9XG5cdHJldHVybiBleHBvcnRTZXR0aW5ncztcbn07XG5cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIGV4cG9ydGFibGUgY29sdW1ucywgZmFsc2UgZm9yIG5vbiBleHBvcnRhYmxlIGNvbHVtbnMuXG4gKiBAcGFyYW0gc291cmNlIFRoZSBkYXRhRmllbGQgb3IgcHJvcGVydHkgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBUcnVlIGZvciBleHBvcnRhYmxlIGNvbHVtbiwgZmFsc2UgZm9yIG5vbiBleHBvcnRhYmxlIGNvbHVtblxuICovXG5mdW5jdGlvbiBfaXNFeHBvcnRhYmxlQ29sdW1uKHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogYm9vbGVhbiB7XG5cdGxldCBwcm9wZXJ0eVR5cGUsIHByb3BlcnR5O1xuXHRjb25zdCBkYXRhRmllbGREZWZhdWx0UHJvcGVydHkgPSAoc291cmNlIGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucy5VST8uRGF0YUZpZWxkRGVmYXVsdDtcblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSkge1xuXHRcdGlmIChpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihzb3VyY2UpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHByb3BlcnR5VHlwZSA9IGRhdGFGaWVsZERlZmF1bHRQcm9wZXJ0eT8uJFR5cGU7XG5cdH0gZWxzZSBpZiAoaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oc291cmNlKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBlbHNlIHtcblx0XHRwcm9wZXJ0eSA9IHNvdXJjZTtcblx0XHRwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eS4kVHlwZTtcblx0XHRpZiAocHJvcGVydHlUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmIChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlKSB7XG5cdFx0XHQvL0ZvciBDaGFydFxuXHRcdFx0cHJvcGVydHlUeXBlID0gKHByb3BlcnR5IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldD8uJFR5cGU7XG5cdFx0XHRyZXR1cm4gcHJvcGVydHlUeXBlICE9PSB1bmRlZmluZWQgJiYgIVVJQW5ub3RhdGlvblR5cGVzLkNoYXJ0RGVmaW5pdGlvblR5cGUuaW5jbHVkZXMocHJvcGVydHlUeXBlKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0KHByb3BlcnR5IGFzIERhdGFGaWVsZCkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5NZWRpYVR5cGU/LnRlcm0gPT09IFwiT3JnLk9EYXRhLkNvcmUuVjEuTWVkaWFUeXBlXCIgJiZcblx0XHRcdChwcm9wZXJ0eSBhcyBEYXRhRmllbGQpLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uaXNVUkwgIT09IHRydWVcblx0XHQpIHtcblx0XHRcdC8vRm9yIFN0cmVhbVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcGVydHlUeXBlXG5cdFx0PyAhW1xuXHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBcblx0XHQgIF0uaW5jbHVkZXMocHJvcGVydHlUeXBlKVxuXHRcdDogdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIEJvb2xlYW4gdHJ1ZSBmb3IgdmFsaWQgY29sdW1ucywgZmFsc2UgZm9yIGludmFsaWQgY29sdW1ucy5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMgVHJ1ZSBmb3IgdmFsaWQgY29sdW1ucywgZmFsc2UgZm9yIGludmFsaWQgY29sdW1uc1xuICovXG5jb25zdCBfaXNWYWxpZENvbHVtbiA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBib29sZWFuIHtcblx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdHJldHVybiAhIWRhdGFGaWVsZC5JbmxpbmU7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdC8vIFRvZG86IFJlcGxhY2Ugd2l0aCBwcm9wZXIgTG9nIHN0YXRlbWVudCBvbmNlIGF2YWlsYWJsZVxuXHRcdFx0Ly8gIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBEYXRhRmllbGQgQWJzdHJhY3QgdHlwZTogXCIgKyBkYXRhRmllbGQuJFR5cGUpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSB0aGUgdmlzaWJpbGl0eSBvZiBhIERhdGFGaWVsZCBvciBEYXRhUG9pbnQgYW5ub3RhdGlvbi5cbiAqXG4gKiBTQVAgRmlvcmkgZWxlbWVudHMgd2lsbCBldmFsdWF0ZSBlaXRoZXIgdGhlIFVJLkhpZGRlbiBhbm5vdGF0aW9uIGRlZmluZWQgb24gdGhlIGFubm90YXRpb24gaXRzZWxmIG9yIG9uIHRoZSB0YXJnZXQgcHJvcGVydHkuXG4gKiBAcGFyYW0gZGF0YUZpZWxkTW9kZWxQYXRoIFRoZSBtZXRhcGF0aCByZWZlcnJpbmcgdG8gdGhlIGFubm90YXRpb24gdGhhdCBpcyBldmFsdWF0ZWQgYnkgU0FQIEZpb3JpIGVsZW1lbnRzLlxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gYmluZCB0byB0aGUgVUkuXG4gKi9cbmNvbnN0IF9nZXRWaXNpYmxlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXM+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCB0YXJnZXRPYmplY3QgPSBkYXRhRmllbGRNb2RlbFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRsZXQgcHJvcGVydHlWYWx1ZTtcblx0aWYgKHRhcmdldE9iamVjdCkge1xuXHRcdHN3aXRjaCAodGFyZ2V0T2JqZWN0LiRUeXBlKSB7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlOlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0XHQvLyBpZiBpdCBpcyBhIERhdGFGaWVsZEZvckFubm90YXRpb24gcG9pbnRpbmcgdG8gYSBEYXRhUG9pbnQgd2UgbG9vayBhdCB0aGUgZGF0YVBvaW50J3MgdmFsdWVcblx0XHRcdFx0aWYgKHRhcmdldE9iamVjdD8uVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSkge1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVGFyZ2V0LiR0YXJnZXQ/LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0Y29uc3QgaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCA9IC8qZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBVSS5Jc0V4cGFuZGVkIDoqLyBjb25zdGFudChmYWxzZSk7XG5cdGNvbnN0IGlzQW5hbHl0aWNhbExlYWYgPSAvKmZvcm1hdE9wdGlvbnM/LmlzQW5hbHl0aWNzID8gZXF1YWwoVUkuTm9kZUxldmVsLCAwKSA6Ki8gY29uc3RhbnQoZmFsc2UpO1xuXHQvLyBBIGRhdGEgZmllbGQgaXMgdmlzaWJsZSBpZjpcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIG9yaWdpbmFsIGFubm90YXRpb24gZG9lcyBub3QgZXZhbHVhdGUgdG8gJ3RydWUnXG5cdC8vIC0gdGhlIFVJLkhpZGRlbiBleHByZXNzaW9uIGluIHRoZSB0YXJnZXQgcHJvcGVydHkgZG9lcyBub3QgZXZhbHVhdGUgdG8gJ3RydWUnXG5cdC8vIC0gaW4gY2FzZSBvZiBBbmFseXRpY3MgaXQncyBub3QgdmlzaWJsZSBmb3IgYW4gZXhwYW5kZWQgR3JvdXBIZWFkZXJcblx0cmV0dXJuIGFuZChcblx0XHQuLi5bXG5cdFx0XHRub3QoZXF1YWwoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSksXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdCEhcHJvcGVydHlWYWx1ZSxcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSAmJiBub3QoZXF1YWwoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHByb3BlcnR5VmFsdWUuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSksXG5cdFx0XHRcdHRydWVcblx0XHRcdCksXG5cdFx0XHRvcihub3QoaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCksIGlzQW5hbHl0aWNhbExlYWYpXG5cdFx0XVxuXHQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGhpZGRlbiBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciBhIGZpZWxkIGdyb3VwLlxuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwIERhdGFGaWVsZCBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMgQ29tcGlsZSBiaW5kaW5nIG9mIGZpZWxkIGdyb3VwIGV4cHJlc3Npb25zLlxuICovXG5jb25zdCBfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gZnVuY3Rpb24gKGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuXHRjb25zdCBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGlmIChcblx0XHRkYXRhRmllbGRHcm91cC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdCkge1xuXHRcdGlmIChkYXRhRmllbGRHcm91cD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pIHtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihub3QoZXF1YWwoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKGRhdGFGaWVsZEdyb3VwLmFubm90YXRpb25zLlVJLkhpZGRlbiksIHRydWUpKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGFGaWVsZEdyb3VwLlRhcmdldC4kdGFyZ2V0LkRhdGE/LmZvckVhY2goKGlubmVyRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzKSA9PiB7XG5cdFx0XHRcdGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucy5wdXNoKFxuXHRcdFx0XHRcdF9nZXRWaXNpYmxlRXhwcmVzc2lvbih7IHRhcmdldE9iamVjdDogaW5uZXJEYXRhRmllbGQgfSBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPFxuXHRcdFx0XHRcdFx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlc1xuXHRcdFx0XHRcdD4pXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihpZkVsc2Uob3IoLi4uZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zKSwgY29uc3RhbnQodHJ1ZSksIGNvbnN0YW50KGZhbHNlKSkpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgcHJvcGVydHkgYW5kIGRhdGFGaWVsZC5cbiAqIEBwYXJhbSBbcHJvcGVydHldIFByb3BlcnR5LCBEYXRhRmllbGQgb3IgTmF2aWdhdGlvbiBQcm9wZXJ0eSBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHBhcmFtIGlzR3JvdXBcbiAqIEByZXR1cm5zIExhYmVsIG9mIHRoZSBwcm9wZXJ0eSBvciBEYXRhRmllbGRcbiAqL1xuY29uc3QgZ2V0TGFiZWwgPSBmdW5jdGlvbiAocHJvcGVydHk6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSwgaXNHcm91cCA9IGZhbHNlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFwcm9wZXJ0eSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGlzUHJvcGVydHkocHJvcGVydHkpIHx8IGlzTmF2aWdhdGlvblByb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdGNvbnN0IGRhdGFGaWVsZERlZmF1bHQgPSAocHJvcGVydHkgYXMgUHJvcGVydHkpLmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdDtcblx0XHRpZiAoZGF0YUZpZWxkRGVmYXVsdCAmJiAhZGF0YUZpZWxkRGVmYXVsdC5xdWFsaWZpZXIgJiYgZGF0YUZpZWxkRGVmYXVsdC5MYWJlbCkge1xuXHRcdFx0cmV0dXJuIGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnRvU3RyaW5nKCk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LkxhYmVsPy50b1N0cmluZygpID8/IHByb3BlcnR5Lm5hbWU7XG5cdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRUeXBlcyhwcm9wZXJ0eSkpIHtcblx0XHRpZiAoISFpc0dyb3VwICYmIHByb3BlcnR5LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uKSB7XG5cdFx0XHRyZXR1cm4gcHJvcGVydHk/LkxhYmVsPy50b1N0cmluZygpO1xuXHRcdH1cblx0XHRyZXR1cm4gKFxuXHRcdFx0cHJvcGVydHk/LkxhYmVsPy50b1N0cmluZygpID8/XG5cdFx0XHRjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbCwgW10sIHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5uYW1lKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0gZWxzZSBpZiAocHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0cHJvcGVydHkuTGFiZWw/LnRvU3RyaW5nKCkgPz9cblx0XHRcdGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oKHByb3BlcnR5LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSlcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBwcm9wZXJ0eS5MYWJlbD8udG9TdHJpbmcoKTtcblx0fVxufTtcblxuY29uc3QgX2dldFRvb2x0aXAgPSBmdW5jdGlvbiAoc291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXNvdXJjZSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSB8fCBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHNvdXJjZS5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMoc291cmNlKSkge1xuXHRcdHJldHVybiBzb3VyY2UuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oc291cmNlLlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChzb3VyY2UuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRjb25zdCBkYXRhcG9pbnRUYXJnZXQgPSBzb3VyY2UuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludDtcblx0XHRyZXR1cm4gZGF0YXBvaW50VGFyZ2V0Py5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhcG9pbnRUYXJnZXQuVmFsdWUuJHRhcmdldC5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KGNvbE5hbWU6IHN0cmluZywgaXNTZW1hbnRpY0tleUluRmllbGRHcm91cD86IGJvb2xlYW4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gZm9ybWF0UmVzdWx0KFxuXHRcdFtcblx0XHRcdHBhdGhJbk1vZGVsKGBzZW1hbnRpY0tleUhhc0RyYWZ0SW5kaWNhdG9yYCwgXCJpbnRlcm5hbFwiKSxcblx0XHRcdHBhdGhJbk1vZGVsKGBmaWx0ZXJlZE1lc3NhZ2VzYCwgXCJpbnRlcm5hbFwiKSxcblx0XHRcdGNvbE5hbWUsXG5cdFx0XHRpc1NlbWFudGljS2V5SW5GaWVsZEdyb3VwXG5cdFx0XSxcblx0XHR0YWJsZUZvcm1hdHRlcnMuZ2V0RXJyb3JTdGF0dXNUZXh0VmlzaWJpbGl0eUZvcm1hdHRlclxuXHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9wZXJ0eUluZm8gZm9yIGVhY2ggaWRlbnRpZmllZCBwcm9wZXJ0eSBjb25zdW1lZCBieSBhIExpbmVJdGVtLlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBJZGVudGlmaWVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZXhpc3RpbmdDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmb3IgTGluZUl0ZW1zIGFuZCBQcm9wZXJ0aWVzIG9mIGVudGl0eVR5cGUuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGUgZm9yIHRoZSBMaW5lSXRlbVxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIG1hcCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgdGV4dCBvbiBhIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkLlxuICovXG5jb25zdCBfY3JlYXRlUmVsYXRlZENvbHVtbnMgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRleGlzdGluZ0NvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0dGFibGVUeXBlPzogVGFibGVUeXBlLFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZSxcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdO1xuXHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRPYmplY3Qua2V5cyhjb2x1bW5zVG9CZUNyZWF0ZWQpLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRjb25zdCBwcm9wZXJ0eSA9IGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSxcblx0XHRcdGFubm90YXRpb25QYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKG5hbWUpLFxuXHRcdFx0Ly8gQ2hlY2sgd2hldGhlciB0aGUgcmVsYXRlZCBjb2x1bW4gYWxyZWFkeSBleGlzdHMuXG5cdFx0XHRyZWxhdGVkQ29sdW1uID0gZXhpc3RpbmdDb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5hbWUpO1xuXHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpKS5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdFx0Y29uc3QgcHJvcGVydHlPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PihkYXRhTW9kZWxPYmplY3RQYXRoLCBuYW1lKTtcblx0XHRpZiAoaXNNdWx0aVZhbHVlRmllbGQocHJvcGVydHlPYmplY3RQYXRoKSkge1xuXHRcdFx0Y29uc3QgbmV3TmFtZVJlbGF0aXZlVGFyZ2V0UGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgocHJvcGVydHlPYmplY3RQYXRoLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdG5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGhcblx0XHRcdCk7XG5cdFx0XHRjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnMsIG5hbWUsIGNvbHVtbik7XG5cdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZVJlbGF0aXZlVGFyZ2V0UGF0aCA/PyBuYW1lO1xuXHRcdH0gZWxzZSBpZiAocmVsYXRlZENvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBDYXNlIDE6IEtleSBjb250YWlucyBEYXRhRmllbGQgcHJlZml4IHRvIGVuc3VyZSBhbGwgcHJvcGVydHkgY29sdW1ucyBoYXZlIHRoZSBzYW1lIGtleSBmb3JtYXQuXG5cdFx0XHQvLyBOZXcgY3JlYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaXMgc2V0IHRvIGhpZGRlbi5cblx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGVcblx0XHRcdCk7XG5cdFx0XHRjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnMsIG5hbWUsIGNvbHVtbik7XG5cdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0fSBlbHNlIGlmIChyZWxhdGVkQ29sdW1uLmFubm90YXRpb25QYXRoICE9PSBhbm5vdGF0aW9uUGF0aCB8fCByZWxhdGVkQ29sdW1uLnByb3BlcnR5SW5mb3MpIHtcblx0XHRcdC8vIENhc2UgMjogVGhlIGV4aXN0aW5nIGNvbHVtbiBwb2ludHMgdG8gYSBMaW5lSXRlbSAob3IpXG5cdFx0XHQvLyBDYXNlIDM6IFRoaXMgaXMgYSBzZWxmIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIGNvbHVtblxuXHRcdFx0Y29uc3QgbmV3TmFtZSA9IGBQcm9wZXJ0eTo6JHtuYW1lfWA7XG5cdFx0XHQvLyBDaGVja2luZyB3aGV0aGVyIHRoZSByZWxhdGVkIHByb3BlcnR5IGNvbHVtbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uXG5cdFx0XHRpZiAoIWV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSkge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSBuZXcgcHJvcGVydHkgY29sdW1uIHdpdGggJ1Byb3BlcnR5OjonIHByZWZpeCxcblx0XHRcdFx0Ly8gU2V0IGl0IHRvIGhpZGRlbiBhcyBpdCBpcyBvbmx5IGNvbnN1bWVkIGJ5IENvbXBsZXggcHJvcGVydHkgaW5mb3MuXG5cdFx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnMsIG5hbWUsIGNvbHVtbik7XG5cdFx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWU7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmV3TmFtZSkgJiZcblx0XHRcdFx0ZXhpc3RpbmdDb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLnByb3BlcnR5SW5mb3M/LmluY2x1ZGVzKG5hbWUpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSBuZXdOYW1lO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8ubWFwKChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm8pO1xuXHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcz8ubWFwKFxuXHRcdFx0KHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVsYXRlZENvbHVtbnM7XG59O1xuXG4vKipcbiAqIEdldHRpbmcgdGhlIENvbHVtbiBOYW1lXG4gKiBJZiBpdCBwb2ludHMgdG8gYSBEYXRhRmllbGQgd2l0aCBvbmUgcHJvcGVydHkgb3IgRGF0YVBvaW50IHdpdGggb25lIHByb3BlcnR5LCBpdCB3aWxsIHVzZSB0aGUgcHJvcGVydHkgbmFtZVxuICogaGVyZSB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGV4aXN0aW5nIGZsZXggY2hhbmdlcy5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMgVGhlIG5hbWUgb2YgYW5ub3RhdGlvbiBjb2x1bW5zXG4gKi9cbmNvbnN0IF9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZSA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBzdHJpbmcge1xuXHQvLyBUaGlzIGlzIG5lZWRlZCBhcyB3ZSBoYXZlIGZsZXhpYmlsaXR5IGNoYW5nZXMgYWxyZWFkeSB0aGF0IHdlIGhhdmUgdG8gY2hlY2sgYWdhaW5zdFxuXHRpZiAoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8ucGF0aCkge1xuXHRcdHJldHVybiBkYXRhRmllbGQuVmFsdWU/LnBhdGg7XG5cdH0gZWxzZSBpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy5wYXRoKSB7XG5cdFx0Ly8gVGhpcyBpcyBmb3IgcmVtb3ZpbmcgZHVwbGljYXRlIHByb3BlcnRpZXMuIEZvciBleGFtcGxlLCAnUHJvZ3Jlc3MnIFByb3BlcnR5IGlzIHJlbW92ZWQgaWYgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgRGF0YVBvaW50XG5cdFx0cmV0dXJuIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0fVxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhIGZpZWxkIGxhYmVscyBoYXZlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuXG4gKiBAcGFyYW0gZmllbGRHcm91cE5hbWUgVGhlIGBEYXRhRmllbGRgIG5hbWUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgYHNob3dEYXRhRmllbGRzTGFiZWxgIHZhbHVlIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmNvbnN0IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsID0gZnVuY3Rpb24gKFxuXHRmaWVsZEdyb3VwTmFtZTogc3RyaW5nLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHRjb25zdCBjb2x1bW5zID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCk/LmNvbHVtbnM7XG5cdGNvbnN0IGNvbHVtbktleXMgPSBjb2x1bW5zICYmIE9iamVjdC5rZXlzKGNvbHVtbnMpO1xuXHRyZXR1cm4gKFxuXHRcdGNvbHVtbktleXMgJiZcblx0XHQhIWNvbHVtbktleXMuZmluZChmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBrZXkgPT09IGZpZWxkR3JvdXBOYW1lICYmIChjb2x1bW5zW2tleV0gYXMgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUpLnNob3dEYXRhRmllbGRzTGFiZWw7XG5cdFx0fSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcHJvcGVydHkgd2l0aCByZXNwZWN0IHRvIHRoZSByb290IGVudGl0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGBEYXRhRmllbGRgIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRoXG4gKi9cbmNvbnN0IF9nZXRSZWxhdGl2ZVBhdGggPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0bGV0IHJlbGF0aXZlUGF0aCA9IFwiXCI7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/LlZhbHVlPy5wYXRoO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gZGF0YUZpZWxkPy5UYXJnZXQ/LnZhbHVlO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb25Hcm91cDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb25Hcm91cDpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0XHRcdGJyZWFrO1xuXHR9XG5cdHJldHVybiByZWxhdGl2ZVBhdGg7XG59O1xuXG5jb25zdCBfc2xpY2VBdFNsYXNoID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRjb25zdCBpU2xhc2hJbmRleCA9IGlzTGFzdFNsYXNoID8gcGF0aC5sYXN0SW5kZXhPZihcIi9cIikgOiBwYXRoLmluZGV4T2YoXCIvXCIpO1xuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgY29sdW1uIGNvbnRhaW5zIGEgbXVsdGktdmFsdWUgZmllbGQuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIERhdGFGaWVsZCBjb3JyZXNwb25kcyB0byBhIG11bHRpLXZhbHVlIGZpZWxkLlxuICovXG5jb25zdCBfaXNDb2x1bW5NdWx0aVZhbHVlZCA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IGJvb2xlYW4ge1xuXHRpZiAoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZC5WYWx1ZSkpIHtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRkYXRhRmllbGQuVmFsdWUucGF0aFxuXHRcdCk7XG5cdFx0cmV0dXJuIGlzTXVsdGlWYWx1ZUZpZWxkKHByb3BlcnR5T2JqZWN0UGF0aCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgY29sdW1uIGlzIHNvcnRhYmxlLlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YSBmaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgQ29sbGVjdGlvbiBvZiBub24tc29ydGFibGUgY29sdW1uIG5hbWVzIGFzIHBlciBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgbGlua2VkIHRvIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNvbHVtbiBpcyBzb3J0YWJsZVxuICovXG5jb25zdCBfaXNDb2x1bW5Tb3J0YWJsZSA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHQhbm9uU29ydGFibGVDb2x1bW5zLmluY2x1ZGVzKHByb3BlcnR5UGF0aCkgJiYgLy8gQ29sdW1uIGlzIG5vdCBtYXJrZWQgYXMgbm9uLXNvcnRhYmxlIHZpYSBhbm5vdGF0aW9uXG5cdFx0KCgoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSAmJlxuXHRcdFx0T2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpLnNvbWUoKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlzSGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4ocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcHJvcE5hbWVdLmFubm90YXRpb25Qcm9wZXJ0eSk7XG5cdFx0XHRcdHJldHVybiAhaXNIaWRkZW4gJiYgIW5vblNvcnRhYmxlQ29sdW1ucy5pbmNsdWRlcyhwcm9wTmFtZSk7XG5cdFx0XHR9KSkgfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybCB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb24pXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBmaWx0ZXJpbmcgb24gdGhlIHRhYmxlIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgUmV0dXJucyAnZmFsc2UnIGlmIEZpbHRlckZ1bmN0aW9ucyBhbm5vdGF0aW9uIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0Y29uc3QgZmlsdGVyRnVuY3Rpb25zOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRnVuY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKHVuZGVmaW5lZCwgZmlsdGVyRnVuY3Rpb25zKTtcbn07XG5cbmZ1bmN0aW9uIF9nZXRGaWx0ZXJGdW5jdGlvbnMoQ29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogRmlsdGVyRnVuY3Rpb25zIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gQ29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0aWYgKFR5cGVHdWFyZHMuaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnMgPz9cblx0XHRcdENvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5Q29udGFpbmVyKCkuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnNcblx0XHQpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIGZvciB0ZXh0IGZpZWxkcyBpbiBhIHRhYmxlLlxuICogQHBhcmFtIGZvcm1hdE9wdGlvbnNcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZShmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZSB8IHVuZGVmaW5lZCk6IEZvcm1hdE9wdGlvbnNUeXBlIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGZvcm1hdE9wdGlvbnMgPT09IHVuZGVmaW5lZFxuXHRcdD8gdW5kZWZpbmVkXG5cdFx0OiB7XG5cdFx0XHRcdHRleHRMaW5lc0VkaXQ6IDQsXG5cdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnNcblx0XHQgIH07XG59XG5cbmZ1bmN0aW9uIF9maW5kU2VtYW50aWNLZXlWYWx1ZXMoc2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSwgbmFtZTogc3RyaW5nKTogeyB2YWx1ZXM6IHN0cmluZ1tdOyBzZW1hbnRpY0tleUZvdW5kOiBib29sZWFuIH0ge1xuXHRjb25zdCBhU2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdGxldCBiU2VtYW50aWNLZXlGb3VuZCA9IGZhbHNlO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbWFudGljS2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGFTZW1hbnRpY0tleVZhbHVlcy5wdXNoKHNlbWFudGljS2V5c1tpXS52YWx1ZSk7XG5cdFx0aWYgKHNlbWFudGljS2V5c1tpXS52YWx1ZSA9PT0gbmFtZSkge1xuXHRcdFx0YlNlbWFudGljS2V5Rm91bmQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4ge1xuXHRcdHZhbHVlczogYVNlbWFudGljS2V5VmFsdWVzLFxuXHRcdHNlbWFudGljS2V5Rm91bmQ6IGJTZW1hbnRpY0tleUZvdW5kXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9maW5kUHJvcGVydGllcyhcblx0c2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdLFxuXHRmaWVsZEdyb3VwUHJvcGVydGllczogc3RyaW5nW11cbik6IHsgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogYm9vbGVhbjsgZmllbGRHcm91cFByb3BlcnR5UGF0aD86IHN0cmluZyB9IHtcblx0bGV0IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAgPSBmYWxzZTtcblx0bGV0IHNQcm9wZXJ0eVBhdGg7XG5cdGlmIChzZW1hbnRpY0tleVZhbHVlcyAmJiBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGggPj0gMSAmJiBmaWVsZEdyb3VwUHJvcGVydGllcyAmJiBmaWVsZEdyb3VwUHJvcGVydGllcy5sZW5ndGggPj0gMSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlWYWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChbc2VtYW50aWNLZXlWYWx1ZXNbaV1dLnNvbWUoKHRtcCkgPT4gZmllbGRHcm91cFByb3BlcnRpZXMuaW5jbHVkZXModG1wKSkpIHtcblx0XHRcdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IHRydWU7XG5cdFx0XHRcdHNQcm9wZXJ0eVBhdGggPSBzZW1hbnRpY0tleVZhbHVlc1tpXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRmaWVsZEdyb3VwUHJvcGVydHlQYXRoOiBzUHJvcGVydHlQYXRoXG5cdH07XG59XG5cbi8qKlxuICogRmluZCB0aGUgZmlyc3QgcHJvcGVydHkgaW4gdGhlIGZpZWxkR3JvdXAgdGhhdCBpcyBwYXJ0IG9mIHRoZSBzZW1hbnRpYyBrZXlzLlxuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlWYWx1ZXNcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGEgZmxhZyB0cnVlIGlmIGEgcHJvcGVydHkgaXMgZm91bmQgYW5kIGEgcHJvcGVydHlQYXRoLlxuICovXG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGwsXG5cdHNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBwcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSB7XG5cdC8vIHRoaXMgaW5mbyBpcyB1c2VkIGluIEZpZWxkSGVscGVyI2lzRHJhZnRJbmRpY2F0b3JWaXNpYmxlSW5GaWVsZEdyb3VwIHRvIHNob3cgYSBkcmFmdCBpbmRpY2F0b3IgYXQgdGhlIGVuZCBvZiBhIGZpZWxkIGdyb3VwXG5cdGNvbnN0IGFQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgX3Byb3BlcnRpZXNGb3VuZDogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0gPSB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogZmFsc2UsXG5cdFx0ZmllbGRHcm91cFByb3BlcnR5UGF0aDogdW5kZWZpbmVkXG5cdH07XG5cdGlmIChcblx0XHRkYXRhRmllbGRHcm91cCAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0KSB7XG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0KGlubmVyRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwpICYmXG5cdFx0XHRcdGlubmVyRGF0YUZpZWxkLlZhbHVlXG5cdFx0XHQpIHtcblx0XHRcdFx0YVByb3BlcnRpZXMucHVzaChpbm5lckRhdGFGaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdH1cblx0XHRcdF9wcm9wZXJ0aWVzRm91bmQgPSBfZmluZFByb3BlcnRpZXMoc2VtYW50aWNLZXlWYWx1ZXMsIGFQcm9wZXJ0aWVzKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IF9wcm9wZXJ0aWVzRm91bmQuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRwcm9wZXJ0eVBhdGg6IF9wcm9wZXJ0aWVzRm91bmQuZmllbGRHcm91cFByb3BlcnR5UGF0aFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyB3aXRoIGRyYWZ0SW5kaWNhdG9yIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlzXG4gKiBAcGFyYW0gZGF0YUZpZWxkR3JvdXBcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4oXG5cdG5hbWU6IHN0cmluZyxcblx0c2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSxcblx0ZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBudWxsXG4pOiBQYXJ0aWFsPHtcblx0ZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdGZpZWxkR3JvdXBOYW1lOiBzdHJpbmc7XG5cdHNob3dFcnJvck9iamVjdFN0YXR1czogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdGhhc0RyYWZ0SW5kaWNhdG9yOiBib29sZWFuO1xufT4ge1xuXHRpZiAoIXNlbWFudGljS2V5cykge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXHRjb25zdCBzZW1hbnRpY0tleSA9IF9maW5kU2VtYW50aWNLZXlWYWx1ZXMoc2VtYW50aWNLZXlzLCBuYW1lKTtcblx0Y29uc3Qgc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAgPSBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKGRhdGFGaWVsZEdyb3VwLCBzZW1hbnRpY0tleS52YWx1ZXMpO1xuXHRpZiAoc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCkge1xuXHRcdC8vIFNlbWFudGljIEtleSBoYXMgYSBwcm9wZXJ0eSBpbiBhIEZpZWxkR3JvdXBcblx0XHRyZXR1cm4ge1xuXHRcdFx0Ly9UT0RPIHdlIHNob3VsZCByYXRoZXIgc3RvcmUgaGFzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXBcblx0XHRcdGZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aDogc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAucHJvcGVydHlQYXRoLFxuXHRcdFx0ZmllbGRHcm91cE5hbWU6IG5hbWUsXG5cdFx0XHRzaG93RXJyb3JPYmplY3RTdGF0dXM6IGNvbXBpbGVFeHByZXNzaW9uKGdldFJvd1N0YXR1c1Zpc2liaWxpdHkobmFtZSwgdHJ1ZSkpXG5cdFx0fTtcblx0fSBlbHNlIGlmIChzZW1hbnRpY0tleS5zZW1hbnRpY0tleUZvdW5kKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGhhc0RyYWZ0SW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0c2hvd0Vycm9yT2JqZWN0U3RhdHVzOiBjb21waWxlRXhwcmVzc2lvbihnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KG5hbWUsIGZhbHNlKSlcblx0XHR9O1xuXHR9XG5cdHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gX2dldEltcE51bWJlcihkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogbnVtYmVyIHtcblx0Y29uc3QgaW1wb3J0YW5jZSA9IGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlIGFzIHN0cmluZztcblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0hpZ2hcIikpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTWVkaXVtXCIpKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0xvd1wiKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cdHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogSW1wb3J0YW5jZSB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cdHJldHVybiBpbXBvcnRhbmNlID8gKGltcG9ydGFuY2Uuc3BsaXQoXCIvXCIpWzFdIGFzIEltcG9ydGFuY2UpIDogSW1wb3J0YW5jZS5Ob25lO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGV4cG9ydCBzZXR0aW5ncyBvZiBhIGNvbHVtbiBjb250YWluaW5nIGRhdGFwb2ludHMuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgb24gYSBnaXZlbiBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBiZSB1cGRhdGVkXG4gKi9cbmZ1bmN0aW9uIF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eTogUHJvcGVydHksIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHRhcmdldFZhbHVlZnJvbURQID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChwcm9wZXJ0eSk7XG5cdGlmIChcblx0XHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdHR5cGVvZiB0YXJnZXRWYWx1ZWZyb21EUCA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncyAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncz8udW5pdCAhPT0gXCIlXCJcblx0KSB7XG5cdFx0Y29sdW1uLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWVmcm9tRFA7XG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlID0gXCJ7MH0vXCIgKyB0YXJnZXRWYWx1ZWZyb21EUDtcblx0fVxufVxuXG5mdW5jdGlvbiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHM6IERhdGFGaWVsZFR5cGVzW10pOiBJbXBvcnRhbmNlIHtcblx0aWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdGxldCBtYXhJbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgaW1wTnVtYmVyID0gLTE7XG5cdFx0bGV0IERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlO1xuXHRcdGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG5cdFx0XHRpbXBOdW1iZXIgPSBfZ2V0SW1wTnVtYmVyKGZpZWxkKTtcblx0XHRcdGlmIChpbXBOdW1iZXIgPiBtYXhJbXBOdW1iZXIpIHtcblx0XHRcdFx0bWF4SW1wTnVtYmVyID0gaW1wTnVtYmVyO1xuXHRcdFx0XHREYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSA9IGZpZWxkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHR9XG5cdHJldHVybiBJbXBvcnRhbmNlLk5vbmU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW1wb3J0YW5jZSB2YWx1ZSBmb3IgYSBjb2x1bW4uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGRhdGFGaWVsZFxuICogQHJldHVybnMgVGhlIGltcG9ydGFuY2UgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcG9ydGFuY2UoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5kZWZpbmVkXG4pOiBJbXBvcnRhbmNlIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFkYXRhRmllbGQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TZW1hbnRpY0tleSA/PyBbXTtcblx0Y29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBoaWdoS2V5cyA9IFsuLi5zZW1hbnRpY0tleXMsIC4uLnJlcXVpcmVkUHJvcGVydGllc10ubWFwKChwcm9wZXJ0eVBhdGgpID0+IHByb3BlcnR5UGF0aC4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHQvL0V2YWx1YXRlIGRlZmF1bHQgSW1wb3J0YW5jZSBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcblx0bGV0IGZpZWxkc1dpdGhJbXBvcnRhbmNlO1xuXHRpZiAoaXNBbm5vdGF0aW9uT2ZUeXBlPERhdGFGaWVsZEZvckFubm90YXRpb24+KGRhdGFGaWVsZCwgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQ7XG5cdFx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxGaWVsZEdyb3VwPihkYXRhRmllbGRUYXJnZXQsIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlKSkge1xuXHRcdFx0Y29uc3QgZmllbGRHcm91cERhdGEgPSBkYXRhRmllbGRUYXJnZXQuRGF0YTtcblx0XHRcdC8vSWYgYSBGaWVsZEdyb3VwIGNvbnRhaW5zIGEgc2VtYW50aWNLZXkgb3IgcmVxdWlyZWQgcHJvcGVydHksIGltcG9ydGFuY2Ugc2V0IHRvIEhpZ2hcblx0XHRcdGlmIChcblx0XHRcdFx0ZmllbGRHcm91cERhdGEuc29tZShmdW5jdGlvbiAoZmllbGRHcm91cERhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRpc0RhdGFGaWVsZFR5cGVzKGZpZWxkR3JvdXBEYXRhRmllbGQpICYmIGhpZ2hLZXlzLmluY2x1ZGVzKGZpZWxkR3JvdXBEYXRhRmllbGQuVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBJbXBvcnRhbmNlLkhpZ2g7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL0lmIHRoZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyBhbiBJbXBvcnRhbmNlIHdlIHRha2UgaXRcblx0XHRcdFx0aWYgKGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBlbHNlIHRoZSBoaWdoZXN0IGltcG9ydGFuY2UgKGlmIGFueSkgaXMgcmV0dXJuZWRcblx0XHRcdFx0ZmllbGRzV2l0aEltcG9ydGFuY2UgPSBmaWVsZEdyb3VwRGF0YS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHRcdFx0XHRyZXR1cm4gaXRlbT8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIF9nZXRNYXhJbXBvcnRhbmNlKGZpZWxkc1dpdGhJbXBvcnRhbmNlIGFzIERhdGFGaWVsZFR5cGVzW10pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gaGlnaEtleXMuaW5jbHVkZXMoKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHQ/IEltcG9ydGFuY2UuSGlnaFxuXHRcdDogX2dldERhdGFGaWVsZEltcG9ydGFuY2UoZGF0YUZpZWxkIGFzIHVua25vd24gYXMgRGF0YUZpZWxkVHlwZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgbGluZSBpdGVtcyBmcm9tIG1ldGFkYXRhIGFubm90YXRpb25zLlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIHdpdGggdGhlaXIgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aCBUaGUgdmlzdWFsaXphdGlvbiBwYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgZW50aXR5VHlwZTogRW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXSxcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5PiA9IHt9LFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPiA9IHt9LFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKSxcblx0XHRkZWZhdWx0Q3JlYXRpb25Nb2RlID1cblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0U2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24oKT8ubWFjcm9zPy50YWJsZT8uZGVmYXVsdENyZWF0aW9uTW9kZSA9PT1cblx0XHRcdFwiSW5saW5lQ3JlYXRpb25Sb3dzXCJcblx0XHRcdFx0PyBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUgPVxuXHRcdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5jcmVhdGlvbk1vZGU/Lm5hbWUgPz8gZGVmYXVsdENyZWF0aW9uTW9kZSA/PyBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRjb25zdCBzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5ID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIkNvbW1vblwiLCBDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNLZXksIFtcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRdKVswXSBhcyBTZW1hbnRpY0tleTtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IHRhYmxlQ29udmVydGVyQ29udGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcjxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KFxuXHRcdFx0Z2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSlcblx0XHQpO1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQpID0+IHtcblx0XHRcdC8vIFRPRE86IHZhcmlhYmxlIG5hbWUgc2hvdWxkIGJlIGRhdGFmaWVsZCBhbmQgbm90IGxpbmVJdGVtXG5cdFx0XHRpZiAoIV9pc1ZhbGlkQ29sdW1uKGRhdGFGaWVsZCkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGV4cG9ydFNldHRpbmdzOiBQcm9wZXJ0eUluZm9bXCJleHBvcnRTZXR0aW5nc1wiXSA9IG51bGw7XG5cdFx0XHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID1cblx0XHRcdFx0aXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdFx0PyBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gX2dldFJlbGF0aXZlUGF0aChkYXRhRmllbGQpO1xuXHRcdFx0Ly8gRGV0ZXJtaW5lIHByb3BlcnRpZXMgd2hpY2ggYXJlIGNvbnN1bWVkIGJ5IHRoaXMgTGluZUl0ZW0uXG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShkYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlVHlwZSk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgZ3JvdXBQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSByZWxhdGl2ZVBhdGggPyBfc2xpY2VBdFNsYXNoKHJlbGF0aXZlUGF0aCwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSByZWxhdGl2ZVBhdGg7XG5cdFx0XHRjb25zdCBsYWJlbCA9IGdldExhYmVsKGRhdGFGaWVsZCwgaXNHcm91cCk7XG5cdFx0XHRjb25zdCBuYW1lID0gX2dldEFubm90YXRpb25Db2x1bW5OYW1lKGRhdGFGaWVsZCk7XG5cdFx0XHRjb25zdCBpc0ZpZWxkR3JvdXBDb2x1bW46IGJvb2xlYW4gPSBncm91cFBhdGggPyBncm91cFBhdGguaW5jbHVkZXMoYEAke1VJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXB9YCkgOiBmYWxzZTtcblx0XHRcdGNvbnN0IHNob3dEYXRhRmllbGRzTGFiZWw6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBpc0ZpZWxkR3JvdXBDb2x1bW5cblx0XHRcdFx0PyBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbChuYW1lLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dClcblx0XHRcdFx0OiBmYWxzZTtcblx0XHRcdGNvbnN0IGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBnZXREYXRhRmllbGREYXRhVHlwZShkYXRhRmllbGQpO1xuXHRcdFx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihuYW1lLCBzZW1hbnRpY0tleXMsIGRhdGFGaWVsZCkpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz4oXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRyZWxhdGl2ZVBhdGhcblx0XHRcdCk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCBhIHNpdHVhdGlvbnMgaW5kaWNhdG9yXG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllczogTmF2aWdhdGlvblByb3BlcnR5W10gPSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcztcblx0XHRcdGNvbnN0IHNpdHVhdGlvbnNOYXZQcm9wcyA9IG5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbHRlcihcblx0XHRcdFx0KG5hdmlnYXRpb25Qcm9wZXJ0eSkgPT5cblx0XHRcdFx0XHQhbmF2aWdhdGlvblByb3BlcnR5LmlzQ29sbGVjdGlvbiAmJlxuXHRcdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uU0FQT2JqZWN0Tm9kZVR5cGU/Lk5hbWUgPT09IFwiQnVzaW5lc3NTaXR1YXRpb25cIlxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHNpdHVhdGlvbnNOYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHkgfCB1bmRlZmluZWQgPSBzaXR1YXRpb25zTmF2UHJvcHMubGVuZ3RoID49IDEgPyBzaXR1YXRpb25zTmF2UHJvcHNbMF0gOiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoc2l0dWF0aW9uc05hdlByb3AgJiYgZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRmb3JtYXRPcHRpb25zLmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0XHRcdGlmIChcblx0XHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IF9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMoZGF0YUZpZWxkKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzTXVsdGlWYWx1ZSA9IF9pc0NvbHVtbk11bHRpVmFsdWVkKGRhdGFGaWVsZCwgdGFibGVDb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGlmICghaXNNdWx0aVZhbHVlICYmIF9pc0V4cG9ydGFibGVDb2x1bW4oZGF0YUZpZWxkKSkge1xuXHRcdFx0XHQvL2V4Y2x1ZGUgdGhlIHR5cGVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlIEV4cG9ydCAoZ2VuZXJhdGVzIGVycm9yIG9uIEV4cG9ydCBhcyBQREYpXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzID0gY3JlYXRlQ29sdW1uRXhwb3J0U2V0dGluZ3MoZGF0YUZpZWxkLCByZWxhdGVkUHJvcGVydGllc0luZm8pO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHByb3BlcnR5VHlwZUNvbmZpZzogUHJvcGVydHlUeXBlQ29uZmlnIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKGRhdGFUeXBlKSB7XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcoZGF0YUZpZWxkLCBkYXRhVHlwZSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0eXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgPSB7XG5cdFx0XHRcdGNsYXNzTmFtZTogZGF0YVR5cGUgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdFx0Li4ucHJvcGVydHlUeXBlQ29uZmlnPy5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNvbnN0cmFpbnRzOiBwcm9wZXJ0eVR5cGVDb25maWc/LmNvbnN0cmFpbnRzXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgdmlzdWFsU2V0dGluZ3M6IFZpc3VhbFNldHRpbmdzID0ge307XG5cdFx0XHRpZiAoIWRhdGFUeXBlIHx8ICF0eXBlQ29uZmlnKSB7XG5cdFx0XHRcdC8vIGZvciBjaGFydHNcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3Mud2lkdGhDYWxjdWxhdGlvbiA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzb3J0YWJsZSA9XG5cdFx0XHRcdCFpc011bHRpVmFsdWUgJiZcblx0XHRcdFx0X2lzQ29sdW1uU29ydGFibGUoZGF0YUZpZWxkLCByZWxhdGl2ZVBhdGgsIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMsIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdFx0XHRjb25zdCBhdmFpbGFiaWxpdHkgPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpID8gXCJIaWRkZW5cIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0Y29uc3QgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGxhYmVsOiBsYWJlbCA/PyBuYW1lLFxuXHRcdFx0XHRncm91cExhYmVsOiBpc0dyb3VwID8gZ2V0TGFiZWwoZGF0YUZpZWxkKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiB1bmRlZmluZWQsXG5cdFx0XHRcdEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogYXZhaWxhYmlsaXR5LFxuXHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRzaG93RGF0YUZpZWxkc0xhYmVsOiBzaG93RGF0YUZpZWxkc0xhYmVsLFxuXHRcdFx0XHRyZXF1aXJlZDogaXNSZXF1aXJlZENvbHVtbihjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMsIHRhYmxlQ3JlYXRpb25Nb2RlKSxcblx0XHRcdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdHNvcnRhYmxlOiBzb3J0YWJsZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID8gcmVsYXRlZFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zOiBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwID8gYWRkaXRpb25hbFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0d2lkdGg6IChkYXRhRmllbGQuYW5ub3RhdGlvbnM/LkhUTUw1Py5Dc3NEZWZhdWx0cz8ud2lkdGg/LnZhbHVlT2YoKSBhcyBzdHJpbmcpIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aW1wb3J0YW5jZTogZ2V0SW1wb3J0YW5jZShjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdHJ1ZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdFx0XHR0eXBlQ29uZmlnOiB0eXBlQ29uZmlnLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogdmlzdWFsU2V0dGluZ3MgYXMgUHJvcGVydHlJbmZvW1widmlzdWFsU2V0dGluZ3NcIl0sXG5cdFx0XHRcdHRpbWV6b25lVGV4dDogZXhwb3J0U2V0dGluZ3M/LnRpbWV6b25lLFxuXHRcdFx0XHRpc1BhcnRPZkxpbmVJdGVtOiB0cnVlLFxuXHRcdFx0XHRkYXRhVHlwZTogZGF0YVR5cGUgPz8gKFwiRWRtLlN0cmluZ1wiIGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0VHlwZUZvckVkbVR5cGUpLFxuXHRcdFx0XHRpc011bHRpVmFsdWVcblx0XHRcdH07XG5cdFx0XHRjb25zdCB0b29sdGlwID0gX2dldFRvb2x0aXAoZGF0YUZpZWxkKSA/PyBsYWJlbDtcblx0XHRcdGlmICh0b29sdGlwKSB7XG5cdFx0XHRcdGNvbHVtbi50b29sdGlwID0gdG9vbHRpcDtcblx0XHRcdH1cblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUpIHtcblx0XHRcdFx0Y29sdW1uLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKHJlbGF0ZWRQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uYW5ub3RhdGlvblByb3BlcnR5O1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgbXVsdGktdmFsdWUsIHJlbGF0ZWQgcHJvcGVydGllcyBjYW5ub3QgYmUgc29ydGVkIGFzIHdlIGdvIHRocm91Z2ggYSAxLW4gcmVsYXRpb25cblx0XHRcdFx0aWYgKGlzTXVsdGlWYWx1ZSkge1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChyZWxhdGVkUHJvcGVydHlOYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChcblx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGxpbmVJdGVtIHBvaW50cyB0byBhIG5hdmlnYXRpb24gcHJvcGVydHkgd2l0aCBhIHRleHRBcnJhbmdlbWVudCBUZXh0T25seSwgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGNvbHVtbiB3aXRoIHRoZSB2YWx1ZSBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuXHRcdFx0XHQvLyBUaGUgdGV4dCBwcm9wZXJ0eSBpcyByZWZlcmVuY2VkIG9uIHRoZSByZWxhdGVkIHByb3BlcnRpZXMgb2YgdGhlIGxpbmVJdGVtLCBzbyB3aWxsIGJlIGNyZWF0ZWQgb24gdGhlIF9jcmVhdGVSZWxhdGVkQ29sdW1ucyBtZXRob2QuXG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdFx0Y3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seShcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0XHRcdFx0XHRyZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0YWRkaXRpb25hbFByb3BlcnR5TmFtZXMuZm9yRWFjaCgoYWRkaXRpb25hbFByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHQvLyBJbnRlbnRpb25hbCBvdmVyd3JpdGUgYXMgd2UgcmVxdWlyZSBvbmx5IG9uZSBuZXcgUHJvcGVydHlJbmZvIGZvciBhIHJlbGF0ZWQgUHJvcGVydHkuXG5cdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFthZGRpdGlvbmFsUHJvcGVydHlOYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllc1thZGRpdGlvbmFsUHJvcGVydHlOYW1lXTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdC8vIEdldCBjb2x1bW5zIGZyb20gdGhlIFByb3BlcnRpZXMgb2YgRW50aXR5VHlwZVxuXHRyZXR1cm4gZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlKFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0dGFibGVUeXBlLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG5cdCk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzIGZyb20gdGhlIG1hbmlmZXN0IGFuZCBjaGVja3MgYWdhaW5zdCBleGlzdGluZyBwcm9wZXJ0aWVzIGFscmVhZHkgYWRkZWQgYnkgYW5ub3RhdGlvbnMuXG4gKiBJZiBhIG5vdCB5ZXQgc3RvcmVkIHByb3BlcnR5IGlzIGZvdW5kIGl0IGFkZHMgaXQgZm9yIHNvcnRpbmcgYW5kIGZpbHRlcmluZyBvbmx5IHRvIHRoZSBhbm5vdGF0aW9uQ29sdW1ucy5cbiAqIEBwYXJhbSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgX2dldFByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnRpZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuXHRsZXQgbWF0Y2hlZFByb3BlcnRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXHRpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzKSkge1xuXHRcdG1hdGNoZWRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwcm9wZXJ0eVBhdGggJiYgYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLm5hbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRcdFx0XHR7IFtwcm9wZXJ0eVBhdGhdOiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCkgfSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0e31cblx0XHRcdFx0KTtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChyZWxhdGVkQ29sdW1uc1swXSk7XG5cdFx0XHRcdHJldHVybiByZWxhdGVkQ29sdW1uc1swXS5uYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBtYXRjaGVkUHJvcGVydGllcztcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZmllbGQgZ3JvdXAgaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBmaWVsZEdyb3VwIFRoZSBmaWVsZEdyb3VwIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZEdyb3VwIGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkRmllbGRHcm91cCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRmaWVsZEdyb3VwOiBGaWVsZEdyb3VwLFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0Y29uc3QgZmllbGRHcm91cERhdGEgPSBmaWVsZEdyb3VwLkRhdGE7XG5cdHJldHVybiBmaWVsZEdyb3VwRGF0YS5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0Ly8gd2UgZXhjbHVkZSBib29sZWFuIHR5cGUsIHRoZSBlbmQtdXNlciBtYXkgd2FudCB0byBrZWVwIHRoZSB1bmRlcmx5aW5nIGNoZWNrIGJveCBlbXB0eSBvbiBwdXJwb3NlXG5cdFx0aWYgKGlzRGF0YUZpZWxkKGl0ZW0pICYmIGl0ZW0/LlZhbHVlPy4kdGFyZ2V0LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIikge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0aXNTdGF0aWNhbGx5TWFuZGF0b3J5KGl0ZW0pIHx8XG5cdFx0XHRcdCh0YWJsZUNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShpdGVtLlZhbHVlLiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIHByb3BlcnR5IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24gPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YUZpZWxkRm9yQW5ub3RhdGlvbjogRGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdGNvbnN0IERhdGFGaWVsZEZvckFubm90YXRpb25GaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkgPSBoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbik7XG5cdC8vIENoZWNrIGlmIHRoZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50cyB0byBhIEZpZWxkR3JvdXBcblx0aWYgKGhhc0ZpZWxkR3JvdXBUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRpZiAoaXNSZXF1aXJlZEZpZWxkR3JvdXAoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkVGFyZ2V0IGFzIEZpZWxkR3JvdXAsIHRhYmxlQ3JlYXRpb25Nb2RlKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGNvbnN0IGZpZWxkR3JvdXBEYXRhID0gKGRhdGFGaWVsZFRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhO1xuXHRcdHJldHVybiBmaWVsZEdyb3VwRGF0YS5zb21lKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0cmV0dXJuIGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgaW5uZXJEYXRhRmllbGQsIHRhYmxlQ3JlYXRpb25Nb2RlKTtcblx0XHR9KTtcblx0fVxuXHQvKklmIHRoZSB1bmRlcmx5aW5nIGRhdGFwb2ludCBpcyBhIHJhdGluZyBpbmRpY2F0b3IsIHRoZSBlbmQtdXNlciBtYXkgd2FudCB0byBrZWVwIHRoZSByYXRpbmcgZW1wdHkgKHZhbHVlIDApIG9uIHB1cnBvc2UuXG5cdEJlc2lkZXMsIGN1cnJlbnRseSwgb25seSBhIGZpZWxkQ29udHJvbCBzZXQgb24gYSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgZGF0YVBvaW50IGhhcyBhbiBpbmZsdWVuY2UgaW4gdGhlIHRhYmxlLlxuXHRBY2NvcmRpbmdseSwgaWYgYSBkYXRhcG9pbnQgY29tZXMgZnJvbSBhIGRhdGFGaWVsZEZvckFubm90YXRpb24gd2l0aCBhIGZpZWxkQ29udHJvbCBzZXQgYXMgbm90IG1hbmRhdG9yeSwgdGhpcyBkYXRhUG9pbnQgbXVzdCBub3QgYmUgZmxhZ2dlZCBhcyBcInJlcXVpcmVkXCIqL1xuXHRpZiAoaGFzRGF0YVBvaW50VGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb24pICYmIChkYXRhRmllbGRUYXJnZXQgYXMgRGF0YVBvaW50KS5WaXN1YWxpemF0aW9uICE9PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1JhdGluZ1wiKSB7XG5cdFx0aWYgKERhdGFGaWVsZEZvckFubm90YXRpb25GaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGlzU3RhdGljYWxseU1hbmRhdG9yeShkYXRhRmllbGRGb3JBbm5vdGF0aW9uKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBpc1JlcXVpcmVkRGF0YVBvaW50KGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZFRhcmdldCBhcyBEYXRhUG9pbnQsIHRhYmxlQ3JlYXRpb25Nb2RlKTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHByb3BlcnR5IGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0cHJvcGVydHkudHlwZSAhPT0gXCJFZG0uQm9vbGVhblwiICYmXG5cdFx0IWlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdChpc1N0YXRpY2FsbHlNYW5kYXRvcnkocHJvcGVydHkpIHx8XG5cdFx0XHQodGFibGVDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KHByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpKVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhUG9pbnQgaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkYXRhUG9pbnQgVGhlIGRhdGFQb2ludCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YVBvaW50IGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkRGF0YVBvaW50ID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRhdGFQb2ludDogRGF0YVBvaW50LFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRpc1N0YXRpY2FsbHlNYW5kYXRvcnkoZGF0YVBvaW50KSB8fFxuXHRcdCh0YWJsZUNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KGRhdGFQb2ludC5WYWx1ZS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHVuZGVybHlpbmcgY29sdW1uIGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAncmVxdWlyZWQnIHByb3BlcnR5IG9mIHRoZSB0YWJsZSBjb2x1bW4uXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWRDb2x1bW4gPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFyZ2V0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHksXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IGNyZWF0aW9uTW9kZSA9IHRhYmxlQ3JlYXRpb25Nb2RlIHx8IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdGlmIChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0KSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoaXNQcm9wZXJ0eSh0YXJnZXQpKSB7XG5cdFx0cmV0dXJuIGlzUmVxdWlyZWRQcm9wZXJ0eShjb252ZXJ0ZXJDb250ZXh0LCB0YXJnZXQsIGNyZWF0aW9uTW9kZSkgPyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKSA6IHVuZGVmaW5lZDtcblx0fVxuXHQvLyBDaGVjayBpZiB0aGUgZGF0YUZpZWxkIGlzIG9mIHR5cGUgRGF0YUZpZWxkRm9yQW5ub3RhdGlvblxuXHRpZiAoaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uKHRhcmdldCkpIHtcblx0XHRyZXR1cm4gaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24oY29udmVydGVyQ29udGV4dCwgdGFyZ2V0LCBjcmVhdGlvbk1vZGUpID8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSkgOiB1bmRlZmluZWQ7XG5cdH1cblx0Ly9JZiB0aGUgdW5kZXJseWluZyBwcm9wZXJ0eSBpcyBhIGJvb2xlYW4sIHRoZSBlbmQtdXNlciBtYXkgd2FudCB0byBrZWVwIHRoZSBjaGVjayBib3ggZW1wdHkgb24gcHVycG9zZVxuXHRpZiAoaXNEYXRhRmllbGQodGFyZ2V0KSAmJiB0YXJnZXQuVmFsdWU/LiR0YXJnZXQ/LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIikge1xuXHRcdHJldHVybiBpc1N0YXRpY2FsbHlNYW5kYXRvcnkodGFyZ2V0KSB8fFxuXHRcdFx0KGNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkodGFyZ2V0LlZhbHVlLiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuXHRleHBvcnRQcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoZXhwb3J0UHJvcGVydGllcykpIHtcblx0XHRwcm9wZXJ0aWVzID0gZXhwb3J0UHJvcGVydGllcztcblx0fVxuXHRpZiAocHJvcGVydGllcykge1xuXHRcdHJldHVybiBwcm9wZXJ0aWVzXG5cdFx0XHQubWFwKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYHske3Byb3BlcnRpZXMhLmluZGV4T2YocHJvcGVydHkpfX1gO1xuXHRcdFx0fSlcblx0XHRcdC5qb2luKGAke1wiXFxuXCJ9YCk7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0YWJsZSBjb2x1bW4gZGVmaW5pdGlvbnMgZnJvbSBtYW5pZmVzdC5cbiAqXG4gKiBUaGVzZSBtYXkgYmUgY3VzdG9tIGNvbHVtbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QsIHNsb3QgY29sdW1ucyBjb21pbmcgdGhyb3VnaFxuICogYSBidWlsZGluZyBibG9jaywgb3IgYW5ub3RhdGlvbiBjb2x1bW5zIHRvIG92ZXJ3cml0ZSBhbm5vdGF0aW9uLWJhc2VkIGNvbHVtbnMuXG4gKiBAcGFyYW0gY29sdW1uc1xuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tTWFuaWZlc3QgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiB8IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlPixcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0Q29sdW1uPiB7XG5cdGNvbnN0IGludGVybmFsQ29sdW1uczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RDb2x1bW4+ID0ge307XG5cdGZ1bmN0aW9uIGlzQ29sdW1uT3ZlcnJpZGUoXG5cdFx0Y29sdW1uOiBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4gfCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSxcblx0XHRrZXk6IHN0cmluZ1xuXHQpOiBjb2x1bW4gaXMgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1ucy5zb21lKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmtleSA9PT0ga2V5KTtcblx0fVxuXHRmdW5jdGlvbiBpc1Nsb3RDb2x1bW4obWFuaWZlc3RDb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbik6IG1hbmlmZXN0Q29sdW1uIGlzIEZyYWdtZW50RGVmaW5lZFNsb3RDb2x1bW4ge1xuXHRcdHJldHVybiBtYW5pZmVzdENvbHVtbi50eXBlID09PSBDb2x1bW5UeXBlLlNsb3Q7XG5cdH1cblx0ZnVuY3Rpb24gaXNDdXN0b21Db2x1bW4obWFuaWZlc3RDb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbik6IG1hbmlmZXN0Q29sdW1uIGlzIE1hbmlmZXN0RGVmaW5lZEN1c3RvbUNvbHVtbiB7XG5cdFx0cmV0dXJuIG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IHVuZGVmaW5lZCAmJiAhIW1hbmlmZXN0Q29sdW1uLnRlbXBsYXRlO1xuXHR9XG5cdGZ1bmN0aW9uIF91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zKHByb3BlcnR5SW5mb3M6IHN0cmluZ1tdLCBhbm5vdGF0aW9uVGFibGVDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRwcm9wZXJ0eUluZm9zLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRhbm5vdGF0aW9uVGFibGVDb2x1bW5zLmZvckVhY2goKHByb3ApID0+IHtcblx0XHRcdFx0aWYgKHByb3AubmFtZSA9PT0gcHJvcGVydHkpIHtcblx0XHRcdFx0XHRwcm9wLnNvcnRhYmxlID0gIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocHJvcGVydHkucmVwbGFjZShcIlByb3BlcnR5OjpcIiwgXCJcIikpO1xuXHRcdFx0XHRcdHByb3AuaXNHcm91cGFibGUgPSBwcm9wLnNvcnRhYmxlO1xuXHRcdFx0XHRcdHByb3AuZmlsdGVyYWJsZSA9ICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocHJvcGVydHkucmVwbGFjZShcIlByb3BlcnR5OjpcIiwgXCJcIikpO1xuXHRcdFx0XHRcdHByb3AuaXNQYXJ0T2ZDdXN0b21Db2x1bW4gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXHRmb3IgKGNvbnN0IGtleSBpbiBjb2x1bW5zKSB7XG5cdFx0Y29uc3QgbWFuaWZlc3RDb2x1bW4gPSBjb2x1bW5zW2tleV07XG5cdFx0S2V5SGVscGVyLnZhbGlkYXRlS2V5KGtleSk7XG5cdFx0Ly8gQmFzZVRhYmxlQ29sdW1uXG5cdFx0Y29uc3QgYmFzZVRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcjogbWFuaWZlc3RDb2x1bW4ud2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXIsXG5cdFx0XHR3aWR0aDogbWFuaWZlc3RDb2x1bW4ud2lkdGggfHwgdW5kZWZpbmVkLFxuXHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0YW5jaG9yOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbj8uYW5jaG9yLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBQbGFjZW1lbnQuQWZ0ZXIgOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbi5wbGFjZW1lbnRcblx0XHRcdH0sXG5cdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dClcblx0XHR9O1xuXHRcdGlmIChpc0NvbHVtbk92ZXJyaWRlKG1hbmlmZXN0Q29sdW1uLCBrZXkpKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzVG9PdmVyd3JpdGVBbm5vdGF0aW9uQ29sdW1uOiBDdXN0b21FbGVtZW50PEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlPiA9IHtcblx0XHRcdFx0Li4uYmFzZVRhYmxlQ29sdW1uLFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBtYW5pZmVzdENvbHVtbj8uaW1wb3J0YW5jZSxcblx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBtYW5pZmVzdENvbHVtbj8uaG9yaXpvbnRhbEFsaWduLFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IG1hbmlmZXN0Q29sdW1uPy5hdmFpbGFiaWxpdHksXG5cdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuQW5ub3RhdGlvbixcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHVuZGVmaW5lZCxcblx0XHRcdFx0c2V0dGluZ3M6IG1hbmlmZXN0Q29sdW1uLnNldHRpbmdzLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiBfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZShtYW5pZmVzdENvbHVtbi5mb3JtYXRPcHRpb25zKSxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IG1hbmlmZXN0Q29sdW1uLmRpc2FibGVFeHBvcnRcblx0XHRcdFx0XHQ/IG51bGxcblx0XHRcdFx0XHQ6IGdldEN1c3RvbUV4cG9ydFNldHRpbmdzKFxuXHRcdFx0XHRcdFx0XHRtYW5pZmVzdENvbHVtbj8uZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdGtleVxuXHRcdFx0XHRcdCAgKVxuXHRcdFx0fTtcblx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0gcHJvcGVydGllc1RvT3ZlcndyaXRlQW5ub3RhdGlvbkNvbHVtbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlJbmZvczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBfZ2V0UHJvcGVydHlOYW1lcyhcblx0XHRcdFx0bWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdGVudGl0eVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCB0b29sdGlwVGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbChtYW5pZmVzdENvbHVtbi50b29sdGlwKSxcblx0XHRcdFx0aGVhZGVyVGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbChtYW5pZmVzdENvbHVtbi5oZWFkZXIpO1xuXG5cdFx0XHRjb25zdCBjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsID1cblx0XHRcdFx0cHJvcGVydHlJbmZvcyAmJiAhbWFuaWZlc3RDb2x1bW4uZGlzYWJsZUV4cG9ydFxuXHRcdFx0XHRcdD8gZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MoXG5cdFx0XHRcdFx0XHRcdG1hbmlmZXN0Q29sdW1uPy5leHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5SW5mb3Ncblx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHQ6IG51bGw7XG5cdFx0XHRjb25zdCBiYXNlTWFuaWZlc3RDb2x1bW4gPSB7XG5cdFx0XHRcdC4uLmJhc2VUYWJsZUNvbHVtbixcblx0XHRcdFx0aGVhZGVyOiBoZWFkZXJUZXh0LFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBtYW5pZmVzdENvbHVtbj8uaW1wb3J0YW5jZSB8fCBJbXBvcnRhbmNlLk5vbmUsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogbWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbiB8fCBIb3Jpem9udGFsQWxpZ24uQmVnaW4sXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogbWFuaWZlc3RDb2x1bW4/LmF2YWlsYWJpbGl0eSB8fCBcIkRlZmF1bHRcIixcblx0XHRcdFx0dGVtcGxhdGU6IG1hbmlmZXN0Q29sdW1uLnRlbXBsYXRlLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiBwcm9wZXJ0eUluZm9zLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdGlkOiBgQ3VzdG9tQ29sdW1uOjoke2tleX1gLFxuXHRcdFx0XHRuYW1lOiBgQ3VzdG9tQ29sdW1uOjoke2tleX1gLFxuXHRcdFx0XHQvL05lZWRlZCBmb3IgTURDOlxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB7IHRleHRMaW5lc0VkaXQ6IDQgfSxcblx0XHRcdFx0aXNHcm91cGFibGU6IGZhbHNlLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogZmFsc2UsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3M6IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9LFxuXHRcdFx0XHR0b29sdGlwOiB0b29sdGlwVGV4dCA/IHRvb2x0aXBUZXh0IDogaGVhZGVyVGV4dCxcblx0XHRcdFx0cHJvcGVydGllczogbWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdFx0cmVxdWlyZWQ6XG5cdFx0XHRcdFx0bWFuaWZlc3RDb2x1bW4ucmVxdWlyZWQgJiZcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0XHRcdFx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSlcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdFx0aWYgKHByb3BlcnR5SW5mb3MpIHtcblx0XHRcdFx0X3VwZGF0ZUxpbmtlZFByb3BlcnRpZXNPbkN1c3RvbUNvbHVtbnMocHJvcGVydHlJbmZvcywgYW5ub3RhdGlvbkNvbHVtbnMpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlzU2xvdENvbHVtbihtYW5pZmVzdENvbHVtbikpIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tVGFibGVDb2x1bW46IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbj4gPSB7XG5cdFx0XHRcdFx0Li4uYmFzZU1hbmlmZXN0Q29sdW1uLFxuXHRcdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuU2xvdFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IGN1c3RvbVRhYmxlQ29sdW1uO1xuXHRcdFx0fSBlbHNlIGlmIChpc0N1c3RvbUNvbHVtbihtYW5pZmVzdENvbHVtbikpIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tVGFibGVDb2x1bW46IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbj4gPSB7XG5cdFx0XHRcdFx0Li4uYmFzZU1hbmlmZXN0Q29sdW1uLFxuXHRcdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuRGVmYXVsdFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IGN1c3RvbVRhYmxlQ29sdW1uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZSA9IGBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gJyR7a2V5fScgcmVmZXJlbmNlZCBpbiB0aGUgbWFuaWZlc3QgaXMgbm90IGZvdW5kYDtcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdFx0LmFkZElzc3VlKFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5NYW5pZmVzdCxcblx0XHRcdFx0XHRcdElzc3VlU2V2ZXJpdHkuTG93LFxuXHRcdFx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGU/LkFubm90YXRpb25Db2x1bW5zPy5JbnZhbGlkS2V5XG5cdFx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGludGVybmFsQ29sdW1ucztcbn07XG5cbi8qKlxuICogQWRkcyBjb21wdXRlZCBjb2x1bW5zIHN1Y2ggYXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgc2l0dWF0aW9ucyBzdGF0dXMuXG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSB0YWJsZSBjb2x1bW5zIGNvbGxlY3RlZCBzbyBmYXJcbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBlbnJpY2hlZCBzZXQgb2YgdGFibGUgY29sdW1uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQ29tcHV0ZWRDb2x1bW5zKFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRpZiAoIVtcIkdyaWRUYWJsZVwiLCBcIlRyZWVUYWJsZVwiLCBcIkFuYWx5dGljYWxUYWJsZVwiXS5pbmNsdWRlcyh0YWJsZVR5cGUpKSB7XG5cdFx0Ly8gQ29tcHV0ZWQgY29sdW1ucyBhcmUgbm90IHVzZWQgaW4gUmVzcG9uc2l2ZSB0YWJsZXNcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zO1xuXHR9XG5cblx0Ly8gSW4gY2FzZSBhIGdyaWQgdGFibGUgb3IgdHJlZSB0YWJsZSBpcyB1c2VkLCB3ZSBkaXNwbGF5IHRoZSBzaXR1YXRpb25zIGluZGljYXRvciBpbiBhIHNlcGFyYXRlIGNvbHVtblxuXHQvLyBzbyB3ZSBoYXZlIHRvIGRpc2FibGUgaXQgaGVyZSB0byBlbnN1cmUsIHRoYXQgdGhlIGZpZWxkIGJ1aWxkaW5nIGJsb2NrXG5cdC8vIGRvZXMgbm90IHJlbmRlciBpdCBpbnRvIHRoZSBJRCBjb2x1bW5cblx0Y29uc3QgY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3I6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkID0gdGFibGVDb2x1bW5zLmZpbmQoXG5cdFx0KGNvbHVtbikgPT4gY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uZm9ybWF0T3B0aW9ucz8uaGFzU2l0dWF0aW9uc0luZGljYXRvciA9PT0gdHJ1ZVxuXHQpO1xuXHRpZiAoY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3I/LmZvcm1hdE9wdGlvbnMpIHtcblx0XHQvLyBTd2l0Y2ggb2ZmIHRoZSBzaXR1YXRpb25zIGluZGljYXRvciBpbiB0aGUgZm91bmQgY29sdW1uXG5cdFx0Y29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3IuZm9ybWF0T3B0aW9ucy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yID0gZmFsc2U7XG5cblx0XHQvLyBJbnNlcnQgYSBzZXBhcmF0ZSBzaXR1YXRpb25zIGluZGljYXRvciBjb2x1bW5cblx0XHRjb25zdCBzaXR1YXRpb25zSW5kaWNhdG9yQ29sdW1uOiBDb21wdXRlZFRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBcInNpdHVhdGlvbnNJbmRpY2F0b3JcIixcblx0XHRcdG5hbWU6IFwic2l0dWF0aW9uc0luZGljYXRvclwiLFxuXHRcdFx0cHJvcGVydHlLZXk6IGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yLm5hbWUsXG5cdFx0XHRpc1NpdHVhdGlvbnNJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IFwiRGVmYXVsdFwiLFxuXHRcdFx0bGFiZWw6IFwie3NhcC5mZS5pMThuPkNfU0lUVUFUSU9OU19TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0b29sdGlwOiBcIntzYXAuZmUuaTE4bj5DX1NJVFVBVElPTlNfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Db21wdXRlZCxcblx0XHRcdGZvcm1hdE9wdGlvbnM6IG51bGwsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNsaXBib2FyZFNldHRpbmdzOiBudWxsLFxuXHRcdFx0cHJvcGVydHlJbmZvczogdW5kZWZpbmVkLFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmFsc2Vcblx0XHR9O1xuXG5cdFx0Ly8gUGxhY2UgdGhlIGRyYWZ0IHN0YXR1cyBjb2x1bW4gYWZ0ZXIgdGhlIGZpcnN0IHZpc2libGUgY29sdW1uXG5cdFx0Y29uc3QgaW5kZXhPZkZpcnN0VmlzaWJsZUNvbHVtbjogaW50ID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKTtcblx0XHR0YWJsZUNvbHVtbnMuc3BsaWNlKGluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW4gKyAxLCAwLCBzaXR1YXRpb25zSW5kaWNhdG9yQ29sdW1uKTtcblx0fVxuXG5cdC8vIEluIGNhc2UgYSBncmlkIHRhYmxlIG9yIHRyZWUgdGFibGUgaXMgdXNlZCwgd2UgZGlzcGxheSB0aGUgZHJhZnQgaW5kaWNhdG9yIGluIGEgc2VwYXJhdGUgY29sdW1uXG5cdC8vIHNvIHdlIGhhdmUgdG8gZGlzYWJsZSBpdCBoZXJlIHRvIGVuc3VyZSwgdGhhdCB0aGUgZmllbGQgYnVpbGRpbmcgYmxvY2tcblx0Ly8gZG9lcyBub3QgcmVuZGVyIGl0IGludG8gdGhlIElEIGNvbHVtblxuXHQvLyBUaGUgYWRkaXRpb25hbCBjb2x1bW4gaXMgb25seSBhZGRlZCBmb3IgdGFibGVzIG9uIGEgTFIgYW5kIGluIGNhc2UgdGVoZSBlbnRpdHkgaXMgZHJhZnQgZW5hYmxlZCFcblx0Y29uc3QgY29sdW1uc1dpdGhEcmFmdEluZGljYXRvcjogVGFibGVDb2x1bW5bXSA9IHRhYmxlQ29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc0RyYWZ0SW5kaWNhdG9yID09PSB0cnVlKTtcblx0aWYgKFxuXHRcdGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3IubGVuZ3RoICYmXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgJiZcblx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdE5vZGUoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkgfHwgTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkpXG5cdCkge1xuXHRcdC8vIFN3aXRjaCBvZmYgdGhlIGRyYWZ0IGluZGljYXRvciBpbiB0aGUgZm91bmQgY29sdW1uXG5cdFx0Y29sdW1uc1dpdGhEcmFmdEluZGljYXRvci5mb3JFYWNoKChjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3I6IFRhYmxlQ29sdW1uKSA9PiB7XG5cdFx0XHRpZiAoY29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yPy5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdGNvbHVtbldpdGhEcmFmdEluZGljYXRvci5mb3JtYXRPcHRpb25zLmhhc0RyYWZ0SW5kaWNhdG9yID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBJbnNlcnQgYSBzZXBhcmF0ZSBkcmFmdCBpbmRpY2F0b3IgY29sdW1uXG5cdFx0Y29uc3QgZHJhZnRJbmRpY2F0b3JDb2x1bW46IENvbXB1dGVkVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRrZXk6IFwiZHJhZnRTdGF0dXNcIixcblx0XHRcdG5hbWU6IFwiZHJhZnRTdGF0dXNcIixcblx0XHRcdHByb3BlcnR5S2V5OiBjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yWzBdLm5hbWUsXG5cdFx0XHRpc0RyYWZ0SW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBcIkRlZmF1bHRcIixcblx0XHRcdGxhYmVsOiBcIntzYXAuZmUuaTE4bj5DX0RSQUZUX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHRvb2x0aXA6IFwie3NhcC5mZS5pMThuPkNfRFJBRlRfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Db21wdXRlZCxcblx0XHRcdGZvcm1hdE9wdGlvbnM6IG51bGwsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuXHRcdFx0Y2xpcGJvYXJkU2V0dGluZ3M6IG51bGxcblx0XHR9O1xuXHRcdGxldCBjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXI6IGludCA9IDA7XG5cdFx0aWYgKGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGEgc2l0dWF0aW9ucyBpbmRpY2F0b3IgY29sdW1uLCBwbGFjZSB0aGUgZHJhZnQgc3RhdHVzIGNvbHVtbiBiZWZvcmUgaXRcblx0XHRcdGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciA9XG5cdFx0XHRcdHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gKGNvbHVtbiBhcyBDb21wdXRlZFRhYmxlQ29sdW1uKS5pc1NpdHVhdGlvbnNJbmRpY2F0b3IgPT09IHRydWUpIC0gMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXJ3aXNlIHBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGFmdGVyIHRoZSBmaXJzdCB2aXNpYmxlIGNvbHVtblxuXHRcdFx0Y29sdW1uSW5kZXhUb0luc2VydEFmdGVyID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKTtcblx0XHR9XG5cdFx0dGFibGVDb2x1bW5zLnNwbGljZShjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIgKyAxLCAwLCBkcmFmdEluZGljYXRvckNvbHVtbik7XG5cdH1cblxuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCAgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSByZXN0cmljdGVkIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBQcm9wZXJ0eVBhdGhbXSB7XG5cdHJldHVybiBnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbihcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHQoY2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gKGNhcGFiaWxpdGllcyBhcyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQpPy5JbnNlcnRSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcztcblx0XHR9LFxuXHRcdGZhbHNlXG5cdCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvcGVydHkgaXMgYW5ub3RhdGVkIGFzIGEgcmVxdWlyZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkXG4gKi9cbmZ1bmN0aW9uIGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0Lm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHQuaW5jbHVkZXMobmFtZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSB0eXBlIG9mIGEgY29sdW1uIGZvciB0aGUgZXhwb3J0LlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgYSBwcm9wZXJ0eSwgY29sdW1uXG4gKiBAcGFyYW0gaXNBVGltZXpvbmUgSXMgdGhlIGdpdmVuIHByb3BlcnR5IGEgdGltZXpvbmVcbiAqIEBwYXJhbSBpc0N1cnJlbmN5IElzIHRoZSBnaXZlbiBwcm9wZXJ0eSBhIGN1cnJlbmN5XG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGFscmVhZHkgZGV0ZWN0ZWQgZXhwb3J0IHNldHRpbmdzIGZyb20gZGF0YWZpZWxkc1xuICogQHJldHVybnMgVGhlIHN1cHBvcnRlZCBleHBvcnQgdHlwZVxuICovXG5mdW5jdGlvbiBnZXRFeHBvcnREYXRhVHlwZShcblx0ZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0aXNBVGltZXpvbmUgPSBmYWxzZSxcblx0aXNDdXJyZW5jeSA9IGZhbHNlLFxuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzXG4pOiBzdHJpbmcge1xuXHRsZXQgZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRpZiAoIWRhdGFUeXBlIHx8IGV4cG9ydFNldHRpbmdzPy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdHJldHVybiBleHBvcnREYXRhVHlwZTtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LmlzQ3VycmVuY3kgfHwgaXNDdXJyZW5jeSkge1xuXHRcdHJldHVybiBcIkN1cnJlbmN5XCI7XG5cdH1cblx0aWYgKGlzQVRpbWV6b25lKSB7XG5cdFx0cmV0dXJuIFwiVGltZXpvbmVcIjtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LndyYXApIHtcblx0XHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG5cdH1cblx0c3dpdGNoIChkYXRhVHlwZSkge1xuXHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdGNhc2UgXCJFZG0uSW50MzJcIjpcblx0XHRjYXNlIFwiRWRtLkludDY0XCI6XG5cdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRjYXNlIFwiRWRtLkJ5dGVcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJOdW1iZXJcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZU9mVGltZVwiOlxuXHRcdGNhc2UgXCJFZG0uRGF0ZVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5UaW1lT2ZEYXlcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHR9XG5cdHJldHVybiBleHBvcnREYXRhVHlwZTtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSB0b29sdGlwIGNvbmZpZ3VyYXRpb24gZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIG9uIHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBiZSB1cGRhdGVkXG4gKi9cbmZ1bmN0aW9uIF9hZGRUb29sVGlwKHByb3BlcnR5OiBQcm9wZXJ0eSwgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4pOiB2b2lkIHtcblx0Y29uc3QgdG9vbHRpcCA9IF9nZXRUb29sdGlwKHByb3BlcnR5KSA/PyBjb2x1bW4ubGFiZWw7XG5cdGlmICh0b29sdGlwKSB7XG5cdFx0Y29sdW1uLnRvb2x0aXAgPSB0b29sdGlwO1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMoXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXMgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwgcmVsYXRpdmVQYXRoKS5uYXZpZ2F0aW9uUHJvcGVydGllcztcblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goKG5hdlByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMucHVzaChnZXRMYWJlbChuYXZQcm9wZXJ0eSkgfHwgbmF2UHJvcGVydHkubmFtZSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscztcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm9wZXJ0eSB1c2luZyB0aGUgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uIHNldCB0byB0ZXh0IG9ubHkuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBjb3JyZXNwb25kaW5nIERhdGFNb2RlbE9iamVjdFBhdGguXG4gKiBAcGFyYW0gbGluZUl0ZW0gVGhlIGNvbHVtbiB0byBiZSBldmFsdWF0ZWQuXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dC5cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXM+LFxuXHRsaW5lSXRlbTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuKTogdm9pZCB7XG5cdGNvbnN0IGlzUHJvcGVydHlOYXZpZ2F0ZWQgPVxuXHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggIT09IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aDtcblx0aWYgKGlzUHJvcGVydHlOYXZpZ2F0ZWQgJiYgaXNEYXRhRmllbGQobGluZUl0ZW0pKSB7XG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0aXZlUGF0aF0gPSBsaW5lSXRlbS5WYWx1ZS4kdGFyZ2V0O1xuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChyZWxhdGl2ZVBhdGgpO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihsaW5lSXRlbSkgJiYgaGFzRmllbGRHcm91cFRhcmdldChsaW5lSXRlbSkpIHtcblx0XHQobGluZUl0ZW0uVGFyZ2V0LiR0YXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuXHRcdFx0aWYgKGlzRGF0YUZpZWxkKGZpZWxkKSAmJiBnZXREaXNwbGF5TW9kZShmaWVsZC5WYWx1ZS4kdGFyZ2V0KSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdGNvbnN0IGluaGVyZWRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHRcdFx0XHRmaWVsZC5WYWx1ZS5wYXRoXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGlzSW5oZXJlZFByb3BlcnR5TmF2aWdhdGVkID1cblx0XHRcdFx0XHRpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAhPT1cblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGg7XG5cdFx0XHRcdGlmIChpc0luaGVyZWRQcm9wZXJ0eU5hdmlnYXRlZCkge1xuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtmaWVsZC5WYWx1ZS5wYXRoXSA9IGZpZWxkLlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKGZpZWxkLlZhbHVlLnBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnR5IHR5cGUgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcHJvcGVydHkgb3IgZGF0YSB0eXBlLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBvciBkYXRhIGZpZWxkIHRvIGRldGVybWluZSB0aGUgdHlwZSBjb25maWd1cmF0aW9uIGZvci5cbiAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgZGF0YSB0eXBlIHRvIHVzZSBmb3IgdHlwZSBjb25maWd1cmF0aW9uIGlmIG5vdCBkZXRlcm1pbmVkIGZyb20gdGhlIHByb3BlcnR5LlxuICogQHJldHVybnMgVGhlIHByb3BlcnR5IHR5cGUgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQ29uZmlnKHByb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWQsIGRhdGFUeXBlPzogc3RyaW5nKTogUHJvcGVydHlUeXBlQ29uZmlnIHtcblx0bGV0IHRhcmdldE1hcHBpbmcsXG5cdFx0Zm9ybWF0T3B0aW9uczogUHJvcGVydHlUeXBlRm9ybWF0T3B0aW9ucyB8IHVuZGVmaW5lZCA9IHt9O1xuXHRpZiAoaXNQcm9wZXJ0eShwcm9wZXJ0eSkpIHtcblx0XHR0YXJnZXRNYXBwaW5nID0gaXNUeXBlRGVmaW5pdGlvbihwcm9wZXJ0eS50YXJnZXRUeXBlKVxuXHRcdFx0PyBFRE1fVFlQRV9NQVBQSU5HW3Byb3BlcnR5LnRhcmdldFR5cGUudW5kZXJseWluZ1R5cGVdXG5cdFx0XHQ6IEVETV9UWVBFX01BUFBJTkdbcHJvcGVydHkudHlwZV07XG5cdH1cblx0aWYgKCF0YXJnZXRNYXBwaW5nICYmIGRhdGFUeXBlICE9PSB1bmRlZmluZWQpIHtcblx0XHR0YXJnZXRNYXBwaW5nID0gRURNX1RZUEVfTUFQUElOR1tkYXRhVHlwZV07XG5cdH1cblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgPSB7XG5cdFx0dHlwZTogdGFyZ2V0TWFwcGluZz8udHlwZVxuXHR9O1xuXHRpZiAodGFyZ2V0TWFwcGluZyAmJiBpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdGNvbnN0IGNvbnN0cmFpbnRzID0gc2V0VXBDb25zdHJhaW50cyh0YXJnZXRNYXBwaW5nLCBwcm9wZXJ0eSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKGNvbnN0cmFpbnRzKS5sZW5ndGgpIHtcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuXHRcdH1cblx0fVxuXHRpZiAocHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgIT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyZWFtXCIpIHtcblx0XHRpZiAoXG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdCkge1xuXHRcdFx0Zm9ybWF0T3B0aW9ucyA9IHsgcGFyc2VBc1N0cmluZzogZmFsc2UsIGVtcHR5U3RyaW5nOiBcIlwiIH07XG5cdFx0fVxuXHRcdGlmIChwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiAmJiBwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHM/Lm51bGxhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0Zm9ybWF0T3B0aW9ucyA9IHsgcGFyc2VLZWVwc0VtcHR5U3RyaW5nOiB0cnVlIH07XG5cdFx0fVxuXHR9XG5cdGlmIChPYmplY3Qua2V5cyhmb3JtYXRPcHRpb25zKS5sZW5ndGgpIHtcblx0XHRwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyA9IGZvcm1hdE9wdGlvbnM7XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VHlwZUNvbmZpZztcbn1cblxuLyoqXG4gKiBBZGQgYSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSB0byB0aGUgbGlzdCBvZiBkZXNjcmlwdGlvbiBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGNvbHVtbnMgb2YgYSB0YWJsZS5cbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBsaXN0IG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyB0ZXh0IG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgbGlua2VkIHRvIHRoZSBjb2x1bW4gKG5hbWVkIGFsc28gY29tcGxleCBwcm9wZXJ0eSlcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydHlOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIGJlIGFkZGVkXG4gKi9cbmZ1bmN0aW9uIGFkZFByb3BlcnR5VG9EaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwKFxuXHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4sXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0cmVsYXRlZFByb3BlcnR5TmFtZTogc3RyaW5nXG4pOiB2b2lkIHtcblx0aWYgKFxuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uICYmXG5cdFx0IWRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbcmVsYXRlZFByb3BlcnR5TmFtZV1cblx0KSB7XG5cdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcFtyZWxhdGVkUHJvcGVydHlOYW1lXSA9XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiE7XG5cdH1cbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0aWVzIG9mIGEgTGluZUl0ZW0gaW4gY2FzZSB0aGUgTGluZUl0ZW0gaXMgYW5ub3RhdGVkIGFzIGhpZGRlbi5cbiAqIEBwYXJhbSBleGlzdGluZ0NvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZyb20gTGluZUl0ZW1zIGFuZCBmcm9tIHByb3BlcnRpZXMgb2YgZW50aXR5VHlwZVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIGV2YWx1YXRlZFxuICogQHBhcmFtIGNvbHVtbiBUaGUgZ2l2ZW4gY29sdW1uIGZyb20gbGluZUl0ZW0gb3IgcHJvcGVydHkgb2YgZW50aXR5U2V0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sIG5hbWU6IHN0cmluZywgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4pOiB2b2lkIHtcblx0Y29uc3QgcmVsYXRlZEFubm90YXRpb25Db2x1bW5zID0gZXhpc3RpbmdDb2x1bW5zLmZpbHRlcihcblx0XHQoZXhpc3RpbmdDb2x1bW4pID0+XG5cdFx0XHQoZXhpc3RpbmdDb2x1bW4ucHJvcGVydHlJbmZvcz8uaW5jbHVkZXMobmFtZSkgJiYgZXhpc3RpbmdDb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbSkgfHxcblx0XHRcdChleGlzdGluZ0NvbHVtbi5pc1BhcnRPZkxpbmVJdGVtICYmIGV4aXN0aW5nQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gY29sdW1uLnJlbGF0aXZlUGF0aClcblx0KTtcblx0Y29sdW1uLmlzUGFydE9mTGluZUl0ZW0gPSAhIXJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucy5sZW5ndGg7XG5cdGlmIChcblx0XHRyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMubGVuZ3RoICYmXG5cdFx0IXJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucz8uc29tZSgoYW5ub3RhdGlvbkNvbHVtbikgPT4gYW5ub3RhdGlvbkNvbHVtbi5hdmFpbGFiaWxpdHkgIT09IFwiSGlkZGVuXCIpXG5cdCkge1xuXHRcdGNvbHVtbi5zb3J0YWJsZSA9IGZhbHNlO1xuXHRcdGNvbHVtbi5pc0dyb3VwYWJsZSA9IGZhbHNlO1xuXHRcdGNvbHVtbi5maWx0ZXJhYmxlID0gZmFsc2U7XG5cdH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBleHBvcnQgc2V0dGluZ3MgcHJvcGVydGllcyBvZiBhIG1hbmlmZXN0IGNvbHVtbi5cbiAqIEBwYXJhbSBleHBvcnRTZXR0aW5ncyBUaGUgY3VzdG9taXplZC9vdmVyd3JpdHRlbiBleHBvcnQgc2V0dGluZ3Mgb2YgYSBtYW5pZmVzdCBjb2x1bW5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZnJvbSBMaW5lSXRlbXNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZVxuICogQHBhcmFtIHByb3BlcnR5SW5mb3MgVGhlIHByb3BlcnRpZXMgbGlua2VkIHRvIGEgY29tcGxleCBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW5LZXkgVGhlIGNvbHVtbiBrZXkgb2YgdGhlIGNvbHVtbiB0byBiZSBvdmVyd3JpdHRlblxuICogQHJldHVybnMgVGhlIGV4cG9ydCBzZXR0aW5ncyBvZiB0aGUgY29sdW1uIG1lcmdpbmcgY3VzdG9taXplZCBleHBvcnQgc2V0dGluZ3Mgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZXMgZGV0ZWN0ZWQgb24gdGhlIGFubm90YXRpb24gY29sdW1uXG4gKi9cbmZ1bmN0aW9uIGdldEN1c3RvbUV4cG9ydFNldHRpbmdzKFxuXHRleHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCB1bmRlZmluZWQsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW10sXG5cdGNvbHVtbktleT86IHN0cmluZ1xuKTogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsIHtcblx0bGV0IGNvbHVtbkZyb21Bbm5vdGF0aW9ucztcblx0aWYgKGNvbHVtbktleSkge1xuXHRcdGNvbHVtbkZyb21Bbm5vdGF0aW9ucyA9IGFubm90YXRpb25Db2x1bW5zLmZpbmQoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4ua2V5ID09PSBjb2x1bW5LZXkpO1xuXHRcdGlmIChjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncztcblx0XHR9XG5cdH1cblx0Y29uc3QgZW5hYmxlV3JhcHBpbmcgPVxuXHRcdGV4cG9ydFNldHRpbmdzPy53cmFwID8/XG5cdFx0KCEhKGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eSAmJiBleHBvcnRTZXR0aW5ncy5wcm9wZXJ0eT8ubGVuZ3RoID4gMSkgfHwgISEocHJvcGVydHlJbmZvcyAmJiBwcm9wZXJ0eUluZm9zLmxlbmd0aCA+IDEpKTtcblxuXHRjb25zdCBjdXN0b21FeHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSB7XG5cdFx0Li4uY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncyxcblx0XHR0eXBlOiBleHBvcnRTZXR0aW5ncz8udHlwZSA/PyBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzPy50eXBlLFxuXHRcdHRlbXBsYXRlOlxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlID8/XG5cdFx0XHRfYXBwZW5kQ3VzdG9tVGVtcGxhdGUocHJvcGVydHlJbmZvcywgZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5KSA/P1xuXHRcdFx0Y29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGUsXG5cdFx0cHJvcGVydHk6IGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eSxcblx0XHR3aWR0aDogZXhwb3J0U2V0dGluZ3M/LndpZHRoLFxuXHRcdHdyYXA6IGVuYWJsZVdyYXBwaW5nLFxuXHRcdGxhYmVsOiBleHBvcnRTZXR0aW5ncz8ubGFiZWwsXG5cdFx0dGV4dEFsaWduOiBleHBvcnRTZXR0aW5ncz8udGV4dEFsaWduLFxuXHRcdHRydWVWYWx1ZTogZXhwb3J0U2V0dGluZ3M/LnRydWVWYWx1ZSxcblx0XHRmYWxzZVZhbHVlOiBleHBvcnRTZXR0aW5ncz8uZmFsc2VWYWx1ZSxcblx0XHR2YWx1ZU1hcDogZXhwb3J0U2V0dGluZ3M/LnZhbHVlTWFwXG5cdH07XG5cdHJldHVybiByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MoY3VzdG9tRXhwb3J0U2V0dGluZ3MpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1HQTtFQU1BO0VBS0E7RUFJQTtFQWVBO0VBOEJBO0VBc0NBO0VBQUEsSUEwQ1lBLFVBQVUsMEJBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUNBO0lBRFZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQUEsT0FBVkEsVUFBVTtFQUFBO0VBTXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVJBQyxRQUFBLENBQUFELFVBQUEsR0FBQUEsVUFBQTtFQVNPLFNBQVNFLGVBQWVBLENBQzlCQyxrQkFBNEIsRUFDNUJDLFNBQW9CLEVBQ3BCQyxpQkFBeUIsRUFDekJDLGdCQUF5RCxFQUN6QztJQUNoQixNQUFNQyxpQkFBaUIsR0FBR0MseUJBQXlCLENBQUNMLGtCQUFrQixFQUFFQyxTQUFTLEVBQUVDLGlCQUFpQixFQUFFQyxnQkFBZ0IsQ0FBQztJQUN2SCxNQUFNRyxlQUFl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
1776
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwiX2V4cG9ydHMiLCJnZXRUYWJsZUNvbHVtbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ0YWJsZVR5cGUiLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImNvbHVtbnMiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwid2lkdGgiLCJPdmVycmlkZVR5cGUiLCJvdmVyd3JpdGUiLCJ3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImltcG9ydGFuY2UiLCJob3Jpem9udGFsQWxpZ24iLCJhdmFpbGFiaWxpdHkiLCJpc05hdmlnYWJsZSIsInNldHRpbmdzIiwiZm9ybWF0T3B0aW9ucyIsImV4cG9ydFNldHRpbmdzIiwiYWRkQ29tcHV0ZWRDb2x1bW5zIiwiZmluZENvbHVtbkJ5UGF0aCIsInBhdGgiLCJmaW5kIiwiY29sdW1uIiwiYW5ub3RhdGlvbkNvbHVtbiIsInByb3BlcnR5SW5mb3MiLCJ1bmRlZmluZWQiLCJyZWxhdGl2ZVBhdGgiLCJ1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JFYWNoIiwib0NvbHVtbiIsInRhYmxlQ29sdW1uIiwicHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJwcm9wZXJ0eSIsInRhcmdldE9iamVjdCIsImFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5IiwidGltZXpvbmVQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5IiwidGltZXpvbmUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRpbWV6b25lIiwib1RpbWV6b25lQ29sdW1uIiwibmFtZSIsInRpbWV6b25lVGV4dCIsInRvU3RyaW5nIiwiYWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ1bml0Q29sdW1uIiwidW5pdCIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidW5pdFRleHQiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGFyZ2V0RW50aXR5VHlwZSIsInRleHRQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCIsInRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJ0ZXh0UmVsYXRpdmVQYXRoIiwidGV4dENvbHVtbiIsInRleHRBcnJhbmdlbWVudCIsInRleHRQcm9wZXJ0eSIsIm1vZGUiLCJ0eXBlIiwiZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlIiwiY29sdW1uc1RvQmVDcmVhdGVkIiwiZW50aXR5VHlwZSIsInRhYmxlQ3JlYXRpb25Nb2RlIiwiZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCIsInJlc3RyaWN0aW9uc09uUHJvcGVydGllcyIsInByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZCIsImFnZ3JlZ2F0aW9uSGVscGVyIiwiQWdncmVnYXRpb25IZWxwZXIiLCJncm91cGFibGVQcm9wZXJ0aWVzIiwiZ2V0R3JvdXBhYmxlUHJvcGVydGllcyIsImlzQW5hbHl0aWNzU3VwcG9ydGVkIiwibWFwIiwiJHRhcmdldCIsImZpbHRlciIsInRhcmdldCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkiLCJ0ZXh0UHJvcCIsImlzUHJvcGVydHlHcm91cGFibGUiLCJwcm9wIiwiZW50aXR5UHJvcGVydGllcyIsImV4aXN0cyIsInNvbWUiLCJ0YXJnZXRUeXBlIiwiaW5jbHVkZXMiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsIk9iamVjdCIsImtleXMiLCJwcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnR5TmFtZXMiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImFkZFByb3BlcnR5VG9EaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIiwiY29sdW1uSW5mbyIsImdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibGVuZ3RoIiwiZGF0YVBvaW50VGFyZ2V0VmFsdWUiLCJleHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImFubm90YXRpb25Qcm9wZXJ0eSIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwiYWRkaXRpb25hbFByb3BlcnR5TmFtZSIsInB1c2giLCJub25Tb3J0YWJsZVByb3BlcnRpZXMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsIlRleHQiLCJyZWxhdGVkQ29sdW1ucyIsIl9jcmVhdGVSZWxhdGVkQ29sdW1ucyIsImNvbmNhdCIsImZ1bGxQcm9wZXJ0eVBhdGgiLCJ1c2VEYXRhRmllbGRQcmVmaXgiLCJhdmFpbGFibGVGb3JBZGFwdGF0aW9uIiwicmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSIsInNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgiLCJnZXRTZW1hbnRpY09iamVjdFBhdGgiLCJpc0hpZGRlbiIsImlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJsYWJlbCIsImdldExhYmVsIiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24iLCJzb3J0YWJsZSIsImlzQW5hbHl0aWNhbFRhYmxlIiwiZmlsdGVyYWJsZSIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZ3JvdXBhYmxlIiwidHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsImNvbnN0cmFpbnRzIiwiX2lzRXhwb3J0YWJsZUNvbHVtbiIsImNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzIiwiY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzIiwiX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyIsImtleSIsInJlcGxhY2VTcGVjaWFsQ2hhcnMiLCJBbm5vdGF0aW9uIiwiZ3JvdXBMYWJlbCIsImdyb3VwIiwiYW5ub3RhdGlvblBhdGgiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJpc0dyb3VwYWJsZSIsImlzS2V5IiwiY2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImdldEltcG9ydGFuY2UiLCJVSSIsIkRhdGFGaWVsZERlZmF1bHQiLCJyZXF1aXJlZCIsImlzUmVxdWlyZWRDb2x1bW4iLCJhZGRpdGlvbmFsTGFiZWxzIiwiX2FkZFRvb2xUaXAiLCJfc2V0RXhwb3J0U2V0dGluZ3NGb3JEYXRhUG9pbnQiLCJzZXRUZWNobmljYWxFeHRlbnNpb24iLCJpc0RyYWZ0U3VwcG9ydGVkIiwiTW9kZWxIZWxwZXIiLCJpc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZCIsImRyYWZ0UHJvcGVydGllcyIsImlzRHJhZnRQcm9wZXJ0eSIsImlzR3JvdXBhYmxlUHJvcGVydHkiLCJleHRlbnNpb24iLCJ0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZSIsInRlY2huaWNhbGx5R3JvdXBhYmxlIiwidW5pdFByb3BlcnR5IiwidXRjIiwiaXNBVGltZXpvbmUiLCJjdXJyZW5jeVByb3BlcnR5Iiwic2NhbGUiLCJpc0Nvbm5lY3RlZEZpZWxkcyIsImlzQW5ub3RhdGlvbk9mVHlwZSIsImlzQW5ub3RhdGlvbk9mVGVybSIsIlRhcmdldCIsImlzUHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRTdGF0aWNVbml0T3JDdXJyZW5jeSIsImdldFN0YXRpY1RpbWV6b25lIiwiaXNUaW1lem9uZSIsImV4cG9ydFR5cGUiLCJnZXRFeHBvcnREYXRhVHlwZSIsImlucHV0Rm9ybWF0IiwiZ2V0RGF0ZUlucHV0Rm9ybWF0IiwiZGVsaW1pdGVyIiwiZ2V0RGVsaW1pdGVyIiwidGVtcGxhdGUiLCJ3cmFwIiwiYXV0b1NjYWxlIiwicmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzIiwic2V0dGluZyIsInNvdXJjZSIsInByb3BlcnR5VHlwZSIsImRhdGFGaWVsZERlZmF1bHRQcm9wZXJ0eSIsIiRUeXBlIiwiVmFsdWUiLCJDb3JlIiwiTWVkaWFUeXBlIiwidGVybSIsImlzVVJMIiwiX2lzVmFsaWRDb2x1bW4iLCJkYXRhRmllbGQiLCJJbmxpbmUiLCJfZ2V0VmlzaWJsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRNb2RlbFBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCIsImNvbnN0YW50IiwiaXNBbmFseXRpY2FsTGVhZiIsImFuZCIsIm5vdCIsImVxdWFsIiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwiSGlkZGVuIiwiaWZFbHNlIiwib3IiLCJfZ2V0SGlkZGVuRXhwcmVzc2lvbnMiLCJjb2xsZWN0aW9uRmllbGRzSGlkZGVuRXhwcmVzc2lvbiIsImNvbXBpbGVFeHByZXNzaW9uIiwiY29sbGVjdGlvbkRhdGEiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiRGF0YSIsImdldENvbm5lY3RlZEZpZWxkc0RhdGEiLCJpbm5lckRhdGFGaWVsZCIsImFyZ3VtZW50cyIsImlzTmF2aWdhdGlvblByb3BlcnR5IiwiZGF0YUZpZWxkRGVmYXVsdCIsInF1YWxpZmllciIsIkxhYmVsIiwiaXNEYXRhRmllbGRUeXBlcyIsInZhbHVlT2YiLCJfZ2V0VG9vbHRpcCIsIlF1aWNrSW5mbyIsImRhdGFwb2ludFRhcmdldCIsImdldFJvd1N0YXR1c1Zpc2liaWxpdHkiLCJjb2xOYW1lIiwiaXNTZW1hbnRpY0tleUluRmllbGRHcm91cCIsImZvcm1hdFJlc3VsdCIsInBhdGhJbk1vZGVsIiwidGFibGVGb3JtYXR0ZXJzIiwiZ2V0RXJyb3JTdGF0dXNUZXh0VmlzaWJpbGl0eUZvcm1hdHRlciIsImV4aXN0aW5nQ29sdW1ucyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXAiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwicmVsYXRlZENvbHVtbiIsInByb3BlcnR5T2JqZWN0UGF0aCIsImlzTXVsdGlWYWx1ZUZpZWxkIiwibmV3TmFtZVJlbGF0aXZlVGFyZ2V0UGF0aCIsImNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zIiwibmV3TmFtZSIsInByb3BlcnR5SW5mbyIsIl9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZSIsIktleUhlbHBlciIsImdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZCIsIl9nZXRTaG93RGF0YUZpZWxkc0xhYmVsIiwiZmllbGRHcm91cE5hbWUiLCJjb2x1bW5LZXlzIiwic2hvd0RhdGFGaWVsZHNMYWJlbCIsIl9nZXRSZWxhdGl2ZVBhdGgiLCJ2YWx1ZSIsImlzTGFzdFNsYXNoIiwiaXNMYXN0UGFydCIsImlTbGFzaEluZGV4IiwibGFzdEluZGV4T2YiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwiX2lzQ29sdW1uTXVsdGlWYWx1ZWQiLCJfaXNDb2x1bW5Tb3J0YWJsZSIsInByb3BlcnR5UGF0aCIsIm5vblNvcnRhYmxlQ29sdW1ucyIsInByb3BOYW1lIiwiZmlsdGVyRnVuY3Rpb25zIiwiX2dldEZpbHRlckZ1bmN0aW9ucyIsIkNvbnZlcnRlckNvbnRleHQiLCJlbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJUeXBlR3VhcmRzIiwiaXNFbnRpdHlTZXQiLCJDYXBhYmlsaXRpZXMiLCJGaWx0ZXJGdW5jdGlvbnMiLCJnZXRFbnRpdHlDb250YWluZXIiLCJfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSIsInRleHRMaW5lc0VkaXQiLCJfZmluZFNlbWFudGljS2V5VmFsdWVzIiwic2VtYW50aWNLZXlzIiwiYVNlbWFudGljS2V5VmFsdWVzIiwiYlNlbWFudGljS2V5Rm91bmQiLCJpIiwidmFsdWVzIiwic2VtYW50aWNLZXlGb3VuZCIsIl9maW5kUHJvcGVydGllcyIsInNlbWFudGljS2V5VmFsdWVzIiwiZmllbGRHcm91cFByb3BlcnRpZXMiLCJzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwIiwic1Byb3BlcnR5UGF0aCIsInRtcCIsImZpZWxkR3JvdXBQcm9wZXJ0eVBhdGgiLCJfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwIiwiZGF0YUZpZWxkR3JvdXAiLCJhUHJvcGVydGllcyIsIl9wcm9wZXJ0aWVzRm91bmQiLCJnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4iLCJzZW1hbnRpY0tleSIsInNlbWFudGljS2V5SW5GaWVsZEdyb3VwIiwiZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoIiwic2hvd0Vycm9yT2JqZWN0U3RhdHVzIiwiaGFzRHJhZnRJbmRpY2F0b3IiLCJfZ2V0SW1wTnVtYmVyIiwiSW1wb3J0YW5jZSIsIl9nZXREYXRhRmllbGRJbXBvcnRhbmNlIiwic3BsaXQiLCJOb25lIiwidGFyZ2V0VmFsdWVmcm9tRFAiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsIl9nZXRNYXhJbXBvcnRhbmNlIiwiZmllbGRzIiwibWF4SW1wTnVtYmVyIiwiaW1wTnVtYmVyIiwiRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UiLCJmaWVsZCIsIlNlbWFudGljS2V5IiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwiZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzIiwiaGlnaEtleXMiLCJmaWVsZHNXaXRoSW1wb3J0YW5jZSIsImRhdGFGaWVsZFRhcmdldCIsImZpZWxkR3JvdXBEYXRhIiwiaGFzSGlnaEtleSIsImZpZWxkR3JvdXBEYXRhRmllbGQiLCJIaWdoIiwiaXRlbSIsImNvbm5lY3RlZEZpZWxkc0RhdGEiLCJyZXF1aXJlZEtleXMiLCJwIiwiaGFzUmVxdWlyZWRIaWdoS2V5IiwiY29ubmVjdGVkRGF0YUZpZWxkIiwiZ2V0RW5hYmxlU3RyaWN0SGFuZGxpbmdGcm9tTWFuaWZlc3QiLCJ0YWJsZU1hbmlmZXN0U2V0dGluZ3MiLCJhY3Rpb25zIiwiZGlzYWJsZVN0cmljdEhhbmRsaW5nIiwiZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwiZGVmYXVsdENyZWF0aW9uTW9kZSIsImdldE1hbmlmZXN0V3JhcHBlciIsImdldFNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwibWFjcm9zIiwidGFibGUiLCJDcmVhdGlvbk1vZGUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJ0YWJsZVNldHRpbmdzIiwiY3JlYXRpb25Nb2RlIiwiZ2V0QW5ub3RhdGlvbnNCeVRlcm0iLCJnZXRFbnRpdHlUeXBlIiwidGFibGVDb252ZXJ0ZXJDb250ZXh0IiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5IiwiaXNGaWVsZEdyb3VwQ29sdW1uIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJzaXR1YXRpb25zTmF2UHJvcHMiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCJpc0NvbGxlY3Rpb24iLCJTQVBPYmplY3ROb2RlVHlwZSIsIk5hbWUiLCJzaXR1YXRpb25zTmF2UHJvcCIsImhhc1NpdHVhdGlvbnNJbmRpY2F0b3IiLCJpc011bHRpVmFsdWUiLCJ2aXN1YWxTZXR0aW5ncyIsIndpZHRoQ2FsY3VsYXRpb24iLCJjb2x1bW5LZXkiLCJIVE1MNSIsIkNzc0RlZmF1bHRzIiwiaXNQYXJ0T2ZMaW5lSXRlbSIsInN0cmljdEhhbmRsaW5nU2V0dGluZ0ZvckNvbHVtbiIsInRvb2x0aXAiLCJyZWxhdGVkUHJvcGVydHlOYW1lIiwiZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24iLCJjcmVhdGVQcm9wZXJ0eUFubm90YXRlZFRleHRPbmx5IiwiX2dldFByb3BlcnR5TmFtZXMiLCJtYXRjaGVkUHJvcGVydGllcyIsIkFycmF5IiwiaXNBcnJheSIsInJlc29sdmVQYXRoIiwiaXNSZXF1aXJlZCIsImRhdGFGaWVsZERhdGEiLCJpc0RhdGFGaWVsZCIsImlzU3RhdGljYWxseU1hbmRhdG9yeSIsImlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmVxdWlyZWREYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsIkRhdGFGaWVsZEZvckFubm90YXRpb25GaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkiLCJoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkiLCJoYXNDb25uZWN0ZWRGaWVsZHNUYXJnZXQiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJWaXN1YWxpemF0aW9uIiwiaXNSZXF1aXJlZERhdGFQb2ludCIsImlzUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0IiwiZGF0YVBvaW50IiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsIkFuYWx5dGljYWxMaXN0UGFnZSIsIklzRWRpdGFibGUiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCJfYXBwZW5kQ3VzdG9tVGVtcGxhdGUiLCJleHBvcnRQcm9wZXJ0aWVzIiwiam9pbiIsImludGVybmFsQ29sdW1ucyIsImlzQ29sdW1uT3ZlcnJpZGUiLCJpc1Nsb3RDb2x1bW4iLCJtYW5pZmVzdENvbHVtbiIsIlNsb3QiLCJpc0N1c3RvbUNvbHVtbiIsIl91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zIiwiYW5ub3RhdGlvblRhYmxlQ29sdW1ucyIsImVudGl0eVByb3BlcnR5TmFtZSIsInJlcGxhY2UiLCJpc1Byb3BlcnR5TmFtZUdyb3VwYWJsZSIsImlzUGFydE9mQ3VzdG9tQ29sdW1uIiwidmFsaWRhdGVLZXkiLCJiYXNlVGFibGVDb2x1bW4iLCJwb3NpdGlvbiIsImFuY2hvciIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwicHJvcGVydGllc1RvT3ZlcndyaXRlQW5ub3RhdGlvbkNvbHVtbiIsImRpc2FibGVFeHBvcnQiLCJnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyIsInRvb2x0aXBUZXh0IiwiZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbCIsImhlYWRlclRleHQiLCJoZWFkZXIiLCJjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5ncyIsImJhc2VNYW5pZmVzdENvbHVtbiIsIkhvcml6b250YWxBbGlnbiIsIkJlZ2luIiwiaWQiLCJjdXN0b21UYWJsZUNvbHVtbiIsIkRlZmF1bHQiLCJtZXNzYWdlIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJNYW5pZmVzdCIsIklzc3VlU2V2ZXJpdHkiLCJMb3ciLCJJc3N1ZUNhdGVnb3J5VHlwZSIsIkFubm90YXRpb25Db2x1bW5zIiwiSW52YWxpZEtleSIsImNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yIiwic2l0dWF0aW9uc0luZGljYXRvckNvbHVtbiIsInByb3BlcnR5S2V5IiwiaXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiQ29tcHV0ZWQiLCJjbGlwYm9hcmRTZXR0aW5ncyIsImluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW4iLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yIiwiaXNEcmFmdE5vZGUiLCJpc0RyYWZ0Um9vdCIsImNvbHVtbldpdGhEcmFmdEluZGljYXRvciIsImRyYWZ0SW5kaWNhdG9yQ29sdW1uIiwiaXNEcmFmdEluZGljYXRvciIsImNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciIsImdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uIiwiY2FwYWJpbGl0aWVzIiwiSW5zZXJ0UmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiaXNDdXJyZW5jeSIsImV4cG9ydERhdGFUeXBlIiwibmF2UHJvcGVydHkiLCJsaW5lSXRlbSIsImlzUHJvcGVydHlOYXZpZ2F0ZWQiLCJpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQiLCJ0YXJnZXRNYXBwaW5nIiwiaXNUeXBlRGVmaW5pdGlvbiIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsInNldFVwQ29uc3RyYWludHMiLCJwYXJzZUFzU3RyaW5nIiwiZW1wdHlTdHJpbmciLCJudWxsYWJsZSIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyIsImV4aXN0aW5nQ29sdW1uIiwiY29sdW1uRnJvbUFubm90YXRpb25zIiwiZW5hYmxlV3JhcHBpbmciLCJjdXN0b21FeHBvcnRTZXR0aW5ncyIsInRleHRBbGlnbiIsInRydWVWYWx1ZSIsImZhbHNlVmFsdWUiLCJ2YWx1ZU1hcCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ29sdW1ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHksIFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXJGdW5jdGlvbnMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc19FZG1cIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNLZXkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHtcblx0Q29ubmVjdGVkRmllbGRzLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdERhdGFGaWVsZFR5cGVzLFxuXHREYXRhUG9pbnQsXG5cdERhdGFQb2ludFR5cGVUeXBlcyxcblx0RmllbGRHcm91cCxcblx0TGluZUl0ZW1cbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHsgVUlBbm5vdGF0aW9uVGVybXMsIFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRFRE1fVFlQRV9NQVBQSU5HLFxuXHRhbmQsXG5cdGNvbXBpbGVFeHByZXNzaW9uLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdGZvcm1hdFJlc3VsdCxcblx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLFxuXHRpZkVsc2UsXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsLFxuXHRzZXRVcENvbnN0cmFpbnRzXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7XG5cdEF2YWlsYWJpbGl0eVR5cGUsXG5cdEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbixcblx0Q3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUsXG5cdEZvcm1hdE9wdGlvbnNUeXBlLFxuXHRUYWJsZUNvbHVtblNldHRpbmdzLFxuXHRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBDcmVhdGlvbk1vZGUsIEhvcml6b250YWxBbGlnbiwgSW1wb3J0YW5jZSwgVGVtcGxhdGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBDb21wbGV4UHJvcGVydHlJbmZvIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQge1xuXHRjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMsXG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5LFxuXHRnZXREYXRhRmllbGREYXRhVHlwZSxcblx0Z2V0U2VtYW50aWNPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50LFxuXHRoYXNDb25uZWN0ZWRGaWVsZHNUYXJnZXQsXG5cdGhhc0RhdGFQb2ludFRhcmdldCxcblx0aGFzRmllbGRHcm91cFRhcmdldCxcblx0aXNEYXRhRmllbGQsXG5cdGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0aXNEYXRhRmllbGRUeXBlcyxcblx0aXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCxcblx0aXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25IZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYWJsZU9iamVjdCwgQ3VzdG9tRWxlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBPdmVycmlkZVR5cGUsIFBsYWNlbWVudCwgaW5zZXJ0Q3VzdG9tRWxlbWVudHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgZ2V0Q29ubmVjdGVkRmllbGRzRGF0YSwgaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVDYXRlZ29yeVR5cGUsIElzc3VlU2V2ZXJpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgS2V5SGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9LZXlcIjtcbmltcG9ydCB7IFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCAqIGFzIFR5cGVHdWFyZHMgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHtcblx0aXNBbm5vdGF0aW9uT2ZUZXJtLFxuXHRpc0Fubm90YXRpb25PZlR5cGUsXG5cdGlzTmF2aWdhdGlvblByb3BlcnR5LFxuXHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0aXNQcm9wZXJ0eSxcblx0aXNUeXBlRGVmaW5pdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRlbmhhbmNlRGF0YU1vZGVsUGF0aCxcblx0Z2V0Q29udGV4dFByb3BlcnR5UmVzdHJpY3Rpb24sXG5cdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdHR5cGUgRGF0YU1vZGVsT2JqZWN0UGF0aFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSwgdHlwZSBEaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMsIHR5cGUgUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRW50aXR5U2V0SGVscGVyXCI7XG5pbXBvcnQgeyBoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnksIGlzU3RhdGljYWxseU1hbmRhdG9yeSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCxcblx0Z2V0U3RhdGljVGltZXpvbmUsXG5cdGdldFN0YXRpY1VuaXRPckN1cnJlbmN5LFxuXHRpc1RpbWV6b25lXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBpc011bHRpVmFsdWVGaWVsZCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBEZWZhdWx0VHlwZUZvckVkbVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdHlwZS9FRE1cIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVzdHJpY3RlZC1pbXBvcnRzXG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgTURDVGFibGVQcm9wZXJ0eUluZm8gYXMgUHJvcGVydHlJbmZvLCBWaXN1YWxTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBTaW1wbGVUeXBlIGZyb20gXCJzYXAvdWkvbW9kZWwvU2ltcGxlVHlwZVwiO1xuXG4vLyBDdXN0b20gQ29sdW1uIGZyb20gTWFuaWZlc3RcbnR5cGUgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlPzogQ29sdW1uVHlwZS5EZWZhdWx0O1xufTtcblxuLy8gU2xvdCBDb2x1bW4gZnJvbSBCdWlsZGluZyBCbG9ja1xudHlwZSBGcmFnbWVudERlZmluZWRTbG90Q29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlLlNsb3Q7XG59O1xuLy8gUHJvcGVydGllcyBhbGwgQ29sdW1uVHlwZXMgaGF2ZTpcbnR5cGUgQmFzZVRhYmxlQ29sdW1uID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlOyAvL09yaWdpbiBvZiB0aGUgc291cmNlIHdoZXJlIHdlIGFyZSBnZXR0aW5nIHRoZSB0ZW1wbGF0ZWQgaW5mb3JtYXRpb24gZnJvbVxuXHR3aWR0aD86IHN0cmluZztcblx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI/OiBib29sZWFuO1xuXHRpbXBvcnRhbmNlPzogSW1wb3J0YW5jZTtcblx0aG9yaXpvbnRhbEFsaWduPzogSG9yaXpvbnRhbEFsaWduO1xuXHRhdmFpbGFiaWxpdHk/OiBBdmFpbGFiaWxpdHlUeXBlO1xuXHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xuXHRsYWJlbD86IHN0cmluZztcblx0dG9vbHRpcD86IHN0cmluZztcblx0ZGlzYWJsZUV4cG9ydD86IGJvb2xlYW47XG59O1xuXG4vLyBQcm9wZXJ0aWVzIG9uIEN1c3RvbSBDb2x1bW5zIGFuZCBTbG90IENvbHVtbnNcbmV4cG9ydCB0eXBlIEN1c3RvbUJhc2VkVGFibGVDb2x1bW4gPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdGlkOiBzdHJpbmc7XG5cdG5hbWU6IHN0cmluZztcblx0aGVhZGVyPzogc3RyaW5nO1xuXHR0ZW1wbGF0ZTogc3RyaW5nIHwgQ29udHJvbDtcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbDtcblx0Zm9ybWF0T3B0aW9uczogRm9ybWF0T3B0aW9uc1R5cGU7XG5cdGlzR3JvdXBhYmxlOiBib29sZWFuO1xuXHRpc05hdmlnYWJsZTogYm9vbGVhbjtcblx0c29ydGFibGU6IGJvb2xlYW47XG5cdHZpc3VhbFNldHRpbmdzOiB7IHdpZHRoQ2FsY3VsYXRpb246IG51bGwgfTtcblx0cHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHRyZXF1aXJlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tcHV0ZWRUYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0bmFtZTogc3RyaW5nO1xuXHRsYWJlbDogc3RyaW5nO1xuXHRwcm9wZXJ0eUtleTogc3RyaW5nO1xuXHRpc0RyYWZ0SW5kaWNhdG9yPzogYm9vbGVhbjtcblx0aXNTaXR1YXRpb25zSW5kaWNhdG9yPzogYm9vbGVhbjtcblx0Zm9ybWF0T3B0aW9ucz86IEZvcm1hdE9wdGlvbnNUeXBlIHwgbnVsbDtcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbDtcblx0Y2xpcGJvYXJkU2V0dGluZ3M/OiBPYmplY3QgfCBudWxsO1xuXHRyZXF1aXJlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xufTtcblxuLy8gUHJvcGVydGllcyBkZXJpdmVkIGZyb20gTWFuaWZlc3QgdG8gb3ZlcnJpZGUgQW5ub3RhdGlvbiBjb25maWd1cmF0aW9uc1xudHlwZSBBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZSA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0c2V0dGluZ3M/OiBUYWJsZUNvbHVtblNldHRpbmdzO1xuXHRmb3JtYXRPcHRpb25zPzogRm9ybWF0T3B0aW9uc1R5cGU7XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlUeXBlQ29uc3RyYWludHMgPSBQYXJ0aWFsPHtcblx0c2NhbGU6IG51bWJlcjtcblx0cHJlY2lzaW9uOiBudW1iZXI7XG5cdG1heExlbmd0aDogbnVtYmVyO1xuXHRudWxsYWJsZTogYm9vbGVhbjtcblx0bWluaW11bTogc3RyaW5nO1xuXHRtYXhpbXVtOiBzdHJpbmc7XG5cdGlzRGlnaXRTZXF1ZW5jZTogYm9vbGVhbjtcbn0+O1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVGb3JtYXRPcHRpb25zID0gUGFydGlhbDx7XG5cdHBhcnNlQXNTdHJpbmc6IGJvb2xlYW47XG5cdGVtcHR5U3RyaW5nOiBzdHJpbmc7XG5cdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogYm9vbGVhbjtcblx0c3R5bGU6IHN0cmluZztcbn0+O1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVDb25maWcgPSB7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzPzogUHJvcGVydHlUeXBlQ29uc3RyYWludHM7XG5cdGZvcm1hdE9wdGlvbnM/OiBQcm9wZXJ0eVR5cGVGb3JtYXRPcHRpb25zO1xuXHR0eXBlSW5zdGFuY2U/OiBTaW1wbGVUeXBlO1xuXHRiYXNlVHlwZT86IHN0cmluZztcblx0Y2xhc3NOYW1lPzoga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbHVtbkV4cG9ydFNldHRpbmdzID0gUHJvcGVydHlJbmZvW1wiZXhwb3J0U2V0dGluZ3NcIl0gJiB7XG5cdGRhdGFQb2ludFRhcmdldFZhbHVlPzogc3RyaW5nO1xuXHRpc0N1cnJlbmN5PzogYm9vbGVhbjtcbn07XG5cbi8vIFByb3BlcnRpZXMgZm9yIEFubm90YXRpb24gQ29sdW1uc1xuZXhwb3J0IHR5cGUgQW5ub3RhdGlvblRhYmxlQ29sdW1uID0gUHJvcGVydHlJbmZvICZcblx0QW5ub3RhdGlvblRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUgJiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdFx0cmVsYXRpdmVQYXRoOiBzdHJpbmc7XG5cdFx0dG9vbHRpcD86IHN0cmluZztcblx0XHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRcdGdyb3VwPzogc3RyaW5nO1xuXHRcdGNvbGxlY3Rpb25GaWVsZHNIaWRkZW5FeHByZXNzaW9uPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdFx0c2hvd0RhdGFGaWVsZHNMYWJlbD86IGJvb2xlYW47XG5cdFx0cmVxdWlyZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0XHRpc0dyb3VwYWJsZT86IGJvb2xlYW47XG5cdFx0dW5pdFRleHQ/OiBzdHJpbmc7XG5cdFx0dGltZXpvbmVUZXh0Pzogc3RyaW5nO1xuXHRcdHRpbWV6b25lPzogc3RyaW5nO1xuXHRcdHNlbWFudGljT2JqZWN0UGF0aD86IHN0cmluZztcblx0XHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0XHR0ZXh0UHJvcGVydHk6IHN0cmluZztcblx0XHRcdG1vZGU6IERpc3BsYXlNb2RlO1xuXHRcdH07XG5cdFx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0XHR0eXBlQ29uZmlnPzogUHJvcGVydHlUeXBlQ29uZmlnO1xuXHRcdGlzUGFydE9mTGluZUl0ZW0/OiBib29sZWFuOyAvLyB0ZW1wb3JhcnkgaW5kaWNhdG9yIHRvIG9ubHkgYWxsb3cgZmlsdGVyaW5nIG9uIG5hdmlnYXRpb24gcHJvcGVydGllcyB3aGVuIHRoZXkncmUgcGFydCBvZiBhIGxpbmUgaXRlbVxuXHRcdGlzUGFydE9mQ3VzdG9tQ29sdW1uPzogYm9vbGVhbjtcblx0XHRhZGRpdGlvbmFsTGFiZWxzPzogc3RyaW5nW107XG5cdFx0ZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBzdHJpbmc7XG5cdFx0ZXh0ZW5zaW9uPzogRXh0ZW5zaW9uRm9yQW5hbHl0aWNzO1xuXHRcdGlzTXVsdGlWYWx1ZT86IGJvb2xlYW47XG5cdFx0ZGVzY3JpcHRpb25Qcm9wZXJ0eT86IHN0cmluZztcblx0XHRtb2RlPzogRGlzcGxheU1vZGU7XG5cdFx0dmFsdWVQcm9wZXJ0eT86IHN0cmluZztcblx0fTtcblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uRm9yQW5hbHl0aWNzID0gUHJvcGVydHlJbmZvW1wiZXh0ZW5zaW9uXCJdICYge1xuXHRhZGRpdGlvbmFsUHJvcGVydGllcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21CYXNlZFRhYmxlQ29sdW1uIHwgQW5ub3RhdGlvblRhYmxlQ29sdW1uIHwgQ29tcHV0ZWRUYWJsZUNvbHVtbjtcblxudHlwZSBNYW5pZmVzdENvbHVtbiA9IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlPjtcblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIiwgLy8gRGVmYXVsdCBUeXBlIChDdXN0b20gQ29sdW1uKVxuXHRBbm5vdGF0aW9uID0gXCJBbm5vdGF0aW9uXCIsXG5cdFNsb3QgPSBcIlNsb3RcIixcblx0Q29tcHV0ZWQgPSBcIkNvbXB1dGVkXCJcbn1cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgY29sdW1ucywgYW5ub3RhdGlvbi1iYXNlZCBhcyB3ZWxsIGFzIG1hbmlmZXN0LWJhc2VkLlxuICogVGhleSBhcmUgc29ydGVkIGFuZCBzb21lIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJ3cml0dGVuIHZpYSB0aGUgbWFuaWZlc3QgKGNoZWNrIG91dCB0aGUga2V5cyB0aGF0IGNhbiBiZSBvdmVyd3JpdHRlbikuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdHlwZSBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFJldHVybnMgYWxsIHRhYmxlIGNvbHVtbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLCByZWdhcmRsZXNzIG9mIHRlbXBsYXRpbmcgb3IgcGVyc29uYWxpemF0aW9uIG9yIHRoZWlyIG9yaWdpblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVDb2x1bW5zKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdGFibGVUeXBlLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCkuY29sdW1ucyA/PyB7fSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHR0YWJsZVR5cGVcblx0KTtcblxuXHRjb25zdCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10gPSBpbnNlcnRDdXN0b21FbGVtZW50cyhcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyBhcyBUYWJsZUNvbHVtbltdLFxuXHRcdG1hbmlmZXN0Q29sdW1ucyBhcyBSZWNvcmQ8c3RyaW5nLCBDdXN0b21FbGVtZW50PFRhYmxlQ29sdW1uPj4sXG5cdFx0e1xuXHRcdFx0d2lkdGg6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGltcG9ydGFuY2U6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRob3Jpem9udGFsQWxpZ246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRpc05hdmlnYWJsZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdHNldHRpbmdzOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0Zm9ybWF0T3B0aW9uczogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGV4cG9ydFNldHRpbmdzOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlXG5cdFx0fVxuXHQpO1xuXG5cdHJldHVybiBhZGRDb21wdXRlZENvbHVtbnModGFibGVDb2x1bW5zLCB0YWJsZVR5cGUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDb2x1bW5CeVBhdGgocGF0aDogc3RyaW5nLCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiB0YWJsZUNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwYXRoO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSAndW5pdCcsICd0ZXh0QXJyYW5nZW1lbnQnLCAndGltZXpvbmUnIGFuZCAnZXhwb3J0c2V0dGluZ3MnIHByb3BlcnRpZXMgaW4gY29sdW1ucyB3aGVuIG5lY2Vzc2FyeS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGNvbHVtbnMgdG8gYmUgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGlua2VkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiB2b2lkIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0dGFibGVDb2x1bW5zLmZvckVhY2goKG9Db2x1bW4pID0+IHtcblx0XHRjb25zdCB0YWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmICh0YWJsZUNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgdGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZGF0YU1vZGVsT2JqZWN0UGF0aCwgdGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5ID0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdDtcblx0XHRcdGlmIChwcm9wZXJ0eSkge1xuXHRcdFx0XHRhZGRDdXJyZW5jeU9yVW9NVG9Qcm9wZXJ0eShwcm9wZXJ0eSwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCB0YWJsZUNvbHVtbnMsIHRhYmxlQ29sdW1uKTtcblx0XHRcdFx0Y29uc3QgdGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdFx0Y29uc3QgdGltZXpvbmUgPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGltZXpvbmU7XG5cdFx0XHRcdGlmICh0aW1lem9uZVByb3BlcnR5KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RpbWV6b25lQ29sdW1uID0gZmluZENvbHVtbkJ5UGF0aCh0aW1lem9uZVByb3BlcnR5Lm5hbWUsIHRhYmxlQ29sdW1ucyk7XG5cdFx0XHRcdFx0dGFibGVDb2x1bW4udGltZXpvbmUgPSBvVGltZXpvbmVDb2x1bW4/Lm5hbWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGltZXpvbmUpIHtcblx0XHRcdFx0XHR0YWJsZUNvbHVtbi50aW1lem9uZVRleHQgPSB0aW1lem9uZS50b1N0cmluZygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFkZFRleHRBcnJhbmdlbnRJbmZvVG9Qcm9wZXJ0eShwcm9wZXJ0eSwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCB0YWJsZUNvbHVtbnMsIHRhYmxlQ29sdW1uKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIEFkZHMgdGhlIFwidW5pdFwiIHByb3BlcnR5IGludG8gdGhlIGNvbHVtbnMgd2hlbiBuZWNjZXNhcnkgZm9yIGNvbHVtbnMgd2l0aCB1bml0IG9mIG1lYXN1cmUgYW5kIGN1cnJlbmNpZXMuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgb24gdGhlIGNvbHVtblxuICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcHJvcGVydHkgRGF0YU1vZGVsT2JqZWN0UGF0aC5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBkaXNwbGF5ZWQgb24gdGhlIHRhYmxlXG4gKiBAcGFyYW0gdGFibGVDb2x1bW4gVGhlIHRhYmxlIGNvbHVtbiB3aGljaCBhZGRzIHRoZSBjdXJyZW5jeSBvciB1bml0XG4gKi9cbmZ1bmN0aW9uIGFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5KFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0dGFibGVDb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtblxuKTogdm9pZCB7XG5cdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aChwcm9wZXJ0eSkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgocHJvcGVydHkpO1xuXHRpZiAoY3VycmVuY3lPclVvTVByb3BlcnR5KSB7XG5cdFx0Y29uc3QgY3VycmVuY3lPclVvTVByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSk7XG5cdFx0Y29uc3QgY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgoY3VycmVuY3lPclVvTVByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0aWYgKGN1cnJlbmN5T3JVb01SZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHVuaXRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKGN1cnJlbmN5T3JVb01SZWxhdGl2ZVBhdGgsIHRhYmxlQ29sdW1ucyk7XG5cdFx0XHR0YWJsZUNvbHVtbi51bml0ID0gdW5pdENvbHVtbj8ubmFtZTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgdW5pdCA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0aWYgKHVuaXQpIHtcblx0XHRcdHRhYmxlQ29sdW1uLnVuaXRUZXh0ID0gYCR7dW5pdH1gO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEFkZCB0aGUgXCJ0ZXh0QXJyYW5nZW1lbnRcIiBvYmplY3QgdG8gY29sdW1ucyB3aGVuIG5lY2Vzc2FyeSBmb3IgY29sdW1ucyBjb250YWluaW5nIHRleHQsIHN1Y2ggYXMgZGVzY3JpcHRpb25zLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIGJ5IHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggVGhlIHByb3BlcnR5IERhdGFNb2RlbE9iamVjdFBhdGguXG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgZGlzcGxheWVkIG9uIHRoZSB0YWJsZVxuICogQHBhcmFtIHRhYmxlQ29sdW1uIFRoZSB0YWJsZSBjb2x1bW4gd2hpY2ggYWRkcyB0aGUgdGV4dFxuICovXG5mdW5jdGlvbiBhZGRUZXh0QXJyYW5nZW50SW5mb1RvUHJvcGVydHkoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZUNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uXG4pOiB2b2lkIHtcblx0Y29uc3QgZGlzcGxheU1vZGUgPSBnZXREaXNwbGF5TW9kZShwcm9wZXJ0eSwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUpLFxuXHRcdHRleHRQcm9wZXJ0eVBhdGggPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdGlmICh0ZXh0UHJvcGVydHlQYXRoICYmIGRpc3BsYXlNb2RlICE9PSBcIlZhbHVlXCIpIHtcblx0XHRjb25zdCB0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgdGV4dFByb3BlcnR5UGF0aCk7XG5cdFx0Y29uc3QgdGV4dFJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgodGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0aWYgKHRleHRSZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHRleHRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRleHRSZWxhdGl2ZVBhdGgsIHRhYmxlQ29sdW1ucyk7XG5cdFx0XHRpZiAodGV4dENvbHVtbiAmJiB0ZXh0Q29sdW1uLm5hbWUgIT09IHRhYmxlQ29sdW1uLm5hbWUpIHtcblx0XHRcdFx0dGFibGVDb2x1bW4udGV4dEFycmFuZ2VtZW50ID0ge1xuXHRcdFx0XHRcdHRleHRQcm9wZXJ0eTogdGV4dENvbHVtbi5uYW1lLFxuXHRcdFx0XHRcdG1vZGU6IGRpc3BsYXlNb2RlXG5cdFx0XHRcdH07XG5cdFx0XHRcdC8vIElmIHRleHQgcHJvcGVydGllcyBhcmUgdXNlZCBidXQgaGlkZGVuLCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSB0byB0aGUgZXhwb3J0IGFzIHRoZXJlIGFyZSB1c2VkIGluIHRoZSBwYXN0ZVxuXHRcdFx0XHRpZiAoIXRleHRDb2x1bW4uZXhwb3J0U2V0dGluZ3MpIHtcblx0XHRcdFx0XHR0ZXh0Q29sdW1uLmV4cG9ydFNldHRpbmdzID0geyB0eXBlOiBcIlN0cmluZ1wiIH07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29sdW1ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBUaGUgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkIGJhc2VkIG9uIExpbmVJdGVtIGFubm90YXRpb25zLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdGFibGUuXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbWFwIG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyBkZXNjcmlwdGlvbiBvbiBhIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyBUaGUgY29sdW1uIGZyb20gdGhlIGVudGl0eVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uIChcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSxcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0aWYgKGFubm90YXRpb25Db2x1bW5zID09PSB1bmRlZmluZWQpIHtcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyA9IFtdO1xuXHR9XG5cblx0bGV0IHByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZDogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGdyb3VwYWJsZVByb3BlcnRpZXMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRHcm91cGFibGVQcm9wZXJ0aWVzKCk7XG5cdC8vRm9yIEFuYWx5dGljYWwgdGFibGUsIHdlIGV4Y2x1ZGUgYWxsIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGdyb3VwYWJsZSBhbmQgdXNlZCBhcyBUZXh0IGluIGEgZ3JvdXBhYmxlIFByb3BlcnR5LlxuXHRpZiAodGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiICYmIGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkgJiYgZ3JvdXBhYmxlUHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZCA9IGdyb3VwYWJsZVByb3BlcnRpZXNcblx0XHRcdC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS4kdGFyZ2V0KVxuXHRcdFx0LmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQgIT09IHVuZGVmaW5lZClcblx0XHRcdC5tYXAoKHRhcmdldCkgPT4gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSh0YXJnZXQgYXMgUHJvcGVydHkpKVxuXHRcdFx0LmZpbHRlcigodGV4dFByb3ApID0+IHRleHRQcm9wICYmICFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5R3JvdXBhYmxlKHRleHRQcm9wKSlcblx0XHRcdC5tYXAoKHByb3ApID0+IHByb3A/Lm5hbWUpXG5cdFx0XHQuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSB1bmRlZmluZWQpIGFzIHN0cmluZ1tdO1xuXHR9XG5cdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHQvLyBDYXRjaCBhbHJlYWR5IGV4aXN0aW5nIGNvbHVtbnMgLSB3aGljaCB3ZXJlIGFkZGVkIGJlZm9yZSBieSBMaW5lSXRlbSBBbm5vdGF0aW9uc1xuXHRcdGNvbnN0IGV4aXN0cyA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbHVtbi5uYW1lID09PSBwcm9wZXJ0eS5uYW1lO1xuXHRcdH0pO1xuXHRcdC8vIGlmIHRhcmdldCB0eXBlIGV4aXN0cywgaXQgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBzaG91bGQgYmUgaWdub3JlZFxuXHRcdGlmICghcHJvcGVydHkudGFyZ2V0VHlwZSAmJiAhZXhpc3RzICYmICFwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQuaW5jbHVkZXMocHJvcGVydHkubmFtZSkpIHtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRhYmxlVHlwZVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHQvLyBJbmNsdWRlIHRoZSB0ZXh0IHByb3BlcnRpZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdGV4dCBhcnJhbmdlbWVudFxuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0XHRhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLCByZWxhdGVkUHJvcGVydGllc0luZm8sIG5hbWUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNvbHVtbkluZm8gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mb1xuXHRcdFx0KTtcblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8ucHJvcGVydHlJbmZvcyA9IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzO1xuXHRcdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlKSB7XG5cdFx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBDb2xsZWN0IGluZm9ybWF0aW9uIG9mIHJlbGF0ZWQgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbbmFtZV0uYW5ub3RhdGlvblByb3BlcnR5O1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MgPSBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2goKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbCBvdmVyd3JpdGUgYXMgd2UgcmVxdWlyZSBvbmx5IG9uZSBuZXcgUHJvcGVydHlJbmZvIGZvciBhIHJlbGF0ZWQgUHJvcGVydHkuXG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXHRcdC8vIEluIGNhc2UgYSBwcm9wZXJ0eSBoYXMgZGVmaW5lZCBhICNUZXh0T25seSB0ZXh0IGFycmFuZ2VtZW50IHRoYXQgcG9pbnRzIHRvIGEgdGV4dCBwcm9wZXJ0eSAoYW5kIG5vdCBhICdoYXJkIGNvZGVkIHRleHQnKSBkb24ndCBvbmx5IGNyZWF0ZSB0aGUgY29tcGxleCBwcm9wZXJ0eSB3aXRoIHRoZSB0ZXh0IHByb3BlcnR5IGFzIGEgY2hpbGQgcHJvcGVydHksXG5cdFx0Ly8gYnV0IGFsc28gdGhlIHByb3BlcnR5IGl0c2VsZiBhcyBpdCBjYW4gYmUgdXNlZCBhcyB3aXRoaW4gdGhlIHNvcnRDb25kaXRpb25zIG9yIG9uIGN1c3RvbSBjb2x1bW5zLlxuXHRcdC8vIFRoaXMgc3RlcCBtdXN0IGJlIHZhbGlkIGFsc28gZnJvbSB0aGUgY29sdW1ucyBhZGRlZCB2aWEgTGluZUl0ZW1zIG9yIGZyb20gYSBjb2x1bW4gYXZhaWxhYmxlIG9uIHRoZSBwMTNuLlxuXHRcdGlmIChnZXREaXNwbGF5TW9kZShwcm9wZXJ0eSwgZW50aXR5VHlwZSkgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eS5uYW1lKTtcblx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCkpIHtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChcblx0XHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdC8vIENyZWF0ZSBhIHByb3BlcnR5SW5mbyBmb3IgZWFjaCByZWxhdGVkIHByb3BlcnR5LlxuXHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0dGFibGVUeXBlLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHQpO1xuXHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbnMuY29uY2F0KHJlbGF0ZWRDb2x1bW5zKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgY29sdW1uIGRlZmluaXRpb24gZnJvbSBhIHByb3BlcnR5LlxuICogQHBhcmFtIHByb3BlcnR5IEVudGl0eSB0eXBlIHByb3BlcnR5IGZvciB3aGljaCB0aGUgY29sdW1uIGlzIGNyZWF0ZWRcbiAqIEBwYXJhbSBmdWxsUHJvcGVydHlQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eVxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0gdXNlRGF0YUZpZWxkUHJlZml4IFNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIFwiRGF0YUZpZWxkOjpcIiwgZWxzZSBpdCB3aWxsIGJlIHByZWZpeGVkIHdpdGggXCJQcm9wZXJ0eTo6XCJcbiAqIEBwYXJhbSBhdmFpbGFibGVGb3JBZGFwdGF0aW9uIERlY2lkZXMgd2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIGFkYXB0YXRpb25cbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkhlbHBlciBUaGUgYWdncmVnYXRpb25IZWxwZXIgZm9yIHRoZSBlbnRpdHlcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIG1hcCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb25cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHR5cGUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhciBmb3IgdGhlIGNvbHVtblxuICogQHBhcmFtIHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWUgVGhlIE1EQyBwYXRoIHVzZWQgZm9yIHRoZSAxOm4gcHJvcGVydHkgdG8gYWxsb3cgZmlsdGVyaW5nIGZyb20gTURDXG4gKiBAcmV0dXJucyBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gZGVmaW5pdGlvblxuICovXG5jb25zdCBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHVzZURhdGFGaWVsZFByZWZpeDogYm9vbGVhbixcblx0YXZhaWxhYmxlRm9yQWRhcHRhdGlvbjogYm9vbGVhbixcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0dGFibGVUeXBlPzogVGFibGVUeXBlLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm8/OiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRyZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlPzogc3RyaW5nXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4ge1xuXHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID0gZ2V0U2VtYW50aWNPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5KTtcblx0Y29uc3QgaXNIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihwcm9wZXJ0eSk7XG5cdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkubmFtZSA/IF9zbGljZUF0U2xhc2gocHJvcGVydHkubmFtZSwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHByb3BlcnR5Lm5hbWU7XG5cdGNvbnN0IGxhYmVsID0gZ2V0TGFiZWwocHJvcGVydHksIGlzR3JvdXApO1xuXHRjb25zdCBkYXRhVHlwZSA9IGdldERhdGFGaWVsZERhdGFUeXBlKHByb3BlcnR5KTtcblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhwcm9wZXJ0eSwgZGF0YVR5cGUpO1xuXHRjb25zdCBpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24gPSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0aXZlUGF0aF0gPT09IFwiRGVzY3JpcHRpb25cIjtcblx0Y29uc3Qgc29ydGFibGUgPVxuXHRcdCghaXNIaWRkZW4gfHwgaXNBUHJvcGVydHlGcm9tVGV4dE9ubHlBbm5vdGF0aW9uKSAmJiAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25Tb3J0YWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocmVsYXRpdmVQYXRoKTtcblx0Y29uc3QgaXNBbmFseXRpY2FsVGFibGUgPSBhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpICYmIHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIjtcblx0Y29uc3QgZmlsdGVyYWJsZSA9ICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmluY2x1ZGVzKHJlbGF0aXZlUGF0aCk7XG5cdC8vIGdyb3VwYWJsZSBwcm9wZXJ0aWVzIG9uIGFuIGFuYWx5dGljYWwgdGFibGUgc2hvdWxkIGNvbnNpZGVyIGhpZGRlbiBwcm9wZXJ0aWVzIGFuZCB0ZXh0IG9ubHkgYW5ub3RhdGlvbnMgYXMgb3RoZXIgdGFibGUgdHlwZXMgZG9cblx0Y29uc3QgZ3JvdXBhYmxlID0gaXNBbmFseXRpY2FsVGFibGVcblx0XHQ/ICEhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSkgJiYgKCFpc0hpZGRlbiB8fCBpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24pXG5cdFx0OiBzb3J0YWJsZTtcblx0Y29uc3QgdHlwZUNvbmZpZyA9IHtcblx0XHRjbGFzc05hbWU6IHByb3BlcnR5LnR5cGUgfHwgZGF0YVR5cGUsXG5cdFx0Zm9ybWF0T3B0aW9uczogcHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMsXG5cdFx0Y29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHR9O1xuXHRsZXQgZXhwb3J0U2V0dGluZ3M6IFByb3BlcnR5SW5mb1tcImV4cG9ydFNldHRpbmdzXCJdID0gbnVsbDtcblx0aWYgKF9pc0V4cG9ydGFibGVDb2x1bW4ocHJvcGVydHkpKSB7XG5cdFx0ZXhwb3J0U2V0dGluZ3MgPSBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyhwcm9wZXJ0eSwgcmVsYXRlZFByb3BlcnRpZXNJbmZvKTtcblx0fVxuXHRjb25zdCBhdmFpbGFiaWxpdHkgPSAhaXNIaWRkZW4gJiYgYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiA/IFwiQWRhcHRhdGlvblwiIDogXCJIaWRkZW5cIjtcblx0Y29uc3QgY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IF9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMocmVsYXRpdmVQYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0aWYgKHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWUpIHtcblx0XHRyZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlO1xuXHR9XG5cdGNvbnN0IG5hbWUgPSB1c2VEYXRhRmllbGRQcmVmaXggPyByZWxhdGl2ZVBhdGggOiBgUHJvcGVydHk6OiR7cmVsYXRpdmVQYXRofWA7XG5cdGNvbnN0IGtleSA9ICh1c2VEYXRhRmllbGRQcmVmaXggPyBcIkRhdGFGaWVsZDo6XCIgOiBcIlByb3BlcnR5OjpcIikgKyByZXBsYWNlU3BlY2lhbENoYXJzKHJlbGF0aXZlUGF0aCk7XG5cblx0Y29uc3QgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSB7XG5cdFx0a2V5OiBrZXksXG5cdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdGRhdGFUeXBlOiBkYXRhVHlwZSA/PyBwcm9wZXJ0eS50eXBlLFxuXHRcdGxhYmVsOiBsYWJlbCA/PyBwcm9wZXJ0eS5uYW1lLFxuXHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBnZXRMYWJlbChwcm9wZXJ0eSkgOiB1bmRlZmluZWQsXG5cdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiB1bmRlZmluZWQsXG5cdFx0YW5ub3RhdGlvblBhdGg6IGZ1bGxQcm9wZXJ0eVBhdGgsXG5cdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdGF2YWlsYWJpbGl0eTogYXZhaWxhYmlsaXR5LFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0c29ydGFibGU6IHNvcnRhYmxlLFxuXHRcdGZpbHRlcmFibGU6IGZpbHRlcmFibGUsXG5cdFx0aXNHcm91cGFibGU6IGdyb3VwYWJsZSxcblx0XHRpc0tleTogcHJvcGVydHkuaXNLZXksXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IGV4cG9ydFNldHRpbmdzLFxuXHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0eXBlQ29uZmlnOiB0eXBlQ29uZmlnIGFzIFByb3BlcnR5VHlwZUNvbmZpZyxcblx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCksXG5cdFx0cmVxdWlyZWQ6IGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgcHJvcGVydHksIHRhYmxlQ3JlYXRpb25Nb2RlKSxcblx0XHRhZGRpdGlvbmFsTGFiZWxzOiBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHNcblx0fTtcblx0X2FkZFRvb2xUaXAocHJvcGVydHksIGNvbHVtbik7XG5cdF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eSwgY29sdW1uKTtcblx0aWYgKGlzQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0c2V0VGVjaG5pY2FsRXh0ZW5zaW9uKGNvbHVtbiwgcHJvcGVydHksIGFnZ3JlZ2F0aW9uSGVscGVyLCBjb252ZXJ0ZXJDb250ZXh0LCByZWxhdGl2ZVBhdGgpO1xuXHR9XG5cdHJldHVybiBjb2x1bW47XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHRlY2huaWNhbCBleHRlbnNpb24gZm9yIGFuYWx5dGljcyBzY2VuYXJpb3MuXG4gKiBAcGFyYW0gY29sdW1uIFRoZSB0YWJsZSBjb2x1bW5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgbGlua2VkIHRvIHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkhlbHBlciBUaGUgYWdncmVnYXRpb24gaGVscGVyXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHByb3BlcnR5XG4gKi9cbmNvbnN0IHNldFRlY2huaWNhbEV4dGVuc2lvbiA9IGZ1bmN0aW9uIChcblx0Y29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4sXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nXG4pOiB2b2lkIHtcblx0Y29uc3QgaXNEcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgZHJhZnRQcm9wZXJ0aWVzID0gW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXTtcblx0Y29uc3QgaXNEcmFmdFByb3BlcnR5ID0gZHJhZnRQcm9wZXJ0aWVzLmluY2x1ZGVzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IGlzR3JvdXBhYmxlUHJvcGVydHkgPSAhIWFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHkpO1xuXHRpZiAoXG5cdFx0KGlzRHJhZnRTdXBwb3J0ZWQgJiYgaXNEcmFmdFByb3BlcnR5KSB8fFxuXHRcdC8vIGNvbHVtbi5pc0dyb3VwYWJsZSBjYW4gYmUgZmFsc2Ugd2hlbiB0aGUgcHJvcGVydHkgaXMgaGlkZGVuIGJ1dCBpdCBjb3VsZCBiZSB0ZWNobmljYWxseSBncm91cGFibGVcblx0XHQoaXNHcm91cGFibGVQcm9wZXJ0eSAmJiAhY29sdW1uLmlzR3JvdXBhYmxlKVxuXHQpIHtcblx0XHRjb2x1bW4uZXh0ZW5zaW9uID0ge1xuXHRcdFx0dGVjaG5pY2FsbHlBZ2dyZWdhdGFibGU6IGZhbHNlLFxuXHRcdFx0dGVjaG5pY2FsbHlHcm91cGFibGU6IHRydWVcblx0XHR9O1xuXHR9XG59O1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgZXhwb3J0IHNldHRpbmdzIGZvciBhIGdpdmVuIGNvbHVtbi5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGdpdmVuIGNvbHVtbiBmcm9tIGEgbGluZSBpdGVtIGFzIGEgZGF0YSBmaWVsZCBvciBhIHByb3BlcnR5IGZyb20gdGhlIGVudGl0eSB0eXBlXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgbGlua2VkIHRvIHRoZSBjb2x1bW4gKG5hbWVkIGFsc28gY29tcGxleCBwcm9wZXJ0eSlcbiAqIEByZXR1cm5zIFRoZSBleHBvcnQgc2V0dGluZ3MgaW4gYSB0aGUgZ2l2ZW4gY29sdW1uXG4gKi9cbmNvbnN0IGNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzID0gZnVuY3Rpb24gKFxuXHRjb2x1bW46IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvPzogQ29tcGxleFByb3BlcnR5SW5mb1xuKTogQ29sdW1uRXhwb3J0U2V0dGluZ3Mge1xuXHRsZXQgdW5pdFByb3BlcnR5LCB0aW1lem9uZVByb3BlcnR5LCB1bml0VGV4dCwgdGltZXpvbmVUZXh0LCB1dGMsIGlzQVRpbWV6b25lLCBjdXJyZW5jeVByb3BlcnR5LCBzY2FsZTtcblx0Y29uc3QgcmVsYXRlZFByb3BlcnR5TmFtZXMgPSByZWxhdGVkUHJvcGVydGllc0luZm8gPyBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcykgOiBbXTtcblx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyAmJiByZWxhdGVkUHJvcGVydHlOYW1lcz8ubGVuZ3RoID09PSAxKSB7XG5cdFx0Ly8gQ3JlYXRlIHRoZSBleHBvcnQgc2V0dGluZ3Mgb2YgYSBjb2x1bW4gYmFzZWQgb24gdGhlIHJlbGF0ZWQgKGNoaWxkKSBwcm9wZXJ0eSBpbiBjYXNlIHRoZXJlIGlzIG9ubHkgb25lLlxuXHRcdC8vIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiB3ZSBoYXZlIGEgdGV4dCBvbmx5IGFubm90YXRpb24gdG8gY29tcHV0ZSB0aGUgZXhwb3J0IHNldHRpbmdzIGZyb20gdGhlIHRleHQgaW5zdGVhZCBvZiB0aGUgdmFsdWVcblx0XHRjb2x1bW4gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lc1swXV0uYW5ub3RhdGlvblByb3BlcnR5O1xuXHR9XG5cdGNvbnN0IGlzQ29ubmVjdGVkRmllbGRzID1cblx0XHRpc0Fubm90YXRpb25PZlR5cGU8RGF0YUZpZWxkRm9yQW5ub3RhdGlvbj4oY29sdW1uLCBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSAmJlxuXHRcdGlzQW5ub3RhdGlvbk9mVGVybTxDb25uZWN0ZWRGaWVsZHM+KGNvbHVtbi5UYXJnZXQuJHRhcmdldCwgVUlBbm5vdGF0aW9uVGVybXMuQ29ubmVjdGVkRmllbGRzKTtcblx0Y29uc3QgZGF0YVR5cGUgPSBpc0Nvbm5lY3RlZEZpZWxkcyA/IFwiU3RyaW5nXCIgOiBnZXREYXRhRmllbGREYXRhVHlwZShjb2x1bW4pO1xuXHRpZiAoaXNQcm9wZXJ0eShjb2x1bW4pKSB7XG5cdFx0dW5pdFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdGN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdHRpbWV6b25lUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdHVuaXRUZXh0ID0gZ2V0U3RhdGljVW5pdE9yQ3VycmVuY3koY29sdW1uKTtcblx0XHR0aW1lem9uZVRleHQgPSBnZXRTdGF0aWNUaW1lem9uZShjb2x1bW4pO1xuXHRcdGlzQVRpbWV6b25lID0gaXNUaW1lem9uZShjb2x1bW4pO1xuXHRcdHNjYWxlID0gY29sdW1uLnNjYWxlO1xuXHR9XG5cdHVuaXRQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnVuaXRQcm9wZXJ0eSA/PyB1bml0UHJvcGVydHk/Lm5hbWUgPz8gY3VycmVuY3lQcm9wZXJ0eT8ubmFtZTtcblx0dGltZXpvbmVQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnRpbWV6b25lUHJvcGVydHkgPz8gdGltZXpvbmVQcm9wZXJ0eT8ubmFtZTtcblx0c2NhbGUgPSByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzPy5zY2FsZSA/PyBzY2FsZTtcblx0Y29uc3QgZXhwb3J0VHlwZSA9IGdldEV4cG9ydERhdGFUeXBlKGRhdGFUeXBlLCBpc0FUaW1lem9uZSwgISFjdXJyZW5jeVByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzKTtcblx0aWYgKHRpbWV6b25lUHJvcGVydHkgfHwgKGV4cG9ydFR5cGUgPT09IFwiRGF0ZVRpbWVcIiAmJiAhdGltZXpvbmVUZXh0KSkge1xuXHRcdHV0YyA9IGZhbHNlO1xuXHR9XG5cdGNvbnN0IGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IHtcblx0XHR0eXBlOiBleHBvcnRUeXBlLFxuXHRcdGlucHV0Rm9ybWF0OiBnZXREYXRlSW5wdXRGb3JtYXQoZGF0YVR5cGUpLFxuXHRcdGRlbGltaXRlcjogZ2V0RGVsaW1pdGVyKGRhdGFUeXBlKSxcblx0XHRzY2FsZTogc2NhbGUsXG5cdFx0dW5pdFByb3BlcnR5OiB1bml0UHJvcGVydHksXG5cdFx0dW5pdDogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy51bml0ID8/IHVuaXRUZXh0LFxuXHRcdHRpbWV6b25lUHJvcGVydHk6IHRpbWV6b25lUHJvcGVydHksXG5cdFx0dGltZXpvbmU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MudGltZXpvbmUgPz8gdGltZXpvbmVUZXh0Py50b1N0cmluZygpLFxuXHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlLFxuXHRcdC8vb25seSBpbiBjYXNlIG9mIGNvbXBsZXggcHJvcGVydGllcywgd3JhcCB0aGUgY2VsbCBjb250ZW50XHRvbiB0aGUgZXhjZWwgZXhwb3J0ZWQgZmlsZVxuXHRcdHdyYXA6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3Mud3JhcCxcblx0XHR1dGM6IHV0Yyxcblx0XHRwcm9wZXJ0eTogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy5wcm9wZXJ0eVxuXHR9O1xuXHRpZiAoZXhwb3J0U2V0dGluZ3MudW5pdFByb3BlcnR5IHx8IGV4cG9ydFNldHRpbmdzLnVuaXQpIHtcblx0XHRleHBvcnRTZXR0aW5ncy5hdXRvU2NhbGUgPSB0cnVlO1xuXHR9XG5cdHJldHVybiByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MoZXhwb3J0U2V0dGluZ3MpO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBleHBvcnQgZm9ybWF0IHRlbXBsYXRlIGZvciBjb2x1bW5zIHdpdGggZGF0ZXMuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uXG4gKiBAcmV0dXJucyBUaGUgaW5wdXRGb3JtYXRcbiAqL1xuY29uc3QgZ2V0RGF0ZUlucHV0Rm9ybWF0ID0gZnVuY3Rpb24gKGRhdGFUeXBlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGRhdGFUeXBlID09PSBcIkVkbS5EYXRlXCIgPyBcIllZWVktTU0tRERcIiA6IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZGVsaW1pdGVyIGluIG51bWVyaWMgY29sdW1ucy5cbiAqIFRoZSBkZWxpbWl0ZXIgaXMgdXNlZCB0byBkaXNwbGF5IHRob3VzYW5kcyBzZXBhcmF0b3IgaW4gbnVtZXJpYyBjb2x1bW5zLlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtblxuICogQHJldHVybnMgVHJ1ZSB0byBkaXNwbGF5IHRob3VzYW5kcyBzZXBhcmF0b3IgaW4gbnVtZXJpYyBjb2x1bW5zXG4gKi9cbmNvbnN0IGdldERlbGltaXRlciA9IGZ1bmN0aW9uIChkYXRhVHlwZT86IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZGF0YVR5cGUgPT09IFwiRWRtLkludDY0XCIgPyB0cnVlIDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHVuZGVmaW5lZCB2YWx1ZXMgZnJvbSB0aGUgZXhwb3J0IHNldHRpbmdzIG9iamVjdCBvZiBhIGNvbHVtbi5cbiAqIEBwYXJhbSBleHBvcnRTZXR0aW5ncyBUaGUgZXhwb3J0IHNldHRpbmdzIGNvbmZpZ3VyYXRpb25zIGZvciBhIGNvbHVtblxuICogQHJldHVybnMgVGhlIGV4cG9ydCBzZXR0aW5ncyBjb25maWd1cmF0aW9ucyB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXNcbiAqL1xuY29uc3QgcmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzID0gZnVuY3Rpb24gKGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyk6IENvbHVtbkV4cG9ydFNldHRpbmdzIHtcblx0Ly9SZW1vdmUgdW5kZWZpbmVkIHNldHRpbmdzIGZyb20gZXhwb3J0U2V0dGluZyBvYmplY3Rcblx0Zm9yIChjb25zdCBzZXR0aW5nIGluIGV4cG9ydFNldHRpbmdzKSB7XG5cdFx0aWYgKGV4cG9ydFNldHRpbmdzW3NldHRpbmcgYXMga2V5b2YgQ29sdW1uRXhwb3J0U2V0dGluZ3NdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGRlbGV0ZSBleHBvcnRTZXR0aW5nc1tzZXR0aW5nIGFzIGtleW9mIENvbHVtbkV4cG9ydFNldHRpbmdzXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGV4cG9ydFNldHRpbmdzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEJvb2xlYW4gdHJ1ZSBmb3IgZXhwb3J0YWJsZSBjb2x1bW5zLCBmYWxzZSBmb3Igbm9uIGV4cG9ydGFibGUgY29sdW1ucy5cbiAqIEBwYXJhbSBzb3VyY2UgVGhlIGRhdGFGaWVsZCBvciBwcm9wZXJ0eSB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFRydWUgZm9yIGV4cG9ydGFibGUgY29sdW1uLCBmYWxzZSBmb3Igbm9uIGV4cG9ydGFibGUgY29sdW1uXG4gKi9cbmZ1bmN0aW9uIF9pc0V4cG9ydGFibGVDb2x1bW4oc291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBib29sZWFuIHtcblx0bGV0IHByb3BlcnR5VHlwZSwgcHJvcGVydHk7XG5cdGNvbnN0IGRhdGFGaWVsZERlZmF1bHRQcm9wZXJ0eSA9IChzb3VyY2UgYXMgUHJvcGVydHkpLmFubm90YXRpb25zLlVJPy5EYXRhRmllbGREZWZhdWx0O1xuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0aWYgKGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHNvdXJjZSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cHJvcGVydHlUeXBlID0gZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5Py4kVHlwZTtcblx0fSBlbHNlIGlmIChpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGVsc2Uge1xuXHRcdHByb3BlcnR5ID0gc291cmNlO1xuXHRcdHByb3BlcnR5VHlwZSA9IHByb3BlcnR5LiRUeXBlO1xuXHRcdGlmIChwcm9wZXJ0eVR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiYgKHByb3BlcnR5IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdC8vRm9yIENoYXJ0XG5cdFx0XHRwcm9wZXJ0eVR5cGUgPSAocHJvcGVydHkgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZTtcblx0XHRcdHJldHVybiBwcm9wZXJ0eVR5cGUgIT09IHVuZGVmaW5lZCAmJiAhVUlBbm5vdGF0aW9uVHlwZXMuQ2hhcnREZWZpbml0aW9uVHlwZS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHQocHJvcGVydHkgYXMgRGF0YUZpZWxkKS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk1lZGlhVHlwZT8udGVybSA9PT0gXCJPcmcuT0RhdGEuQ29yZS5WMS5NZWRpYVR5cGVcIiAmJlxuXHRcdFx0KHByb3BlcnR5IGFzIERhdGFGaWVsZCkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5pc1VSTCAhPT0gdHJ1ZVxuXHRcdCkge1xuXHRcdFx0Ly9Gb3IgU3RyZWFtXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVcblx0XHQ/ICFbXG5cdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbixcblx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb25Hcm91cFxuXHRcdCAgXS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUpXG5cdFx0OiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgQm9vbGVhbiB0cnVlIGZvciB2YWxpZCBjb2x1bW5zLCBmYWxzZSBmb3IgaW52YWxpZCBjb2x1bW5zLlxuICogQHBhcmFtIGRhdGFGaWVsZCBEaWZmZXJlbnQgRGF0YUZpZWxkIHR5cGVzIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBUcnVlIGZvciB2YWxpZCBjb2x1bW5zLCBmYWxzZSBmb3IgaW52YWxpZCBjb2x1bW5zXG4gKi9cbmNvbnN0IF9pc1ZhbGlkQ29sdW1uID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGJvb2xlYW4ge1xuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmV0dXJuICEhZGF0YUZpZWxkLklubGluZTtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0Ly8gVG9kbzogUmVwbGFjZSB3aXRoIHByb3BlciBMb2cgc3RhdGVtZW50IG9uY2UgYXZhaWxhYmxlXG5cdFx0XHQvLyAgdGhyb3cgbmV3IEVycm9yKFwiVW5oYW5kbGVkIERhdGFGaWVsZCBBYnN0cmFjdCB0eXBlOiBcIiArIGRhdGFGaWVsZC4kVHlwZSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmluZGluZyBleHByZXNzaW9uIHRvIGV2YWx1YXRlIHRoZSB2aXNpYmlsaXR5IG9mIGEgRGF0YUZpZWxkIG9yIERhdGFQb2ludCBhbm5vdGF0aW9uLlxuICpcbiAqIFNBUCBGaW9yaSBlbGVtZW50cyB3aWxsIGV2YWx1YXRlIGVpdGhlciB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZGVmaW5lZCBvbiB0aGUgYW5ub3RhdGlvbiBpdHNlbGYgb3Igb24gdGhlIHRhcmdldCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGRNb2RlbFBhdGggVGhlIG1ldGFwYXRoIHJlZmVycmluZyB0byB0aGUgYW5ub3RhdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCBieSBTQVAgRmlvcmkgZWxlbWVudHMuXG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uIHRoYXQgeW91IGNhbiBiaW5kIHRvIHRoZSBVSS5cbiAqL1xuY29uc3QgX2dldFZpc2libGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGRNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcz5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IHRhcmdldE9iamVjdCA9IGRhdGFGaWVsZE1vZGVsUGF0aC50YXJnZXRPYmplY3Q7XG5cdGxldCBwcm9wZXJ0eVZhbHVlO1xuXHRpZiAodGFyZ2V0T2JqZWN0KSB7XG5cdFx0c3dpdGNoICh0YXJnZXRPYmplY3QuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRcdC8vIGlmIGl0IGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIERhdGFQb2ludCB3ZSBsb29rIGF0IHRoZSBkYXRhUG9pbnQncyB2YWx1ZVxuXHRcdFx0XHRpZiAodGFyZ2V0T2JqZWN0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5UYXJnZXQuJHRhcmdldD8uVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkID0gLypmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IFVJLklzRXhwYW5kZWQgOiovIGNvbnN0YW50KGZhbHNlKTtcblx0Y29uc3QgaXNBbmFseXRpY2FsTGVhZiA9IC8qZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBlcXVhbChVSS5Ob2RlTGV2ZWwsIDApIDoqLyBjb25zdGFudChmYWxzZSk7XG5cdC8vIEEgZGF0YSBmaWVsZCBpcyB2aXNpYmxlIGlmOlxuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBwcm9wZXJ0eSBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSBpbiBjYXNlIG9mIEFuYWx5dGljcyBpdCdzIG5vdCB2aXNpYmxlIGZvciBhbiBleHBhbmRlZCBHcm91cEhlYWRlclxuXHRyZXR1cm4gYW5kKFxuXHRcdC4uLltcblx0XHRcdG5vdChlcXVhbChnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0ISFwcm9wZXJ0eVZhbHVlLFxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlICYmIG5vdChlcXVhbChnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ocHJvcGVydHlWYWx1ZS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSxcblx0XHRcdFx0dHJ1ZVxuXHRcdFx0KSxcblx0XHRcdG9yKG5vdChpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkKSwgaXNBbmFseXRpY2FsTGVhZilcblx0XHRdXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgaGlkZGVuIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGEgZmllbGQgZ3JvdXAgb3IgY29ubmVjdGVkIGZpZWxkcy5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBDb21waWxlIGJpbmRpbmcgb2YgZmllbGQgZ3JvdXAvY29ubmVjdGVkIGZpZWxkcyBleHByZXNzaW9ucy5cbiAqL1xuY29uc3QgX2dldEhpZGRlbkV4cHJlc3Npb25zID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgY29sbGVjdGlvbkZpZWxkc0hpZGRlbkV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cblx0aWYgKFxuXHRcdGlzQW5ub3RhdGlvbk9mVHlwZTxEYXRhRmllbGRGb3JBbm5vdGF0aW9uPihkYXRhRmllbGQsIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pICYmXG5cdFx0KGlzQW5ub3RhdGlvbk9mVGVybTxDb25uZWN0ZWRGaWVsZHM+KGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCwgVUlBbm5vdGF0aW9uVGVybXMuQ29ubmVjdGVkRmllbGRzKSB8fFxuXHRcdFx0aXNBbm5vdGF0aW9uT2ZUZXJtPEZpZWxkR3JvdXA+KGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCwgVUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cCkpXG5cdCkge1xuXHRcdGlmIChkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24obm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhRmllbGQuYW5ub3RhdGlvbnMuVUkuSGlkZGVuKSwgdHJ1ZSkpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkRhdGEgPSBoYXNGaWVsZEdyb3VwVGFyZ2V0KGRhdGFGaWVsZClcblx0XHRcdFx0PyAoZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGFcblx0XHRcdFx0OiBnZXRDb25uZWN0ZWRGaWVsZHNEYXRhKGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCBhcyBDb25uZWN0ZWRGaWVsZHMpO1xuXHRcdFx0Y29sbGVjdGlvbkRhdGE/LmZvckVhY2goKGlubmVyRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzKSA9PiB7XG5cdFx0XHRcdGNvbGxlY3Rpb25GaWVsZHNIaWRkZW5FeHByZXNzaW9uLnB1c2goXG5cdFx0XHRcdFx0X2dldFZpc2libGVFeHByZXNzaW9uKHsgdGFyZ2V0T2JqZWN0OiBpbm5lckRhdGFGaWVsZCB9IGFzIERhdGFNb2RlbE9iamVjdFBhdGg8XG5cdFx0XHRcdFx0XHREYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzXG5cdFx0XHRcdFx0Pilcblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShvciguLi5jb2xsZWN0aW9uRmllbGRzSGlkZGVuRXhwcmVzc2lvbiksIGNvbnN0YW50KHRydWUpLCBjb25zdGFudChmYWxzZSkpKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHByb3BlcnR5IGFuZCBkYXRhRmllbGQuXG4gKiBAcGFyYW0gW3Byb3BlcnR5XSBQcm9wZXJ0eSwgRGF0YUZpZWxkLCBvciBOYXZpZ2F0aW9uIFByb3BlcnR5IGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcGFyYW0gaXNHcm91cFxuICogQHJldHVybnMgTGFiZWwgb2YgdGhlIHByb3BlcnR5IG9yIERhdGFGaWVsZFxuICovXG5jb25zdCBnZXRMYWJlbCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5LCBpc0dyb3VwID0gZmFsc2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoaXNQcm9wZXJ0eShwcm9wZXJ0eSkgfHwgaXNOYXZpZ2F0aW9uUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdCA9IChwcm9wZXJ0eSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0O1xuXHRcdGlmIChkYXRhRmllbGREZWZhdWx0ICYmICFkYXRhRmllbGREZWZhdWx0LnF1YWxpZmllciAmJiBkYXRhRmllbGREZWZhdWx0LkxhYmVsKSB7XG5cdFx0XHRyZXR1cm4gZGF0YUZpZWxkRGVmYXVsdC5MYWJlbD8udG9TdHJpbmcoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnRvU3RyaW5nKCkgPz8gcHJvcGVydHkubmFtZTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHByb3BlcnR5KSkge1xuXHRcdGlmICghIWlzR3JvdXAgJiYgcHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBwcm9wZXJ0eT8uTGFiZWw/LnRvU3RyaW5nKCk7XG5cdFx0fVxuXHRcdHJldHVybiAoXG5cdFx0XHRwcm9wZXJ0eT8uTGFiZWw/LnRvU3RyaW5nKCkgPz9cblx0XHRcdGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ocHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsLCBbXSwgcHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/Lm5hbWUpXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdGlmIChwcm9wZXJ0eS5MYWJlbD8udG9TdHJpbmcoKSkge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5LkxhYmVsPy50b1N0cmluZygpO1xuXHRcdH1cblx0XHRjb25zdCB0YXJnZXQgPSBwcm9wZXJ0eS5UYXJnZXQuJHRhcmdldDtcblx0XHRzd2l0Y2ggKHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdC8vIGlmIGl0IGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIERhdGFQb2ludCB3ZSBsb29rIGF0IHRoZSBkYXRhUG9pbnQncyBsYWJlbFxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlOlxuXHRcdFx0XHRpZiAodGFyZ2V0Py5WYWx1ZT8uJHRhcmdldCkge1xuXHRcdFx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odGFyZ2V0LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHQvLyBpZiBpdCBpcyBhIERhdGFGaWVsZEZvckFubm90YXRpb24gcG9pbnRpbmcgdG8gYSBGaWVsZEdyb3VwIG9yIGEgQ29ubmVjdGVkRmllbGRzIHdlIGxvb2sgYXQgdGhlIGRhdGFGaWVsZEFic3RyYWN0J3MgbGFiZWxcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGU6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkNvbm5lY3RlZEZpZWxkc1R5cGU6XG5cdFx0XHRcdHJldHVybiB0YXJnZXQuTGFiZWw/LnRvU3RyaW5nKCkgPz8gXCJcIjtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gcHJvcGVydHkuTGFiZWw/LnRvU3RyaW5nKCk7XG5cdH1cbn07XG5cbmNvbnN0IF9nZXRUb29sdGlwID0gZnVuY3Rpb24gKHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFzb3VyY2UpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkgfHwgc291cmNlLmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mbykge1xuXHRcdHJldHVybiBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihzb3VyY2UuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gc291cmNlLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHNvdXJjZS5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8pKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoc291cmNlLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgZGF0YXBvaW50VGFyZ2V0ID0gc291cmNlLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQ7XG5cdFx0cmV0dXJuIGRhdGFwb2ludFRhcmdldD8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oZGF0YXBvaW50VGFyZ2V0LlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShjb2xOYW1lOiBzdHJpbmcsIGlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXA/OiBib29sZWFuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRwYXRoSW5Nb2RlbChgc2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcmAsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRwYXRoSW5Nb2RlbChgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRjb2xOYW1lLFxuXHRcdFx0aXNTZW1hbnRpY0tleUluRmllbGRHcm91cFxuXHRcdF0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLmdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXJcblx0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvcGVydHlJbmZvIGZvciBlYWNoIGlkZW50aWZpZWQgcHJvcGVydHkgY29uc3VtZWQgYnkgYSBMaW5lSXRlbS5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgSWRlbnRpZmllZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZm9yIExpbmVJdGVtcyBhbmQgUHJvcGVydGllcyBvZiBlbnRpdHlUeXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGZvciB0aGUgTGluZUl0ZW1cbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIHRleHQgb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24uXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0eXBlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQuXG4gKi9cbmNvbnN0IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGV4aXN0aW5nQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHR0YWJsZVR5cGU/OiBUYWJsZVR5cGUsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgcmVsYXRlZENvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KGRhdGFNb2RlbE9iamVjdFBhdGgsIG5hbWUpO1xuXHRcdGlmIChpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eU9iamVjdFBhdGgpKSB7XG5cdFx0XHRjb25zdCBuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChwcm9wZXJ0eU9iamVjdFBhdGgsIGZhbHNlLCB0cnVlKTtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0bmV3TmFtZVJlbGF0aXZlVGFyZ2V0UGF0aFxuXHRcdFx0KTtcblx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSBuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoID8/IG5hbWU7XG5cdFx0fSBlbHNlIGlmIChyZWxhdGVkQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIENhc2UgMTogS2V5IGNvbnRhaW5zIERhdGFGaWVsZCBwcmVmaXggdG8gZW5zdXJlIGFsbCBwcm9wZXJ0eSBjb2x1bW5zIGhhdmUgdGhlIHNhbWUga2V5IGZvcm1hdC5cblx0XHRcdC8vIE5ldyBjcmVhdGVkIHByb3BlcnR5IGNvbHVtbiBpcyBzZXQgdG8gaGlkZGVuLlxuXHRcdFx0Y29uc3QgY29sdW1uID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0KTtcblx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHR9IGVsc2UgaWYgKHJlbGF0ZWRDb2x1bW4uYW5ub3RhdGlvblBhdGggIT09IGFubm90YXRpb25QYXRoIHx8IHJlbGF0ZWRDb2x1bW4ucHJvcGVydHlJbmZvcykge1xuXHRcdFx0Ly8gQ2FzZSAyOiBUaGUgZXhpc3RpbmcgY29sdW1uIHBvaW50cyB0byBhIExpbmVJdGVtIChvcilcblx0XHRcdC8vIENhc2UgMzogVGhpcyBpcyBhIHNlbGYgcmVmZXJlbmNlIGZyb20gYW4gZXhpc3RpbmcgY29sdW1uXG5cdFx0XHRjb25zdCBuZXdOYW1lID0gYFByb3BlcnR5Ojoke25hbWV9YDtcblx0XHRcdC8vIENoZWNraW5nIHdoZXRoZXIgdGhlIHJlbGF0ZWQgcHJvcGVydHkgY29sdW1uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIGl0ZXJhdGlvbi5cblx0XHRcdGlmICghZXhpc3RpbmdDb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5ld05hbWUpKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBjb2x1bW4gd2l0aCAnUHJvcGVydHk6OicgcHJlZml4LFxuXHRcdFx0XHQvLyBTZXQgaXQgdG8gaGlkZGVuIGFzIGl0IGlzIG9ubHkgY29uc3VtZWQgYnkgQ29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdFx0Y29uc3QgY29sdW1uID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdGV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSAmJlxuXHRcdFx0XHRleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ucHJvcGVydHlJbmZvcz8uaW5jbHVkZXMobmFtZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Ly8gVGhlIHByb3BlcnR5ICduYW1lJyBoYXMgYmVlbiBwcmVmaXhlZCB3aXRoICdQcm9wZXJ0eTo6JyBmb3IgdW5pcXVlbmVzcy5cblx0Ly8gVXBkYXRlIHRoZSBzYW1lIGluIG90aGVyIHByb3BlcnR5SW5mb3NbXSByZWZlcmVuY2VzIHdoaWNoIHBvaW50IHRvIHRoaXMgcHJvcGVydHkuXG5cdGV4aXN0aW5nQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb2x1bW4ucHJvcGVydHlJbmZvcyA9IGNvbHVtbi5wcm9wZXJ0eUluZm9zPy5tYXAoKHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mbyk7XG5cdFx0Y29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zPy5tYXAoXG5cdFx0XHQocHJvcGVydHlJbmZvKSA9PiByZWxhdGVkUHJvcGVydHlOYW1lTWFwW3Byb3BlcnR5SW5mb10gPz8gcHJvcGVydHlJbmZvXG5cdFx0KTtcblx0fSk7XG5cdHJldHVybiByZWxhdGVkQ29sdW1ucztcbn07XG5cbi8qKlxuICogR2V0dGluZyB0aGUgQ29sdW1uIE5hbWVcbiAqIElmIGl0IHBvaW50cyB0byBhIERhdGFGaWVsZCB3aXRoIG9uZSBwcm9wZXJ0eSBvciBEYXRhUG9pbnQgd2l0aCBvbmUgcHJvcGVydHksIGl0IHdpbGwgdXNlIHRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBoZXJlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZXhpc3RpbmcgZmxleCBjaGFuZ2VzLlxuICogQHBhcmFtIGRhdGFGaWVsZCBEaWZmZXJlbnQgRGF0YUZpZWxkIHR5cGVzIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiBhbm5vdGF0aW9uIGNvbHVtbnNcbiAqL1xuY29uc3QgX2dldEFubm90YXRpb25Db2x1bW5OYW1lID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IHN0cmluZyB7XG5cdC8vIFRoaXMgaXMgbmVlZGVkIGFzIHdlIGhhdmUgZmxleGliaWxpdHkgY2hhbmdlcyBhbHJlYWR5IHRoYXQgd2UgaGF2ZSB0byBjaGVjayBhZ2FpbnN0XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgZGF0YUZpZWxkLlZhbHVlPy5wYXRoKSB7XG5cdFx0cmV0dXJuIGRhdGFGaWVsZC5WYWx1ZT8ucGF0aDtcblx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiYgKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LnBhdGgpIHtcblx0XHQvLyBUaGlzIGlzIGZvciByZW1vdmluZyBkdXBsaWNhdGUgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsICdQcm9ncmVzcycgUHJvcGVydHkgaXMgcmVtb3ZlZCBpZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBEYXRhUG9pbnRcblx0XHRyZXR1cm4gKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWUucGF0aDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHR9XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGEgZmllbGQgbGFiZWxzIGhhdmUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cbiAqIEBwYXJhbSBmaWVsZEdyb3VwTmFtZSBUaGUgYERhdGFGaWVsZGAgbmFtZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBgc2hvd0RhdGFGaWVsZHNMYWJlbGAgdmFsdWUgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuY29uc3QgX2dldFNob3dEYXRhRmllbGRzTGFiZWwgPSBmdW5jdGlvbiAoXG5cdGZpZWxkR3JvdXBOYW1lOiBzdHJpbmcsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGNvbHVtbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb248VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24+KHZpc3VhbGl6YXRpb25QYXRoKT8uY29sdW1ucztcblx0Y29uc3QgY29sdW1uS2V5cyA9IGNvbHVtbnMgJiYgT2JqZWN0LmtleXMoY29sdW1ucyk7XG5cdHJldHVybiAoXG5cdFx0Y29sdW1uS2V5cyAmJlxuXHRcdCEhY29sdW1uS2V5cy5maW5kKGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIGtleSA9PT0gZmllbGRHcm91cE5hbWUgJiYgKGNvbHVtbnNba2V5XSBhcyBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSkuc2hvd0RhdGFGaWVsZHNMYWJlbDtcblx0XHR9KVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHJlc3BlY3QgdG8gdGhlIHJvb3QgZW50aXR5LlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgYERhdGFGaWVsZGAgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhcbiAqL1xuY29uc3QgX2dldFJlbGF0aXZlUGF0aCA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBzdHJpbmcge1xuXHRsZXQgcmVsYXRpdmVQYXRoID0gXCJcIjtcblx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LnBhdGg7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSBkYXRhRmllbGQ/LlRhcmdldD8udmFsdWU7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbkdyb3VwOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIHJlbGF0aXZlUGF0aDtcbn07XG5cbmNvbnN0IF9zbGljZUF0U2xhc2ggPSBmdW5jdGlvbiAocGF0aDogc3RyaW5nLCBpc0xhc3RTbGFzaDogYm9vbGVhbiwgaXNMYXN0UGFydDogYm9vbGVhbik6IHN0cmluZyB7XG5cdGNvbnN0IGlTbGFzaEluZGV4ID0gaXNMYXN0U2xhc2ggPyBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSA6IHBhdGguaW5kZXhPZihcIi9cIik7XG5cdGlmIChpU2xhc2hJbmRleCA9PT0gLTEpIHtcblx0XHRyZXR1cm4gcGF0aDtcblx0fVxuXHRyZXR1cm4gaXNMYXN0UGFydCA/IHBhdGguc3Vic3RyaW5nKGlTbGFzaEluZGV4ICsgMSwgcGF0aC5sZW5ndGgpIDogcGF0aC5zdWJzdHJpbmcoMCwgaVNsYXNoSW5kZXgpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBjb2x1bW4gY29udGFpbnMgYSBtdWx0aS12YWx1ZSBmaWVsZC5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIERhdGFGaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgRGF0YUZpZWxkIGNvcnJlc3BvbmRzIHRvIGEgbXVsdGktdmFsdWUgZmllbGQuXG4gKi9cbmNvbnN0IF9pc0NvbHVtbk11bHRpVmFsdWVkID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogYm9vbGVhbiB7XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLlZhbHVlKSkge1xuXHRcdGNvbnN0IHByb3BlcnR5T2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4oXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHRcdGRhdGFGaWVsZC5WYWx1ZS5wYXRoXG5cdFx0KTtcblx0XHRyZXR1cm4gaXNNdWx0aVZhbHVlRmllbGQocHJvcGVydHlPYmplY3RQYXRoKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2x1bW4gaXMgc29ydGFibGUuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBkYXRhIGZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIG5vblNvcnRhYmxlQ29sdW1ucyBDb2xsZWN0aW9uIG9mIG5vbi1zb3J0YWJsZSBjb2x1bW4gbmFtZXMgYXMgcGVyIGFubm90YXRpb25cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtblxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlXG4gKi9cbmNvbnN0IF9pc0NvbHVtblNvcnRhYmxlID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdCFub25Tb3J0YWJsZUNvbHVtbnMuaW5jbHVkZXMocHJvcGVydHlQYXRoKSAmJiAvLyBDb2x1bW4gaXMgbm90IG1hcmtlZCBhcyBub24tc29ydGFibGUgdmlhIGFubm90YXRpb25cblx0XHQoKChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fCBkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pICYmXG5cdFx0XHRPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcykuc29tZSgocHJvcE5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3QgaXNIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1twcm9wTmFtZV0uYW5ub3RhdGlvblByb3BlcnR5KTtcblx0XHRcdFx0cmV0dXJuICFpc0hpZGRlbiAmJiAhbm9uU29ydGFibGVDb2x1bW5zLmluY2x1ZGVzKHByb3BOYW1lKTtcblx0XHRcdH0pKSB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24gfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbilcblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGZpbHRlcmluZyBvbiB0aGUgdGFibGUgaXMgY2FzZSBzZW5zaXRpdmUuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBSZXR1cm5zICdmYWxzZScgaWYgRmlsdGVyRnVuY3Rpb25zIGFubm90YXRpb24gc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuICovXG5leHBvcnQgY29uc3QgaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gZnVuY3Rpb24gKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJGdW5jdGlvbnM6IEZpbHRlckZ1bmN0aW9ucyB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGdW5jdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdHJldHVybiBNb2RlbEhlbHBlci5pc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUodW5kZWZpbmVkLCBmaWx0ZXJGdW5jdGlvbnMpO1xufTtcblxuZnVuY3Rpb24gX2dldEZpbHRlckZ1bmN0aW9ucyhDb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBDb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRpZiAoVHlwZUd1YXJkcy5pc0VudGl0eVNldChlbnRpdHlTZXQpKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9ucyA/P1xuXHRcdFx0Q29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9uc1xuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgZm9yIHRleHQgZmllbGRzIGluIGEgdGFibGUuXG4gKiBAcGFyYW0gZm9ybWF0T3B0aW9uc1xuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBmb3JtYXQgb3B0aW9ucyB3aXRoIGRlZmF1bHQgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKGZvcm1hdE9wdGlvbnM6IEZvcm1hdE9wdGlvbnNUeXBlIHwgdW5kZWZpbmVkKTogRm9ybWF0T3B0aW9uc1R5cGUgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZm9ybWF0T3B0aW9ucyA9PT0gdW5kZWZpbmVkXG5cdFx0PyB1bmRlZmluZWRcblx0XHQ6IHtcblx0XHRcdFx0dGV4dExpbmVzRWRpdDogNCxcblx0XHRcdFx0Li4uZm9ybWF0T3B0aW9uc1xuXHRcdCAgfTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRTZW1hbnRpY0tleVZhbHVlcyhzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5LCBuYW1lOiBzdHJpbmcpOiB7IHZhbHVlczogc3RyaW5nW107IHNlbWFudGljS2V5Rm91bmQ6IGJvb2xlYW4gfSB7XG5cdGNvbnN0IGFTZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW10gPSBbXTtcblx0bGV0IGJTZW1hbnRpY0tleUZvdW5kID0gZmFsc2U7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0YVNlbWFudGljS2V5VmFsdWVzLnB1c2goc2VtYW50aWNLZXlzW2ldLnZhbHVlKTtcblx0XHRpZiAoc2VtYW50aWNLZXlzW2ldLnZhbHVlID09PSBuYW1lKSB7XG5cdFx0XHRiU2VtYW50aWNLZXlGb3VuZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0dmFsdWVzOiBhU2VtYW50aWNLZXlWYWx1ZXMsXG5cdFx0c2VtYW50aWNLZXlGb3VuZDogYlNlbWFudGljS2V5Rm91bmRcblx0fTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRQcm9wZXJ0aWVzKFxuXHRzZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW10sXG5cdGZpZWxkR3JvdXBQcm9wZXJ0aWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0ge1xuXHRsZXQgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IGZhbHNlO1xuXHRsZXQgc1Byb3BlcnR5UGF0aDtcblx0aWYgKHNlbWFudGljS2V5VmFsdWVzICYmIHNlbWFudGljS2V5VmFsdWVzLmxlbmd0aCA+PSAxICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzLmxlbmd0aCA+PSAxKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKFtzZW1hbnRpY0tleVZhbHVlc1tpXV0uc29tZSgodG1wKSA9PiBmaWVsZEdyb3VwUHJvcGVydGllcy5pbmNsdWRlcyh0bXApKSkge1xuXHRcdFx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwID0gdHJ1ZTtcblx0XHRcdFx0c1Byb3BlcnR5UGF0aCA9IHNlbWFudGljS2V5VmFsdWVzW2ldO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwLFxuXHRcdGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg6IHNQcm9wZXJ0eVBhdGhcblx0fTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBmaXJzdCBwcm9wZXJ0eSBpbiB0aGUgZmllbGRHcm91cCB0aGF0IGlzIHBhcnQgb2YgdGhlIHNlbWFudGljIGtleXMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkR3JvdXBcbiAqIEBwYXJhbSBzZW1hbnRpY0tleVZhbHVlc1xuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBmbGFnIHRydWUgaWYgYSBwcm9wZXJ0eSBpcyBmb3VuZCBhbmQgYSBwcm9wZXJ0eVBhdGguXG4gKi9cbmZ1bmN0aW9uIF9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAoXG5cdGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgbnVsbCxcblx0c2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdXG4pOiB7IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IGJvb2xlYW47IHByb3BlcnR5UGF0aD86IHN0cmluZyB9IHtcblx0Ly8gdGhpcyBpbmZvIGlzIHVzZWQgaW4gRmllbGRIZWxwZXIjaXNEcmFmdEluZGljYXRvclZpc2libGVJbkZpZWxkR3JvdXAgdG8gc2hvdyBhIGRyYWZ0IGluZGljYXRvciBhdCB0aGUgZW5kIG9mIGEgZmllbGQgZ3JvdXBcblx0Y29uc3QgYVByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdGxldCBfcHJvcGVydGllc0ZvdW5kOiB7IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IGJvb2xlYW47IGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSA9IHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBmYWxzZSxcblx0XHRmaWVsZEdyb3VwUHJvcGVydHlQYXRoOiB1bmRlZmluZWRcblx0fTtcblx0aWYgKFxuXHRcdGRhdGFGaWVsZEdyb3VwICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fCBpbm5lckRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybCkgJiZcblx0XHRcdFx0aW5uZXJEYXRhRmllbGQuVmFsdWVcblx0XHRcdCkge1xuXHRcdFx0XHRhUHJvcGVydGllcy5wdXNoKGlubmVyRGF0YUZpZWxkLlZhbHVlLnBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0X3Byb3BlcnRpZXNGb3VuZCA9IF9maW5kUHJvcGVydGllcyhzZW1hbnRpY0tleVZhbHVlcywgYVByb3BlcnRpZXMpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogX3Byb3BlcnRpZXNGb3VuZC5zZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwLFxuXHRcdHByb3BlcnR5UGF0aDogX3Byb3BlcnRpZXNGb3VuZC5maWVsZEdyb3VwUHJvcGVydHlQYXRoXG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIHdpdGggZHJhZnRJbmRpY2F0b3IgZm9yIGEgY29sdW1uLlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBzZW1hbnRpY0tleXNcbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cFxuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBmb3JtYXQgb3B0aW9ucyB3aXRoIGRlZmF1bHQgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihcblx0bmFtZTogc3RyaW5nLFxuXHRzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5LFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGxcbik6IFBhcnRpYWw8e1xuXHRmaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGg6IHN0cmluZztcblx0ZmllbGRHcm91cE5hbWU6IHN0cmluZztcblx0c2hvd0Vycm9yT2JqZWN0U3RhdHVzOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0aGFzRHJhZnRJbmRpY2F0b3I6IGJvb2xlYW47XG59PiB7XG5cdGlmICghc2VtYW50aWNLZXlzKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cdGNvbnN0IHNlbWFudGljS2V5ID0gX2ZpbmRTZW1hbnRpY0tleVZhbHVlcyhzZW1hbnRpY0tleXMsIG5hbWUpO1xuXHRjb25zdCBzZW1hbnRpY0tleUluRmllbGRHcm91cCA9IF9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAoZGF0YUZpZWxkR3JvdXAsIHNlbWFudGljS2V5LnZhbHVlcyk7XG5cdGlmIChzZW1hbnRpY0tleUluRmllbGRHcm91cC5zZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwKSB7XG5cdFx0Ly8gU2VtYW50aWMgS2V5IGhhcyBhIHByb3BlcnR5IGluIGEgRmllbGRHcm91cFxuXHRcdHJldHVybiB7XG5cdFx0XHQvL1RPRE8gd2Ugc2hvdWxkIHJhdGhlciBzdG9yZSBoYXNTZW1hbnRpY0tleUluRmllbGRHcm91cFxuXHRcdFx0ZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoOiBzZW1hbnRpY0tleUluRmllbGRHcm91cC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRmaWVsZEdyb3VwTmFtZTogbmFtZSxcblx0XHRcdHNob3dFcnJvck9iamVjdFN0YXR1czogY29tcGlsZUV4cHJlc3Npb24oZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShuYW1lLCB0cnVlKSlcblx0XHR9O1xuXHR9IGVsc2UgaWYgKHNlbWFudGljS2V5LnNlbWFudGljS2V5Rm91bmQpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aGFzRHJhZnRJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRzaG93RXJyb3JPYmplY3RTdGF0dXM6IGNvbXBpbGVFeHByZXNzaW9uKGdldFJvd1N0YXR1c1Zpc2liaWxpdHkobmFtZSwgZmFsc2UpKVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBfZ2V0SW1wTnVtYmVyKGRhdGFGaWVsZDogRGF0YUZpZWxkVHlwZXMpOiBudW1iZXIge1xuXHRjb25zdCBpbXBvcnRhbmNlID0gZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UgYXMgc3RyaW5nO1xuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvSGlnaFwiKSkge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cdGlmIChpbXBvcnRhbmNlICYmIGltcG9ydGFuY2UuaW5jbHVkZXMoXCJVSS5JbXBvcnRhbmNlVHlwZS9NZWRpdW1cIikpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTG93XCIpKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblx0cmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZDogRGF0YUZpZWxkVHlwZXMpOiBJbXBvcnRhbmNlIHtcblx0Y29uc3QgaW1wb3J0YW5jZSA9IGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlIGFzIHN0cmluZztcblx0cmV0dXJuIGltcG9ydGFuY2UgPyAoaW1wb3J0YW5jZS5zcGxpdChcIi9cIilbMV0gYXMgSW1wb3J0YW5jZSkgOiBJbXBvcnRhbmNlLk5vbmU7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgZXhwb3J0IHNldHRpbmdzIG9mIGEgY29sdW1uIGNvbnRhaW5pbmcgZGF0YXBvaW50cy5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBvbiBhIGdpdmVuIGNvbHVtblxuICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIHRvIGJlIHVwZGF0ZWRcbiAqL1xuZnVuY3Rpb24gX3NldEV4cG9ydFNldHRpbmdzRm9yRGF0YVBvaW50KHByb3BlcnR5OiBQcm9wZXJ0eSwgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4pOiB2b2lkIHtcblx0Y29uc3QgdGFyZ2V0VmFsdWVmcm9tRFAgPSBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHByb3BlcnR5KTtcblx0aWYgKFxuXHRcdGlzRGF0YVBvaW50RnJvbURhdGFGaWVsZERlZmF1bHQocHJvcGVydHkpICYmXG5cdFx0dHlwZW9mIHRhcmdldFZhbHVlZnJvbURQID09PSBcInN0cmluZ1wiICYmXG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzICYmXG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzPy51bml0ICE9PSBcIiVcIlxuXHQpIHtcblx0XHRjb2x1bW4uZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWUgPSB0YXJnZXRWYWx1ZWZyb21EUDtcblx0XHRjb2x1bW4uZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUgPSBcInswfS9cIiArIHRhcmdldFZhbHVlZnJvbURQO1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRNYXhJbXBvcnRhbmNlKGZpZWxkczogRGF0YUZpZWxkVHlwZXNbXSk6IEltcG9ydGFuY2Uge1xuXHRpZiAoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0bGV0IG1heEltcE51bWJlciA9IC0xO1xuXHRcdGxldCBpbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2U7XG5cdFx0Zm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcblx0XHRcdGltcE51bWJlciA9IF9nZXRJbXBOdW1iZXIoZmllbGQpO1xuXHRcdFx0aWYgKGltcE51bWJlciA+IG1heEltcE51bWJlcikge1xuXHRcdFx0XHRtYXhJbXBOdW1iZXIgPSBpbXBOdW1iZXI7XG5cdFx0XHRcdERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlID0gZmllbGQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShEYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSBhcyBEYXRhRmllbGRUeXBlcyk7XG5cdH1cblx0cmV0dXJuIEltcG9ydGFuY2UuTm9uZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbXBvcnRhbmNlIHZhbHVlIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZGF0YUZpZWxkXG4gKiBAcmV0dXJucyBUaGUgaW1wb3J0YW5jZSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wb3J0YW5jZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWRcbik6IEltcG9ydGFuY2UgfCB1bmRlZmluZWQge1xuXHRpZiAoIWRhdGFGaWVsZCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0Y29uc3Qgc2VtYW50aWNLZXlzID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNlbWFudGljS2V5ID8/IFtdO1xuXHRjb25zdCByZXF1aXJlZFByb3BlcnRpZXMgPSBnZXRSZXF1aXJlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGhpZ2hLZXlzID0gWy4uLnNlbWFudGljS2V5cywgLi4ucmVxdWlyZWRQcm9wZXJ0aWVzXS5tYXAoKHByb3BlcnR5UGF0aCkgPT4gcHJvcGVydHlQYXRoLiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdC8vRXZhbHVhdGUgZGVmYXVsdCBJbXBvcnRhbmNlIGlzIG5vdCBzZXQgZXhwbGljaXRseVxuXHRsZXQgZmllbGRzV2l0aEltcG9ydGFuY2U7XG5cdGlmIChpc0Fubm90YXRpb25PZlR5cGU8RGF0YUZpZWxkRm9yQW5ub3RhdGlvbj4oZGF0YUZpZWxkLCBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSkge1xuXHRcdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldDtcblx0XHRpZiAoaXNBbm5vdGF0aW9uT2ZUeXBlPEZpZWxkR3JvdXA+KGRhdGFGaWVsZFRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGUpKSB7XG5cdFx0XHRjb25zdCBmaWVsZEdyb3VwRGF0YSA9IGRhdGFGaWVsZFRhcmdldC5EYXRhO1xuXHRcdFx0Ly9JZiBhIEZpZWxkR3JvdXAgY29udGFpbnMgYSBzZW1hbnRpY0tleSBvciByZXF1aXJlZCBwcm9wZXJ0eSwgaW1wb3J0YW5jZSBzZXQgdG8gSGlnaFxuXHRcdFx0Y29uc3QgaGFzSGlnaEtleSA9IGZpZWxkR3JvdXBEYXRhLnNvbWUoKGZpZWxkR3JvdXBEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBib29sZWFuID0+IHtcblx0XHRcdFx0cmV0dXJuIGlzRGF0YUZpZWxkVHlwZXMoZmllbGRHcm91cERhdGFGaWVsZCkgJiYgaGlnaEtleXMuaW5jbHVkZXMoZmllbGRHcm91cERhdGFGaWVsZC5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGhhc0hpZ2hLZXkpIHtcblx0XHRcdFx0cmV0dXJuIEltcG9ydGFuY2UuSGlnaDtcblx0XHRcdH1cblx0XHRcdC8vSWYgdGhlIERhdGFGaWVsZEZvckFubm90YXRpb24gaGFzIGFuIEltcG9ydGFuY2Ugd2UgdGFrZSBpdFxuXHRcdFx0aWYgKGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlKSB7XG5cdFx0XHRcdHJldHVybiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk7XG5cdFx0XHR9XG5cdFx0XHQvLyBlbHNlIHRoZSBoaWdoZXN0IGltcG9ydGFuY2UgKGlmIGFueSkgaXMgcmV0dXJuZWRcblx0XHRcdGZpZWxkc1dpdGhJbXBvcnRhbmNlID0gZmllbGRHcm91cERhdGEuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0XHRcdHJldHVybiBpdGVtPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2U7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHNXaXRoSW1wb3J0YW5jZSBhcyBEYXRhRmllbGRUeXBlc1tdKTtcblx0XHR9XG5cdFx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxDb25uZWN0ZWRGaWVsZHM+KGRhdGFGaWVsZFRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuQ29ubmVjdGVkRmllbGRzVHlwZSkpIHtcblx0XHRcdGNvbnN0IGNvbm5lY3RlZEZpZWxkc0RhdGEgPSBnZXRDb25uZWN0ZWRGaWVsZHNEYXRhKGRhdGFGaWVsZFRhcmdldCk7XG5cdFx0XHQvLyBJZiB0aGUgY29ubmVjdGVkRmllbGRzIGNvbnRhaW5zIGEgcmVxdWlyZWQgcHJvcGVydHksIGltcG9ydGFuY2Ugc2V0IHRvIEhpZ2hcblx0XHRcdGNvbnN0IHJlcXVpcmVkS2V5cyA9IHJlcXVpcmVkUHJvcGVydGllcy5tYXAoKHApID0+IHAuJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKTtcblxuXHRcdFx0Y29uc3QgaGFzUmVxdWlyZWRIaWdoS2V5ID0gY29ubmVjdGVkRmllbGRzRGF0YS5zb21lKChjb25uZWN0ZWREYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBib29sZWFuID0+IHtcblx0XHRcdFx0cmV0dXJuIGlzRGF0YUZpZWxkVHlwZXMoY29ubmVjdGVkRGF0YUZpZWxkKSAmJiByZXF1aXJlZEtleXMuaW5jbHVkZXMoY29ubmVjdGVkRGF0YUZpZWxkLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChoYXNSZXF1aXJlZEhpZ2hLZXkpIHtcblx0XHRcdFx0cmV0dXJuIEltcG9ydGFuY2UuSGlnaDtcblx0XHRcdH1cblx0XHRcdC8vSWYgdGhlIERhdGFGaWVsZEZvckFubm90YXRpb24gaGFzIGFuIEltcG9ydGFuY2Ugd2UgdGFrZSBpdFxuXHRcdFx0aWYgKGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlKSB7XG5cdFx0XHRcdHJldHVybiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBoaWdoS2V5cy5pbmNsdWRlcygoZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKS5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKVxuXHRcdD8gSW1wb3J0YW5jZS5IaWdoXG5cdFx0OiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZGlzYWJsZVN0cmljdEhhbmRsaW5nIHNldHRpbmcgZm9yIGFuIGFjdGlvbiBmcm9tIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGRGb3JBY3Rpb25cbiAqIEBwYXJhbSBrZXkgVGhlIGFjdGlvbiBrZXlcbiAqIEBwYXJhbSB0YWJsZU1hbmlmZXN0U2V0dGluZ3MgVGhlIHRhYmxlIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIERpc2FibGVTdHJpY3RIYW5kbGluZyBzZXR0aW5nIG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBnZXRFbmFibGVTdHJpY3RIYW5kbGluZ0Zyb21NYW5pZmVzdChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRrZXk6IHN0cmluZyxcblx0dGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvblxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbikge1xuXHRcdHJldHVybiB0YWJsZU1hbmlmZXN0U2V0dGluZ3MuYWN0aW9ucz8uW2tleV0/LmRpc2FibGVTdHJpY3RIYW5kbGluZztcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgbGluZSBpdGVtcyBmcm9tIG1ldGFkYXRhIGFubm90YXRpb25zLlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIHdpdGggdGhlaXIgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aCBUaGUgdmlzdWFsaXphdGlvbiBwYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgZW50aXR5VHlwZTogRW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXSxcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5PiA9IHt9LFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPiA9IHt9LFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKSxcblx0XHRkZWZhdWx0Q3JlYXRpb25Nb2RlID1cblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0U2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24oKT8ubWFjcm9zPy50YWJsZT8uZGVmYXVsdENyZWF0aW9uTW9kZSA9PT1cblx0XHRcdFwiSW5saW5lQ3JlYXRpb25Sb3dzXCJcblx0XHRcdFx0PyBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUgPVxuXHRcdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5jcmVhdGlvbk1vZGU/Lm5hbWUgPz8gZGVmYXVsdENyZWF0aW9uTW9kZSA/PyBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRjb25zdCBzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5ID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIkNvbW1vblwiLCBDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNLZXksIFtcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRdKVswXSBhcyBTZW1hbnRpY0tleTtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IHRhYmxlQ29udmVydGVyQ29udGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcjxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KFxuXHRcdFx0Z2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSlcblx0XHQpO1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQpID0+IHtcblx0XHRcdC8vIFRPRE86IHZhcmlhYmxlIG5hbWUgc2hvdWxkIGJlIGRhdGFmaWVsZCBhbmQgbm90IGxpbmVJdGVtXG5cdFx0XHRpZiAoIV9pc1ZhbGlkQ29sdW1uKGRhdGFGaWVsZCkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGV4cG9ydFNldHRpbmdzOiBQcm9wZXJ0eUluZm9bXCJleHBvcnRTZXR0aW5nc1wiXSA9IG51bGw7XG5cdFx0XHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID1cblx0XHRcdFx0aXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdFx0PyBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gX2dldFJlbGF0aXZlUGF0aChkYXRhRmllbGQpO1xuXHRcdFx0Ly8gRGV0ZXJtaW5lIHByb3BlcnRpZXMgd2hpY2ggYXJlIGNvbnN1bWVkIGJ5IHRoaXMgTGluZUl0ZW0uXG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShkYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlVHlwZSk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgZ3JvdXBQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSByZWxhdGl2ZVBhdGggPyBfc2xpY2VBdFNsYXNoKHJlbGF0aXZlUGF0aCwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSByZWxhdGl2ZVBhdGg7XG5cdFx0XHRjb25zdCBsYWJlbCA9IGdldExhYmVsKGRhdGFGaWVsZCwgaXNHcm91cCk7XG5cdFx0XHRjb25zdCBuYW1lID0gX2dldEFubm90YXRpb25Db2x1bW5OYW1lKGRhdGFGaWVsZCk7XG5cdFx0XHRjb25zdCBpc0ZpZWxkR3JvdXBDb2x1bW46IGJvb2xlYW4gPSBncm91cFBhdGggPyBncm91cFBhdGguaW5jbHVkZXMoYEAke1VJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXB9YCkgOiBmYWxzZTtcblx0XHRcdGNvbnN0IHNob3dEYXRhRmllbGRzTGFiZWw6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBpc0ZpZWxkR3JvdXBDb2x1bW5cblx0XHRcdFx0PyBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbChuYW1lLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dClcblx0XHRcdFx0OiBmYWxzZTtcblx0XHRcdGNvbnN0IGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBnZXREYXRhRmllbGREYXRhVHlwZShkYXRhRmllbGQpO1xuXHRcdFx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihuYW1lLCBzZW1hbnRpY0tleXMsIGRhdGFGaWVsZCkpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz4oXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRyZWxhdGl2ZVBhdGhcblx0XHRcdCk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCBhIHNpdHVhdGlvbnMgaW5kaWNhdG9yXG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllczogTmF2aWdhdGlvblByb3BlcnR5W10gPSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcztcblx0XHRcdGNvbnN0IHNpdHVhdGlvbnNOYXZQcm9wcyA9IG5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbHRlcihcblx0XHRcdFx0KG5hdmlnYXRpb25Qcm9wZXJ0eSkgPT5cblx0XHRcdFx0XHQhbmF2aWdhdGlvblByb3BlcnR5LmlzQ29sbGVjdGlvbiAmJlxuXHRcdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uU0FQT2JqZWN0Tm9kZVR5cGU/Lk5hbWUgPT09IFwiQnVzaW5lc3NTaXR1YXRpb25cIlxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHNpdHVhdGlvbnNOYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHkgfCB1bmRlZmluZWQgPSBzaXR1YXRpb25zTmF2UHJvcHMubGVuZ3RoID49IDEgPyBzaXR1YXRpb25zTmF2UHJvcHNbMF0gOiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoc2l0dWF0aW9uc05hdlByb3AgJiYgZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRmb3JtYXRPcHRpb25zLmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRmllbGRzSGlkZGVuRXhwcmVzc2lvbiA9IF9nZXRIaWRkZW5FeHByZXNzaW9ucyhkYXRhRmllbGQpO1xuXHRcdFx0Y29uc3QgaXNNdWx0aVZhbHVlID0gX2lzQ29sdW1uTXVsdGlWYWx1ZWQoZGF0YUZpZWxkLCB0YWJsZUNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKCFpc011bHRpVmFsdWUgJiYgX2lzRXhwb3J0YWJsZUNvbHVtbihkYXRhRmllbGQpKSB7XG5cdFx0XHRcdC8vZXhjbHVkZSB0aGUgdHlwZXMgbGlzdGVkIGFib3ZlIGZvciB0aGUgRXhwb3J0IChnZW5lcmF0ZXMgZXJyb3Igb24gRXhwb3J0IGFzIFBERilcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3MgPSBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyhkYXRhRmllbGQsIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdFx0XHR9XG5cdFx0XHRsZXQgcHJvcGVydHlUeXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoZGF0YVR5cGUpIHtcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhkYXRhRmllbGQsIGRhdGFUeXBlKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHR5cGVDb25maWc6IFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0XHRcdFx0Y2xhc3NOYW1lOiBkYXRhVHlwZSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB7XG5cdFx0XHRcdFx0Li4uZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0XHQuLi5wcm9wZXJ0eVR5cGVDb25maWc/LmZvcm1hdE9wdGlvbnNcblx0XHRcdFx0fSxcblx0XHRcdFx0Y29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZz8uY29uc3RyYWludHNcblx0XHRcdH07XG5cdFx0XHRjb25zdCB2aXN1YWxTZXR0aW5nczogVmlzdWFsU2V0dGluZ3MgPSB7fTtcblx0XHRcdGlmICghZGF0YVR5cGUgfHwgIXR5cGVDb25maWcpIHtcblx0XHRcdFx0Ly8gZm9yIGNoYXJ0c1xuXHRcdFx0XHR2aXN1YWxTZXR0aW5ncy53aWR0aENhbGN1bGF0aW9uID0gbnVsbDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNvcnRhYmxlID1cblx0XHRcdFx0IWlzTXVsdGlWYWx1ZSAmJlxuXHRcdFx0XHRfaXNDb2x1bW5Tb3J0YWJsZShkYXRhRmllbGQsIHJlbGF0aXZlUGF0aCwgcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcywgcmVsYXRlZFByb3BlcnRpZXNJbmZvKTtcblx0XHRcdGNvbnN0IGF2YWlsYWJpbGl0eSA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKGRhdGFGaWVsZCkgPyBcIkhpZGRlblwiIDogXCJEZWZhdWx0XCI7XG5cdFx0XHRjb25zdCBjb2x1bW5LZXkgPSBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdFx0XHRjb25zdCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbiA9IHtcblx0XHRcdFx0a2V5OiBjb2x1bW5LZXksIC8vS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGxhYmVsOiBsYWJlbCA/PyBuYW1lLFxuXHRcdFx0XHRncm91cExhYmVsOiBpc0dyb3VwID8gZ2V0TGFiZWwoZGF0YUZpZWxkKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiB1bmRlZmluZWQsXG5cdFx0XHRcdGNvbGxlY3Rpb25GaWVsZHNIaWRkZW5FeHByZXNzaW9uOiBjb2xsZWN0aW9uRmllbGRzSGlkZGVuRXhwcmVzc2lvbixcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IGF2YWlsYWJpbGl0eSxcblx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0c2hvd0RhdGFGaWVsZHNMYWJlbDogc2hvd0RhdGFGaWVsZHNMYWJlbCxcblx0XHRcdFx0cmVxdWlyZWQ6IGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzLCB0YWJsZUNyZWF0aW9uTW9kZSksXG5cdFx0XHRcdHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRzb3J0YWJsZTogc29ydGFibGUsXG5cdFx0XHRcdHByb3BlcnR5SW5mb3M6IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmxlbmd0aCA/IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvczogYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdHdpZHRoOiAoZGF0YUZpZWxkLmFubm90YXRpb25zPy5IVE1MNT8uQ3NzRGVmYXVsdHM/LndpZHRoPy52YWx1ZU9mKCkgYXMgc3RyaW5nKSB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdGltcG9ydGFuY2U6IGdldEltcG9ydGFuY2UoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IGZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRcdFx0dHlwZUNvbmZpZzogdHlwZUNvbmZpZyxcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3M6IHZpc3VhbFNldHRpbmdzIGFzIFByb3BlcnR5SW5mb1tcInZpc3VhbFNldHRpbmdzXCJdLFxuXHRcdFx0XHR0aW1lem9uZVRleHQ6IGV4cG9ydFNldHRpbmdzPy50aW1lem9uZSxcblx0XHRcdFx0aXNQYXJ0T2ZMaW5lSXRlbTogdHJ1ZSxcblx0XHRcdFx0ZGF0YVR5cGU6IGRhdGFUeXBlID8/IChcIkVkbS5TdHJpbmdcIiBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlKSxcblx0XHRcdFx0aXNNdWx0aVZhbHVlXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgc3RyaWN0SGFuZGxpbmdTZXR0aW5nRm9yQ29sdW1uID0gZ2V0RW5hYmxlU3RyaWN0SGFuZGxpbmdGcm9tTWFuaWZlc3QoZGF0YUZpZWxkLCBjb2x1bW5LZXksIHRhYmxlTWFuaWZlc3RTZXR0aW5ncyk7XG5cdFx0XHRpZiAoc3RyaWN0SGFuZGxpbmdTZXR0aW5nRm9yQ29sdW1uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29sdW1uLmRpc2FibGVTdHJpY3RIYW5kbGluZyA9IHN0cmljdEhhbmRsaW5nU2V0dGluZ0ZvckNvbHVtbjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHRvb2x0aXAgPSBfZ2V0VG9vbHRpcChkYXRhRmllbGQpID8/IGxhYmVsO1xuXHRcdFx0aWYgKHRvb2x0aXApIHtcblx0XHRcdFx0Y29sdW1uLnRvb2x0aXAgPSB0b29sdGlwO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdFx0XHRjb2x1bW4uZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWUgPSByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0XHQvLyBDb2xsZWN0IGluZm9ybWF0aW9uIG9mIHJlbGF0ZWQgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgocmVsYXRlZFByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbcmVsYXRlZFByb3BlcnR5TmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBtdWx0aS12YWx1ZSwgcmVsYXRlZCBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBzb3J0ZWQgYXMgd2UgZ28gdGhyb3VnaCBhIDEtbiByZWxhdGlvblxuXHRcdFx0XHRpZiAoaXNNdWx0aVZhbHVlKSB7XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHJlbGF0ZWRQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFkZFByb3BlcnR5VG9EaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwKFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVcblx0XHRcdFx0KTtcblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgbGluZUl0ZW0gcG9pbnRzIHRvIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSB3aXRoIGEgdGV4dEFycmFuZ2VtZW50IFRleHRPbmx5LCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgY29sdW1uIHdpdGggdGhlIHZhbHVlIG5hdmlnYXRpb24gcHJvcGVydHkuXG5cdFx0XHRcdC8vIFRoZSB0ZXh0IHByb3BlcnR5IGlzIHJlZmVyZW5jZWQgb24gdGhlIHJlbGF0ZWQgcHJvcGVydGllcyBvZiB0aGUgbGluZUl0ZW0sIHNvIHdpbGwgYmUgY3JlYXRlZCBvbiB0aGUgX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIG1ldGhvZC5cblx0XHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uID09PSBcIkRlc2NyaXB0aW9uXCIpIHtcblx0XHRcdFx0XHRjcmVhdGVQcm9wZXJ0eUFubm90YXRlZFRleHRPbmx5KFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRcdFx0XHRcdHJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKChhZGRpdGlvbmFsUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblx0Ly8gR2V0IGNvbHVtbnMgZnJvbSB0aGUgUHJvcGVydGllcyBvZiBFbnRpdHlUeXBlXG5cdHJldHVybiBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUoXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkLFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZVR5cGUsXG5cdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXNcblx0KTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMgZnJvbSB0aGUgbWFuaWZlc3QgYW5kIGNoZWNrcyBhZ2FpbnN0IGV4aXN0aW5nIHByb3BlcnRpZXMgYWxyZWFkeSBhZGRlZCBieSBhbm5vdGF0aW9ucy5cbiAqIElmIGEgbm90IHlldCBzdG9yZWQgcHJvcGVydHkgaXMgZm91bmQgaXQgYWRkcyBpdCBmb3Igc29ydGluZyBhbmQgZmlsdGVyaW5nIG9ubHkgdG8gdGhlIGFubm90YXRpb25Db2x1bW5zLlxuICogQHBhcmFtIHByb3BlcnRpZXNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcmV0dXJucyBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBfZ2V0UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIChcblx0cHJvcGVydGllczogc3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCBtYXRjaGVkUHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cdGlmIChBcnJheS5pc0FycmF5KHByb3BlcnRpZXMpKSB7XG5cdFx0bWF0Y2hlZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gYW5ub3RhdGlvbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoYW5ub3RhdGlvbkNvbHVtbikge1xuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHByb3BlcnR5UGF0aCAmJiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ubmFtZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKFxuXHRcdFx0XHRcdHsgW3Byb3BlcnR5UGF0aF06IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSB9LFxuXHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHR7fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKHJlbGF0ZWRDb2x1bW5zWzBdKTtcblx0XHRcdFx0cmV0dXJuIHJlbGF0ZWRDb2x1bW5zWzBdLm5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIG1hdGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGQgaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGRhdGFGaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YUZpZWxkIGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRhdGFGaWVsZDogRmllbGRHcm91cCB8IENvbm5lY3RlZEZpZWxkcyxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdGxldCBkYXRhRmllbGREYXRhOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzW107XG5cdGlmIChpc0Fubm90YXRpb25PZlRlcm08Q29ubmVjdGVkRmllbGRzPihkYXRhRmllbGQsIFVJQW5ub3RhdGlvblRlcm1zLkNvbm5lY3RlZEZpZWxkcykpIHtcblx0XHRkYXRhRmllbGREYXRhID0gZ2V0Q29ubmVjdGVkRmllbGRzRGF0YShkYXRhRmllbGQpO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGFGaWVsZERhdGEgPSBkYXRhRmllbGQuRGF0YTtcblx0fVxuXHRyZXR1cm4gZGF0YUZpZWxkRGF0YS5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0Ly8gd2UgZXhjbHVkZSBib29sZWFuIHR5cGUsIHRoZSBlbmQtdXNlciBtYXkgd2FudCB0byBrZWVwIHRoZSB1bmRlcmx5aW5nIGNoZWNrIGJveCBlbXB0eSBvbiBwdXJwb3NlXG5cdFx0aWYgKGlzRGF0YUZpZWxkKGl0ZW0pICYmIGl0ZW0/LlZhbHVlPy4kdGFyZ2V0LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIikge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0aXNTdGF0aWNhbGx5TWFuZGF0b3J5KGl0ZW0pIHx8XG5cdFx0XHRcdCh0YWJsZUNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShpdGVtLlZhbHVlLiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIHByb3BlcnR5IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24gPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YUZpZWxkRm9yQW5ub3RhdGlvbjogRGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdGNvbnN0IERhdGFGaWVsZEZvckFubm90YXRpb25GaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkgPSBoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbik7XG5cdC8vIENoZWNrIGlmIHRoZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50cyB0byBhIEZpZWxkR3JvdXAgb3IgYSBjb25uZWN0ZWRGaWVsZHNcblx0aWYgKGhhc0ZpZWxkR3JvdXBUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikgfHwgaGFzQ29ubmVjdGVkRmllbGRzVGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb24pKSB7XG5cdFx0aWYgKGlzUmVxdWlyZWQoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkVGFyZ2V0IGFzIEZpZWxkR3JvdXAsIHRhYmxlQ3JlYXRpb25Nb2RlKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGNvbnN0IGNvbGxlY3Rpb25EYXRhID0gaGFzRmllbGRHcm91cFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uKVxuXHRcdFx0PyAoZGF0YUZpZWxkVGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGFcblx0XHRcdDogZ2V0Q29ubmVjdGVkRmllbGRzRGF0YShkYXRhRmllbGRUYXJnZXQgYXMgQ29ubmVjdGVkRmllbGRzKTtcblx0XHRyZXR1cm4gY29sbGVjdGlvbkRhdGEuc29tZSgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdHJldHVybiBpc1JlcXVpcmVkQ29sdW1uKGNvbnZlcnRlckNvbnRleHQsIGlubmVyRGF0YUZpZWxkLCB0YWJsZUNyZWF0aW9uTW9kZSk7XG5cdFx0fSk7XG5cdH1cblx0LypJZiB0aGUgdW5kZXJseWluZyBkYXRhcG9pbnQgaXMgYSByYXRpbmcgaW5kaWNhdG9yLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgcmF0aW5nIGVtcHR5ICh2YWx1ZSAwKSBvbiBwdXJwb3NlLlxuXHRCZXNpZGVzLCBjdXJyZW50bHksIG9ubHkgYSBmaWVsZENvbnRyb2wgc2V0IG9uIGEgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIGRhdGFQb2ludCBoYXMgYW4gaW5mbHVlbmNlIGluIHRoZSB0YWJsZS5cblx0QWNjb3JkaW5nbHksIGlmIGEgZGF0YXBvaW50IGNvbWVzIGZyb20gYSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIHdpdGggYSBmaWVsZENvbnRyb2wgc2V0IGFzIG5vdCBtYW5kYXRvcnksIHRoaXMgZGF0YVBvaW50IG11c3Qgbm90IGJlIGZsYWdnZWQgYXMgXCJyZXF1aXJlZFwiKi9cblx0aWYgKGhhc0RhdGFQb2ludFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uKSAmJiAoZGF0YUZpZWxkVGFyZ2V0IGFzIERhdGFQb2ludCkuVmlzdWFsaXphdGlvbiAhPT0gXCJVSS5WaXN1YWxpemF0aW9uVHlwZS9SYXRpbmdcIikge1xuXHRcdGlmIChEYXRhRmllbGRGb3JBbm5vdGF0aW9uRmllbGRDb250cm9sTm90TWFuZGF0b3J5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChpc1N0YXRpY2FsbHlNYW5kYXRvcnkoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNSZXF1aXJlZERhdGFQb2ludChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGRUYXJnZXQgYXMgRGF0YVBvaW50LCB0YWJsZUNyZWF0aW9uTW9kZSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm9wZXJ0eSBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdHByb3BlcnR5LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIiAmJlxuXHRcdCFpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkgJiZcblx0XHQoaXNTdGF0aWNhbGx5TWFuZGF0b3J5KHByb3BlcnR5KSB8fFxuXHRcdFx0KHRhYmxlQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YVBvaW50IGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZGF0YVBvaW50IFRoZSBkYXRhUG9pbnQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFQb2ludCBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZERhdGFQb2ludCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkYXRhUG9pbnQ6IERhdGFQb2ludCxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0aXNTdGF0aWNhbGx5TWFuZGF0b3J5KGRhdGFQb2ludCkgfHxcblx0XHQodGFibGVDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShkYXRhUG9pbnQuVmFsdWUuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSB1bmRlcmx5aW5nIGNvbHVtbiBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ3JlcXVpcmVkJyBwcm9wZXJ0eSBvZiB0aGUgdGFibGUgY29sdW1uLlxuICovXG5jb25zdCBpc1JlcXVpcmVkQ29sdW1uID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhcmdldDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5LFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBjcmVhdGlvbk1vZGUgPSB0YWJsZUNyZWF0aW9uTW9kZSB8fCBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRpZiAoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgfHxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGlzUHJvcGVydHkodGFyZ2V0KSkge1xuXHRcdHJldHVybiBpc1JlcXVpcmVkUHJvcGVydHkoY29udmVydGVyQ29udGV4dCwgdGFyZ2V0LCBjcmVhdGlvbk1vZGUpID8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSkgOiB1bmRlZmluZWQ7XG5cdH1cblx0Ly8gQ2hlY2sgaWYgdGhlIGRhdGFGaWVsZCBpcyBvZiB0eXBlIERhdGFGaWVsZEZvckFubm90YXRpb25cblx0aWYgKGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbih0YXJnZXQpKSB7XG5cdFx0cmV0dXJuIGlzUmVxdWlyZWREYXRhRmllbGRGb3JBbm5vdGF0aW9uKGNvbnZlcnRlckNvbnRleHQsIHRhcmdldCwgY3JlYXRpb25Nb2RlKSA/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpIDogdW5kZWZpbmVkO1xuXHR9XG5cdC8vSWYgdGhlIHVuZGVybHlpbmcgcHJvcGVydHkgaXMgYSBib29sZWFuLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgY2hlY2sgYm94IGVtcHR5IG9uIHB1cnBvc2Vcblx0aWYgKGlzRGF0YUZpZWxkKHRhcmdldCkgJiYgdGFyZ2V0LlZhbHVlPy4kdGFyZ2V0Py50eXBlICE9PSBcIkVkbS5Cb29sZWFuXCIpIHtcblx0XHRyZXR1cm4gaXNTdGF0aWNhbGx5TWFuZGF0b3J5KHRhcmdldCkgfHxcblx0XHRcdChjcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KHRhcmdldC5WYWx1ZS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3QgX2FwcGVuZEN1c3RvbVRlbXBsYXRlID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0ZXhwb3J0UHJvcGVydGllczogc3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChBcnJheS5pc0FycmF5KGV4cG9ydFByb3BlcnRpZXMpKSB7XG5cdFx0cHJvcGVydGllcyA9IGV4cG9ydFByb3BlcnRpZXM7XG5cdH1cblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRyZXR1cm4gcHJvcGVydGllc1xuXHRcdFx0Lm1hcCgocHJvcGVydHkpID0+IHtcblx0XHRcdFx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzIS5pbmRleE9mKHByb3BlcnR5KX19YDtcblx0XHRcdH0pXG5cdFx0XHQuam9pbihgJHtcIlxcblwifWApO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGFibGUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gbWFuaWZlc3QuXG4gKlxuICogVGhlc2UgbWF5IGJlIGN1c3RvbSBjb2x1bW5zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0LCBzbG90IGNvbHVtbnMgY29taW5nIHRocm91Z2hcbiAqIGEgYnVpbGRpbmcgYmxvY2ssIG9yIGFubm90YXRpb24gY29sdW1ucyB0byBvdmVyd3JpdGUgYW5ub3RhdGlvbi1iYXNlZCBjb2x1bW5zLlxuICogQHBhcmFtIGNvbHVtbnNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcGFyYW0gdGFibGVUeXBlXG4gKiBAcmV0dXJucyBUaGUgY29sdW1ucyBmcm9tIHRoZSBtYW5pZmVzdFxuICovXG5jb25zdCBnZXRDb2x1bW5zRnJvbU1hbmlmZXN0ID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4gfCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZT4sXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZVxuKTogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RDb2x1bW4+IHtcblx0Y29uc3QgaW50ZXJuYWxDb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdENvbHVtbj4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0ZnVuY3Rpb24gaXNDb2x1bW5PdmVycmlkZShcblx0XHRjb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiB8IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlLFxuXHRcdGtleTogc3RyaW5nXG5cdCk6IGNvbHVtbiBpcyBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4ua2V5ID09PSBrZXkpO1xuXHR9XG5cdGZ1bmN0aW9uIGlzU2xvdENvbHVtbihtYW5pZmVzdENvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uKTogbWFuaWZlc3RDb2x1bW4gaXMgRnJhZ21lbnREZWZpbmVkU2xvdENvbHVtbiB7XG5cdFx0cmV0dXJuIG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IENvbHVtblR5cGUuU2xvdDtcblx0fVxuXHRmdW5jdGlvbiBpc0N1c3RvbUNvbHVtbihtYW5pZmVzdENvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uKTogbWFuaWZlc3RDb2x1bW4gaXMgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uIHtcblx0XHRyZXR1cm4gbWFuaWZlc3RDb2x1bW4udHlwZSA9PT0gdW5kZWZpbmVkICYmICEhbWFuaWZlc3RDb2x1bW4udGVtcGxhdGU7XG5cdH1cblx0ZnVuY3Rpb24gX3VwZGF0ZUxpbmtlZFByb3BlcnRpZXNPbkN1c3RvbUNvbHVtbnMocHJvcGVydHlJbmZvczogc3RyaW5nW10sIGFubm90YXRpb25UYWJsZUNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzID0gZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdHByb3BlcnR5SW5mb3MuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGFubm90YXRpb25UYWJsZUNvbHVtbnMuZm9yRWFjaCgocHJvcCkgPT4ge1xuXHRcdFx0XHRpZiAocHJvcC5uYW1lID09PSBwcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGNvbnN0IGVudGl0eVByb3BlcnR5TmFtZSA9IHByb3BlcnR5LnJlcGxhY2UoXCJQcm9wZXJ0eTo6XCIsIFwiXCIpO1xuXHRcdFx0XHRcdHByb3Auc29ydGFibGUgPSAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhlbnRpdHlQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHRcdHByb3AuaXNHcm91cGFibGUgPVxuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSAmJiB0YWJsZVR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCJcblx0XHRcdFx0XHRcdFx0PyAhIWFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlOYW1lR3JvdXBhYmxlKGVudGl0eVByb3BlcnR5TmFtZSlcblx0XHRcdFx0XHRcdFx0OiBwcm9wLnNvcnRhYmxlO1xuXHRcdFx0XHRcdHByb3AuZmlsdGVyYWJsZSA9ICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMoZW50aXR5UHJvcGVydHlOYW1lKTtcblx0XHRcdFx0XHRwcm9wLmlzUGFydE9mQ3VzdG9tQ29sdW1uID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblx0Zm9yIChjb25zdCBrZXkgaW4gY29sdW1ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0Q29sdW1uID0gY29sdW1uc1trZXldO1xuXHRcdEtleUhlbHBlci52YWxpZGF0ZUtleShrZXkpO1xuXHRcdC8vIEJhc2VUYWJsZUNvbHVtblxuXHRcdGNvbnN0IGJhc2VUYWJsZUNvbHVtbiA9IHtcblx0XHRcdGtleToga2V5LFxuXHRcdFx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI6IG1hbmlmZXN0Q29sdW1uLndpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyLFxuXHRcdFx0d2lkdGg6IG1hbmlmZXN0Q29sdW1uLndpZHRoIHx8IHVuZGVmaW5lZCxcblx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0cGxhY2VtZW50OiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gUGxhY2VtZW50LkFmdGVyIDogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24ucGxhY2VtZW50XG5cdFx0XHR9LFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0fTtcblx0XHRpZiAoaXNDb2x1bW5PdmVycmlkZShtYW5pZmVzdENvbHVtbiwga2V5KSkge1xuXHRcdFx0Y29uc3QgcHJvcGVydGllc1RvT3ZlcndyaXRlQW5ub3RhdGlvbkNvbHVtbjogQ3VzdG9tRWxlbWVudDxBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZT4gPSB7XG5cdFx0XHRcdC4uLmJhc2VUYWJsZUNvbHVtbixcblx0XHRcdFx0aW1wb3J0YW5jZTogbWFuaWZlc3RDb2x1bW4/LmltcG9ydGFuY2UsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogbWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbixcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5LFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB1bmRlZmluZWQsXG5cdFx0XHRcdHNldHRpbmdzOiBtYW5pZmVzdENvbHVtbi5zZXR0aW5ncyxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUobWFuaWZlc3RDb2x1bW4uZm9ybWF0T3B0aW9ucyksXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBtYW5pZmVzdENvbHVtbi5kaXNhYmxlRXhwb3J0XG5cdFx0XHRcdFx0PyBudWxsXG5cdFx0XHRcdFx0OiBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhcblx0XHRcdFx0XHRcdFx0bWFuaWZlc3RDb2x1bW4/LmV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRrZXlcblx0XHRcdFx0XHQgIClcblx0XHRcdH07XG5cdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IHByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW47XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5SW5mb3M6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gX2dldFByb3BlcnR5TmFtZXMoXG5cdFx0XHRcdG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRlbnRpdHlUeXBlXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgdG9vbHRpcFRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmZldGNoVGV4dEZyb21NZXRhTW9kZWwobWFuaWZlc3RDb2x1bW4udG9vbHRpcCksXG5cdFx0XHRcdGhlYWRlclRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmZldGNoVGV4dEZyb21NZXRhTW9kZWwobWFuaWZlc3RDb2x1bW4uaGVhZGVyKTtcblxuXHRcdFx0Y29uc3QgY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbCA9XG5cdFx0XHRcdHByb3BlcnR5SW5mb3MgJiYgIW1hbmlmZXN0Q29sdW1uLmRpc2FibGVFeHBvcnRcblx0XHRcdFx0XHQ/IGdldEN1c3RvbUV4cG9ydFNldHRpbmdzKFxuXHRcdFx0XHRcdFx0XHRtYW5pZmVzdENvbHVtbj8uZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eUluZm9zXG5cdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0OiBudWxsO1xuXHRcdFx0Y29uc3QgYmFzZU1hbmlmZXN0Q29sdW1uID0ge1xuXHRcdFx0XHQuLi5iYXNlVGFibGVDb2x1bW4sXG5cdFx0XHRcdGhlYWRlcjogaGVhZGVyVGV4dCxcblx0XHRcdFx0aW1wb3J0YW5jZTogbWFuaWZlc3RDb2x1bW4/LmltcG9ydGFuY2UgfHwgSW1wb3J0YW5jZS5Ob25lLFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IG1hbmlmZXN0Q29sdW1uPy5ob3Jpem9udGFsQWxpZ24gfHwgSG9yaXpvbnRhbEFsaWduLkJlZ2luLFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IG1hbmlmZXN0Q29sdW1uPy5hdmFpbGFiaWxpdHkgfHwgXCJEZWZhdWx0XCIsXG5cdFx0XHRcdHRlbXBsYXRlOiBtYW5pZmVzdENvbHVtbi50ZW1wbGF0ZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcHJvcGVydHlJbmZvcyxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IGN1c3RvbUNvbHVtbkV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRpZDogYEN1c3RvbUNvbHVtbjo6JHtrZXl9YCxcblx0XHRcdFx0bmFtZTogYEN1c3RvbUNvbHVtbjo6JHtrZXl9YCxcblx0XHRcdFx0Ly9OZWVkZWQgZm9yIE1EQzpcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogeyB0ZXh0TGluZXNFZGl0OiA0IH0sXG5cdFx0XHRcdGlzR3JvdXBhYmxlOiBmYWxzZSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IGZhbHNlLFxuXHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzOiB7IHdpZHRoQ2FsY3VsYXRpb246IG51bGwgfSxcblx0XHRcdFx0dG9vbHRpcDogdG9vbHRpcFRleHQgPyB0b29sdGlwVGV4dCA6IGhlYWRlclRleHQsXG5cdFx0XHRcdHByb3BlcnRpZXM6IG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRcdHJlcXVpcmVkOlxuXHRcdFx0XHRcdG1hbmlmZXN0Q29sdW1uLnJlcXVpcmVkICYmXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgJiZcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdFx0XHRcdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpXG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHRcdGlmIChwcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRcdF91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zKHByb3BlcnR5SW5mb3MsIGFubm90YXRpb25Db2x1bW5zKTtcblx0XHRcdH1cblx0XHRcdGlmIChpc1Nsb3RDb2x1bW4obWFuaWZlc3RDb2x1bW4pKSB7XG5cdFx0XHRcdGNvbnN0IGN1c3RvbVRhYmxlQ29sdW1uOiBDdXN0b21FbGVtZW50PEN1c3RvbUJhc2VkVGFibGVDb2x1bW4+ID0ge1xuXHRcdFx0XHRcdC4uLmJhc2VNYW5pZmVzdENvbHVtbixcblx0XHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLlNsb3Rcblx0XHRcdFx0fTtcblx0XHRcdFx0aW50ZXJuYWxDb2x1bW5zW2tleV0gPSBjdXN0b21UYWJsZUNvbHVtbjtcblx0XHRcdH0gZWxzZSBpZiAoaXNDdXN0b21Db2x1bW4obWFuaWZlc3RDb2x1bW4pKSB7XG5cdFx0XHRcdGNvbnN0IGN1c3RvbVRhYmxlQ29sdW1uOiBDdXN0b21FbGVtZW50PEN1c3RvbUJhc2VkVGFibGVDb2x1bW4+ID0ge1xuXHRcdFx0XHRcdC4uLmJhc2VNYW5pZmVzdENvbHVtbixcblx0XHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkRlZmF1bHRcblx0XHRcdFx0fTtcblx0XHRcdFx0aW50ZXJuYWxDb2x1bW5zW2tleV0gPSBjdXN0b21UYWJsZUNvbHVtbjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBgVGhlIGFubm90YXRpb24gY29sdW1uICcke2tleX0nIHJlZmVyZW5jZWQgaW4gdGhlIG1hbmlmZXN0IGlzIG5vdCBmb3VuZGA7XG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHRcdC5hZGRJc3N1ZShcblx0XHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnkuTWFuaWZlc3QsXG5cdFx0XHRcdFx0XHRJc3N1ZVNldmVyaXR5Lkxvdyxcblx0XHRcdFx0XHRcdG1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5VHlwZSxcblx0XHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlPy5Bbm5vdGF0aW9uQ29sdW1ucz8uSW52YWxpZEtleVxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbnRlcm5hbENvbHVtbnM7XG59O1xuXG4vKipcbiAqIEFkZHMgY29tcHV0ZWQgY29sdW1ucyBzdWNoIGFzIHRoZSBkcmFmdCBzdGF0dXMgYW5kIHNpdHVhdGlvbnMgc3RhdHVzLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgdGFibGUgY29sdW1ucyBjb2xsZWN0ZWQgc28gZmFyXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZW5yaWNoZWQgc2V0IG9mIHRhYmxlIGNvbHVtbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZENvbXB1dGVkQ29sdW1ucyhcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0aWYgKCFbXCJHcmlkVGFibGVcIiwgXCJUcmVlVGFibGVcIiwgXCJBbmFseXRpY2FsVGFibGVcIl0uaW5jbHVkZXModGFibGVUeXBlKSkge1xuXHRcdC8vIENvbXB1dGVkIGNvbHVtbnMgYXJlIG5vdCB1c2VkIGluIFJlc3BvbnNpdmUgdGFibGVzXG5cdFx0cmV0dXJuIHRhYmxlQ29sdW1ucztcblx0fVxuXG5cdC8vIEluIGNhc2UgYSBncmlkIHRhYmxlIG9yIHRyZWUgdGFibGUgaXMgdXNlZCwgd2UgZGlzcGxheSB0aGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgaW4gYSBzZXBhcmF0ZSBjb2x1bW5cblx0Ly8gc28gd2UgaGF2ZSB0byBkaXNhYmxlIGl0IGhlcmUgdG8gZW5zdXJlLCB0aGF0IHRoZSBmaWVsZCBidWlsZGluZyBibG9ja1xuXHQvLyBkb2VzIG5vdCByZW5kZXIgaXQgaW50byB0aGUgSUQgY29sdW1uXG5cdGNvbnN0IGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCA9IHRhYmxlQ29sdW1ucy5maW5kKFxuXHRcdChjb2x1bW4pID0+IGNvbHVtbi5mb3JtYXRPcHRpb25zPy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPT09IHRydWVcblx0KTtcblx0aWYgKGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yPy5mb3JtYXRPcHRpb25zKSB7XG5cdFx0Ly8gU3dpdGNoIG9mZiB0aGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgaW4gdGhlIGZvdW5kIGNvbHVtblxuXHRcdGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yLmZvcm1hdE9wdGlvbnMuaGFzU2l0dWF0aW9uc0luZGljYXRvciA9IGZhbHNlO1xuXG5cdFx0Ly8gSW5zZXJ0IGEgc2VwYXJhdGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgY29sdW1uXG5cdFx0Y29uc3Qgc2l0dWF0aW9uc0luZGljYXRvckNvbHVtbjogQ29tcHV0ZWRUYWJsZUNvbHVtbiA9IHtcblx0XHRcdGtleTogXCJzaXR1YXRpb25zSW5kaWNhdG9yXCIsXG5cdFx0XHRuYW1lOiBcInNpdHVhdGlvbnNJbmRpY2F0b3JcIixcblx0XHRcdHByb3BlcnR5S2V5OiBjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvci5uYW1lLFxuXHRcdFx0aXNTaXR1YXRpb25zSW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBcIkRlZmF1bHRcIixcblx0XHRcdGxhYmVsOiBcIntzYXAuZmUuaTE4bj5DX1NJVFVBVElPTlNfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dG9vbHRpcDogXCJ7c2FwLmZlLmkxOG4+Q19TSVRVQVRJT05TX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHR5cGU6IENvbHVtblR5cGUuQ29tcHV0ZWQsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBudWxsLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IG51bGwsXG5cdFx0XHRjbGlwYm9hcmRTZXR0aW5nczogbnVsbCxcblx0XHRcdHByb3BlcnR5SW5mb3M6IHVuZGVmaW5lZCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlXG5cdFx0fTtcblxuXHRcdC8vIFBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGFmdGVyIHRoZSBmaXJzdCB2aXNpYmxlIGNvbHVtblxuXHRcdGNvbnN0IGluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW46IGludCA9IHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gY29sdW1uLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIik7XG5cdFx0dGFibGVDb2x1bW5zLnNwbGljZShpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uICsgMSwgMCwgc2l0dWF0aW9uc0luZGljYXRvckNvbHVtbik7XG5cdH1cblxuXHQvLyBJbiBjYXNlIGEgZ3JpZCB0YWJsZSBvciB0cmVlIHRhYmxlIGlzIHVzZWQsIHdlIGRpc3BsYXkgdGhlIGRyYWZ0IGluZGljYXRvciBpbiBhIHNlcGFyYXRlIGNvbHVtblxuXHQvLyBzbyB3ZSBoYXZlIHRvIGRpc2FibGUgaXQgaGVyZSB0byBlbnN1cmUsIHRoYXQgdGhlIGZpZWxkIGJ1aWxkaW5nIGJsb2NrXG5cdC8vIGRvZXMgbm90IHJlbmRlciBpdCBpbnRvIHRoZSBJRCBjb2x1bW5cblx0Ly8gVGhlIGFkZGl0aW9uYWwgY29sdW1uIGlzIG9ubHkgYWRkZWQgZm9yIHRhYmxlcyBvbiBhIExSIGFuZCBpbiBjYXNlIHRlaGUgZW50aXR5IGlzIGRyYWZ0IGVuYWJsZWQhXG5cdGNvbnN0IGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3I6IFRhYmxlQ29sdW1uW10gPSB0YWJsZUNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5mb3JtYXRPcHRpb25zPy5oYXNEcmFmdEluZGljYXRvciA9PT0gdHJ1ZSk7XG5cdGlmIChcblx0XHRjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yLmxlbmd0aCAmJlxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0KE1vZGVsSGVscGVyLmlzRHJhZnROb2RlKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpIHx8IE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpKVxuXHQpIHtcblx0XHQvLyBTd2l0Y2ggb2ZmIHRoZSBkcmFmdCBpbmRpY2F0b3IgaW4gdGhlIGZvdW5kIGNvbHVtblxuXHRcdGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3IuZm9yRWFjaCgoY29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yOiBUYWJsZUNvbHVtbikgPT4ge1xuXHRcdFx0aWYgKGNvbHVtbldpdGhEcmFmdEluZGljYXRvcj8uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3IuZm9ybWF0T3B0aW9ucy5oYXNEcmFmdEluZGljYXRvciA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5zZXJ0IGEgc2VwYXJhdGUgZHJhZnQgaW5kaWNhdG9yIGNvbHVtblxuXHRcdGNvbnN0IGRyYWZ0SW5kaWNhdG9yQ29sdW1uOiBDb21wdXRlZFRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBcImRyYWZ0U3RhdHVzXCIsXG5cdFx0XHRuYW1lOiBcImRyYWZ0U3RhdHVzXCIsXG5cdFx0XHRwcm9wZXJ0eUtleTogY29sdW1uc1dpdGhEcmFmdEluZGljYXRvclswXS5uYW1lLFxuXHRcdFx0aXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogXCJEZWZhdWx0XCIsXG5cdFx0XHRsYWJlbDogXCJ7c2FwLmZlLmkxOG4+Q19EUkFGVF9TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0b29sdGlwOiBcIntzYXAuZmUuaTE4bj5DX0RSQUZUX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHR5cGU6IENvbHVtblR5cGUuQ29tcHV0ZWQsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBudWxsLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IG51bGwsXG5cdFx0XHRjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcblx0XHRcdGNsaXBib2FyZFNldHRpbmdzOiBudWxsXG5cdFx0fTtcblx0XHRsZXQgY29sdW1uSW5kZXhUb0luc2VydEFmdGVyOiBpbnQgPSAwO1xuXHRcdGlmIChjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvcikge1xuXHRcdFx0Ly8gSWYgdGhlcmUncyBhIHNpdHVhdGlvbnMgaW5kaWNhdG9yIGNvbHVtbiwgcGxhY2UgdGhlIGRyYWZ0IHN0YXR1cyBjb2x1bW4gYmVmb3JlIGl0XG5cdFx0XHRjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIgPVxuXHRcdFx0XHR0YWJsZUNvbHVtbnMuZmluZEluZGV4KChjb2x1bW4pID0+IChjb2x1bW4gYXMgQ29tcHV0ZWRUYWJsZUNvbHVtbikuaXNTaXR1YXRpb25zSW5kaWNhdG9yID09PSB0cnVlKSAtIDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE90aGVyd2lzZSBwbGFjZSB0aGUgZHJhZnQgc3RhdHVzIGNvbHVtbiBhZnRlciB0aGUgZmlyc3QgdmlzaWJsZSBjb2x1bW5cblx0XHRcdGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciA9IHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gY29sdW1uLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIik7XG5cdFx0fVxuXHRcdHRhYmxlQ29sdW1ucy5zcGxpY2UoY29sdW1uSW5kZXhUb0luc2VydEFmdGVyICsgMSwgMCwgZHJhZnRJbmRpY2F0b3JDb2x1bW4pO1xuXHR9XG5cblx0cmV0dXJuIHRhYmxlQ29sdW1ucztcbn1cblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyBzZXQgb24gdGhlIGFubm90YXRpb25zLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgIFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgcmVzdHJpY3RlZCBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1aXJlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogUHJvcGVydHlQYXRoW10ge1xuXHRyZXR1cm4gZ2V0Q29udGV4dFByb3BlcnR5UmVzdHJpY3Rpb24oXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0KGNhcGFiaWxpdGllcykgPT4ge1xuXHRcdFx0cmV0dXJuIChjYXBhYmlsaXRpZXMgYXMgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzIHwgdW5kZWZpbmVkKT8uSW5zZXJ0UmVzdHJpY3Rpb25zPy5SZXF1aXJlZFByb3BlcnRpZXM7XG5cdFx0fSxcblx0XHRmYWxzZVxuXHQpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHByb3BlcnR5IGlzIGFubm90YXRlZCBhcyBhIHJlcXVpcmVkIHByb3BlcnR5LlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZFxuICovXG5mdW5jdGlvbiBpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkobmFtZTogc3RyaW5nLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0cmV0dXJuIGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpXG5cdFx0LmluY2x1ZGVzKG5hbWUpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgdHlwZSBvZiBhIGNvbHVtbiBmb3IgdGhlIGV4cG9ydC5cbiAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgZGF0YSB0eXBlIG9mIGEgcHJvcGVydHksIGNvbHVtblxuICogQHBhcmFtIGlzQVRpbWV6b25lIElzIHRoZSBnaXZlbiBwcm9wZXJ0eSBhIHRpbWV6b25lXG4gKiBAcGFyYW0gaXNDdXJyZW5jeSBJcyB0aGUgZ2l2ZW4gcHJvcGVydHkgYSBjdXJyZW5jeVxuICogQHBhcmFtIGV4cG9ydFNldHRpbmdzIFRoZSBhbHJlYWR5IGRldGVjdGVkIGV4cG9ydCBzZXR0aW5ncyBmcm9tIGRhdGFmaWVsZHNcbiAqIEByZXR1cm5zIFRoZSBzdXBwb3J0ZWQgZXhwb3J0IHR5cGVcbiAqL1xuZnVuY3Rpb24gZ2V0RXhwb3J0RGF0YVR5cGUoXG5cdGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdGlzQVRpbWV6b25lID0gZmFsc2UsXG5cdGlzQ3VycmVuY3kgPSBmYWxzZSxcblx0ZXhwb3J0U2V0dGluZ3M/OiBDb2x1bW5FeHBvcnRTZXR0aW5nc1xuKTogc3RyaW5nIHtcblx0bGV0IGV4cG9ydERhdGFUeXBlID0gXCJTdHJpbmdcIjtcblx0aWYgKCFkYXRhVHlwZSB8fCBleHBvcnRTZXR0aW5ncz8uZGF0YVBvaW50VGFyZ2V0VmFsdWUpIHtcblx0XHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG5cdH1cblx0aWYgKGV4cG9ydFNldHRpbmdzPy5pc0N1cnJlbmN5IHx8IGlzQ3VycmVuY3kpIHtcblx0XHRyZXR1cm4gXCJDdXJyZW5jeVwiO1xuXHR9XG5cdGlmIChpc0FUaW1lem9uZSkge1xuXHRcdHJldHVybiBcIlRpbWV6b25lXCI7XG5cdH1cblx0aWYgKGV4cG9ydFNldHRpbmdzPy53cmFwKSB7XG5cdFx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xuXHR9XG5cdHN3aXRjaCAoZGF0YVR5cGUpIHtcblx0XHRjYXNlIFwiRWRtLkRlY2ltYWxcIjpcblx0XHRjYXNlIFwiRWRtLkludDMyXCI6XG5cdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdGNhc2UgXCJFZG0uRG91YmxlXCI6XG5cdFx0Y2FzZSBcIkVkbS5CeXRlXCI6XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiTnVtYmVyXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkRhdGVPZlRpbWVcIjpcblx0XHRjYXNlIFwiRWRtLkRhdGVcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCI6XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiRGF0ZVRpbWVcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uVGltZU9mRGF5XCI6XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiVGltZVwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5Cb29sZWFuXCI6XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiQm9vbGVhblwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJTdHJpbmdcIjtcblx0fVxuXHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG59XG5cbi8qKlxuICogQWRkcyB0aGUgdG9vbHRpcCBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIGNvbHVtbi5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBvbiB0aGUgY29sdW1uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gdG8gYmUgdXBkYXRlZFxuICovXG5mdW5jdGlvbiBfYWRkVG9vbFRpcChwcm9wZXJ0eTogUHJvcGVydHksIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHRvb2x0aXAgPSBfZ2V0VG9vbHRpcChwcm9wZXJ0eSkgPz8gY29sdW1uLmxhYmVsO1xuXHRpZiAodG9vbHRpcCkge1xuXHRcdGNvbHVtbi50b29sdGlwID0gdG9vbHRpcDtcblx0fVxufVxuXG5mdW5jdGlvbiBfZ2V0Q29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzKFxuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHJlbGF0aXZlUGF0aCkubmF2aWdhdGlvblByb3BlcnRpZXM7XG5cdGlmIChuYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVsczogc3RyaW5nW10gPSBbXTtcblx0XHRuYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKChuYXZQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0Y29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzLnB1c2goZ2V0TGFiZWwobmF2UHJvcGVydHkpIHx8IG5hdlByb3BlcnR5Lm5hbWUpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHM7XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJvcGVydHkgdXNpbmcgdGhlIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvbiBzZXQgdG8gdGV4dCBvbmx5LlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgY29ycmVzcG9uZGluZyBEYXRhTW9kZWxPYmplY3RQYXRoLlxuICogQHBhcmFtIGxpbmVJdGVtIFRoZSBjb2x1bW4gdG8gYmUgZXZhbHVhdGVkLlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBUaGUgbGlzdCBvZiBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkgYmFzZWQgb24gdGhlIGNvbnRleHQuXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUFubm90YXRlZFRleHRPbmx5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzPixcblx0bGluZUl0ZW06IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZyxcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzOiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IHZvaWQge1xuXHRjb25zdCBpc1Byb3BlcnR5TmF2aWdhdGVkID1cblx0XHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoICE9PSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGg7XG5cdGlmIChpc1Byb3BlcnR5TmF2aWdhdGVkICYmIGlzRGF0YUZpZWxkKGxpbmVJdGVtKSkge1xuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtyZWxhdGl2ZVBhdGhdID0gbGluZUl0ZW0uVmFsdWUuJHRhcmdldDtcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2gocmVsYXRpdmVQYXRoKTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZEZvckFubm90YXRpb24obGluZUl0ZW0pICYmIGhhc0ZpZWxkR3JvdXBUYXJnZXQobGluZUl0ZW0pKSB7XG5cdFx0KGxpbmVJdGVtLlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGEuZm9yRWFjaCgoZmllbGQpID0+IHtcblx0XHRcdGlmIChpc0RhdGFGaWVsZChmaWVsZCkgJiYgZ2V0RGlzcGxheU1vZGUoZmllbGQuVmFsdWUuJHRhcmdldCwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUpID09PSBcIkRlc2NyaXB0aW9uXCIpIHtcblx0XHRcdFx0Y29uc3QgaW5oZXJlZFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRcdGZpZWxkLlZhbHVlLnBhdGhcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQgPVxuXHRcdFx0XHRcdGluaGVyZWRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoICE9PVxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aDtcblx0XHRcdFx0aWYgKGlzSW5oZXJlZFByb3BlcnR5TmF2aWdhdGVkKSB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2ZpZWxkLlZhbHVlLnBhdGhdID0gZmllbGQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2goZmllbGQuVmFsdWUucGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgdHlwZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSBvciBkYXRhIHR5cGUuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IG9yIGRhdGEgZmllbGQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIGNvbmZpZ3VyYXRpb24gZm9yLlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgdG8gdXNlIGZvciB0eXBlIGNvbmZpZ3VyYXRpb24gaWYgbm90IGRldGVybWluZWQgZnJvbSB0aGUgcHJvcGVydHkuXG4gKiBAcmV0dXJucyBUaGUgcHJvcGVydHkgdHlwZSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcocHJvcGVydHk6IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IHVuZGVmaW5lZCwgZGF0YVR5cGU/OiBzdHJpbmcpOiBQcm9wZXJ0eVR5cGVDb25maWcge1xuXHRsZXQgdGFyZ2V0TWFwcGluZyxcblx0XHRmb3JtYXRPcHRpb25zOiBQcm9wZXJ0eVR5cGVGb3JtYXRPcHRpb25zIHwgdW5kZWZpbmVkID0ge307XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdHRhcmdldE1hcHBpbmcgPSBpc1R5cGVEZWZpbml0aW9uKHByb3BlcnR5LnRhcmdldFR5cGUpXG5cdFx0XHQ/IEVETV9UWVBFX01BUFBJTkdbcHJvcGVydHkudGFyZ2V0VHlwZS51bmRlcmx5aW5nVHlwZV1cblx0XHRcdDogRURNX1RZUEVfTUFQUElOR1twcm9wZXJ0eS50eXBlXTtcblx0fVxuXHRpZiAoIXRhcmdldE1hcHBpbmcgJiYgZGF0YVR5cGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXTtcblx0fVxuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWc6IFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0XHR0eXBlOiB0YXJnZXRNYXBwaW5nPy50eXBlXG5cdH07XG5cdGlmICh0YXJnZXRNYXBwaW5nICYmIGlzUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0Y29uc3QgY29uc3RyYWludHMgPSBzZXRVcENvbnN0cmFpbnRzKHRhcmdldE1hcHBpbmcsIHByb3BlcnR5KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoY29uc3RyYWludHMpLmxlbmd0aCkge1xuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XG5cdFx0fVxuXHR9XG5cdGlmIChwcm9wZXJ0eVR5cGVDb25maWcudHlwZSAhPT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJlYW1cIikge1xuXHRcdGlmIChcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0KSB7XG5cdFx0XHRmb3JtYXRPcHRpb25zID0geyBwYXJzZUFzU3RyaW5nOiBmYWxzZSwgZW1wdHlTdHJpbmc6IFwiXCIgfTtcblx0XHR9XG5cdFx0aWYgKHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmIHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50cz8ubnVsbGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHRmb3JtYXRPcHRpb25zID0geyBwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IHRydWUgfTtcblx0XHR9XG5cdH1cblx0aWYgKE9iamVjdC5rZXlzKGZvcm1hdE9wdGlvbnMpLmxlbmd0aCkge1xuXHRcdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0gZm9ybWF0T3B0aW9ucztcblx0fVxuXHRyZXR1cm4gcHJvcGVydHlUeXBlQ29uZmlnO1xufVxuXG4vKipcbiAqIEFkZCBhIGRlc2NyaXB0aW9uIHByb3BlcnR5IHRvIHRoZSBsaXN0IG9mIGRlc2NyaXB0aW9uIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgY29sdW1ucyBvZiBhIHRhYmxlLlxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIGxpc3Qgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIHRleHQgb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb25cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtbiAobmFtZWQgYWxzbyBjb21wbGV4IHByb3BlcnR5KVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUgdG8gYmUgYWRkZWRcbiAqL1xuZnVuY3Rpb24gYWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRyZWxhdGVkUHJvcGVydHlOYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuXHRpZiAoXG5cdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gJiZcblx0XHQhZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcFtyZWxhdGVkUHJvcGVydHlOYW1lXVxuXHQpIHtcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdID1cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uITtcblx0fVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSByZWZlcmVuY2VkIHByb3BlcnRpZXMgb2YgYSBMaW5lSXRlbSBpbiBjYXNlIHRoZSBMaW5lSXRlbSBpcyBhbm5vdGF0ZWQgYXMgaGlkZGVuLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZnJvbSBMaW5lSXRlbXMgYW5kIGZyb20gcHJvcGVydGllcyBvZiBlbnRpdHlUeXBlXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBnaXZlbiBjb2x1bW4gZnJvbSBsaW5lSXRlbSBvciBwcm9wZXJ0eSBvZiBlbnRpdHlTZXRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMoZXhpc3RpbmdDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSwgbmFtZTogc3RyaW5nLCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbik6IHZvaWQge1xuXHRjb25zdCByZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMgPSBleGlzdGluZ0NvbHVtbnMuZmlsdGVyKFxuXHRcdChleGlzdGluZ0NvbHVtbikgPT5cblx0XHRcdChleGlzdGluZ0NvbHVtbi5wcm9wZXJ0eUluZm9zPy5pbmNsdWRlcyhuYW1lKSAmJiBleGlzdGluZ0NvbHVtbi5pc1BhcnRPZkxpbmVJdGVtKSB8fFxuXHRcdFx0KGV4aXN0aW5nQ29sdW1uLmlzUGFydE9mTGluZUl0ZW0gJiYgZXhpc3RpbmdDb2x1bW4ucmVsYXRpdmVQYXRoID09PSBjb2x1bW4ucmVsYXRpdmVQYXRoKVxuXHQpO1xuXHRjb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbSA9ICEhcmVsYXRlZEFubm90YXRpb25Db2x1bW5zLmxlbmd0aDtcblx0aWYgKFxuXHRcdHJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucy5sZW5ndGggJiZcblx0XHQhcmVsYXRlZEFubm90YXRpb25Db2x1bW5zPy5zb21lKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIilcblx0KSB7XG5cdFx0Y29sdW1uLnNvcnRhYmxlID0gZmFsc2U7XG5cdFx0Y29sdW1uLmlzR3JvdXBhYmxlID0gZmFsc2U7XG5cdFx0Y29sdW1uLmZpbHRlcmFibGUgPSBmYWxzZTtcblx0fVxufVxuXG4vKipcbiAqIEdldHMgdGhlIGV4cG9ydCBzZXR0aW5ncyBwcm9wZXJ0aWVzIG9mIGEgbWFuaWZlc3QgY29sdW1uLlxuICogQHBhcmFtIGV4cG9ydFNldHRpbmdzIFRoZSBjdXN0b21pemVkL292ZXJ3cml0dGVuIGV4cG9ydCBzZXR0aW5ncyBvZiBhIG1hbmlmZXN0IGNvbHVtblxuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmcm9tIExpbmVJdGVtc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlXG4gKiBAcGFyYW0gcHJvcGVydHlJbmZvcyBUaGUgcHJvcGVydGllcyBsaW5rZWQgdG8gYSBjb21wbGV4IGNvbHVtblxuICogQHBhcmFtIGNvbHVtbktleSBUaGUgY29sdW1uIGtleSBvZiB0aGUgY29sdW1uIHRvIGJlIG92ZXJ3cml0dGVuXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIG9mIHRoZSBjb2x1bW4gbWVyZ2luZyBjdXN0b21pemVkIGV4cG9ydCBzZXR0aW5ncyB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBkZXRlY3RlZCBvbiB0aGUgYW5ub3RhdGlvbiBjb2x1bW5cbiAqL1xuZnVuY3Rpb24gZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MoXG5cdGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdHByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXSxcblx0Y29sdW1uS2V5Pzogc3RyaW5nXG4pOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGwge1xuXHRsZXQgY29sdW1uRnJvbUFubm90YXRpb25zO1xuXHRpZiAoY29sdW1uS2V5KSB7XG5cdFx0Y29sdW1uRnJvbUFubm90YXRpb25zID0gYW5ub3RhdGlvbkNvbHVtbnMuZmluZCgoYW5ub3RhdGlvbkNvbHVtbikgPT4gYW5ub3RhdGlvbkNvbHVtbi5rZXkgPT09IGNvbHVtbktleSk7XG5cdFx0aWYgKGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3MgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzO1xuXHRcdH1cblx0fVxuXHRjb25zdCBlbmFibGVXcmFwcGluZyA9XG5cdFx0ZXhwb3J0U2V0dGluZ3M/LndyYXAgPz9cblx0XHQoISEoZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5ICYmIGV4cG9ydFNldHRpbmdzLnByb3BlcnR5Py5sZW5ndGggPiAxKSB8fCAhIShwcm9wZXJ0eUluZm9zICYmIHByb3BlcnR5SW5mb3MubGVuZ3RoID4gMSkpO1xuXG5cdGNvbnN0IGN1c3RvbUV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IHtcblx0XHQuLi5jb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzLFxuXHRcdHR5cGU6IGV4cG9ydFNldHRpbmdzPy50eXBlID8/IGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3M/LnR5cGUsXG5cdFx0dGVtcGxhdGU6XG5cdFx0XHRleHBvcnRTZXR0aW5ncz8udGVtcGxhdGUgPz9cblx0XHRcdF9hcHBlbmRDdXN0b21UZW1wbGF0ZShwcm9wZXJ0eUluZm9zLCBleHBvcnRTZXR0aW5ncz8ucHJvcGVydHkpID8/XG5cdFx0XHRjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZSxcblx0XHRwcm9wZXJ0eTogZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5LFxuXHRcdHdpZHRoOiBleHBvcnRTZXR0aW5ncz8ud2lkdGgsXG5cdFx0d3JhcDogZW5hYmxlV3JhcHBpbmcsXG5cdFx0bGFiZWw6IGV4cG9ydFNldHRpbmdzPy5sYWJlbCxcblx0XHR0ZXh0QWxpZ246IGV4cG9ydFNldHRpbmdzPy50ZXh0QWxpZ24sXG5cdFx0dHJ1ZVZhbHVlOiBleHBvcnRTZXR0aW5ncz8udHJ1ZVZhbHVlLFxuXHRcdGZhbHNlVmFsdWU6IGV4cG9ydFNldHRpbmdzPy5mYWxzZVZhbHVlLFxuXHRcdHZhbHVlTWFwOiBleHBvcnRTZXR0aW5ncz8udmFsdWVNYXBcblx0fTtcblx0cmV0dXJuIHJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyhjdXN0b21FeHBvcnRTZXR0aW5ncyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBc0dBO0VBTUE7RUFLQTtFQUlBO0VBZUE7RUE4QkE7RUF1Q0E7RUFBQSxJQTBDWUEsVUFBVSwwQkFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQ0E7SUFEVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBQSxPQUFWQSxVQUFVO0VBQUE7RUFNdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkFDLFFBQUEsQ0FBQUQsVUFBQSxHQUFBQSxVQUFBO0VBU08sU0FBU0UsZUFBZUEsQ0FDOUJDLGtCQUE0QixFQUM1QkMsU0FBb0IsRUFDcEJDLGlCQUF5QixFQUN6QkMsZ0JBQXlELEVBQ3pDO0lBQ2hCLE1BQU1DLGlCQUFpQixHQUFHQyx5QkFBeUIsQ0FBQ0wsa0JBQWtCLEVBQUVDLFNBQVMsRUFBRUMsaUJBQWlCLEVBQUVDLGdCQUFnQixDQUFDO0lBQ3ZILE1BQU1HLGVBQWUsR0FBR0Msc0JBQXNCLENBQzdDSixnQkFBZ0IsQ0FBQ0ssK0JBQStCLENBQTZCTixpQkFBaUIsQ0FBQyxDQUFDTyxP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