@veeroute/lss-studio-angular 7.0.2395 → 7.2.2444
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/README.md +1 -1
- package/api/api.d.ts +4 -1
- package/api/experimentsService.d.ts +24 -1
- package/api/experimentsServiceInterface.d.ts +12 -1
- package/api/explorerServiceInterface.d.ts +1 -1
- package/api/factsService.d.ts +195 -0
- package/api/factsServiceInterface.d.ts +104 -0
- package/api/hardlinksServiceInterface.d.ts +1 -1
- package/api/locationsServiceInterface.d.ts +1 -1
- package/api/ordersService.d.ts +24 -2
- package/api/ordersServiceInterface.d.ts +12 -2
- package/api/performersServiceInterface.d.ts +1 -1
- package/api/systemServiceInterface.d.ts +1 -1
- package/api/transportsServiceInterface.d.ts +1 -1
- package/api/tripsServiceInterface.d.ts +1 -1
- package/cfg/process_types.json +60 -0
- package/cfg/table_settings.json +52 -0
- package/esm2022/api/api.mjs +5 -2
- package/esm2022/api/experimentsService.mjs +65 -5
- package/esm2022/api/experimentsServiceInterface.mjs +1 -1
- package/esm2022/api/explorerService.mjs +5 -5
- package/esm2022/api/explorerServiceInterface.mjs +1 -1
- package/esm2022/api/factsService.mjs +629 -0
- package/esm2022/api/factsServiceInterface.mjs +2 -0
- package/esm2022/api/hardlinksService.mjs +5 -5
- package/esm2022/api/hardlinksServiceInterface.mjs +1 -1
- package/esm2022/api/locationsService.mjs +5 -5
- package/esm2022/api/locationsServiceInterface.mjs +1 -1
- package/esm2022/api/ordersService.mjs +72 -5
- package/esm2022/api/ordersServiceInterface.mjs +1 -1
- package/esm2022/api/performersService.mjs +5 -5
- package/esm2022/api/performersServiceInterface.mjs +1 -1
- package/esm2022/api/systemService.mjs +5 -5
- package/esm2022/api/systemServiceInterface.mjs +1 -1
- package/esm2022/api/transportsService.mjs +5 -5
- package/esm2022/api/transportsServiceInterface.mjs +1 -1
- package/esm2022/api/tripsService.mjs +5 -5
- package/esm2022/api/tripsServiceInterface.mjs +1 -1
- package/esm2022/api.module.mjs +4 -4
- package/esm2022/model/actualizeSettings.mjs +10 -1
- package/esm2022/model/assignedPerformer.mjs +1 -1
- package/esm2022/model/assignedTransport.mjs +1 -1
- package/esm2022/model/attribute.mjs +2 -2
- package/esm2022/model/basicProcess.mjs +2 -2
- package/esm2022/model/basicState.mjs +2 -2
- package/esm2022/model/basicTimeWindow.mjs +2 -2
- package/esm2022/model/basicTracksType.mjs +2 -2
- package/esm2022/model/box.mjs +1 -1
- package/esm2022/model/boxCompatibilities.mjs +2 -2
- package/esm2022/model/boxLimits.mjs +1 -1
- package/esm2022/model/break.mjs +2 -2
- package/esm2022/model/breakRules.mjs +1 -1
- package/esm2022/model/calculationHistoryElement.mjs +1 -1
- package/esm2022/model/calculationInfo.mjs +1 -1
- package/esm2022/model/calculationSettings.mjs +2 -2
- package/esm2022/model/calculationState.mjs +1 -1
- package/esm2022/model/calculationStatus.mjs +2 -2
- package/esm2022/model/capacity.mjs +2 -2
- package/esm2022/model/capacityCost.mjs +2 -2
- package/esm2022/model/capacityLimit.mjs +2 -2
- package/esm2022/model/capacityMultiplier.mjs +2 -2
- package/esm2022/model/capacityStatisticsLoad.mjs +2 -2
- package/esm2022/model/capacityStatisticsRatio.mjs +2 -2
- package/esm2022/model/capacityStatisticsSum.mjs +2 -2
- package/esm2022/model/cargo.mjs +1 -1
- package/esm2022/model/cargoAction.mjs +1 -1
- package/esm2022/model/cargoActionType.mjs +2 -2
- package/esm2022/model/cargoCompatibilities.mjs +1 -1
- package/esm2022/model/cargoRotationType.mjs +2 -2
- package/esm2022/model/checkResult.mjs +2 -2
- package/esm2022/model/compatibilityPenalty.mjs +2 -2
- package/esm2022/model/custom400WithErrorsAndWarnings.mjs +1 -1
- package/esm2022/model/demand.mjs +1 -1
- package/esm2022/model/demandExtraDuration.mjs +2 -2
- package/esm2022/model/demandType.mjs +2 -2
- package/esm2022/model/entityError.mjs +1 -1
- package/esm2022/model/entityErrorType.mjs +3 -3
- package/esm2022/model/entityPath.mjs +1 -1
- package/esm2022/model/entityType.mjs +2 -2
- package/esm2022/model/entityWarning.mjs +1 -1
- package/esm2022/model/entityWarningType.mjs +5 -3
- package/esm2022/model/experiment.mjs +1 -1
- package/esm2022/model/experimentCheck.mjs +1 -1
- package/esm2022/model/experimentList.mjs +1 -1
- package/esm2022/model/experimentNeighbors.mjs +11 -0
- package/esm2022/model/experimentSettings.mjs +1 -1
- package/esm2022/model/experimentSpecification.mjs +2 -2
- package/esm2022/model/experimentStatistics.mjs +1 -1
- package/esm2022/model/fact.mjs +2 -0
- package/esm2022/model/factType.mjs +20 -0
- package/esm2022/model/featureLifetime.mjs +1 -1
- package/esm2022/model/filesystem.mjs +1 -1
- package/esm2022/model/folderCounters.mjs +2 -2
- package/esm2022/model/folderSpecification.mjs +2 -2
- package/esm2022/model/folderType.mjs +2 -2
- package/esm2022/model/general402.mjs +1 -1
- package/esm2022/model/general403.mjs +1 -1
- package/esm2022/model/general404.mjs +1 -1
- package/esm2022/model/general404Detail.mjs +1 -1
- package/esm2022/model/general429.mjs +1 -1
- package/esm2022/model/general500.mjs +1 -1
- package/esm2022/model/generalStatistics.mjs +1 -1
- package/esm2022/model/geoSettings.mjs +2 -2
- package/esm2022/model/geopoint.mjs +2 -2
- package/esm2022/model/hardlink.mjs +1 -1
- package/esm2022/model/hardlinkElement.mjs +1 -1
- package/esm2022/model/hardlinkElementType.mjs +2 -2
- package/esm2022/model/importSample.mjs +2 -2
- package/esm2022/model/importSource.mjs +2 -2
- package/esm2022/model/linkedEssence.mjs +2 -2
- package/esm2022/model/loadStatistics.mjs +1 -1
- package/esm2022/model/location.mjs +1 -1
- package/esm2022/model/locationCargosLimit.mjs +1 -1
- package/esm2022/model/locationCompatibilities.mjs +2 -2
- package/esm2022/model/locationLimit.mjs +1 -1
- package/esm2022/model/locationLimitStatistics.mjs +1 -1
- package/esm2022/model/locationStatistics.mjs +1 -1
- package/esm2022/model/locationTimetableElement.mjs +1 -1
- package/esm2022/model/locationTransportsLimit.mjs +2 -2
- package/esm2022/model/measurements.mjs +1 -1
- package/esm2022/model/models.mjs +11 -5
- package/esm2022/model/order.mjs +1 -1
- package/esm2022/model/orderCompatibilities.mjs +2 -2
- package/esm2022/model/performer.mjs +1 -1
- package/esm2022/model/performerCompatibilities.mjs +1 -1
- package/esm2022/model/performerLimits.mjs +1 -1
- package/esm2022/model/performerShift.mjs +1 -1
- package/esm2022/model/performerTariff.mjs +1 -1
- package/esm2022/model/performerTariffConstraint.mjs +2 -2
- package/esm2022/model/planSettings.mjs +1 -1
- package/esm2022/model/planStatistics.mjs +1 -1
- package/esm2022/model/possibleEvent.mjs +1 -1
- package/esm2022/model/quality.mjs +1 -1
- package/esm2022/model/replanSettings.mjs +1 -1
- package/esm2022/model/replanStrategy.mjs +2 -2
- package/esm2022/model/rest.mjs +2 -2
- package/esm2022/model/restRules.mjs +1 -1
- package/esm2022/model/routingMatrix.mjs +1 -1
- package/esm2022/model/routingTransportMatrix.mjs +1 -1
- package/esm2022/model/schemaError.mjs +2 -2
- package/esm2022/model/service.mjs +2 -2
- package/esm2022/model/stopDemand.mjs +1 -1
- package/esm2022/model/stopStatistics.mjs +1 -1
- package/esm2022/model/tableDataStats.mjs +2 -2
- package/esm2022/model/tableFact.mjs +2 -0
- package/esm2022/model/tableFactColumnType.mjs +26 -0
- package/esm2022/model/tableFactFields.mjs +15 -0
- package/esm2022/model/tableFactFilter.mjs +2 -0
- package/esm2022/model/tableFactFilterList.mjs +2 -0
- package/esm2022/model/tableFactList.mjs +2 -0
- package/esm2022/model/tableFilterBoolList.mjs +2 -2
- package/esm2022/model/tableFilterDatetimeRange.mjs +2 -2
- package/esm2022/model/tableFilterDurationRange.mjs +2 -2
- package/esm2022/model/tableFilterEnumList.mjs +2 -2
- package/esm2022/model/tableFilterFloatRange.mjs +2 -2
- package/esm2022/model/tableFilterIntRange.mjs +2 -2
- package/esm2022/model/tableFilterStringList.mjs +2 -2
- package/esm2022/model/tableFilterStringSearch.mjs +2 -2
- package/esm2022/model/tableFilterType.mjs +2 -2
- package/esm2022/model/tableHardlink.mjs +1 -1
- package/esm2022/model/tableHardlinkColumnType.mjs +2 -2
- package/esm2022/model/tableHardlinkFields.mjs +2 -2
- package/esm2022/model/tableHardlinkFilter.mjs +1 -1
- package/esm2022/model/tableHardlinkFilterList.mjs +1 -1
- package/esm2022/model/tableHardlinkList.mjs +1 -1
- package/esm2022/model/tableListCounters.mjs +1 -1
- package/esm2022/model/tableListCountersDetail.mjs +2 -2
- package/esm2022/model/tableLocation.mjs +1 -1
- package/esm2022/model/tableLocationColumnType.mjs +2 -2
- package/esm2022/model/tableLocationFields.mjs +1 -1
- package/esm2022/model/tableLocationFilter.mjs +1 -1
- package/esm2022/model/tableLocationFilterList.mjs +1 -1
- package/esm2022/model/tableLocationList.mjs +1 -1
- package/esm2022/model/tableOrder.mjs +1 -1
- package/esm2022/model/tableOrderColumnType.mjs +2 -2
- package/esm2022/model/tableOrderFields.mjs +1 -1
- package/esm2022/model/tableOrderFilter.mjs +1 -1
- package/esm2022/model/tableOrderFilterList.mjs +1 -1
- package/esm2022/model/tableOrderList.mjs +1 -1
- package/esm2022/model/tablePerformer.mjs +1 -1
- package/esm2022/model/tablePerformerColumnType.mjs +2 -2
- package/esm2022/model/tablePerformerFields.mjs +1 -1
- package/esm2022/model/tablePerformerFilter.mjs +1 -1
- package/esm2022/model/tablePerformerFilterList.mjs +1 -1
- package/esm2022/model/tablePerformerList.mjs +1 -1
- package/esm2022/model/tableTransport.mjs +1 -1
- package/esm2022/model/tableTransportColumnType.mjs +2 -2
- package/esm2022/model/tableTransportFields.mjs +1 -1
- package/esm2022/model/tableTransportFilter.mjs +1 -1
- package/esm2022/model/tableTransportFilterList.mjs +1 -1
- package/esm2022/model/tableTransportList.mjs +1 -1
- package/esm2022/model/tableTrip.mjs +1 -1
- package/esm2022/model/tableTripColumnType.mjs +2 -2
- package/esm2022/model/tableTripFields.mjs +1 -1
- package/esm2022/model/tableTripFilter.mjs +1 -1
- package/esm2022/model/tableTripFilterList.mjs +1 -1
- package/esm2022/model/tableTripList.mjs +1 -1
- package/esm2022/model/taskStatistics.mjs +1 -1
- package/esm2022/model/timeWindow.mjs +2 -2
- package/esm2022/model/timeWindowViolationDetail.mjs +2 -2
- package/esm2022/model/timeWindowViolations.mjs +1 -1
- package/esm2022/model/tracedata.mjs +1 -1
- package/esm2022/model/transport.mjs +1 -1
- package/esm2022/model/transportCapacityMultiplier.mjs +1 -1
- package/esm2022/model/transportCompatibilities.mjs +1 -1
- package/esm2022/model/transportLimits.mjs +1 -1
- package/esm2022/model/transportLoad.mjs +1 -1
- package/esm2022/model/transportShift.mjs +1 -1
- package/esm2022/model/transportSpeedMultiplier.mjs +1 -1
- package/esm2022/model/transportTariff.mjs +1 -1
- package/esm2022/model/transportTariffConstraint.mjs +2 -2
- package/esm2022/model/transportType.mjs +2 -2
- package/esm2022/model/trip.mjs +1 -1
- package/esm2022/model/tripAssumptions.mjs +1 -1
- package/esm2022/model/tripExpectations.mjs +1 -1
- package/esm2022/model/tripPenalties.mjs +1 -1
- package/esm2022/model/tripStartTimeStrategy.mjs +2 -2
- package/esm2022/model/tripState.mjs +1 -1
- package/esm2022/model/tripStateFlag.mjs +2 -2
- package/esm2022/model/tripStatistics.mjs +1 -1
- package/esm2022/model/tripsSettings.mjs +1 -1
- package/esm2022/model/universalData.mjs +1 -1
- package/esm2022/model/unplannedItems.mjs +2 -2
- package/esm2022/model/versionResult.mjs +2 -2
- package/esm2022/model/waypoint.mjs +1 -1
- package/esm2022/model/webFact.mjs +2 -0
- package/esm2022/model/webHardlink.mjs +1 -1
- package/esm2022/model/webLocation.mjs +1 -1
- package/esm2022/model/webLocationGeopoint.mjs +1 -1
- package/esm2022/model/webLocationGeopointList.mjs +1 -1
- package/esm2022/model/webOrder.mjs +1 -1
- package/esm2022/model/webOrderGeopoint.mjs +1 -1
- package/esm2022/model/webOrderGeopointList.mjs +1 -1
- package/esm2022/model/webPerformer.mjs +1 -1
- package/esm2022/model/webPerformerGeopoint.mjs +1 -1
- package/esm2022/model/webPerformerGeopointList.mjs +1 -1
- package/esm2022/model/webTransport.mjs +1 -1
- package/esm2022/model/webTransportGeopoint.mjs +1 -1
- package/esm2022/model/webTransportGeopointList.mjs +1 -1
- package/esm2022/model/webTrip.mjs +1 -1
- package/esm2022/model/webTripChart.mjs +1 -1
- package/esm2022/model/webTripChartDemand.mjs +1 -1
- package/esm2022/model/webTripChartList.mjs +1 -1
- package/esm2022/model/webTripTrack.mjs +1 -1
- package/esm2022/model/webTripTrackList.mjs +1 -1
- package/esm2022/model/webTripTrackListCustom.mjs +1 -1
- package/esm2022/model/workAndRestRules.mjs +1 -1
- package/fesm2022/veeroute-lss-studio-angular.mjs +1007 -207
- package/fesm2022/veeroute-lss-studio-angular.mjs.map +1 -1
- package/model/actualizeSettings.d.ts +5 -5
- package/model/assignedPerformer.d.ts +1 -1
- package/model/assignedTransport.d.ts +1 -1
- package/model/attribute.d.ts +1 -1
- package/model/basicProcess.d.ts +1 -1
- package/model/basicState.d.ts +1 -1
- package/model/basicTimeWindow.d.ts +1 -1
- package/model/basicTracksType.d.ts +1 -1
- package/model/box.d.ts +1 -1
- package/model/boxCompatibilities.d.ts +1 -1
- package/model/boxLimits.d.ts +1 -1
- package/model/break.d.ts +1 -1
- package/model/breakRules.d.ts +1 -1
- package/model/calculationHistoryElement.d.ts +1 -1
- package/model/calculationInfo.d.ts +1 -1
- package/model/calculationSettings.d.ts +1 -1
- package/model/calculationState.d.ts +1 -1
- package/model/calculationStatus.d.ts +1 -1
- package/model/capacity.d.ts +1 -1
- package/model/capacityCost.d.ts +1 -1
- package/model/capacityLimit.d.ts +1 -1
- package/model/capacityMultiplier.d.ts +1 -1
- package/model/capacityStatisticsLoad.d.ts +1 -1
- package/model/capacityStatisticsRatio.d.ts +1 -1
- package/model/capacityStatisticsSum.d.ts +1 -1
- package/model/cargo.d.ts +1 -1
- package/model/cargoAction.d.ts +1 -1
- package/model/cargoActionType.d.ts +1 -1
- package/model/cargoCompatibilities.d.ts +1 -1
- package/model/cargoRotationType.d.ts +1 -1
- package/model/checkResult.d.ts +1 -1
- package/model/compatibilityPenalty.d.ts +1 -1
- package/model/custom400WithErrorsAndWarnings.d.ts +1 -1
- package/model/demand.d.ts +1 -1
- package/model/demandExtraDuration.d.ts +1 -1
- package/model/demandType.d.ts +1 -1
- package/model/entityError.d.ts +1 -1
- package/model/entityErrorType.d.ts +2 -2
- package/model/entityPath.d.ts +1 -1
- package/model/entityType.d.ts +1 -1
- package/model/entityWarning.d.ts +1 -1
- package/model/entityWarningType.d.ts +5 -3
- package/model/experiment.d.ts +1 -1
- package/model/experimentCheck.d.ts +1 -1
- package/model/experimentList.d.ts +1 -1
- package/model/experimentNeighbors.d.ts +22 -0
- package/model/experimentSettings.d.ts +1 -1
- package/model/experimentSpecification.d.ts +1 -1
- package/model/experimentStatistics.d.ts +1 -1
- package/model/fact.d.ts +44 -0
- package/model/factType.d.ts +18 -0
- package/model/featureLifetime.d.ts +1 -1
- package/model/filesystem.d.ts +1 -1
- package/model/folderCounters.d.ts +1 -1
- package/model/folderSpecification.d.ts +1 -1
- package/model/folderType.d.ts +1 -1
- package/model/general402.d.ts +1 -1
- package/model/general403.d.ts +1 -1
- package/model/general404.d.ts +1 -1
- package/model/general404Detail.d.ts +1 -1
- package/model/general429.d.ts +1 -1
- package/model/general500.d.ts +1 -1
- package/model/generalStatistics.d.ts +1 -1
- package/model/geoSettings.d.ts +1 -1
- package/model/geopoint.d.ts +1 -1
- package/model/hardlink.d.ts +1 -1
- package/model/hardlinkElement.d.ts +1 -1
- package/model/hardlinkElementType.d.ts +1 -1
- package/model/importSample.d.ts +1 -1
- package/model/importSource.d.ts +1 -1
- package/model/linkedEssence.d.ts +1 -1
- package/model/loadStatistics.d.ts +1 -1
- package/model/location.d.ts +1 -1
- package/model/locationCargosLimit.d.ts +1 -1
- package/model/locationCompatibilities.d.ts +1 -1
- package/model/locationLimit.d.ts +17 -5
- package/model/locationLimitStatistics.d.ts +3 -3
- package/model/locationStatistics.d.ts +3 -3
- package/model/locationTimetableElement.d.ts +1 -1
- package/model/locationTransportsLimit.d.ts +1 -1
- package/model/measurements.d.ts +1 -1
- package/model/models.d.ts +10 -4
- package/model/order.d.ts +1 -1
- package/model/orderCompatibilities.d.ts +1 -1
- package/model/performer.d.ts +1 -1
- package/model/performerCompatibilities.d.ts +1 -1
- package/model/performerLimits.d.ts +1 -1
- package/model/performerShift.d.ts +1 -1
- package/model/performerTariff.d.ts +1 -1
- package/model/performerTariffConstraint.d.ts +1 -1
- package/model/planSettings.d.ts +1 -1
- package/model/planStatistics.d.ts +1 -1
- package/model/possibleEvent.d.ts +2 -2
- package/model/quality.d.ts +1 -1
- package/model/replanSettings.d.ts +1 -7
- package/model/replanStrategy.d.ts +1 -1
- package/model/rest.d.ts +1 -1
- package/model/restRules.d.ts +1 -1
- package/model/routingMatrix.d.ts +1 -1
- package/model/routingTransportMatrix.d.ts +1 -1
- package/model/schemaError.d.ts +1 -1
- package/model/service.d.ts +1 -1
- package/model/stopDemand.d.ts +1 -1
- package/model/stopStatistics.d.ts +1 -1
- package/model/tableDataStats.d.ts +1 -1
- package/model/tableFact.d.ts +20 -0
- package/model/tableFactColumnType.d.ts +24 -0
- package/model/tableFactFields.d.ts +61 -0
- package/model/tableFactFilter.d.ts +32 -0
- package/model/tableFactFilterList.d.ts +19 -0
- package/model/tableFactList.d.ts +21 -0
- package/model/tableFilterBoolList.d.ts +1 -1
- package/model/tableFilterDatetimeRange.d.ts +1 -1
- package/model/tableFilterDurationRange.d.ts +1 -1
- package/model/tableFilterEnumList.d.ts +1 -1
- package/model/tableFilterFloatRange.d.ts +1 -1
- package/model/tableFilterIntRange.d.ts +1 -1
- package/model/tableFilterStringList.d.ts +1 -1
- package/model/tableFilterStringSearch.d.ts +1 -1
- package/model/tableFilterType.d.ts +1 -1
- package/model/tableHardlink.d.ts +1 -1
- package/model/tableHardlinkColumnType.d.ts +1 -1
- package/model/tableHardlinkFields.d.ts +1 -1
- package/model/tableHardlinkFilter.d.ts +1 -1
- package/model/tableHardlinkFilterList.d.ts +1 -1
- package/model/tableHardlinkList.d.ts +1 -1
- package/model/tableListCounters.d.ts +1 -1
- package/model/tableListCountersDetail.d.ts +1 -1
- package/model/tableLocation.d.ts +1 -1
- package/model/tableLocationColumnType.d.ts +1 -1
- package/model/tableLocationFields.d.ts +1 -1
- package/model/tableLocationFilter.d.ts +1 -1
- package/model/tableLocationFilterList.d.ts +1 -1
- package/model/tableLocationList.d.ts +1 -1
- package/model/tableOrder.d.ts +1 -1
- package/model/tableOrderColumnType.d.ts +1 -1
- package/model/tableOrderFields.d.ts +1 -1
- package/model/tableOrderFilter.d.ts +3 -1
- package/model/tableOrderFilterList.d.ts +1 -1
- package/model/tableOrderList.d.ts +1 -1
- package/model/tablePerformer.d.ts +1 -1
- package/model/tablePerformerColumnType.d.ts +1 -1
- package/model/tablePerformerFields.d.ts +1 -1
- package/model/tablePerformerFilter.d.ts +1 -1
- package/model/tablePerformerFilterList.d.ts +1 -1
- package/model/tablePerformerList.d.ts +1 -1
- package/model/tableTransport.d.ts +1 -1
- package/model/tableTransportColumnType.d.ts +1 -1
- package/model/tableTransportFields.d.ts +1 -1
- package/model/tableTransportFilter.d.ts +1 -1
- package/model/tableTransportFilterList.d.ts +1 -1
- package/model/tableTransportList.d.ts +1 -1
- package/model/tableTrip.d.ts +1 -1
- package/model/tableTripColumnType.d.ts +1 -1
- package/model/tableTripFields.d.ts +1 -1
- package/model/tableTripFilter.d.ts +1 -1
- package/model/tableTripFilterList.d.ts +1 -1
- package/model/tableTripList.d.ts +1 -1
- package/model/taskStatistics.d.ts +1 -1
- package/model/timeWindow.d.ts +1 -1
- package/model/timeWindowViolationDetail.d.ts +1 -1
- package/model/timeWindowViolations.d.ts +1 -1
- package/model/tracedata.d.ts +1 -1
- package/model/transport.d.ts +1 -1
- package/model/transportCapacityMultiplier.d.ts +1 -1
- package/model/transportCompatibilities.d.ts +1 -1
- package/model/transportLimits.d.ts +1 -1
- package/model/transportLoad.d.ts +1 -1
- package/model/transportShift.d.ts +1 -1
- package/model/transportSpeedMultiplier.d.ts +1 -1
- package/model/transportTariff.d.ts +1 -1
- package/model/transportTariffConstraint.d.ts +1 -1
- package/model/transportType.d.ts +1 -1
- package/model/trip.d.ts +1 -1
- package/model/tripAssumptions.d.ts +1 -1
- package/model/tripExpectations.d.ts +1 -5
- package/model/tripPenalties.d.ts +1 -1
- package/model/tripStartTimeStrategy.d.ts +1 -1
- package/model/tripState.d.ts +1 -1
- package/model/tripStateFlag.d.ts +1 -1
- package/model/tripStatistics.d.ts +1 -1
- package/model/tripsSettings.d.ts +1 -1
- package/model/universalData.d.ts +9 -6
- package/model/unplannedItems.d.ts +10 -10
- package/model/versionResult.d.ts +1 -1
- package/model/waypoint.d.ts +1 -1
- package/model/webFact.d.ts +23 -0
- package/model/webHardlink.d.ts +1 -1
- package/model/webLocation.d.ts +1 -1
- package/model/webLocationGeopoint.d.ts +1 -1
- package/model/webLocationGeopointList.d.ts +1 -1
- package/model/webOrder.d.ts +1 -1
- package/model/webOrderGeopoint.d.ts +1 -1
- package/model/webOrderGeopointList.d.ts +1 -1
- package/model/webPerformer.d.ts +1 -1
- package/model/webPerformerGeopoint.d.ts +1 -1
- package/model/webPerformerGeopointList.d.ts +1 -1
- package/model/webTransport.d.ts +1 -1
- package/model/webTransportGeopoint.d.ts +1 -1
- package/model/webTransportGeopointList.d.ts +1 -1
- package/model/webTrip.d.ts +1 -1
- package/model/webTripChart.d.ts +1 -1
- package/model/webTripChartDemand.d.ts +1 -1
- package/model/webTripChartList.d.ts +1 -1
- package/model/webTripTrack.d.ts +1 -1
- package/model/webTripTrackList.d.ts +1 -1
- package/model/webTripTrackListCustom.d.ts +1 -1
- package/model/workAndRestRules.d.ts +1 -1
- package/package.json +1 -1
- package/esm2022/model/facts.mjs +0 -2
- package/esm2022/model/orderFact.mjs +0 -2
- package/esm2022/model/orderFactType.mjs +0 -20
- package/esm2022/model/performerFact.mjs +0 -11
- package/model/facts.d.ts +0 -24
- package/model/orderFact.d.ts +0 -32
- package/model/orderFactType.d.ts +0 -18
- package/model/performerFact.d.ts +0 -30
|
@@ -0,0 +1,629 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VRt.Studio [ST]
|
|
3
|
+
*
|
|
4
|
+
* The version of the OpenAPI document: 7.2.2444
|
|
5
|
+
* Contact: servicedesk@veeroute.com
|
|
6
|
+
*
|
|
7
|
+
* NOTE: This class is auto generated by OpenAPI Generator.
|
|
8
|
+
* Do not edit the class manually.
|
|
9
|
+
*/
|
|
10
|
+
/* tslint:disable:no-unused-variable member-ordering */
|
|
11
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
12
|
+
import { HttpHeaders, HttpParams, HttpContext } from '@angular/common/http';
|
|
13
|
+
import { CustomHttpParameterCodec } from '../encoder';
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
import { BASE_PATH } from '../variables';
|
|
16
|
+
import { Configuration } from '../configuration';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
import * as i1 from "@angular/common/http";
|
|
19
|
+
import * as i2 from "../configuration";
|
|
20
|
+
export class FactsService {
|
|
21
|
+
httpClient;
|
|
22
|
+
basePath = 'https://api.edge7.veeroute.cloud';
|
|
23
|
+
defaultHeaders = new HttpHeaders();
|
|
24
|
+
configuration = new Configuration();
|
|
25
|
+
encoder;
|
|
26
|
+
constructor(httpClient, basePath, configuration) {
|
|
27
|
+
this.httpClient = httpClient;
|
|
28
|
+
if (configuration) {
|
|
29
|
+
this.configuration = configuration;
|
|
30
|
+
}
|
|
31
|
+
if (typeof this.configuration.basePath !== 'string') {
|
|
32
|
+
if (Array.isArray(basePath) && basePath.length > 0) {
|
|
33
|
+
basePath = basePath[0];
|
|
34
|
+
}
|
|
35
|
+
if (typeof basePath !== 'string') {
|
|
36
|
+
basePath = this.basePath;
|
|
37
|
+
}
|
|
38
|
+
this.configuration.basePath = basePath;
|
|
39
|
+
}
|
|
40
|
+
this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
|
|
41
|
+
}
|
|
42
|
+
// @ts-ignore
|
|
43
|
+
addToHttpParams(httpParams, value, key) {
|
|
44
|
+
if (typeof value === "object" && value instanceof Date === false) {
|
|
45
|
+
httpParams = this.addToHttpParamsRecursive(httpParams, value);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
|
|
49
|
+
}
|
|
50
|
+
return httpParams;
|
|
51
|
+
}
|
|
52
|
+
addToHttpParamsRecursive(httpParams, value, key) {
|
|
53
|
+
if (value == null) {
|
|
54
|
+
return httpParams;
|
|
55
|
+
}
|
|
56
|
+
if (typeof value === "object") {
|
|
57
|
+
if (Array.isArray(value)) {
|
|
58
|
+
value.forEach(elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key));
|
|
59
|
+
}
|
|
60
|
+
else if (value instanceof Date) {
|
|
61
|
+
if (key != null) {
|
|
62
|
+
httpParams = httpParams.append(key, value.toISOString().substring(0, 10));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw Error("key may not be null if value is Date");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
Object.keys(value).forEach(k => httpParams = this.addToHttpParamsRecursive(httpParams, value[k], key != null ? `${key}.${k}` : k));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (key != null) {
|
|
73
|
+
httpParams = httpParams.append(key, value);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw Error("key may not be null if value is not object or array");
|
|
77
|
+
}
|
|
78
|
+
return httpParams;
|
|
79
|
+
}
|
|
80
|
+
createFact(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
81
|
+
const experimentKey = requestParameters.experimentKey;
|
|
82
|
+
if (experimentKey === null || experimentKey === undefined) {
|
|
83
|
+
throw new Error('Required parameter experimentKey was null or undefined when calling createFact.');
|
|
84
|
+
}
|
|
85
|
+
const webFactStudio = requestParameters.webFactStudio;
|
|
86
|
+
if (webFactStudio === null || webFactStudio === undefined) {
|
|
87
|
+
throw new Error('Required parameter webFactStudio was null or undefined when calling createFact.');
|
|
88
|
+
}
|
|
89
|
+
let localVarHeaders = this.defaultHeaders;
|
|
90
|
+
let localVarCredential;
|
|
91
|
+
// authentication (ApiKeyAuth) required
|
|
92
|
+
localVarCredential = this.configuration.lookupCredential('ApiKeyAuth');
|
|
93
|
+
if (localVarCredential) {
|
|
94
|
+
localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
|
|
95
|
+
}
|
|
96
|
+
let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
|
|
97
|
+
if (localVarHttpHeaderAcceptSelected === undefined) {
|
|
98
|
+
// to determine the Accept header
|
|
99
|
+
const httpHeaderAccepts = [
|
|
100
|
+
'application/json'
|
|
101
|
+
];
|
|
102
|
+
localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
|
|
103
|
+
}
|
|
104
|
+
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
105
|
+
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
106
|
+
}
|
|
107
|
+
let localVarHttpContext = options && options.context;
|
|
108
|
+
if (localVarHttpContext === undefined) {
|
|
109
|
+
localVarHttpContext = new HttpContext();
|
|
110
|
+
}
|
|
111
|
+
let localVarTransferCache = options && options.transferCache;
|
|
112
|
+
if (localVarTransferCache === undefined) {
|
|
113
|
+
localVarTransferCache = true;
|
|
114
|
+
}
|
|
115
|
+
// to determine the Content-Type header
|
|
116
|
+
const consumes = [
|
|
117
|
+
'application/json'
|
|
118
|
+
];
|
|
119
|
+
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
120
|
+
if (httpContentTypeSelected !== undefined) {
|
|
121
|
+
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
122
|
+
}
|
|
123
|
+
let responseType_ = 'json';
|
|
124
|
+
if (localVarHttpHeaderAcceptSelected) {
|
|
125
|
+
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
126
|
+
responseType_ = 'text';
|
|
127
|
+
}
|
|
128
|
+
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
129
|
+
responseType_ = 'json';
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
responseType_ = 'blob';
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "experimentKey", value: experimentKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts`;
|
|
136
|
+
return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
|
|
137
|
+
context: localVarHttpContext,
|
|
138
|
+
body: webFactStudio,
|
|
139
|
+
responseType: responseType_,
|
|
140
|
+
withCredentials: this.configuration.withCredentials,
|
|
141
|
+
headers: localVarHeaders,
|
|
142
|
+
observe: observe,
|
|
143
|
+
transferCache: localVarTransferCache,
|
|
144
|
+
reportProgress: reportProgress
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
deleteFact(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
148
|
+
const experimentKey = requestParameters.experimentKey;
|
|
149
|
+
if (experimentKey === null || experimentKey === undefined) {
|
|
150
|
+
throw new Error('Required parameter experimentKey was null or undefined when calling deleteFact.');
|
|
151
|
+
}
|
|
152
|
+
const essenceKey = requestParameters.essenceKey;
|
|
153
|
+
if (essenceKey === null || essenceKey === undefined) {
|
|
154
|
+
throw new Error('Required parameter essenceKey was null or undefined when calling deleteFact.');
|
|
155
|
+
}
|
|
156
|
+
let localVarHeaders = this.defaultHeaders;
|
|
157
|
+
let localVarCredential;
|
|
158
|
+
// authentication (ApiKeyAuth) required
|
|
159
|
+
localVarCredential = this.configuration.lookupCredential('ApiKeyAuth');
|
|
160
|
+
if (localVarCredential) {
|
|
161
|
+
localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
|
|
162
|
+
}
|
|
163
|
+
let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
|
|
164
|
+
if (localVarHttpHeaderAcceptSelected === undefined) {
|
|
165
|
+
// to determine the Accept header
|
|
166
|
+
const httpHeaderAccepts = [
|
|
167
|
+
'application/json'
|
|
168
|
+
];
|
|
169
|
+
localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
|
|
170
|
+
}
|
|
171
|
+
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
172
|
+
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
173
|
+
}
|
|
174
|
+
let localVarHttpContext = options && options.context;
|
|
175
|
+
if (localVarHttpContext === undefined) {
|
|
176
|
+
localVarHttpContext = new HttpContext();
|
|
177
|
+
}
|
|
178
|
+
let localVarTransferCache = options && options.transferCache;
|
|
179
|
+
if (localVarTransferCache === undefined) {
|
|
180
|
+
localVarTransferCache = true;
|
|
181
|
+
}
|
|
182
|
+
let responseType_ = 'json';
|
|
183
|
+
if (localVarHttpHeaderAcceptSelected) {
|
|
184
|
+
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
185
|
+
responseType_ = 'text';
|
|
186
|
+
}
|
|
187
|
+
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
188
|
+
responseType_ = 'json';
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
responseType_ = 'blob';
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "experimentKey", value: experimentKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/${this.configuration.encodeParam({ name: "essenceKey", value: essenceKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
|
|
195
|
+
return this.httpClient.request('delete', `${this.configuration.basePath}${localVarPath}`, {
|
|
196
|
+
context: localVarHttpContext,
|
|
197
|
+
responseType: responseType_,
|
|
198
|
+
withCredentials: this.configuration.withCredentials,
|
|
199
|
+
headers: localVarHeaders,
|
|
200
|
+
observe: observe,
|
|
201
|
+
transferCache: localVarTransferCache,
|
|
202
|
+
reportProgress: reportProgress
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
deleteFacts(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
206
|
+
const experimentKey = requestParameters.experimentKey;
|
|
207
|
+
if (experimentKey === null || experimentKey === undefined) {
|
|
208
|
+
throw new Error('Required parameter experimentKey was null or undefined when calling deleteFacts.');
|
|
209
|
+
}
|
|
210
|
+
const requestBody = requestParameters.requestBody;
|
|
211
|
+
if (requestBody === null || requestBody === undefined) {
|
|
212
|
+
throw new Error('Required parameter requestBody was null or undefined when calling deleteFacts.');
|
|
213
|
+
}
|
|
214
|
+
let localVarHeaders = this.defaultHeaders;
|
|
215
|
+
let localVarCredential;
|
|
216
|
+
// authentication (ApiKeyAuth) required
|
|
217
|
+
localVarCredential = this.configuration.lookupCredential('ApiKeyAuth');
|
|
218
|
+
if (localVarCredential) {
|
|
219
|
+
localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
|
|
220
|
+
}
|
|
221
|
+
let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
|
|
222
|
+
if (localVarHttpHeaderAcceptSelected === undefined) {
|
|
223
|
+
// to determine the Accept header
|
|
224
|
+
const httpHeaderAccepts = [
|
|
225
|
+
'application/json'
|
|
226
|
+
];
|
|
227
|
+
localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
|
|
228
|
+
}
|
|
229
|
+
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
230
|
+
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
231
|
+
}
|
|
232
|
+
let localVarHttpContext = options && options.context;
|
|
233
|
+
if (localVarHttpContext === undefined) {
|
|
234
|
+
localVarHttpContext = new HttpContext();
|
|
235
|
+
}
|
|
236
|
+
let localVarTransferCache = options && options.transferCache;
|
|
237
|
+
if (localVarTransferCache === undefined) {
|
|
238
|
+
localVarTransferCache = true;
|
|
239
|
+
}
|
|
240
|
+
// to determine the Content-Type header
|
|
241
|
+
const consumes = [
|
|
242
|
+
'application/json'
|
|
243
|
+
];
|
|
244
|
+
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
245
|
+
if (httpContentTypeSelected !== undefined) {
|
|
246
|
+
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
247
|
+
}
|
|
248
|
+
let responseType_ = 'json';
|
|
249
|
+
if (localVarHttpHeaderAcceptSelected) {
|
|
250
|
+
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
251
|
+
responseType_ = 'text';
|
|
252
|
+
}
|
|
253
|
+
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
254
|
+
responseType_ = 'json';
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
responseType_ = 'blob';
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "experimentKey", value: experimentKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/batch/list`;
|
|
261
|
+
return this.httpClient.request('delete', `${this.configuration.basePath}${localVarPath}`, {
|
|
262
|
+
context: localVarHttpContext,
|
|
263
|
+
body: requestBody,
|
|
264
|
+
responseType: responseType_,
|
|
265
|
+
withCredentials: this.configuration.withCredentials,
|
|
266
|
+
headers: localVarHeaders,
|
|
267
|
+
observe: observe,
|
|
268
|
+
transferCache: localVarTransferCache,
|
|
269
|
+
reportProgress: reportProgress
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
disableFacts(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
273
|
+
const experimentKey = requestParameters.experimentKey;
|
|
274
|
+
if (experimentKey === null || experimentKey === undefined) {
|
|
275
|
+
throw new Error('Required parameter experimentKey was null or undefined when calling disableFacts.');
|
|
276
|
+
}
|
|
277
|
+
const requestBody = requestParameters.requestBody;
|
|
278
|
+
if (requestBody === null || requestBody === undefined) {
|
|
279
|
+
throw new Error('Required parameter requestBody was null or undefined when calling disableFacts.');
|
|
280
|
+
}
|
|
281
|
+
let localVarHeaders = this.defaultHeaders;
|
|
282
|
+
let localVarCredential;
|
|
283
|
+
// authentication (ApiKeyAuth) required
|
|
284
|
+
localVarCredential = this.configuration.lookupCredential('ApiKeyAuth');
|
|
285
|
+
if (localVarCredential) {
|
|
286
|
+
localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
|
|
287
|
+
}
|
|
288
|
+
let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
|
|
289
|
+
if (localVarHttpHeaderAcceptSelected === undefined) {
|
|
290
|
+
// to determine the Accept header
|
|
291
|
+
const httpHeaderAccepts = [
|
|
292
|
+
'application/json'
|
|
293
|
+
];
|
|
294
|
+
localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
|
|
295
|
+
}
|
|
296
|
+
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
297
|
+
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
298
|
+
}
|
|
299
|
+
let localVarHttpContext = options && options.context;
|
|
300
|
+
if (localVarHttpContext === undefined) {
|
|
301
|
+
localVarHttpContext = new HttpContext();
|
|
302
|
+
}
|
|
303
|
+
let localVarTransferCache = options && options.transferCache;
|
|
304
|
+
if (localVarTransferCache === undefined) {
|
|
305
|
+
localVarTransferCache = true;
|
|
306
|
+
}
|
|
307
|
+
// to determine the Content-Type header
|
|
308
|
+
const consumes = [
|
|
309
|
+
'application/json'
|
|
310
|
+
];
|
|
311
|
+
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
312
|
+
if (httpContentTypeSelected !== undefined) {
|
|
313
|
+
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
314
|
+
}
|
|
315
|
+
let responseType_ = 'json';
|
|
316
|
+
if (localVarHttpHeaderAcceptSelected) {
|
|
317
|
+
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
318
|
+
responseType_ = 'text';
|
|
319
|
+
}
|
|
320
|
+
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
321
|
+
responseType_ = 'json';
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
responseType_ = 'blob';
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "experimentKey", value: experimentKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/batch/ability`;
|
|
328
|
+
return this.httpClient.request('delete', `${this.configuration.basePath}${localVarPath}`, {
|
|
329
|
+
context: localVarHttpContext,
|
|
330
|
+
body: requestBody,
|
|
331
|
+
responseType: responseType_,
|
|
332
|
+
withCredentials: this.configuration.withCredentials,
|
|
333
|
+
headers: localVarHeaders,
|
|
334
|
+
observe: observe,
|
|
335
|
+
transferCache: localVarTransferCache,
|
|
336
|
+
reportProgress: reportProgress
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
enableFacts(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
340
|
+
const experimentKey = requestParameters.experimentKey;
|
|
341
|
+
if (experimentKey === null || experimentKey === undefined) {
|
|
342
|
+
throw new Error('Required parameter experimentKey was null or undefined when calling enableFacts.');
|
|
343
|
+
}
|
|
344
|
+
const requestBody = requestParameters.requestBody;
|
|
345
|
+
if (requestBody === null || requestBody === undefined) {
|
|
346
|
+
throw new Error('Required parameter requestBody was null or undefined when calling enableFacts.');
|
|
347
|
+
}
|
|
348
|
+
let localVarHeaders = this.defaultHeaders;
|
|
349
|
+
let localVarCredential;
|
|
350
|
+
// authentication (ApiKeyAuth) required
|
|
351
|
+
localVarCredential = this.configuration.lookupCredential('ApiKeyAuth');
|
|
352
|
+
if (localVarCredential) {
|
|
353
|
+
localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
|
|
354
|
+
}
|
|
355
|
+
let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
|
|
356
|
+
if (localVarHttpHeaderAcceptSelected === undefined) {
|
|
357
|
+
// to determine the Accept header
|
|
358
|
+
const httpHeaderAccepts = [
|
|
359
|
+
'application/json'
|
|
360
|
+
];
|
|
361
|
+
localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
|
|
362
|
+
}
|
|
363
|
+
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
364
|
+
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
365
|
+
}
|
|
366
|
+
let localVarHttpContext = options && options.context;
|
|
367
|
+
if (localVarHttpContext === undefined) {
|
|
368
|
+
localVarHttpContext = new HttpContext();
|
|
369
|
+
}
|
|
370
|
+
let localVarTransferCache = options && options.transferCache;
|
|
371
|
+
if (localVarTransferCache === undefined) {
|
|
372
|
+
localVarTransferCache = true;
|
|
373
|
+
}
|
|
374
|
+
// to determine the Content-Type header
|
|
375
|
+
const consumes = [
|
|
376
|
+
'application/json'
|
|
377
|
+
];
|
|
378
|
+
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
379
|
+
if (httpContentTypeSelected !== undefined) {
|
|
380
|
+
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
381
|
+
}
|
|
382
|
+
let responseType_ = 'json';
|
|
383
|
+
if (localVarHttpHeaderAcceptSelected) {
|
|
384
|
+
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
385
|
+
responseType_ = 'text';
|
|
386
|
+
}
|
|
387
|
+
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
388
|
+
responseType_ = 'json';
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
responseType_ = 'blob';
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "experimentKey", value: experimentKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/batch/ability`;
|
|
395
|
+
return this.httpClient.request('put', `${this.configuration.basePath}${localVarPath}`, {
|
|
396
|
+
context: localVarHttpContext,
|
|
397
|
+
body: requestBody,
|
|
398
|
+
responseType: responseType_,
|
|
399
|
+
withCredentials: this.configuration.withCredentials,
|
|
400
|
+
headers: localVarHeaders,
|
|
401
|
+
observe: observe,
|
|
402
|
+
transferCache: localVarTransferCache,
|
|
403
|
+
reportProgress: reportProgress
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
readFact(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
407
|
+
const experimentKey = requestParameters.experimentKey;
|
|
408
|
+
if (experimentKey === null || experimentKey === undefined) {
|
|
409
|
+
throw new Error('Required parameter experimentKey was null or undefined when calling readFact.');
|
|
410
|
+
}
|
|
411
|
+
const essenceKey = requestParameters.essenceKey;
|
|
412
|
+
if (essenceKey === null || essenceKey === undefined) {
|
|
413
|
+
throw new Error('Required parameter essenceKey was null or undefined when calling readFact.');
|
|
414
|
+
}
|
|
415
|
+
let localVarHeaders = this.defaultHeaders;
|
|
416
|
+
let localVarCredential;
|
|
417
|
+
// authentication (ApiKeyAuth) required
|
|
418
|
+
localVarCredential = this.configuration.lookupCredential('ApiKeyAuth');
|
|
419
|
+
if (localVarCredential) {
|
|
420
|
+
localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
|
|
421
|
+
}
|
|
422
|
+
let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
|
|
423
|
+
if (localVarHttpHeaderAcceptSelected === undefined) {
|
|
424
|
+
// to determine the Accept header
|
|
425
|
+
const httpHeaderAccepts = [
|
|
426
|
+
'application/json'
|
|
427
|
+
];
|
|
428
|
+
localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
|
|
429
|
+
}
|
|
430
|
+
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
431
|
+
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
432
|
+
}
|
|
433
|
+
let localVarHttpContext = options && options.context;
|
|
434
|
+
if (localVarHttpContext === undefined) {
|
|
435
|
+
localVarHttpContext = new HttpContext();
|
|
436
|
+
}
|
|
437
|
+
let localVarTransferCache = options && options.transferCache;
|
|
438
|
+
if (localVarTransferCache === undefined) {
|
|
439
|
+
localVarTransferCache = true;
|
|
440
|
+
}
|
|
441
|
+
let responseType_ = 'json';
|
|
442
|
+
if (localVarHttpHeaderAcceptSelected) {
|
|
443
|
+
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
444
|
+
responseType_ = 'text';
|
|
445
|
+
}
|
|
446
|
+
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
447
|
+
responseType_ = 'json';
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
responseType_ = 'blob';
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "experimentKey", value: experimentKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/${this.configuration.encodeParam({ name: "essenceKey", value: essenceKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
|
|
454
|
+
return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
|
|
455
|
+
context: localVarHttpContext,
|
|
456
|
+
responseType: responseType_,
|
|
457
|
+
withCredentials: this.configuration.withCredentials,
|
|
458
|
+
headers: localVarHeaders,
|
|
459
|
+
observe: observe,
|
|
460
|
+
transferCache: localVarTransferCache,
|
|
461
|
+
reportProgress: reportProgress
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
readFacts(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
465
|
+
const experimentKey = requestParameters.experimentKey;
|
|
466
|
+
if (experimentKey === null || experimentKey === undefined) {
|
|
467
|
+
throw new Error('Required parameter experimentKey was null or undefined when calling readFacts.');
|
|
468
|
+
}
|
|
469
|
+
const offset = requestParameters.offset;
|
|
470
|
+
const limit = requestParameters.limit;
|
|
471
|
+
const sortField = requestParameters.sortField;
|
|
472
|
+
const sortDirection = requestParameters.sortDirection;
|
|
473
|
+
const tableFactFilterListStudio = requestParameters.tableFactFilterListStudio;
|
|
474
|
+
let localVarQueryParameters = new HttpParams({ encoder: this.encoder });
|
|
475
|
+
if (offset !== undefined && offset !== null) {
|
|
476
|
+
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, offset, 'offset');
|
|
477
|
+
}
|
|
478
|
+
if (limit !== undefined && limit !== null) {
|
|
479
|
+
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, limit, 'limit');
|
|
480
|
+
}
|
|
481
|
+
if (sortField !== undefined && sortField !== null) {
|
|
482
|
+
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, sortField, 'sort_field');
|
|
483
|
+
}
|
|
484
|
+
if (sortDirection !== undefined && sortDirection !== null) {
|
|
485
|
+
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, sortDirection, 'sort_direction');
|
|
486
|
+
}
|
|
487
|
+
let localVarHeaders = this.defaultHeaders;
|
|
488
|
+
let localVarCredential;
|
|
489
|
+
// authentication (ApiKeyAuth) required
|
|
490
|
+
localVarCredential = this.configuration.lookupCredential('ApiKeyAuth');
|
|
491
|
+
if (localVarCredential) {
|
|
492
|
+
localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
|
|
493
|
+
}
|
|
494
|
+
let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
|
|
495
|
+
if (localVarHttpHeaderAcceptSelected === undefined) {
|
|
496
|
+
// to determine the Accept header
|
|
497
|
+
const httpHeaderAccepts = [
|
|
498
|
+
'application/json'
|
|
499
|
+
];
|
|
500
|
+
localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
|
|
501
|
+
}
|
|
502
|
+
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
503
|
+
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
504
|
+
}
|
|
505
|
+
let localVarHttpContext = options && options.context;
|
|
506
|
+
if (localVarHttpContext === undefined) {
|
|
507
|
+
localVarHttpContext = new HttpContext();
|
|
508
|
+
}
|
|
509
|
+
let localVarTransferCache = options && options.transferCache;
|
|
510
|
+
if (localVarTransferCache === undefined) {
|
|
511
|
+
localVarTransferCache = true;
|
|
512
|
+
}
|
|
513
|
+
// to determine the Content-Type header
|
|
514
|
+
const consumes = [
|
|
515
|
+
'application/json'
|
|
516
|
+
];
|
|
517
|
+
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
518
|
+
if (httpContentTypeSelected !== undefined) {
|
|
519
|
+
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
520
|
+
}
|
|
521
|
+
let responseType_ = 'json';
|
|
522
|
+
if (localVarHttpHeaderAcceptSelected) {
|
|
523
|
+
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
524
|
+
responseType_ = 'text';
|
|
525
|
+
}
|
|
526
|
+
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
527
|
+
responseType_ = 'json';
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
responseType_ = 'blob';
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "experimentKey", value: experimentKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/batch/list`;
|
|
534
|
+
return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
|
|
535
|
+
context: localVarHttpContext,
|
|
536
|
+
body: tableFactFilterListStudio,
|
|
537
|
+
params: localVarQueryParameters,
|
|
538
|
+
responseType: responseType_,
|
|
539
|
+
withCredentials: this.configuration.withCredentials,
|
|
540
|
+
headers: localVarHeaders,
|
|
541
|
+
observe: observe,
|
|
542
|
+
transferCache: localVarTransferCache,
|
|
543
|
+
reportProgress: reportProgress
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
updateFact(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
547
|
+
const experimentKey = requestParameters.experimentKey;
|
|
548
|
+
if (experimentKey === null || experimentKey === undefined) {
|
|
549
|
+
throw new Error('Required parameter experimentKey was null or undefined when calling updateFact.');
|
|
550
|
+
}
|
|
551
|
+
const webFactStudio = requestParameters.webFactStudio;
|
|
552
|
+
if (webFactStudio === null || webFactStudio === undefined) {
|
|
553
|
+
throw new Error('Required parameter webFactStudio was null or undefined when calling updateFact.');
|
|
554
|
+
}
|
|
555
|
+
let localVarHeaders = this.defaultHeaders;
|
|
556
|
+
let localVarCredential;
|
|
557
|
+
// authentication (ApiKeyAuth) required
|
|
558
|
+
localVarCredential = this.configuration.lookupCredential('ApiKeyAuth');
|
|
559
|
+
if (localVarCredential) {
|
|
560
|
+
localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
|
|
561
|
+
}
|
|
562
|
+
let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
|
|
563
|
+
if (localVarHttpHeaderAcceptSelected === undefined) {
|
|
564
|
+
// to determine the Accept header
|
|
565
|
+
const httpHeaderAccepts = [
|
|
566
|
+
'application/json'
|
|
567
|
+
];
|
|
568
|
+
localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
|
|
569
|
+
}
|
|
570
|
+
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
571
|
+
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
572
|
+
}
|
|
573
|
+
let localVarHttpContext = options && options.context;
|
|
574
|
+
if (localVarHttpContext === undefined) {
|
|
575
|
+
localVarHttpContext = new HttpContext();
|
|
576
|
+
}
|
|
577
|
+
let localVarTransferCache = options && options.transferCache;
|
|
578
|
+
if (localVarTransferCache === undefined) {
|
|
579
|
+
localVarTransferCache = true;
|
|
580
|
+
}
|
|
581
|
+
// to determine the Content-Type header
|
|
582
|
+
const consumes = [
|
|
583
|
+
'application/json'
|
|
584
|
+
];
|
|
585
|
+
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
586
|
+
if (httpContentTypeSelected !== undefined) {
|
|
587
|
+
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
588
|
+
}
|
|
589
|
+
let responseType_ = 'json';
|
|
590
|
+
if (localVarHttpHeaderAcceptSelected) {
|
|
591
|
+
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
592
|
+
responseType_ = 'text';
|
|
593
|
+
}
|
|
594
|
+
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
595
|
+
responseType_ = 'json';
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
responseType_ = 'blob';
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "experimentKey", value: experimentKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts`;
|
|
602
|
+
return this.httpClient.request('put', `${this.configuration.basePath}${localVarPath}`, {
|
|
603
|
+
context: localVarHttpContext,
|
|
604
|
+
body: webFactStudio,
|
|
605
|
+
responseType: responseType_,
|
|
606
|
+
withCredentials: this.configuration.withCredentials,
|
|
607
|
+
headers: localVarHeaders,
|
|
608
|
+
observe: observe,
|
|
609
|
+
transferCache: localVarTransferCache,
|
|
610
|
+
reportProgress: reportProgress
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FactsService, deps: [{ token: i1.HttpClient }, { token: BASE_PATH, optional: true }, { token: i2.Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
614
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FactsService, providedIn: 'root' });
|
|
615
|
+
}
|
|
616
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FactsService, decorators: [{
|
|
617
|
+
type: Injectable,
|
|
618
|
+
args: [{
|
|
619
|
+
providedIn: 'root'
|
|
620
|
+
}]
|
|
621
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
|
|
622
|
+
type: Optional
|
|
623
|
+
}, {
|
|
624
|
+
type: Inject,
|
|
625
|
+
args: [BASE_PATH]
|
|
626
|
+
}] }, { type: i2.Configuration, decorators: [{
|
|
627
|
+
type: Optional
|
|
628
|
+
}] }] });
|
|
629
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdHNTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYXBpL2ZhY3RzU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBMkIsZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxXQUFXLEVBQUUsVUFBVSxFQUNVLFdBQVcsRUFDeEQsTUFBWSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBK0IsWUFBWSxDQUFDO0FBd0IvRSxhQUFhO0FBQ2IsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFrQnJGLE1BQU0sT0FBTyxZQUFZO0lBT0M7SUFMWixRQUFRLEdBQUcsa0NBQWtDLENBQUM7SUFDakQsY0FBYyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDbkMsYUFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDcEMsT0FBTyxDQUFxQjtJQUVuQyxZQUFzQixVQUFzQixFQUFnQyxRQUF5QixFQUFjLGFBQTRCO1FBQXpILGVBQVUsR0FBVixVQUFVLENBQVk7UUFDeEMsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqRCxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLENBQUM7WUFF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YUFBYSxFQUFFLHFCQUFxQjtZQUNwQyxjQUFjLEVBQUUsY0FBYztTQUNqQyxDQUNKLENBQUM7SUFDTixDQUFDO3dHQW52QlEsWUFBWSw0Q0FPNEMsU0FBUzs0R0FQakUsWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFRa0QsUUFBUTs7MEJBQUcsTUFBTTsyQkFBQyxTQUFTOzswQkFBOEIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVlJ0LlN0dWRpbyBbU1RdXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDcuMi4yNDQ0XG4gKiBDb250YWN0OiBzZXJ2aWNlZGVza0B2ZWVyb3V0ZS5jb21cbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yLlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgbWVtYmVyLW9yZGVyaW5nICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLFxuICAgICAgICAgSHR0cFJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBQYXJhbWV0ZXJDb2RlYywgSHR0cENvbnRleHQgXG4gICAgICAgIH0gICAgICAgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjIH0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2VuY29kZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ3J4anMnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBDdXN0b200MDBXaXRoRXJyb3JzQW5kV2FybmluZ3NTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC9jdXN0b200MDBXaXRoRXJyb3JzQW5kV2FybmluZ3MnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDQwMlN0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw0MDInO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDQwM1N0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw0MDMnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDQwNFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw0MDQnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDQyOVN0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw0MjknO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDUwMFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw1MDAnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVGFibGVGYWN0Q29sdW1uVHlwZVN0dWRpbyB9IGZyb20gJy4uL21vZGVsL3RhYmxlRmFjdENvbHVtblR5cGUnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVGFibGVGYWN0RmlsdGVyTGlzdFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL3RhYmxlRmFjdEZpbHRlckxpc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVGFibGVGYWN0TGlzdFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL3RhYmxlRmFjdExpc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgV2ViRmFjdFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL3dlYkZhY3QnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBCQVNFX1BBVEgsIENPTExFQ1RJT05fRk9STUFUUyB9ICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vdmFyaWFibGVzJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7XG4gICAgRmFjdHNTZXJ2aWNlSW50ZXJmYWNlLFxuICAgIENyZWF0ZUZhY3RSZXF1ZXN0UGFyYW1zLFxuICAgIERlbGV0ZUZhY3RSZXF1ZXN0UGFyYW1zLFxuICAgIERlbGV0ZUZhY3RzUmVxdWVzdFBhcmFtcyxcbiAgICBEaXNhYmxlRmFjdHNSZXF1ZXN0UGFyYW1zLFxuICAgIEVuYWJsZUZhY3RzUmVxdWVzdFBhcmFtcyxcbiAgICBSZWFkRmFjdFJlcXVlc3RQYXJhbXMsXG4gICAgUmVhZEZhY3RzUmVxdWVzdFBhcmFtcyxcbiAgICBVcGRhdGVGYWN0UmVxdWVzdFBhcmFtc1xufSBmcm9tICcuL2ZhY3RzU2VydmljZUludGVyZmFjZSc7XG5cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGYWN0c1NlcnZpY2UgaW1wbGVtZW50cyBGYWN0c1NlcnZpY2VJbnRlcmZhY2Uge1xuXG4gICAgcHJvdGVjdGVkIGJhc2VQYXRoID0gJ2h0dHBzOi8vYXBpLmVkZ2U3LnZlZXJvdXRlLmNsb3VkJztcbiAgICBwdWJsaWMgZGVmYXVsdEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgcHVibGljIGVuY29kZXI6IEh0dHBQYXJhbWV0ZXJDb2RlYztcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nfHN0cmluZ1tdLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmFzZVBhdGgpICYmIGJhc2VQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IGJhc2VQYXRoWzBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5jb2RlciA9IHRoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVyIHx8IG5ldyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMoKTtcbiAgICB9XG5cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtcyhodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlPzogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgKHZhbHVlIGFzIGFueVtdKS5mb3JFYWNoKCBlbGVtID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCBlbGVtLCBrZXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIERhdGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCggayA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMsIHZhbHVlW2tdLCBrZXkgIT0gbnVsbCA/IGAke2tleX0uJHtrfWAgOiBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBmYWN0XG4gICAgICogQ3JlYXRlIG5ldyBmYWN0LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBDcmVhdGVGYWN0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxXZWJGYWN0U3R1ZGlvPjtcbiAgICBwdWJsaWMgY3JlYXRlRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogQ3JlYXRlRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxXZWJGYWN0U3R1ZGlvPj47XG4gICAgcHVibGljIGNyZWF0ZUZhY3QocmVxdWVzdFBhcmFtZXRlcnM6IENyZWF0ZUZhY3RSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFdlYkZhY3RTdHVkaW8+PjtcbiAgICBwdWJsaWMgY3JlYXRlRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogQ3JlYXRlRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGV4cGVyaW1lbnRLZXkgPSByZXF1ZXN0UGFyYW1ldGVycy5leHBlcmltZW50S2V5O1xuICAgICAgICBpZiAoZXhwZXJpbWVudEtleSA9PT0gbnVsbCB8fCBleHBlcmltZW50S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRLZXkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVGYWN0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdlYkZhY3RTdHVkaW8gPSByZXF1ZXN0UGFyYW1ldGVycy53ZWJGYWN0U3R1ZGlvO1xuICAgICAgICBpZiAod2ViRmFjdFN0dWRpbyA9PT0gbnVsbCB8fCB3ZWJGYWN0U3R1ZGlvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHdlYkZhY3RTdHVkaW8gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVGYWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0FwaUtleUF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3N0dWRpby9leHBlcmltZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJleHBlcmltZW50S2V5XCIsIHZhbHVlOiBleHBlcmltZW50S2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IFwidXVpZFwifSl9L2ZhY3RzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFdlYkZhY3RTdHVkaW8+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB3ZWJGYWN0U3R1ZGlvLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRpbmcgb25lIGZhY3RcbiAgICAgKiBSZW1vdmluZyBhIGZhY3QgYnkga2V5LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBEZWxldGVGYWN0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHB1YmxpYyBkZWxldGVGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBEZWxldGVGYWN0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPGFueT4+O1xuICAgIHB1YmxpYyBkZWxldGVGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBEZWxldGVGYWN0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PjtcbiAgICBwdWJsaWMgZGVsZXRlRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGV4cGVyaW1lbnRLZXkgPSByZXF1ZXN0UGFyYW1ldGVycy5leHBlcmltZW50S2V5O1xuICAgICAgICBpZiAoZXhwZXJpbWVudEtleSA9PT0gbnVsbCB8fCBleHBlcmltZW50S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRLZXkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVGYWN0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVzc2VuY2VLZXkgPSByZXF1ZXN0UGFyYW1ldGVycy5lc3NlbmNlS2V5O1xuICAgICAgICBpZiAoZXNzZW5jZUtleSA9PT0gbnVsbCB8fCBlc3NlbmNlS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGVzc2VuY2VLZXkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVGYWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0FwaUtleUF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvc3R1ZGlvL2V4cGVyaW1lbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImV4cGVyaW1lbnRLZXlcIiwgdmFsdWU6IGV4cGVyaW1lbnRLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogXCJ1dWlkXCJ9KX0vZmFjdHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZXNzZW5jZUtleVwiLCB2YWx1ZTogZXNzZW5jZUtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8YW55PignZGVsZXRlJywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBmYWN0c1xuICAgICAqIFJlbW92aW5nIGZhY3RzIGZyb20gdGhlIGV4cGVyaW1lbnQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUZhY3RzKHJlcXVlc3RQYXJhbWV0ZXJzOiBEZWxldGVGYWN0c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PjtcbiAgICBwdWJsaWMgZGVsZXRlRmFjdHMocmVxdWVzdFBhcmFtZXRlcnM6IERlbGV0ZUZhY3RzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPGFueT4+O1xuICAgIHB1YmxpYyBkZWxldGVGYWN0cyhyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlRmFjdHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+O1xuICAgIHB1YmxpYyBkZWxldGVGYWN0cyhyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlRmFjdHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBleHBlcmltZW50S2V5ID0gcmVxdWVzdFBhcmFtZXRlcnMuZXhwZXJpbWVudEtleTtcbiAgICAgICAgaWYgKGV4cGVyaW1lbnRLZXkgPT09IG51bGwgfHwgZXhwZXJpbWVudEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHBlcmltZW50S2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlRmFjdHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSByZXF1ZXN0UGFyYW1ldGVycy5yZXF1ZXN0Qm9keTtcbiAgICAgICAgaWYgKHJlcXVlc3RCb2R5ID09PSBudWxsIHx8IHJlcXVlc3RCb2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHJlcXVlc3RCb2R5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlRmFjdHMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChBcGlLZXlBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQXBpS2V5QXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvc3R1ZGlvL2V4cGVyaW1lbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImV4cGVyaW1lbnRLZXlcIiwgdmFsdWU6IGV4cGVyaW1lbnRLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogXCJ1dWlkXCJ9KX0vZmFjdHMvYmF0Y2gvbGlzdGA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxhbnk+KCdkZWxldGUnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHJlcXVlc3RCb2R5LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBmYWN0c1xuICAgICAqIERpc2FibGUgZmFjdHMgaW4gdGhlIGNhbGN1bGF0aW9uLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNhYmxlRmFjdHMocmVxdWVzdFBhcmFtZXRlcnM6IERpc2FibGVGYWN0c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PjtcbiAgICBwdWJsaWMgZGlzYWJsZUZhY3RzKHJlcXVlc3RQYXJhbWV0ZXJzOiBEaXNhYmxlRmFjdHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj47XG4gICAgcHVibGljIGRpc2FibGVGYWN0cyhyZXF1ZXN0UGFyYW1ldGVyczogRGlzYWJsZUZhY3RzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PjtcbiAgICBwdWJsaWMgZGlzYWJsZUZhY3RzKHJlcXVlc3RQYXJhbWV0ZXJzOiBEaXNhYmxlRmFjdHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBleHBlcmltZW50S2V5ID0gcmVxdWVzdFBhcmFtZXRlcnMuZXhwZXJpbWVudEtleTtcbiAgICAgICAgaWYgKGV4cGVyaW1lbnRLZXkgPT09IG51bGwgfHwgZXhwZXJpbWVudEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHBlcmltZW50S2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGlzYWJsZUZhY3RzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxdWVzdFBhcmFtZXRlcnMucmVxdWVzdEJvZHk7XG4gICAgICAgIGlmIChyZXF1ZXN0Qm9keSA9PT0gbnVsbCB8fCByZXF1ZXN0Qm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0Qm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRpc2FibGVGYWN0cy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEFwaUtleUF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdBcGlLZXlBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9zdHVkaW8vZXhwZXJpbWVudHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZXhwZXJpbWVudEtleVwiLCB2YWx1ZTogZXhwZXJpbWVudEtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiBcInV1aWRcIn0pfS9mYWN0cy9iYXRjaC9hYmlsaXR5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PGFueT4oJ2RlbGV0ZScsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgZmFjdHNcbiAgICAgKiBFbmFibGUgZmFjdHMgaW4gdGhlIGNhbGN1bGF0aW9uLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbmFibGVGYWN0cyhyZXF1ZXN0UGFyYW1ldGVyczogRW5hYmxlRmFjdHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT47XG4gICAgcHVibGljIGVuYWJsZUZhY3RzKHJlcXVlc3RQYXJhbWV0ZXJzOiBFbmFibGVGYWN0c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PjtcbiAgICBwdWJsaWMgZW5hYmxlRmFjdHMocmVxdWVzdFBhcmFtZXRlcnM6IEVuYWJsZUZhY3RzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PjtcbiAgICBwdWJsaWMgZW5hYmxlRmFjdHMocmVxdWVzdFBhcmFtZXRlcnM6IEVuYWJsZUZhY3RzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZXhwZXJpbWVudEtleSA9IHJlcXVlc3RQYXJhbWV0ZXJzLmV4cGVyaW1lbnRLZXk7XG4gICAgICAgIGlmIChleHBlcmltZW50S2V5ID09PSBudWxsIHx8IGV4cGVyaW1lbnRLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwZXJpbWVudEtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGVuYWJsZUZhY3RzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxdWVzdFBhcmFtZXRlcnMucmVxdWVzdEJvZHk7XG4gICAgICAgIGlmIChyZXF1ZXN0Qm9keSA9PT0gbnVsbCB8fCByZXF1ZXN0Qm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0Qm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGVuYWJsZUZhY3RzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0FwaUtleUF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3N0dWRpby9leHBlcmltZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJleHBlcmltZW50S2V5XCIsIHZhbHVlOiBleHBlcmltZW50S2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IFwidXVpZFwifSl9L2ZhY3RzL2JhdGNoL2FiaWxpdHlgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8YW55PigncHV0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWQgZmFjdFxuICAgICAqIEdldHRpbmcgZmFjdCBpbmZvcm1hdGlvbiBieSBrZXkuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8V2ViRmFjdFN0dWRpbz47XG4gICAgcHVibGljIHJlYWRGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxXZWJGYWN0U3R1ZGlvPj47XG4gICAgcHVibGljIHJlYWRGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8V2ViRmFjdFN0dWRpbz4+O1xuICAgIHB1YmxpYyByZWFkRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogUmVhZEZhY3RSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBleHBlcmltZW50S2V5ID0gcmVxdWVzdFBhcmFtZXRlcnMuZXhwZXJpbWVudEtleTtcbiAgICAgICAgaWYgKGV4cGVyaW1lbnRLZXkgPT09IG51bGwgfHwgZXhwZXJpbWVudEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHBlcmltZW50S2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmVhZEZhY3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXNzZW5jZUtleSA9IHJlcXVlc3RQYXJhbWV0ZXJzLmVzc2VuY2VLZXk7XG4gICAgICAgIGlmIChlc3NlbmNlS2V5ID09PSBudWxsIHx8IGVzc2VuY2VLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXNzZW5jZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHJlYWRGYWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0FwaUtleUF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvc3R1ZGlvL2V4cGVyaW1lbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImV4cGVyaW1lbnRLZXlcIiwgdmFsdWU6IGV4cGVyaW1lbnRLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogXCJ1dWlkXCJ9KX0vZmFjdHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZXNzZW5jZUtleVwiLCB2YWx1ZTogZXNzZW5jZUtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8V2ViRmFjdFN0dWRpbz4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGZhY3RzXG4gICAgICogR2V0dGluZyBhIGZhY3RzIGxpc3QuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRGYWN0cyhyZXF1ZXN0UGFyYW1ldGVyczogUmVhZEZhY3RzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxUYWJsZUZhY3RMaXN0U3R1ZGlvPjtcbiAgICBwdWJsaWMgcmVhZEZhY3RzKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkRmFjdHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VGFibGVGYWN0TGlzdFN0dWRpbz4+O1xuICAgIHB1YmxpYyByZWFkRmFjdHMocmVxdWVzdFBhcmFtZXRlcnM6IFJlYWRGYWN0c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VGFibGVGYWN0TGlzdFN0dWRpbz4+O1xuICAgIHB1YmxpYyByZWFkRmFjdHMocmVxdWVzdFBhcmFtZXRlcnM6IFJlYWRGYWN0c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGV4cGVyaW1lbnRLZXkgPSByZXF1ZXN0UGFyYW1ldGVycy5leHBlcmltZW50S2V5O1xuICAgICAgICBpZiAoZXhwZXJpbWVudEtleSA9PT0gbnVsbCB8fCBleHBlcmltZW50S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRLZXkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyByZWFkRmFjdHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcmVxdWVzdFBhcmFtZXRlcnMub2Zmc2V0O1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzLmxpbWl0O1xuICAgICAgICBjb25zdCBzb3J0RmllbGQgPSByZXF1ZXN0UGFyYW1ldGVycy5zb3J0RmllbGQ7XG4gICAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb24gPSByZXF1ZXN0UGFyYW1ldGVycy5zb3J0RGlyZWN0aW9uO1xuICAgICAgICBjb25zdCB0YWJsZUZhY3RGaWx0ZXJMaXN0U3R1ZGlvID0gcmVxdWVzdFBhcmFtZXRlcnMudGFibGVGYWN0RmlsdGVyTGlzdFN0dWRpbztcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5vZmZzZXQsICdvZmZzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc29ydEZpZWxkICE9PSB1bmRlZmluZWQgJiYgc29ydEZpZWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+c29ydEZpZWxkLCAnc29ydF9maWVsZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0RGlyZWN0aW9uICE9PSB1bmRlZmluZWQgJiYgc29ydERpcmVjdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnNvcnREaXJlY3Rpb24sICdzb3J0X2RpcmVjdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0FwaUtleUF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3N0dWRpby9leHBlcmltZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJleHBlcmltZW50S2V5XCIsIHZhbHVlOiBleHBlcmltZW50S2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IFwidXVpZFwifSl9L2ZhY3RzL2JhdGNoL2xpc3RgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VGFibGVGYWN0TGlzdFN0dWRpbz4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHRhYmxlRmFjdEZpbHRlckxpc3RTdHVkaW8sXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBmYWN0XG4gICAgICogVXBkYXRpbmcgdGhlIGZhY3QgYnkga2V5LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBVcGRhdGVGYWN0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxXZWJGYWN0U3R1ZGlvPjtcbiAgICBwdWJsaWMgdXBkYXRlRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogVXBkYXRlRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxXZWJGYWN0U3R1ZGlvPj47XG4gICAgcHVibGljIHVwZGF0ZUZhY3QocmVxdWVzdFBhcmFtZXRlcnM6IFVwZGF0ZUZhY3RSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFdlYkZhY3RTdHVkaW8+PjtcbiAgICBwdWJsaWMgdXBkYXRlRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogVXBkYXRlRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGV4cGVyaW1lbnRLZXkgPSByZXF1ZXN0UGFyYW1ldGVycy5leHBlcmltZW50S2V5O1xuICAgICAgICBpZiAoZXhwZXJpbWVudEtleSA9PT0gbnVsbCB8fCBleHBlcmltZW50S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRLZXkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVGYWN0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdlYkZhY3RTdHVkaW8gPSByZXF1ZXN0UGFyYW1ldGVycy53ZWJGYWN0U3R1ZGlvO1xuICAgICAgICBpZiAod2ViRmFjdFN0dWRpbyA9PT0gbnVsbCB8fCB3ZWJGYWN0U3R1ZGlvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHdlYkZhY3RTdHVkaW8gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVGYWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0FwaUtleUF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3N0dWRpby9leHBlcmltZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJleHBlcmltZW50S2V5XCIsIHZhbHVlOiBleHBlcmltZW50S2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IFwidXVpZFwifSl9L2ZhY3RzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFdlYkZhY3RTdHVkaW8+KCdwdXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHdlYkZhY3RTdHVkaW8sXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==
|