@sapui5/sap.fe.core 1.121.2 → 1.123.0
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.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +2 -2
- package/src/sap/fe/core/ActionRuntime.ts +1 -2
- package/src/sap/fe/core/CommonUtils.js +14 -171
- package/src/sap/fe/core/CommonUtils.ts +15 -221
- package/src/sap/fe/core/PageController.js +13 -1
- package/src/sap/fe/core/PageController.ts +16 -0
- package/src/sap/fe/core/TemplateComponent.js +6 -1
- package/src/sap/fe/core/TemplateComponent.ts +8 -0
- package/src/sap/fe/core/UIProvider.js +23 -0
- package/src/sap/fe/core/UIProvider.ts +38 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +97 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +120 -50
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +6 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +12 -18
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -3
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -0
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +42 -1
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +40 -0
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +5 -2
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +5 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.js +151 -60
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +165 -68
- package/src/sap/fe/core/controllerextensions/HookSupport.js +32 -14
- package/src/sap/fe/core/controllerextensions/HookSupport.ts +35 -14
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +5 -17
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -12
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +6 -6
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +15 -10
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +108 -287
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +117 -309
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -2
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +6 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +6 -6
- package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -4
- package/src/sap/fe/core/controllerextensions/Paginator.js +17 -110
- package/src/sap/fe/core/controllerextensions/Paginator.ts +13 -130
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +1 -2
- package/src/sap/fe/core/controllerextensions/Recommendations.js +36 -31
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +32 -37
- package/src/sap/fe/core/controllerextensions/Share.js +7 -7
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.js +52 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -4
- package/src/sap/fe/core/controllerextensions/ViewState.js +32 -46
- package/src/sap/fe/core/controllerextensions/ViewState.ts +24 -31
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +42 -31
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +168 -276
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +182 -310
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +4 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +3 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +74 -52
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +95 -55
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -17
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +10 -23
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +3 -3
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +2 -2
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +225 -0
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +241 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +69 -48
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +56 -33
- package/src/sap/fe/core/controls/FormElementWrapper.js +8 -11
- package/src/sap/fe/core/controls/FormElementWrapper.ts +9 -0
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +6 -14
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +12 -23
- package/src/sap/fe/core/converters/ConverterContext.js +17 -9
- package/src/sap/fe/core/converters/ConverterContext.ts +55 -41
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +19 -5
- package/src/sap/fe/core/converters/ManifestWrapper.js +14 -4
- package/src/sap/fe/core/converters/ManifestWrapper.ts +21 -10
- package/src/sap/fe/core/converters/MetaModelConverter.js +402 -383
- package/src/sap/fe/core/converters/MetaModelConverter.ts +538 -338
- package/src/sap/fe/core/converters/TemplateConverter.js +4 -2
- package/src/sap/fe/core/converters/TemplateConverter.ts +18 -13
- package/src/sap/fe/core/converters/annotations/DataField.js +30 -28
- package/src/sap/fe/core/converters/annotations/DataField.ts +58 -35
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -23
- package/src/sap/fe/core/converters/controls/Common/Action.js +5 -4
- package/src/sap/fe/core/converters/controls/Common/Action.ts +34 -28
- package/src/sap/fe/core/converters/controls/Common/Chart.js +37 -33
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +64 -46
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +31 -15
- package/src/sap/fe/core/converters/controls/Common/Form.js +6 -4
- package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +17 -11
- package/src/sap/fe/core/converters/controls/Common/Table.js +197 -101
- package/src/sap/fe/core/converters/controls/Common/Table.ts +393 -182
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +4 -5
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +38 -27
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +41 -11
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +112 -45
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +7 -7
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +18 -12
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +5 -4
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +19 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +64 -63
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +109 -100
- package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -11
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +35 -30
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +12 -9
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +1 -1
- package/src/sap/fe/core/converters/helpers/ID.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +6 -6
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +3 -3
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +11 -6
- package/src/sap/fe/core/converters/helpers/Key.js +2 -2
- package/src/sap/fe/core/converters/helpers/Key.ts +4 -4
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -2
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +21 -19
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +43 -31
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +16 -12
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +8 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +41 -21
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +5 -3
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +24 -19
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +2 -1
- package/src/sap/fe/core/filter/DraftEditState.fragment.xml +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -6
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +5 -4
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -13
- package/src/sap/fe/core/formatters/FPMFormatter.ts +11 -10
- package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat.ts +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.js +4 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/StandardFormatter.js +4 -7
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/ValueFormatter.js +35 -6
- package/src/sap/fe/core/formatters/ValueFormatter.ts +31 -3
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +54 -33
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +62 -41
- package/src/sap/fe/core/helpers/BindingToolkit.js +17 -3
- package/src/sap/fe/core/helpers/BindingToolkit.ts +28 -6
- package/src/sap/fe/core/helpers/ClassSupport.js +32 -13
- package/src/sap/fe/core/helpers/ClassSupport.ts +35 -15
- package/src/sap/fe/core/helpers/DeleteHelper.js +71 -61
- package/src/sap/fe/core/helpers/DeleteHelper.ts +125 -103
- package/src/sap/fe/core/helpers/DraftEditState.js +5 -3
- package/src/sap/fe/core/helpers/DraftEditState.ts +3 -1
- package/src/sap/fe/core/helpers/FPMHelper.js +43 -46
- package/src/sap/fe/core/helpers/FPMHelper.ts +50 -56
- package/src/sap/fe/core/helpers/MetaModelFunction.js +77 -53
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +78 -57
- package/src/sap/fe/core/helpers/ModelHelper.js +10 -4
- package/src/sap/fe/core/helpers/ModelHelper.ts +12 -6
- package/src/sap/fe/core/helpers/PasteHelper.js +194 -7
- package/src/sap/fe/core/helpers/PasteHelper.ts +265 -13
- package/src/sap/fe/core/helpers/PromiseKeeper.js +66 -0
- package/src/sap/fe/core/helpers/PromiseKeeper.ts +56 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +30 -19
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +34 -22
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -2
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +26 -52
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +37 -63
- package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
- package/src/sap/fe/core/helpers/TitleHelper.ts +17 -14
- package/src/sap/fe/core/helpers/TypeGuards.js +27 -3
- package/src/sap/fe/core/helpers/TypeGuards.ts +37 -7
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +48 -8
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +40 -9
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +5 -2
- package/src/sap/fe/core/messagebundle_da.properties +1 -1
- package/src/sap/fe/core/messagebundle_en.properties +267 -2
- package/src/sap/fe/core/messagebundle_sl.properties +1 -1
- package/src/sap/fe/core/operationsHelper.js +2 -1
- package/src/sap/fe/core/operationsHelper.ts +1 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.js +27 -14
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +27 -14
- package/src/sap/fe/core/services/ShellServicesFactory.js +49 -12
- package/src/sap/fe/core/services/ShellServicesFactory.ts +62 -13
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +156 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +218 -100
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +3 -3
- package/src/sap/fe/core/services/TelemetryServiceFactory.ts +6 -6
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +3 -2
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +6 -3
- package/src/sap/fe/core/templating/CommonFormatters.ts +13 -12
- package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +37 -14
- package/src/sap/fe/core/templating/DataFieldFormatters.js +12 -11
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +35 -24
- package/src/sap/fe/core/templating/DataModelPathHelper.js +22 -18
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +61 -51
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +8 -3
- package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
- package/src/sap/fe/core/templating/EntityTypeHelper.ts +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js +3 -3
- package/src/sap/fe/core/templating/FieldControlHelper.ts +27 -8
- package/src/sap/fe/core/templating/FilterHelper.js +13 -10
- package/src/sap/fe/core/templating/FilterHelper.ts +80 -46
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +2 -2
- package/src/sap/fe/core/templating/PropertyFormatters.js +6 -8
- package/src/sap/fe/core/templating/PropertyFormatters.ts +11 -11
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
- package/src/sap/fe/core/templating/PropertyHelper.ts +4 -4
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +157 -13
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +182 -16
- package/src/sap/fe/core/templating/UIFormatters.js +23 -22
- package/src/sap/fe/core/templating/UIFormatters.ts +94 -66
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -2
- package/src/sap/fe/core/type/EDM.js +1 -1
- package/src/sap/fe/core/type/EDM.ts +2 -2
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +1 -1
- package/src/sap/fe/core/type/FiscalDate.js +2 -2
- package/src/sap/fe/core/type/FiscalDate.ts +2 -2
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/merge", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/merge", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticDateOperators", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/templating/FilterHelper", "sap/ui/Device", "sap/ui/core/Component", "sap/ui/core/Fragment", "sap/ui/core/XMLTemplateProcessor", "sap/ui/core/util/XMLPreprocessor", "sap/ui/mdc/condition/FilterOperatorUtil", "sap/ui/mdc/enums/BaseType", "sap/ui/mdc/odata/v4/TypeMap", "sap/ui/model/Filter", "./controls/AnyElement", "./converters/helpers/SelectionVariantHelper", "./helpers/MetaModelFunction"], function (Log, uniqueSort, mergeObjects, ConverterContext, MetaModelConverter, ModelHelper, SemanticDateOperators, StableIdHelper, FilterHelper, Device, Component, Fragment, XMLTemplateProcessor, XMLPreprocessor, FilterOperatorUtil, BaseType, TypeMap, Filter, AnyElement, SelectionVariantHelper, MetaModelFunction) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
@@ -10,8 +10,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
|
|
|
10
10
|
var isSelectionVariant = FilterHelper.isSelectionVariant;
|
|
11
11
|
var isSelectionPresentationVariant = FilterHelper.isSelectionPresentationVariant;
|
|
12
12
|
var generate = StableIdHelper.generate;
|
|
13
|
-
var pathInModel = BindingToolkit.pathInModel;
|
|
14
|
-
var compileExpression = BindingToolkit.compileExpression;
|
|
15
13
|
function normalizeSearchTerm(sSearchTerm) {
|
|
16
14
|
if (!sSearchTerm) {
|
|
17
15
|
return undefined;
|
|
@@ -846,75 +844,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
|
|
|
846
844
|
});
|
|
847
845
|
});
|
|
848
846
|
}
|
|
849
|
-
async function fnUpdateSemanticTargetsModel(aGetLinksPromises, aSemanticObjects, oInternalModelContext, sCurrentHash) {
|
|
850
|
-
return Promise.all(aGetLinksPromises).then(function (aValues) {
|
|
851
|
-
let aLinks,
|
|
852
|
-
_oLink,
|
|
853
|
-
_sLinkIntentAction,
|
|
854
|
-
aFinalLinks = [];
|
|
855
|
-
let oFinalSemanticObjects = {};
|
|
856
|
-
const bIntentHasActions = function (sIntent, aActions) {
|
|
857
|
-
for (const intent in aActions) {
|
|
858
|
-
if (intent === sIntent) {
|
|
859
|
-
return true;
|
|
860
|
-
} else {
|
|
861
|
-
return false;
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
};
|
|
865
|
-
for (let k = 0; k < aValues.length; k++) {
|
|
866
|
-
aLinks = aValues[k];
|
|
867
|
-
if (aLinks && aLinks.length > 0 && aLinks[0] !== undefined) {
|
|
868
|
-
const oSemanticObject = {};
|
|
869
|
-
let oTmp;
|
|
870
|
-
let sAlternatePath;
|
|
871
|
-
for (let i = 0; i < aLinks.length; i++) {
|
|
872
|
-
aFinalLinks.push([]);
|
|
873
|
-
let hasTargetsNotFiltered = false;
|
|
874
|
-
let hasTargets = false;
|
|
875
|
-
for (const element of aLinks[i]) {
|
|
876
|
-
_oLink = element;
|
|
877
|
-
_sLinkIntentAction = _oLink && _oLink.intent.split("?")[0].split("-")[1];
|
|
878
|
-
if (!(_oLink && _oLink.intent && _oLink.intent.indexOf(sCurrentHash) === 0)) {
|
|
879
|
-
hasTargetsNotFiltered = true;
|
|
880
|
-
if (!bIntentHasActions(_sLinkIntentAction, aSemanticObjects[k].unavailableActions)) {
|
|
881
|
-
aFinalLinks[i].push(_oLink);
|
|
882
|
-
hasTargets = true;
|
|
883
|
-
}
|
|
884
|
-
}
|
|
885
|
-
}
|
|
886
|
-
oTmp = {
|
|
887
|
-
semanticObject: aSemanticObjects[k].semanticObject,
|
|
888
|
-
path: aSemanticObjects[k].path,
|
|
889
|
-
HasTargets: hasTargets,
|
|
890
|
-
HasTargetsNotFiltered: hasTargetsNotFiltered
|
|
891
|
-
};
|
|
892
|
-
if (oSemanticObject[aSemanticObjects[k].semanticObject] === undefined) {
|
|
893
|
-
oSemanticObject[aSemanticObjects[k].semanticObject] = {};
|
|
894
|
-
}
|
|
895
|
-
sAlternatePath = aSemanticObjects[k].path.replace(/\//g, "_");
|
|
896
|
-
if (oSemanticObject[aSemanticObjects[k].semanticObject][sAlternatePath] === undefined) {
|
|
897
|
-
oSemanticObject[aSemanticObjects[k].semanticObject][sAlternatePath] = {};
|
|
898
|
-
}
|
|
899
|
-
oSemanticObject[aSemanticObjects[k].semanticObject][sAlternatePath] = Object.assign(oSemanticObject[aSemanticObjects[k].semanticObject][sAlternatePath], oTmp);
|
|
900
|
-
}
|
|
901
|
-
const sSemanticObjectName = Object.keys(oSemanticObject)[0];
|
|
902
|
-
if (Object.keys(oFinalSemanticObjects).includes(sSemanticObjectName)) {
|
|
903
|
-
oFinalSemanticObjects[sSemanticObjectName] = Object.assign(oFinalSemanticObjects[sSemanticObjectName], oSemanticObject[sSemanticObjectName]);
|
|
904
|
-
} else {
|
|
905
|
-
oFinalSemanticObjects = Object.assign(oFinalSemanticObjects, oSemanticObject);
|
|
906
|
-
}
|
|
907
|
-
aFinalLinks = [];
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
if (Object.keys(oFinalSemanticObjects).length > 0) {
|
|
911
|
-
oInternalModelContext.setProperty("semanticsTargets", mergeObjects(oFinalSemanticObjects, oInternalModelContext.getProperty("semanticsTargets")));
|
|
912
|
-
return oFinalSemanticObjects;
|
|
913
|
-
}
|
|
914
|
-
}).catch(function (oError) {
|
|
915
|
-
Log.error("fnUpdateSemanticTargetsModel: Cannot read links", oError);
|
|
916
|
-
});
|
|
917
|
-
}
|
|
918
847
|
async function fnGetSemanticObjectPromise(oMetaModel, sPath, sQualifier) {
|
|
919
848
|
return CommonUtils.getSemanticObjectsFromPath(oMetaModel, sPath, sQualifier);
|
|
920
849
|
}
|
|
@@ -933,98 +862,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
|
|
|
933
862
|
}
|
|
934
863
|
}
|
|
935
864
|
}
|
|
936
|
-
async function fnGetSemanticTargetsFromPageModel(oController, sPageModel) {
|
|
937
|
-
const _fnfindValuesHelper = function (obj, key, list) {
|
|
938
|
-
if (!obj) {
|
|
939
|
-
return list;
|
|
940
|
-
}
|
|
941
|
-
if (obj instanceof Array) {
|
|
942
|
-
obj.forEach(item => {
|
|
943
|
-
list = list.concat(_fnfindValuesHelper(item, key, []));
|
|
944
|
-
});
|
|
945
|
-
return list;
|
|
946
|
-
}
|
|
947
|
-
if (obj[key]) {
|
|
948
|
-
list.push(obj[key]);
|
|
949
|
-
}
|
|
950
|
-
if (typeof obj == "object" && obj !== null) {
|
|
951
|
-
const children = Object.keys(obj);
|
|
952
|
-
if (children.length > 0) {
|
|
953
|
-
for (const element of children) {
|
|
954
|
-
list = list.concat(_fnfindValuesHelper(obj[element], key, []));
|
|
955
|
-
}
|
|
956
|
-
}
|
|
957
|
-
}
|
|
958
|
-
return list;
|
|
959
|
-
};
|
|
960
|
-
const _fnfindValues = function (obj, key) {
|
|
961
|
-
return _fnfindValuesHelper(obj, key, []);
|
|
962
|
-
};
|
|
963
|
-
const _fnDeleteDuplicateSemanticObjects = function (aSemanticObjectPath) {
|
|
964
|
-
return aSemanticObjectPath.filter(function (value, index) {
|
|
965
|
-
return aSemanticObjectPath.indexOf(value) === index;
|
|
966
|
-
});
|
|
967
|
-
};
|
|
968
|
-
const oView = oController.getView();
|
|
969
|
-
const oInternalModelContext = oView.getBindingContext("internal");
|
|
970
|
-
if (oInternalModelContext) {
|
|
971
|
-
const aSemanticObjectsPromises = [];
|
|
972
|
-
const oComponent = oController.getOwnerComponent();
|
|
973
|
-
const oAppComponent = Component.getOwnerComponentFor(oComponent);
|
|
974
|
-
const oMetaModel = oAppComponent.getMetaModel();
|
|
975
|
-
let oPageModel = oComponent.getModel(sPageModel).getData();
|
|
976
|
-
if (JSON.stringify(oPageModel) === "{}") {
|
|
977
|
-
oPageModel = oComponent.getModel(sPageModel)._getObject("/", undefined);
|
|
978
|
-
}
|
|
979
|
-
let aSemanticObjectsFound = _fnfindValues(oPageModel, "semanticObjectPath");
|
|
980
|
-
aSemanticObjectsFound = _fnDeleteDuplicateSemanticObjects(aSemanticObjectsFound);
|
|
981
|
-
const oShellServiceHelper = oAppComponent.getShellServices();
|
|
982
|
-
let sCurrentHash = oShellServiceHelper.getHash();
|
|
983
|
-
const aSemanticObjects = [];
|
|
984
|
-
let _oSemanticObject;
|
|
985
|
-
if (sCurrentHash && sCurrentHash.includes("?")) {
|
|
986
|
-
// sCurrentHash can contain query string, cut it off!
|
|
987
|
-
sCurrentHash = sCurrentHash.split("?")[0];
|
|
988
|
-
}
|
|
989
|
-
fnPrepareSemanticObjectsPromises(oMetaModel, aSemanticObjectsFound, aSemanticObjectsPromises);
|
|
990
|
-
if (aSemanticObjectsPromises.length === 0) {
|
|
991
|
-
return Promise.resolve();
|
|
992
|
-
} else {
|
|
993
|
-
Promise.all(aSemanticObjectsPromises).then(async function (aValues) {
|
|
994
|
-
const aGetLinksPromises = [];
|
|
995
|
-
let sSemObjExpression;
|
|
996
|
-
const aSemanticObjectsResolved = aValues.filter(function (element) {
|
|
997
|
-
if (element.semanticObject !== undefined && element.semanticObject.semanticObject && typeof element.semanticObject.semanticObject === "object") {
|
|
998
|
-
sSemObjExpression = compileExpression(pathInModel(element.semanticObject.semanticObject.$Path));
|
|
999
|
-
element.semanticObject.semanticObject = sSemObjExpression;
|
|
1000
|
-
element.semanticObjectForGetLinks[0].semanticObject = sSemObjExpression;
|
|
1001
|
-
return true;
|
|
1002
|
-
} else if (element) {
|
|
1003
|
-
return element.semanticObject !== undefined;
|
|
1004
|
-
} else {
|
|
1005
|
-
return false;
|
|
1006
|
-
}
|
|
1007
|
-
});
|
|
1008
|
-
for (const item of aSemanticObjectsResolved) {
|
|
1009
|
-
_oSemanticObject = item;
|
|
1010
|
-
if (_oSemanticObject && _oSemanticObject.semanticObject && _oSemanticObject.semanticObject.semanticObject.indexOf("{") !== 0) {
|
|
1011
|
-
aSemanticObjects.push({
|
|
1012
|
-
semanticObject: _oSemanticObject.semanticObject.semanticObject,
|
|
1013
|
-
unavailableActions: _oSemanticObject.unavailableActions,
|
|
1014
|
-
path: item.semanticObjectPath
|
|
1015
|
-
});
|
|
1016
|
-
aGetLinksPromises.push(oShellServiceHelper.getLinksWithCache([_oSemanticObject.semanticObjectForGetLinks]));
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
1019
|
-
return CommonUtils.updateSemanticTargets(aGetLinksPromises, aSemanticObjects, oInternalModelContext, sCurrentHash);
|
|
1020
|
-
}).catch(function (oError) {
|
|
1021
|
-
Log.error("fnGetSemanticTargetsFromTable: Cannot get Semantic Objects", oError);
|
|
1022
|
-
});
|
|
1023
|
-
}
|
|
1024
|
-
} else {
|
|
1025
|
-
return Promise.resolve();
|
|
1026
|
-
}
|
|
1027
|
-
}
|
|
1028
865
|
function getFilterAllowedExpression(oFilterRestrictionsAnnotation) {
|
|
1029
866
|
const mAllowedExpressions = {};
|
|
1030
867
|
if (oFilterRestrictionsAnnotation && oFilterRestrictionsAnnotation.FilterExpressionRestrictions !== undefined) {
|
|
@@ -1144,13 +981,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
|
|
|
1144
981
|
}
|
|
1145
982
|
async function templateControlFragment(sFragmentName, oPreprocessorSettings, oOptions, oModifier) {
|
|
1146
983
|
oOptions = oOptions || {};
|
|
1147
|
-
if (oModifier) {
|
|
984
|
+
if (oModifier && typeof sFragmentName === "string") {
|
|
1148
985
|
return oModifier.templateControlFragment(sFragmentName, oPreprocessorSettings, oOptions.view).then(function (oFragment) {
|
|
1149
986
|
// This is required as Flex returns an HTMLCollection as templating result in XML time.
|
|
1150
987
|
return oModifier.targets === "xmlTree" && oFragment.length > 0 ? oFragment[0] : oFragment;
|
|
1151
988
|
});
|
|
1152
989
|
} else {
|
|
1153
|
-
const
|
|
990
|
+
const fragmentData = typeof sFragmentName === "string" ? XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment") : sFragmentName;
|
|
991
|
+
const oFragment = await XMLPreprocessor.process(fragmentData, {
|
|
1154
992
|
name: sFragmentName
|
|
1155
993
|
}, oPreprocessorSettings);
|
|
1156
994
|
const oControl = oFragment.firstElementChild;
|
|
@@ -1166,11 +1004,18 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
|
|
|
1166
1004
|
owner = viewOwner;
|
|
1167
1005
|
}
|
|
1168
1006
|
}
|
|
1007
|
+
let containingView;
|
|
1008
|
+
if (oOptions.view && !oOptions.controller) {
|
|
1009
|
+
// this is overall stupid, in case we are coming from the delegate with an xml node instead of a fragment we need to pass the containingView in there (done by the oModifier call for instance)
|
|
1010
|
+
// But in other runtime case where we are here we need to maintain the controller and thus cannot have a containingView...
|
|
1011
|
+
containingView = oOptions.view;
|
|
1012
|
+
}
|
|
1169
1013
|
return owner.runAsOwner(async () => {
|
|
1170
1014
|
return Fragment.load({
|
|
1171
1015
|
id: oOptions.id,
|
|
1172
1016
|
definition: oFragment,
|
|
1173
|
-
controller: oOptions.controller
|
|
1017
|
+
controller: oOptions.controller,
|
|
1018
|
+
containingView: containingView
|
|
1174
1019
|
});
|
|
1175
1020
|
});
|
|
1176
1021
|
}
|
|
@@ -1283,7 +1128,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
|
|
|
1283
1128
|
}
|
|
1284
1129
|
function getConverterContextForPath(sMetaPath, oMetaModel, sEntitySet, oDiagnostics) {
|
|
1285
1130
|
const oContext = oMetaModel.createBindingContext(sMetaPath);
|
|
1286
|
-
return ConverterContext === null || ConverterContext === void 0 ? void 0 : ConverterContext.createConverterContextForMacro(sEntitySet, oContext || oMetaModel, oDiagnostics, mergeObjects
|
|
1131
|
+
return ConverterContext === null || ConverterContext === void 0 ? void 0 : ConverterContext.createConverterContextForMacro(sEntitySet, oContext || oMetaModel, oDiagnostics, mergeObjects);
|
|
1287
1132
|
}
|
|
1288
1133
|
|
|
1289
1134
|
/**
|
|
@@ -1350,9 +1195,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
|
|
|
1350
1195
|
getSemanticObjectMapping: getSemanticObjectMapping,
|
|
1351
1196
|
setSemanticObjectMappings: setSemanticObjectMappings,
|
|
1352
1197
|
getSemanticObjectPromise: fnGetSemanticObjectPromise,
|
|
1353
|
-
getSemanticTargetsFromPageModel: fnGetSemanticTargetsFromPageModel,
|
|
1354
1198
|
getSemanticObjectsFromPath: fnGetSemanticObjectsFromPath,
|
|
1355
|
-
updateSemanticTargets: fnUpdateSemanticTargetsModel,
|
|
1356
1199
|
waitForContextRequested: waitForContextRequested,
|
|
1357
1200
|
getFilterRestrictionsByPath: getFilterRestrictionsByPath,
|
|
1358
1201
|
getSpecificAllowedExpression: getSpecificAllowedExpression,
|
|
@@ -1381,4 +1224,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
|
|
|
1381
1224
|
};
|
|
1382
1225
|
return CommonUtils;
|
|
1383
1226
|
}, false);
|
|
1384
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemVTZWFyY2hUZXJtIiwic1NlYXJjaFRlcm0iLCJ1bmRlZmluZWQiLCJyZXBsYWNlIiwic3BsaXQiLCJyZWR1Y2UiLCJzTm9ybWFsaXplZCIsInNDdXJyZW50V29yZCIsIndhaXRGb3JDb250ZXh0UmVxdWVzdGVkIiwiYmluZGluZ0NvbnRleHQiLCJtb2RlbCIsImdldE1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZW50aXR5UGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImRhdGFNb2RlbCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldENvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJ0YXJnZXRFbnRpdHlUeXBlIiwia2V5cyIsIm5hbWUiLCJmbkhhc1RyYW5zaWVudENvbnRleHRzIiwib0xpc3RCaW5kaW5nIiwiYkhhc1RyYW5zaWVudENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZm9yRWFjaCIsIm9Db250ZXh0IiwiaXNUcmFuc2llbnQiLCJfZ2V0U09JbnRlbnRzIiwib1NoZWxsU2VydmljZUhlbHBlciIsIm9PYmplY3RQYWdlTGF5b3V0Iiwib1NlbWFudGljT2JqZWN0Iiwib1BhcmFtIiwiZ2V0TGlua3MiLCJzZW1hbnRpY09iamVjdCIsInBhcmFtcyIsIl9jcmVhdGVNYXBwaW5ncyIsIm9NYXBwaW5nIiwiYVNPTWFwcGluZ3MiLCJhTWFwcGluZ0tleXMiLCJPYmplY3QiLCJvU2VtYW50aWNNYXBwaW5nIiwiZWxlbWVudCIsIkxvY2FsUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiU2VtYW50aWNPYmplY3RQcm9wZXJ0eSIsInB1c2giLCJfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMiLCJsaW5rR3JvdXAiLCJhRXhjbHVkZWRBY3Rpb25zIiwib1RhcmdldFBhcmFtcyIsImFJdGVtcyIsImFBbGxvd2VkQWN0aW9ucyIsImxpbmtzIiwib0xpbmsiLCJzSW50ZW50IiwiaW50ZW50Iiwic0FjdGlvbiIsImluY2x1ZGVzIiwidGV4dCIsInRhcmdldFNlbU9iamVjdCIsInRhcmdldEFjdGlvbiIsInRhcmdldFBhcmFtcyIsIl9nZXRSZWxhdGVkSW50ZW50cyIsIm9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzIiwib0JpbmRpbmdDb250ZXh0IiwiYU1hbmlmZXN0U09JdGVtcyIsImFMaW5rcyIsImxlbmd0aCIsImFsbG93ZWRBY3Rpb25zIiwidW5hdmFpbGFibGVBY3Rpb25zIiwibWFwcGluZyIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIl9nZXRSZWxhdGVkSW50ZW50c1dpdGhTZW1hbnRpY09iamVjdHNBbmRBY3Rpb24iLCJzZW1hbnRpY09iamVjdEFuZEFjdGlvbiIsImFwcENvbXBvbmVudFNPSXRlbXMiLCJhY3Rpb25zIiwiYWN0aW9uIiwiZXhjbHVkZWRBY3Rpb25zIiwic29NYXBwaW5ncyIsInVwZGF0ZVJlbGF0ZUFwcHNNb2RlbCIsIm9FbnRyeSIsImFTZW1LZXlzIiwib01ldGFNb2RlbCIsIm9NZXRhUGF0aCIsImFwcENvbXBvbmVudCIsImdldFNoZWxsU2VydmljZXMiLCJzQ3VycmVudFNlbU9iaiIsInNDdXJyZW50QWN0aW9uIiwib1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMiLCJhUmVsYXRlZEFwcHNNZW51SXRlbXMiLCJhTWFuaWZlc3RTT0tleXMiLCJmbkdldFBhcnNlU2hlbGxIYXNoQW5kR2V0TGlua3MiLCJvUGFyc2VkVXJsIiwicGFyc2VTaGVsbEhhc2giLCJkb2N1bWVudCIsImxvY2F0aW9uIiwiaGFzaCIsInNTZW1LZXkiLCJ2YWx1ZSIsImFUZWNobmljYWxLZXlzIiwiZ2V0T2JqZWN0Iiwia2V5Iiwic09iaktleSIsIm9NYW5pZmVzdERhdGEiLCJnZXRUYXJnZXRWaWV3IiwiZ2V0Vmlld0RhdGEiLCJzZW1hbnRpY09iamVjdEludGVudHMiLCJhZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjb21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsImZlRW52aXJvbm1lbnQiLCJnZXRJbnRlbnQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiaXNTZW1hbnRpY09iamVjdEhhc1NhbWVUYXJnZXRJbk1hbmlmZXN0IiwiYUFubm90YXRpb25zU09JdGVtcyIsInNFbnRpdHlTZXRQYXRoIiwic0VudGl0eVR5cGVQYXRoIiwib0VudGl0eVNldEFubm90YXRpb25zIiwiQ29tbW9uVXRpbHMiLCJnZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zIiwiYkhhc0VudGl0eVNldFNPIiwib0VudGl0eVR5cGVBbm5vdGF0aW9ucyIsImFVbmF2YWlsYWJsZUFjdGlvbnMiLCJhTWFwcGluZ3MiLCJzb0l0ZW1zIiwiY29uY2F0Iiwic2V0UHJvcGVydHkiLCJlcnJvciIsIkxvZyIsIl9nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zIiwib0VudGl0eUFubm90YXRpb25zIiwic0Fubm90YXRpb25NYXBwaW5nVGVybSIsInNBbm5vdGF0aW9uQWN0aW9uVGVybSIsInNRdWFsaWZpZXIiLCJmblVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsInBhdGgiLCJzU2VtYW50aWNLZXlWb2NhYnVsYXJ5IiwicmVxdWVzdE9iamVjdCIsInRoZW4iLCJyZXF1ZXN0ZWRPYmplY3QiLCJjYXRjaCIsIm9FcnJvciIsImZuRmlyZUJ1dHRvblByZXNzIiwib0J1dHRvbiIsImlzQSIsImdldFZpc2libGUiLCJnZXRFbmFibGVkIiwiZmlyZVByZXNzIiwiZ2V0QXBwQ29tcG9uZW50Iiwib0NvbnRyb2wiLCJvT3duZXIiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIkVycm9yIiwiZ2V0Q3VycmVudFBhZ2VWaWV3Iiwib0FwcENvbXBvbmVudCIsInJvb3RWaWV3Q29udHJvbGxlciIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdFZpZXciLCJnZXRSb290Q29udGFpbmVyIiwiZ2V0Q3VycmVudFBhZ2UiLCJvQ29tcG9uZW50IiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJnZXRSb290Q29udHJvbCIsImdldFBhcmVudCIsIl9mbkNoZWNrSXNNYXRjaCIsIm9PYmplY3QiLCJvS2V5c1RvQ2hlY2siLCJzS2V5IiwiZm5HZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCJtZXRhTW9kZWxDb250ZXh0Iiwic0NvbnRleHRQYXRoIiwib0ZpbHRlciIsIm9FbnRpdHlUeXBlIiwib1Byb3BlcnRpZXMiLCJoYXNPd25Qcm9wZXJ0eSIsInRlc3QiLCIka2luZCIsImZuR2V0SUJOQWN0aW9ucyIsImFJQk5BY3Rpb25zIiwiYUFjdGlvbnMiLCJnZXRBY3Rpb25zIiwib0FjdGlvbiIsImdldEFjdGlvbiIsIm9NZW51IiwiZ2V0TWVudSIsImdldEl0ZW1zIiwib0l0ZW0iLCJkYXRhIiwiZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsIm9WaWV3Iiwib1BhcmFtcyIsImlzU3RpY2t5IiwiTW9kZWxIZWxwZXIiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJmbkdldExpbmtzIiwib0RhdGEiLCJhS2V5cyIsImluZGV4T2YiLCJvSUJOQWN0aW9uIiwic1NlbWFudGljT2JqZWN0IiwiYUxpbmsiLCJzZXRWaXNpYmxlIiwiZ2V0SWQiLCJzaGVsbE5hdmlnYXRpb25Ob3RBdmFpbGFibGUiLCJnZXRBY3Rpb25QYXRoIiwiYWN0aW9uQ29udGV4dCIsImJSZXR1cm5Pbmx5UGF0aCIsImluQWN0aW9uTmFtZSIsImJDaGVja1N0YXRpY1ZhbHVlIiwic0FjdGlvbk5hbWUiLCJ0b1N0cmluZyIsInNFbnRpdHlUeXBlTmFtZSIsIiRUeXBlIiwic0VudGl0eU5hbWUiLCJnZXRFbnRpdHlTZXROYW1lIiwic1Byb3BlcnR5Iiwic0JpbmRpbmdQYXJhbWV0ZXIiLCJzRW50aXR5VHlwZSIsIm9FbnRpdHlDb250YWluZXIiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJvUHJvcGVydHlBbm5vdGF0aW9ucyIsIm9Db2xsZWN0aW9uQW5ub3RhdGlvbnMiLCJvVGV4dEFubm90YXRpb24iLCJvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbiIsIiRFbnVtTWVtYmVyIiwiX2dldEVudGl0eVR5cGUiLCJfcmVxdWVzdE9iamVjdCIsIm9TZWxlY3RlZENvbnRleHQiLCJuQnJhY2tldEluZGV4Iiwic1RhcmdldFR5cGUiLCJzbGljZSIsInNDdXJyZW50VHlwZSIsImdldEJpbmRpbmciLCJ3YXJuaW5nIiwic0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCIsIm9Qcm9taXNlIiwicmVxdWVzdFNpbmdsZXRvblByb3BlcnR5IiwidlByb3BlcnR5VmFsdWUiLCJzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJhUmVxdWVzdFByb21pc2VzIiwiZm9yQ29udGV4dE1lbnUiLCJhbGwiLCJhUmVzdWx0cyIsImFBcHBsaWNhYmxlQ29udGV4dHMiLCJhTm90QXBwbGljYWJsZUNvbnRleHRzIiwiYVJlc3VsdCIsInNldER5bmFtaWNBY3Rpb25Db250ZXh0cyIsInRyYWNlIiwiYXBwbGljYWJsZSIsIm5vdEFwcGxpY2FibGUiLCJkeW5hbWljQWN0aW9uUGF0aFByZWZpeCIsImludGVybmFsTW9kZWwiLCJhcHBsaWNhYmxlUHJvcGVydHkiLCJub3RBcHBsaWNhYmxlUHJvcGVydHkiLCJfZ2V0RGVmYXVsdE9wZXJhdG9ycyIsInNQcm9wZXJ0eVR5cGUiLCJvRGF0YUNsYXNzIiwiVHlwZU1hcCIsImdldERhdGFUeXBlQ2xhc3NOYW1lIiwib0Jhc2VUeXBlIiwiZ2V0QmFzZVR5cGUiLCJGaWx0ZXJPcGVyYXRvclV0aWwiLCJnZXRPcGVyYXRvcnNGb3JUeXBlIiwiX2dldFJlc3RyaWN0aW9ucyIsImFEZWZhdWx0T3BzIiwiYUV4cHJlc3Npb25PcHMiLCJmaWx0ZXIiLCJzRWxlbWVudCIsImdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24iLCJhRXhwcmVzc2lvbnMiLCJhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkiLCJBbGxvd2VkRXhwcmVzc2lvbnNQcmlvIiwic29ydCIsImEiLCJiIiwiZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkiLCJzVHlwZSIsImJVc2VTZW1hbnRpY0RhdGVSYW5nZSIsInNldHRpbmdzIiwib0ZpbHRlclJlc3RyaWN0aW9ucyIsImdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aCIsImFFcXVhbHNPcHMiLCJhU2luZ2xlUmFuZ2VPcHMiLCJhU2luZ2xlUmFuZ2VEVEJhc2ljT3BzIiwiYVNpbmdsZVZhbHVlRGF0ZU9wcyIsImFNdWx0aVJhbmdlT3BzIiwiYVNlYXJjaEV4cHJlc3Npb25PcHMiLCJhU2VtYW50aWNEYXRlT3BzRXh0IiwiU2VtYW50aWNEYXRlT3BlcmF0b3JzIiwiZ2V0U3VwcG9ydGVkT3BlcmF0aW9ucyIsImJTZW1hbnRpY0RhdGVSYW5nZSIsImFTZW1hbnRpY0RhdGVPcHMiLCJvU2V0dGluZ3MiLCJKU09OIiwicGFyc2UiLCJjdXN0b21EYXRhIiwib3BlcmF0b3JDb25maWd1cmF0aW9uIiwiZ2V0RmlsdGVyT3BlcmF0aW9ucyIsImdldFNlbWFudGljRGF0ZU9wZXJhdGlvbnMiLCJhRGVmYXVsdE9wZXJhdG9ycyIsInJlc3RyaWN0aW9ucyIsIkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyIsInNBbGxvd2VkRXhwcmVzc2lvbiIsImFTaW5nbGVWYWx1ZU9wcyIsInNPcGVyYXRvcnMiLCJnZXRPcGVyYXRvcnNGb3JHdWlkUHJvcGVydHkiLCJhbGxvd2VkT3BlcmF0b3JzRm9yR3VpZCIsImdldE9wZXJhdG9yc0ZvckRhdGVQcm9wZXJ0eSIsInByb3BlcnR5VHlwZSIsImdldFBhcmFtZXRlckluZm8iLCJzUGFyYW1ldGVyQ29udGV4dFBhdGgiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImJSZXN1bHRDb250ZXh0Iiwib1BhcmFtZXRlckluZm8iLCJjb250ZXh0UGF0aCIsInBhcmFtZXRlclByb3BlcnRpZXMiLCJnZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCJhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCIsIm9TZWxlY3Rpb25WYXJpYW50IiwibVBhZ2VDb250ZXh0Iiwib05hdmlnYXRpb25TZXJ2aWNlIiwiZ2V0TmF2aWdhdGlvblNlcnZpY2UiLCJtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCIsInRvSlNPTlN0cmluZyIsImlzU3RpY2t5RWRpdE1vZGUiLCJiSXNTdGlja3lNb2RlIiwiYlVJRWRpdGFibGUiLCJnZXRQcm9wZXJ0eSIsInNldFVzZXJEZWZhdWx0cyIsInBhcmFtZXRlcnMiLCJpc0FjdGlvbiIsImlzQ3JlYXRlIiwiYWN0aW9uRGVmYXVsdFZhbHVlcyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwic2hlbGxTZXJ2aWNlcyIsInN0YXJ0dXBBcHBTdGF0ZSIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsInN0YXJ0dXBBcHBTdGF0ZURhdGEiLCJnZXREYXRhIiwiZXh0ZW5kZWRQYXJhbWV0ZXJzIiwic2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdE9wdGlvbnMiLCJvUGFyYW1ldGVyIiwic1Byb3BlcnR5TmFtZSIsIiROYW1lIiwic1BhcmFtZXRlck5hbWUiLCJwYXJhbWV0ZXJ0VHlwZSIsIkJhc2VUeXBlIiwiU3RyaW5nIiwidHlwZUluc3RhbmNlIiwiZ2V0RGF0YVR5cGVJbnN0YW5jZSIsInBhcnNlVmFsdWUiLCJvRXh0ZW5kZWRQYXJhbWV0ZXIiLCJQcm9wZXJ0eU5hbWUiLCJvUmFuZ2UiLCJSYW5nZXMiLCJTaWduIiwiT3B0aW9uIiwiTG93IiwiZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZSIsIm9TdGFydHVwUGFyYW1ldGVycyIsIm9JbmJvdW5kUGFyYW1ldGVycyIsIm9JbmJvdW5kcyIsImFDcmVhdGVQYXJhbWV0ZXJzIiwic1BhcmFtZXRlciIsInVzZUZvckNyZWF0ZSIsIm9SZXQiLCJzQ3JlYXRlUGFyYW1ldGVyIiwiYVZhbHVlcyIsImNyZWF0ZSIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9PdXRib3VuZCIsImFTZW1hbnRpY09iamVjdE1hcHBpbmciLCJhUGFyYW1ldGVycyIsInNQYXJhbSIsImZvcm1hdCIsImdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbiIsIm9WaWV3RGF0YSIsIm9Dcm9zc05hdiIsIm9IZWFkZXJGYWNldEl0ZW1zIiwic0lkIiwib0NvbnRyb2xDb25maWciLCJjb250cm9sQ29uZmlndXJhdGlvbiIsImNvbmZpZyIsInNPdXRib3VuZCIsIm5hdmlnYXRpb24iLCJ0YXJnZXRPdXRib3VuZCIsIm91dGJvdW5kIiwiZ2VuZXJhdGUiLCJzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzIiwidk1hcHBpbmdzIiwib01hcHBpbmdzIiwic0xvY2FsUHJvcGVydHkiLCJzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSIsIm9TZWxlY3RPcHRpb24iLCJnZXRTZWxlY3RPcHRpb24iLCJyZW1vdmVTZWxlY3RPcHRpb24iLCJtYXNzQWRkU2VsZWN0T3B0aW9uIiwiZm5HZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCIsInNQYXRoIiwiYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zIiwiYVNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJzZW1hbnRpY09iamVjdEZvckdldExpbmtzIiwiZm5VcGRhdGVTZW1hbnRpY1RhcmdldHNNb2RlbCIsImFHZXRMaW5rc1Byb21pc2VzIiwiYVNlbWFudGljT2JqZWN0cyIsInNDdXJyZW50SGFzaCIsIl9vTGluayIsIl9zTGlua0ludGVudEFjdGlvbiIsImFGaW5hbExpbmtzIiwib0ZpbmFsU2VtYW50aWNPYmplY3RzIiwiYkludGVudEhhc0FjdGlvbnMiLCJrIiwib1RtcCIsInNBbHRlcm5hdGVQYXRoIiwiaSIsImhhc1RhcmdldHNOb3RGaWx0ZXJlZCIsImhhc1RhcmdldHMiLCJIYXNUYXJnZXRzIiwiSGFzVGFyZ2V0c05vdEZpbHRlcmVkIiwiYXNzaWduIiwic1NlbWFudGljT2JqZWN0TmFtZSIsIm1lcmdlT2JqZWN0cyIsImZuR2V0U2VtYW50aWNPYmplY3RQcm9taXNlIiwiZ2V0U2VtYW50aWNPYmplY3RzRnJvbVBhdGgiLCJmblByZXBhcmVTZW1hbnRpY09iamVjdHNQcm9taXNlcyIsIl9vTWV0YU1vZGVsIiwiX2FTZW1hbnRpY09iamVjdHNGb3VuZCIsIl9hU2VtYW50aWNPYmplY3RzUHJvbWlzZXMiLCJfS2V5cyIsInJlZ2V4UmVzdWx0Iiwic2VtYW50aWNPYmplY3RGb3VuZCIsImV4ZWMiLCJnZXRTZW1hbnRpY09iamVjdFByb21pc2UiLCJmbkdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwiLCJvQ29udHJvbGxlciIsInNQYWdlTW9kZWwiLCJfZm5maW5kVmFsdWVzSGVscGVyIiwib2JqIiwibGlzdCIsIkFycmF5IiwiaXRlbSIsImNoaWxkcmVuIiwiX2ZuZmluZFZhbHVlcyIsIl9mbkRlbGV0ZUR1cGxpY2F0ZVNlbWFudGljT2JqZWN0cyIsImFTZW1hbnRpY09iamVjdFBhdGgiLCJpbmRleCIsImdldFZpZXciLCJhU2VtYW50aWNPYmplY3RzUHJvbWlzZXMiLCJnZXRPd25lckNvbXBvbmVudCIsIm9QYWdlTW9kZWwiLCJzdHJpbmdpZnkiLCJfZ2V0T2JqZWN0IiwiYVNlbWFudGljT2JqZWN0c0ZvdW5kIiwiZ2V0SGFzaCIsIl9vU2VtYW50aWNPYmplY3QiLCJzU2VtT2JqRXhwcmVzc2lvbiIsImFTZW1hbnRpY09iamVjdHNSZXNvbHZlZCIsImNvbXBpbGVFeHByZXNzaW9uIiwicGF0aEluTW9kZWwiLCIkUGF0aCIsImdldExpbmtzV2l0aENhY2hlIiwidXBkYXRlU2VtYW50aWNUYXJnZXRzIiwiZ2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24iLCJvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiIsIm1BbGxvd2VkRXhwcmVzc2lvbnMiLCJGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIiwib1Byb3BlcnR5IiwiUHJvcGVydHkiLCJBbGxvd2VkRXhwcmVzc2lvbnMiLCJnZXRGaWx0ZXJSZXN0cmljdGlvbnMiLCJzUmVzdHJpY3Rpb24iLCJhUHJvcHMiLCJtYXAiLCJfZmV0Y2hQcm9wZXJ0aWVzRm9yTmF2UGF0aCIsInBhdGhzIiwibmF2UGF0aCIsInByb3BzIiwibmF2UGF0aFByZWZpeCIsIm91dFBhdGhzIiwicGF0aFRvQ2hlY2siLCJzdGFydHNXaXRoIiwib3V0UGF0aCIsIlJlcXVpcmVkUHJvcGVydGllcyIsIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwibmF2aWdhdGlvblRleHQiLCJmclRlcm0iLCJlbnRpdHlUeXBlUGF0aFBhcnRzIiwicmVwbGFjZUFsbCIsImZpbHRlck91dE5hdlByb3BCaW5kaW5nIiwiZW50aXR5VHlwZVBhdGgiLCJqb2luIiwiZW50aXR5U2V0UGF0aCIsImdldEVudGl0eVNldFBhdGgiLCJlbnRpdHlTZXRQYXRoUGFydHMiLCJpc0NvbnRhaW5tZW50IiwiY29udGFpbm1lbnROYXZQYXRoIiwicmVzdWx0Q29udGV4dENoZWNrIiwicGFyZW50RW50aXR5U2V0UGF0aCIsIm9QYXJlbnRSZXQiLCJvUGFyZW50RlIiLCJjb21wbGV0ZUFsbG93ZWRFeHBzIiwib3V0UHJvcCIsInByb3BQYXRoIiwib3V0UHJvcFBhdGgiLCJvTmF2UmVzdHJpY3Rpb25zIiwiTWV0YU1vZGVsRnVuY3Rpb24iLCJnZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwib05hdkZpbHRlclJlc3QiLCJuYXZSZXNSZXFQcm9wcyIsInVuaXF1ZVNvcnQiLCJuYXZOb25GaWx0ZXJQcm9wcyIsIm5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCIsIm5hdkFzc29jUmVxUHJvcHMiLCJuYXZBc3NvY05vbkZpbHRlclByb3BzIiwidGVtcGxhdGVDb250cm9sRnJhZ21lbnQiLCJzRnJhZ21lbnROYW1lIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwib09wdGlvbnMiLCJvTW9kaWZpZXIiLCJ2aWV3Iiwib0ZyYWdtZW50IiwidGFyZ2V0cyIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsImZpcnN0RWxlbWVudENoaWxkIiwiaXNYTUwiLCJvd25lciIsInJ1bkFzT3duZXIiLCJmbiIsImNvbnRhaW5pbmdWaWV3Iiwidmlld093bmVyIiwiRnJhZ21lbnQiLCJsb2FkIiwiaWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsImdldFNpbmdsZXRvblBhdGgiLCJwYXJ0cyIsIkJvb2xlYW4iLCJwcm9wZXJ0eU5hbWUiLCJwb3AiLCJuYXZpZ2F0aW9uUGF0aCIsImVudGl0eVNldCIsInNpbmdsZXRvbk5hbWUiLCJyZXNvbHZlZFBhdGgiLCJwcm9wZXJ0eUJpbmRpbmciLCJiaW5kUHJvcGVydHkiLCJyZXF1ZXN0VmFsdWUiLCJnZXRQYXJhbWV0ZXJQYXRoIiwic0NvbnRleHQiLCJhQWN0aW9uIiwiX2ZudHJhbnNsYXRlZFRleHRGcm9tRXhwQmluZGluZ1N0cmluZyIsImV4cEJpbmRpbmciLCJjb250cm9sIiwiYW55UmVzb3VyY2VUZXh0IiwiQW55RWxlbWVudCIsImFueVRleHQiLCJhZGREZXBlbmRlbnQiLCJyZXN1bHRUZXh0IiwiZ2V0QW55VGV4dCIsInJlbW92ZURlcGVuZGVudCIsImRlc3Ryb3kiLCJpc1NtYWxsRGV2aWNlIiwiRGV2aWNlIiwic3lzdGVtIiwiZGVza3RvcCIsInJlc2l6ZSIsIndpZHRoIiwiZ2V0RmlsdGVyc0Zyb21Bbm5vdGF0aW9uIiwiYW5ub3RhdGlvblBhdGgiLCJzdkNvbnRleHQiLCJnZXRNZXRhQ29udGV4dCIsInByb3BlcnR5RmlsdGVycyIsImFubm90YXRpb24iLCJ0YXJnZXRPYmplY3QiLCJpc1NlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnQiLCJTZWxlY3Rpb25WYXJpYW50IiwiaXNTZWxlY3Rpb25WYXJpYW50Iiwic2VsZWN0T3B0aW9uIiwiJHRhcmdldCIsInR5cGUiLCJwcm9wZXJ0eVBhdGgiLCJqIiwicmFuZ2UiLCJnZXRSYW5nZURlZmluaXRpb24iLCJGaWx0ZXIiLCJvcGVyYXRvciIsInJhbmdlTG93IiwicmFuZ2VIaWdoIiwiZmlsdGVycyIsImFuZCIsImdldENvbnZlcnRlckNvbnRleHRGb3JQYXRoIiwic01ldGFQYXRoIiwic0VudGl0eVNldCIsIm9EaWFnbm9zdGljcyIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiQ29udmVydGVyQ29udGV4dCIsImNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyIsImNyZWF0ZVJvb3RDb250ZXh0IiwicHJvZ3JhbW1pbmdNb2RlbCIsImNvbnRleHQiLCJyb290Q29udGV4dFBhdGgiLCJnZXREcmFmdFJvb3RQYXRoIiwiZ2V0U3RpY2t5Um9vdFBhdGgiLCJzaW1wbGVSb290Q29udGV4dCIsImV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UiLCJnZXRJbnN0YW5jZWRWaWV3cyIsImZpbmQiLCJwYWdlVmlldyIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZmlyZUJ1dHRvblByZXNzIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsInVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsInVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5IiwiZ2V0SUJOQWN0aW9ucyIsImdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJSRVFVSVJFRF9QUk9QRVJUSUVTIiwiTk9OX0ZJTFRFUkFCTEVfUFJPUEVSVElFUyIsIkFMTE9XRURfRVhQUkVTU0lPTlMiLCJnZXRSZWxhdGVkQXBwc01lbnVJdGVtcyIsImdldFRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmciXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbW1vblV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgRWRtIGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9FZG1cIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyUmVzdHJpY3Rpb25zVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ2FwYWJpbGl0aWVzXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGUsIFNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IFRleHRBcnJhbmdlbWVudCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHVuaXF1ZVNvcnQgZnJvbSBcInNhcC9iYXNlL3V0aWwvYXJyYXkvdW5pcXVlU29ydFwiO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50RGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBFeHRlbnNpb25BUEkgZnJvbSBcInNhcC9mZS9jb3JlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlclNldHRpbmdzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24sIHBhdGhJbk1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNEYXRlT3BlcmF0b3JzIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljRGF0ZU9wZXJhdG9yc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBJU2hlbGxTZXJ2aWNlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaGVsbFNlcnZpY2VzRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgRGlhZ25vc3RpY3MgZnJvbSBcInNhcC9mZS9jb3JlL3N1cHBvcnQvRGlhZ25vc3RpY3NcIjtcbmltcG9ydCB7IGlzU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudCwgaXNTZWxlY3Rpb25WYXJpYW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRmlsdGVySGVscGVyXCI7XG5pbXBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IHR5cGUgTWVudUJ1dHRvbiBmcm9tIFwic2FwL20vTWVudUJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgTmF2Q29udGFpbmVyIGZyb20gXCJzYXAvbS9OYXZDb250YWluZXJcIjtcbmltcG9ydCB0eXBlIE92ZXJmbG93VG9vbGJhckJ1dHRvbiBmcm9tIFwic2FwL20vT3ZlcmZsb3dUb29sYmFyQnV0dG9uXCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbXBvbmVudENvbnRhaW5lciBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50Q29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBNRENDaGFydCB9IGZyb20gXCJzYXAvdWkvbWRjL0NoYXJ0XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQWN0aW9uVG9vbGJhckFjdGlvbiBmcm9tIFwic2FwL3VpL21kYy9hY3Rpb250b29sYmFyL0FjdGlvblRvb2xiYXJBY3Rpb25cIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvclV0aWwgZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0ZpbHRlck9wZXJhdG9yVXRpbFwiO1xuaW1wb3J0IEJhc2VUeXBlIGZyb20gXCJzYXAvdWkvbWRjL2VudW1zL0Jhc2VUeXBlXCI7XG5pbXBvcnQgVHlwZU1hcCBmcm9tIFwic2FwL3VpL21kYy9vZGF0YS92NC9UeXBlTWFwXCI7XG5pbXBvcnQgdHlwZSBNRENUYWJsZSBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvY29udGVudC9NRENUYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCB0eXBlIEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBMaW5rIH0gZnJvbSBcInNhcC91c2hlbGwvc2VydmljZXMvTmF2aWdhdGlvblwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZSBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZVwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUxheW91dCBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUxheW91dFwiO1xuaW1wb3J0IHR5cGUge1xuXHRFeHBhbmRQYXRoVHlwZSxcblx0TWV0YU1vZGVsRW50aXR5VHlwZSxcblx0TWV0YU1vZGVsRW51bSxcblx0TWV0YU1vZGVsTmF2UHJvcGVydHksXG5cdE1ldGFNb2RlbFByb3BlcnR5LFxuXHRNZXRhTW9kZWxUeXBlXG59IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCBBbnlFbGVtZW50IGZyb20gXCIuL2NvbnRyb2xzL0FueUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldFJhbmdlRGVmaW5pdGlvbiB9IGZyb20gXCIuL2NvbnZlcnRlcnMvaGVscGVycy9TZWxlY3Rpb25WYXJpYW50SGVscGVyXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxGdW5jdGlvbiBmcm9tIFwiLi9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5cbnR5cGUgTXlJbmJveEludGVudCA9IHtcblx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0YWN0aW9uOiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBub3JtYWxpemVTZWFyY2hUZXJtKHNTZWFyY2hUZXJtOiBzdHJpbmcpIHtcblx0aWYgKCFzU2VhcmNoVGVybSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRyZXR1cm4gc1NlYXJjaFRlcm1cblx0XHQucmVwbGFjZSgvXCIvZywgXCIgXCIpXG5cdFx0LnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKSAvL2VzY2FwZSBiYWNrc2xhc2ggY2hhcmFjdGVycy4gQ2FuIGJlIHJlbW92ZWQgaWYgb2RhdGEvYmluZGluZyBoYW5kbGVzIGJhY2tlbmQgZXJyb3JzIHJlc3BvbmRzLlxuXHRcdC5zcGxpdCgvXFxzKy8pXG5cdFx0LnJlZHVjZShmdW5jdGlvbiAoc05vcm1hbGl6ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgc0N1cnJlbnRXb3JkOiBzdHJpbmcpIHtcblx0XHRcdGlmIChzQ3VycmVudFdvcmQgIT09IFwiXCIpIHtcblx0XHRcdFx0c05vcm1hbGl6ZWQgPSBgJHtzTm9ybWFsaXplZCA/IGAke3NOb3JtYWxpemVkfSBgIDogXCJcIn1cIiR7c0N1cnJlbnRXb3JkfVwiYDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzTm9ybWFsaXplZDtcblx0XHR9LCB1bmRlZmluZWQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZChiaW5kaW5nQ29udGV4dDogT0RhdGFWNENvbnRleHQpIHtcblx0Y29uc3QgbW9kZWwgPSBiaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0Y29uc3QgZW50aXR5UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChiaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRjb25zdCBkYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRDb250ZXh0KGVudGl0eVBhdGgpKTtcblx0YXdhaXQgYmluZGluZ0NvbnRleHQucmVxdWVzdFByb3BlcnR5KGRhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmtleXNbMF0/Lm5hbWUpO1xufVxuXG5mdW5jdGlvbiBmbkhhc1RyYW5zaWVudENvbnRleHRzKG9MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZykge1xuXHRsZXQgYkhhc1RyYW5zaWVudENvbnRleHRzID0gZmFsc2U7XG5cdGlmIChvTGlzdEJpbmRpbmcpIHtcblx0XHRvTGlzdEJpbmRpbmcuZ2V0Q3VycmVudENvbnRleHRzKCkuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSB7XG5cdFx0XHRpZiAob0NvbnRleHQgJiYgb0NvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdFx0XHRiSGFzVHJhbnNpZW50Q29udGV4dHMgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBiSGFzVHJhbnNpZW50Q29udGV4dHM7XG59XG5cbi8vIHRoZXJlIGlzIG5vIG5hdmlnYXRpb24gaW4gZW50aXR5U2V0IHBhdGggYW5kIHByb3BlcnR5IHBhdGhcblxuYXN5bmMgZnVuY3Rpb24gX2dldFNPSW50ZW50cyhcblx0b1NoZWxsU2VydmljZUhlbHBlcjogSVNoZWxsU2VydmljZXMsXG5cdG9PYmplY3RQYWdlTGF5b3V0OiBPYmplY3RQYWdlTGF5b3V0LFxuXHRvU2VtYW50aWNPYmplY3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0b1BhcmFtOiBvYmplY3QgfCB1bmRlZmluZWRcbik6IFByb21pc2U8TGlua1tdW10+IHtcblx0cmV0dXJuIG9TaGVsbFNlcnZpY2VIZWxwZXIuZ2V0TGlua3MoW1xuXHRcdHtcblx0XHRcdHNlbWFudGljT2JqZWN0OiBvU2VtYW50aWNPYmplY3QsXG5cdFx0XHRwYXJhbXM6IG9QYXJhbVxuXHRcdH1cblx0XSk7XG59XG5cbi8vIFRPLURPIGFkZCB0aGlzIGFzIHBhcnQgb2YgYXBwbHlTZW1hbnRpY09iamVjdG1hcHBpbmdzIGxvZ2ljIGluIEludGVudEJhc2VkbmF2aWdhdGlvbiBjb250cm9sbGVyIGV4dGVuc2lvblxuZnVuY3Rpb24gX2NyZWF0ZU1hcHBpbmdzKG9NYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuXHRjb25zdCBhU09NYXBwaW5ncyA9IFtdO1xuXHRjb25zdCBhTWFwcGluZ0tleXMgPSBPYmplY3Qua2V5cyhvTWFwcGluZyk7XG5cdGxldCBvU2VtYW50aWNNYXBwaW5nO1xuXHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYU1hcHBpbmdLZXlzKSB7XG5cdFx0b1NlbWFudGljTWFwcGluZyA9IHtcblx0XHRcdExvY2FsUHJvcGVydHk6IHtcblx0XHRcdFx0JFByb3BlcnR5UGF0aDogZWxlbWVudFxuXHRcdFx0fSxcblx0XHRcdFNlbWFudGljT2JqZWN0UHJvcGVydHk6IG9NYXBwaW5nW2VsZW1lbnRdXG5cdFx0fTtcblx0XHRhU09NYXBwaW5ncy5wdXNoKG9TZW1hbnRpY01hcHBpbmcpO1xuXHR9XG5cblx0cmV0dXJuIGFTT01hcHBpbmdzO1xufVxudHlwZSBMaW5rRGVmaW5pdGlvbiA9IHtcblx0aW50ZW50OiBzdHJpbmc7XG5cdHRleHQ6IHN0cmluZztcbn07XG50eXBlIFNlbWFudGljSXRlbSA9IHtcblx0dGV4dDogc3RyaW5nO1xuXHR0YXJnZXRTZW1PYmplY3Q6IHN0cmluZztcblx0dGFyZ2V0QWN0aW9uOiBzdHJpbmc7XG5cdHRhcmdldFBhcmFtczogdW5rbm93bjtcbn07XG4vKipcbiAqIEBwYXJhbSBsaW5rR3JvdXBcbiAqIEBwYXJhbSBhRXhjbHVkZWRBY3Rpb25zXG4gKiBAcGFyYW0gb1RhcmdldFBhcmFtc1xuICogQHBhcmFtIGFJdGVtc1xuICogQHBhcmFtIGFBbGxvd2VkQWN0aW9uc1xuICovXG5mdW5jdGlvbiBfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMoXG5cdGxpbmtHcm91cDogTGlua1tdW10sXG5cdGFFeGNsdWRlZEFjdGlvbnM6IHVua25vd25bXSxcblx0b1RhcmdldFBhcmFtczogdW5rbm93bixcblx0YUl0ZW1zOiBTZW1hbnRpY0l0ZW1bXSxcblx0YUFsbG93ZWRBY3Rpb25zPzogdW5rbm93bltdXG4pIHtcblx0Zm9yIChjb25zdCBsaW5rcyBvZiBsaW5rR3JvdXApIHtcblx0XHRmb3IgKGNvbnN0IG9MaW5rIG9mIGxpbmtzKSB7XG5cdFx0XHRjb25zdCBzSW50ZW50ID0gb0xpbmsuaW50ZW50O1xuXHRcdFx0Y29uc3Qgc0FjdGlvbiA9IHNJbnRlbnQuc3BsaXQoXCItXCIpWzFdLnNwbGl0KFwiP1wiKVswXTtcblx0XHRcdGlmIChcblx0XHRcdFx0KGFBbGxvd2VkQWN0aW9ucyAmJiBhQWxsb3dlZEFjdGlvbnMuaW5jbHVkZXMoc0FjdGlvbikpIHx8XG5cdFx0XHRcdCghYUFsbG93ZWRBY3Rpb25zICYmIGFFeGNsdWRlZEFjdGlvbnMgJiYgIWFFeGNsdWRlZEFjdGlvbnMuaW5jbHVkZXMoc0FjdGlvbikpXG5cdFx0XHQpIHtcblx0XHRcdFx0YUl0ZW1zLnB1c2goe1xuXHRcdFx0XHRcdHRleHQ6IG9MaW5rLnRleHQsXG5cdFx0XHRcdFx0dGFyZ2V0U2VtT2JqZWN0OiBzSW50ZW50LnNwbGl0KFwiI1wiKVsxXS5zcGxpdChcIi1cIilbMF0sXG5cdFx0XHRcdFx0dGFyZ2V0QWN0aW9uOiBzQWN0aW9uLnNwbGl0KFwiflwiKVswXSxcblx0XHRcdFx0XHR0YXJnZXRQYXJhbXM6IG9UYXJnZXRQYXJhbXNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCB0eXBlIFNlbWFudGljT2JqZWN0ID0ge1xuXHRhbGxvd2VkQWN0aW9ucz86IHVua25vd25bXTtcblx0dW5hdmFpbGFibGVBY3Rpb25zPzogdW5rbm93bltdO1xuXHRzZW1hbnRpY09iamVjdDogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG5cdG1hcHBpbmc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxuZnVuY3Rpb24gX2dldFJlbGF0ZWRJbnRlbnRzKFxuXHRvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0czogU2VtYW50aWNPYmplY3QsXG5cdG9CaW5kaW5nQ29udGV4dDogQ29udGV4dCxcblx0YU1hbmlmZXN0U09JdGVtczogU2VtYW50aWNJdGVtW10sXG5cdGFMaW5rczogTGlua1tdW11cbikge1xuXHRpZiAoYUxpbmtzICYmIGFMaW5rcy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgYUFsbG93ZWRBY3Rpb25zID0gb0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMuYWxsb3dlZEFjdGlvbnMgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGFFeGNsdWRlZEFjdGlvbnMgPSBvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy51bmF2YWlsYWJsZUFjdGlvbnMgPyBvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy51bmF2YWlsYWJsZUFjdGlvbnMgOiBbXTtcblx0XHRjb25zdCBhU09NYXBwaW5ncyA9IG9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzLm1hcHBpbmcgPyBfY3JlYXRlTWFwcGluZ3Mob0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMubWFwcGluZykgOiBbXTtcblx0XHRjb25zdCBvVGFyZ2V0UGFyYW1zID0geyBuYXZpZ2F0aW9uQ29udGV4dHM6IG9CaW5kaW5nQ29udGV4dCwgc2VtYW50aWNPYmplY3RNYXBwaW5nOiBhU09NYXBwaW5ncyB9O1xuXHRcdF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyhhTGlua3MsIGFFeGNsdWRlZEFjdGlvbnMsIG9UYXJnZXRQYXJhbXMsIGFNYW5pZmVzdFNPSXRlbXMsIGFBbGxvd2VkQWN0aW9ucyk7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGZldGNoZXMgdGhlIHJlbGF0ZWQgaW50ZW50cyB3aGVuIHNlbWFudGljIG9iamVjdCBhbmQgYWN0aW9uIGFyZSBwYXNzZWQgZnJvbSBmZUVudmlyb25tZW50LmdldEludGVudCgpIG9ubHkgaW4gY2FzZSBvZiBNeSBJbmJveCBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBAcGFyYW0gc2VtYW50aWNPYmplY3RBbmRBY3Rpb24gVGhpcyBzcGVjaWZpZXMgdGhlIHNlbWFudGljIG9iamVjdCBhbmQgYWN0aW9uIGZvciBmZXRjaGluZyB0aGUgaW50ZW50c1xuICogQHBhcmFtIG9CaW5kaW5nQ29udGV4dCBUaGlzIHNlcGNpZmllcyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB1cGRhdGluZyByZWxhdGVkIGFwcHNcbiAqIEBwYXJhbSBhcHBDb21wb25lbnRTT0l0ZW1zIFRoaXMgaXMgYSBsaXN0IG9mIHNlbWFudGljIGl0ZW1zIHVzZWQgZm9yIHVwZGF0aW5nIHRoZSByZWxhdGVkIGFwcHMgYnV0dG9uXG4gKiBAcGFyYW0gYUxpbmtzIFRoaXMgaXMgYW4gYXJyYXkgY29tcHJpc2luZyBvZiByZWxhdGVkIGludGVudHNcbiAqL1xuXG5mdW5jdGlvbiBfZ2V0UmVsYXRlZEludGVudHNXaXRoU2VtYW50aWNPYmplY3RzQW5kQWN0aW9uKFxuXHRzZW1hbnRpY09iamVjdEFuZEFjdGlvbjogTXlJbmJveEludGVudCxcblx0b0JpbmRpbmdDb250ZXh0OiBDb250ZXh0LFxuXHRhcHBDb21wb25lbnRTT0l0ZW1zOiBTZW1hbnRpY0l0ZW1bXSxcblx0YUxpbmtzOiBMaW5rW11bXVxuKSB7XG5cdGlmIChhTGlua3MubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGFjdGlvbnMgPSBbc2VtYW50aWNPYmplY3RBbmRBY3Rpb24uYWN0aW9uXTtcblx0XHRjb25zdCBleGNsdWRlZEFjdGlvbnM6IFtdID0gW107XG5cdFx0Y29uc3Qgc29NYXBwaW5nczogW10gPSBbXTtcblx0XHRjb25zdCB0YXJnZXRQYXJhbXMgPSB7IG5hdmlnYXRpb25Db250ZXh0czogb0JpbmRpbmdDb250ZXh0LCBzZW1hbnRpY09iamVjdE1hcHBpbmc6IHNvTWFwcGluZ3MgfTtcblx0XHRfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMoYUxpbmtzLCBleGNsdWRlZEFjdGlvbnMsIHRhcmdldFBhcmFtcywgYXBwQ29tcG9uZW50U09JdGVtcywgYWN0aW9ucyk7XG5cdH1cbn1cblxudHlwZSBTZW1hbnRpY09iamVjdENvbmZpZyA9IHtcblx0YWRkaXRpb25hbFNlbWFudGljT2JqZWN0czogUmVjb3JkPHN0cmluZywgU2VtYW50aWNPYmplY3Q+O1xufTtcbnR5cGUgUmVsYXRlZEFwcHNDb25maWcgPSB7XG5cdHRleHQ6IHN0cmluZztcblx0dGFyZ2V0U2VtT2JqZWN0OiBzdHJpbmc7XG5cdHRhcmdldEFjdGlvbjogc3RyaW5nO1xufTtcbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVJlbGF0ZUFwcHNNb2RlbChcblx0b0JpbmRpbmdDb250ZXh0OiBDb250ZXh0LFxuXHRvRW50cnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuXHRvT2JqZWN0UGFnZUxheW91dDogT2JqZWN0UGFnZUxheW91dCxcblx0YVNlbUtleXM6IHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH1bXSxcblx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdG9NZXRhUGF0aDogc3RyaW5nLFxuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudFxuKTogUHJvbWlzZTxSZWxhdGVkQXBwc0NvbmZpZ1tdPiB7XG5cdGNvbnN0IG9TaGVsbFNlcnZpY2VIZWxwZXI6IElTaGVsbFNlcnZpY2VzID0gYXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKTtcblx0Y29uc3Qgb1BhcmFtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRsZXQgc0N1cnJlbnRTZW1PYmogPSBcIlwiLFxuXHRcdHNDdXJyZW50QWN0aW9uID0gXCJcIjtcblx0bGV0IG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zO1xuXHRsZXQgYVJlbGF0ZWRBcHBzTWVudUl0ZW1zOiBSZWxhdGVkQXBwc0NvbmZpZ1tdID0gW107XG5cdGxldCBhRXhjbHVkZWRBY3Rpb25zOiB1bmtub3duW10gPSBbXTtcblx0bGV0IGFNYW5pZmVzdFNPS2V5czogc3RyaW5nW107XG5cblx0YXN5bmMgZnVuY3Rpb24gZm5HZXRQYXJzZVNoZWxsSGFzaEFuZEdldExpbmtzKCkge1xuXHRcdGNvbnN0IG9QYXJzZWRVcmwgPSBvU2hlbGxTZXJ2aWNlSGVscGVyLnBhcnNlU2hlbGxIYXNoKGRvY3VtZW50LmxvY2F0aW9uLmhhc2gpO1xuXHRcdHNDdXJyZW50U2VtT2JqID0gb1BhcnNlZFVybC5zZW1hbnRpY09iamVjdDsgLy8gQ3VycmVudCBTZW1hbnRpYyBPYmplY3Rcblx0XHRzQ3VycmVudEFjdGlvbiA9IG9QYXJzZWRVcmwuYWN0aW9uO1xuXHRcdHJldHVybiBfZ2V0U09JbnRlbnRzKG9TaGVsbFNlcnZpY2VIZWxwZXIsIG9PYmplY3RQYWdlTGF5b3V0LCBzQ3VycmVudFNlbU9iaiwgb1BhcmFtKTtcblx0fVxuXG5cdHRyeSB7XG5cdFx0aWYgKG9FbnRyeSkge1xuXHRcdFx0aWYgKGFTZW1LZXlzICYmIGFTZW1LZXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGFTZW1LZXlzKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1NlbUtleSA9IGVsZW1lbnQuJFByb3BlcnR5UGF0aDtcblx0XHRcdFx0XHRpZiAoIW9QYXJhbVtzU2VtS2V5XSkge1xuXHRcdFx0XHRcdFx0b1BhcmFtW3NTZW1LZXldID0geyB2YWx1ZTogb0VudHJ5W3NTZW1LZXldIH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBmYWxsYmFjayB0byBUZWNobmljYWwgS2V5cyBpZiBubyBTZW1hbnRpYyBLZXkgaXMgcHJlc2VudFxuXHRcdFx0XHRjb25zdCBhVGVjaG5pY2FsS2V5cyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke29NZXRhUGF0aH0vJFR5cGUvJEtleWApO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBhVGVjaG5pY2FsS2V5cykge1xuXHRcdFx0XHRcdGNvbnN0IHNPYmpLZXkgPSBhVGVjaG5pY2FsS2V5c1trZXldO1xuXHRcdFx0XHRcdGlmICghb1BhcmFtW3NPYmpLZXldKSB7XG5cdFx0XHRcdFx0XHRvUGFyYW1bc09iaktleV0gPSB7IHZhbHVlOiBvRW50cnlbc09iaktleV0gfTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gTG9naWMgdG8gcmVhZCBhZGRpdGlvbmFsIFNPIGZyb20gbWFuaWZlc3QgYW5kIHVwZGF0ZWQgcmVsYXRlZGFwcHMgbW9kZWxcblxuXHRcdGNvbnN0IG9NYW5pZmVzdERhdGEgPSBnZXRUYXJnZXRWaWV3KG9PYmplY3RQYWdlTGF5b3V0KS5nZXRWaWV3RGF0YSgpIGFzIFNlbWFudGljT2JqZWN0Q29uZmlnO1xuXHRcdGNvbnN0IGFNYW5pZmVzdFNPSXRlbXM6IFNlbWFudGljSXRlbVtdID0gW107XG5cdFx0bGV0IHNlbWFudGljT2JqZWN0SW50ZW50cztcblx0XHRpZiAob01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzKSB7XG5cdFx0XHRhTWFuaWZlc3RTT0tleXMgPSBPYmplY3Qua2V5cyhvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMpO1xuXHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGFNYW5pZmVzdFNPS2V5cykge1xuXHRcdFx0XHRzZW1hbnRpY09iamVjdEludGVudHMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoX2dldFNPSW50ZW50cyhvU2hlbGxTZXJ2aWNlSGVscGVyLCBvT2JqZWN0UGFnZUxheW91dCwgZWxlbWVudCwgb1BhcmFtKSk7XG5cdFx0XHRcdF9nZXRSZWxhdGVkSW50ZW50cyhcblx0XHRcdFx0XHRvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHNbZWxlbWVudF0sXG5cdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdGFNYW5pZmVzdFNPSXRlbXMsXG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3RJbnRlbnRzXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gYXBwQ29tcG9uZW50U09JdGVtcyBpcyB1cGRhdGVkIGluIGNhc2Ugb2YgTXkgSW5ib3ggaW50ZWdyYXRpb24gd2hlbiBzZW1hbnRpYyBvYmplY3QgYW5kIGFjdGlvbiBhcmUgcGFzc2VkIGZyb20gZmVFbnZpcm9ubWVudC5nZXRJbnRlbnQoKSBtZXRob2Rcblx0XHQvLyBJbiBvdGhlciBjYXNlcyBpdCByZW1haW5zIGFzIGFuIGVtcHR5IGxpc3Rcblx0XHQvLyBXZSBjb25jYXQgdGhpcyBsaXN0IHRvd2FyZHMgdGhlIGVuZCB3aXRoIGFNYW5pZmVzdFNPSXRlbXNcblxuXHRcdGNvbnN0IGFwcENvbXBvbmVudFNPSXRlbXM6IFNlbWFudGljSXRlbVtdID0gW107XG5cdFx0Y29uc3QgY29tcG9uZW50RGF0YTogQ29tcG9uZW50RGF0YSA9IGFwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCk7XG5cdFx0aWYgKGNvbXBvbmVudERhdGEuZmVFbnZpcm9ubWVudCAmJiBjb21wb25lbnREYXRhLmZlRW52aXJvbm1lbnQuZ2V0SW50ZW50KCkpIHtcblx0XHRcdGNvbnN0IGludGVudDogTXlJbmJveEludGVudCA9IGNvbXBvbmVudERhdGEuZmVFbnZpcm9ubWVudC5nZXRJbnRlbnQoKTtcblx0XHRcdHNlbWFudGljT2JqZWN0SW50ZW50cyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0X2dldFNPSW50ZW50cyhvU2hlbGxTZXJ2aWNlSGVscGVyLCBvT2JqZWN0UGFnZUxheW91dCwgaW50ZW50LnNlbWFudGljT2JqZWN0LCBvUGFyYW0pXG5cdFx0XHQpO1xuXHRcdFx0X2dldFJlbGF0ZWRJbnRlbnRzV2l0aFNlbWFudGljT2JqZWN0c0FuZEFjdGlvbihpbnRlbnQsIG9CaW5kaW5nQ29udGV4dCwgYXBwQ29tcG9uZW50U09JdGVtcywgc2VtYW50aWNPYmplY3RJbnRlbnRzKTtcblx0XHR9XG5cblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9PYmplY3RQYWdlTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3QgYUxpbmtzID0gYXdhaXQgZm5HZXRQYXJzZVNoZWxsSGFzaEFuZEdldExpbmtzKCk7XG5cdFx0aWYgKGFMaW5rcykge1xuXHRcdFx0aWYgKGFMaW5rcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxldCBpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3QgPSBmYWxzZTtcblx0XHRcdFx0Y29uc3Qgb1RhcmdldFBhcmFtczoge1xuXHRcdFx0XHRcdG5hdmlnYXRpb25Db250ZXh0cz86IENvbnRleHQ7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nPzogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdO1xuXHRcdFx0XHR9ID0ge307XG5cdFx0XHRcdGNvbnN0IGFBbm5vdGF0aW9uc1NPSXRlbXM6IFNlbWFudGljSXRlbVtdID0gW107XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gYCR7b01ldGFQYXRofUBgO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5VHlwZVBhdGggPSBgJHtvTWV0YVBhdGh9L0BgO1xuXHRcdFx0XHRjb25zdCBvRW50aXR5U2V0QW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzRW50aXR5U2V0UGF0aCk7XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyhvRW50aXR5U2V0QW5ub3RhdGlvbnMsIHNDdXJyZW50U2VtT2JqKTtcblx0XHRcdFx0aWYgKCFvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5iSGFzRW50aXR5U2V0U08pIHtcblx0XHRcdFx0XHRjb25zdCBvRW50aXR5VHlwZUFubm90YXRpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVR5cGVQYXRoKTtcblx0XHRcdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyA9IENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMob0VudGl0eVR5cGVBbm5vdGF0aW9ucywgc0N1cnJlbnRTZW1PYmopO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFFeGNsdWRlZEFjdGlvbnMgPSBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hVW5hdmFpbGFibGVBY3Rpb25zO1xuXHRcdFx0XHQvL1NraXAgc2FtZSBhcHBsaWNhdGlvbiBmcm9tIFJlbGF0ZWQgQXBwc1xuXHRcdFx0XHRhRXhjbHVkZWRBY3Rpb25zLnB1c2goc0N1cnJlbnRBY3Rpb24pO1xuXHRcdFx0XHRvVGFyZ2V0UGFyYW1zLm5hdmlnYXRpb25Db250ZXh0cyA9IG9CaW5kaW5nQ29udGV4dDtcblx0XHRcdFx0b1RhcmdldFBhcmFtcy5zZW1hbnRpY09iamVjdE1hcHBpbmcgPSBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hTWFwcGluZ3M7XG5cdFx0XHRcdF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyhhTGlua3MsIGFFeGNsdWRlZEFjdGlvbnMsIG9UYXJnZXRQYXJhbXMsIGFBbm5vdGF0aW9uc1NPSXRlbXMpO1xuXG5cdFx0XHRcdGFNYW5pZmVzdFNPSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoeyB0YXJnZXRTZW1PYmplY3QgfSkge1xuXHRcdFx0XHRcdGlmIChhQW5ub3RhdGlvbnNTT0l0ZW1zWzBdPy50YXJnZXRTZW1PYmplY3QgPT09IHRhcmdldFNlbU9iamVjdCkge1xuXHRcdFx0XHRcdFx0aXNTZW1hbnRpY09iamVjdEhhc1NhbWVUYXJnZXRJbk1hbmlmZXN0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIHJlbW92ZSBhbGwgYWN0aW9ucyBmcm9tIGN1cnJlbnQgaGFzaCBhcHBsaWNhdGlvbiBpZiBtYW5pZmVzdCBjb250YWlucyBlbXB0eSBhbGxvd2VkQWN0aW9uc1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzICYmXG5cdFx0XHRcdFx0YUFubm90YXRpb25zU09JdGVtc1swXSAmJlxuXHRcdFx0XHRcdG9NYW5pZmVzdERhdGEuYWRkaXRpb25hbFNlbWFudGljT2JqZWN0c1thQW5ub3RhdGlvbnNTT0l0ZW1zWzBdLnRhcmdldFNlbU9iamVjdF0gJiZcblx0XHRcdFx0XHQhIW9NYW5pZmVzdERhdGEuYWRkaXRpb25hbFNlbWFudGljT2JqZWN0c1thQW5ub3RhdGlvbnNTT0l0ZW1zWzBdLnRhcmdldFNlbU9iamVjdF0uYWxsb3dlZEFjdGlvbnNcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0aXNTZW1hbnRpY09iamVjdEhhc1NhbWVUYXJnZXRJbk1hbmlmZXN0ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBzb0l0ZW1zID0gYU1hbmlmZXN0U09JdGVtcy5jb25jYXQoYXBwQ29tcG9uZW50U09JdGVtcyk7XG5cdFx0XHRcdGFSZWxhdGVkQXBwc01lbnVJdGVtcyA9IGlzU2VtYW50aWNPYmplY3RIYXNTYW1lVGFyZ2V0SW5NYW5pZmVzdCA/IHNvSXRlbXMgOiBzb0l0ZW1zLmNvbmNhdChhQW5ub3RhdGlvbnNTT0l0ZW1zKTtcblx0XHRcdFx0Ly8gSWYgbm8gYXBwIGluIGxpc3QsIHJlbGF0ZWQgYXBwcyBidXR0b24gd2lsbCBiZSBoaWRkZW5cblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJyZWxhdGVkQXBwcy92aXNpYmlsaXR5XCIsIGFSZWxhdGVkQXBwc01lbnVJdGVtcy5sZW5ndGggPiAwKTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJyZWxhdGVkQXBwcy9pdGVtc1wiLCBhUmVsYXRlZEFwcHNNZW51SXRlbXMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJyZWxhdGVkQXBwcy92aXNpYmlsaXR5XCIsIGZhbHNlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJyZWxhdGVkQXBwcy92aXNpYmlsaXR5XCIsIGZhbHNlKTtcblx0XHR9XG5cdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJlYWQgbGlua3NcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0fVxuXHRyZXR1cm4gYVJlbGF0ZWRBcHBzTWVudUl0ZW1zO1xufVxuXG5mdW5jdGlvbiBfZ2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyhvRW50aXR5QW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzQ3VycmVudFNlbU9iajogc3RyaW5nKSB7XG5cdGNvbnN0IG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zID0ge1xuXHRcdGJIYXNFbnRpdHlTZXRTTzogZmFsc2UsXG5cdFx0YUFsbG93ZWRBY3Rpb25zOiBbXSxcblx0XHRhVW5hdmFpbGFibGVBY3Rpb25zOiBbXSBhcyBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zPltdLFxuXHRcdGFNYXBwaW5nczogW10gYXMgTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdXG5cdH07XG5cdGxldCBzQW5ub3RhdGlvbk1hcHBpbmdUZXJtLCBzQW5ub3RhdGlvbkFjdGlvblRlcm07XG5cdGxldCBzUXVhbGlmaWVyO1xuXHRmb3IgKGNvbnN0IGtleSBpbiBvRW50aXR5QW5ub3RhdGlvbnMpIHtcblx0XHRpZiAoa2V5LmluY2x1ZGVzKENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdCkgJiYgb0VudGl0eUFubm90YXRpb25zW2tleV0gPT09IHNDdXJyZW50U2VtT2JqKSB7XG5cdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5iSGFzRW50aXR5U2V0U08gPSB0cnVlO1xuXHRcdFx0c0Fubm90YXRpb25NYXBwaW5nVGVybSA9IGBAJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RNYXBwaW5nfWA7XG5cdFx0XHRzQW5ub3RhdGlvbkFjdGlvblRlcm0gPSBgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zfWA7XG5cblx0XHRcdGlmIChrZXkuaW5jbHVkZXMoXCIjXCIpKSB7XG5cdFx0XHRcdHNRdWFsaWZpZXIgPSBrZXkuc3BsaXQoXCIjXCIpWzFdO1xuXHRcdFx0XHRzQW5ub3RhdGlvbk1hcHBpbmdUZXJtID0gYCR7c0Fubm90YXRpb25NYXBwaW5nVGVybX0jJHtzUXVhbGlmaWVyfWA7XG5cdFx0XHRcdHNBbm5vdGF0aW9uQWN0aW9uVGVybSA9IGAke3NBbm5vdGF0aW9uQWN0aW9uVGVybX0jJHtzUXVhbGlmaWVyfWA7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VudGl0eUFubm90YXRpb25zW3NBbm5vdGF0aW9uTWFwcGluZ1Rlcm1dKSB7XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFNYXBwaW5ncyA9IG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFNYXBwaW5ncy5jb25jYXQoXG5cdFx0XHRcdFx0b0VudGl0eUFubm90YXRpb25zW3NBbm5vdGF0aW9uTWFwcGluZ1Rlcm1dIGFzIE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5cblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9FbnRpdHlBbm5vdGF0aW9uc1tzQW5ub3RhdGlvbkFjdGlvblRlcm1dKSB7XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFVbmF2YWlsYWJsZUFjdGlvbnMgPSBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hVW5hdmFpbGFibGVBY3Rpb25zLmNvbmNhdChcblx0XHRcdFx0XHRvRW50aXR5QW5ub3RhdGlvbnNbc0Fubm90YXRpb25BY3Rpb25UZXJtXSBhcyBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zPlxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmblVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyhvT2JqZWN0UGFnZUxheW91dDogT2JqZWN0UGFnZUxheW91dCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBQcm9taXNlPHVua25vd24+IHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IChvT2JqZWN0UGFnZUxheW91dC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZUxheW91dC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRjb25zdCBwYXRoID0gKG9CaW5kaW5nQ29udGV4dCAmJiBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKSB8fCBcIlwiO1xuXHRjb25zdCBvTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHBhdGgpO1xuXHQvLyBTZW1hbnRpYyBLZXkgVm9jYWJ1bGFyeVxuXHRjb25zdCBzU2VtYW50aWNLZXlWb2NhYnVsYXJ5ID0gYCR7b01ldGFQYXRofS9gICsgYEBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlgO1xuXHQvL1NlbWFudGljIEtleXNcblx0Y29uc3QgYVNlbUtleXMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzU2VtYW50aWNLZXlWb2NhYnVsYXJ5KTtcblx0Ly8gVW5hdmFpbGFibGUgQWN0aW9uc1xuXHRjb25zdCBvRW50cnkgPSBvQmluZGluZ0NvbnRleHQ/LmdldE9iamVjdCgpO1xuXHRpZiAoIW9FbnRyeSAmJiBvQmluZGluZ0NvbnRleHQpIHtcblx0XHRvQmluZGluZ0NvbnRleHRcblx0XHRcdC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChyZXF1ZXN0ZWRPYmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBDb21tb25VdGlscy51cGRhdGVSZWxhdGVBcHBzTW9kZWwoXG5cdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdHJlcXVlc3RlZE9iamVjdCxcblx0XHRcdFx0XHRvT2JqZWN0UGFnZUxheW91dCxcblx0XHRcdFx0XHRhU2VtS2V5cyxcblx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdG9NZXRhUGF0aCxcblx0XHRcdFx0XHRhcHBDb21wb25lbnRcblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgdXBkYXRlIHRoZSByZWxhdGVkIGFwcCBkZXRhaWxzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIENvbW1vblV0aWxzLnVwZGF0ZVJlbGF0ZUFwcHNNb2RlbChvQmluZGluZ0NvbnRleHQsIG9FbnRyeSwgb09iamVjdFBhZ2VMYXlvdXQsIGFTZW1LZXlzLCBvTWV0YU1vZGVsLCBvTWV0YVBhdGgsIGFwcENvbXBvbmVudCk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gb0J1dHRvblxuICovXG5mdW5jdGlvbiBmbkZpcmVCdXR0b25QcmVzcyhvQnV0dG9uOiBDb250cm9sKSB7XG5cdGlmIChcblx0XHRvQnV0dG9uICYmXG5cdFx0b0J1dHRvbi5pc0E8QnV0dG9uIHwgT3ZlcmZsb3dUb29sYmFyQnV0dG9uPihbXCJzYXAubS5CdXR0b25cIiwgXCJzYXAubS5PdmVyZmxvd1Rvb2xiYXJCdXR0b25cIl0pICYmXG5cdFx0b0J1dHRvbi5nZXRWaXNpYmxlKCkgJiZcblx0XHRvQnV0dG9uLmdldEVuYWJsZWQoKVxuXHQpIHtcblx0XHRvQnV0dG9uLmZpcmVQcmVzcygpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEFwcENvbXBvbmVudChvQ29udHJvbDogQ29udHJvbCB8IENvbXBvbmVudCk6IEFwcENvbXBvbmVudCB7XG5cdGlmIChvQ29udHJvbC5pc0E8QXBwQ29tcG9uZW50PihcInNhcC5mZS5jb3JlLkFwcENvbXBvbmVudFwiKSkge1xuXHRcdHJldHVybiBvQ29udHJvbDtcblx0fVxuXHRjb25zdCBvT3duZXIgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3Iob0NvbnRyb2wpO1xuXHRpZiAoIW9Pd25lcikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZXJlIHNob3VsZCBiZSBhIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCBhcyBvd25lciBvZiB0aGUgY29udHJvbFwiKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZ2V0QXBwQ29tcG9uZW50KG9Pd25lcik7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFBhZ2VWaWV3KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IEZFVmlldyB7XG5cdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IG9BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdHJldHVybiByb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHQ/IHJvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RWaWV3KClcblx0XHQ6IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoKG9BcHBDb21wb25lbnQuZ2V0Um9vdENvbnRhaW5lcigpIGFzIE5hdkNvbnRhaW5lcikuZ2V0Q3VycmVudFBhZ2UoKSk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldFZpZXcob0NvbnRyb2w6IE1hbmFnZWRPYmplY3QgfCBudWxsKTogRkVWaWV3IHtcblx0aWYgKG9Db250cm9sICYmIG9Db250cm9sLmlzQTxDb21wb25lbnRDb250YWluZXI+KFwic2FwLnVpLmNvcmUuQ29tcG9uZW50Q29udGFpbmVyXCIpKSB7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250cm9sLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0b0NvbnRyb2wgPSBvQ29tcG9uZW50ICYmIG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKTtcblx0fVxuXHR3aGlsZSAob0NvbnRyb2wgJiYgIW9Db250cm9sLmlzQTxGRVZpZXc+KFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIikpIHtcblx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHR9XG5cdHJldHVybiBvQ29udHJvbCE7XG59XG5cbmZ1bmN0aW9uIF9mbkNoZWNrSXNNYXRjaChvT2JqZWN0OiBvYmplY3QsIG9LZXlzVG9DaGVjazogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcblx0Zm9yIChjb25zdCBzS2V5IGluIG9LZXlzVG9DaGVjaykge1xuXHRcdGlmIChvS2V5c1RvQ2hlY2tbc0tleV0gIT09IG9PYmplY3Rbc0tleSBhcyBrZXlvZiB0eXBlb2Ygb09iamVjdF0pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZuR2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzKFxuXHRtZXRhTW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCxcblx0c0NvbnRleHRQYXRoOiBzdHJpbmcsXG5cdG9GaWx0ZXI/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsUHJvcGVydHk+IHwgUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsTmF2UHJvcGVydHk+IHtcblx0Y29uc3Qgb0VudGl0eVR5cGU6IE1ldGFNb2RlbEVudGl0eVR5cGUgPSAobWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS9gKSB8fCB7fSkgYXMgTWV0YU1vZGVsRW50aXR5VHlwZSxcblx0XHRvUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsUHJvcGVydHk+IHwgUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsTmF2UHJvcGVydHk+ID0ge307XG5cblx0Zm9yIChjb25zdCBzS2V5IGluIG9FbnRpdHlUeXBlKSB7XG5cdFx0aWYgKFxuXHRcdFx0b0VudGl0eVR5cGUuaGFzT3duUHJvcGVydHkoc0tleSkgJiZcblx0XHRcdCEvXlxcJC9pLnRlc3Qoc0tleSkgJiZcblx0XHRcdG9FbnRpdHlUeXBlW3NLZXldLiRraW5kICYmXG5cdFx0XHRfZm5DaGVja0lzTWF0Y2gob0VudGl0eVR5cGVbc0tleV0sIG9GaWx0ZXIgfHwgeyAka2luZDogXCJQcm9wZXJ0eVwiIH0pXG5cdFx0KSB7XG5cdFx0XHRvUHJvcGVydGllc1tzS2V5XSA9IG9FbnRpdHlUeXBlW3NLZXldO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb1Byb3BlcnRpZXM7XG59XG5cbmZ1bmN0aW9uIGZuR2V0SUJOQWN0aW9ucyhvQ29udHJvbDogVGFibGUgfCBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlLCBhSUJOQWN0aW9uczogdW5rbm93bltdKSB7XG5cdGNvbnN0IGFBY3Rpb25zID0gb0NvbnRyb2wgJiYgb0NvbnRyb2wuZ2V0QWN0aW9ucygpO1xuXHRpZiAoYUFjdGlvbnMpIHtcblx0XHRhQWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvQWN0aW9uKSB7XG5cdFx0XHRpZiAob0FjdGlvbi5pc0E8QWN0aW9uVG9vbGJhckFjdGlvbj4oXCJzYXAudWkubWRjLmFjdGlvbnRvb2xiYXIuQWN0aW9uVG9vbGJhckFjdGlvblwiKSkge1xuXHRcdFx0XHRvQWN0aW9uID0gb0FjdGlvbi5nZXRBY3Rpb24oKTtcblx0XHRcdH1cblx0XHRcdGlmIChvQWN0aW9uLmlzQTxNZW51QnV0dG9uPihcInNhcC5tLk1lbnVCdXR0b25cIikpIHtcblx0XHRcdFx0Y29uc3Qgb01lbnUgPSBvQWN0aW9uLmdldE1lbnUoKTtcblx0XHRcdFx0Y29uc3QgYUl0ZW1zID0gb01lbnUuZ2V0SXRlbXMoKTtcblx0XHRcdFx0YUl0ZW1zLmZvckVhY2goKG9JdGVtKSA9PiB7XG5cdFx0XHRcdFx0aWYgKG9JdGVtLmRhdGEoXCJJQk5EYXRhXCIpKSB7XG5cdFx0XHRcdFx0XHRhSUJOQWN0aW9ucy5wdXNoKG9JdGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChvQWN0aW9uLmRhdGEoXCJJQk5EYXRhXCIpKSB7XG5cdFx0XHRcdGFJQk5BY3Rpb25zLnB1c2gob0FjdGlvbik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGFJQk5BY3Rpb25zO1xufVxuXG4vKipcbiAqIEBwYXJhbSBhSUJOQWN0aW9uc1xuICogQHBhcmFtIG9WaWV3XG4gKi9cbmZ1bmN0aW9uIGZuVXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkoYUlCTkFjdGlvbnM6IENvbnRyb2xbXSwgb1ZpZXc6IFZpZXcpIHtcblx0Y29uc3Qgb1BhcmFtczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93biB9PiA9IHt9O1xuXHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KTtcblx0Y29uc3QgaXNTdGlja3kgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQoKG9WaWV3LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRjb25zdCBmbkdldExpbmtzID0gZnVuY3Rpb24gKG9EYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpIHtcblx0XHRpZiAob0RhdGEpIHtcblx0XHRcdGNvbnN0IGFLZXlzID0gT2JqZWN0LmtleXMob0RhdGEpO1xuXHRcdFx0YUtleXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChzS2V5LmluZGV4T2YoXCJfXCIpICE9PSAwICYmICFzS2V5LmluY2x1ZGVzKFwib2RhdGEuY29udGV4dFwiKSkge1xuXHRcdFx0XHRcdG9QYXJhbXNbc0tleV0gPSB7IHZhbHVlOiBvRGF0YVtzS2V5XSB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKGFJQk5BY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0YUlCTkFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob0lCTkFjdGlvbikge1xuXHRcdFx0XHRjb25zdCBzU2VtYW50aWNPYmplY3QgPSBvSUJOQWN0aW9uLmRhdGEoXCJJQk5EYXRhXCIpLnNlbWFudGljT2JqZWN0O1xuXHRcdFx0XHRjb25zdCBzQWN0aW9uID0gb0lCTkFjdGlvbi5kYXRhKFwiSUJORGF0YVwiKS5hY3Rpb247XG5cdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHQuZ2V0U2hlbGxTZXJ2aWNlcygpXG5cdFx0XHRcdFx0LmdldExpbmtzKFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHNTZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0YWN0aW9uOiBzQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRwYXJhbXM6IG9QYXJhbXNcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdKVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhTGluaykge1xuXHRcdFx0XHRcdFx0b0lCTkFjdGlvbi5zZXRWaXNpYmxlKG9JQk5BY3Rpb24uZ2V0VmlzaWJsZSgpICYmIGFMaW5rICYmIGFMaW5rLmxlbmd0aCA9PT0gMSAmJiBhTGlua1swXSAmJiBhTGlua1swXS5sZW5ndGggPT09IDEpO1xuXHRcdFx0XHRcdFx0aWYgKGlzU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHRcdChvSUJOQWN0aW9uLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdG9JQk5BY3Rpb24uZ2V0SWQoKS5zcGxpdChcIi0tXCIpWzFdLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHNoZWxsTmF2aWdhdGlvbk5vdEF2YWlsYWJsZTogIShhTGluayAmJiBhTGluay5sZW5ndGggPT09IDEgJiYgYUxpbmtbMF0gJiYgYUxpbmtbMF0ubGVuZ3RoID09PSAxKVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgdGhlIGxpbmtzIGZyb20gdGhlIHNoZWxsIHNlcnZpY2VcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cdGlmIChvVmlldyAmJiBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0KG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQpXG5cdFx0XHQ/LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gZm5HZXRMaW5rcyhvRGF0YSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tIHRoZSBzaGVsbCBzZXJ2aWNlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0Zm5HZXRMaW5rcygpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEFjdGlvblBhdGgoYWN0aW9uQ29udGV4dDogQ29udGV4dCwgYlJldHVybk9ubHlQYXRoOiBib29sZWFuLCBpbkFjdGlvbk5hbWU/OiBzdHJpbmcsIGJDaGVja1N0YXRpY1ZhbHVlPzogYm9vbGVhbikge1xuXHRjb25zdCBzQWN0aW9uTmFtZTogc3RyaW5nID0gIWluQWN0aW9uTmFtZSA/IGFjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KGFjdGlvbkNvbnRleHQuZ2V0UGF0aCgpKS50b1N0cmluZygpIDogaW5BY3Rpb25OYW1lO1xuXHRsZXQgc0NvbnRleHRQYXRoID0gYWN0aW9uQ29udGV4dC5nZXRQYXRoKCkuc3BsaXQoXCIvQFwiKVswXTtcblx0Y29uc3Qgc0VudGl0eVR5cGVOYW1lID0gKGFjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KHNDb250ZXh0UGF0aCkgYXMgTWV0YU1vZGVsRW50aXR5VHlwZSkuJFR5cGU7XG5cdGNvbnN0IHNFbnRpdHlOYW1lID0gZ2V0RW50aXR5U2V0TmFtZShhY3Rpb25Db250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsIHNFbnRpdHlUeXBlTmFtZSk7XG5cdGlmIChzRW50aXR5TmFtZSkge1xuXHRcdHNDb250ZXh0UGF0aCA9IGAvJHtzRW50aXR5TmFtZX1gO1xuXHR9XG5cdGlmIChiQ2hlY2tTdGF0aWNWYWx1ZSkge1xuXHRcdHJldHVybiBhY3Rpb25Db250ZXh0LmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9QE9yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZWApO1xuXHR9XG5cdGlmIChiUmV0dXJuT25seVBhdGgpIHtcblx0XHRyZXR1cm4gYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfWA7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNDb250ZXh0UGF0aDogc0NvbnRleHRQYXRoLFxuXHRcdFx0c1Byb3BlcnR5OiBhY3Rpb25Db250ZXh0LmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9QE9yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZS8kUGF0aGApLFxuXHRcdFx0c0JpbmRpbmdQYXJhbWV0ZXI6IGFjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX0vQCR1aTUub3ZlcmxvYWQvMC8kUGFyYW1ldGVyLzAvJE5hbWVgKVxuXHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RW50aXR5U2V0TmFtZShvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgc0VudGl0eVR5cGU6IHN0cmluZykge1xuXHRjb25zdCBvRW50aXR5Q29udGFpbmVyID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIpO1xuXHRmb3IgKGNvbnN0IGtleSBpbiBvRW50aXR5Q29udGFpbmVyKSB7XG5cdFx0aWYgKHR5cGVvZiBvRW50aXR5Q29udGFpbmVyW2tleV0gPT09IFwib2JqZWN0XCIgJiYgb0VudGl0eUNvbnRhaW5lcltrZXldLiRUeXBlID09PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0cmV0dXJuIGtleTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUFubm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb0NvbGxlY3Rpb25Bbm5vdGF0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG5cdGNvbnN0IG9UZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0XCJdLFxuXHRcdG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uID0gKG9UZXh0QW5ub3RhdGlvbiAmJlxuXHRcdFx0KChvUHJvcGVydHlBbm5vdGF0aW9ucyAmJlxuXHRcdFx0XHRvUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dEBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRcIl0pIHx8XG5cdFx0XHRcdChvQ29sbGVjdGlvbkFubm90YXRpb25zICYmXG5cdFx0XHRcdFx0b0NvbGxlY3Rpb25Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRcIl0pKSkgYXMgTWV0YU1vZGVsRW51bTxUZXh0QXJyYW5nZW1lbnQ+O1xuXG5cdGlmIChvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbikge1xuXHRcdGlmIChvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbi4kRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRPbmx5XCIpIHtcblx0XHRcdHJldHVybiBcIkRlc2NyaXB0aW9uXCI7XG5cdFx0fSBlbHNlIGlmIChvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbi4kRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRMYXN0XCIpIHtcblx0XHRcdHJldHVybiBcIlZhbHVlRGVzY3JpcHRpb25cIjtcblx0XHR9IGVsc2UgaWYgKG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dFNlcGFyYXRlXCIpIHtcblx0XHRcdHJldHVybiBcIlZhbHVlXCI7XG5cdFx0fVxuXHRcdC8vRGVmYXVsdCBzaG91bGQgYmUgVGV4dEZpcnN0IGlmIHRoZXJlIGlzIGEgVGV4dCBhbm5vdGF0aW9uIGFuZCBuZWl0aGVyIFRleHRPbmx5IG5vciBUZXh0TGFzdCBhcmUgc2V0XG5cdFx0cmV0dXJuIFwiRGVzY3JpcHRpb25WYWx1ZVwiO1xuXHR9XG5cdHJldHVybiBvVGV4dEFubm90YXRpb24gPyBcIkRlc2NyaXB0aW9uVmFsdWVcIiA6IFwiVmFsdWVcIjtcbn1cblxuZnVuY3Rpb24gX2dldEVudGl0eVR5cGUob0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSB7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpfS8kVHlwZWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfcmVxdWVzdE9iamVjdChzQWN0aW9uOiBzdHJpbmcsIG9TZWxlY3RlZENvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBzUHJvcGVydHk6IHN0cmluZykge1xuXHRsZXQgb0NvbnRleHQgPSBvU2VsZWN0ZWRDb250ZXh0O1xuXHRjb25zdCBuQnJhY2tldEluZGV4ID0gc0FjdGlvbi5pbmRleE9mKFwiKFwiKTtcblxuXHRpZiAobkJyYWNrZXRJbmRleCA+IC0xKSB7XG5cdFx0Y29uc3Qgc1RhcmdldFR5cGUgPSBzQWN0aW9uLnNsaWNlKG5CcmFja2V0SW5kZXggKyAxLCAtMSk7XG5cdFx0bGV0IHNDdXJyZW50VHlwZSA9IF9nZXRFbnRpdHlUeXBlKG9Db250ZXh0KTtcblxuXHRcdHdoaWxlIChzQ3VycmVudFR5cGUgIT09IHNUYXJnZXRUeXBlKSB7XG5cdFx0XHQvLyBGaW5kIHBhcmVudCBiaW5kaW5nIGNvbnRleHQgYW5kIHJldHJpZXZlIGVudGl0eSB0eXBlXG5cdFx0XHRvQ29udGV4dCA9IG9Db250ZXh0LmdldEJpbmRpbmcoKS5nZXRDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0c0N1cnJlbnRUeXBlID0gX2dldEVudGl0eVR5cGUob0NvbnRleHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJDYW5ub3QgZGV0ZXJtaW5lIHRhcmdldCB0eXBlIHRvIHJlcXVlc3QgcHJvcGVydHkgdmFsdWUgZm9yIGJvdW5kIGFjdGlvbiBpbnZvY2F0aW9uXCIpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RPYmplY3Qoc1Byb3BlcnR5KTtcbn1cblxuZXhwb3J0IHR5cGUgX1JlcXVlc3RlZFByb3BlcnR5ID0ge1xuXHR2UHJvcGVydHlWYWx1ZTogdW5rbm93bjtcblx0b1NlbGVjdGVkQ29udGV4dDogQ29udGV4dDtcblx0c0FjdGlvbjogc3RyaW5nO1xuXHRzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoOiBzdHJpbmc7XG59O1xuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFByb3BlcnR5KFxuXHRvU2VsZWN0ZWRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0c0FjdGlvbjogc3RyaW5nLFxuXHRzUHJvcGVydHk6IHN0cmluZyxcblx0c0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT4ge1xuXHRjb25zdCBvUHJvbWlzZSA9XG5cdFx0c1Byb3BlcnR5ICYmIHNQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA9PT0gMFxuXHRcdFx0PyByZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkoc1Byb3BlcnR5LCBvU2VsZWN0ZWRDb250ZXh0LmdldE1vZGVsKCkpXG5cdFx0XHQ6IF9yZXF1ZXN0T2JqZWN0KHNBY3Rpb24sIG9TZWxlY3RlZENvbnRleHQsIHNQcm9wZXJ0eSk7XG5cblx0cmV0dXJuIG9Qcm9taXNlLnRoZW4oZnVuY3Rpb24gKHZQcm9wZXJ0eVZhbHVlOiB1bmtub3duKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHZQcm9wZXJ0eVZhbHVlOiB2UHJvcGVydHlWYWx1ZSxcblx0XHRcdG9TZWxlY3RlZENvbnRleHQ6IG9TZWxlY3RlZENvbnRleHQsXG5cdFx0XHRzQWN0aW9uOiBzQWN0aW9uLFxuXHRcdFx0c0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aDogc0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aFxuXHRcdH07XG5cdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUoXG5cdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdGFSZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdLFxuXHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG4pIHtcblx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpXG5cdFx0LnRoZW4oZnVuY3Rpb24gKGFSZXN1bHRzKSB7XG5cdFx0XHRpZiAoYVJlc3VsdHMubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IGFBcHBsaWNhYmxlQ29udGV4dHM6IHVua25vd25bXSA9IFtdLFxuXHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlQ29udGV4dHM6IHVua25vd25bXSA9IFtdO1xuXHRcdFx0XHRhUmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChhUmVzdWx0KSB7XG5cdFx0XHRcdFx0aWYgKGFSZXN1bHQpIHtcblx0XHRcdFx0XHRcdGlmIChhUmVzdWx0LnZQcm9wZXJ0eVZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KGFSZXN1bHQuc0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdGFBcHBsaWNhYmxlQ29udGV4dHMucHVzaChhUmVzdWx0Lm9TZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVDb250ZXh0cy5wdXNoKGFSZXN1bHQub1NlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c2V0RHluYW1pY0FjdGlvbkNvbnRleHRzKFxuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRhUmVzdWx0c1swXS5zQWN0aW9uLFxuXHRcdFx0XHRcdGFBcHBsaWNhYmxlQ29udGV4dHMsXG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVDb250ZXh0cyxcblx0XHRcdFx0XHRmb3JDb250ZXh0TWVudVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0pXG5cdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy50cmFjZShcIkNhbm5vdCByZXRyaWV2ZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHBhdGhcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fSk7XG59XG5cbi8qKlxuICogQHBhcmFtIG9JbnRlcm5hbE1vZGVsQ29udGV4dFxuICogQHBhcmFtIHNBY3Rpb25cbiAqIEBwYXJhbSBhQXBwbGljYWJsZVxuICogQHBhcmFtIGFOb3RBcHBsaWNhYmxlXG4gKi9cbmZ1bmN0aW9uIHNldER5bmFtaWNBY3Rpb25Db250ZXh0cyhcblx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRhY3Rpb246IHN0cmluZyxcblx0YXBwbGljYWJsZTogdW5rbm93bltdLFxuXHRub3RBcHBsaWNhYmxlOiB1bmtub3duW10sXG5cdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcbikge1xuXHRjb25zdCBkeW5hbWljQWN0aW9uUGF0aFByZWZpeCA9IGAke2ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vZHluYW1pY0FjdGlvbnMvJHthY3Rpb259YCxcblx0XHRpbnRlcm5hbE1vZGVsID0gaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRhcHBsaWNhYmxlUHJvcGVydHkgPSAhZm9yQ29udGV4dE1lbnUgPyBcImFBcHBsaWNhYmxlXCIgOiBcImFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnVcIixcblx0XHRub3RBcHBsaWNhYmxlUHJvcGVydHkgPSAhZm9yQ29udGV4dE1lbnUgPyBcImFOb3RBcHBsaWNhYmxlXCIgOiBcImFOb3RBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnVcIjtcblx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShgJHtkeW5hbWljQWN0aW9uUGF0aFByZWZpeH0vJHthcHBsaWNhYmxlUHJvcGVydHl9YCwgYXBwbGljYWJsZSk7XG5cdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoYCR7ZHluYW1pY0FjdGlvblBhdGhQcmVmaXh9LyR7bm90QXBwbGljYWJsZVByb3BlcnR5fWAsIG5vdEFwcGxpY2FibGUpO1xufVxuXG5mdW5jdGlvbiBfZ2V0RGVmYXVsdE9wZXJhdG9ycyhzUHJvcGVydHlUeXBlPzogc3RyaW5nKSB7XG5cdC8vIG1kYyBkZWZpbmVzIHRoZSBmdWxsIHNldCBvZiBvcGVyYXRpb25zIHRoYXQgYXJlIG1lYW5pbmdmdWwgZm9yIGVhY2ggRWRtIFR5cGVcblx0Ly8gVE9ETyBSZXBsYWNlIHdpdGggbW9kZWwgLyBpbnRlcm5hbCB3YXkgb2YgcmV0cmlldmluZyB0aGUgYWN0dWFsIG1vZGVsIHR5cGUgdXNlZCBmb3IgdGhlIHByb3BlcnR5XG5cdGNvbnN0IG9EYXRhQ2xhc3MgPSBUeXBlTWFwLmdldERhdGFUeXBlQ2xhc3NOYW1lKHNQcm9wZXJ0eVR5cGUpO1xuXHQvLyBUT0RPIG5lZWQgdG8gcGFzcyBwcm9wZXIgZm9ybWF0T3B0aW9ucywgY29uc3RyYWludHMgaGVyZVxuXHRjb25zdCBvQmFzZVR5cGUgPSBUeXBlTWFwLmdldEJhc2VUeXBlKG9EYXRhQ2xhc3MsIHt9LCB7fSk7XG5cdHJldHVybiBGaWx0ZXJPcGVyYXRvclV0aWwuZ2V0T3BlcmF0b3JzRm9yVHlwZShvQmFzZVR5cGUpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BzOiBzdHJpbmdbXSwgYUV4cHJlc3Npb25PcHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuXHQvLyBGcm9tIHRoZSBkZWZhdWx0IHNldCBvZiBPcGVyYXRvcnMgZm9yIHRoZSBCYXNlIFR5cGUsIHNlbGVjdCB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBBbGxvd2VkIFZhbHVlLlxuXHQvLyBJbiBjYXNlIHRoYXQgbm8gb3BlcmF0b3JzIGFyZSBmb3VuZCwgcmV0dXJuIHVuZGVmaW5lZCBzbyB0aGF0IHRoZSBkZWZhdWx0IHNldCBpcyB1c2VkLlxuXHRyZXR1cm4gYURlZmF1bHRPcHMuZmlsdGVyKGZ1bmN0aW9uIChzRWxlbWVudCkge1xuXHRcdHJldHVybiBhRXhwcmVzc2lvbk9wcy5pbmNsdWRlcyhzRWxlbWVudCk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uKGFFeHByZXNzaW9uczogc3RyaW5nW10pIHtcblx0Y29uc3QgYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5ID0gQ29tbW9uVXRpbHMuQWxsb3dlZEV4cHJlc3Npb25zUHJpbztcblxuXHRhRXhwcmVzc2lvbnMuc29ydChmdW5jdGlvbiAoYTogc3RyaW5nLCBiOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5LmluZGV4T2YoYSkgLSBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkuaW5kZXhPZihiKTtcblx0fSk7XG5cblx0cmV0dXJuIGFFeHByZXNzaW9uc1swXTtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gZmV0Y2ggdGhlIGNvcnJlY3Qgb3BlcmF0b3JzIGJhc2VkIG9uIHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIHRoYXQgY2FuIGJlIGFubm90YXRlZCBvbiBhbiBlbnRpdHkgc2V0IG9yIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqIFdlIHJldHVybiB0aGUgY29ycmVjdCBvcGVyYXRvcnMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCByZXN0cmljdGlvbiBhbmQgYWxzbyBjaGVjayBmb3IgdGhlIG9wZXJhdG9ycyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgdGhlbS5cbiAqXG4gKiBAcGFyYW0gc1Byb3BlcnR5IFN0cmluZyBuYW1lIG9mIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIHNFbnRpdHlTZXRQYXRoIFN0cmluZyBwYXRoIHRvIHRoZSBlbnRpdHkgc2V0XG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB1c2VkIGR1cmluZyB0ZW1wbGF0aW5nXG4gKiBAcGFyYW0gc1R5cGUgU3RyaW5nIGRhdGEgdHlwZSBvZCB0aGUgcHJvcGVydHksIGZvciBleGFtcGxlIGVkbS5EYXRlXG4gKiBAcGFyYW0gYlVzZVNlbWFudGljRGF0ZVJhbmdlIEJvb2xlYW4gcGFzc2VkIGZyb20gdGhlIG1hbmlmZXN0IGZvciBzZW1hbnRpYyBkYXRlIHJhbmdlXG4gKiBAcGFyYW0gc2V0dGluZ3MgU3RyaW5naWZpZWQgb2JqZWN0IG9mIHRoZSBwcm9wZXJ0eSBzZXR0aW5ncyBvciBwcm9wZXJ0eSBzZXR0aW5ncyBhcyBhIHdob2xlXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBvcGVyYXRvcnMgZm9yIGZpbHRlcmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkoXG5cdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRzRW50aXR5U2V0UGF0aDogc3RyaW5nLFxuXHRvQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdHNUeXBlPzogc3RyaW5nLFxuXHRiVXNlU2VtYW50aWNEYXRlUmFuZ2U/OiBib29sZWFuIHwgc3RyaW5nLFxuXHRzZXR0aW5ncz86IEZpbHRlclNldHRpbmdzIHwgc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IG9GaWx0ZXJSZXN0cmljdGlvbnMgPSBDb21tb25VdGlscy5nZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGgoc0VudGl0eVNldFBhdGgsIG9Db250ZXh0KTtcblx0Y29uc3QgYUVxdWFsc09wcyA9IFtcIkVRXCJdO1xuXHRjb25zdCBhU2luZ2xlUmFuZ2VPcHMgPSBbXCJFUVwiLCBcIkdFXCIsIFwiTEVcIiwgXCJMVFwiLCBcIkdUXCIsIFwiQlRcIiwgXCJOT1RMRVwiLCBcIk5PVExUXCIsIFwiTk9UR0VcIiwgXCJOT1RHVFwiXTtcblx0Y29uc3QgYVNpbmdsZVJhbmdlRFRCYXNpY09wcyA9IFtcIkVRXCIsIFwiQlRcIl07XG5cdGNvbnN0IGFTaW5nbGVWYWx1ZURhdGVPcHMgPSBbXG5cdFx0XCJUT0RBWVwiLFxuXHRcdFwiVE9NT1JST1dcIixcblx0XHRcIllFU1RFUkRBWVwiLFxuXHRcdFwiREFURVwiLFxuXHRcdFwiRklSU1REQVlXRUVLXCIsXG5cdFx0XCJMQVNUREFZV0VFS1wiLFxuXHRcdFwiRklSU1REQVlNT05USFwiLFxuXHRcdFwiTEFTVERBWU1PTlRIXCIsXG5cdFx0XCJGSVJTVERBWVFVQVJURVJcIixcblx0XHRcIkxBU1REQVlRVUFSVEVSXCIsXG5cdFx0XCJGSVJTVERBWVlFQVJcIixcblx0XHRcIkxBU1REQVlZRUFSXCJcblx0XTtcblx0Y29uc3QgYU11bHRpUmFuZ2VPcHMgPSBbXCJFUVwiLCBcIkdFXCIsIFwiTEVcIiwgXCJMVFwiLCBcIkdUXCIsIFwiQlRcIiwgXCJORVwiLCBcIk5PVEJUXCIsIFwiTk9UTEVcIiwgXCJOT1RMVFwiLCBcIk5PVEdFXCIsIFwiTk9UR1RcIl07XG5cdGNvbnN0IGFTZWFyY2hFeHByZXNzaW9uT3BzID0gW1wiQ29udGFpbnNcIiwgXCJOb3RDb250YWluc1wiLCBcIlN0YXJ0c1dpdGhcIiwgXCJOb3RTdGFydHNXaXRoXCIsIFwiRW5kc1dpdGhcIiwgXCJOb3RFbmRzV2l0aFwiXTtcblx0Y29uc3QgYVNlbWFudGljRGF0ZU9wc0V4dCA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTdXBwb3J0ZWRPcGVyYXRpb25zKCk7XG5cdGNvbnN0IGJTZW1hbnRpY0RhdGVSYW5nZSA9IGJVc2VTZW1hbnRpY0RhdGVSYW5nZSA9PT0gXCJ0cnVlXCIgfHwgYlVzZVNlbWFudGljRGF0ZVJhbmdlID09PSB0cnVlO1xuXHRsZXQgYVNlbWFudGljRGF0ZU9wczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3Qgb1NldHRpbmdzID0gc2V0dGluZ3MgJiYgdHlwZW9mIHNldHRpbmdzID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShzZXR0aW5ncykuY3VzdG9tRGF0YSA6IHNldHRpbmdzO1xuXG5cdGlmICgob0NvbnRleHQuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKSBhcyB1bmtub3duKSA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybiBhRXF1YWxzT3BzO1xuXHR9XG5cblx0aWYgKG9TZXR0aW5ncyAmJiBvU2V0dGluZ3Mub3BlcmF0b3JDb25maWd1cmF0aW9uICYmIG9TZXR0aW5ncy5vcGVyYXRvckNvbmZpZ3VyYXRpb24ubGVuZ3RoID4gMCkge1xuXHRcdGFTZW1hbnRpY0RhdGVPcHMgPSBTZW1hbnRpY0RhdGVPcGVyYXRvcnMuZ2V0RmlsdGVyT3BlcmF0aW9ucyhvU2V0dGluZ3Mub3BlcmF0b3JDb25maWd1cmF0aW9uLCBzVHlwZSk7XG5cdH0gZWxzZSB7XG5cdFx0YVNlbWFudGljRGF0ZU9wcyA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTZW1hbnRpY0RhdGVPcGVyYXRpb25zKHNUeXBlKTtcblx0fVxuXHQvLyBHZXQgdGhlIGRlZmF1bHQgT3BlcmF0b3JzIGZvciB0aGlzIFByb3BlcnR5IFR5cGVcblx0bGV0IGFEZWZhdWx0T3BlcmF0b3JzID0gX2dldERlZmF1bHRPcGVyYXRvcnMoc1R5cGUpO1xuXHRpZiAoYlNlbWFudGljRGF0ZVJhbmdlKSB7XG5cdFx0YURlZmF1bHRPcGVyYXRvcnMgPSBhU2VtYW50aWNEYXRlT3BzRXh0LmNvbmNhdChhRGVmYXVsdE9wZXJhdG9ycyk7XG5cdH1cblx0bGV0IHJlc3RyaWN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuXHQvLyBJcyB0aGVyZSBhIEZpbHRlciBSZXN0cmljdGlvbiBkZWZpbmVkIGZvciB0aGlzIHByb3BlcnR5P1xuXHRpZiAob0ZpbHRlclJlc3RyaWN0aW9ucyAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1tzUHJvcGVydHldKSB7XG5cdFx0Ly8gRXh0ZW5kaW5nIHRoZSBkZWZhdWx0IG9wZXJhdG9ycyBsaXN0IHdpdGggU2VtYW50aWMgRGF0ZSBvcHRpb25zIERBVEVSQU5HRSwgREFURSwgRlJPTSBhbmQgVE9cblx0XHRjb25zdCBzQWxsb3dlZEV4cHJlc3Npb24gPSBDb21tb25VdGlscy5nZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uKG9GaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zW3NQcm9wZXJ0eV0pO1xuXHRcdC8vIEluIGNhc2UgbW9yZSB0aGFuIG9uZSBBbGxvd2VkIEV4cHJlc3Npb25zIGhhcyBiZWVuIGRlZmluZWQgZm9yIGEgcHJvcGVydHlcblx0XHQvLyBjaG9vc2UgdGhlIG1vc3QgcmVzdHJpY3RpdmUgQWxsb3dlZCBFeHByZXNzaW9uXG5cblx0XHQvLyBNdWx0aVZhbHVlIGhhcyBzYW1lIE9wZXJhdG9yIGFzIFNpbmdsZVZhbHVlLCBidXQgdGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgKG1heENvbmRpdGlvbnMpXG5cdFx0c3dpdGNoIChzQWxsb3dlZEV4cHJlc3Npb24pIHtcblx0XHRcdGNhc2UgXCJTaW5nbGVWYWx1ZVwiOlxuXHRcdFx0XHRjb25zdCBhU2luZ2xlVmFsdWVPcHMgPSBzVHlwZSA9PT0gXCJFZG0uRGF0ZVwiICYmIGJTZW1hbnRpY0RhdGVSYW5nZSA/IGFTaW5nbGVWYWx1ZURhdGVPcHMgOiBhRXF1YWxzT3BzO1xuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhU2luZ2xlVmFsdWVPcHMpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJNdWx0aVZhbHVlXCI6XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFFcXVhbHNPcHMpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJTaW5nbGVSYW5nZVwiOlxuXHRcdFx0XHRsZXQgYUV4cHJlc3Npb25PcHM6IHN0cmluZ1tdO1xuXHRcdFx0XHRpZiAoYlNlbWFudGljRGF0ZVJhbmdlKSB7XG5cdFx0XHRcdFx0aWYgKHNUeXBlID09PSBcIkVkbS5EYXRlXCIpIHtcblx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNlbWFudGljRGF0ZU9wcztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNUeXBlID09PSBcIkVkbS5EYXRlVGltZU9mZnNldFwiKSB7XG5cdFx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTZW1hbnRpY0RhdGVPcHM7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNpbmdsZVJhbmdlT3BzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChzVHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIikge1xuXHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNpbmdsZVJhbmdlRFRCYXNpY09wcztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTaW5nbGVSYW5nZU9wcztcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBzT3BlcmF0b3JzID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYUV4cHJlc3Npb25PcHMpO1xuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBzT3BlcmF0b3JzO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJNdWx0aVJhbmdlXCI6XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFNdWx0aVJhbmdlT3BzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiU2VhcmNoRXhwcmVzc2lvblwiOlxuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhU2VhcmNoRXhwcmVzc2lvbk9wcyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cIjpcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYVNlYXJjaEV4cHJlc3Npb25PcHMuY29uY2F0KGFNdWx0aVJhbmdlT3BzKSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdC8vIEluIGNhc2UgQWxsb3dlZEV4cHJlc3Npb25zIGlzIG5vdCByZWNvZ25pc2VkLCB1bmRlZmluZWQgaW4gcmV0dXJuIHJlc3VsdHMgaW4gdGhlIGRlZmF1bHQgc2V0IG9mXG5cdFx0Ly8gb3BlcmF0b3JzIGZvciB0aGUgdHlwZS5cblx0fVxuXHRyZXR1cm4gcmVzdHJpY3Rpb25zO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byByZXR1cm4gYWxsb3dlZCBvcGVyYXRvcnMgZm9yIHR5cGUgR3VpZC5cbiAqXG4gKiBAcmV0dXJucyBBbGxvd2VkIG9wZXJhdG9ycyBmb3IgdHlwZSBHdWlkXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdG9yc0Zvckd1aWRQcm9wZXJ0eSgpOiBzdHJpbmcge1xuXHRjb25zdCBhbGxvd2VkT3BlcmF0b3JzRm9yR3VpZCA9IFtcIkVRXCIsIFwiTkVcIl07XG5cdHJldHVybiBhbGxvd2VkT3BlcmF0b3JzRm9yR3VpZC50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiBnZXRPcGVyYXRvcnNGb3JEYXRlUHJvcGVydHkocHJvcGVydHlUeXBlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdC8vIEluIGNhc2UgQWxsb3dlZEV4cHJlc3Npb25zIGlzIG5vdCBwcm92aWRlZCBmb3IgdHlwZSBFZG0uRGF0ZSB0aGVuIGFsbCB0aGUgZGVmYXVsdFxuXHQvLyBvcGVyYXRvcnMgZm9yIHRoZSB0eXBlIHNob3VsZCBiZSByZXR1cm5lZCBleGNsdWRpbmcgc2VtYW50aWMgb3BlcmF0b3JzIGZyb20gdGhlIGxpc3QuXG5cdGNvbnN0IGFEZWZhdWx0T3BlcmF0b3JzID0gX2dldERlZmF1bHRPcGVyYXRvcnMocHJvcGVydHlUeXBlKTtcblx0Y29uc3QgYU11bHRpUmFuZ2VPcHMgPSBbXCJFUVwiLCBcIkdFXCIsIFwiTEVcIiwgXCJMVFwiLCBcIkdUXCIsIFwiQlRcIiwgXCJORVwiLCBcIk5PVEJUXCIsIFwiTk9UTEVcIiwgXCJOT1RMVFwiLCBcIk5PVEdFXCIsIFwiTk9UR1RcIl07XG5cdHJldHVybiBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhTXVsdGlSYW5nZU9wcyk7XG59XG5cbnR5cGUgUGFyYW1ldGVySW5mbyA9IHtcblx0Y29udGV4dFBhdGg/OiBzdHJpbmc7XG5cdHBhcmFtZXRlclByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxQcm9wZXJ0eT47XG59O1xuZnVuY3Rpb24gZ2V0UGFyYW1ldGVySW5mbyhtZXRhTW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCwgc0NvbnRleHRQYXRoOiBzdHJpbmcpIHtcblx0Y29uc3Qgc1BhcmFtZXRlckNvbnRleHRQYXRoID0gc0NvbnRleHRQYXRoLnN1YnN0cmluZygwLCBzQ29udGV4dFBhdGgubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0Y29uc3QgYlJlc3VsdENvbnRleHQgPSBtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtzUGFyYW1ldGVyQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dGApO1xuXHRjb25zdCBvUGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbyA9IHt9O1xuXHRpZiAoYlJlc3VsdENvbnRleHQgJiYgc1BhcmFtZXRlckNvbnRleHRQYXRoICE9PSBzQ29udGV4dFBhdGgpIHtcblx0XHRvUGFyYW1ldGVySW5mby5jb250ZXh0UGF0aCA9IHNQYXJhbWV0ZXJDb250ZXh0UGF0aDtcblx0XHRvUGFyYW1ldGVySW5mby5wYXJhbWV0ZXJQcm9wZXJ0aWVzID0gQ29tbW9uVXRpbHMuZ2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzKG1ldGFNb2RlbENvbnRleHQsIHNQYXJhbWV0ZXJDb250ZXh0UGF0aCk7XG5cdH1cblx0cmV0dXJuIG9QYXJhbWV0ZXJJbmZvO1xufVxuXG50eXBlIFZpZXdEYXRhID0ge1xuXHRjb250cm9sQ29uZmlndXJhdGlvbj86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn07XG5cbmZ1bmN0aW9uIGFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50KG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LCBtUGFnZUNvbnRleHQ6IHVua25vd25bXSwgb1ZpZXc6IFZpZXcpIHtcblx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyk7XG5cdGNvbnN0IG9OYXZpZ2F0aW9uU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKTtcblx0cmV0dXJuIG9OYXZpZ2F0aW9uU2VydmljZS5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudChtUGFnZUNvbnRleHQsIG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpKTtcbn1cblxuZnVuY3Rpb24gaXNTdGlja3lFZGl0TW9kZShvQ29udHJvbDogQ29udHJvbCkge1xuXHRjb25zdCBiSXNTdGlja3lNb2RlID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKChvQ29udHJvbC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpKTtcblx0Y29uc3QgYlVJRWRpdGFibGUgPSAob0NvbnRyb2wuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWwpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdHJldHVybiBiSXNTdGlja3lNb2RlICYmIGJVSUVkaXRhYmxlO1xufVxuXG5leHBvcnQgdHlwZSBVc2VyRGVmYXVsdFBhcmFtZXRlciA9XG5cdHwge1xuXHRcdFx0JE5hbWU6IHN0cmluZztcblx0XHRcdCRUeXBlPzogc3RyaW5nO1xuXHQgIH1cblx0fCBDb250ZXh0O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdXNlciBkZWZhdWx0cyBmcm9tIHRoZSBzdGFydHVwIGFwcCBzdGF0ZSAoaWYgYXZhaWxhYmxlKSBvciB0aGUgc3RhcnR1cCBwYXJhbWV0ZXIgYW5kIHNldHMgdGhlbSB0byBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBhcHBDb21wb25lbnRcbiAqIEBwYXJhbSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gbW9kZWxcbiAqIEBwYXJhbSBpc0FjdGlvblxuICogQHBhcmFtIGlzQ3JlYXRlXG4gKiBAcGFyYW0gYWN0aW9uRGVmYXVsdFZhbHVlc1xuICovXG5hc3luYyBmdW5jdGlvbiBzZXRVc2VyRGVmYXVsdHMoXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRwYXJhbWV0ZXJzOiBVc2VyRGVmYXVsdFBhcmFtZXRlcltdLFxuXHRtb2RlbDogSlNPTk1vZGVsIHwgT0RhdGFWNENvbnRleHQsXG5cdGlzQWN0aW9uOiBib29sZWFuLFxuXHRpc0NyZWF0ZT86IGJvb2xlYW4sXG5cdGFjdGlvbkRlZmF1bHRWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IGNvbXBvbmVudERhdGEgPSBhcHBDb21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpLFxuXHRcdHN0YXJ0dXBQYXJhbWV0ZXJzID0gKGNvbXBvbmVudERhdGEgJiYgY29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycykgfHwge30sXG5cdFx0c2hlbGxTZXJ2aWNlcyA9IGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdGNvbnN0IHN0YXJ0dXBBcHBTdGF0ZSA9IGF3YWl0IHNoZWxsU2VydmljZXMuZ2V0U3RhcnR1cEFwcFN0YXRlKGFwcENvbXBvbmVudCk7XG5cdGNvbnN0IHN0YXJ0dXBBcHBTdGF0ZURhdGEgPSBzdGFydHVwQXBwU3RhdGU/LmdldERhdGEoKSB8fCB7fSxcblx0XHRleHRlbmRlZFBhcmFtZXRlcnMgPSAoc3RhcnR1cEFwcFN0YXRlRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmIHN0YXJ0dXBBcHBTdGF0ZURhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB8fCBbXTtcblx0cGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChvUGFyYW1ldGVyKSB7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5TmFtZSA9IGlzQWN0aW9uXG5cdFx0XHQ/IGAvJHsob1BhcmFtZXRlciBhcyB7ICROYW1lOiBzdHJpbmcgfSkuJE5hbWV9YFxuXHRcdFx0OiAob1BhcmFtZXRlciBhcyBDb250ZXh0KS5nZXRQYXRoPy4oKS5zbGljZSgob1BhcmFtZXRlciBhcyBDb250ZXh0KS5nZXRQYXRoKCkubGFzdEluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0Y29uc3Qgc1BhcmFtZXRlck5hbWUgPSBpc0FjdGlvbiA/IHNQcm9wZXJ0eU5hbWUuc2xpY2UoMSkgOiBzUHJvcGVydHlOYW1lO1xuXHRcdGlmIChhY3Rpb25EZWZhdWx0VmFsdWVzICYmIGlzQ3JlYXRlKSB7XG5cdFx0XHRpZiAoYWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pIHtcblx0XHRcdFx0bW9kZWwuc2V0UHJvcGVydHkoc1Byb3BlcnR5TmFtZSwgYWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc3RhcnR1cFBhcmFtZXRlcnNbc1BhcmFtZXRlck5hbWVdKSB7XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJ0VHlwZSA9IChcblx0XHRcdFx0b1BhcmFtZXRlciBhcyB7XG5cdFx0XHRcdFx0JE5hbWU6IHN0cmluZztcblx0XHRcdFx0XHQkVHlwZT86IHN0cmluZztcblx0XHRcdFx0fVxuXHRcdFx0KS4kVHlwZVxuXHRcdFx0XHQ/IFR5cGVNYXAuZ2V0QmFzZVR5cGUoXG5cdFx0XHRcdFx0XHQoXG5cdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXIgYXMge1xuXHRcdFx0XHRcdFx0XHRcdCROYW1lOiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRcdFx0JFR5cGU6IHN0cmluZztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0KS4kVHlwZVxuXHRcdFx0XHQgIClcblx0XHRcdFx0OiBCYXNlVHlwZS5TdHJpbmc7XG5cdFx0XHRjb25zdCB0eXBlSW5zdGFuY2UgPSBUeXBlTWFwLmdldERhdGFUeXBlSW5zdGFuY2UocGFyYW1ldGVydFR5cGUpO1xuXHRcdFx0bW9kZWwuc2V0UHJvcGVydHkoc1Byb3BlcnR5TmFtZSwgdHlwZUluc3RhbmNlLnBhcnNlVmFsdWUoc3RhcnR1cFBhcmFtZXRlcnNbc1BhcmFtZXRlck5hbWVdWzBdLCBcInN0cmluZ1wiKSk7XG5cdFx0fSBlbHNlIGlmIChleHRlbmRlZFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0Zm9yIChjb25zdCBvRXh0ZW5kZWRQYXJhbWV0ZXIgb2YgZXh0ZW5kZWRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGlmIChvRXh0ZW5kZWRQYXJhbWV0ZXIuUHJvcGVydHlOYW1lID09PSBzUGFyYW1ldGVyTmFtZSkge1xuXHRcdFx0XHRcdGNvbnN0IG9SYW5nZSA9IG9FeHRlbmRlZFBhcmFtZXRlci5SYW5nZXMubGVuZ3RoXG5cdFx0XHRcdFx0XHQ/IG9FeHRlbmRlZFBhcmFtZXRlci5SYW5nZXNbb0V4dGVuZGVkUGFyYW1ldGVyLlJhbmdlcy5sZW5ndGggLSAxXVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKG9SYW5nZSAmJiBvUmFuZ2UuU2lnbiA9PT0gXCJJXCIgJiYgb1JhbmdlLk9wdGlvbiA9PT0gXCJFUVwiKSB7XG5cdFx0XHRcdFx0XHRtb2RlbC5zZXRQcm9wZXJ0eShzUHJvcGVydHlOYW1lLCBvUmFuZ2UuTG93KTsgLy8gaGlnaCBpcyBpZ25vcmVkIHdoZW4gT3B0aW9uPUVRXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuZXhwb3J0IHR5cGUgSW5ib3VuZFBhcmFtZXRlciA9IHtcblx0dXNlRm9yQ3JlYXRlOiBib29sZWFuO1xufTtcbmZ1bmN0aW9uIGdldEFkZGl0aW9uYWxQYXJhbXNGb3JDcmVhdGUoXG5cdG9TdGFydHVwUGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bltdPixcblx0b0luYm91bmRQYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgSW5ib3VuZFBhcmFtZXRlcj5cbikge1xuXHRjb25zdCBvSW5ib3VuZHMgPSBvSW5ib3VuZFBhcmFtZXRlcnMsXG5cdFx0YUNyZWF0ZVBhcmFtZXRlcnMgPVxuXHRcdFx0b0luYm91bmRzICE9PSB1bmRlZmluZWRcblx0XHRcdFx0PyBPYmplY3Qua2V5cyhvSW5ib3VuZHMpLmZpbHRlcihmdW5jdGlvbiAoc1BhcmFtZXRlcjogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0luYm91bmRzW3NQYXJhbWV0ZXJdLnVzZUZvckNyZWF0ZTtcblx0XHRcdFx0ICB9KVxuXHRcdFx0XHQ6IFtdO1xuXHRsZXQgb1JldDtcblx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGFDcmVhdGVQYXJhbWV0ZXJzKSB7XG5cdFx0Y29uc3Qgc0NyZWF0ZVBhcmFtZXRlciA9IGVsZW1lbnQ7XG5cdFx0Y29uc3QgYVZhbHVlcyA9IG9TdGFydHVwUGFyYW1ldGVycyAmJiBvU3RhcnR1cFBhcmFtZXRlcnNbc0NyZWF0ZVBhcmFtZXRlcl07XG5cdFx0aWYgKGFWYWx1ZXMgJiYgYVZhbHVlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdG9SZXQgPSBvUmV0IHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdFx0XHRvUmV0W3NDcmVhdGVQYXJhbWV0ZXJdID0gYVZhbHVlc1swXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9SZXQ7XG59XG50eXBlIE91dGJvdW5kUGFyYW1ldGVyID0ge1xuXHRwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBPdXRib3VuZFBhcmFtZXRlclZhbHVlPjtcblx0c2VtYW50aWNPYmplY3Q/OiBzdHJpbmc7XG5cdGFjdGlvbj86IHN0cmluZztcbn07XG50eXBlIE91dGJvdW5kUGFyYW1ldGVyVmFsdWUgPSB7XG5cdHZhbHVlPzoge1xuXHRcdHZhbHVlPzogc3RyaW5nO1xuXHRcdGZvcm1hdD86IHN0cmluZztcblx0fTtcbn07XG5mdW5jdGlvbiBnZXRTZW1hbnRpY09iamVjdE1hcHBpbmcob091dGJvdW5kOiBPdXRib3VuZFBhcmFtZXRlcikge1xuXHRjb25zdCBhU2VtYW50aWNPYmplY3RNYXBwaW5nOiBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W10gPSBbXTtcblx0aWYgKG9PdXRib3VuZC5wYXJhbWV0ZXJzKSB7XG5cdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvT3V0Ym91bmQucGFyYW1ldGVycykgfHwgW107XG5cdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHNQYXJhbTogc3RyaW5nKSB7XG5cdFx0XHRcdGNvbnN0IG9NYXBwaW5nID0gb091dGJvdW5kLnBhcmFtZXRlcnNbc1BhcmFtXTtcblx0XHRcdFx0aWYgKG9NYXBwaW5nLnZhbHVlICYmIG9NYXBwaW5nLnZhbHVlLnZhbHVlICYmIG9NYXBwaW5nLnZhbHVlLmZvcm1hdCA9PT0gXCJiaW5kaW5nXCIpIHtcblx0XHRcdFx0XHQvLyB1c2luZyB0aGUgZm9ybWF0IG9mIFVJLk1hcHBpbmdcblx0XHRcdFx0XHRjb25zdCBvU2VtYW50aWNNYXBwaW5nID0ge1xuXHRcdFx0XHRcdFx0TG9jYWxQcm9wZXJ0eToge1xuXHRcdFx0XHRcdFx0XHQkUHJvcGVydHlQYXRoOiBvTWFwcGluZy52YWx1ZS52YWx1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFNlbWFudGljT2JqZWN0UHJvcGVydHk6IHNQYXJhbVxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAoYVNlbWFudGljT2JqZWN0TWFwcGluZy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHQvLyBUbyBjaGVjayBpZiB0aGUgc2VtYW50aWNPYmplY3QgTWFwcGluZyBpcyBkb25lIGZvciB0aGUgc2FtZSBsb2NhbCBwcm9wZXJ0eSBtb3JlIHRoYXQgb25jZSB0aGVuIGZpcnN0IG9uZSB3aWxsIGJlIGNvbnNpZGVyZWRcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBhU2VtYW50aWNPYmplY3RNYXBwaW5nKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChlbGVtZW50LkxvY2FsUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGggIT09IG9TZW1hbnRpY01hcHBpbmcuTG9jYWxQcm9wZXJ0eS4kUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVNlbWFudGljT2JqZWN0TWFwcGluZy5wdXNoKG9TZW1hbnRpY01hcHBpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFTZW1hbnRpY09iamVjdE1hcHBpbmcucHVzaChvU2VtYW50aWNNYXBwaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYVNlbWFudGljT2JqZWN0TWFwcGluZztcbn1cblxuZnVuY3Rpb24gZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKG9WaWV3RGF0YTogVmlld0RhdGEsIG9Dcm9zc05hdjogUmVjb3JkPHN0cmluZywgT3V0Ym91bmRQYXJhbWV0ZXI+KSB7XG5cdGNvbnN0IG9IZWFkZXJGYWNldEl0ZW1zOiBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdHNlbWFudGljT2JqZWN0OiBzdHJpbmc7XG5cdFx0XHRhY3Rpb246IHN0cmluZztcblx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZzogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdO1xuXHRcdH1cblx0PiA9IHt9O1xuXHRsZXQgc0lkO1xuXHRjb25zdCBvQ29udHJvbENvbmZpZyA9IG9WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbiBhcyBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdG5hdmlnYXRpb24/OiB7XG5cdFx0XHRcdHRhcmdldE91dGJvdW5kPzoge1xuXHRcdFx0XHRcdG91dGJvdW5kOiBzdHJpbmc7XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXHRcdH1cblx0Pjtcblx0Zm9yIChjb25zdCBjb25maWcgaW4gb0NvbnRyb2xDb25maWcpIHtcblx0XHRpZiAoY29uZmlnLmluY2x1ZGVzKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFwiKSB8fCBjb25maWcuaW5jbHVkZXMoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnRcIikpIHtcblx0XHRcdGNvbnN0IHNPdXRib3VuZCA9IG9Db250cm9sQ29uZmlnW2NvbmZpZ10ubmF2aWdhdGlvbj8udGFyZ2V0T3V0Ym91bmQ/Lm91dGJvdW5kO1xuXHRcdFx0aWYgKHNPdXRib3VuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnN0IG9PdXRib3VuZCA9IG9Dcm9zc05hdltzT3V0Ym91bmRdO1xuXHRcdFx0XHRpZiAob091dGJvdW5kLnNlbWFudGljT2JqZWN0ICYmIG9PdXRib3VuZC5hY3Rpb24pIHtcblx0XHRcdFx0XHRpZiAoY29uZmlnLmluY2x1ZGVzKFwiQ2hhcnRcIikpIHtcblx0XHRcdFx0XHRcdHNJZCA9IGdlbmVyYXRlKFtcImZlXCIsIFwiTWljcm9DaGFydExpbmtcIiwgY29uZmlnXSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNJZCA9IGdlbmVyYXRlKFtcImZlXCIsIFwiSGVhZGVyRFBMaW5rXCIsIGNvbmZpZ10pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKG9PdXRib3VuZCk7XG5cdFx0XHRcdFx0b0hlYWRlckZhY2V0SXRlbXNbc0lkXSA9IHtcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvT3V0Ym91bmQuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRhY3Rpb246IG9PdXRib3VuZC5hY3Rpb24sXG5cdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IGFTZW1hbnRpY09iamVjdE1hcHBpbmdcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5lcnJvcihgQ3Jvc3MgbmF2aWdhdGlvbiBvdXRib3VuZCBpcyBjb25maWd1cmVkIHdpdGhvdXQgc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gZm9yICR7c091dGJvdW5kfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvSGVhZGVyRmFjZXRJdGVtcztcbn1cblxuZnVuY3Rpb24gc2V0U2VtYW50aWNPYmplY3RNYXBwaW5ncyhvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCwgdk1hcHBpbmdzOiB1bmtub3duKSB7XG5cdGNvbnN0IG9NYXBwaW5ncyA9IHR5cGVvZiB2TWFwcGluZ3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZNYXBwaW5ncykgOiB2TWFwcGluZ3M7XG5cdGZvciAoY29uc3QgZWxlbWVudCBvZiBvTWFwcGluZ3MpIHtcblx0XHRjb25zdCBzTG9jYWxQcm9wZXJ0eSA9XG5cdFx0XHQoZWxlbWVudFtcIkxvY2FsUHJvcGVydHlcIl0gJiYgZWxlbWVudFtcIkxvY2FsUHJvcGVydHlcIl1bXCIkUHJvcGVydHlQYXRoXCJdKSB8fFxuXHRcdFx0KGVsZW1lbnRbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxvY2FsUHJvcGVydHlcIl0gJiYgZWxlbWVudFtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTG9jYWxQcm9wZXJ0eVwiXVtcIiRQYXRoXCJdKTtcblx0XHRjb25zdCBzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSA9XG5cdFx0XHRlbGVtZW50W1wiU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXSB8fCBlbGVtZW50W1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdFByb3BlcnR5XCJdO1xuXHRcdGNvbnN0IG9TZWxlY3RPcHRpb24gPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oc0xvY2FsUHJvcGVydHkpO1xuXHRcdGlmIChvU2VsZWN0T3B0aW9uKSB7XG5cdFx0XHQvL0NyZWF0ZSBhIG5ldyBTZWxlY3RPcHRpb24gd2l0aCBzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSBhcyB0aGUgcHJvcGVydHkgTmFtZSBhbmQgcmVtb3ZlIHRoZSBvbGRlciBvbmVcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnJlbW92ZVNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSk7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5tYXNzQWRkU2VsZWN0T3B0aW9uKHNTZW1hbnRpY09iamVjdFByb3BlcnR5LCBvU2VsZWN0T3B0aW9uKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9TZWxlY3Rpb25WYXJpYW50O1xufVxuXG50eXBlIFNlbWFudGljT2JqZWN0RnJvbVBhdGggPSB7XG5cdHNlbWFudGljT2JqZWN0UGF0aDogc3RyaW5nO1xuXHRzZW1hbnRpY09iamVjdEZvckdldExpbmtzOiB7IHNlbWFudGljT2JqZWN0OiBzdHJpbmcgfVtdO1xuXHRzZW1hbnRpY09iamVjdDoge1xuXHRcdHNlbWFudGljT2JqZWN0OiB7ICRQYXRoOiBzdHJpbmcgfTtcblx0fTtcblx0dW5hdmFpbGFibGVBY3Rpb25zOiBzdHJpbmdbXTtcbn07XG5hc3luYyBmdW5jdGlvbiBmbkdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzUGF0aDogc3RyaW5nLCBzUXVhbGlmaWVyOiBzdHJpbmcpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlPFNlbWFudGljT2JqZWN0RnJvbVBhdGg+KGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0bGV0IHNTZW1hbnRpY09iamVjdCwgYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zO1xuXHRcdGlmIChzUXVhbGlmaWVyID09PSBcIlwiKSB7XG5cdFx0XHRzU2VtYW50aWNPYmplY3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3R9YCk7XG5cdFx0XHRhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnN9YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNTZW1hbnRpY09iamVjdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdH0jJHtzUXVhbGlmaWVyfWApO1xuXHRcdFx0YVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdGAke3NQYXRofUAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uc30jJHtzUXVhbGlmaWVyfWBcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MgPSBbeyBzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0IH1dO1xuXHRcdGNvbnN0IG9TZW1hbnRpY09iamVjdCA9IHtcblx0XHRcdHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3Rcblx0XHR9O1xuXHRcdHJlc29sdmUoe1xuXHRcdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzUGF0aCxcblx0XHRcdHNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3M6IGFTZW1hbnRpY09iamVjdEZvckdldExpbmtzLFxuXHRcdFx0c2VtYW50aWNPYmplY3Q6IG9TZW1hbnRpY09iamVjdCxcblx0XHRcdHVuYXZhaWxhYmxlQWN0aW9uczogYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zXG5cdFx0fSk7XG5cdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmblVwZGF0ZVNlbWFudGljVGFyZ2V0c01vZGVsKFxuXHRhR2V0TGlua3NQcm9taXNlczogUHJvbWlzZTxMaW5rW11bXT5bXSxcblx0YVNlbWFudGljT2JqZWN0czogU2VtYW50aWNPYmplY3RbXSxcblx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0c0N1cnJlbnRIYXNoOiBzdHJpbmdcbikge1xuXHR0eXBlIFNlbWFudGljT2JqZWN0SW5mbyA9IHsgc2VtYW50aWNPYmplY3Q6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBIYXNUYXJnZXRzOiBib29sZWFuOyBIYXNUYXJnZXRzTm90RmlsdGVyZWQ6IGJvb2xlYW4gfTtcblx0cmV0dXJuIFByb21pc2UuYWxsKGFHZXRMaW5rc1Byb21pc2VzKVxuXHRcdC50aGVuKGZ1bmN0aW9uIChhVmFsdWVzKSB7XG5cdFx0XHRsZXQgYUxpbmtzOiBMaW5rW11bXSxcblx0XHRcdFx0X29MaW5rLFxuXHRcdFx0XHRfc0xpbmtJbnRlbnRBY3Rpb24sXG5cdFx0XHRcdGFGaW5hbExpbmtzOiBMaW5rRGVmaW5pdGlvbltdW10gPSBbXTtcblx0XHRcdGxldCBvRmluYWxTZW1hbnRpY09iamVjdHM6IFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0SW5mbz4gPSB7fTtcblx0XHRcdGNvbnN0IGJJbnRlbnRIYXNBY3Rpb25zID0gZnVuY3Rpb24gKHNJbnRlbnQ6IHN0cmluZywgYUFjdGlvbnM/OiB1bmtub3duW10pIHtcblx0XHRcdFx0Zm9yIChjb25zdCBpbnRlbnQgaW4gYUFjdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAoaW50ZW50ID09PSBzSW50ZW50KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0Zm9yIChsZXQgayA9IDA7IGsgPCBhVmFsdWVzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdGFMaW5rcyA9IGFWYWx1ZXNba107XG5cdFx0XHRcdGlmIChhTGlua3MgJiYgYUxpbmtzLmxlbmd0aCA+IDAgJiYgYUxpbmtzWzBdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb25zdCBvU2VtYW50aWNPYmplY3Q6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0SW5mbz4+ID0ge307XG5cdFx0XHRcdFx0bGV0IG9UbXA6IFNlbWFudGljT2JqZWN0SW5mbztcblx0XHRcdFx0XHRsZXQgc0FsdGVybmF0ZVBhdGg7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhTGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGFGaW5hbExpbmtzLnB1c2goW10pO1xuXHRcdFx0XHRcdFx0bGV0IGhhc1RhcmdldHNOb3RGaWx0ZXJlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGV0IGhhc1RhcmdldHMgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBhTGlua3NbaV0pIHtcblx0XHRcdFx0XHRcdFx0X29MaW5rID0gZWxlbWVudDtcblx0XHRcdFx0XHRcdFx0X3NMaW5rSW50ZW50QWN0aW9uID0gX29MaW5rICYmIF9vTGluay5pbnRlbnQuc3BsaXQoXCI/XCIpWzBdLnNwbGl0KFwiLVwiKVsxXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIShfb0xpbmsgJiYgX29MaW5rLmludGVudCAmJiBfb0xpbmsuaW50ZW50LmluZGV4T2Yoc0N1cnJlbnRIYXNoKSA9PT0gMCkpIHtcblx0XHRcdFx0XHRcdFx0XHRoYXNUYXJnZXRzTm90RmlsdGVyZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdGlmICghYkludGVudEhhc0FjdGlvbnMoX3NMaW5rSW50ZW50QWN0aW9uLCBhU2VtYW50aWNPYmplY3RzW2tdLnVuYXZhaWxhYmxlQWN0aW9ucykpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFGaW5hbExpbmtzW2ldLnB1c2goX29MaW5rKTtcblx0XHRcdFx0XHRcdFx0XHRcdGhhc1RhcmdldHMgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b1RtcCA9IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IGFTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IGFTZW1hbnRpY09iamVjdHNba10ucGF0aCxcblx0XHRcdFx0XHRcdFx0SGFzVGFyZ2V0czogaGFzVGFyZ2V0cyxcblx0XHRcdFx0XHRcdFx0SGFzVGFyZ2V0c05vdEZpbHRlcmVkOiBoYXNUYXJnZXRzTm90RmlsdGVyZWRcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRpZiAob1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdID0ge307XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzQWx0ZXJuYXRlUGF0aCA9IGFTZW1hbnRpY09iamVjdHNba10ucGF0aC5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xuXHRcdFx0XHRcdFx0aWYgKG9TZW1hbnRpY09iamVjdFthU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0XVtzQWx0ZXJuYXRlUGF0aF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRvU2VtYW50aWNPYmplY3RbYVNlbWFudGljT2JqZWN0c1trXS5zZW1hbnRpY09iamVjdF1bc0FsdGVybmF0ZVBhdGhdID0ge30gYXMgU2VtYW50aWNPYmplY3RJbmZvO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdW3NBbHRlcm5hdGVQYXRoXSA9IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdFthU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0XVtzQWx0ZXJuYXRlUGF0aF0sXG5cdFx0XHRcdFx0XHRcdG9UbXBcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHNTZW1hbnRpY09iamVjdE5hbWUgPSBPYmplY3Qua2V5cyhvU2VtYW50aWNPYmplY3QpWzBdO1xuXHRcdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvRmluYWxTZW1hbnRpY09iamVjdHMpLmluY2x1ZGVzKHNTZW1hbnRpY09iamVjdE5hbWUpKSB7XG5cdFx0XHRcdFx0XHRvRmluYWxTZW1hbnRpY09iamVjdHNbc1NlbWFudGljT2JqZWN0TmFtZV0gPSBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0XHRvRmluYWxTZW1hbnRpY09iamVjdHNbc1NlbWFudGljT2JqZWN0TmFtZV0sXG5cdFx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdFtzU2VtYW50aWNPYmplY3ROYW1lXVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0ZpbmFsU2VtYW50aWNPYmplY3RzID0gT2JqZWN0LmFzc2lnbihvRmluYWxTZW1hbnRpY09iamVjdHMsIG9TZW1hbnRpY09iamVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFGaW5hbExpbmtzID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChPYmplY3Qua2V5cyhvRmluYWxTZW1hbnRpY09iamVjdHMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFwic2VtYW50aWNzVGFyZ2V0c1wiLFxuXHRcdFx0XHRcdG1lcmdlT2JqZWN0cyhvRmluYWxTZW1hbnRpY09iamVjdHMsIG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbWFudGljc1RhcmdldHNcIikpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiBvRmluYWxTZW1hbnRpY09iamVjdHM7XG5cdFx0XHR9XG5cdFx0fSlcblx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiZm5VcGRhdGVTZW1hbnRpY1RhcmdldHNNb2RlbDogQ2Fubm90IHJlYWQgbGlua3NcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZuR2V0U2VtYW50aWNPYmplY3RQcm9taXNlKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzUGF0aDogc3RyaW5nLCBzUXVhbGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFNlbWFudGljT2JqZWN0RnJvbVBhdGg+IHtcblx0cmV0dXJuIENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoKG9NZXRhTW9kZWwsIHNQYXRoLCBzUXVhbGlmaWVyKTtcbn1cblxuZnVuY3Rpb24gZm5QcmVwYXJlU2VtYW50aWNPYmplY3RzUHJvbWlzZXMoXG5cdF9vTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0X2FTZW1hbnRpY09iamVjdHNGb3VuZDogc3RyaW5nW10sXG5cdF9hU2VtYW50aWNPYmplY3RzUHJvbWlzZXM6IFByb21pc2U8U2VtYW50aWNPYmplY3RGcm9tUGF0aD5bXVxuKSB7XG5cdGxldCBfS2V5czogc3RyaW5nW10sIHNQYXRoO1xuXHRsZXQgc1F1YWxpZmllcjogc3RyaW5nLCByZWdleFJlc3VsdDtcblx0Zm9yIChjb25zdCBzZW1hbnRpY09iamVjdEZvdW5kIG9mIF9hU2VtYW50aWNPYmplY3RzRm91bmQpIHtcblx0XHRzUGF0aCA9IHNlbWFudGljT2JqZWN0Rm91bmQ7XG5cdFx0X0tleXMgPSBPYmplY3Qua2V5cyhfb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGggKyBcIkBcIikpO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBfS2V5cykge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRlbGVtZW50LmluZGV4T2YoYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdH1gKSA9PT0gMCAmJlxuXHRcdFx0XHQhZWxlbWVudC5pbmNsdWRlcyhgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0TWFwcGluZ31gKSAmJlxuXHRcdFx0XHQhZWxlbWVudC5pbmNsdWRlcyhgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zfWApXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVnZXhSZXN1bHQgPSAvIyguKikvLmV4ZWMoZWxlbWVudCk7XG5cdFx0XHRcdHNRdWFsaWZpZXIgPSByZWdleFJlc3VsdCA/IHJlZ2V4UmVzdWx0WzFdIDogXCJcIjtcblx0XHRcdFx0X2FTZW1hbnRpY09iamVjdHNQcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0UHJvbWlzZShfb01ldGFNb2RlbCwgc1BhdGgsIHNRdWFsaWZpZXIpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxudHlwZSBJbnRlcm5hbEpTT05Nb2RlbCA9IHtcblx0X2dldE9iamVjdCh2YWw6IHN0cmluZywgY29udGV4dD86IENvbnRleHQpOiBvYmplY3Q7XG59O1xuYXN5bmMgZnVuY3Rpb24gZm5HZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsKG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlciwgc1BhZ2VNb2RlbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IF9mbmZpbmRWYWx1ZXNIZWxwZXIgPSBmdW5jdGlvbiAoXG5cdFx0b2JqOiB1bmRlZmluZWQgfCBudWxsIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPltdIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0bGlzdDogc3RyaW5nW11cblx0KSB7XG5cdFx0aWYgKCFvYmopIHtcblx0XHRcdHJldHVybiBsaXN0O1xuXHRcdH1cblx0XHRpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpIHtcblx0XHRcdG9iai5mb3JFYWNoKChpdGVtKSA9PiB7XG5cdFx0XHRcdGxpc3QgPSBsaXN0LmNvbmNhdChfZm5maW5kVmFsdWVzSGVscGVyKGl0ZW0sIGtleSwgW10pKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGxpc3Q7XG5cdFx0fVxuXHRcdGlmIChvYmpba2V5XSkge1xuXHRcdFx0bGlzdC5wdXNoKG9ialtrZXldIGFzIHN0cmluZyk7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBvYmogPT0gXCJvYmplY3RcIiAmJiBvYmogIT09IG51bGwpIHtcblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gT2JqZWN0LmtleXMob2JqKTtcblx0XHRcdGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBjaGlsZHJlbikge1xuXHRcdFx0XHRcdGxpc3QgPSBsaXN0LmNvbmNhdChfZm5maW5kVmFsdWVzSGVscGVyKG9ialtlbGVtZW50XSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga2V5LCBbXSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBsaXN0O1xuXHR9O1xuXHRjb25zdCBfZm5maW5kVmFsdWVzID0gZnVuY3Rpb24gKG9iajogdW5kZWZpbmVkIHwgbnVsbCB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz5bXSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXk6IHN0cmluZykge1xuXHRcdHJldHVybiBfZm5maW5kVmFsdWVzSGVscGVyKG9iaiwga2V5LCBbXSk7XG5cdH07XG5cdGNvbnN0IF9mbkRlbGV0ZUR1cGxpY2F0ZVNlbWFudGljT2JqZWN0cyA9IGZ1bmN0aW9uIChhU2VtYW50aWNPYmplY3RQYXRoOiBzdHJpbmdbXSkge1xuXHRcdHJldHVybiBhU2VtYW50aWNPYmplY3RQYXRoLmZpbHRlcihmdW5jdGlvbiAodmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuXHRcdFx0cmV0dXJuIGFTZW1hbnRpY09iamVjdFBhdGguaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4O1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBvVmlldyA9IG9Db250cm9sbGVyLmdldFZpZXcoKTtcblx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblxuXHRpZiAob0ludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0c1Byb21pc2VzOiBQcm9taXNlPFNlbWFudGljT2JqZWN0RnJvbVBhdGg+W10gPSBbXTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRyb2xsZXIuZ2V0T3duZXJDb21wb25lbnQoKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG9Db21wb25lbnQpIGFzIEFwcENvbXBvbmVudDtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgb1BhZ2VNb2RlbCA9IChvQ29tcG9uZW50LmdldE1vZGVsKHNQYWdlTW9kZWwpIGFzIEpTT05Nb2RlbCkuZ2V0RGF0YSgpO1xuXHRcdGlmIChKU09OLnN0cmluZ2lmeShvUGFnZU1vZGVsKSA9PT0gXCJ7fVwiKSB7XG5cdFx0XHRvUGFnZU1vZGVsID0gKG9Db21wb25lbnQuZ2V0TW9kZWwoc1BhZ2VNb2RlbCkgYXMgdW5rbm93biBhcyBJbnRlcm5hbEpTT05Nb2RlbCkuX2dldE9iamVjdChcIi9cIiwgdW5kZWZpbmVkKTtcblx0XHR9XG5cdFx0bGV0IGFTZW1hbnRpY09iamVjdHNGb3VuZCA9IF9mbmZpbmRWYWx1ZXMob1BhZ2VNb2RlbCwgXCJzZW1hbnRpY09iamVjdFBhdGhcIik7XG5cdFx0YVNlbWFudGljT2JqZWN0c0ZvdW5kID0gX2ZuRGVsZXRlRHVwbGljYXRlU2VtYW50aWNPYmplY3RzKGFTZW1hbnRpY09iamVjdHNGb3VuZCk7XG5cdFx0Y29uc3Qgb1NoZWxsU2VydmljZUhlbHBlciA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdGxldCBzQ3VycmVudEhhc2ggPSBvU2hlbGxTZXJ2aWNlSGVscGVyLmdldEhhc2goKTtcblx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RzOiBTZW1hbnRpY09iamVjdFtdID0gW107XG5cdFx0bGV0IF9vU2VtYW50aWNPYmplY3Q7XG5cblx0XHRpZiAoc0N1cnJlbnRIYXNoICYmIHNDdXJyZW50SGFzaC5pbmNsdWRlcyhcIj9cIikpIHtcblx0XHRcdC8vIHNDdXJyZW50SGFzaCBjYW4gY29udGFpbiBxdWVyeSBzdHJpbmcsIGN1dCBpdCBvZmYhXG5cdFx0XHRzQ3VycmVudEhhc2ggPSBzQ3VycmVudEhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXHRcdH1cblxuXHRcdGZuUHJlcGFyZVNlbWFudGljT2JqZWN0c1Byb21pc2VzKG9NZXRhTW9kZWwsIGFTZW1hbnRpY09iamVjdHNGb3VuZCwgYVNlbWFudGljT2JqZWN0c1Byb21pc2VzKTtcblxuXHRcdGlmIChhU2VtYW50aWNPYmplY3RzUHJvbWlzZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFByb21pc2UuYWxsKGFTZW1hbnRpY09iamVjdHNQcm9taXNlcylcblx0XHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKGFWYWx1ZXMpIHtcblx0XHRcdFx0XHRjb25zdCBhR2V0TGlua3NQcm9taXNlcyA9IFtdO1xuXHRcdFx0XHRcdGxldCBzU2VtT2JqRXhwcmVzc2lvbjtcblx0XHRcdFx0XHR0eXBlIFNlbWFudGljT2JqZWN0UmVzb2x2ZWQgPSB7XG5cdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHN0cmluZztcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3M6IHsgc2VtYW50aWNPYmplY3Q6IHN0cmluZyB9O1xuXHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IHN0cmluZ1tdO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0c1Jlc29sdmVkOiBTZW1hbnRpY09iamVjdFJlc29sdmVkW10gPSBhVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudCkge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNlbWFudGljT2JqZWN0ICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCAmJlxuXHRcdFx0XHRcdFx0XHR0eXBlb2YgZWxlbWVudC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCA9PT0gXCJvYmplY3RcIlxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHNTZW1PYmpFeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24ocGF0aEluTW9kZWwoZWxlbWVudC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdC4kUGF0aCkpITtcblx0XHRcdFx0XHRcdFx0KGVsZW1lbnQgYXMgdW5rbm93biBhcyBTZW1hbnRpY09iamVjdFJlc29sdmVkKS5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCA9IHNTZW1PYmpFeHByZXNzaW9uO1xuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3NbMF0uc2VtYW50aWNPYmplY3QgPSBzU2VtT2JqRXhwcmVzc2lvbjtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnQuc2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSBhcyB1bmtub3duIGFzIFNlbWFudGljT2JqZWN0UmVzb2x2ZWRbXTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgYVNlbWFudGljT2JqZWN0c1Jlc29sdmVkKSB7XG5cdFx0XHRcdFx0XHRfb1NlbWFudGljT2JqZWN0ID0gaXRlbTtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0X29TZW1hbnRpY09iamVjdCAmJlxuXHRcdFx0XHRcdFx0XHRfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0ICYmXG5cdFx0XHRcdFx0XHRcdF9vU2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3QuaW5kZXhPZihcIntcIikgIT09IDBcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRhU2VtYW50aWNPYmplY3RzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRcdHVuYXZhaWxhYmxlQWN0aW9uczogX29TZW1hbnRpY09iamVjdC51bmF2YWlsYWJsZUFjdGlvbnMsXG5cdFx0XHRcdFx0XHRcdFx0cGF0aDogaXRlbS5zZW1hbnRpY09iamVjdFBhdGhcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGFHZXRMaW5rc1Byb21pc2VzLnB1c2gob1NoZWxsU2VydmljZUhlbHBlci5nZXRMaW5rc1dpdGhDYWNoZShbX29TZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdEZvckdldExpbmtzXSkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gQ29tbW9uVXRpbHMudXBkYXRlU2VtYW50aWNUYXJnZXRzKGFHZXRMaW5rc1Byb21pc2VzLCBhU2VtYW50aWNPYmplY3RzLCBvSW50ZXJuYWxNb2RlbENvbnRleHQsIHNDdXJyZW50SGFzaCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiZm5HZXRTZW1hbnRpY1RhcmdldHNGcm9tVGFibGU6IENhbm5vdCBnZXQgU2VtYW50aWMgT2JqZWN0c1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbihvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbj86IE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4pIHtcblx0Y29uc3QgbUFsbG93ZWRFeHByZXNzaW9uczogX0ZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IHt9O1xuXHRpZiAob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gJiYgb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0b0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcGVydHkpIHtcblx0XHRcdGlmIChvUHJvcGVydHkuUHJvcGVydHkgJiYgb1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRcdFx0aWYgKG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LiRQcm9wZXJ0eVBhdGhdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS4kUHJvcGVydHlQYXRoXS5wdXNoKG9Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LiRQcm9wZXJ0eVBhdGhdID0gW29Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnNdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIG1BbGxvd2VkRXhwcmVzc2lvbnM7XG59XG5mdW5jdGlvbiBnZXRGaWx0ZXJSZXN0cmljdGlvbnMoXG5cdG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uPzogTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPixcblx0c1Jlc3RyaWN0aW9uPzogXCJSZXF1aXJlZFByb3BlcnRpZXNcIiB8IFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIlxuKSB7XG5cdGxldCBhUHJvcHM6IHN0cmluZ1tdID0gW107XG5cdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbltzUmVzdHJpY3Rpb24gYXMga2V5b2YgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPl0pIHtcblx0XHRhUHJvcHMgPSAoXG5cdFx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbltzUmVzdHJpY3Rpb24gYXMga2V5b2YgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPl0gYXMgRXhwYW5kUGF0aFR5cGU8RWRtLlByb3BlcnR5UGF0aD5bXVxuXHRcdCkubWFwKGZ1bmN0aW9uIChvUHJvcGVydHk6IEV4cGFuZFBhdGhUeXBlPEVkbS5Qcm9wZXJ0eVBhdGg+KSB7XG5cdFx0XHRyZXR1cm4gb1Byb3BlcnR5LiRQcm9wZXJ0eVBhdGg7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGFQcm9wcztcbn1cblxuZnVuY3Rpb24gX2ZldGNoUHJvcGVydGllc0Zvck5hdlBhdGgocGF0aHM6IHN0cmluZ1tdLCBuYXZQYXRoOiBzdHJpbmcsIHByb3BzOiBzdHJpbmdbXSkge1xuXHRjb25zdCBuYXZQYXRoUHJlZml4ID0gbmF2UGF0aCArIFwiL1wiO1xuXHRyZXR1cm4gcGF0aHMucmVkdWNlKChvdXRQYXRoczogc3RyaW5nW10sIHBhdGhUb0NoZWNrOiBzdHJpbmcpID0+IHtcblx0XHRpZiAocGF0aFRvQ2hlY2suc3RhcnRzV2l0aChuYXZQYXRoUHJlZml4KSkge1xuXHRcdFx0Y29uc3Qgb3V0UGF0aCA9IHBhdGhUb0NoZWNrLnJlcGxhY2UobmF2UGF0aFByZWZpeCwgXCJcIik7XG5cdFx0XHRpZiAoIW91dFBhdGhzLmluY2x1ZGVzKG91dFBhdGgpKSB7XG5cdFx0XHRcdG91dFBhdGhzLnB1c2gob3V0UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRQYXRocztcblx0fSwgcHJvcHMpO1xufVxudHlwZSBfRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xudHlwZSBfRmlsdGVyUmVzdHJpY3Rpb25zID0ge1xuXHRSZXF1aXJlZFByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHROb25GaWx0ZXJhYmxlUHJvcGVydGllczogc3RyaW5nW107XG5cdEZpbHRlckFsbG93ZWRFeHByZXNzaW9uczogX0ZpbHRlckFsbG93ZWRFeHByZXNzaW9ucztcbn07XG5mdW5jdGlvbiBnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGgoZW50aXR5UGF0aDogc3RyaW5nLCBvQ29udGV4dDogT0RhdGFNZXRhTW9kZWwpIHtcblx0Y29uc3Qgb1JldDogX0ZpbHRlclJlc3RyaWN0aW9ucyA9IHtcblx0XHRSZXF1aXJlZFByb3BlcnRpZXM6IFtdLFxuXHRcdE5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBbXSxcblx0XHRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM6IHt9XG5cdH07XG5cdGxldCBvRmlsdGVyUmVzdHJpY3Rpb25zO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGV4dCA9IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0Y29uc3QgZnJUZXJtID0gXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnNcIjtcblx0Y29uc3QgZW50aXR5VHlwZVBhdGhQYXJ0cyA9IGVudGl0eVBhdGgucmVwbGFjZUFsbChcIiUyRlwiLCBcIi9cIikuc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZyk7XG5cdGNvbnN0IGVudGl0eVR5cGVQYXRoID0gYC8ke2VudGl0eVR5cGVQYXRoUGFydHMuam9pbihcIi9cIil9L2A7XG5cdGNvbnN0IGVudGl0eVNldFBhdGggPSBNb2RlbEhlbHBlci5nZXRFbnRpdHlTZXRQYXRoKGVudGl0eVBhdGgsIG9Db250ZXh0KTtcblx0Y29uc3QgZW50aXR5U2V0UGF0aFBhcnRzID0gZW50aXR5U2V0UGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0Y29uc3QgaXNDb250YWlubWVudCA9IG9Db250ZXh0LmdldE9iamVjdChgJHtlbnRpdHlUeXBlUGF0aH0kQ29udGFpbnNUYXJnZXRgKTtcblx0Y29uc3QgY29udGFpbm1lbnROYXZQYXRoID0gISFpc0NvbnRhaW5tZW50ICYmIGVudGl0eVR5cGVQYXRoUGFydHNbZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblxuXHQvL0xFQVNUIFBSSU9SSVRZIC0gRmlsdGVyIHJlc3RyaWN0aW9ucyBkaXJlY3RseSBhdCBFbnRpdHkgU2V0XG5cdC8vZS5nLiBGUiBpbiBcIk5TLkVudGl0eUNvbnRhaW5lci9TYWxlc09yZGVyTWFuYWdlXCIgQ29udGV4dFBhdGg6IC9TYWxlc09yZGVyTWFuYWdlXG5cdGlmICghaXNDb250YWlubWVudCkge1xuXHRcdG9GaWx0ZXJSZXN0cmljdGlvbnMgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH0ke2ZyVGVybX1gKSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+IHwgdW5kZWZpbmVkO1xuXHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9GaWx0ZXJSZXN0cmljdGlvbnMsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdGNvbnN0IHJlc3VsdENvbnRleHRDaGVjayA9IG9Db250ZXh0LmdldE9iamVjdChgJHtlbnRpdHlUeXBlUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKTtcblx0XHRpZiAoIXJlc3VsdENvbnRleHRDaGVjaykge1xuXHRcdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdH1cblx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBnZXRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbihvRmlsdGVyUmVzdHJpY3Rpb25zKSB8fCB7fTtcblx0fVxuXG5cdGlmIChlbnRpdHlUeXBlUGF0aFBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRjb25zdCBuYXZQYXRoID0gaXNDb250YWlubWVudCA/IChjb250YWlubWVudE5hdlBhdGggYXMgc3RyaW5nKSA6IGVudGl0eVNldFBhdGhQYXJ0c1tlbnRpdHlTZXRQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cdFx0Ly8gSW4gY2FzZSBvZiBjb250YWlubWVudCB3ZSB0YWtlIGVudGl0eVNldCBwcm92aWRlZCBhcyBwYXJlbnQuIEFuZCBpbiBjYXNlIG9mIG5vcm1hbCB3ZSB3b3VsZCByZW1vdmUgdGhlIGxhc3QgbmF2aWdhdGlvbiBmcm9tIGVudGl0eVNldFBhdGguXG5cdFx0Y29uc3QgcGFyZW50RW50aXR5U2V0UGF0aCA9IGlzQ29udGFpbm1lbnQgPyBlbnRpdHlTZXRQYXRoIDogYC8ke2VudGl0eVNldFBhdGhQYXJ0cy5zbGljZSgwLCAtMSkuam9pbihgLyR7bmF2aWdhdGlvblRleHR9L2ApfWA7XG5cdFx0Ly9USElSRCBISUdIRVNUIFBSSU9SSVRZIC0gUmVhZGluZyBwcm9wZXJ0eSBwYXRoIHJlc3RyaWN0aW9ucyAtIEFubm90YXRpb24gYXQgbWFpbiBlbnRpdHkgYnV0IGRpcmVjdGx5IG9uIG5hdmlnYXRpb24gcHJvcGVydHkgcGF0aFxuXHRcdC8vZS5nLiBQYXJlbnQgQ3VzdG9tZXIgd2l0aCBQcm9wZXJ0eVBhdGg9XCJTZXQvQ2l0eU5hbWVcIiBDb250ZXh0UGF0aDogQ3VzdG9tZXIvU2V0XG5cdFx0Y29uc3Qgb1BhcmVudFJldDogX0ZpbHRlclJlc3RyaWN0aW9ucyA9IHtcblx0XHRcdFJlcXVpcmVkUHJvcGVydGllczogW10sXG5cdFx0XHROb25GaWx0ZXJhYmxlUHJvcGVydGllczogW10sXG5cdFx0XHRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM6IHt9XG5cdFx0fTtcblx0XHRpZiAoIW5hdlBhdGguaW5jbHVkZXMoXCIlMkZcIikpIHtcblx0XHRcdGNvbnN0IG9QYXJlbnRGUiA9IG9Db250ZXh0LmdldE9iamVjdChgJHtwYXJlbnRFbnRpdHlTZXRQYXRofSR7ZnJUZXJtfWApIGFzIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4gfCB1bmRlZmluZWQ7XG5cdFx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyA9IF9mZXRjaFByb3BlcnRpZXNGb3JOYXZQYXRoKFxuXHRcdFx0XHRnZXRGaWx0ZXJSZXN0cmljdGlvbnMob1BhcmVudEZSLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXSxcblx0XHRcdFx0bmF2UGF0aCxcblx0XHRcdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMgfHwgW11cblx0XHRcdCk7XG5cdFx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gX2ZldGNoUHJvcGVydGllc0Zvck5hdlBhdGgoXG5cdFx0XHRcdGdldEZpbHRlclJlc3RyaWN0aW9ucyhvUGFyZW50RlIsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW10sXG5cdFx0XHRcdG5hdlBhdGgsXG5cdFx0XHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgfHwgW11cblx0XHRcdCk7XG5cdFx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0XHRjb25zdCBjb21wbGV0ZUFsbG93ZWRFeHBzID0gZ2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24ob1BhcmVudEZSKSB8fCB7fTtcblx0XHRcdG9QYXJlbnRSZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gT2JqZWN0LmtleXMoY29tcGxldGVBbGxvd2VkRXhwcykucmVkdWNlKFxuXHRcdFx0XHQob3V0UHJvcDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LCBwcm9wUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHByb3BQYXRoLnN0YXJ0c1dpdGgobmF2UGF0aCArIFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb3V0UHJvcFBhdGggPSBwcm9wUGF0aC5yZXBsYWNlKG5hdlBhdGggKyBcIi9cIiwgXCJcIik7XG5cdFx0XHRcdFx0XHRvdXRQcm9wW291dFByb3BQYXRoXSA9IGNvbXBsZXRlQWxsb3dlZEV4cHNbcHJvcFBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gb3V0UHJvcDtcblx0XHRcdFx0fSxcblx0XHRcdFx0e30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IG1lcmdlT2JqZWN0cyhcblx0XHRcdHt9LFxuXHRcdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgfHwge30sXG5cdFx0XHRvUGFyZW50UmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyB8fCB7fVxuXHRcdCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG5cdFx0Ly9TRUNPTkQgSElHSEVTVCBwcmlvcml0eSAtIE5hdmlnYXRpb24gcmVzdHJpY3Rpb25zXG5cdFx0Ly9lLmcuIFBhcmVudCBcIi9DdXN0b21lclwiIHdpdGggTmF2aWdhdGlvblByb3BlcnR5UGF0aD1cIlNldFwiIENvbnRleHRQYXRoOiBDdXN0b21lci9TZXRcblx0XHRjb25zdCBvTmF2UmVzdHJpY3Rpb25zID0gTWV0YU1vZGVsRnVuY3Rpb24uZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyhvQ29udGV4dCwgcGFyZW50RW50aXR5U2V0UGF0aCwgbmF2UGF0aC5yZXBsYWNlQWxsKFwiJTJGXCIsIFwiL1wiKSk7XG5cdFx0Y29uc3Qgb05hdkZpbHRlclJlc3QgPSBvTmF2UmVzdHJpY3Rpb25zICYmIChvTmF2UmVzdHJpY3Rpb25zW1wiRmlsdGVyUmVzdHJpY3Rpb25zXCJdIGFzIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4pO1xuXHRcdGNvbnN0IG5hdlJlc1JlcVByb3BzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9OYXZGaWx0ZXJSZXN0LCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyA9IHVuaXF1ZVNvcnQob1JldC5SZXF1aXJlZFByb3BlcnRpZXMuY29uY2F0KG5hdlJlc1JlcVByb3BzKSk7XG5cdFx0Y29uc3QgbmF2Tm9uRmlsdGVyUHJvcHMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdkZpbHRlclJlc3QsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW107XG5cdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IHVuaXF1ZVNvcnQob1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcy5jb25jYXQobmF2Tm9uRmlsdGVyUHJvcHMpKTtcblx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBtZXJnZU9iamVjdHMoXG5cdFx0XHR7fSxcblx0XHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zIHx8IHt9LFxuXHRcdFx0Z2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24ob05hdkZpbHRlclJlc3QpIHx8IHt9XG5cdFx0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG5cblx0XHQvL0hJR0hFU1QgcHJpb3JpdHkgLSBSZXN0cmljdGlvbnMgaGF2aW5nIHRhcmdldCB3aXRoIG5hdmlnYXRpb24gYXNzb2NpYXRpb24gZW50aXR5XG5cdFx0Ly8gZS5nLiBGUiBpbiBcIkN1c3RvbWVyUGFyYW1ldGVycy9TZXRcIiBDb250ZXh0UGF0aDogXCJDdXN0b21lci9TZXRcIlxuXHRcdGNvbnN0IG5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCA9IG9Db250ZXh0LmdldE9iamVjdChcblx0XHRcdGAvJHtlbnRpdHlUeXBlUGF0aFBhcnRzLmpvaW4oXCIvXCIpfSR7ZnJUZXJtfWBcblx0XHQpIGFzIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT47XG5cdFx0Y29uc3QgbmF2QXNzb2NSZXFQcm9wcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhuYXZBc3NvY2lhdGlvbkVudGl0eVJlc3QsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzID0gdW5pcXVlU29ydChvUmV0LlJlcXVpcmVkUHJvcGVydGllcy5jb25jYXQobmF2QXNzb2NSZXFQcm9wcykpO1xuXHRcdGNvbnN0IG5hdkFzc29jTm9uRmlsdGVyUHJvcHMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMobmF2QXNzb2NpYXRpb25FbnRpdHlSZXN0LCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSB1bmlxdWVTb3J0KG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuY29uY2F0KG5hdkFzc29jTm9uRmlsdGVyUHJvcHMpKTtcblx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBtZXJnZU9iamVjdHMoXG5cdFx0XHR7fSxcblx0XHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zLFxuXHRcdFx0Z2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24obmF2QXNzb2NpYXRpb25FbnRpdHlSZXN0KSB8fCB7fVxuXHRcdCkgYXMgX0ZpbHRlckFsbG93ZWRFeHByZXNzaW9ucztcblx0fVxuXHRyZXR1cm4gb1JldDtcbn1cblxudHlwZSBQcmVwcm9jZXNzb3JTZXR0aW5ncyA9IHtcblx0YXBwQ29tcG9uZW50PzogQXBwQ29tcG9uZW50O1xuXHRiaW5kaW5nQ29udGV4dHM6IG9iamVjdDtcblx0bW9kZWxzOiBvYmplY3Q7XG59O1xuZXhwb3J0IHR5cGUgQmFzZVRyZWVNb2RpZmllciA9IHtcblx0dGVtcGxhdGVDb250cm9sRnJhZ21lbnQoXG5cdFx0c0ZyYWdtZW50TmFtZTogc3RyaW5nLFxuXHRcdG1QcmVwcm9jZXNzb3JTZXR0aW5nczogUHJlcHJvY2Vzc29yU2V0dGluZ3MsXG5cdFx0b1ZpZXc/OiBWaWV3XG5cdCk6IFByb21pc2U8VUk1RWxlbWVudFtdIHwgRWxlbWVudFtdPjtcblx0dGFyZ2V0czogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gdGVtcGxhdGVDb250cm9sRnJhZ21lbnQoXG5cdHNGcmFnbWVudE5hbWU6IHN0cmluZyxcblx0b1ByZXByb2Nlc3NvclNldHRpbmdzOiBQcmVwcm9jZXNzb3JTZXR0aW5ncyxcblx0b09wdGlvbnM6IHsgdmlldz86IFZpZXc7IGlzWE1MPzogYm9vbGVhbjsgaWQ6IHN0cmluZzsgY29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIgfCBFeHRlbnNpb25BUEk7IGNvbnRhaW5pbmdWaWV3PzogVmlldyB9LFxuXHRvTW9kaWZpZXI/OiBCYXNlVHJlZU1vZGlmaWVyXG4pOiBQcm9taXNlPEVsZW1lbnQgfCBVSTVFbGVtZW50IHwgRWxlbWVudFtdIHwgVUk1RWxlbWVudFtdPiB7XG5cdG9PcHRpb25zID0gb09wdGlvbnMgfHwge307XG5cdGlmIChvTW9kaWZpZXIpIHtcblx0XHRyZXR1cm4gb01vZGlmaWVyLnRlbXBsYXRlQ29udHJvbEZyYWdtZW50KHNGcmFnbWVudE5hbWUsIG9QcmVwcm9jZXNzb3JTZXR0aW5ncywgb09wdGlvbnMudmlldykudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50KSB7XG5cdFx0XHQvLyBUaGlzIGlzIHJlcXVpcmVkIGFzIEZsZXggcmV0dXJucyBhbiBIVE1MQ29sbGVjdGlvbiBhcyB0ZW1wbGF0aW5nIHJlc3VsdCBpbiBYTUwgdGltZS5cblx0XHRcdHJldHVybiBvTW9kaWZpZXIudGFyZ2V0cyA9PT0gXCJ4bWxUcmVlXCIgJiYgb0ZyYWdtZW50Lmxlbmd0aCA+IDAgPyBvRnJhZ21lbnRbMF0gOiBvRnJhZ21lbnQ7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3Qgb0ZyYWdtZW50ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKSxcblx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzXG5cdFx0KTtcblx0XHRjb25zdCBvQ29udHJvbCA9IG9GcmFnbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRpZiAoISFvT3B0aW9ucy5pc1hNTCAmJiBvQ29udHJvbCkge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sO1xuXHRcdH1cblx0XHRsZXQgb3duZXI6IHsgcnVuQXNPd25lcjogPFQ+KGZuOiAoKSA9PiBUKSA9PiBUIH0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MuYXBwQ29tcG9uZW50ID8/IHsgcnVuQXNPd25lcjogKGZuKSA9PiBmbigpIH07XG5cdFx0aWYgKG9PcHRpb25zLmNvbnRhaW5pbmdWaWV3KSB7XG5cdFx0XHRjb25zdCB2aWV3T3duZXIgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3Iob09wdGlvbnMuY29udGFpbmluZ1ZpZXcpO1xuXHRcdFx0aWYgKHZpZXdPd25lcikge1xuXHRcdFx0XHRvd25lciA9IHZpZXdPd25lcjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG93bmVyLnJ1bkFzT3duZXIoYXN5bmMgKCkgPT4ge1xuXHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoe1xuXHRcdFx0XHRpZDogb09wdGlvbnMuaWQsXG5cdFx0XHRcdGRlZmluaXRpb246IG9GcmFnbWVudCBhcyB1bmtub3duIGFzIHN0cmluZyxcblx0XHRcdFx0Y29udHJvbGxlcjogb09wdGlvbnMuY29udHJvbGxlclxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0U2luZ2xldG9uUGF0aChwYXRoOiBzdHJpbmcsIG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKSxcblx0XHRwcm9wZXJ0eU5hbWUgPSBwYXJ0cy5wb3AoKSEsXG5cdFx0bmF2aWdhdGlvblBhdGggPSBwYXJ0cy5qb2luKFwiL1wiKSxcblx0XHRlbnRpdHlTZXQgPSBuYXZpZ2F0aW9uUGF0aCAmJiBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtuYXZpZ2F0aW9uUGF0aH1gKTtcblx0aWYgKGVudGl0eVNldD8uJGtpbmQgPT09IFwiU2luZ2xldG9uXCIpIHtcblx0XHRjb25zdCBzaW5nbGV0b25OYW1lID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG5cdFx0cmV0dXJuIGAvJHtzaW5nbGV0b25OYW1lfS8ke3Byb3BlcnR5TmFtZX1gO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eShwYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdGlmICghcGF0aCB8fCAhbW9kZWwpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHR9XG5cdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHQvLyBGaW5kIHRoZSB1bmRlcmx5aW5nIGVudGl0eSBzZXQgZnJvbSB0aGUgcHJvcGVydHkgcGF0aCBhbmQgY2hlY2sgd2hldGhlciBpdCBpcyBhIHNpbmdsZXRvbi5cblx0Y29uc3QgcmVzb2x2ZWRQYXRoID0gZ2V0U2luZ2xldG9uUGF0aChwYXRoLCBtZXRhTW9kZWwpO1xuXHRpZiAocmVzb2x2ZWRQYXRoKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlCaW5kaW5nID0gbW9kZWwuYmluZFByb3BlcnR5KHJlc29sdmVkUGF0aCk7XG5cdFx0cmV0dXJuIHByb3BlcnR5QmluZGluZy5yZXF1ZXN0VmFsdWUoKTtcblx0fVxuXG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG59XG5cbi8vIEdldCB0aGUgcGF0aCBmb3IgYWN0aW9uIHBhcmFtZXRlcnMgdGhhdCBpcyBuZWVkZWQgdG8gcmVhZCB0aGUgYW5ub3RhdGlvbnNcbmZ1bmN0aW9uIGdldFBhcmFtZXRlclBhdGgoc1BhdGg6IHN0cmluZywgc1BhcmFtZXRlcjogc3RyaW5nKSB7XG5cdGxldCBzQ29udGV4dDtcblx0aWYgKHNQYXRoLmluY2x1ZGVzKFwiQCR1aTUub3ZlcmxvYWRcIikpIHtcblx0XHRzQ29udGV4dCA9IHNQYXRoLnNwbGl0KFwiQCR1aTUub3ZlcmxvYWRcIilbMF07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gRm9yIFVuYm91bmQgQWN0aW9ucyBpbiBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ3Ncblx0XHRjb25zdCBhQWN0aW9uID0gc1BhdGguc3BsaXQoXCIvMFwiKVswXS5zcGxpdChcIi5cIik7XG5cdFx0c0NvbnRleHQgPSBgLyR7YUFjdGlvblthQWN0aW9uLmxlbmd0aCAtIDFdfS9gO1xuXHR9XG5cdHJldHVybiBzQ29udGV4dCArIHNQYXJhbWV0ZXI7XG59XG5cbi8qKlxuICogR2V0IHJlc29sdmVkIGV4cHJlc3Npb24gYmluZGluZyB1c2VkIGZvciB0ZXh0cyBhdCBydW50aW1lLlxuICpcbiAqIEBwYXJhbSBleHBCaW5kaW5nXG4gKiBAcGFyYW0gY29udHJvbFxuICogQHJldHVybnMgQSBzdHJpbmcgYWZ0ZXIgcmVzb2x1dGlvbi5cbiAqL1xuZnVuY3Rpb24gX2ZudHJhbnNsYXRlZFRleHRGcm9tRXhwQmluZGluZ1N0cmluZyhleHBCaW5kaW5nOiBzdHJpbmcsIGNvbnRyb2w6IENvbnRyb2wpOiBzdHJpbmcge1xuXHQvLyBUaGUgaWRlYSBoZXJlIGlzIHRvIGNyZWF0ZSBkdW1teSBlbGVtZW50IHdpdGggdGhlIGV4cHJlc2lvbiBiaW5kaW5nLlxuXHQvLyBBZGRpbmcgaXQgYXMgZGVwZW5kZW50IHRvIHRoZSB2aWV3L2NvbnRyb2wgd291bGQgcHJvcGFnYXRlIGFsbCB0aGUgbW9kZWxzIHRvIHRoZSBkdW1teSBlbGVtZW50IGFuZCByZXNvbHZlIHRoZSBiaW5kaW5nLlxuXHQvLyBXZSByZW1vdmUgdGhlIGR1bW15IGVsZW1lbnQgYWZ0ZXIgdGhhdCBhbmQgZGVzdHJveSBpdC5cblxuXHRjb25zdCBhbnlSZXNvdXJjZVRleHQgPSBuZXcgQW55RWxlbWVudCh7IGFueVRleHQ6IGV4cEJpbmRpbmcgfSk7XG5cdGNvbnRyb2wuYWRkRGVwZW5kZW50KGFueVJlc291cmNlVGV4dCk7XG5cdGNvbnN0IHJlc3VsdFRleHQgPSBhbnlSZXNvdXJjZVRleHQuZ2V0QW55VGV4dCgpO1xuXHRjb250cm9sLnJlbW92ZURlcGVuZGVudChhbnlSZXNvdXJjZVRleHQpO1xuXHRhbnlSZXNvdXJjZVRleHQuZGVzdHJveSgpO1xuXG5cdHJldHVybiByZXN1bHRUZXh0O1xufVxuLyoqXG4gKiBDaGVjayBpZiB0aGUgY3VycmVudCBkZXZpY2UgaGFzIGEgc21hbGwgc2NyZWVuLlxuICpcbiAqIEByZXR1cm5zIEEgQm9vbGVhbi5cbiAqL1xuZnVuY3Rpb24gaXNTbWFsbERldmljZSgpIHtcblx0cmV0dXJuICFEZXZpY2Uuc3lzdGVtLmRlc2t0b3AgfHwgRGV2aWNlLnJlc2l6ZS53aWR0aCA8PSAzMjA7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgU2VsZWN0aW9uVmFyaWFudCBvciBTZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50IGFubm90YXRpb24gYW5kIGNyZWF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgZmlsdGVycy5cbiAqXG4gKiBAcGFyYW0gY29udHJvbCBNREMgQ2hhcnQsIE1EQyBUYWJsZSBvciBNdWx0aVZpZXcgY29udHJvbCBvbiB3aGljaCB0aGUgZmlsdGVycyBhcmUgYXBwbGllZFxuICogQHBhcmFtIGFubm90YXRpb25QYXRoIFNlbGVjdGlvblZhcmlhbnQgb3IgU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcmV0dXJucyBSZXR1cm5zIGFuIGFycmF5IG9mIGZpbHRlcnMuXG4gKi9cbmZ1bmN0aW9uIGdldEZpbHRlcnNGcm9tQW5ub3RhdGlvbihjb250cm9sOiBDb250cm9sIHwgTURDQ2hhcnQgfCBNRENUYWJsZSwgYW5ub3RhdGlvblBhdGg6IHN0cmluZyk6IEZpbHRlcltdIHtcblx0Y29uc3QgbWV0YU1vZGVsID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KGNvbnRyb2wgYXMgQ29udHJvbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdGNvbnN0IHN2Q29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChgJHtjb250cm9sLmRhdGEoXCJlbnRpdHlUeXBlXCIpfSR7YW5ub3RhdGlvblBhdGh9YCk7XG5cdGNvbnN0IHByb3BlcnR5RmlsdGVyczogUmVjb3JkPHN0cmluZywgRmlsdGVyW10+ID0ge307XG5cdGxldCBhbm5vdGF0aW9uID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhzdkNvbnRleHQpLnRhcmdldE9iamVjdDtcblxuXHRpZiAoaXNTZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50KGFubm90YXRpb24pKSB7XG5cdFx0YW5ub3RhdGlvbiA9IGFubm90YXRpb24uU2VsZWN0aW9uVmFyaWFudDtcblx0fVxuXG5cdGlmICghYW5ub3RhdGlvbiB8fCAhaXNTZWxlY3Rpb25WYXJpYW50KGFubm90YXRpb24pKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0KGFubm90YXRpb24uU2VsZWN0T3B0aW9ucyB8fCBbXSkuZm9yRWFjaCgoc2VsZWN0T3B0aW9uKSA9PiB7XG5cdFx0aWYgKHNlbGVjdE9wdGlvbi5Qcm9wZXJ0eU5hbWU/LiR0YXJnZXQgJiYgc2VsZWN0T3B0aW9uLlJhbmdlcz8ubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlUeXBlID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZS4kdGFyZ2V0LnR5cGU7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0Zm9yIChjb25zdCBqIGluIHNlbGVjdE9wdGlvbi5SYW5nZXMpIHtcblx0XHRcdFx0Y29uc3QgcmFuZ2UgPSBnZXRSYW5nZURlZmluaXRpb24oc2VsZWN0T3B0aW9uLlJhbmdlc1tqXSwgcHJvcGVydHlUeXBlKTtcblx0XHRcdFx0cHJvcGVydHlGaWx0ZXJzW3Byb3BlcnR5UGF0aF0gPSAocHJvcGVydHlGaWx0ZXJzW3Byb3BlcnR5UGF0aF0gPz8gW10pLmNvbmNhdChcblx0XHRcdFx0XHRuZXcgRmlsdGVyKHByb3BlcnR5UGF0aCwgcmFuZ2Uub3BlcmF0b3IgYXMgRmlsdGVyT3BlcmF0b3IsIHJhbmdlLnJhbmdlTG93LCByYW5nZS5yYW5nZUhpZ2gpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBmaWx0ZXJzID0gW107XG5cdGZvciAoY29uc3QgcGF0aCBpbiBwcm9wZXJ0eUZpbHRlcnMpIHtcblx0XHRmaWx0ZXJzLnB1c2goXG5cdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0ZmlsdGVyczogcHJvcGVydHlGaWx0ZXJzW3BhdGhdLFxuXHRcdFx0XHRhbmQ6IGZhbHNlXG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIGZpbHRlcnM7XG59XG5cbmZ1bmN0aW9uIGdldENvbnZlcnRlckNvbnRleHRGb3JQYXRoKHNNZXRhUGF0aDogc3RyaW5nLCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgc0VudGl0eVNldDogc3RyaW5nLCBvRGlhZ25vc3RpY3M6IERpYWdub3N0aWNzKSB7XG5cdGNvbnN0IG9Db250ZXh0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzTWV0YVBhdGgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRyZXR1cm4gQ29udmVydGVyQ29udGV4dD8uY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvKHNFbnRpdHlTZXQsIG9Db250ZXh0IHx8IG9NZXRhTW9kZWwsIG9EaWFnbm9zdGljcywgbWVyZ2VPYmplY3RzLCB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhlIERyYWZ0Um9vdCBwYXRoLlxuICogSWYgYSB2aWV3IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgZHJhZnQgUm9vdCBQYXRoLCB0aGlzIG1ldGhvZCByZXR1cm5zIGl0cyBiaW5kaW5nQ29udGV4dC5cbiAqIFdoZXJlIG5vIHZpZXcgaXMgZm91bmQgYSBuZXcgY3JlYXRlZCBjb250ZXh0IGlzIHJldHVybmVkLlxuICogVGhlIG5ldyBjcmVhdGVkIGNvbnRleHQgcmVxdWVzdCB0aGUga2V5IG9mIHRoZSBlbnRpdHkgaW4gb3JkZXIgdG8gZ2V0IHRoZSBFdGFnIG9mIHRoaXMgZW50aXR5LlxuICpcbiAqIEBwYXJhbSBwcm9ncmFtbWluZ01vZGVsXG4gKiBAcGFyYW0gdmlld1xuICogQHBhcmFtIGFwcENvbXBvbmVudFxuICogQHJldHVybnMgUmV0dXJucyBhIFByb21pc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUm9vdENvbnRleHQocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLCB2aWV3OiBWaWV3LCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRjb25zdCBjb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRpZiAoY29udGV4dCkge1xuXHRcdGNvbnN0IHJvb3RDb250ZXh0UGF0aCA9XG5cdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBcIkRyYWZ0XCIgPyBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKGNvbnRleHQpIDogTW9kZWxIZWxwZXIuZ2V0U3RpY2t5Um9vdFBhdGgoY29udGV4dCk7XG5cdFx0bGV0IHNpbXBsZVJvb3RDb250ZXh0OiBPRGF0YVY0Q29udGV4dDtcblx0XHRpZiAocm9vdENvbnRleHRQYXRoKSB7XG5cdFx0XHQvLyBDaGVjayBpZiBhIHZpZXcgbWF0Y2hlcyB3aXRoIHRoZSBkcmFmdCByb290IHBhdGhcblx0XHRcdGNvbnN0IGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UgPSBhcHBDb21wb25lbnRcblx0XHRcdFx0LmdldFJvb3RWaWV3Q29udHJvbGxlcigpXG5cdFx0XHRcdC5nZXRJbnN0YW5jZWRWaWV3cygpXG5cdFx0XHRcdC5maW5kKChwYWdlVmlldzogVmlldykgPT4gcGFnZVZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpID09PSByb290Q29udGV4dFBhdGgpXG5cdFx0XHRcdD8uZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0aWYgKGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UpIHtcblx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2U7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRcdHNpbXBsZVJvb3RDb250ZXh0ID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zaW1wbGVSb290Q29udGV4dFwiKTtcblx0XHRcdGlmIChzaW1wbGVSb290Q29udGV4dD8uZ2V0UGF0aCgpID09PSByb290Q29udGV4dFBhdGgpIHtcblx0XHRcdFx0cmV0dXJuIHNpbXBsZVJvb3RDb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRzaW1wbGVSb290Q29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KHJvb3RDb250ZXh0UGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRhd2FpdCBDb21tb25VdGlscy53YWl0Rm9yQ29udGV4dFJlcXVlc3RlZChzaW1wbGVSb290Q29udGV4dCk7XG5cdFx0XHQvLyBTdG9yZSB0aGlzIG5ldyBjcmVhdGVkIGNvbnRleHQgdG8gdXNlIGl0IG9uIHRoZSBuZXh0IGl0ZXJhdGlvbnNcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2ltcGxlUm9vdENvbnRleHRcIiwgc2ltcGxlUm9vdENvbnRleHQpO1xuXHRcdFx0cmV0dXJuIHNpbXBsZVJvb3RDb250ZXh0O1xuXHRcdH1cblx0fVxufVxuXG5jb25zdCBDb21tb25VdGlscyA9IHtcblx0ZmlyZUJ1dHRvblByZXNzOiBmbkZpcmVCdXR0b25QcmVzcyxcblx0Z2V0VGFyZ2V0VmlldzogZ2V0VGFyZ2V0Vmlldyxcblx0Z2V0Q3VycmVudFBhZ2VWaWV3OiBnZXRDdXJyZW50UGFnZVZpZXcsXG5cdGhhc1RyYW5zaWVudENvbnRleHQ6IGZuSGFzVHJhbnNpZW50Q29udGV4dHMsXG5cdHVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlsczogZm5VcGRhdGVSZWxhdGVkQXBwc0RldGFpbHMsXG5cdGdldEFwcENvbXBvbmVudDogZ2V0QXBwQ29tcG9uZW50LFxuXHRnZXRDb250ZXh0UGF0aFByb3BlcnRpZXM6IGZuR2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzLFxuXHRnZXRQYXJhbWV0ZXJJbmZvOiBnZXRQYXJhbWV0ZXJJbmZvLFxuXHR1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eTogZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSxcblx0Z2V0RW50aXR5U2V0TmFtZTogZ2V0RW50aXR5U2V0TmFtZSxcblx0Z2V0QWN0aW9uUGF0aDogZ2V0QWN0aW9uUGF0aCxcblx0Y29tcHV0ZURpc3BsYXlNb2RlOiBjb21wdXRlRGlzcGxheU1vZGUsXG5cdGlzU3RpY2t5RWRpdE1vZGU6IGlzU3RpY2t5RWRpdE1vZGUsXG5cdGdldE9wZXJhdG9yc0ZvclByb3BlcnR5OiBnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eSxcblx0Z2V0T3BlcmF0b3JzRm9yRGF0ZVByb3BlcnR5OiBnZXRPcGVyYXRvcnNGb3JEYXRlUHJvcGVydHksXG5cdGdldE9wZXJhdG9yc0Zvckd1aWRQcm9wZXJ0eTogZ2V0T3BlcmF0b3JzRm9yR3VpZFByb3BlcnR5LFxuXHRhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudDogYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQsXG5cdHNldFVzZXJEZWZhdWx0czogc2V0VXNlckRlZmF1bHRzLFxuXHRnZXRJQk5BY3Rpb25zOiBmbkdldElCTkFjdGlvbnMsXG5cdGdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbjogZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uLFxuXHRnZXRTZW1hbnRpY09iamVjdE1hcHBpbmc6IGdldFNlbWFudGljT2JqZWN0TWFwcGluZyxcblx0c2V0U2VtYW50aWNPYmplY3RNYXBwaW5nczogc2V0U2VtYW50aWNPYmplY3RNYXBwaW5ncyxcblx0Z2V0U2VtYW50aWNPYmplY3RQcm9taXNlOiBmbkdldFNlbWFudGljT2JqZWN0UHJvbWlzZSxcblx0Z2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbDogZm5HZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsLFxuXHRnZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aDogZm5HZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCxcblx0dXBkYXRlU2VtYW50aWNUYXJnZXRzOiBmblVwZGF0ZVNlbWFudGljVGFyZ2V0c01vZGVsLFxuXHR3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZDogd2FpdEZvckNvbnRleHRSZXF1ZXN0ZWQsXG5cdGdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aDogZ2V0RmlsdGVyUmVzdHJpY3Rpb25zQnlQYXRoLFxuXHRnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uOiBnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uLFxuXHRnZXRBZGRpdGlvbmFsUGFyYW1zRm9yQ3JlYXRlOiBnZXRBZGRpdGlvbmFsUGFyYW1zRm9yQ3JlYXRlLFxuXHRyZXF1ZXN0U2luZ2xldG9uUHJvcGVydHk6IHJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eSxcblx0dGVtcGxhdGVDb250cm9sRnJhZ21lbnQ6IHRlbXBsYXRlQ29udHJvbEZyYWdtZW50LFxuXHRGaWx0ZXJSZXN0cmljdGlvbnM6IHtcblx0XHRSRVFVSVJFRF9QUk9QRVJUSUVTOiBcIlJlcXVpcmVkUHJvcGVydGllc1wiLFxuXHRcdE5PTl9GSUxURVJBQkxFX1BST1BFUlRJRVM6IFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIixcblx0XHRBTExPV0VEX0VYUFJFU1NJT05TOiBcIkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1wiXG5cdH0sXG5cdEFsbG93ZWRFeHByZXNzaW9uc1ByaW86IFtcIlNpbmdsZVZhbHVlXCIsIFwiTXVsdGlWYWx1ZVwiLCBcIlNpbmdsZVJhbmdlXCIsIFwiTXVsdGlSYW5nZVwiLCBcIlNlYXJjaEV4cHJlc3Npb25cIiwgXCJNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXCJdLFxuXHRub3JtYWxpemVTZWFyY2hUZXJtOiBub3JtYWxpemVTZWFyY2hUZXJtLFxuXHRzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGU6IHNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZSxcblx0c2V0RHluYW1pY0FjdGlvbkNvbnRleHRzOiBzZXREeW5hbWljQWN0aW9uQ29udGV4dHMsXG5cdHJlcXVlc3RQcm9wZXJ0eTogcmVxdWVzdFByb3BlcnR5LFxuXHRnZXRQYXJhbWV0ZXJQYXRoOiBnZXRQYXJhbWV0ZXJQYXRoLFxuXHRnZXRSZWxhdGVkQXBwc01lbnVJdGVtczogX2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zLFxuXHRnZXRUcmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nOiBfZm50cmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nLFxuXHR1cGRhdGVSZWxhdGVBcHBzTW9kZWw6IHVwZGF0ZVJlbGF0ZUFwcHNNb2RlbCxcblx0Z2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9uczogX2dldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMsXG5cdGdldEZpbHRlcnNGcm9tQW5ub3RhdGlvbjogZ2V0RmlsdGVyc0Zyb21Bbm5vdGF0aW9uLFxuXHRjcmVhdGVSb290Q29udGV4dDogY3JlYXRlUm9vdENvbnRleHQsXG5cdGlzU21hbGxEZXZpY2UsXG5cdGdldENvbnZlcnRlckNvbnRleHRGb3JQYXRoXG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb21tb25VdGlscztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7RUEwRUEsU0FBU0EsbUJBQW1CLENBQUNDLFdBQW1CLEVBQUU7SUFDakQsSUFBSSxDQUFDQSxXQUFXLEVBQUU7TUFDakIsT0FBT0MsU0FBUztJQUNqQjtJQUVBLE9BQU9ELFdBQVcsQ0FDaEJFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQ2xCQSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQUEsQ0FDdkJDLEtBQUssQ0FBQyxLQUFLLENBQUMs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
|
|
1227
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemVTZWFyY2hUZXJtIiwic1NlYXJjaFRlcm0iLCJ1bmRlZmluZWQiLCJyZXBsYWNlIiwic3BsaXQiLCJyZWR1Y2UiLCJzTm9ybWFsaXplZCIsInNDdXJyZW50V29yZCIsIndhaXRGb3JDb250ZXh0UmVxdWVzdGVkIiwiYmluZGluZ0NvbnRleHQiLCJtb2RlbCIsImdldE1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZW50aXR5UGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImRhdGFNb2RlbCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldENvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJ0YXJnZXRFbnRpdHlUeXBlIiwia2V5cyIsIm5hbWUiLCJmbkhhc1RyYW5zaWVudENvbnRleHRzIiwib0xpc3RCaW5kaW5nIiwiYkhhc1RyYW5zaWVudENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZm9yRWFjaCIsIm9Db250ZXh0IiwiaXNUcmFuc2llbnQiLCJfZ2V0U09JbnRlbnRzIiwib1NoZWxsU2VydmljZUhlbHBlciIsIm9PYmplY3RQYWdlTGF5b3V0Iiwib1NlbWFudGljT2JqZWN0Iiwib1BhcmFtIiwiZ2V0TGlua3MiLCJzZW1hbnRpY09iamVjdCIsInBhcmFtcyIsIl9jcmVhdGVNYXBwaW5ncyIsIm9NYXBwaW5nIiwiYVNPTWFwcGluZ3MiLCJhTWFwcGluZ0tleXMiLCJPYmplY3QiLCJvU2VtYW50aWNNYXBwaW5nIiwiZWxlbWVudCIsIkxvY2FsUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiU2VtYW50aWNPYmplY3RQcm9wZXJ0eSIsInB1c2giLCJfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMiLCJsaW5rR3JvdXAiLCJhRXhjbHVkZWRBY3Rpb25zIiwib1RhcmdldFBhcmFtcyIsImFJdGVtcyIsImFBbGxvd2VkQWN0aW9ucyIsImxpbmtzIiwib0xpbmsiLCJzSW50ZW50IiwiaW50ZW50Iiwic0FjdGlvbiIsImluY2x1ZGVzIiwidGV4dCIsInRhcmdldFNlbU9iamVjdCIsInRhcmdldEFjdGlvbiIsInRhcmdldFBhcmFtcyIsIl9nZXRSZWxhdGVkSW50ZW50cyIsIm9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzIiwib0JpbmRpbmdDb250ZXh0IiwiYU1hbmlmZXN0U09JdGVtcyIsImFMaW5rcyIsImxlbmd0aCIsImFsbG93ZWRBY3Rpb25zIiwidW5hdmFpbGFibGVBY3Rpb25zIiwibWFwcGluZyIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIl9nZXRSZWxhdGVkSW50ZW50c1dpdGhTZW1hbnRpY09iamVjdHNBbmRBY3Rpb24iLCJzZW1hbnRpY09iamVjdEFuZEFjdGlvbiIsImFwcENvbXBvbmVudFNPSXRlbXMiLCJhY3Rpb25zIiwiYWN0aW9uIiwiZXhjbHVkZWRBY3Rpb25zIiwic29NYXBwaW5ncyIsInVwZGF0ZVJlbGF0ZUFwcHNNb2RlbCIsIm9FbnRyeSIsImFTZW1LZXlzIiwib01ldGFNb2RlbCIsIm9NZXRhUGF0aCIsImFwcENvbXBvbmVudCIsImdldFNoZWxsU2VydmljZXMiLCJzQ3VycmVudFNlbU9iaiIsInNDdXJyZW50QWN0aW9uIiwib1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMiLCJhUmVsYXRlZEFwcHNNZW51SXRlbXMiLCJhTWFuaWZlc3RTT0tleXMiLCJmbkdldFBhcnNlU2hlbGxIYXNoQW5kR2V0TGlua3MiLCJvUGFyc2VkVXJsIiwicGFyc2VTaGVsbEhhc2giLCJkb2N1bWVudCIsImxvY2F0aW9uIiwiaGFzaCIsInNTZW1LZXkiLCJ2YWx1ZSIsImFUZWNobmljYWxLZXlzIiwiZ2V0T2JqZWN0Iiwia2V5Iiwic09iaktleSIsIm9NYW5pZmVzdERhdGEiLCJnZXRUYXJnZXRWaWV3IiwiZ2V0Vmlld0RhdGEiLCJzZW1hbnRpY09iamVjdEludGVudHMiLCJhZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjb21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsImZlRW52aXJvbm1lbnQiLCJnZXRJbnRlbnQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiaXNTZW1hbnRpY09iamVjdEhhc1NhbWVUYXJnZXRJbk1hbmlmZXN0IiwiYUFubm90YXRpb25zU09JdGVtcyIsInNFbnRpdHlTZXRQYXRoIiwic0VudGl0eVR5cGVQYXRoIiwib0VudGl0eVNldEFubm90YXRpb25zIiwiQ29tbW9uVXRpbHMiLCJnZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zIiwiYkhhc0VudGl0eVNldFNPIiwib0VudGl0eVR5cGVBbm5vdGF0aW9ucyIsImFVbmF2YWlsYWJsZUFjdGlvbnMiLCJhTWFwcGluZ3MiLCJzb0l0ZW1zIiwiY29uY2F0Iiwic2V0UHJvcGVydHkiLCJlcnJvciIsIkxvZyIsIl9nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zIiwib0VudGl0eUFubm90YXRpb25zIiwic0Fubm90YXRpb25NYXBwaW5nVGVybSIsInNBbm5vdGF0aW9uQWN0aW9uVGVybSIsInNRdWFsaWZpZXIiLCJmblVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsInBhdGgiLCJzU2VtYW50aWNLZXlWb2NhYnVsYXJ5IiwicmVxdWVzdE9iamVjdCIsInRoZW4iLCJyZXF1ZXN0ZWRPYmplY3QiLCJjYXRjaCIsIm9FcnJvciIsImZuRmlyZUJ1dHRvblByZXNzIiwib0J1dHRvbiIsImlzQSIsImdldFZpc2libGUiLCJnZXRFbmFibGVkIiwiZmlyZVByZXNzIiwiZ2V0QXBwQ29tcG9uZW50Iiwib0NvbnRyb2wiLCJvT3duZXIiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIkVycm9yIiwiZ2V0Q3VycmVudFBhZ2VWaWV3Iiwib0FwcENvbXBvbmVudCIsInJvb3RWaWV3Q29udHJvbGxlciIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdFZpZXciLCJnZXRSb290Q29udGFpbmVyIiwiZ2V0Q3VycmVudFBhZ2UiLCJvQ29tcG9uZW50IiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJnZXRSb290Q29udHJvbCIsImdldFBhcmVudCIsIl9mbkNoZWNrSXNNYXRjaCIsIm9PYmplY3QiLCJvS2V5c1RvQ2hlY2siLCJzS2V5IiwiZm5HZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCJtZXRhTW9kZWxDb250ZXh0Iiwic0NvbnRleHRQYXRoIiwib0ZpbHRlciIsIm9FbnRpdHlUeXBlIiwib1Byb3BlcnRpZXMiLCJoYXNPd25Qcm9wZXJ0eSIsInRlc3QiLCIka2luZCIsImZuR2V0SUJOQWN0aW9ucyIsImFJQk5BY3Rpb25zIiwiYUFjdGlvbnMiLCJnZXRBY3Rpb25zIiwib0FjdGlvbiIsImdldEFjdGlvbiIsIm9NZW51IiwiZ2V0TWVudSIsImdldEl0ZW1zIiwib0l0ZW0iLCJkYXRhIiwiZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsIm9WaWV3Iiwib1BhcmFtcyIsImlzU3RpY2t5IiwiTW9kZWxIZWxwZXIiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJmbkdldExpbmtzIiwib0RhdGEiLCJhS2V5cyIsImluZGV4T2YiLCJvSUJOQWN0aW9uIiwic1NlbWFudGljT2JqZWN0IiwiYUxpbmsiLCJzZXRWaXNpYmxlIiwiZ2V0SWQiLCJzaGVsbE5hdmlnYXRpb25Ob3RBdmFpbGFibGUiLCJnZXRBY3Rpb25QYXRoIiwiYWN0aW9uQ29udGV4dCIsImJSZXR1cm5Pbmx5UGF0aCIsImluQWN0aW9uTmFtZSIsImJDaGVja1N0YXRpY1ZhbHVlIiwic0FjdGlvbk5hbWUiLCJ0b1N0cmluZyIsInNFbnRpdHlUeXBlTmFtZSIsIiRUeXBlIiwic0VudGl0eU5hbWUiLCJnZXRFbnRpdHlTZXROYW1lIiwic1Byb3BlcnR5Iiwic0JpbmRpbmdQYXJhbWV0ZXIiLCJzRW50aXR5VHlwZSIsIm9FbnRpdHlDb250YWluZXIiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJvUHJvcGVydHlBbm5vdGF0aW9ucyIsIm9Db2xsZWN0aW9uQW5ub3RhdGlvbnMiLCJvVGV4dEFubm90YXRpb24iLCJvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbiIsIiRFbnVtTWVtYmVyIiwiX2dldEVudGl0eVR5cGUiLCJfcmVxdWVzdE9iamVjdCIsIm9TZWxlY3RlZENvbnRleHQiLCJuQnJhY2tldEluZGV4Iiwic1RhcmdldFR5cGUiLCJzbGljZSIsInNDdXJyZW50VHlwZSIsImdldEJpbmRpbmciLCJ3YXJuaW5nIiwic0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCIsIm9Qcm9taXNlIiwicmVxdWVzdFNpbmdsZXRvblByb3BlcnR5IiwidlByb3BlcnR5VmFsdWUiLCJzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJhUmVxdWVzdFByb21pc2VzIiwiZm9yQ29udGV4dE1lbnUiLCJhbGwiLCJhUmVzdWx0cyIsImFBcHBsaWNhYmxlQ29udGV4dHMiLCJhTm90QXBwbGljYWJsZUNvbnRleHRzIiwiYVJlc3VsdCIsInNldER5bmFtaWNBY3Rpb25Db250ZXh0cyIsInRyYWNlIiwiYXBwbGljYWJsZSIsIm5vdEFwcGxpY2FibGUiLCJkeW5hbWljQWN0aW9uUGF0aFByZWZpeCIsImludGVybmFsTW9kZWwiLCJhcHBsaWNhYmxlUHJvcGVydHkiLCJub3RBcHBsaWNhYmxlUHJvcGVydHkiLCJfZ2V0RGVmYXVsdE9wZXJhdG9ycyIsInNQcm9wZXJ0eVR5cGUiLCJvRGF0YUNsYXNzIiwiVHlwZU1hcCIsImdldERhdGFUeXBlQ2xhc3NOYW1lIiwib0Jhc2VUeXBlIiwiZ2V0QmFzZVR5cGUiLCJGaWx0ZXJPcGVyYXRvclV0aWwiLCJnZXRPcGVyYXRvcnNGb3JUeXBlIiwiX2dldFJlc3RyaWN0aW9ucyIsImFEZWZhdWx0T3BzIiwiYUV4cHJlc3Npb25PcHMiLCJmaWx0ZXIiLCJzRWxlbWVudCIsImdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24iLCJhRXhwcmVzc2lvbnMiLCJhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkiLCJBbGxvd2VkRXhwcmVzc2lvbnNQcmlvIiwic29ydCIsImEiLCJiIiwiZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkiLCJzVHlwZSIsImJVc2VTZW1hbnRpY0RhdGVSYW5nZSIsInNldHRpbmdzIiwib0ZpbHRlclJlc3RyaWN0aW9ucyIsImdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aCIsImFFcXVhbHNPcHMiLCJhU2luZ2xlUmFuZ2VPcHMiLCJhU2luZ2xlUmFuZ2VEVEJhc2ljT3BzIiwiYVNpbmdsZVZhbHVlRGF0ZU9wcyIsImFNdWx0aVJhbmdlT3BzIiwiYVNlYXJjaEV4cHJlc3Npb25PcHMiLCJhU2VtYW50aWNEYXRlT3BzRXh0IiwiU2VtYW50aWNEYXRlT3BlcmF0b3JzIiwiZ2V0U3VwcG9ydGVkT3BlcmF0aW9ucyIsImJTZW1hbnRpY0RhdGVSYW5nZSIsImFTZW1hbnRpY0RhdGVPcHMiLCJvU2V0dGluZ3MiLCJKU09OIiwicGFyc2UiLCJjdXN0b21EYXRhIiwib3BlcmF0b3JDb25maWd1cmF0aW9uIiwiZ2V0RmlsdGVyT3BlcmF0aW9ucyIsImdldFNlbWFudGljRGF0ZU9wZXJhdGlvbnMiLCJhRGVmYXVsdE9wZXJhdG9ycyIsInJlc3RyaWN0aW9ucyIsIkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyIsInNBbGxvd2VkRXhwcmVzc2lvbiIsImFTaW5nbGVWYWx1ZU9wcyIsInNPcGVyYXRvcnMiLCJnZXRPcGVyYXRvcnNGb3JHdWlkUHJvcGVydHkiLCJhbGxvd2VkT3BlcmF0b3JzRm9yR3VpZCIsImdldE9wZXJhdG9yc0ZvckRhdGVQcm9wZXJ0eSIsInByb3BlcnR5VHlwZSIsImdldFBhcmFtZXRlckluZm8iLCJzUGFyYW1ldGVyQ29udGV4dFBhdGgiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImJSZXN1bHRDb250ZXh0Iiwib1BhcmFtZXRlckluZm8iLCJjb250ZXh0UGF0aCIsInBhcmFtZXRlclByb3BlcnRpZXMiLCJnZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCJhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCIsIm9TZWxlY3Rpb25WYXJpYW50IiwibVBhZ2VDb250ZXh0Iiwib05hdmlnYXRpb25TZXJ2aWNlIiwiZ2V0TmF2aWdhdGlvblNlcnZpY2UiLCJtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCIsInRvSlNPTlN0cmluZyIsImlzU3RpY2t5RWRpdE1vZGUiLCJiSXNTdGlja3lNb2RlIiwiYlVJRWRpdGFibGUiLCJnZXRQcm9wZXJ0eSIsInNldFVzZXJEZWZhdWx0cyIsInBhcmFtZXRlcnMiLCJpc0FjdGlvbiIsImlzQ3JlYXRlIiwiYWN0aW9uRGVmYXVsdFZhbHVlcyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwic2hlbGxTZXJ2aWNlcyIsInN0YXJ0dXBBcHBTdGF0ZSIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsInN0YXJ0dXBBcHBTdGF0ZURhdGEiLCJnZXREYXRhIiwiZXh0ZW5kZWRQYXJhbWV0ZXJzIiwic2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdE9wdGlvbnMiLCJvUGFyYW1ldGVyIiwic1Byb3BlcnR5TmFtZSIsIiROYW1lIiwic1BhcmFtZXRlck5hbWUiLCJwYXJhbWV0ZXJ0VHlwZSIsIkJhc2VUeXBlIiwiU3RyaW5nIiwidHlwZUluc3RhbmNlIiwiZ2V0RGF0YVR5cGVJbnN0YW5jZSIsInBhcnNlVmFsdWUiLCJvRXh0ZW5kZWRQYXJhbWV0ZXIiLCJQcm9wZXJ0eU5hbWUiLCJvUmFuZ2UiLCJSYW5nZXMiLCJTaWduIiwiT3B0aW9uIiwiTG93IiwiZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZSIsIm9TdGFydHVwUGFyYW1ldGVycyIsIm9JbmJvdW5kUGFyYW1ldGVycyIsIm9JbmJvdW5kcyIsImFDcmVhdGVQYXJhbWV0ZXJzIiwic1BhcmFtZXRlciIsInVzZUZvckNyZWF0ZSIsIm9SZXQiLCJzQ3JlYXRlUGFyYW1ldGVyIiwiYVZhbHVlcyIsImNyZWF0ZSIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9PdXRib3VuZCIsImFTZW1hbnRpY09iamVjdE1hcHBpbmciLCJhUGFyYW1ldGVycyIsInNQYXJhbSIsImZvcm1hdCIsImdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbiIsIm9WaWV3RGF0YSIsIm9Dcm9zc05hdiIsIm9IZWFkZXJGYWNldEl0ZW1zIiwic0lkIiwib0NvbnRyb2xDb25maWciLCJjb250cm9sQ29uZmlndXJhdGlvbiIsImNvbmZpZyIsInNPdXRib3VuZCIsIm5hdmlnYXRpb24iLCJ0YXJnZXRPdXRib3VuZCIsIm91dGJvdW5kIiwiZ2VuZXJhdGUiLCJzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzIiwidk1hcHBpbmdzIiwib01hcHBpbmdzIiwic0xvY2FsUHJvcGVydHkiLCJzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSIsIm9TZWxlY3RPcHRpb24iLCJnZXRTZWxlY3RPcHRpb24iLCJyZW1vdmVTZWxlY3RPcHRpb24iLCJtYXNzQWRkU2VsZWN0T3B0aW9uIiwiZm5HZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCIsInNQYXRoIiwiYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zIiwiYVNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJzZW1hbnRpY09iamVjdEZvckdldExpbmtzIiwiZm5HZXRTZW1hbnRpY09iamVjdFByb21pc2UiLCJnZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCIsImZuUHJlcGFyZVNlbWFudGljT2JqZWN0c1Byb21pc2VzIiwiX29NZXRhTW9kZWwiLCJfYVNlbWFudGljT2JqZWN0c0ZvdW5kIiwiX2FTZW1hbnRpY09iamVjdHNQcm9taXNlcyIsIl9LZXlzIiwicmVnZXhSZXN1bHQiLCJzZW1hbnRpY09iamVjdEZvdW5kIiwiZXhlYyIsImdldFNlbWFudGljT2JqZWN0UHJvbWlzZSIsImdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uIiwib0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJtQWxsb3dlZEV4cHJlc3Npb25zIiwiRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyIsIm9Qcm9wZXJ0eSIsIlByb3BlcnR5IiwiQWxsb3dlZEV4cHJlc3Npb25zIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zIiwic1Jlc3RyaWN0aW9uIiwiYVByb3BzIiwibWFwIiwiX2ZldGNoUHJvcGVydGllc0Zvck5hdlBhdGgiLCJwYXRocyIsIm5hdlBhdGgiLCJwcm9wcyIsIm5hdlBhdGhQcmVmaXgiLCJvdXRQYXRocyIsInBhdGhUb0NoZWNrIiwic3RhcnRzV2l0aCIsIm91dFBhdGgiLCJSZXF1aXJlZFByb3BlcnRpZXMiLCJOb25GaWx0ZXJhYmxlUHJvcGVydGllcyIsIm5hdmlnYXRpb25UZXh0IiwiZnJUZXJtIiwiZW50aXR5VHlwZVBhdGhQYXJ0cyIsInJlcGxhY2VBbGwiLCJmaWx0ZXJPdXROYXZQcm9wQmluZGluZyIsImVudGl0eVR5cGVQYXRoIiwiam9pbiIsImVudGl0eVNldFBhdGgiLCJnZXRFbnRpdHlTZXRQYXRoIiwiZW50aXR5U2V0UGF0aFBhcnRzIiwiaXNDb250YWlubWVudCIsImNvbnRhaW5tZW50TmF2UGF0aCIsInJlc3VsdENvbnRleHRDaGVjayIsInBhcmVudEVudGl0eVNldFBhdGgiLCJvUGFyZW50UmV0Iiwib1BhcmVudEZSIiwiY29tcGxldGVBbGxvd2VkRXhwcyIsIm91dFByb3AiLCJwcm9wUGF0aCIsIm91dFByb3BQYXRoIiwibWVyZ2VPYmplY3RzIiwib05hdlJlc3RyaWN0aW9ucyIsIk1ldGFNb2RlbEZ1bmN0aW9uIiwiZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm9OYXZGaWx0ZXJSZXN0IiwibmF2UmVzUmVxUHJvcHMiLCJ1bmlxdWVTb3J0IiwibmF2Tm9uRmlsdGVyUHJvcHMiLCJuYXZBc3NvY2lhdGlvbkVudGl0eVJlc3QiLCJuYXZBc3NvY1JlcVByb3BzIiwibmF2QXNzb2NOb25GaWx0ZXJQcm9wcyIsInRlbXBsYXRlQ29udHJvbEZyYWdtZW50Iiwic0ZyYWdtZW50TmFtZSIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm9PcHRpb25zIiwib01vZGlmaWVyIiwidmlldyIsIm9GcmFnbWVudCIsInRhcmdldHMiLCJmcmFnbWVudERhdGEiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJmaXJzdEVsZW1lbnRDaGlsZCIsImlzWE1MIiwib3duZXIiLCJydW5Bc093bmVyIiwiZm4iLCJjb250YWluaW5nVmlldyIsInZpZXdPd25lciIsImNvbnRyb2xsZXIiLCJGcmFnbWVudCIsImxvYWQiLCJpZCIsImRlZmluaXRpb24iLCJnZXRTaW5nbGV0b25QYXRoIiwicGFydHMiLCJCb29sZWFuIiwicHJvcGVydHlOYW1lIiwicG9wIiwibmF2aWdhdGlvblBhdGgiLCJlbnRpdHlTZXQiLCJzaW5nbGV0b25OYW1lIiwicmVzb2x2ZWRQYXRoIiwicHJvcGVydHlCaW5kaW5nIiwiYmluZFByb3BlcnR5IiwicmVxdWVzdFZhbHVlIiwiZ2V0UGFyYW1ldGVyUGF0aCIsInNDb250ZXh0IiwiYUFjdGlvbiIsIl9mbnRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmciLCJleHBCaW5kaW5nIiwiY29udHJvbCIsImFueVJlc291cmNlVGV4dCIsIkFueUVsZW1lbnQiLCJhbnlUZXh0IiwiYWRkRGVwZW5kZW50IiwicmVzdWx0VGV4dCIsImdldEFueVRleHQiLCJyZW1vdmVEZXBlbmRlbnQiLCJkZXN0cm95IiwiaXNTbWFsbERldmljZSIsIkRldmljZSIsInN5c3RlbSIsImRlc2t0b3AiLCJyZXNpemUiLCJ3aWR0aCIsImdldEZpbHRlcnNGcm9tQW5ub3RhdGlvbiIsImFubm90YXRpb25QYXRoIiwic3ZDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJwcm9wZXJ0eUZpbHRlcnMiLCJhbm5vdGF0aW9uIiwidGFyZ2V0T2JqZWN0IiwiaXNTZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50IiwiU2VsZWN0aW9uVmFyaWFudCIsImlzU2VsZWN0aW9uVmFyaWFudCIsInNlbGVjdE9wdGlvbiIsIiR0YXJnZXQiLCJ0eXBlIiwicHJvcGVydHlQYXRoIiwiaiIsInJhbmdlIiwiZ2V0UmFuZ2VEZWZpbml0aW9uIiwiRmlsdGVyIiwib3BlcmF0b3IiLCJyYW5nZUxvdyIsInJhbmdlSGlnaCIsImZpbHRlcnMiLCJhbmQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yUGF0aCIsInNNZXRhUGF0aCIsInNFbnRpdHlTZXQiLCJvRGlhZ25vc3RpY3MiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIkNvbnZlcnRlckNvbnRleHQiLCJjcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8iLCJjcmVhdGVSb290Q29udGV4dCIsInByb2dyYW1taW5nTW9kZWwiLCJjb250ZXh0Iiwicm9vdENvbnRleHRQYXRoIiwiZ2V0RHJhZnRSb290UGF0aCIsImdldFN0aWNreVJvb3RQYXRoIiwic2ltcGxlUm9vdENvbnRleHQiLCJleGlzdGluZ0JpbmRpbmdDb250ZXh0T25QYWdlIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJmaW5kIiwicGFnZVZpZXciLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImZpcmVCdXR0b25QcmVzcyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJ1cGRhdGVSZWxhdGVkQXBwc0RldGFpbHMiLCJ1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsImdldElCTkFjdGlvbnMiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJSRVFVSVJFRF9QUk9QRVJUSUVTIiwiTk9OX0ZJTFRFUkFCTEVfUFJPUEVSVElFUyIsIkFMTE9XRURfRVhQUkVTU0lPTlMiLCJnZXRSZWxhdGVkQXBwc01lbnVJdGVtcyIsImdldFRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmciXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbW1vblV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgRWRtIGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9FZG1cIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyUmVzdHJpY3Rpb25zVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ2FwYWJpbGl0aWVzXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGUsIFNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IFRleHRBcnJhbmdlbWVudCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHVuaXF1ZVNvcnQgZnJvbSBcInNhcC9iYXNlL3V0aWwvYXJyYXkvdW5pcXVlU29ydFwiO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50RGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBFeHRlbnNpb25BUEkgZnJvbSBcInNhcC9mZS9jb3JlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlclNldHRpbmdzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0RhdGVPcGVyYXRvcnMgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNEYXRlT3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IElTaGVsbFNlcnZpY2VzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NoZWxsU2VydmljZXNGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBEaWFnbm9zdGljcyBmcm9tIFwic2FwL2ZlL2NvcmUvc3VwcG9ydC9EaWFnbm9zdGljc1wiO1xuaW1wb3J0IHsgaXNTZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50LCBpc1NlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWx0ZXJIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCB0eXBlIEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBNZW51QnV0dG9uIGZyb20gXCJzYXAvbS9NZW51QnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBOYXZDb250YWluZXIgZnJvbSBcInNhcC9tL05hdkNvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgT3ZlcmZsb3dUb29sYmFyQnV0dG9uIGZyb20gXCJzYXAvbS9PdmVyZmxvd1Rvb2xiYXJCdXR0b25cIjtcbmltcG9ydCBEZXZpY2UgZnJvbSBcInNhcC91aS9EZXZpY2VcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgQ29tcG9uZW50Q29udGFpbmVyIGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRDb250YWluZXJcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE1EQ0NoYXJ0IH0gZnJvbSBcInNhcC91aS9tZGMvQ2hhcnRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBBY3Rpb25Ub29sYmFyQWN0aW9uIGZyb20gXCJzYXAvdWkvbWRjL2FjdGlvbnRvb2xiYXIvQWN0aW9uVG9vbGJhckFjdGlvblwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yVXRpbCBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vRmlsdGVyT3BlcmF0b3JVdGlsXCI7XG5pbXBvcnQgQmFzZVR5cGUgZnJvbSBcInNhcC91aS9tZGMvZW51bXMvQmFzZVR5cGVcIjtcbmltcG9ydCBUeXBlTWFwIGZyb20gXCJzYXAvdWkvbWRjL29kYXRhL3Y0L1R5cGVNYXBcIjtcbmltcG9ydCB0eXBlIE1EQ1RhYmxlIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9jb250ZW50L01EQ1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IExpbmsgfSBmcm9tIFwic2FwL3VzaGVsbC9zZXJ2aWNlcy9OYXZpZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7XG5cdEV4cGFuZFBhdGhUeXBlLFxuXHRNZXRhTW9kZWxFbnRpdHlUeXBlLFxuXHRNZXRhTW9kZWxFbnVtLFxuXHRNZXRhTW9kZWxOYXZQcm9wZXJ0eSxcblx0TWV0YU1vZGVsUHJvcGVydHksXG5cdE1ldGFNb2RlbFR5cGVcbn0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IEFueUVsZW1lbnQgZnJvbSBcIi4vY29udHJvbHMvQW55RWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0UmFuZ2VEZWZpbml0aW9uIH0gZnJvbSBcIi4vY29udmVydGVycy9oZWxwZXJzL1NlbGVjdGlvblZhcmlhbnRIZWxwZXJcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbEZ1bmN0aW9uIGZyb20gXCIuL2hlbHBlcnMvTWV0YU1vZGVsRnVuY3Rpb25cIjtcblxudHlwZSBNeUluYm94SW50ZW50ID0ge1xuXHRzZW1hbnRpY09iamVjdDogc3RyaW5nO1xuXHRhY3Rpb246IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlYXJjaFRlcm0oc1NlYXJjaFRlcm06IHN0cmluZykge1xuXHRpZiAoIXNTZWFyY2hUZXJtKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHJldHVybiBzU2VhcmNoVGVybVxuXHRcdC5yZXBsYWNlKC9cIi9nLCBcIiBcIilcblx0XHQucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpIC8vZXNjYXBlIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLiBDYW4gYmUgcmVtb3ZlZCBpZiBvZGF0YS9iaW5kaW5nIGhhbmRsZXMgYmFja2VuZCBlcnJvcnMgcmVzcG9uZHMuXG5cdFx0LnNwbGl0KC9cXHMrLylcblx0XHQucmVkdWNlKGZ1bmN0aW9uIChzTm9ybWFsaXplZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzQ3VycmVudFdvcmQ6IHN0cmluZykge1xuXHRcdFx0aWYgKHNDdXJyZW50V29yZCAhPT0gXCJcIikge1xuXHRcdFx0XHRzTm9ybWFsaXplZCA9IGAke3NOb3JtYWxpemVkID8gYCR7c05vcm1hbGl6ZWR9IGAgOiBcIlwifVwiJHtzQ3VycmVudFdvcmR9XCJgO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNOb3JtYWxpemVkO1xuXHRcdH0sIHVuZGVmaW5lZCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDb250ZXh0UmVxdWVzdGVkKGJpbmRpbmdDb250ZXh0OiBPRGF0YVY0Q29udGV4dCkge1xuXHRjb25zdCBtb2RlbCA9IGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBlbnRpdHlQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSk7XG5cdGNvbnN0IGRhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldENvbnRleHQoZW50aXR5UGF0aCkpO1xuXHRhd2FpdCBiaW5kaW5nQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUua2V5c1swXT8ubmFtZSk7XG59XG5cbmZ1bmN0aW9uIGZuSGFzVHJhbnNpZW50Q29udGV4dHMob0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKSB7XG5cdGxldCBiSGFzVHJhbnNpZW50Q29udGV4dHMgPSBmYWxzZTtcblx0aWYgKG9MaXN0QmluZGluZykge1xuXHRcdG9MaXN0QmluZGluZy5nZXRDdXJyZW50Q29udGV4dHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQ29udGV4dDogT0RhdGFWNENvbnRleHQpIHtcblx0XHRcdGlmIChvQ29udGV4dCAmJiBvQ29udGV4dC5pc1RyYW5zaWVudCgpKSB7XG5cdFx0XHRcdGJIYXNUcmFuc2llbnRDb250ZXh0cyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGJIYXNUcmFuc2llbnRDb250ZXh0cztcbn1cblxuLy8gdGhlcmUgaXMgbm8gbmF2aWdhdGlvbiBpbiBlbnRpdHlTZXQgcGF0aCBhbmQgcHJvcGVydHkgcGF0aFxuXG5hc3luYyBmdW5jdGlvbiBfZ2V0U09JbnRlbnRzKFxuXHRvU2hlbGxTZXJ2aWNlSGVscGVyOiBJU2hlbGxTZXJ2aWNlcyxcblx0b09iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdG9TZW1hbnRpY09iamVjdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRvUGFyYW06IG9iamVjdCB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxMaW5rW11bXT4ge1xuXHRyZXR1cm4gb1NoZWxsU2VydmljZUhlbHBlci5nZXRMaW5rcyhbXG5cdFx0e1xuXHRcdFx0c2VtYW50aWNPYmplY3Q6IG9TZW1hbnRpY09iamVjdCxcblx0XHRcdHBhcmFtczogb1BhcmFtXG5cdFx0fVxuXHRdKTtcbn1cblxuLy8gVE8tRE8gYWRkIHRoaXMgYXMgcGFydCBvZiBhcHBseVNlbWFudGljT2JqZWN0bWFwcGluZ3MgbG9naWMgaW4gSW50ZW50QmFzZWRuYXZpZ2F0aW9uIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG5mdW5jdGlvbiBfY3JlYXRlTWFwcGluZ3Mob01hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG5cdGNvbnN0IGFTT01hcHBpbmdzID0gW107XG5cdGNvbnN0IGFNYXBwaW5nS2V5cyA9IE9iamVjdC5rZXlzKG9NYXBwaW5nKTtcblx0bGV0IG9TZW1hbnRpY01hcHBpbmc7XG5cdGZvciAoY29uc3QgZWxlbWVudCBvZiBhTWFwcGluZ0tleXMpIHtcblx0XHRvU2VtYW50aWNNYXBwaW5nID0ge1xuXHRcdFx0TG9jYWxQcm9wZXJ0eToge1xuXHRcdFx0XHQkUHJvcGVydHlQYXRoOiBlbGVtZW50XG5cdFx0XHR9LFxuXHRcdFx0U2VtYW50aWNPYmplY3RQcm9wZXJ0eTogb01hcHBpbmdbZWxlbWVudF1cblx0XHR9O1xuXHRcdGFTT01hcHBpbmdzLnB1c2gob1NlbWFudGljTWFwcGluZyk7XG5cdH1cblxuXHRyZXR1cm4gYVNPTWFwcGluZ3M7XG59XG50eXBlIExpbmtEZWZpbml0aW9uID0ge1xuXHRpbnRlbnQ6IHN0cmluZztcblx0dGV4dDogc3RyaW5nO1xufTtcbnR5cGUgU2VtYW50aWNJdGVtID0ge1xuXHR0ZXh0OiBzdHJpbmc7XG5cdHRhcmdldFNlbU9iamVjdDogc3RyaW5nO1xuXHR0YXJnZXRBY3Rpb246IHN0cmluZztcblx0dGFyZ2V0UGFyYW1zOiB1bmtub3duO1xufTtcbi8qKlxuICogQHBhcmFtIGxpbmtHcm91cFxuICogQHBhcmFtIGFFeGNsdWRlZEFjdGlvbnNcbiAqIEBwYXJhbSBvVGFyZ2V0UGFyYW1zXG4gKiBAcGFyYW0gYUl0ZW1zXG4gKiBAcGFyYW0gYUFsbG93ZWRBY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyhcblx0bGlua0dyb3VwOiBMaW5rW11bXSxcblx0YUV4Y2x1ZGVkQWN0aW9uczogdW5rbm93bltdLFxuXHRvVGFyZ2V0UGFyYW1zOiB1bmtub3duLFxuXHRhSXRlbXM6IFNlbWFudGljSXRlbVtdLFxuXHRhQWxsb3dlZEFjdGlvbnM/OiB1bmtub3duW11cbikge1xuXHRmb3IgKGNvbnN0IGxpbmtzIG9mIGxpbmtHcm91cCkge1xuXHRcdGZvciAoY29uc3Qgb0xpbmsgb2YgbGlua3MpIHtcblx0XHRcdGNvbnN0IHNJbnRlbnQgPSBvTGluay5pbnRlbnQ7XG5cdFx0XHRjb25zdCBzQWN0aW9uID0gc0ludGVudC5zcGxpdChcIi1cIilbMV0uc3BsaXQoXCI/XCIpWzBdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoYUFsbG93ZWRBY3Rpb25zICYmIGFBbGxvd2VkQWN0aW9ucy5pbmNsdWRlcyhzQWN0aW9uKSkgfHxcblx0XHRcdFx0KCFhQWxsb3dlZEFjdGlvbnMgJiYgYUV4Y2x1ZGVkQWN0aW9ucyAmJiAhYUV4Y2x1ZGVkQWN0aW9ucy5pbmNsdWRlcyhzQWN0aW9uKSlcblx0XHRcdCkge1xuXHRcdFx0XHRhSXRlbXMucHVzaCh7XG5cdFx0XHRcdFx0dGV4dDogb0xpbmsudGV4dCxcblx0XHRcdFx0XHR0YXJnZXRTZW1PYmplY3Q6IHNJbnRlbnQuc3BsaXQoXCIjXCIpWzFdLnNwbGl0KFwiLVwiKVswXSxcblx0XHRcdFx0XHR0YXJnZXRBY3Rpb246IHNBY3Rpb24uc3BsaXQoXCJ+XCIpWzBdLFxuXHRcdFx0XHRcdHRhcmdldFBhcmFtczogb1RhcmdldFBhcmFtc1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IHR5cGUgU2VtYW50aWNPYmplY3QgPSB7XG5cdGFsbG93ZWRBY3Rpb25zPzogdW5rbm93bltdO1xuXHR1bmF2YWlsYWJsZUFjdGlvbnM/OiB1bmtub3duW107XG5cdHNlbWFudGljT2JqZWN0OiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcblx0bWFwcGluZz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5mdW5jdGlvbiBfZ2V0UmVsYXRlZEludGVudHMoXG5cdG9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzOiBTZW1hbnRpY09iamVjdCxcblx0b0JpbmRpbmdDb250ZXh0OiBDb250ZXh0LFxuXHRhTWFuaWZlc3RTT0l0ZW1zOiBTZW1hbnRpY0l0ZW1bXSxcblx0YUxpbmtzOiBMaW5rW11bXVxuKSB7XG5cdGlmIChhTGlua3MgJiYgYUxpbmtzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBhQWxsb3dlZEFjdGlvbnMgPSBvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy5hbGxvd2VkQWN0aW9ucyB8fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYUV4Y2x1ZGVkQWN0aW9ucyA9IG9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzLnVuYXZhaWxhYmxlQWN0aW9ucyA/IG9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzLnVuYXZhaWxhYmxlQWN0aW9ucyA6IFtdO1xuXHRcdGNvbnN0IGFTT01hcHBpbmdzID0gb0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMubWFwcGluZyA/IF9jcmVhdGVNYXBwaW5ncyhvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy5tYXBwaW5nKSA6IFtdO1xuXHRcdGNvbnN0IG9UYXJnZXRQYXJhbXMgPSB7IG5hdmlnYXRpb25Db250ZXh0czogb0JpbmRpbmdDb250ZXh0LCBzZW1hbnRpY09iamVjdE1hcHBpbmc6IGFTT01hcHBpbmdzIH07XG5cdFx0X2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zKGFMaW5rcywgYUV4Y2x1ZGVkQWN0aW9ucywgb1RhcmdldFBhcmFtcywgYU1hbmlmZXN0U09JdGVtcywgYUFsbG93ZWRBY3Rpb25zKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZmV0Y2hlcyB0aGUgcmVsYXRlZCBpbnRlbnRzIHdoZW4gc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gYXJlIHBhc3NlZCBmcm9tIGZlRW52aXJvbm1lbnQuZ2V0SW50ZW50KCkgb25seSBpbiBjYXNlIG9mIE15IEluYm94IGludGVncmF0aW9uLlxuICpcbiAqIEBwYXJhbSBzZW1hbnRpY09iamVjdEFuZEFjdGlvbiBUaGlzIHNwZWNpZmllcyB0aGUgc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gZm9yIGZldGNoaW5nIHRoZSBpbnRlbnRzXG4gKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IFRoaXMgc2VwY2lmaWVzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHVwZGF0aW5nIHJlbGF0ZWQgYXBwc1xuICogQHBhcmFtIGFwcENvbXBvbmVudFNPSXRlbXMgVGhpcyBpcyBhIGxpc3Qgb2Ygc2VtYW50aWMgaXRlbXMgdXNlZCBmb3IgdXBkYXRpbmcgdGhlIHJlbGF0ZWQgYXBwcyBidXR0b25cbiAqIEBwYXJhbSBhTGlua3MgVGhpcyBpcyBhbiBhcnJheSBjb21wcmlzaW5nIG9mIHJlbGF0ZWQgaW50ZW50c1xuICovXG5cbmZ1bmN0aW9uIF9nZXRSZWxhdGVkSW50ZW50c1dpdGhTZW1hbnRpY09iamVjdHNBbmRBY3Rpb24oXG5cdHNlbWFudGljT2JqZWN0QW5kQWN0aW9uOiBNeUluYm94SW50ZW50LFxuXHRvQmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdGFwcENvbXBvbmVudFNPSXRlbXM6IFNlbWFudGljSXRlbVtdLFxuXHRhTGlua3M6IExpbmtbXVtdXG4pIHtcblx0aWYgKGFMaW5rcy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgYWN0aW9ucyA9IFtzZW1hbnRpY09iamVjdEFuZEFjdGlvbi5hY3Rpb25dO1xuXHRcdGNvbnN0IGV4Y2x1ZGVkQWN0aW9uczogW10gPSBbXTtcblx0XHRjb25zdCBzb01hcHBpbmdzOiBbXSA9IFtdO1xuXHRcdGNvbnN0IHRhcmdldFBhcmFtcyA9IHsgbmF2aWdhdGlvbkNvbnRleHRzOiBvQmluZGluZ0NvbnRleHQsIHNlbWFudGljT2JqZWN0TWFwcGluZzogc29NYXBwaW5ncyB9O1xuXHRcdF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyhhTGlua3MsIGV4Y2x1ZGVkQWN0aW9ucywgdGFyZ2V0UGFyYW1zLCBhcHBDb21wb25lbnRTT0l0ZW1zLCBhY3Rpb25zKTtcblx0fVxufVxuXG50eXBlIFNlbWFudGljT2JqZWN0Q29uZmlnID0ge1xuXHRhZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzOiBSZWNvcmQ8c3RyaW5nLCBTZW1hbnRpY09iamVjdD47XG59O1xudHlwZSBSZWxhdGVkQXBwc0NvbmZpZyA9IHtcblx0dGV4dDogc3RyaW5nO1xuXHR0YXJnZXRTZW1PYmplY3Q6IHN0cmluZztcblx0dGFyZ2V0QWN0aW9uOiBzdHJpbmc7XG59O1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUmVsYXRlQXBwc01vZGVsKFxuXHRvQmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdG9FbnRyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG5cdG9PYmplY3RQYWdlTGF5b3V0OiBPYmplY3RQYWdlTGF5b3V0LFxuXHRhU2VtS2V5czogeyAkUHJvcGVydHlQYXRoOiBzdHJpbmcgfVtdLFxuXHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0b01ldGFQYXRoOiBzdHJpbmcsXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50XG4pOiBQcm9taXNlPFJlbGF0ZWRBcHBzQ29uZmlnW10+IHtcblx0Y29uc3Qgb1NoZWxsU2VydmljZUhlbHBlcjogSVNoZWxsU2VydmljZXMgPSBhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRjb25zdCBvUGFyYW06IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdGxldCBzQ3VycmVudFNlbU9iaiA9IFwiXCIsXG5cdFx0c0N1cnJlbnRBY3Rpb24gPSBcIlwiO1xuXHRsZXQgb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnM7XG5cdGxldCBhUmVsYXRlZEFwcHNNZW51SXRlbXM6IFJlbGF0ZWRBcHBzQ29uZmlnW10gPSBbXTtcblx0bGV0IGFFeGNsdWRlZEFjdGlvbnM6IHVua25vd25bXSA9IFtdO1xuXHRsZXQgYU1hbmlmZXN0U09LZXlzOiBzdHJpbmdbXTtcblxuXHRhc3luYyBmdW5jdGlvbiBmbkdldFBhcnNlU2hlbGxIYXNoQW5kR2V0TGlua3MoKSB7XG5cdFx0Y29uc3Qgb1BhcnNlZFVybCA9IG9TaGVsbFNlcnZpY2VIZWxwZXIucGFyc2VTaGVsbEhhc2goZG9jdW1lbnQubG9jYXRpb24uaGFzaCk7XG5cdFx0c0N1cnJlbnRTZW1PYmogPSBvUGFyc2VkVXJsLnNlbWFudGljT2JqZWN0OyAvLyBDdXJyZW50IFNlbWFudGljIE9iamVjdFxuXHRcdHNDdXJyZW50QWN0aW9uID0gb1BhcnNlZFVybC5hY3Rpb247XG5cdFx0cmV0dXJuIF9nZXRTT0ludGVudHMob1NoZWxsU2VydmljZUhlbHBlciwgb09iamVjdFBhZ2VMYXlvdXQsIHNDdXJyZW50U2VtT2JqLCBvUGFyYW0pO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRpZiAob0VudHJ5KSB7XG5cdFx0XHRpZiAoYVNlbUtleXMgJiYgYVNlbUtleXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYVNlbUtleXMpIHtcblx0XHRcdFx0XHRjb25zdCBzU2VtS2V5ID0gZWxlbWVudC4kUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdGlmICghb1BhcmFtW3NTZW1LZXldKSB7XG5cdFx0XHRcdFx0XHRvUGFyYW1bc1NlbUtleV0gPSB7IHZhbHVlOiBvRW50cnlbc1NlbUtleV0gfTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGZhbGxiYWNrIHRvIFRlY2huaWNhbCBLZXlzIGlmIG5vIFNlbWFudGljIEtleSBpcyBwcmVzZW50XG5cdFx0XHRcdGNvbnN0IGFUZWNobmljYWxLZXlzID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7b01ldGFQYXRofS8kVHlwZS8kS2V5YCk7XG5cdFx0XHRcdGZvciAoY29uc3Qga2V5IGluIGFUZWNobmljYWxLZXlzKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc09iaktleSA9IGFUZWNobmljYWxLZXlzW2tleV07XG5cdFx0XHRcdFx0aWYgKCFvUGFyYW1bc09iaktleV0pIHtcblx0XHRcdFx0XHRcdG9QYXJhbVtzT2JqS2V5XSA9IHsgdmFsdWU6IG9FbnRyeVtzT2JqS2V5XSB9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBMb2dpYyB0byByZWFkIGFkZGl0aW9uYWwgU08gZnJvbSBtYW5pZmVzdCBhbmQgdXBkYXRlZCByZWxhdGVkYXBwcyBtb2RlbFxuXG5cdFx0Y29uc3Qgb01hbmlmZXN0RGF0YSA9IGdldFRhcmdldFZpZXcob09iamVjdFBhZ2VMYXlvdXQpLmdldFZpZXdEYXRhKCkgYXMgU2VtYW50aWNPYmplY3RDb25maWc7XG5cdFx0Y29uc3QgYU1hbmlmZXN0U09JdGVtczogU2VtYW50aWNJdGVtW10gPSBbXTtcblx0XHRsZXQgc2VtYW50aWNPYmplY3RJbnRlbnRzO1xuXHRcdGlmIChvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMpIHtcblx0XHRcdGFNYW5pZmVzdFNPS2V5cyA9IE9iamVjdC5rZXlzKG9NYW5pZmVzdERhdGEuYWRkaXRpb25hbFNlbWFudGljT2JqZWN0cyk7XG5cdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYU1hbmlmZXN0U09LZXlzKSB7XG5cdFx0XHRcdHNlbWFudGljT2JqZWN0SW50ZW50cyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShfZ2V0U09JbnRlbnRzKG9TaGVsbFNlcnZpY2VIZWxwZXIsIG9PYmplY3RQYWdlTGF5b3V0LCBlbGVtZW50LCBvUGFyYW0pKTtcblx0XHRcdFx0X2dldFJlbGF0ZWRJbnRlbnRzKFxuXHRcdFx0XHRcdG9NYW5pZmVzdERhdGEuYWRkaXRpb25hbFNlbWFudGljT2JqZWN0c1tlbGVtZW50XSxcblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdFx0YU1hbmlmZXN0U09JdGVtcyxcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdEludGVudHNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhcHBDb21wb25lbnRTT0l0ZW1zIGlzIHVwZGF0ZWQgaW4gY2FzZSBvZiBNeSBJbmJveCBpbnRlZ3JhdGlvbiB3aGVuIHNlbWFudGljIG9iamVjdCBhbmQgYWN0aW9uIGFyZSBwYXNzZWQgZnJvbSBmZUVudmlyb25tZW50LmdldEludGVudCgpIG1ldGhvZFxuXHRcdC8vIEluIG90aGVyIGNhc2VzIGl0IHJlbWFpbnMgYXMgYW4gZW1wdHkgbGlzdFxuXHRcdC8vIFdlIGNvbmNhdCB0aGlzIGxpc3QgdG93YXJkcyB0aGUgZW5kIHdpdGggYU1hbmlmZXN0U09JdGVtc1xuXG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50U09JdGVtczogU2VtYW50aWNJdGVtW10gPSBbXTtcblx0XHRjb25zdCBjb21wb25lbnREYXRhOiBDb21wb25lbnREYXRhID0gYXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHRpZiAoY29tcG9uZW50RGF0YS5mZUVudmlyb25tZW50ICYmIGNvbXBvbmVudERhdGEuZmVFbnZpcm9ubWVudC5nZXRJbnRlbnQoKSkge1xuXHRcdFx0Y29uc3QgaW50ZW50OiBNeUluYm94SW50ZW50ID0gY29tcG9uZW50RGF0YS5mZUVudmlyb25tZW50LmdldEludGVudCgpO1xuXHRcdFx0c2VtYW50aWNPYmplY3RJbnRlbnRzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRfZ2V0U09JbnRlbnRzKG9TaGVsbFNlcnZpY2VIZWxwZXIsIG9PYmplY3RQYWdlTGF5b3V0LCBpbnRlbnQuc2VtYW50aWNPYmplY3QsIG9QYXJhbSlcblx0XHRcdCk7XG5cdFx0XHRfZ2V0UmVsYXRlZEludGVudHNXaXRoU2VtYW50aWNPYmplY3RzQW5kQWN0aW9uKGludGVudCwgb0JpbmRpbmdDb250ZXh0LCBhcHBDb21wb25lbnRTT0l0ZW1zLCBzZW1hbnRpY09iamVjdEludGVudHMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGludGVybmFsTW9kZWxDb250ZXh0ID0gb09iamVjdFBhZ2VMYXlvdXQuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBhTGlua3MgPSBhd2FpdCBmbkdldFBhcnNlU2hlbGxIYXNoQW5kR2V0TGlua3MoKTtcblx0XHRpZiAoYUxpbmtzKSB7XG5cdFx0XHRpZiAoYUxpbmtzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGV0IGlzU2VtYW50aWNPYmplY3RIYXNTYW1lVGFyZ2V0SW5NYW5pZmVzdCA9IGZhbHNlO1xuXHRcdFx0XHRjb25zdCBvVGFyZ2V0UGFyYW1zOiB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzPzogQ29udGV4dDtcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc/OiBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W107XG5cdFx0XHRcdH0gPSB7fTtcblx0XHRcdFx0Y29uc3QgYUFubm90YXRpb25zU09JdGVtczogU2VtYW50aWNJdGVtW10gPSBbXTtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBgJHtvTWV0YVBhdGh9QGA7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlUeXBlUGF0aCA9IGAke29NZXRhUGF0aH0vQGA7XG5cdFx0XHRcdGNvbnN0IG9FbnRpdHlTZXRBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKTtcblx0XHRcdFx0b1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zKG9FbnRpdHlTZXRBbm5vdGF0aW9ucywgc0N1cnJlbnRTZW1PYmopO1xuXHRcdFx0XHRpZiAoIW9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmJIYXNFbnRpdHlTZXRTTykge1xuXHRcdFx0XHRcdGNvbnN0IG9FbnRpdHlUeXBlQW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzRW50aXR5VHlwZVBhdGgpO1xuXHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyhvRW50aXR5VHlwZUFubm90YXRpb25zLCBzQ3VycmVudFNlbU9iaik7XG5cdFx0XHRcdH1cblx0XHRcdFx0YUV4Y2x1ZGVkQWN0aW9ucyA9IG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFVbmF2YWlsYWJsZUFjdGlvbnM7XG5cdFx0XHRcdC8vU2tpcCBzYW1lIGFwcGxpY2F0aW9uIGZyb20gUmVsYXRlZCBBcHBzXG5cdFx0XHRcdGFFeGNsdWRlZEFjdGlvbnMucHVzaChzQ3VycmVudEFjdGlvbik7XG5cdFx0XHRcdG9UYXJnZXRQYXJhbXMubmF2aWdhdGlvbkNvbnRleHRzID0gb0JpbmRpbmdDb250ZXh0O1xuXHRcdFx0XHRvVGFyZ2V0UGFyYW1zLnNlbWFudGljT2JqZWN0TWFwcGluZyA9IG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFNYXBwaW5ncztcblx0XHRcdFx0X2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zKGFMaW5rcywgYUV4Y2x1ZGVkQWN0aW9ucywgb1RhcmdldFBhcmFtcywgYUFubm90YXRpb25zU09JdGVtcyk7XG5cblx0XHRcdFx0YU1hbmlmZXN0U09JdGVtcy5mb3JFYWNoKGZ1bmN0aW9uICh7IHRhcmdldFNlbU9iamVjdCB9KSB7XG5cdFx0XHRcdFx0aWYgKGFBbm5vdGF0aW9uc1NPSXRlbXNbMF0/LnRhcmdldFNlbU9iamVjdCA9PT0gdGFyZ2V0U2VtT2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3QgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCBhY3Rpb25zIGZyb20gY3VycmVudCBoYXNoIGFwcGxpY2F0aW9uIGlmIG1hbmlmZXN0IGNvbnRhaW5zIGVtcHR5IGFsbG93ZWRBY3Rpb25zXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMgJiZcblx0XHRcdFx0XHRhQW5ub3RhdGlvbnNTT0l0ZW1zWzBdICYmXG5cdFx0XHRcdFx0b01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzW2FBbm5vdGF0aW9uc1NPSXRlbXNbMF0udGFyZ2V0U2VtT2JqZWN0XSAmJlxuXHRcdFx0XHRcdCEhb01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzW2FBbm5vdGF0aW9uc1NPSXRlbXNbMF0udGFyZ2V0U2VtT2JqZWN0XS5hbGxvd2VkQWN0aW9uc1xuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHNvSXRlbXMgPSBhTWFuaWZlc3RTT0l0ZW1zLmNvbmNhdChhcHBDb21wb25lbnRTT0l0ZW1zKTtcblx0XHRcdFx0YVJlbGF0ZWRBcHBzTWVudUl0ZW1zID0gaXNTZW1hbnRpY09iamVjdEhhc1NhbWVUYXJnZXRJbk1hbmlmZXN0ID8gc29JdGVtcyA6IHNvSXRlbXMuY29uY2F0KGFBbm5vdGF0aW9uc1NPSXRlbXMpO1xuXHRcdFx0XHQvLyBJZiBubyBhcHAgaW4gbGlzdCwgcmVsYXRlZCBhcHBzIGJ1dHRvbiB3aWxsIGJlIGhpZGRlblxuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL3Zpc2liaWxpdHlcIiwgYVJlbGF0ZWRBcHBzTWVudUl0ZW1zLmxlbmd0aCA+IDApO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL2l0ZW1zXCIsIGFSZWxhdGVkQXBwc01lbnVJdGVtcyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL3Zpc2liaWxpdHlcIiwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzL3Zpc2liaWxpdHlcIiwgZmFsc2UpO1xuXHRcdH1cblx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmVhZCBsaW5rc1wiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHR9XG5cdHJldHVybiBhUmVsYXRlZEFwcHNNZW51SXRlbXM7XG59XG5cbmZ1bmN0aW9uIF9nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zKG9FbnRpdHlBbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNDdXJyZW50U2VtT2JqOiBzdHJpbmcpIHtcblx0Y29uc3Qgb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMgPSB7XG5cdFx0Ykhhc0VudGl0eVNldFNPOiBmYWxzZSxcblx0XHRhQWxsb3dlZEFjdGlvbnM6IFtdLFxuXHRcdGFVbmF2YWlsYWJsZUFjdGlvbnM6IFtdIGFzIE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnM+W10sXG5cdFx0YU1hcHBpbmdzOiBbXSBhcyBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W11cblx0fTtcblx0bGV0IHNBbm5vdGF0aW9uTWFwcGluZ1Rlcm0sIHNBbm5vdGF0aW9uQWN0aW9uVGVybTtcblx0bGV0IHNRdWFsaWZpZXI7XG5cdGZvciAoY29uc3Qga2V5IGluIG9FbnRpdHlBbm5vdGF0aW9ucykge1xuXHRcdGlmIChrZXkuaW5jbHVkZXMoQ29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0KSAmJiBvRW50aXR5QW5ub3RhdGlvbnNba2V5XSA9PT0gc0N1cnJlbnRTZW1PYmopIHtcblx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmJIYXNFbnRpdHlTZXRTTyA9IHRydWU7XG5cdFx0XHRzQW5ub3RhdGlvbk1hcHBpbmdUZXJtID0gYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdE1hcHBpbmd9YDtcblx0XHRcdHNBbm5vdGF0aW9uQWN0aW9uVGVybSA9IGBAJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnN9YDtcblxuXHRcdFx0aWYgKGtleS5pbmNsdWRlcyhcIiNcIikpIHtcblx0XHRcdFx0c1F1YWxpZmllciA9IGtleS5zcGxpdChcIiNcIilbMV07XG5cdFx0XHRcdHNBbm5vdGF0aW9uTWFwcGluZ1Rlcm0gPSBgJHtzQW5ub3RhdGlvbk1hcHBpbmdUZXJtfSMke3NRdWFsaWZpZXJ9YDtcblx0XHRcdFx0c0Fubm90YXRpb25BY3Rpb25UZXJtID0gYCR7c0Fubm90YXRpb25BY3Rpb25UZXJtfSMke3NRdWFsaWZpZXJ9YDtcblx0XHRcdH1cblx0XHRcdGlmIChvRW50aXR5QW5ub3RhdGlvbnNbc0Fubm90YXRpb25NYXBwaW5nVGVybV0pIHtcblx0XHRcdFx0b1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYU1hcHBpbmdzID0gb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYU1hcHBpbmdzLmNvbmNhdChcblx0XHRcdFx0XHRvRW50aXR5QW5ub3RhdGlvbnNbc0Fubm90YXRpb25NYXBwaW5nVGVybV0gYXMgTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPlxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0VudGl0eUFubm90YXRpb25zW3NBbm5vdGF0aW9uQWN0aW9uVGVybV0pIHtcblx0XHRcdFx0b1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYVVuYXZhaWxhYmxlQWN0aW9ucyA9IG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFVbmF2YWlsYWJsZUFjdGlvbnMuY29uY2F0KFxuXHRcdFx0XHRcdG9FbnRpdHlBbm5vdGF0aW9uc1tzQW5ub3RhdGlvbkFjdGlvblRlcm1dIGFzIE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnM+XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZuVXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzKG9PYmplY3RQYWdlTGF5b3V0OiBPYmplY3RQYWdlTGF5b3V0LCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gKG9PYmplY3RQYWdlTGF5b3V0LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9PYmplY3RQYWdlTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdGNvbnN0IHBhdGggPSAob0JpbmRpbmdDb250ZXh0ICYmIG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpIHx8IFwiXCI7XG5cdGNvbnN0IG9NZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgocGF0aCk7XG5cdC8vIFNlbWFudGljIEtleSBWb2NhYnVsYXJ5XG5cdGNvbnN0IHNTZW1hbnRpY0tleVZvY2FidWxhcnkgPSBgJHtvTWV0YVBhdGh9L2AgKyBgQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY0tleWA7XG5cdC8vU2VtYW50aWMgS2V5c1xuXHRjb25zdCBhU2VtS2V5cyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNTZW1hbnRpY0tleVZvY2FidWxhcnkpO1xuXHQvLyBVbmF2YWlsYWJsZSBBY3Rpb25zXG5cdGNvbnN0IG9FbnRyeSA9IG9CaW5kaW5nQ29udGV4dD8uZ2V0T2JqZWN0KCk7XG5cdGlmICghb0VudHJ5ICYmIG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdG9CaW5kaW5nQ29udGV4dFxuXHRcdFx0LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKHJlcXVlc3RlZE9iamVjdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIENvbW1vblV0aWxzLnVwZGF0ZVJlbGF0ZUFwcHNNb2RlbChcblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdFx0cmVxdWVzdGVkT2JqZWN0LFxuXHRcdFx0XHRcdG9PYmplY3RQYWdlTGF5b3V0LFxuXHRcdFx0XHRcdGFTZW1LZXlzLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0b01ldGFQYXRoLFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudFxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCB1cGRhdGUgdGhlIHJlbGF0ZWQgYXBwIGRldGFpbHNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gQ29tbW9uVXRpbHMudXBkYXRlUmVsYXRlQXBwc01vZGVsKG9CaW5kaW5nQ29udGV4dCwgb0VudHJ5LCBvT2JqZWN0UGFnZUxheW91dCwgYVNlbUtleXMsIG9NZXRhTW9kZWwsIG9NZXRhUGF0aCwgYXBwQ29tcG9uZW50KTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSBvQnV0dG9uXG4gKi9cbmZ1bmN0aW9uIGZuRmlyZUJ1dHRvblByZXNzKG9CdXR0b246IENvbnRyb2wpIHtcblx0aWYgKFxuXHRcdG9CdXR0b24gJiZcblx0XHRvQnV0dG9uLmlzQTxCdXR0b24gfCBPdmVyZmxvd1Rvb2xiYXJCdXR0b24+KFtcInNhcC5tLkJ1dHRvblwiLCBcInNhcC5tLk92ZXJmbG93VG9vbGJhckJ1dHRvblwiXSkgJiZcblx0XHRvQnV0dG9uLmdldFZpc2libGUoKSAmJlxuXHRcdG9CdXR0b24uZ2V0RW5hYmxlZCgpXG5cdCkge1xuXHRcdG9CdXR0b24uZmlyZVByZXNzKCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0QXBwQ29tcG9uZW50KG9Db250cm9sOiBDb250cm9sIHwgQ29tcG9uZW50KTogQXBwQ29tcG9uZW50IHtcblx0aWYgKG9Db250cm9sLmlzQTxBcHBDb21wb25lbnQ+KFwic2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50XCIpKSB7XG5cdFx0cmV0dXJuIG9Db250cm9sO1xuXHR9XG5cdGNvbnN0IG9Pd25lciA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcihvQ29udHJvbCk7XG5cdGlmICghb093bmVyKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgc2hvdWxkIGJlIGEgc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50IGFzIG93bmVyIG9mIHRoZSBjb250cm9sXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBnZXRBcHBDb21wb25lbnQob093bmVyKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50UGFnZVZpZXcob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogRkVWaWV3IHtcblx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0cmV0dXJuIHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdD8gcm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdFZpZXcoKVxuXHRcdDogQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldygob0FwcENvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKCkgYXMgTmF2Q29udGFpbmVyKS5nZXRDdXJyZW50UGFnZSgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0VmlldyhvQ29udHJvbDogTWFuYWdlZE9iamVjdCB8IG51bGwpOiBGRVZpZXcge1xuXHRpZiAob0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBPENvbXBvbmVudENvbnRhaW5lcj4oXCJzYXAudWkuY29yZS5Db21wb25lbnRDb250YWluZXJcIikpIHtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRyb2wuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcblx0XHRvQ29udHJvbCA9IG9Db21wb25lbnQgJiYgb0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHR9XG5cdHdoaWxlIChvQ29udHJvbCAmJiAhb0NvbnRyb2wuaXNBPEZFVmlldz4oXCJzYXAudWkuY29yZS5tdmMuVmlld1wiKSkge1xuXHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdH1cblx0cmV0dXJuIG9Db250cm9sITtcbn1cblxuZnVuY3Rpb24gX2ZuQ2hlY2tJc01hdGNoKG9PYmplY3Q6IG9iamVjdCwgb0tleXNUb0NoZWNrOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuXHRmb3IgKGNvbnN0IHNLZXkgaW4gb0tleXNUb0NoZWNrKSB7XG5cdFx0aWYgKG9LZXlzVG9DaGVja1tzS2V5XSAhPT0gb09iamVjdFtzS2V5IGFzIGtleW9mIHR5cGVvZiBvT2JqZWN0XSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZm5HZXRDb250ZXh0UGF0aFByb3BlcnRpZXMoXG5cdG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRzQ29udGV4dFBhdGg6IHN0cmluZyxcblx0b0ZpbHRlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxQcm9wZXJ0eT4gfCBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4ge1xuXHRjb25zdCBvRW50aXR5VHlwZTogTWV0YU1vZGVsRW50aXR5VHlwZSA9IChtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L2ApIHx8IHt9KSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlLFxuXHRcdG9Qcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxQcm9wZXJ0eT4gfCBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHNLZXkgaW4gb0VudGl0eVR5cGUpIHtcblx0XHRpZiAoXG5cdFx0XHRvRW50aXR5VHlwZS5oYXNPd25Qcm9wZXJ0eShzS2V5KSAmJlxuXHRcdFx0IS9eXFwkL2kudGVzdChzS2V5KSAmJlxuXHRcdFx0b0VudGl0eVR5cGVbc0tleV0uJGtpbmQgJiZcblx0XHRcdF9mbkNoZWNrSXNNYXRjaChvRW50aXR5VHlwZVtzS2V5XSwgb0ZpbHRlciB8fCB7ICRraW5kOiBcIlByb3BlcnR5XCIgfSlcblx0XHQpIHtcblx0XHRcdG9Qcm9wZXJ0aWVzW3NLZXldID0gb0VudGl0eVR5cGVbc0tleV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvUHJvcGVydGllcztcbn1cblxuZnVuY3Rpb24gZm5HZXRJQk5BY3Rpb25zKG9Db250cm9sOiBUYWJsZSB8IE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUsIGFJQk5BY3Rpb25zOiB1bmtub3duW10pIHtcblx0Y29uc3QgYUFjdGlvbnMgPSBvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRBY3Rpb25zKCk7XG5cdGlmIChhQWN0aW9ucykge1xuXHRcdGFBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9BY3Rpb24pIHtcblx0XHRcdGlmIChvQWN0aW9uLmlzQTxBY3Rpb25Ub29sYmFyQWN0aW9uPihcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhci5BY3Rpb25Ub29sYmFyQWN0aW9uXCIpKSB7XG5cdFx0XHRcdG9BY3Rpb24gPSBvQWN0aW9uLmdldEFjdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BY3Rpb24uaXNBPE1lbnVCdXR0b24+KFwic2FwLm0uTWVudUJ1dHRvblwiKSkge1xuXHRcdFx0XHRjb25zdCBvTWVudSA9IG9BY3Rpb24uZ2V0TWVudSgpO1xuXHRcdFx0XHRjb25zdCBhSXRlbXMgPSBvTWVudS5nZXRJdGVtcygpO1xuXHRcdFx0XHRhSXRlbXMuZm9yRWFjaCgob0l0ZW0pID0+IHtcblx0XHRcdFx0XHRpZiAob0l0ZW0uZGF0YShcIklCTkRhdGFcIikpIHtcblx0XHRcdFx0XHRcdGFJQk5BY3Rpb25zLnB1c2gob0l0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9BY3Rpb24uZGF0YShcIklCTkRhdGFcIikpIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMucHVzaChvQWN0aW9uKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gYUlCTkFjdGlvbnM7XG59XG5cbi8qKlxuICogQHBhcmFtIGFJQk5BY3Rpb25zXG4gKiBAcGFyYW0gb1ZpZXdcbiAqL1xuZnVuY3Rpb24gZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9uczogQ29udHJvbFtdLCBvVmlldzogVmlldykge1xuXHRjb25zdCBvUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duIH0+ID0ge307XG5cdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRjb25zdCBpc1N0aWNreSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCgob1ZpZXcuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKSk7XG5cdGNvbnN0IGZuR2V0TGlua3MgPSBmdW5jdGlvbiAob0RhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCkge1xuXHRcdGlmIChvRGF0YSkge1xuXHRcdFx0Y29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhvRGF0YSk7XG5cdFx0XHRhS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKHNLZXkuaW5kZXhPZihcIl9cIikgIT09IDAgJiYgIXNLZXkuaW5jbHVkZXMoXCJvZGF0YS5jb250ZXh0XCIpKSB7XG5cdFx0XHRcdFx0b1BhcmFtc1tzS2V5XSA9IHsgdmFsdWU6IG9EYXRhW3NLZXldIH07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoYUlCTkFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRhSUJOQWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvSUJOQWN0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHNTZW1hbnRpY09iamVjdCA9IG9JQk5BY3Rpb24uZGF0YShcIklCTkRhdGFcIikuc2VtYW50aWNPYmplY3Q7XG5cdFx0XHRcdGNvbnN0IHNBY3Rpb24gPSBvSUJOQWN0aW9uLmRhdGEoXCJJQk5EYXRhXCIpLmFjdGlvbjtcblx0XHRcdFx0b0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdC5nZXRTaGVsbFNlcnZpY2VzKClcblx0XHRcdFx0XHQuZ2V0TGlua3MoW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRhY3Rpb246IHNBY3Rpb24sXG5cdFx0XHRcdFx0XHRcdHBhcmFtczogb1BhcmFtc1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0pXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFMaW5rKSB7XG5cdFx0XHRcdFx0XHRvSUJOQWN0aW9uLnNldFZpc2libGUob0lCTkFjdGlvbi5nZXRWaXNpYmxlKCkgJiYgYUxpbmsgJiYgYUxpbmsubGVuZ3RoID09PSAxICYmIGFMaW5rWzBdICYmIGFMaW5rWzBdLmxlbmd0aCA9PT0gMSk7XG5cdFx0XHRcdFx0XHRpZiAoaXNTdGlja3kpIHtcblx0XHRcdFx0XHRcdFx0KG9JQk5BY3Rpb24uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCkuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0b0lCTkFjdGlvbi5nZXRJZCgpLnNwbGl0KFwiLS1cIilbMV0sXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0c2hlbGxOYXZpZ2F0aW9uTm90QXZhaWxhYmxlOiAhKGFMaW5rICYmIGFMaW5rLmxlbmd0aCA9PT0gMSAmJiBhTGlua1swXSAmJiBhTGlua1swXS5sZW5ndGggPT09IDEpXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbSB0aGUgc2hlbGwgc2VydmljZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblx0aWYgKG9WaWV3ICYmIG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHQob1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dClcblx0XHRcdD8ucmVxdWVzdE9iamVjdCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBmbkdldExpbmtzKG9EYXRhKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgdGhlIGxpbmtzIGZyb20gdGhlIHNoZWxsIHNlcnZpY2VcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRmbkdldExpbmtzKCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0QWN0aW9uUGF0aChhY3Rpb25Db250ZXh0OiBDb250ZXh0LCBiUmV0dXJuT25seVBhdGg6IGJvb2xlYW4sIGluQWN0aW9uTmFtZT86IHN0cmluZywgYkNoZWNrU3RhdGljVmFsdWU/OiBib29sZWFuKSB7XG5cdGNvbnN0IHNBY3Rpb25OYW1lOiBzdHJpbmcgPSAhaW5BY3Rpb25OYW1lID8gYWN0aW9uQ29udGV4dC5nZXRPYmplY3QoYWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpLnRvU3RyaW5nKCkgOiBpbkFjdGlvbk5hbWU7XG5cdGxldCBzQ29udGV4dFBhdGggPSBhY3Rpb25Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIi9AXCIpWzBdO1xuXHRjb25zdCBzRW50aXR5VHlwZU5hbWUgPSAoYWN0aW9uQ29udGV4dC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoKSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKS4kVHlwZTtcblx0Y29uc3Qgc0VudGl0eU5hbWUgPSBnZXRFbnRpdHlTZXROYW1lKGFjdGlvbkNvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCwgc0VudGl0eVR5cGVOYW1lKTtcblx0aWYgKHNFbnRpdHlOYW1lKSB7XG5cdFx0c0NvbnRleHRQYXRoID0gYC8ke3NFbnRpdHlOYW1lfWA7XG5cdH1cblx0aWYgKGJDaGVja1N0YXRpY1ZhbHVlKSB7XG5cdFx0cmV0dXJuIGFjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX1AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlYCk7XG5cdH1cblx0aWYgKGJSZXR1cm5Pbmx5UGF0aCkge1xuXHRcdHJldHVybiBgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9YDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c0NvbnRleHRQYXRoOiBzQ29udGV4dFBhdGgsXG5cdFx0XHRzUHJvcGVydHk6IGFjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX1AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlLyRQYXRoYCksXG5cdFx0XHRzQmluZGluZ1BhcmFtZXRlcjogYWN0aW9uQ29udGV4dC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfS9AJHVpNS5vdmVybG9hZC8wLyRQYXJhbWV0ZXIvMC8kTmFtZWApXG5cdFx0fTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRFbnRpdHlTZXROYW1lKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdGNvbnN0IG9FbnRpdHlDb250YWluZXIgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdGZvciAoY29uc3Qga2V5IGluIG9FbnRpdHlDb250YWluZXIpIHtcblx0XHRpZiAodHlwZW9mIG9FbnRpdHlDb250YWluZXJba2V5XSA9PT0gXCJvYmplY3RcIiAmJiBvRW50aXR5Q29udGFpbmVyW2tleV0uJFR5cGUgPT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRyZXR1cm4ga2V5O1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBjb21wdXRlRGlzcGxheU1vZGUob1Byb3BlcnR5QW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBvQ29sbGVjdGlvbkFubm90YXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcblx0Y29uc3Qgb1RleHRBbm5vdGF0aW9uID0gb1Byb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRcIl0sXG5cdFx0b1RleHRBcnJhbmdlbWVudEFubm90YXRpb24gPSAob1RleHRBbm5vdGF0aW9uICYmXG5cdFx0XHQoKG9Qcm9wZXJ0eUFubm90YXRpb25zICYmXG5cdFx0XHRcdG9Qcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFwiXSkgfHxcblx0XHRcdFx0KG9Db2xsZWN0aW9uQW5ub3RhdGlvbnMgJiZcblx0XHRcdFx0XHRvQ29sbGVjdGlvbkFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFwiXSkpKSBhcyBNZXRhTW9kZWxFbnVtPFRleHRBcnJhbmdlbWVudD47XG5cblx0aWYgKG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dE9ubHlcIikge1xuXHRcdFx0cmV0dXJuIFwiRGVzY3JpcHRpb25cIjtcblx0XHR9IGVsc2UgaWYgKG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dExhc3RcIikge1xuXHRcdFx0cmV0dXJuIFwiVmFsdWVEZXNjcmlwdGlvblwiO1xuXHRcdH0gZWxzZSBpZiAob1RleHRBcnJhbmdlbWVudEFubm90YXRpb24uJEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50VHlwZS9UZXh0U2VwYXJhdGVcIikge1xuXHRcdFx0cmV0dXJuIFwiVmFsdWVcIjtcblx0XHR9XG5cdFx0Ly9EZWZhdWx0IHNob3VsZCBiZSBUZXh0Rmlyc3QgaWYgdGhlcmUgaXMgYSBUZXh0IGFubm90YXRpb24gYW5kIG5laXRoZXIgVGV4dE9ubHkgbm9yIFRleHRMYXN0IGFyZSBzZXRcblx0XHRyZXR1cm4gXCJEZXNjcmlwdGlvblZhbHVlXCI7XG5cdH1cblx0cmV0dXJuIG9UZXh0QW5ub3RhdGlvbiA/IFwiRGVzY3JpcHRpb25WYWx1ZVwiIDogXCJWYWx1ZVwiO1xufVxuXG5mdW5jdGlvbiBfZ2V0RW50aXR5VHlwZShvQ29udGV4dDogT0RhdGFWNENvbnRleHQpIHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSl9LyRUeXBlYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZXF1ZXN0T2JqZWN0KHNBY3Rpb246IHN0cmluZywgb1NlbGVjdGVkQ29udGV4dDogT0RhdGFWNENvbnRleHQsIHNQcm9wZXJ0eTogc3RyaW5nKSB7XG5cdGxldCBvQ29udGV4dCA9IG9TZWxlY3RlZENvbnRleHQ7XG5cdGNvbnN0IG5CcmFja2V0SW5kZXggPSBzQWN0aW9uLmluZGV4T2YoXCIoXCIpO1xuXG5cdGlmIChuQnJhY2tldEluZGV4ID4gLTEpIHtcblx0XHRjb25zdCBzVGFyZ2V0VHlwZSA9IHNBY3Rpb24uc2xpY2UobkJyYWNrZXRJbmRleCArIDEsIC0xKTtcblx0XHRsZXQgc0N1cnJlbnRUeXBlID0gX2dldEVudGl0eVR5cGUob0NvbnRleHQpO1xuXG5cdFx0d2hpbGUgKHNDdXJyZW50VHlwZSAhPT0gc1RhcmdldFR5cGUpIHtcblx0XHRcdC8vIEZpbmQgcGFyZW50IGJpbmRpbmcgY29udGV4dCBhbmQgcmV0cmlldmUgZW50aXR5IHR5cGVcblx0XHRcdG9Db250ZXh0ID0gb0NvbnRleHQuZ2V0QmluZGluZygpLmdldENvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHRzQ3VycmVudFR5cGUgPSBfZ2V0RW50aXR5VHlwZShvQ29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIkNhbm5vdCBkZXRlcm1pbmUgdGFyZ2V0IHR5cGUgdG8gcmVxdWVzdCBwcm9wZXJ0eSB2YWx1ZSBmb3IgYm91bmQgYWN0aW9uIGludm9jYXRpb25cIik7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdE9iamVjdChzUHJvcGVydHkpO1xufVxuXG5leHBvcnQgdHlwZSBfUmVxdWVzdGVkUHJvcGVydHkgPSB7XG5cdHZQcm9wZXJ0eVZhbHVlOiB1bmtub3duO1xuXHRvU2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0O1xuXHRzQWN0aW9uOiBzdHJpbmc7XG5cdHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGg6IHN0cmluZztcbn07XG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UHJvcGVydHkoXG5cdG9TZWxlY3RlZENvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRzQWN0aW9uOiBzdHJpbmcsXG5cdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PiB7XG5cdGNvbnN0IG9Qcm9taXNlID1cblx0XHRzUHJvcGVydHkgJiYgc1Byb3BlcnR5LmluZGV4T2YoXCIvXCIpID09PSAwXG5cdFx0XHQ/IHJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eShzUHJvcGVydHksIG9TZWxlY3RlZENvbnRleHQuZ2V0TW9kZWwoKSlcblx0XHRcdDogX3JlcXVlc3RPYmplY3Qoc0FjdGlvbiwgb1NlbGVjdGVkQ29udGV4dCwgc1Byb3BlcnR5KTtcblxuXHRyZXR1cm4gb1Byb21pc2UudGhlbihmdW5jdGlvbiAodlByb3BlcnR5VmFsdWU6IHVua25vd24pIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dlByb3BlcnR5VmFsdWU6IHZQcm9wZXJ0eVZhbHVlLFxuXHRcdFx0b1NlbGVjdGVkQ29udGV4dDogb1NlbGVjdGVkQ29udGV4dCxcblx0XHRcdHNBY3Rpb246IHNBY3Rpb24sXG5cdFx0XHRzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoOiBzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoXG5cdFx0fTtcblx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZShcblx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0YVJlcXVlc3RQcm9taXNlczogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10sXG5cdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcbikge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlcXVlc3RQcm9taXNlcylcblx0XHQudGhlbihmdW5jdGlvbiAoYVJlc3VsdHMpIHtcblx0XHRcdGlmIChhUmVzdWx0cy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgYUFwcGxpY2FibGVDb250ZXh0czogdW5rbm93bltdID0gW10sXG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVDb250ZXh0czogdW5rbm93bltdID0gW107XG5cdFx0XHRcdGFSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKGFSZXN1bHQpIHtcblx0XHRcdFx0XHRpZiAoYVJlc3VsdCkge1xuXHRcdFx0XHRcdFx0aWYgKGFSZXN1bHQudlByb3BlcnR5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCkuc2V0UHJvcGVydHkoYVJlc3VsdC5zRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0YUFwcGxpY2FibGVDb250ZXh0cy5wdXNoKGFSZXN1bHQub1NlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUNvbnRleHRzLnB1c2goYVJlc3VsdC5vU2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzZXREeW5hbWljQWN0aW9uQ29udGV4dHMoXG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdGFSZXN1bHRzWzBdLnNBY3Rpb24sXG5cdFx0XHRcdFx0YUFwcGxpY2FibGVDb250ZXh0cyxcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUNvbnRleHRzLFxuXHRcdFx0XHRcdGZvckNvbnRleHRNZW51XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSlcblx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLnRyYWNlKFwiQ2Fubm90IHJldHJpZXZlIHByb3BlcnR5IHZhbHVlIGZyb20gcGF0aFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gb0ludGVybmFsTW9kZWxDb250ZXh0XG4gKiBAcGFyYW0gc0FjdGlvblxuICogQHBhcmFtIGFBcHBsaWNhYmxlXG4gKiBAcGFyYW0gYU5vdEFwcGxpY2FibGVcbiAqL1xuZnVuY3Rpb24gc2V0RHluYW1pY0FjdGlvbkNvbnRleHRzKFxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdGFjdGlvbjogc3RyaW5nLFxuXHRhcHBsaWNhYmxlOiB1bmtub3duW10sXG5cdG5vdEFwcGxpY2FibGU6IHVua25vd25bXSxcblx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuKSB7XG5cdGNvbnN0IGR5bmFtaWNBY3Rpb25QYXRoUHJlZml4ID0gYCR7aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9keW5hbWljQWN0aW9ucy8ke2FjdGlvbn1gLFxuXHRcdGludGVybmFsTW9kZWwgPSBpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdGFwcGxpY2FibGVQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwiYUFwcGxpY2FibGVcIiA6IFwiYUFwcGxpY2FibGVGb3JDb250ZXh0TWVudVwiLFxuXHRcdG5vdEFwcGxpY2FibGVQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwiYU5vdEFwcGxpY2FibGVcIiA6IFwiYU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudVwiO1xuXHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KGAke2R5bmFtaWNBY3Rpb25QYXRoUHJlZml4fS8ke2FwcGxpY2FibGVQcm9wZXJ0eX1gLCBhcHBsaWNhYmxlKTtcblx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShgJHtkeW5hbWljQWN0aW9uUGF0aFByZWZpeH0vJHtub3RBcHBsaWNhYmxlUHJvcGVydHl9YCwgbm90QXBwbGljYWJsZSk7XG59XG5cbmZ1bmN0aW9uIF9nZXREZWZhdWx0T3BlcmF0b3JzKHNQcm9wZXJ0eVR5cGU/OiBzdHJpbmcpIHtcblx0Ly8gbWRjIGRlZmluZXMgdGhlIGZ1bGwgc2V0IG9mIG9wZXJhdGlvbnMgdGhhdCBhcmUgbWVhbmluZ2Z1bCBmb3IgZWFjaCBFZG0gVHlwZVxuXHQvLyBUT0RPIFJlcGxhY2Ugd2l0aCBtb2RlbCAvIGludGVybmFsIHdheSBvZiByZXRyaWV2aW5nIHRoZSBhY3R1YWwgbW9kZWwgdHlwZSB1c2VkIGZvciB0aGUgcHJvcGVydHlcblx0Y29uc3Qgb0RhdGFDbGFzcyA9IFR5cGVNYXAuZ2V0RGF0YVR5cGVDbGFzc05hbWUoc1Byb3BlcnR5VHlwZSk7XG5cdC8vIFRPRE8gbmVlZCB0byBwYXNzIHByb3BlciBmb3JtYXRPcHRpb25zLCBjb25zdHJhaW50cyBoZXJlXG5cdGNvbnN0IG9CYXNlVHlwZSA9IFR5cGVNYXAuZ2V0QmFzZVR5cGUob0RhdGFDbGFzcywge30sIHt9KTtcblx0cmV0dXJuIEZpbHRlck9wZXJhdG9yVXRpbC5nZXRPcGVyYXRvcnNGb3JUeXBlKG9CYXNlVHlwZSk7XG59XG5cbmZ1bmN0aW9uIF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcHM6IHN0cmluZ1tdLCBhRXhwcmVzc2lvbk9wczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG5cdC8vIEZyb20gdGhlIGRlZmF1bHQgc2V0IG9mIE9wZXJhdG9ycyBmb3IgdGhlIEJhc2UgVHlwZSwgc2VsZWN0IHRob3NlIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIEFsbG93ZWQgVmFsdWUuXG5cdC8vIEluIGNhc2UgdGhhdCBubyBvcGVyYXRvcnMgYXJlIGZvdW5kLCByZXR1cm4gdW5kZWZpbmVkIHNvIHRoYXQgdGhlIGRlZmF1bHQgc2V0IGlzIHVzZWQuXG5cdHJldHVybiBhRGVmYXVsdE9wcy5maWx0ZXIoZnVuY3Rpb24gKHNFbGVtZW50KSB7XG5cdFx0cmV0dXJuIGFFeHByZXNzaW9uT3BzLmluY2x1ZGVzKHNFbGVtZW50KTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24oYUV4cHJlc3Npb25zOiBzdHJpbmdbXSkge1xuXHRjb25zdCBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkgPSBDb21tb25VdGlscy5BbGxvd2VkRXhwcmVzc2lvbnNQcmlvO1xuXG5cdGFFeHByZXNzaW9ucy5zb3J0KGZ1bmN0aW9uIChhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuXHRcdHJldHVybiBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkuaW5kZXhPZihhKSAtIGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eS5pbmRleE9mKGIpO1xuXHR9KTtcblxuXHRyZXR1cm4gYUV4cHJlc3Npb25zWzBdO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBmZXRjaCB0aGUgY29ycmVjdCBvcGVyYXRvcnMgYmFzZWQgb24gdGhlIGZpbHRlciByZXN0cmljdGlvbnMgdGhhdCBjYW4gYmUgYW5ub3RhdGVkIG9uIGFuIGVudGl0eSBzZXQgb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuICogV2UgcmV0dXJuIHRoZSBjb3JyZWN0IG9wZXJhdG9ycyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHJlc3RyaWN0aW9uIGFuZCBhbHNvIGNoZWNrIGZvciB0aGUgb3BlcmF0b3JzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0IHRvIGluY2x1ZGUgb3IgZXhjbHVkZSB0aGVtLlxuICpcbiAqIEBwYXJhbSBzUHJvcGVydHkgU3RyaW5nIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gc0VudGl0eVNldFBhdGggU3RyaW5nIHBhdGggdG8gdGhlIGVudGl0eSBzZXRcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHVzZWQgZHVyaW5nIHRlbXBsYXRpbmdcbiAqIEBwYXJhbSBzVHlwZSBTdHJpbmcgZGF0YSB0eXBlIG9kIHRoZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGUgZWRtLkRhdGVcbiAqIEBwYXJhbSBiVXNlU2VtYW50aWNEYXRlUmFuZ2UgQm9vbGVhbiBwYXNzZWQgZnJvbSB0aGUgbWFuaWZlc3QgZm9yIHNlbWFudGljIGRhdGUgcmFuZ2VcbiAqIEBwYXJhbSBzZXR0aW5ncyBTdHJpbmdpZmllZCBvYmplY3Qgb2YgdGhlIHByb3BlcnR5IHNldHRpbmdzIG9yIHByb3BlcnR5IHNldHRpbmdzIGFzIGEgd2hvbGVcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIG9wZXJhdG9ycyBmb3IgZmlsdGVyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eShcblx0c1Byb3BlcnR5OiBzdHJpbmcsXG5cdHNFbnRpdHlTZXRQYXRoOiBzdHJpbmcsXG5cdG9Db250ZXh0OiBPRGF0YU1ldGFNb2RlbCxcblx0c1R5cGU/OiBzdHJpbmcsXG5cdGJVc2VTZW1hbnRpY0RhdGVSYW5nZT86IGJvb2xlYW4gfCBzdHJpbmcsXG5cdHNldHRpbmdzPzogRmlsdGVyU2V0dGluZ3MgfCBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3Qgb0ZpbHRlclJlc3RyaWN0aW9ucyA9IENvbW1vblV0aWxzLmdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aChzRW50aXR5U2V0UGF0aCwgb0NvbnRleHQpO1xuXHRjb25zdCBhRXF1YWxzT3BzID0gW1wiRVFcIl07XG5cdGNvbnN0IGFTaW5nbGVSYW5nZU9wcyA9IFtcIkVRXCIsIFwiR0VcIiwgXCJMRVwiLCBcIkxUXCIsIFwiR1RcIiwgXCJCVFwiLCBcIk5PVExFXCIsIFwiTk9UTFRcIiwgXCJOT1RHRVwiLCBcIk5PVEdUXCJdO1xuXHRjb25zdCBhU2luZ2xlUmFuZ2VEVEJhc2ljT3BzID0gW1wiRVFcIiwgXCJCVFwiXTtcblx0Y29uc3QgYVNpbmdsZVZhbHVlRGF0ZU9wcyA9IFtcblx0XHRcIlRPREFZXCIsXG5cdFx0XCJUT01PUlJPV1wiLFxuXHRcdFwiWUVTVEVSREFZXCIsXG5cdFx0XCJEQVRFXCIsXG5cdFx0XCJGSVJTVERBWVdFRUtcIixcblx0XHRcIkxBU1REQVlXRUVLXCIsXG5cdFx0XCJGSVJTVERBWU1PTlRIXCIsXG5cdFx0XCJMQVNUREFZTU9OVEhcIixcblx0XHRcIkZJUlNUREFZUVVBUlRFUlwiLFxuXHRcdFwiTEFTVERBWVFVQVJURVJcIixcblx0XHRcIkZJUlNUREFZWUVBUlwiLFxuXHRcdFwiTEFTVERBWVlFQVJcIlxuXHRdO1xuXHRjb25zdCBhTXVsdGlSYW5nZU9wcyA9IFtcIkVRXCIsIFwiR0VcIiwgXCJMRVwiLCBcIkxUXCIsIFwiR1RcIiwgXCJCVFwiLCBcIk5FXCIsIFwiTk9UQlRcIiwgXCJOT1RMRVwiLCBcIk5PVExUXCIsIFwiTk9UR0VcIiwgXCJOT1RHVFwiXTtcblx0Y29uc3QgYVNlYXJjaEV4cHJlc3Npb25PcHMgPSBbXCJDb250YWluc1wiLCBcIk5vdENvbnRhaW5zXCIsIFwiU3RhcnRzV2l0aFwiLCBcIk5vdFN0YXJ0c1dpdGhcIiwgXCJFbmRzV2l0aFwiLCBcIk5vdEVuZHNXaXRoXCJdO1xuXHRjb25zdCBhU2VtYW50aWNEYXRlT3BzRXh0ID0gU2VtYW50aWNEYXRlT3BlcmF0b3JzLmdldFN1cHBvcnRlZE9wZXJhdGlvbnMoKTtcblx0Y29uc3QgYlNlbWFudGljRGF0ZVJhbmdlID0gYlVzZVNlbWFudGljRGF0ZVJhbmdlID09PSBcInRydWVcIiB8fCBiVXNlU2VtYW50aWNEYXRlUmFuZ2UgPT09IHRydWU7XG5cdGxldCBhU2VtYW50aWNEYXRlT3BzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBvU2V0dGluZ3MgPSBzZXR0aW5ncyAmJiB0eXBlb2Ygc2V0dGluZ3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHNldHRpbmdzKS5jdXN0b21EYXRhIDogc2V0dGluZ3M7XG5cblx0aWYgKChvQ29udGV4dC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dGApIGFzIHVua25vd24pID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuIGFFcXVhbHNPcHM7XG5cdH1cblxuXHRpZiAob1NldHRpbmdzICYmIG9TZXR0aW5ncy5vcGVyYXRvckNvbmZpZ3VyYXRpb24gJiYgb1NldHRpbmdzLm9wZXJhdG9yQ29uZmlndXJhdGlvbi5sZW5ndGggPiAwKSB7XG5cdFx0YVNlbWFudGljRGF0ZU9wcyA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRGaWx0ZXJPcGVyYXRpb25zKG9TZXR0aW5ncy5vcGVyYXRvckNvbmZpZ3VyYXRpb24sIHNUeXBlKTtcblx0fSBlbHNlIHtcblx0XHRhU2VtYW50aWNEYXRlT3BzID0gU2VtYW50aWNEYXRlT3BlcmF0b3JzLmdldFNlbWFudGljRGF0ZU9wZXJhdGlvbnMoc1R5cGUpO1xuXHR9XG5cdC8vIEdldCB0aGUgZGVmYXVsdCBPcGVyYXRvcnMgZm9yIHRoaXMgUHJvcGVydHkgVHlwZVxuXHRsZXQgYURlZmF1bHRPcGVyYXRvcnMgPSBfZ2V0RGVmYXVsdE9wZXJhdG9ycyhzVHlwZSk7XG5cdGlmIChiU2VtYW50aWNEYXRlUmFuZ2UpIHtcblx0XHRhRGVmYXVsdE9wZXJhdG9ycyA9IGFTZW1hbnRpY0RhdGVPcHNFeHQuY29uY2F0KGFEZWZhdWx0T3BlcmF0b3JzKTtcblx0fVxuXHRsZXQgcmVzdHJpY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG5cdC8vIElzIHRoZXJlIGEgRmlsdGVyIFJlc3RyaWN0aW9uIGRlZmluZWQgZm9yIHRoaXMgcHJvcGVydHk/XG5cdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zICYmIG9GaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zICYmIG9GaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zW3NQcm9wZXJ0eV0pIHtcblx0XHQvLyBFeHRlbmRpbmcgdGhlIGRlZmF1bHQgb3BlcmF0b3JzIGxpc3Qgd2l0aCBTZW1hbnRpYyBEYXRlIG9wdGlvbnMgREFURVJBTkdFLCBEQVRFLCBGUk9NIGFuZCBUT1xuXHRcdGNvbnN0IHNBbGxvd2VkRXhwcmVzc2lvbiA9IENvbW1vblV0aWxzLmdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24ob0ZpbHRlclJlc3RyaWN0aW9ucy5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNbc1Byb3BlcnR5XSk7XG5cdFx0Ly8gSW4gY2FzZSBtb3JlIHRoYW4gb25lIEFsbG93ZWQgRXhwcmVzc2lvbnMgaGFzIGJlZW4gZGVmaW5lZCBmb3IgYSBwcm9wZXJ0eVxuXHRcdC8vIGNob29zZSB0aGUgbW9zdCByZXN0cmljdGl2ZSBBbGxvd2VkIEV4cHJlc3Npb25cblxuXHRcdC8vIE11bHRpVmFsdWUgaGFzIHNhbWUgT3BlcmF0b3IgYXMgU2luZ2xlVmFsdWUsIGJ1dCB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSAobWF4Q29uZGl0aW9ucylcblx0XHRzd2l0Y2ggKHNBbGxvd2VkRXhwcmVzc2lvbikge1xuXHRcdFx0Y2FzZSBcIlNpbmdsZVZhbHVlXCI6XG5cdFx0XHRcdGNvbnN0IGFTaW5nbGVWYWx1ZU9wcyA9IHNUeXBlID09PSBcIkVkbS5EYXRlXCIgJiYgYlNlbWFudGljRGF0ZVJhbmdlID8gYVNpbmdsZVZhbHVlRGF0ZU9wcyA6IGFFcXVhbHNPcHM7XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFTaW5nbGVWYWx1ZU9wcyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk11bHRpVmFsdWVcIjpcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYUVxdWFsc09wcyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIlNpbmdsZVJhbmdlXCI6XG5cdFx0XHRcdGxldCBhRXhwcmVzc2lvbk9wczogc3RyaW5nW107XG5cdFx0XHRcdGlmIChiU2VtYW50aWNEYXRlUmFuZ2UpIHtcblx0XHRcdFx0XHRpZiAoc1R5cGUgPT09IFwiRWRtLkRhdGVcIikge1xuXHRcdFx0XHRcdFx0YUV4cHJlc3Npb25PcHMgPSBhU2VtYW50aWNEYXRlT3BzO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc1R5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNlbWFudGljRGF0ZU9wcztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YUV4cHJlc3Npb25PcHMgPSBhU2luZ2xlUmFuZ2VPcHM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHNUeXBlID09PSBcIkVkbS5EYXRlVGltZU9mZnNldFwiKSB7XG5cdFx0XHRcdFx0YUV4cHJlc3Npb25PcHMgPSBhU2luZ2xlUmFuZ2VEVEJhc2ljT3BzO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNpbmdsZVJhbmdlT3BzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHNPcGVyYXRvcnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhRXhwcmVzc2lvbk9wcyk7XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IHNPcGVyYXRvcnM7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk11bHRpUmFuZ2VcIjpcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYU11bHRpUmFuZ2VPcHMpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJTZWFyY2hFeHByZXNzaW9uXCI6XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFTZWFyY2hFeHByZXNzaW9uT3BzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblwiOlxuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhU2VhcmNoRXhwcmVzc2lvbk9wcy5jb25jYXQoYU11bHRpUmFuZ2VPcHMpKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0Ly8gSW4gY2FzZSBBbGxvd2VkRXhwcmVzc2lvbnMgaXMgbm90IHJlY29nbmlzZWQsIHVuZGVmaW5lZCBpbiByZXR1cm4gcmVzdWx0cyBpbiB0aGUgZGVmYXVsdCBzZXQgb2Zcblx0XHQvLyBvcGVyYXRvcnMgZm9yIHRoZSB0eXBlLlxuXHR9XG5cdHJldHVybiByZXN0cmljdGlvbnM7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHJldHVybiBhbGxvd2VkIG9wZXJhdG9ycyBmb3IgdHlwZSBHdWlkLlxuICpcbiAqIEByZXR1cm5zIEFsbG93ZWQgb3BlcmF0b3JzIGZvciB0eXBlIEd1aWRcbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0b3JzRm9yR3VpZFByb3BlcnR5KCk6IHN0cmluZyB7XG5cdGNvbnN0IGFsbG93ZWRPcGVyYXRvcnNGb3JHdWlkID0gW1wiRVFcIiwgXCJORVwiXTtcblx0cmV0dXJuIGFsbG93ZWRPcGVyYXRvcnNGb3JHdWlkLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGdldE9wZXJhdG9yc0ZvckRhdGVQcm9wZXJ0eShwcm9wZXJ0eVR5cGU6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Ly8gSW4gY2FzZSBBbGxvd2VkRXhwcmVzc2lvbnMgaXMgbm90IHByb3ZpZGVkIGZvciB0eXBlIEVkbS5EYXRlIHRoZW4gYWxsIHRoZSBkZWZhdWx0XG5cdC8vIG9wZXJhdG9ycyBmb3IgdGhlIHR5cGUgc2hvdWxkIGJlIHJldHVybmVkIGV4Y2x1ZGluZyBzZW1hbnRpYyBvcGVyYXRvcnMgZnJvbSB0aGUgbGlzdC5cblx0Y29uc3QgYURlZmF1bHRPcGVyYXRvcnMgPSBfZ2V0RGVmYXVsdE9wZXJhdG9ycyhwcm9wZXJ0eVR5cGUpO1xuXHRjb25zdCBhTXVsdGlSYW5nZU9wcyA9IFtcIkVRXCIsIFwiR0VcIiwgXCJMRVwiLCBcIkxUXCIsIFwiR1RcIiwgXCJCVFwiLCBcIk5FXCIsIFwiTk9UQlRcIiwgXCJOT1RMRVwiLCBcIk5PVExUXCIsIFwiTk9UR0VcIiwgXCJOT1RHVFwiXTtcblx0cmV0dXJuIF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFNdWx0aVJhbmdlT3BzKTtcbn1cblxudHlwZSBQYXJhbWV0ZXJJbmZvID0ge1xuXHRjb250ZXh0UGF0aD86IHN0cmluZztcblx0cGFyYW1ldGVyUHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbFByb3BlcnR5Pjtcbn07XG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJJbmZvKG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLCBzQ29udGV4dFBhdGg6IHN0cmluZykge1xuXHRjb25zdCBzUGFyYW1ldGVyQ29udGV4dFBhdGggPSBzQ29udGV4dFBhdGguc3Vic3RyaW5nKDAsIHNDb250ZXh0UGF0aC5sYXN0SW5kZXhPZihcIi9cIikpO1xuXHRjb25zdCBiUmVzdWx0Q29udGV4dCA9IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke3NQYXJhbWV0ZXJDb250ZXh0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCk7XG5cdGNvbnN0IG9QYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvID0ge307XG5cdGlmIChiUmVzdWx0Q29udGV4dCAmJiBzUGFyYW1ldGVyQ29udGV4dFBhdGggIT09IHNDb250ZXh0UGF0aCkge1xuXHRcdG9QYXJhbWV0ZXJJbmZvLmNvbnRleHRQYXRoID0gc1BhcmFtZXRlckNvbnRleHRQYXRoO1xuXHRcdG9QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlclByb3BlcnRpZXMgPSBDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMobWV0YU1vZGVsQ29udGV4dCwgc1BhcmFtZXRlckNvbnRleHRQYXRoKTtcblx0fVxuXHRyZXR1cm4gb1BhcmFtZXRlckluZm87XG59XG5cbnR5cGUgVmlld0RhdGEgPSB7XG5cdGNvbnRyb2xDb25maWd1cmF0aW9uPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufTtcblxuZnVuY3Rpb24gYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQob1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsIG1QYWdlQ29udGV4dDogdW5rbm93bltdLCBvVmlldzogVmlldykge1xuXHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KTtcblx0Y29uc3Qgb05hdmlnYXRpb25TZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXROYXZpZ2F0aW9uU2VydmljZSgpO1xuXHRyZXR1cm4gb05hdmlnYXRpb25TZXJ2aWNlLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KG1QYWdlQ29udGV4dCwgb1NlbGVjdGlvblZhcmlhbnQudG9KU09OU3RyaW5nKCkpO1xufVxuXG5mdW5jdGlvbiBpc1N0aWNreUVkaXRNb2RlKG9Db250cm9sOiBDb250cm9sKSB7XG5cdGNvbnN0IGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQoKG9Db250cm9sLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRjb25zdCBiVUlFZGl0YWJsZSA9IChvQ29udHJvbC5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbCkuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblx0cmV0dXJuIGJJc1N0aWNreU1vZGUgJiYgYlVJRWRpdGFibGU7XG59XG5cbmV4cG9ydCB0eXBlIFVzZXJEZWZhdWx0UGFyYW1ldGVyID1cblx0fCB7XG5cdFx0XHQkTmFtZTogc3RyaW5nO1xuXHRcdFx0JFR5cGU/OiBzdHJpbmc7XG5cdCAgfVxuXHR8IENvbnRleHQ7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB1c2VyIGRlZmF1bHRzIGZyb20gdGhlIHN0YXJ0dXAgYXBwIHN0YXRlIChpZiBhdmFpbGFibGUpIG9yIHRoZSBzdGFydHVwIHBhcmFtZXRlciBhbmQgc2V0cyB0aGVtIHRvIGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIGFwcENvbXBvbmVudFxuICogQHBhcmFtIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBtb2RlbFxuICogQHBhcmFtIGlzQWN0aW9uXG4gKiBAcGFyYW0gaXNDcmVhdGVcbiAqIEBwYXJhbSBhY3Rpb25EZWZhdWx0VmFsdWVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldFVzZXJEZWZhdWx0cyhcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdHBhcmFtZXRlcnM6IFVzZXJEZWZhdWx0UGFyYW1ldGVyW10sXG5cdG1vZGVsOiBKU09OTW9kZWwgfCBPRGF0YVY0Q29udGV4dCxcblx0aXNBY3Rpb246IGJvb2xlYW4sXG5cdGlzQ3JlYXRlPzogYm9vbGVhbixcblx0YWN0aW9uRGVmYXVsdFZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3QgY29tcG9uZW50RGF0YSA9IGFwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCksXG5cdFx0c3RhcnR1cFBhcmFtZXRlcnMgPSAoY29tcG9uZW50RGF0YSAmJiBjb21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzKSB8fCB7fSxcblx0XHRzaGVsbFNlcnZpY2VzID0gYXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKTtcblx0Y29uc3Qgc3RhcnR1cEFwcFN0YXRlID0gYXdhaXQgc2hlbGxTZXJ2aWNlcy5nZXRTdGFydHVwQXBwU3RhdGUoYXBwQ29tcG9uZW50KTtcblx0Y29uc3Qgc3RhcnR1cEFwcFN0YXRlRGF0YSA9IHN0YXJ0dXBBcHBTdGF0ZT8uZ2V0RGF0YSgpIHx8IHt9LFxuXHRcdGV4dGVuZGVkUGFyYW1ldGVycyA9IChzdGFydHVwQXBwU3RhdGVEYXRhLnNlbGVjdGlvblZhcmlhbnQgJiYgc3RhcnR1cEFwcFN0YXRlRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMpIHx8IFtdO1xuXHRwYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKG9QYXJhbWV0ZXIpIHtcblx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gaXNBY3Rpb25cblx0XHRcdD8gYC8keyhvUGFyYW1ldGVyIGFzIHsgJE5hbWU6IHN0cmluZyB9KS4kTmFtZX1gXG5cdFx0XHQ6IChvUGFyYW1ldGVyIGFzIENvbnRleHQpLmdldFBhdGg/LigpLnNsaWNlKChvUGFyYW1ldGVyIGFzIENvbnRleHQpLmdldFBhdGgoKS5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcblx0XHRjb25zdCBzUGFyYW1ldGVyTmFtZSA9IGlzQWN0aW9uID8gc1Byb3BlcnR5TmFtZS5zbGljZSgxKSA6IHNQcm9wZXJ0eU5hbWU7XG5cdFx0aWYgKGFjdGlvbkRlZmF1bHRWYWx1ZXMgJiYgaXNDcmVhdGUpIHtcblx0XHRcdGlmIChhY3Rpb25EZWZhdWx0VmFsdWVzW3NQYXJhbWV0ZXJOYW1lXSkge1xuXHRcdFx0XHRtb2RlbC5zZXRQcm9wZXJ0eShzUHJvcGVydHlOYW1lLCBhY3Rpb25EZWZhdWx0VmFsdWVzW3NQYXJhbWV0ZXJOYW1lXSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzdGFydHVwUGFyYW1ldGVyc1tzUGFyYW1ldGVyTmFtZV0pIHtcblx0XHRcdGNvbnN0IHBhcmFtZXRlcnRUeXBlID0gKFxuXHRcdFx0XHRvUGFyYW1ldGVyIGFzIHtcblx0XHRcdFx0XHQkTmFtZTogc3RyaW5nO1xuXHRcdFx0XHRcdCRUeXBlPzogc3RyaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHQpLiRUeXBlXG5cdFx0XHRcdD8gVHlwZU1hcC5nZXRCYXNlVHlwZShcblx0XHRcdFx0XHRcdChcblx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlciBhcyB7XG5cdFx0XHRcdFx0XHRcdFx0JE5hbWU6IHN0cmluZztcblx0XHRcdFx0XHRcdFx0XHQkVHlwZTogc3RyaW5nO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpLiRUeXBlXG5cdFx0XHRcdCAgKVxuXHRcdFx0XHQ6IEJhc2VUeXBlLlN0cmluZztcblx0XHRcdGNvbnN0IHR5cGVJbnN0YW5jZSA9IFR5cGVNYXAuZ2V0RGF0YVR5cGVJbnN0YW5jZShwYXJhbWV0ZXJ0VHlwZSk7XG5cdFx0XHRtb2RlbC5zZXRQcm9wZXJ0eShzUHJvcGVydHlOYW1lLCB0eXBlSW5zdGFuY2UucGFyc2VWYWx1ZShzdGFydHVwUGFyYW1ldGVyc1tzUGFyYW1ldGVyTmFtZV1bMF0sIFwic3RyaW5nXCIpKTtcblx0XHR9IGVsc2UgaWYgKGV4dGVuZGVkUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG9FeHRlbmRlZFBhcmFtZXRlciBvZiBleHRlbmRlZFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0aWYgKG9FeHRlbmRlZFBhcmFtZXRlci5Qcm9wZXJ0eU5hbWUgPT09IHNQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1JhbmdlID0gb0V4dGVuZGVkUGFyYW1ldGVyLlJhbmdlcy5sZW5ndGhcblx0XHRcdFx0XHRcdD8gb0V4dGVuZGVkUGFyYW1ldGVyLlJhbmdlc1tvRXh0ZW5kZWRQYXJhbWV0ZXIuUmFuZ2VzLmxlbmd0aCAtIDFdXG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRpZiAob1JhbmdlICYmIG9SYW5nZS5TaWduID09PSBcIklcIiAmJiBvUmFuZ2UuT3B0aW9uID09PSBcIkVRXCIpIHtcblx0XHRcdFx0XHRcdG1vZGVsLnNldFByb3BlcnR5KHNQcm9wZXJ0eU5hbWUsIG9SYW5nZS5Mb3cpOyAvLyBoaWdoIGlzIGlnbm9yZWQgd2hlbiBPcHRpb249RVFcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5leHBvcnQgdHlwZSBJbmJvdW5kUGFyYW1ldGVyID0ge1xuXHR1c2VGb3JDcmVhdGU6IGJvb2xlYW47XG59O1xuZnVuY3Rpb24gZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZShcblx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duW10+LFxuXHRvSW5ib3VuZFBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBJbmJvdW5kUGFyYW1ldGVyPlxuKSB7XG5cdGNvbnN0IG9JbmJvdW5kcyA9IG9JbmJvdW5kUGFyYW1ldGVycyxcblx0XHRhQ3JlYXRlUGFyYW1ldGVycyA9XG5cdFx0XHRvSW5ib3VuZHMgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IE9iamVjdC5rZXlzKG9JbmJvdW5kcykuZmlsdGVyKGZ1bmN0aW9uIChzUGFyYW1ldGVyOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvSW5ib3VuZHNbc1BhcmFtZXRlcl0udXNlRm9yQ3JlYXRlO1xuXHRcdFx0XHQgIH0pXG5cdFx0XHRcdDogW107XG5cdGxldCBvUmV0O1xuXHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYUNyZWF0ZVBhcmFtZXRlcnMpIHtcblx0XHRjb25zdCBzQ3JlYXRlUGFyYW1ldGVyID0gZWxlbWVudDtcblx0XHRjb25zdCBhVmFsdWVzID0gb1N0YXJ0dXBQYXJhbWV0ZXJzICYmIG9TdGFydHVwUGFyYW1ldGVyc1tzQ3JlYXRlUGFyYW1ldGVyXTtcblx0XHRpZiAoYVZhbHVlcyAmJiBhVmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0b1JldCA9IG9SZXQgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0XHRcdG9SZXRbc0NyZWF0ZVBhcmFtZXRlcl0gPSBhVmFsdWVzWzBdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb1JldDtcbn1cbnR5cGUgT3V0Ym91bmRQYXJhbWV0ZXIgPSB7XG5cdHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIE91dGJvdW5kUGFyYW1ldGVyVmFsdWU+O1xuXHRzZW1hbnRpY09iamVjdD86IHN0cmluZztcblx0YWN0aW9uPzogc3RyaW5nO1xufTtcbnR5cGUgT3V0Ym91bmRQYXJhbWV0ZXJWYWx1ZSA9IHtcblx0dmFsdWU/OiB7XG5cdFx0dmFsdWU/OiBzdHJpbmc7XG5cdFx0Zm9ybWF0Pzogc3RyaW5nO1xuXHR9O1xufTtcbmZ1bmN0aW9uIGdldFNlbWFudGljT2JqZWN0TWFwcGluZyhvT3V0Ym91bmQ6IE91dGJvdW5kUGFyYW1ldGVyKSB7XG5cdGNvbnN0IGFTZW1hbnRpY09iamVjdE1hcHBpbmc6IE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXSA9IFtdO1xuXHRpZiAob091dGJvdW5kLnBhcmFtZXRlcnMpIHtcblx0XHRjb25zdCBhUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9PdXRib3VuZC5wYXJhbWV0ZXJzKSB8fCBbXTtcblx0XHRpZiAoYVBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0YVBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc1BhcmFtOiBzdHJpbmcpIHtcblx0XHRcdFx0Y29uc3Qgb01hcHBpbmcgPSBvT3V0Ym91bmQucGFyYW1ldGVyc1tzUGFyYW1dO1xuXHRcdFx0XHRpZiAob01hcHBpbmcudmFsdWUgJiYgb01hcHBpbmcudmFsdWUudmFsdWUgJiYgb01hcHBpbmcudmFsdWUuZm9ybWF0ID09PSBcImJpbmRpbmdcIikge1xuXHRcdFx0XHRcdC8vIHVzaW5nIHRoZSBmb3JtYXQgb2YgVUkuTWFwcGluZ1xuXHRcdFx0XHRcdGNvbnN0IG9TZW1hbnRpY01hcHBpbmcgPSB7XG5cdFx0XHRcdFx0XHRMb2NhbFByb3BlcnR5OiB7XG5cdFx0XHRcdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IG9NYXBwaW5nLnZhbHVlLnZhbHVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0U2VtYW50aWNPYmplY3RQcm9wZXJ0eTogc1BhcmFtXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChhU2VtYW50aWNPYmplY3RNYXBwaW5nLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdC8vIFRvIGNoZWNrIGlmIHRoZSBzZW1hbnRpY09iamVjdCBNYXBwaW5nIGlzIGRvbmUgZm9yIHRoZSBzYW1lIGxvY2FsIHByb3BlcnR5IG1vcmUgdGhhdCBvbmNlIHRoZW4gZmlyc3Qgb25lIHdpbGwgYmUgY29uc2lkZXJlZFxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGFTZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQuTG9jYWxQcm9wZXJ0eT8uJFByb3BlcnR5UGF0aCAhPT0gb1NlbWFudGljTWFwcGluZy5Mb2NhbFByb3BlcnR5LiRQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRhU2VtYW50aWNPYmplY3RNYXBwaW5nLnB1c2gob1NlbWFudGljTWFwcGluZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YVNlbWFudGljT2JqZWN0TWFwcGluZy5wdXNoKG9TZW1hbnRpY01hcHBpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhU2VtYW50aWNPYmplY3RNYXBwaW5nO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24ob1ZpZXdEYXRhOiBWaWV3RGF0YSwgb0Nyb3NzTmF2OiBSZWNvcmQ8c3RyaW5nLCBPdXRib3VuZFBhcmFtZXRlcj4pIHtcblx0Y29uc3Qgb0hlYWRlckZhY2V0SXRlbXM6IFJlY29yZDxcblx0XHRzdHJpbmcsXG5cdFx0e1xuXHRcdFx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0XHRcdGFjdGlvbjogc3RyaW5nO1xuXHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nOiBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W107XG5cdFx0fVxuXHQ+ID0ge307XG5cdGxldCBzSWQ7XG5cdGNvbnN0IG9Db250cm9sQ29uZmlnID0gb1ZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uIGFzIFJlY29yZDxcblx0XHRzdHJpbmcsXG5cdFx0e1xuXHRcdFx0bmF2aWdhdGlvbj86IHtcblx0XHRcdFx0dGFyZ2V0T3V0Ym91bmQ/OiB7XG5cdFx0XHRcdFx0b3V0Ym91bmQ6IHN0cmluZztcblx0XHRcdFx0fTtcblx0XHRcdH07XG5cdFx0fVxuXHQ+O1xuXHRmb3IgKGNvbnN0IGNvbmZpZyBpbiBvQ29udHJvbENvbmZpZykge1xuXHRcdGlmIChjb25maWcuaW5jbHVkZXMoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50XCIpIHx8IGNvbmZpZy5pbmNsdWRlcyhcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydFwiKSkge1xuXHRcdFx0Y29uc3Qgc091dGJvdW5kID0gb0NvbnRyb2xDb25maWdbY29uZmlnXS5uYXZpZ2F0aW9uPy50YXJnZXRPdXRib3VuZD8ub3V0Ym91bmQ7XG5cdFx0XHRpZiAoc091dGJvdW5kICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3Qgb091dGJvdW5kID0gb0Nyb3NzTmF2W3NPdXRib3VuZF07XG5cdFx0XHRcdGlmIChvT3V0Ym91bmQuc2VtYW50aWNPYmplY3QgJiYgb091dGJvdW5kLmFjdGlvbikge1xuXHRcdFx0XHRcdGlmIChjb25maWcuaW5jbHVkZXMoXCJDaGFydFwiKSkge1xuXHRcdFx0XHRcdFx0c0lkID0gZ2VuZXJhdGUoW1wiZmVcIiwgXCJNaWNyb0NoYXJ0TGlua1wiLCBjb25maWddKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c0lkID0gZ2VuZXJhdGUoW1wiZmVcIiwgXCJIZWFkZXJEUExpbmtcIiwgY29uZmlnXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdE1hcHBpbmcob091dGJvdW5kKTtcblx0XHRcdFx0XHRvSGVhZGVyRmFjZXRJdGVtc1tzSWRdID0ge1xuXHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG9PdXRib3VuZC5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdGFjdGlvbjogb091dGJvdW5kLmFjdGlvbixcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZzogYVNlbWFudGljT2JqZWN0TWFwcGluZ1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBDcm9zcyBuYXZpZ2F0aW9uIG91dGJvdW5kIGlzIGNvbmZpZ3VyZWQgd2l0aG91dCBzZW1hbnRpYyBvYmplY3QgYW5kIGFjdGlvbiBmb3IgJHtzT3V0Ym91bmR9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9IZWFkZXJGYWNldEl0ZW1zO1xufVxuXG5mdW5jdGlvbiBzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzKG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LCB2TWFwcGluZ3M6IHVua25vd24pIHtcblx0Y29uc3Qgb01hcHBpbmdzID0gdHlwZW9mIHZNYXBwaW5ncyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uodk1hcHBpbmdzKSA6IHZNYXBwaW5ncztcblx0Zm9yIChjb25zdCBlbGVtZW50IG9mIG9NYXBwaW5ncykge1xuXHRcdGNvbnN0IHNMb2NhbFByb3BlcnR5ID1cblx0XHRcdChlbGVtZW50W1wiTG9jYWxQcm9wZXJ0eVwiXSAmJiBlbGVtZW50W1wiTG9jYWxQcm9wZXJ0eVwiXVtcIiRQcm9wZXJ0eVBhdGhcIl0pIHx8XG5cdFx0XHQoZWxlbWVudFtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTG9jYWxQcm9wZXJ0eVwiXSAmJiBlbGVtZW50W1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Mb2NhbFByb3BlcnR5XCJdW1wiJFBhdGhcIl0pO1xuXHRcdGNvbnN0IHNTZW1hbnRpY09iamVjdFByb3BlcnR5ID1cblx0XHRcdGVsZW1lbnRbXCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCJdIHx8IGVsZW1lbnRbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlbWFudGljT2JqZWN0UHJvcGVydHlcIl07XG5cdFx0Y29uc3Qgb1NlbGVjdE9wdGlvbiA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSk7XG5cdFx0aWYgKG9TZWxlY3RPcHRpb24pIHtcblx0XHRcdC8vQ3JlYXRlIGEgbmV3IFNlbGVjdE9wdGlvbiB3aXRoIHNTZW1hbnRpY09iamVjdFByb3BlcnR5IGFzIHRoZSBwcm9wZXJ0eSBOYW1lIGFuZCByZW1vdmUgdGhlIG9sZGVyIG9uZVxuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKHNMb2NhbFByb3BlcnR5KTtcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50Lm1hc3NBZGRTZWxlY3RPcHRpb24oc1NlbWFudGljT2JqZWN0UHJvcGVydHksIG9TZWxlY3RPcHRpb24pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb1NlbGVjdGlvblZhcmlhbnQ7XG59XG5cbnR5cGUgU2VtYW50aWNPYmplY3RGcm9tUGF0aCA9IHtcblx0c2VtYW50aWNPYmplY3RQYXRoOiBzdHJpbmc7XG5cdHNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3M6IHsgc2VtYW50aWNPYmplY3Q6IHN0cmluZyB9W107XG5cdHNlbWFudGljT2JqZWN0OiB7XG5cdFx0c2VtYW50aWNPYmplY3Q6IHsgJFBhdGg6IHN0cmluZyB9O1xuXHR9O1xuXHR1bmF2YWlsYWJsZUFjdGlvbnM6IHN0cmluZ1tdO1xufTtcbmFzeW5jIGZ1bmN0aW9uIGZuR2V0U2VtYW50aWNPYmplY3RzRnJvbVBhdGgob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNQYXRoOiBzdHJpbmcsIHNRdWFsaWZpZXI6IHN0cmluZykge1xuXHRyZXR1cm4gbmV3IFByb21pc2U8U2VtYW50aWNPYmplY3RGcm9tUGF0aD4oZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRsZXQgc1NlbWFudGljT2JqZWN0LCBhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnM7XG5cdFx0aWYgKHNRdWFsaWZpZXIgPT09IFwiXCIpIHtcblx0XHRcdHNTZW1hbnRpY09iamVjdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdH1gKTtcblx0XHRcdGFTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uc31gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c1NlbWFudGljT2JqZWN0ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0fSMke3NRdWFsaWZpZXJ9YCk7XG5cdFx0XHRhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdFx0YCR7c1BhdGh9QCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zfSMke3NRdWFsaWZpZXJ9YFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RGb3JHZXRMaW5rcyA9IFt7IHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3QgfV07XG5cdFx0Y29uc3Qgb1NlbWFudGljT2JqZWN0ID0ge1xuXHRcdFx0c2VtYW50aWNPYmplY3Q6IHNTZW1hbnRpY09iamVjdFxuXHRcdH07XG5cdFx0cmVzb2x2ZSh7XG5cdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNQYXRoLFxuXHRcdFx0c2VtYW50aWNPYmplY3RGb3JHZXRMaW5rczogYVNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MsXG5cdFx0XHRzZW1hbnRpY09iamVjdDogb1NlbWFudGljT2JqZWN0LFxuXHRcdFx0dW5hdmFpbGFibGVBY3Rpb25zOiBhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnNcblx0XHR9KTtcblx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZuR2V0U2VtYW50aWNPYmplY3RQcm9taXNlKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzUGF0aDogc3RyaW5nLCBzUXVhbGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFNlbWFudGljT2JqZWN0RnJvbVBhdGg+IHtcblx0cmV0dXJuIENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoKG9NZXRhTW9kZWwsIHNQYXRoLCBzUXVhbGlmaWVyKTtcbn1cblxuZnVuY3Rpb24gZm5QcmVwYXJlU2VtYW50aWNPYmplY3RzUHJvbWlzZXMoXG5cdF9vTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0X2FTZW1hbnRpY09iamVjdHNGb3VuZDogc3RyaW5nW10sXG5cdF9hU2VtYW50aWNPYmplY3RzUHJvbWlzZXM6IFByb21pc2U8U2VtYW50aWNPYmplY3RGcm9tUGF0aD5bXVxuKSB7XG5cdGxldCBfS2V5czogc3RyaW5nW10sIHNQYXRoO1xuXHRsZXQgc1F1YWxpZmllcjogc3RyaW5nLCByZWdleFJlc3VsdDtcblx0Zm9yIChjb25zdCBzZW1hbnRpY09iamVjdEZvdW5kIG9mIF9hU2VtYW50aWNPYmplY3RzRm91bmQpIHtcblx0XHRzUGF0aCA9IHNlbWFudGljT2JqZWN0Rm91bmQ7XG5cdFx0X0tleXMgPSBPYmplY3Qua2V5cyhfb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGggKyBcIkBcIikpO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBfS2V5cykge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRlbGVtZW50LmluZGV4T2YoYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdH1gKSA9PT0gMCAmJlxuXHRcdFx0XHQhZWxlbWVudC5pbmNsdWRlcyhgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0TWFwcGluZ31gKSAmJlxuXHRcdFx0XHQhZWxlbWVudC5pbmNsdWRlcyhgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zfWApXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVnZXhSZXN1bHQgPSAvIyguKikvLmV4ZWMoZWxlbWVudCk7XG5cdFx0XHRcdHNRdWFsaWZpZXIgPSByZWdleFJlc3VsdCA/IHJlZ2V4UmVzdWx0WzFdIDogXCJcIjtcblx0XHRcdFx0X2FTZW1hbnRpY09iamVjdHNQcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0UHJvbWlzZShfb01ldGFNb2RlbCwgc1BhdGgsIHNRdWFsaWZpZXIpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxudHlwZSBJbnRlcm5hbEpTT05Nb2RlbCA9IHtcblx0X2dldE9iamVjdCh2YWw6IHN0cmluZywgY29udGV4dD86IENvbnRleHQpOiBvYmplY3Q7XG59O1xuXG5mdW5jdGlvbiBnZXRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbihvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbj86IE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4pIHtcblx0Y29uc3QgbUFsbG93ZWRFeHByZXNzaW9uczogX0ZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IHt9O1xuXHRpZiAob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gJiYgb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0b0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcGVydHkpIHtcblx0XHRcdGlmIChvUHJvcGVydHkuUHJvcGVydHkgJiYgb1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRcdFx0aWYgKG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LiRQcm9wZXJ0eVBhdGhdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS4kUHJvcGVydHlQYXRoXS5wdXNoKG9Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LiRQcm9wZXJ0eVBhdGhdID0gW29Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnNdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIG1BbGxvd2VkRXhwcmVzc2lvbnM7XG59XG5mdW5jdGlvbiBnZXRGaWx0ZXJSZXN0cmljdGlvbnMoXG5cdG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uPzogTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPixcblx0c1Jlc3RyaWN0aW9uPzogXCJSZXF1aXJlZFByb3BlcnRpZXNcIiB8IFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIlxuKSB7XG5cdGxldCBhUHJvcHM6IHN0cmluZ1tdID0gW107XG5cdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbltzUmVzdHJpY3Rpb24gYXMga2V5b2YgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPl0pIHtcblx0XHRhUHJvcHMgPSAoXG5cdFx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbltzUmVzdHJpY3Rpb24gYXMga2V5b2YgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPl0gYXMgRXhwYW5kUGF0aFR5cGU8RWRtLlByb3BlcnR5UGF0aD5bXVxuXHRcdCkubWFwKGZ1bmN0aW9uIChvUHJvcGVydHk6IEV4cGFuZFBhdGhUeXBlPEVkbS5Qcm9wZXJ0eVBhdGg+KSB7XG5cdFx0XHRyZXR1cm4gb1Byb3BlcnR5LiRQcm9wZXJ0eVBhdGg7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGFQcm9wcztcbn1cblxuZnVuY3Rpb24gX2ZldGNoUHJvcGVydGllc0Zvck5hdlBhdGgocGF0aHM6IHN0cmluZ1tdLCBuYXZQYXRoOiBzdHJpbmcsIHByb3BzOiBzdHJpbmdbXSkge1xuXHRjb25zdCBuYXZQYXRoUHJlZml4ID0gbmF2UGF0aCArIFwiL1wiO1xuXHRyZXR1cm4gcGF0aHMucmVkdWNlKChvdXRQYXRoczogc3RyaW5nW10sIHBhdGhUb0NoZWNrOiBzdHJpbmcpID0+IHtcblx0XHRpZiAocGF0aFRvQ2hlY2suc3RhcnRzV2l0aChuYXZQYXRoUHJlZml4KSkge1xuXHRcdFx0Y29uc3Qgb3V0UGF0aCA9IHBhdGhUb0NoZWNrLnJlcGxhY2UobmF2UGF0aFByZWZpeCwgXCJcIik7XG5cdFx0XHRpZiAoIW91dFBhdGhzLmluY2x1ZGVzKG91dFBhdGgpKSB7XG5cdFx0XHRcdG91dFBhdGhzLnB1c2gob3V0UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRQYXRocztcblx0fSwgcHJvcHMpO1xufVxudHlwZSBfRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuZXhwb3J0IHR5cGUgX0ZpbHRlclJlc3RyaWN0aW9ucyA9IHtcblx0UmVxdWlyZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM6IF9GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM7XG59O1xuZnVuY3Rpb24gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zQnlQYXRoKGVudGl0eVBhdGg6IHN0cmluZywgb0NvbnRleHQ6IE9EYXRhTWV0YU1vZGVsKTogX0ZpbHRlclJlc3RyaWN0aW9ucyB7XG5cdGNvbnN0IG9SZXQ6IF9GaWx0ZXJSZXN0cmljdGlvbnMgPSB7XG5cdFx0UmVxdWlyZWRQcm9wZXJ0aWVzOiBbXSxcblx0XHROb25GaWx0ZXJhYmxlUHJvcGVydGllczogW10sXG5cdFx0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zOiB7fVxuXHR9O1xuXHRsZXQgb0ZpbHRlclJlc3RyaWN0aW9ucztcblx0Y29uc3QgbmF2aWdhdGlvblRleHQgPSBcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCI7XG5cdGNvbnN0IGZyVGVybSA9IFwiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyUmVzdHJpY3Rpb25zXCI7XG5cdGNvbnN0IGVudGl0eVR5cGVQYXRoUGFydHMgPSBlbnRpdHlQYXRoLnJlcGxhY2VBbGwoXCIlMkZcIiwgXCIvXCIpLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpO1xuXHRjb25zdCBlbnRpdHlUeXBlUGF0aCA9IGAvJHtlbnRpdHlUeXBlUGF0aFBhcnRzLmpvaW4oXCIvXCIpfS9gO1xuXHRjb25zdCBlbnRpdHlTZXRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChlbnRpdHlQYXRoLCBvQ29udGV4dCk7XG5cdGNvbnN0IGVudGl0eVNldFBhdGhQYXJ0cyA9IGVudGl0eVNldFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZyk7XG5cdGNvbnN0IGlzQ29udGFpbm1lbnQgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5VHlwZVBhdGh9JENvbnRhaW5zVGFyZ2V0YCk7XG5cdGNvbnN0IGNvbnRhaW5tZW50TmF2UGF0aCA9ICEhaXNDb250YWlubWVudCAmJiBlbnRpdHlUeXBlUGF0aFBhcnRzW2VudGl0eVR5cGVQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cblx0Ly9MRUFTVCBQUklPUklUWSAtIEZpbHRlciByZXN0cmljdGlvbnMgZGlyZWN0bHkgYXQgRW50aXR5IFNldFxuXHQvL2UuZy4gRlIgaW4gXCJOUy5FbnRpdHlDb250YWluZXIvU2FsZXNPcmRlck1hbmFnZVwiIENvbnRleHRQYXRoOiAvU2FsZXNPcmRlck1hbmFnZVxuXHRpZiAoIWlzQ29udGFpbm1lbnQpIHtcblx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zID0gb0NvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9JHtmclRlcm19YCkgYXMgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPiB8IHVuZGVmaW5lZDtcblx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRjb25zdCByZXN1bHRDb250ZXh0Q2hlY2sgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5VHlwZVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCk7XG5cdFx0aWYgKCFyZXN1bHRDb250ZXh0Q2hlY2spIHtcblx0XHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHR9XG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gZ2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24ob0ZpbHRlclJlc3RyaWN0aW9ucykgfHwge307XG5cdH1cblxuXHRpZiAoZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0Y29uc3QgbmF2UGF0aCA9IGlzQ29udGFpbm1lbnQgPyAoY29udGFpbm1lbnROYXZQYXRoIGFzIHN0cmluZykgOiBlbnRpdHlTZXRQYXRoUGFydHNbZW50aXR5U2V0UGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdC8vIEluIGNhc2Ugb2YgY29udGFpbm1lbnQgd2UgdGFrZSBlbnRpdHlTZXQgcHJvdmlkZWQgYXMgcGFyZW50LiBBbmQgaW4gY2FzZSBvZiBub3JtYWwgd2Ugd291bGQgcmVtb3ZlIHRoZSBsYXN0IG5hdmlnYXRpb24gZnJvbSBlbnRpdHlTZXRQYXRoLlxuXHRcdGNvbnN0IHBhcmVudEVudGl0eVNldFBhdGggPSBpc0NvbnRhaW5tZW50ID8gZW50aXR5U2V0UGF0aCA6IGAvJHtlbnRpdHlTZXRQYXRoUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oYC8ke25hdmlnYXRpb25UZXh0fS9gKX1gO1xuXHRcdC8vVEhJUkQgSElHSEVTVCBQUklPUklUWSAtIFJlYWRpbmcgcHJvcGVydHkgcGF0aCByZXN0cmljdGlvbnMgLSBBbm5vdGF0aW9uIGF0IG1haW4gZW50aXR5IGJ1dCBkaXJlY3RseSBvbiBuYXZpZ2F0aW9uIHByb3BlcnR5IHBhdGhcblx0XHQvL2UuZy4gUGFyZW50IEN1c3RvbWVyIHdpdGggUHJvcGVydHlQYXRoPVwiU2V0L0NpdHlOYW1lXCIgQ29udGV4dFBhdGg6IEN1c3RvbWVyL1NldFxuXHRcdGNvbnN0IG9QYXJlbnRSZXQ6IF9GaWx0ZXJSZXN0cmljdGlvbnMgPSB7XG5cdFx0XHRSZXF1aXJlZFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IFtdLFxuXHRcdFx0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zOiB7fVxuXHRcdH07XG5cdFx0aWYgKCFuYXZQYXRoLmluY2x1ZGVzKFwiJTJGXCIpKSB7XG5cdFx0XHRjb25zdCBvUGFyZW50RlIgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7cGFyZW50RW50aXR5U2V0UGF0aH0ke2ZyVGVybX1gKSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+IHwgdW5kZWZpbmVkO1xuXHRcdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMgPSBfZmV0Y2hQcm9wZXJ0aWVzRm9yTmF2UGF0aChcblx0XHRcdFx0Z2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9QYXJlbnRGUiwgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW10sXG5cdFx0XHRcdG5hdlBhdGgsXG5cdFx0XHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzIHx8IFtdXG5cdFx0XHQpO1xuXHRcdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IF9mZXRjaFByb3BlcnRpZXNGb3JOYXZQYXRoKFxuXHRcdFx0XHRnZXRGaWx0ZXJSZXN0cmljdGlvbnMob1BhcmVudEZSLCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdLFxuXHRcdFx0XHRuYXZQYXRoLFxuXHRcdFx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIHx8IFtdXG5cdFx0XHQpO1xuXHRcdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdFx0Y29uc3QgY29tcGxldGVBbGxvd2VkRXhwcyA9IGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG9QYXJlbnRGUikgfHwge307XG5cdFx0XHRvUGFyZW50UmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IE9iamVjdC5rZXlzKGNvbXBsZXRlQWxsb3dlZEV4cHMpLnJlZHVjZShcblx0XHRcdFx0KG91dFByb3A6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiwgcHJvcFBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdGlmIChwcm9wUGF0aC5zdGFydHNXaXRoKG5hdlBhdGggKyBcIi9cIikpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG91dFByb3BQYXRoID0gcHJvcFBhdGgucmVwbGFjZShuYXZQYXRoICsgXCIvXCIsIFwiXCIpO1xuXHRcdFx0XHRcdFx0b3V0UHJvcFtvdXRQcm9wUGF0aF0gPSBjb21wbGV0ZUFsbG93ZWRFeHBzW3Byb3BQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG91dFByb3A7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBtZXJnZU9iamVjdHMoXG5cdFx0XHR7fSxcblx0XHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zIHx8IHt9LFxuXHRcdFx0b1BhcmVudFJldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgfHwge31cblx0XHQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuXHRcdC8vU0VDT05EIEhJR0hFU1QgcHJpb3JpdHkgLSBOYXZpZ2F0aW9uIHJlc3RyaWN0aW9uc1xuXHRcdC8vZS5nLiBQYXJlbnQgXCIvQ3VzdG9tZXJcIiB3aXRoIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg9XCJTZXRcIiBDb250ZXh0UGF0aDogQ3VzdG9tZXIvU2V0XG5cdFx0Y29uc3Qgb05hdlJlc3RyaWN0aW9ucyA9IE1ldGFNb2RlbEZ1bmN0aW9uLmdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMob0NvbnRleHQsIHBhcmVudEVudGl0eVNldFBhdGgsIG5hdlBhdGgucmVwbGFjZUFsbChcIiUyRlwiLCBcIi9cIikpO1xuXHRcdGNvbnN0IG9OYXZGaWx0ZXJSZXN0ID0gb05hdlJlc3RyaWN0aW9ucyAmJiAob05hdlJlc3RyaWN0aW9uc1tcIkZpbHRlclJlc3RyaWN0aW9uc1wiXSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+KTtcblx0XHRjb25zdCBuYXZSZXNSZXFQcm9wcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvTmF2RmlsdGVyUmVzdCwgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW107XG5cdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMgPSB1bmlxdWVTb3J0KG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzLmNvbmNhdChuYXZSZXNSZXFQcm9wcykpO1xuXHRcdGNvbnN0IG5hdk5vbkZpbHRlclByb3BzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9OYXZGaWx0ZXJSZXN0LCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSB1bmlxdWVTb3J0KG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuY29uY2F0KG5hdk5vbkZpbHRlclByb3BzKSk7XG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gbWVyZ2VPYmplY3RzKFxuXHRcdFx0e30sXG5cdFx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyB8fCB7fSxcblx0XHRcdGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG9OYXZGaWx0ZXJSZXN0KSB8fCB7fVxuXHRcdCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG5cdFx0Ly9ISUdIRVNUIHByaW9yaXR5IC0gUmVzdHJpY3Rpb25zIGhhdmluZyB0YXJnZXQgd2l0aCBuYXZpZ2F0aW9uIGFzc29jaWF0aW9uIGVudGl0eVxuXHRcdC8vIGUuZy4gRlIgaW4gXCJDdXN0b21lclBhcmFtZXRlcnMvU2V0XCIgQ29udGV4dFBhdGg6IFwiQ3VzdG9tZXIvU2V0XCJcblx0XHRjb25zdCBuYXZBc3NvY2lhdGlvbkVudGl0eVJlc3QgPSBvQ29udGV4dC5nZXRPYmplY3QoXG5cdFx0XHRgLyR7ZW50aXR5VHlwZVBhdGhQYXJ0cy5qb2luKFwiL1wiKX0ke2ZyVGVybX1gXG5cdFx0KSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+O1xuXHRcdGNvbnN0IG5hdkFzc29jUmVxUHJvcHMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMobmF2QXNzb2NpYXRpb25FbnRpdHlSZXN0LCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyA9IHVuaXF1ZVNvcnQob1JldC5SZXF1aXJlZFByb3BlcnRpZXMuY29uY2F0KG5hdkFzc29jUmVxUHJvcHMpKTtcblx0XHRjb25zdCBuYXZBc3NvY05vbkZpbHRlclByb3BzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCwgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gdW5pcXVlU29ydChvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmNvbmNhdChuYXZBc3NvY05vbkZpbHRlclByb3BzKSk7XG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gbWVyZ2VPYmplY3RzKFxuXHRcdFx0e30sXG5cdFx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyxcblx0XHRcdGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCkgfHwge31cblx0XHQpIGFzIF9GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM7XG5cdH1cblx0cmV0dXJuIG9SZXQ7XG59XG5cbnR5cGUgUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSB7XG5cdGFwcENvbXBvbmVudD86IEFwcENvbXBvbmVudDtcblx0YmluZGluZ0NvbnRleHRzOiBvYmplY3Q7XG5cdG1vZGVsczogb2JqZWN0O1xufTtcbmV4cG9ydCB0eXBlIEJhc2VUcmVlTW9kaWZpZXIgPSB7XG5cdHRlbXBsYXRlQ29udHJvbEZyYWdtZW50KFxuXHRcdHNGcmFnbWVudE5hbWU6IHN0cmluZyxcblx0XHRtUHJlcHJvY2Vzc29yU2V0dGluZ3M6IFByZXByb2Nlc3NvclNldHRpbmdzLFxuXHRcdG9WaWV3PzogVmlld1xuXHQpOiBQcm9taXNlPFVJNUVsZW1lbnRbXSB8IEVsZW1lbnRbXT47XG5cdHRhcmdldHM6IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHRlbXBsYXRlQ29udHJvbEZyYWdtZW50KFxuXHRzRnJhZ21lbnROYW1lOiBzdHJpbmcsXG5cdG9QcmVwcm9jZXNzb3JTZXR0aW5nczogUHJlcHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9PcHRpb25zOiB7IHZpZXc/OiBWaWV3OyBpc1hNTD86IGJvb2xlYW47IGlkOiBzdHJpbmc7IGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyIHwgRXh0ZW5zaW9uQVBJOyBjb250YWluaW5nVmlldz86IFZpZXcgfSxcblx0b01vZGlmaWVyPzogQmFzZVRyZWVNb2RpZmllclxuKTogUHJvbWlzZTxFbGVtZW50IHwgVUk1RWxlbWVudCB8IEVsZW1lbnRbXSB8IFVJNUVsZW1lbnRbXT4ge1xuXHRvT3B0aW9ucyA9IG9PcHRpb25zIHx8IHt9O1xuXHRpZiAob01vZGlmaWVyICYmIHR5cGVvZiBzRnJhZ21lbnROYW1lID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIG9Nb2RpZmllci50ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MsIG9PcHRpb25zLnZpZXcpLnRoZW4oZnVuY3Rpb24gKG9GcmFnbWVudCkge1xuXHRcdFx0Ly8gVGhpcyBpcyByZXF1aXJlZCBhcyBGbGV4IHJldHVybnMgYW4gSFRNTENvbGxlY3Rpb24gYXMgdGVtcGxhdGluZyByZXN1bHQgaW4gWE1MIHRpbWUuXG5cdFx0XHRyZXR1cm4gb01vZGlmaWVyLnRhcmdldHMgPT09IFwieG1sVHJlZVwiICYmIG9GcmFnbWVudC5sZW5ndGggPiAwID8gb0ZyYWdtZW50WzBdIDogb0ZyYWdtZW50O1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGZyYWdtZW50RGF0YSA9XG5cdFx0XHR0eXBlb2Ygc0ZyYWdtZW50TmFtZSA9PT0gXCJzdHJpbmdcIiA/IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpIDogc0ZyYWdtZW50TmFtZTtcblx0XHRjb25zdCBvRnJhZ21lbnQgPSBhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2VzcyhmcmFnbWVudERhdGEsIHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpO1xuXHRcdGNvbnN0IG9Db250cm9sID0gb0ZyYWdtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdGlmICghIW9PcHRpb25zLmlzWE1MICYmIG9Db250cm9sKSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2w7XG5cdFx0fVxuXHRcdGxldCBvd25lcjogeyBydW5Bc093bmVyOiA8VD4oZm46ICgpID0+IFQpID0+IFQgfSA9IG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5hcHBDb21wb25lbnQgPz8geyBydW5Bc093bmVyOiAoZm4pID0+IGZuKCkgfTtcblx0XHRpZiAob09wdGlvbnMuY29udGFpbmluZ1ZpZXcpIHtcblx0XHRcdGNvbnN0IHZpZXdPd25lciA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcihvT3B0aW9ucy5jb250YWluaW5nVmlldyk7XG5cdFx0XHRpZiAodmlld093bmVyKSB7XG5cdFx0XHRcdG93bmVyID0gdmlld093bmVyO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRsZXQgY29udGFpbmluZ1ZpZXc6IFZpZXcgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKG9PcHRpb25zLnZpZXcgJiYgIW9PcHRpb25zLmNvbnRyb2xsZXIpIHtcblx0XHRcdC8vIHRoaXMgaXMgb3ZlcmFsbCBzdHVwaWQsIGluIGNhc2Ugd2UgYXJlIGNvbWluZyBmcm9tIHRoZSBkZWxlZ2F0ZSB3aXRoIGFuIHhtbCBub2RlIGluc3RlYWQgb2YgYSBmcmFnbWVudCB3ZSBuZWVkIHRvIHBhc3MgdGhlIGNvbnRhaW5pbmdWaWV3IGluIHRoZXJlIChkb25lIGJ5IHRoZSBvTW9kaWZpZXIgY2FsbCBmb3IgaW5zdGFuY2UpXG5cdFx0XHQvLyBCdXQgaW4gb3RoZXIgcnVudGltZSBjYXNlIHdoZXJlIHdlIGFyZSBoZXJlIHdlIG5lZWQgdG8gbWFpbnRhaW4gdGhlIGNvbnRyb2xsZXIgYW5kIHRodXMgY2Fubm90IGhhdmUgYSBjb250YWluaW5nVmlldy4uLlxuXHRcdFx0Y29udGFpbmluZ1ZpZXcgPSBvT3B0aW9ucy52aWV3O1xuXHRcdH1cblx0XHRyZXR1cm4gb3duZXIucnVuQXNPd25lcihhc3luYyAoKSA9PiB7XG5cdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7XG5cdFx0XHRcdGlkOiBvT3B0aW9ucy5pZCxcblx0XHRcdFx0ZGVmaW5pdGlvbjogb0ZyYWdtZW50IGFzIHVua25vd24gYXMgc3RyaW5nLFxuXHRcdFx0XHRjb250cm9sbGVyOiBvT3B0aW9ucy5jb250cm9sbGVyLFxuXHRcdFx0XHRjb250YWluaW5nVmlldzogY29udGFpbmluZ1ZpZXdcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFNpbmdsZXRvblBhdGgocGF0aDogc3RyaW5nLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbiksXG5cdFx0cHJvcGVydHlOYW1lID0gcGFydHMucG9wKCkhLFxuXHRcdG5hdmlnYXRpb25QYXRoID0gcGFydHMuam9pbihcIi9cIiksXG5cdFx0ZW50aXR5U2V0ID0gbmF2aWdhdGlvblBhdGggJiYgbWV0YU1vZGVsLmdldE9iamVjdChgLyR7bmF2aWdhdGlvblBhdGh9YCk7XG5cdGlmIChlbnRpdHlTZXQ/LiRraW5kID09PSBcIlNpbmdsZXRvblwiKSB7XG5cdFx0Y29uc3Qgc2luZ2xldG9uTmFtZSA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdHJldHVybiBgLyR7c2luZ2xldG9uTmFtZX0vJHtwcm9wZXJ0eU5hbWV9YDtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkocGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCkge1xuXHRpZiAoIXBhdGggfHwgIW1vZGVsKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0fVxuXHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0Ly8gRmluZCB0aGUgdW5kZXJseWluZyBlbnRpdHkgc2V0IGZyb20gdGhlIHByb3BlcnR5IHBhdGggYW5kIGNoZWNrIHdoZXRoZXIgaXQgaXMgYSBzaW5nbGV0b24uXG5cdGNvbnN0IHJlc29sdmVkUGF0aCA9IGdldFNpbmdsZXRvblBhdGgocGF0aCwgbWV0YU1vZGVsKTtcblx0aWYgKHJlc29sdmVkUGF0aCkge1xuXHRcdGNvbnN0IHByb3BlcnR5QmluZGluZyA9IG1vZGVsLmJpbmRQcm9wZXJ0eShyZXNvbHZlZFBhdGgpO1xuXHRcdHJldHVybiBwcm9wZXJ0eUJpbmRpbmcucmVxdWVzdFZhbHVlKCk7XG5cdH1cblxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xufVxuXG4vLyBHZXQgdGhlIHBhdGggZm9yIGFjdGlvbiBwYXJhbWV0ZXJzIHRoYXQgaXMgbmVlZGVkIHRvIHJlYWQgdGhlIGFubm90YXRpb25zXG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJQYXRoKHNQYXRoOiBzdHJpbmcsIHNQYXJhbWV0ZXI6IHN0cmluZykge1xuXHRsZXQgc0NvbnRleHQ7XG5cdGlmIChzUGF0aC5pbmNsdWRlcyhcIkAkdWk1Lm92ZXJsb2FkXCIpKSB7XG5cdFx0c0NvbnRleHQgPSBzUGF0aC5zcGxpdChcIkAkdWk1Lm92ZXJsb2FkXCIpWzBdO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEZvciBVbmJvdW5kIEFjdGlvbnMgaW4gQWN0aW9uIFBhcmFtZXRlciBEaWFsb2dzXG5cdFx0Y29uc3QgYUFjdGlvbiA9IHNQYXRoLnNwbGl0KFwiLzBcIilbMF0uc3BsaXQoXCIuXCIpO1xuXHRcdHNDb250ZXh0ID0gYC8ke2FBY3Rpb25bYUFjdGlvbi5sZW5ndGggLSAxXX0vYDtcblx0fVxuXHRyZXR1cm4gc0NvbnRleHQgKyBzUGFyYW1ldGVyO1xufVxuXG4vKipcbiAqIEdldCByZXNvbHZlZCBleHByZXNzaW9uIGJpbmRpbmcgdXNlZCBmb3IgdGV4dHMgYXQgcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gZXhwQmluZGluZ1xuICogQHBhcmFtIGNvbnRyb2xcbiAqIEByZXR1cm5zIEEgc3RyaW5nIGFmdGVyIHJlc29sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIF9mbnRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmcoZXhwQmluZGluZzogc3RyaW5nLCBjb250cm9sOiBDb250cm9sKTogc3RyaW5nIHtcblx0Ly8gVGhlIGlkZWEgaGVyZSBpcyB0byBjcmVhdGUgZHVtbXkgZWxlbWVudCB3aXRoIHRoZSBleHByZXNpb24gYmluZGluZy5cblx0Ly8gQWRkaW5nIGl0IGFzIGRlcGVuZGVudCB0byB0aGUgdmlldy9jb250cm9sIHdvdWxkIHByb3BhZ2F0ZSBhbGwgdGhlIG1vZGVscyB0byB0aGUgZHVtbXkgZWxlbWVudCBhbmQgcmVzb2x2ZSB0aGUgYmluZGluZy5cblx0Ly8gV2UgcmVtb3ZlIHRoZSBkdW1teSBlbGVtZW50IGFmdGVyIHRoYXQgYW5kIGRlc3Ryb3kgaXQuXG5cblx0Y29uc3QgYW55UmVzb3VyY2VUZXh0ID0gbmV3IEFueUVsZW1lbnQoeyBhbnlUZXh0OiBleHBCaW5kaW5nIH0pO1xuXHRjb250cm9sLmFkZERlcGVuZGVudChhbnlSZXNvdXJjZVRleHQpO1xuXHRjb25zdCByZXN1bHRUZXh0ID0gYW55UmVzb3VyY2VUZXh0LmdldEFueVRleHQoKTtcblx0Y29udHJvbC5yZW1vdmVEZXBlbmRlbnQoYW55UmVzb3VyY2VUZXh0KTtcblx0YW55UmVzb3VyY2VUZXh0LmRlc3Ryb3koKTtcblxuXHRyZXR1cm4gcmVzdWx0VGV4dDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGhhcyBhIHNtYWxsIHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyBBIEJvb2xlYW4uXG4gKi9cbmZ1bmN0aW9uIGlzU21hbGxEZXZpY2UoKSB7XG5cdHJldHVybiAhRGV2aWNlLnN5c3RlbS5kZXNrdG9wIHx8IERldmljZS5yZXNpemUud2lkdGggPD0gMzIwO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIFNlbGVjdGlvblZhcmlhbnQgb3IgU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudCBhbm5vdGF0aW9uIGFuZCBjcmVhdGVzIHRoZSBjb3JyZXNwb25kaW5nIGZpbHRlcnMuXG4gKlxuICogQHBhcmFtIGNvbnRyb2wgTURDIENoYXJ0LCBNREMgVGFibGUgb3IgTXVsdGlWaWV3IGNvbnRyb2wgb24gd2hpY2ggdGhlIGZpbHRlcnMgYXJlIGFwcGxpZWRcbiAqIEBwYXJhbSBhbm5vdGF0aW9uUGF0aCBTZWxlY3Rpb25WYXJpYW50IG9yIFNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnQgYW5ub3RhdGlvblxuICogQHJldHVybnMgUmV0dXJucyBhbiBhcnJheSBvZiBmaWx0ZXJzLlxuICovXG5mdW5jdGlvbiBnZXRGaWx0ZXJzRnJvbUFubm90YXRpb24oY29udHJvbDogQ29udHJvbCB8IE1EQ0NoYXJ0IHwgTURDVGFibGUsIGFubm90YXRpb25QYXRoOiBzdHJpbmcpOiBGaWx0ZXJbXSB7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChjb250cm9sIGFzIENvbnRyb2wpLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBzdkNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoYCR7Y29udHJvbC5kYXRhKFwiZW50aXR5VHlwZVwiKX0ke2Fubm90YXRpb25QYXRofWApO1xuXHRjb25zdCBwcm9wZXJ0eUZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIEZpbHRlcltdPiA9IHt9O1xuXHRsZXQgYW5ub3RhdGlvbiA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMoc3ZDb250ZXh0KS50YXJnZXRPYmplY3Q7XG5cblx0aWYgKGlzU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudChhbm5vdGF0aW9uKSkge1xuXHRcdGFubm90YXRpb24gPSBhbm5vdGF0aW9uLlNlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblxuXHRpZiAoIWFubm90YXRpb24gfHwgIWlzU2VsZWN0aW9uVmFyaWFudChhbm5vdGF0aW9uKSkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdChhbm5vdGF0aW9uLlNlbGVjdE9wdGlvbnMgfHwgW10pLmZvckVhY2goKHNlbGVjdE9wdGlvbikgPT4ge1xuXHRcdGlmIChzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lPy4kdGFyZ2V0ICYmIHNlbGVjdE9wdGlvbi5SYW5nZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VHlwZSA9IHNlbGVjdE9wdGlvbi5Qcm9wZXJ0eU5hbWUuJHRhcmdldC50eXBlO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZS52YWx1ZTtcblx0XHRcdGZvciAoY29uc3QgaiBpbiBzZWxlY3RPcHRpb24uUmFuZ2VzKSB7XG5cdFx0XHRcdGNvbnN0IHJhbmdlID0gZ2V0UmFuZ2VEZWZpbml0aW9uKHNlbGVjdE9wdGlvbi5SYW5nZXNbal0sIHByb3BlcnR5VHlwZSk7XG5cdFx0XHRcdHByb3BlcnR5RmlsdGVyc1twcm9wZXJ0eVBhdGhdID0gKHByb3BlcnR5RmlsdGVyc1twcm9wZXJ0eVBhdGhdID8/IFtdKS5jb25jYXQoXG5cdFx0XHRcdFx0bmV3IEZpbHRlcihwcm9wZXJ0eVBhdGgsIHJhbmdlLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLCByYW5nZS5yYW5nZUxvdywgcmFuZ2UucmFuZ2VIaWdoKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Y29uc3QgZmlsdGVycyA9IFtdO1xuXHRmb3IgKGNvbnN0IHBhdGggaW4gcHJvcGVydHlGaWx0ZXJzKSB7XG5cdFx0ZmlsdGVycy5wdXNoKFxuXHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdGZpbHRlcnM6IHByb3BlcnR5RmlsdGVyc1twYXRoXSxcblx0XHRcdFx0YW5kOiBmYWxzZVxuXHRcdFx0fSlcblx0XHQpO1xuXHR9XG5cdHJldHVybiBmaWx0ZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yUGF0aChzTWV0YVBhdGg6IHN0cmluZywgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNFbnRpdHlTZXQ6IHN0cmluZywgb0RpYWdub3N0aWNzOiBEaWFnbm9zdGljcykge1xuXHRjb25zdCBvQ29udGV4dCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc01ldGFQYXRoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0cmV0dXJuIENvbnZlcnRlckNvbnRleHQ/LmNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyhzRW50aXR5U2V0LCBvQ29udGV4dCB8fCBvTWV0YU1vZGVsLCBvRGlhZ25vc3RpY3MsIG1lcmdlT2JqZWN0cyk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29udGV4dCBvZiB0aGUgRHJhZnRSb290IHBhdGguXG4gKiBJZiBhIHZpZXcgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBkcmFmdCBSb290IFBhdGgsIHRoaXMgbWV0aG9kIHJldHVybnMgaXRzIGJpbmRpbmdDb250ZXh0LlxuICogV2hlcmUgbm8gdmlldyBpcyBmb3VuZCBhIG5ldyBjcmVhdGVkIGNvbnRleHQgaXMgcmV0dXJuZWQuXG4gKiBUaGUgbmV3IGNyZWF0ZWQgY29udGV4dCByZXF1ZXN0IHRoZSBrZXkgb2YgdGhlIGVudGl0eSBpbiBvcmRlciB0byBnZXQgdGhlIEV0YWcgb2YgdGhpcyBlbnRpdHkuXG4gKlxuICogQHBhcmFtIHByb2dyYW1taW5nTW9kZWxcbiAqIEBwYXJhbSB2aWV3XG4gKiBAcGFyYW0gYXBwQ29tcG9uZW50XG4gKiBAcmV0dXJucyBSZXR1cm5zIGEgUHJvbWlzZVxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVSb290Q29udGV4dChwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsIHZpZXc6IFZpZXcsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdGlmIChjb250ZXh0KSB7XG5cdFx0Y29uc3Qgcm9vdENvbnRleHRQYXRoID1cblx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFwiRHJhZnRcIiA/IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgoY29udGV4dCkgOiBNb2RlbEhlbHBlci5nZXRTdGlja3lSb290UGF0aChjb250ZXh0KTtcblx0XHRsZXQgc2ltcGxlUm9vdENvbnRleHQ6IE9EYXRhVjRDb250ZXh0O1xuXHRcdGlmIChyb290Q29udGV4dFBhdGgpIHtcblx0XHRcdC8vIENoZWNrIGlmIGEgdmlldyBtYXRjaGVzIHdpdGggdGhlIGRyYWZ0IHJvb3QgcGF0aFxuXHRcdFx0Y29uc3QgZXhpc3RpbmdCaW5kaW5nQ29udGV4dE9uUGFnZSA9IGFwcENvbXBvbmVudFxuXHRcdFx0XHQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKClcblx0XHRcdFx0LmdldEluc3RhbmNlZFZpZXdzKClcblx0XHRcdFx0LmZpbmQoKHBhZ2VWaWV3OiBWaWV3KSA9PiBwYWdlVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCkgPT09IHJvb3RDb250ZXh0UGF0aClcblx0XHRcdFx0Py5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRpZiAoZXhpc3RpbmdCaW5kaW5nQ29udGV4dE9uUGFnZSkge1xuXHRcdFx0XHRyZXR1cm4gZXhpc3RpbmdCaW5kaW5nQ29udGV4dE9uUGFnZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB2aWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdFx0c2ltcGxlUm9vdENvbnRleHQgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3NpbXBsZVJvb3RDb250ZXh0XCIpO1xuXHRcdFx0aWYgKHNpbXBsZVJvb3RDb250ZXh0Py5nZXRQYXRoKCkgPT09IHJvb3RDb250ZXh0UGF0aCkge1xuXHRcdFx0XHRyZXR1cm4gc2ltcGxlUm9vdENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdHNpbXBsZVJvb3RDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQocm9vdENvbnRleHRQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdGF3YWl0IENvbW1vblV0aWxzLndhaXRGb3JDb250ZXh0UmVxdWVzdGVkKHNpbXBsZVJvb3RDb250ZXh0KTtcblx0XHRcdC8vIFN0b3JlIHRoaXMgbmV3IGNyZWF0ZWQgY29udGV4dCB0byB1c2UgaXQgb24gdGhlIG5leHQgaXRlcmF0aW9uc1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zaW1wbGVSb290Q29udGV4dFwiLCBzaW1wbGVSb290Q29udGV4dCk7XG5cdFx0XHRyZXR1cm4gc2ltcGxlUm9vdENvbnRleHQ7XG5cdFx0fVxuXHR9XG59XG5cbmNvbnN0IENvbW1vblV0aWxzID0ge1xuXHRmaXJlQnV0dG9uUHJlc3M6IGZuRmlyZUJ1dHRvblByZXNzLFxuXHRnZXRUYXJnZXRWaWV3OiBnZXRUYXJnZXRWaWV3LFxuXHRnZXRDdXJyZW50UGFnZVZpZXc6IGdldEN1cnJlbnRQYWdlVmlldyxcblx0aGFzVHJhbnNpZW50Q29udGV4dDogZm5IYXNUcmFuc2llbnRDb250ZXh0cyxcblx0dXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzOiBmblVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyxcblx0Z2V0QXBwQ29tcG9uZW50OiBnZXRBcHBDb21wb25lbnQsXG5cdGdldENvbnRleHRQYXRoUHJvcGVydGllczogZm5HZXRDb250ZXh0UGF0aFByb3BlcnRpZXMsXG5cdGdldFBhcmFtZXRlckluZm86IGdldFBhcmFtZXRlckluZm8sXG5cdHVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5OiBmblVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5LFxuXHRnZXRFbnRpdHlTZXROYW1lOiBnZXRFbnRpdHlTZXROYW1lLFxuXHRnZXRBY3Rpb25QYXRoOiBnZXRBY3Rpb25QYXRoLFxuXHRjb21wdXRlRGlzcGxheU1vZGU6IGNvbXB1dGVEaXNwbGF5TW9kZSxcblx0aXNTdGlja3lFZGl0TW9kZTogaXNTdGlja3lFZGl0TW9kZSxcblx0Z2V0T3BlcmF0b3JzRm9yUHJvcGVydHk6IGdldE9wZXJhdG9yc0ZvclByb3BlcnR5LFxuXHRnZXRPcGVyYXRvcnNGb3JEYXRlUHJvcGVydHk6IGdldE9wZXJhdG9yc0ZvckRhdGVQcm9wZXJ0eSxcblx0Z2V0T3BlcmF0b3JzRm9yR3VpZFByb3BlcnR5OiBnZXRPcGVyYXRvcnNGb3JHdWlkUHJvcGVydHksXG5cdGFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50OiBhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCxcblx0c2V0VXNlckRlZmF1bHRzOiBzZXRVc2VyRGVmYXVsdHMsXG5cdGdldElCTkFjdGlvbnM6IGZuR2V0SUJOQWN0aW9ucyxcblx0Z2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uOiBnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24sXG5cdGdldFNlbWFudGljT2JqZWN0TWFwcGluZzogZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nLFxuXHRzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzOiBzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzLFxuXHRnZXRTZW1hbnRpY09iamVjdFByb21pc2U6IGZuR2V0U2VtYW50aWNPYmplY3RQcm9taXNlLFxuXHRnZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aDogZm5HZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCxcblx0d2FpdEZvckNvbnRleHRSZXF1ZXN0ZWQ6IHdhaXRGb3JDb250ZXh0UmVxdWVzdGVkLFxuXHRnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGg6IGdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aCxcblx0Z2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbjogZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbixcblx0Z2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZTogZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZSxcblx0cmVxdWVzdFNpbmdsZXRvblByb3BlcnR5OiByZXF1ZXN0U2luZ2xldG9uUHJvcGVydHksXG5cdHRlbXBsYXRlQ29udHJvbEZyYWdtZW50OiB0ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudCxcblx0RmlsdGVyUmVzdHJpY3Rpb25zOiB7XG5cdFx0UkVRVUlSRURfUFJPUEVSVElFUzogXCJSZXF1aXJlZFByb3BlcnRpZXNcIixcblx0XHROT05fRklMVEVSQUJMRV9QUk9QRVJUSUVTOiBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIsXG5cdFx0QUxMT1dFRF9FWFBSRVNTSU9OUzogXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIlxuXHR9LFxuXHRBbGxvd2VkRXhwcmVzc2lvbnNQcmlvOiBbXCJTaW5nbGVWYWx1ZVwiLCBcIk11bHRpVmFsdWVcIiwgXCJTaW5nbGVSYW5nZVwiLCBcIk11bHRpUmFuZ2VcIiwgXCJTZWFyY2hFeHByZXNzaW9uXCIsIFwiTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblwiXSxcblx0bm9ybWFsaXplU2VhcmNoVGVybTogbm9ybWFsaXplU2VhcmNoVGVybSxcblx0c2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlOiBzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUsXG5cdHNldER5bmFtaWNBY3Rpb25Db250ZXh0czogc2V0RHluYW1pY0FjdGlvbkNvbnRleHRzLFxuXHRyZXF1ZXN0UHJvcGVydHk6IHJlcXVlc3RQcm9wZXJ0eSxcblx0Z2V0UGFyYW1ldGVyUGF0aDogZ2V0UGFyYW1ldGVyUGF0aCxcblx0Z2V0UmVsYXRlZEFwcHNNZW51SXRlbXM6IF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyxcblx0Z2V0VHJhbnNsYXRlZFRleHRGcm9tRXhwQmluZGluZ1N0cmluZzogX2ZudHJhbnNsYXRlZFRleHRGcm9tRXhwQmluZGluZ1N0cmluZyxcblx0dXBkYXRlUmVsYXRlQXBwc01vZGVsOiB1cGRhdGVSZWxhdGVBcHBzTW9kZWwsXG5cdGdldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnM6IF9nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zLFxuXHRnZXRGaWx0ZXJzRnJvbUFubm90YXRpb246IGdldEZpbHRlcnNGcm9tQW5ub3RhdGlvbixcblx0Y3JlYXRlUm9vdENvbnRleHQ6IGNyZWF0ZVJvb3RDb250ZXh0LFxuXHRpc1NtYWxsRGV2aWNlLFxuXHRnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yUGF0aFxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tbW9uVXRpbHM7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7OztFQXlFQSxTQUFTQSxtQkFBbUIsQ0FBQ0MsV0FBbUIsRUFBRTtJQUNqRCxJQUFJLENBQUNBLFdBQVcsRUFBRTtNQUNqQixPQUFPQyxTQUFTO0lBQ2pCO0lBRUEsT0FBT0QsV0FBVyxDQUNoQkUsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FDbEJBLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFBQSxDQUN2QkMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUNaQyxNQUFNLENBQUMsVUFBVUMsV0FBK0IsRUFBRUMsWUFBb0IsRUFBRTtNQUN4RSxJQUFJQSxZQUFZLEtBQUssRUFBRSxFQUFFO1FBQ3hCRCxXQUFXLEdBQUksR0FBRUEsV0FBVyxHQUFJLEdBQUVBLFdBQVksR0FBRSxHQUFHLEVBQUcsSUFBR0MsWUFBYSxHQUFFO01BQ3pFO01BQ0EsT0FBT0QsV0FBVztJQUNuQixDQUFDLEVBQUVKLFNBQVMsQ0FBQztFQUNmO0VBRUEsZUFBZU0sdUJBQXVCLENBQUNDLGNBQThCLEVBQUU7SUFBQTtJQUN0RSxNQUFNQyxLQUFLLEdBQUdELGNBQWMsQ0FBQ0UsUUFBUSxFQUFFO0lBQ3ZDLE1BQU1DLFNBQVMsR0FBR0YsS0FBSyxDQUFDRyxZQUFZLEVBQUU7SUFDdEMsTUFBTUMsVUFBVSxHQUFHRixTQUFTLENBQUNHLFdBQVcsQ0FBQ04sY0FBYyxDQUFDTyxPQUFPLEVBQUUsQ0FBQztJQUNsRSxNQUFNQyxTQUFTLEdBQUdD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
|