Repository URL to install this package:
Version:
0.3.1 ▾
|
motif-web-admin-core
/
esm5
/
lib
/
sections
/
Services
/
components
/
services-section-component.js
|
---|
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { ServiceCatalogSelectorComponent } from './../../../components/UI/selectors/service-catalog-selector/service-catalog-selector-component';
import { Component, ViewChild, ChangeDetectorRef, Renderer2 } from '@angular/core';
import { PluginView } from 'web-console-core';
import { NGXLogger } from 'web-console-core';
import { faGlobe, faArchive, faBoxOpen, faCompass, faDesktop } from '@fortawesome/free-solid-svg-icons';
import { ServiceCatalogService } from '../../../services/ServiceCatalogService';
import { ServiceCataglogEditorComponent } from './editors/service-catalog-editor-component';
import { WCNotificationCenter, NotificationType } from 'web-console-ui-kit';
import { NewItemDialogComponent } from './dialogs/generic/new-item-dialog';
import { NewOperationDialogComponent } from './dialogs/service-operation/new-operation-dialog';
import { EditingType } from './editors/service-catalog-editor-context';
import { ConfirmationService } from 'primeng/api';
import { WCSubscriptionHandler } from '../../../components/Commons/wc-subscription-handler';
import { MotifACLService } from 'web-console-motif-acl';
/** @type {?} */
var LOG_TAG = '[ServicesSection]';
var ServicesSectionComponent = /** @class */ (function () {
function ServicesSectionComponent(logger, motifACLService, serviceCatalogService, notificationCenter, renderer2, changeDetector, confirmationService) {
var _this = this;
this.logger = logger;
this.motifACLService = motifACLService;
this.serviceCatalogService = serviceCatalogService;
this.notificationCenter = notificationCenter;
this.renderer2 = renderer2;
this.changeDetector = changeDetector;
this.confirmationService = confirmationService;
// Icons
this.faGlobe = faGlobe;
this.faBoxOpen = faBoxOpen;
this.faArchive = faArchive;
this.faCompass = faCompass;
this.faDesktop = faDesktop;
this.deleteButtonCaption = 'Delete selected Domain ';
this.statsModel = { items: [] };
this._subHandler = new WCSubscriptionHandler();
this.logger.debug(LOG_TAG, 'Opening...');
this._subHandler.add(this.motifACLService.can('com.vipera.osgi.core.platform.api.rest.PlatformApi:CREATE:createDomain')
.subscribe((/**
* @param {?} canDeleteDomain
* @return {?}
*/
function (canDeleteDomain) {
_this._deleteMenuItem = {
id: 'delete',
label: 'Delete',
disabled: true,
command: (/**
* @param {?} event
* @return {?}
*/
function (event) { _this.onDeleteSelectedNode(); })
};
_this._addDomainMenuItem = {
id: 'newDomain',
label: 'New Domain',
disabled: !canDeleteDomain,
command: (/**
* @param {?} event
* @return {?}
*/
function (event) { _this.onAddDomainClick(); })
};
_this._addApplicationMenuItem = {
id: 'newApplication',
label: 'New Application',
disabled: true,
command: (/**
* @param {?} event
* @return {?}
*/
function (event) { _this.onAddApplicationClick(); })
};
_this._addServiceMenuItem = {
id: 'newService',
label: 'New Service',
disabled: true,
command: (/**
* @param {?} event
* @return {?}
*/
function (event) { _this.onAddServiceClick(); })
};
_this._addOperationMenuItem = {
id: 'newOperation',
label: 'New Operation',
disabled: true,
command: (/**
* @param {?} event
* @return {?}
*/
function (event) { _this.onAddOperationClick(); })
};
_this._addMenuItem = {
label: 'New...',
items: [
_this._addDomainMenuItem,
_this._addApplicationMenuItem,
_this._addServiceMenuItem,
_this._addOperationMenuItem
]
};
_this.menuItems = [
_this._addMenuItem,
_this._deleteMenuItem
];
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error('Cannot load permissions!');
})));
}
/**
* Angular ngOnInit
*/
/**
* Angular ngOnInit
* @return {?}
*/
ServicesSectionComponent.prototype.ngOnInit = /**
* Angular ngOnInit
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'Initializing...');
this.refreshData();
};
/**
* @return {?}
*/
ServicesSectionComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'ngOnDestroy ');
this.freeMem();
};
/**
* @return {?}
*/
ServicesSectionComponent.prototype.freeMem = /**
* @return {?}
*/
function () {
this._deleteMenuItem = null;
this._addDomainMenuItem = null;
this._addApplicationMenuItem = null;
this._addServiceMenuItem = null;
this._addOperationMenuItem = null;
this._addMenuItem = null;
this._serviceCatalog.freeMem();
this._subHandler.unsubscribe();
this._subHandler = null;
};
/**
* @return {?}
*/
ServicesSectionComponent.prototype.onRefreshClicked = /**
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'Refresh clicked');
this.refreshData();
};
/**
* @return {?}
*/
ServicesSectionComponent.prototype.refreshData = /**
* @return {?}
*/
function () {
var _this = this;
this._serviceCatalog.reloadData().subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.buildStats(data);
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.clearStatsInfo();
}));
};
/**
* @private
* @return {?}
*/
ServicesSectionComponent.prototype.clearStatsInfo = /**
* @private
* @return {?}
*/
function () {
this.statsModel = { items: [] };
};
/**
* @private
* @param {?} data
* @return {?}
*/
ServicesSectionComponent.prototype.buildStats = /**
* @private
* @param {?} data
* @return {?}
*/
function (data) {
/** @type {?} */
var services = [];
/** @type {?} */
var jsonCalls = 0;
/** @type {?} */
var restCalls = 0;
for (var i = 0; i < data.length; i++) {
/** @type {?} */
var domain = data[i];
for (var y = 0; y < domain.applications.length; y++) {
/** @type {?} */
var application = domain.applications[y];
for (var z = 0; z < application.services.length; z++) {
/** @type {?} */
var service = application.services[z];
if (service.channel === "REST") {
restCalls += service.serviceOperationList.length;
}
if (service.channel === "JSON") {
jsonCalls += service.serviceOperationList.length;
}
}
}
}
this.statsModel = {
items: [
{ label: "Operations", value: "" + jsonCalls, cssClass: "stats-info-json-services" }
]
};
};
/**
* @param {?} nodeEvent
* @return {?}
*/
ServicesSectionComponent.prototype.nodeSelect = /**
* @param {?} nodeEvent
* @return {?}
*/
function (nodeEvent) {
this.logger.debug(LOG_TAG, 'Node selected: ', nodeEvent);
/** @type {?} */
var catalogEntry = nodeEvent.node.data;
/** @type {?} */
var nodeType = nodeEvent.node.nodeType;
if (nodeType === 'Domain') {
this._servicesEditor.startEditDomain(catalogEntry.domain);
}
else if (nodeType === 'Application') {
this._servicesEditor.startEditApplication(catalogEntry.domain, catalogEntry.application);
}
else if (nodeType === 'Service') {
this._servicesEditor.startEditService(catalogEntry.domain, catalogEntry.application, catalogEntry.service, catalogEntry.channel);
}
else if (nodeType === 'Operation') {
this._servicesEditor.startEditOperation(catalogEntry.domain, catalogEntry.application, catalogEntry.service, catalogEntry.channel, catalogEntry.operation);
}
this.updateCommands(nodeType);
};
/**
* @private
* @param {?} nodeType
* @return {?}
*/
ServicesSectionComponent.prototype.updateCommands = /**
* @private
* @param {?} nodeType
* @return {?}
*/
function (nodeType) {
var _this = this;
/** @type {?} */
var deleteEnabled = true;
/** @type {?} */
var addDomainEnabled = true;
/** @type {?} */
var addApplicationEnabled = false;
/** @type {?} */
var addServiceEnabled = false;
/** @type {?} */
var addOperationEnabled = false;
/** @type {?} */
var deleteButtonCaption = '';
if (nodeType === 'Domain') {
deleteButtonCaption = 'Delete selected Domain';
this._subHandler.add(this.motifACLService.can('com.vipera.osgi.core.platform.api.rest.PlatformApi:CREATE:createApplication')
.subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
addApplicationEnabled = canDoIt;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
addApplicationEnabled = false;
_this.logger.warn(LOG_TAG, 'Cannot check if user can add application: ' + error);
})));
this._subHandler.add(this.motifACLService.can('com.vipera.osgi.core.platform.api.rest.PlatformApi:DELETE:deleteDomain')
.subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
deleteEnabled = canDoIt;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
deleteEnabled = false;
_this.logger.warn(LOG_TAG, 'Cannot check if user can delete domain: ' + error);
})));
}
else if (nodeType === 'Application') {
deleteButtonCaption = 'Delete selected Application';
this._subHandler.add(this.motifACLService.can('com.vipera.osgi.bss.catalog.api.rest.CatalogApi:CREATE:createService')
.subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
addServiceEnabled = canDoIt;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
addServiceEnabled = false;
_this.logger.warn(LOG_TAG, 'Cannot check if user can add service: ' + error);
})));
this._subHandler.add(this.motifACLService.can('com.vipera.osgi.core.platform.api.rest.PlatformApi:DELETE:deleteApplication')
.subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
deleteEnabled = canDoIt;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
deleteEnabled = false;
_this.logger.warn(LOG_TAG, 'Cannot check if user can delete application: ' + error);
})));
}
else if (nodeType === 'Service') {
deleteButtonCaption = 'Delete selected Service';
this._subHandler.add(this.motifACLService.can('com.vipera.osgi.bss.catalog.api.rest.CatalogApi:CREATE:createServiceOperation')
.subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
addOperationEnabled = canDoIt;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
addOperationEnabled = false;
_this.logger.warn(LOG_TAG, 'Cannot check if user can add operation: ' + error);
})));
this._subHandler.add(this.motifACLService.can('com.vipera.osgi.bss.catalog.api.rest.CatalogApi:DELETE:deleteService')
.subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
deleteEnabled = canDoIt;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
deleteEnabled = false;
_this.logger.warn(LOG_TAG, 'Cannot check if user can delete service: ' + error);
})));
}
else if (nodeType === 'Operation') {
deleteButtonCaption = 'Delete selected Operation';
this._subHandler.add(this.motifACLService.can('com.vipera.osgi.bss.catalog.api.rest.CatalogApi:CREATE:createServiceOperation')
.subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
addOperationEnabled = canDoIt;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
addOperationEnabled = false;
_this.logger.warn(LOG_TAG, 'Cannot check if user can add operation: ' + error);
})));
this._subHandler.add(this.motifACLService.can('com.vipera.osgi.bss.catalog.api.rest.CatalogApi:DELETE:deleteServiceOperation')
.subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
deleteEnabled = canDoIt;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
deleteEnabled = false;
_this.logger.warn(LOG_TAG, 'Cannot check if user can delete service operation: ' + error);
})));
}
// update menu items
this._deleteMenuItem.label = deleteButtonCaption;
this._deleteMenuItem.disabled = !deleteEnabled;
this._addDomainMenuItem.disabled = !addDomainEnabled;
this._addApplicationMenuItem.disabled = !addApplicationEnabled;
this._addServiceMenuItem.disabled = !addServiceEnabled;
this._addOperationMenuItem.disabled = !addOperationEnabled;
};
/**
* @param {?} event
* @return {?}
*/
ServicesSectionComponent.prototype.onFilterChange = /**
* @param {?} event
* @return {?}
*/
function (event) {
// TODO!!
};
/**
* @param {?} event
* @return {?}
*/
ServicesSectionComponent.prototype.onChangesSaved = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.logger.debug(LOG_TAG, 'onChangesSaved: ', event);
this.handleChanges(event);
};
/**
* @private
* @param {?} event
* @return {?}
*/
ServicesSectionComponent.prototype.handleChanges = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
this.logger.debug(LOG_TAG, 'handleChanges: ', event);
/** @type {?} */
var description = event.model.items[0].value;
/** @type {?} */
var treeNode;
if (event.context.editingType === EditingType.Domain) {
treeNode = this._serviceCatalog.tableModel.getDomainNode(event.context.domainName);
}
else if (event.context.editingType === EditingType.Application) {
treeNode = this._serviceCatalog.tableModel.getApplicationNode(event.context.domainName, event.context.applicationName);
}
else if (event.context.editingType === EditingType.Operation) {
treeNode = this._serviceCatalog.tableModel.getOperationNode(event.context.channel, event.context.domainName, event.context.applicationName, event.context.serviceName, event.context.operationName);
}
if (treeNode) {
treeNode.data.description = description;
}
};
/**
* @private
* @return {?}
*/
ServicesSectionComponent.prototype.onAddDomainClick = /**
* @private
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'onAddDomainClick');
this._newItemDialog.show(EditingType.Domain);
};
/**
* @private
* @return {?}
*/
ServicesSectionComponent.prototype.onAddApplicationClick = /**
* @private
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'onAddApplicationClick');
this._newItemDialog.show(EditingType.Application);
};
/**
* @private
* @return {?}
*/
ServicesSectionComponent.prototype.onAddServiceClick = /**
* @private
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'onAddServiceClick');
this._newItemDialog.show(EditingType.Service);
};
/**
* @private
* @return {?}
*/
ServicesSectionComponent.prototype.onAddOperationClick = /**
* @private
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'onAddOperationClick');
this._newOperationDialog.show(EditingType.Operation, this.currentSelectedChannel, this.currentSelectedDomain, this.currentSelectedApplication, this.currentSelectedService);
};
/**
* @private
* @return {?}
*/
ServicesSectionComponent.prototype.onDeleteSelectedNode = /**
* @private
* @return {?}
*/
function () {
console.log('OnDeleteSelected node: ', this.selectedNode.data);
this.handleDeleteRequest(this.selectedNode.data.catalogEntry);
};
/**
* @private
* @param {?} catalogEntry
* @return {?}
*/
ServicesSectionComponent.prototype.handleDeleteRequest = /**
* @private
* @param {?} catalogEntry
* @return {?}
*/
function (catalogEntry) {
if (catalogEntry.operation) {
this.handleDeleteOperation(catalogEntry);
}
else if (catalogEntry.service) {
this.handleDeleteService(catalogEntry);
}
else if (catalogEntry.application) {
this.handleDeleteApplication(catalogEntry);
}
else if (catalogEntry.domain) {
this.handleDeleteDomain(catalogEntry);
}
else {
this.logger.warn(LOG_TAG, 'Unable to handle delete for: ', catalogEntry);
}
};
/**
* @private
* @param {?} catalogEntry
* @return {?}
*/
ServicesSectionComponent.prototype.handleDeleteOperation = /**
* @private
* @param {?} catalogEntry
* @return {?}
*/
function (catalogEntry) {
var _this = this;
this.confirmationService.confirm({
message: 'Are you sure that you want to delete the operation ' + catalogEntry.operation + ' ?',
accept: (/**
* @return {?}
*/
function () {
_this._subHandler.add(_this.serviceCatalogService.deleteOperation(catalogEntry.channel, catalogEntry.domain, catalogEntry.application, catalogEntry.service, catalogEntry.operation).subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.logger.debug(LOG_TAG, 'Operation deleted: ', data);
_this._serviceCatalog.tableModel.removeOperationNode(catalogEntry.channel, catalogEntry.domain, catalogEntry.application, catalogEntry.service, catalogEntry.operation);
_this.notificationCenter.post({
name: 'DeleteOperation',
title: 'Delete Operation',
message: 'Operation deleted successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Delete operation error: ', error);
_this.notificationCenter.post({
name: 'DeleteOperationError',
title: 'Delete Operation',
message: 'Error deleting the operation:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
})
});
};
/**
* @private
* @param {?} catalogEntry
* @return {?}
*/
ServicesSectionComponent.prototype.handleDeleteService = /**
* @private
* @param {?} catalogEntry
* @return {?}
*/
function (catalogEntry) {
var _this = this;
this.confirmationService.confirm({
message: 'Are you sure that you want to delete the service ' + catalogEntry.service + ' ?',
accept: (/**
* @return {?}
*/
function () {
_this._subHandler.add(_this.serviceCatalogService.deleteService(catalogEntry.channel, catalogEntry.domain, catalogEntry.application, catalogEntry.service).subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.logger.debug(LOG_TAG, 'Service deleted: ', data);
_this._serviceCatalog.tableModel.removeServiceNode(catalogEntry.channel, catalogEntry.domain, catalogEntry.application, catalogEntry.service);
_this.notificationCenter.post({
name: 'DeleteService',
title: 'Delete Service',
message: 'Service deleted successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Delete service error: ', error);
_this.notificationCenter.post({
name: 'DeleteServiceError',
title: 'Delete Service',
message: 'Error deleting the service:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
})
});
};
/**
* @private
* @param {?} catalogEntry
* @return {?}
*/
ServicesSectionComponent.prototype.handleDeleteApplication = /**
* @private
* @param {?} catalogEntry
* @return {?}
*/
function (catalogEntry) {
var _this = this;
this.confirmationService.confirm({
message: 'Are you sure that you want to delete the application ' + catalogEntry.application + ' ?',
accept: (/**
* @return {?}
*/
function () {
_this._subHandler.add(_this.serviceCatalogService.deleteApplication(catalogEntry.domain, catalogEntry.application).subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.logger.debug(LOG_TAG, 'Application deleted: ', data);
_this._serviceCatalog.tableModel.removeApplicationNode(catalogEntry.domain, catalogEntry.application);
_this.notificationCenter.post({
name: 'DeleteApplication',
title: 'Delete Application',
message: 'Application deleted successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Delete application error: ', error);
_this.notificationCenter.post({
name: 'DeleteApplicationError',
title: 'Delete Application',
message: 'Error deleting the application:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
})
});
};
/**
* @private
* @param {?} catalogEntry
* @return {?}
*/
ServicesSectionComponent.prototype.handleDeleteDomain = /**
* @private
* @param {?} catalogEntry
* @return {?}
*/
function (catalogEntry) {
var _this = this;
this.confirmationService.confirm({
message: 'Are you sure that you want to delete the domain ' + catalogEntry.domain + ' ?',
accept: (/**
* @return {?}
*/
function () {
_this._subHandler.add(_this.serviceCatalogService.deleteDomain(catalogEntry.domain).subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.logger.debug(LOG_TAG, 'Domain deleted: ', data);
_this._serviceCatalog.tableModel.removeDomainNode(catalogEntry.domain);
_this.notificationCenter.post({
name: 'DeleteDomain',
title: 'Delete Domain',
message: 'Domain deleted successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Delete domain error: ', error);
_this.notificationCenter.post({
name: 'DeleteDomainError',
title: 'Delete Domain',
message: 'Error deleting the domain:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
})
});
};
Object.defineProperty(ServicesSectionComponent.prototype, "selectedNode", {
get: /**
* @return {?}
*/
function () {
return this._serviceCatalog.selectedNode;
},
enumerable: true,
configurable: true
});
/**
* @param {?} event
* @return {?}
*/
ServicesSectionComponent.prototype.onNewItemConfirm = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.editType === EditingType.Domain) {
this.createNewDomain(event.name);
}
else if (event.editType === EditingType.Application) {
this.createNewApplication(this.currentSelectedDomain, event.name);
}
else if (event.editType === EditingType.Service) {
this.createNewService(this.currentSelectedDomain, this.currentSelectedApplication, event.name, event.channel);
}
else {
this.logger.warn(LOG_TAG, 'onNewItemConfirm unknown for: ', event);
//alert('Unknown event type: ' + event.editType);
}
};
/**
* @param {?} event
* @return {?}
*/
ServicesSectionComponent.prototype.onNewServiceOperationConfirm = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this.logger.debug(LOG_TAG, 'createNewOperation called for: ', event);
this._subHandler.add(this.serviceCatalogService.createNewOperation(event.channel, event.domain, event.application, event.service, event.name, event.description, event.pluginName, event.encrypted, event.secure, event.counted, event.sessionless, (event.inputParams ? btoa(event.inputParams) : null), (event.outputParams ? btoa(event.outputParams) : null)).subscribe((/**
* @param {?} operation
* @return {?}
*/
function (operation) {
_this.logger.debug(LOG_TAG, 'New Operation added: ', operation);
_this._serviceCatalog.tableModel.addOperationNode(event.channel, event.domain, event.application, event.service, operation);
_this.notificationCenter.post({
name: 'CreateNewOperation',
title: 'Create New Operation',
message: 'New Operation created successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'New operation error: ', error);
_this.notificationCenter.post({
name: 'CreateNewOperationError',
title: 'Create New Operation',
message: 'Error creating the new operation:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
/**
* @private
* @param {?} domainName
* @return {?}
*/
ServicesSectionComponent.prototype.createNewDomain = /**
* @private
* @param {?} domainName
* @return {?}
*/
function (domainName) {
var _this = this;
this.logger.debug(LOG_TAG, 'createNewDomain called for: ', domainName);
this._subHandler.add(this.serviceCatalogService.createNewDomain(domainName).subscribe((/**
* @param {?} newDomain
* @return {?}
*/
function (newDomain) {
_this.logger.debug(LOG_TAG, 'New domain added: ', newDomain);
_this._serviceCatalog.tableModel.addDomainNode(newDomain);
_this.notificationCenter.post({
name: 'CreateNewDomain',
title: 'Create New Domain',
message: 'New Domain created successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'New domain error: ', error);
_this.notificationCenter.post({
name: 'CreateNewDomainError',
title: 'Create New Domain',
message: 'Error creating the new domain:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
/**
* @private
* @param {?} domainName
* @param {?} applicationName
* @return {?}
*/
ServicesSectionComponent.prototype.createNewApplication = /**
* @private
* @param {?} domainName
* @param {?} applicationName
* @return {?}
*/
function (domainName, applicationName) {
var _this = this;
this.logger.debug(LOG_TAG, 'createNewApplication called for: ', domainName, applicationName);
this._subHandler.add(this.serviceCatalogService.createNewApplication(domainName, applicationName).subscribe((/**
* @param {?} newApplication
* @return {?}
*/
function (newApplication) {
_this.logger.debug(LOG_TAG, 'New application added: ', newApplication);
_this._serviceCatalog.tableModel.addApplicationNode(domainName, newApplication);
_this.notificationCenter.post({
name: 'CreateNewApplication',
title: 'Create New Application',
message: 'New Application created successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'New application error: ', error);
_this.notificationCenter.post({
name: 'CreateNewApplicationError',
title: 'Create New Application',
message: 'Error creating the new application:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
/**
* @private
* @param {?} domain
* @param {?} application
* @param {?} serviceName
* @param {?} channel
* @return {?}
*/
ServicesSectionComponent.prototype.createNewService = /**
* @private
* @param {?} domain
* @param {?} application
* @param {?} serviceName
* @param {?} channel
* @return {?}
*/
function (domain, application, serviceName, channel) {
var _this = this;
this.logger.debug(LOG_TAG, 'createNewService called for: ', domain, application, serviceName, channel);
this._subHandler.add(this.serviceCatalogService.createNewService(domain, application, serviceName, channel).subscribe((/**
* @param {?} newService
* @return {?}
*/
function (newService) {
_this.logger.debug(LOG_TAG, 'New service added: ', newService);
_this._serviceCatalog.tableModel.addServiceNode(domain, application, newService);
_this.notificationCenter.post({
name: 'CreateNewService',
title: 'Create New Service',
message: 'New Service created successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'New application error: ', error);
_this.notificationCenter.post({
name: 'CreateNewServiceError',
title: 'Create New Service',
message: 'Error creating the new service:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
Object.defineProperty(ServicesSectionComponent.prototype, "currentSelectedDomain", {
get: /**
* @return {?}
*/
function () {
return this.selectedNode.data.catalogEntry.domain;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ServicesSectionComponent.prototype, "currentSelectedApplication", {
get: /**
* @return {?}
*/
function () {
return this.selectedNode.data.catalogEntry.application;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ServicesSectionComponent.prototype, "currentSelectedService", {
get: /**
* @return {?}
*/
function () {
return this.selectedNode.data.catalogEntry.service;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ServicesSectionComponent.prototype, "currentSelectedChannel", {
get: /**
* @return {?}
*/
function () {
return this.selectedNode.data.catalogEntry.channel;
},
enumerable: true,
configurable: true
});
/**
* @param {?} event
* @return {?}
*/
ServicesSectionComponent.prototype.onNodeCommand = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.logger.debug(LOG_TAG, 'onNodeCommand event: ', event);
/** @type {?} */
var catalogEntry = {
application: event.node.application,
domain: event.node.domain,
channel: event.node.channel,
operation: event.node.operation,
service: event.node.service
};
if (event.command === 'Delete') {
this.handleDeleteRequest(catalogEntry);
}
};
ServicesSectionComponent.decorators = [
{ type: Component, args: [{
selector: 'wa-services-section',
template: "<p-contextMenu #tableContextMenu [target]=\"servicetableContainer\" [model]=\"menuItems\" [styleClass]=\"'wc-context-menu'\"></p-contextMenu>\n\n<wc-stats-info-component [model]=\"statsModel\"></wc-stats-info-component>\n\n<wa-services-section-newitem-dialog #newItemDialog (confirm)='onNewItemConfirm($event)'></wa-services-section-newitem-dialog>\n<wa-services-section-new-operation-dialog #newOperationDialog (confirm)='onNewServiceOperationConfirm($event)'></wa-services-section-new-operation-dialog>\n<p-confirmDialog header=\"Confirmation\" icon=\"pi pi-exclamation-triangle\" baseZIndex=\"999999999\"></p-confirmDialog>\n\n<wc-dashboard-header [title]=\"'JSON Channel Manager'\"></wc-dashboard-header>\n\n<div class=\"row spread\" #target>\n <div class=\"flex-toolbar\" style=\"display:flex;align-items: center;\">\n <p-menubar [model]=\"menuItems\" [autoDisplay]=\"false\"></p-menubar>\n </div>\n\n <div class=\"flex-cmd\">\n <kendo-buttongroup look=\"flat\">\n <button\n kendoButton\n [toggleable]=\"false\"\n [icon]=\"'refresh'\"\n (click)=\"onRefreshClicked()\"\n >\n Refresh\n </button>\n </kendo-buttongroup>\n </div>\n</div>\n\n<div class=\"row fill\">\n <kendo-splitter style=\"height:100%;width:100%;\">\n <kendo-splitter-pane style=\"overflow: hidden;\">\n <div #servicetableContainer style=\"height: 100%;\">\n <wa-service-catalog-selector [editable]=\"true\" (nodeCommand)=\"onNodeCommand($event)\" (nodeSelection)=\"nodeSelect($event)\" #serviceCatalog></wa-service-catalog-selector>\n </div>\n </kendo-splitter-pane>\n\n <kendo-splitter-pane [collapsible]=\"true\" size=\"30%\">\n <wa-services-editor #servicesEditor (changesSaved)=\"onChangesSaved($event)\"></wa-services-editor>\n </kendo-splitter-pane>\n\n </kendo-splitter>\n\n</div>\n",
styles: [":host{display:flex;flex:1;flex-direction:column}.badge,.channel-label{font-size:.75rem;line-height:1.3;font-weight:700;padding:3px 7px;text-align:center;vertical-align:baseline;white-space:nowrap}.channel-label{border-radius:4px;display:inline;font-size:.63rem}.badge{border-radius:10px;display:inline-block;padding:1px 7px}.badge a,.channel-label a,.channel-label[href]:focus,.channel-label[href]:hover,a.badge:focus,a.badge:hover{cursor:pointer;text-decoration:none}.badge:empty,.channel-label:empty{display:none}"]
}] }
];
/** @nocollapse */
ServicesSectionComponent.ctorParameters = function () { return [
{ type: NGXLogger },
{ type: MotifACLService },
{ type: ServiceCatalogService },
{ type: WCNotificationCenter },
{ type: Renderer2 },
{ type: ChangeDetectorRef },
{ type: ConfirmationService }
]; };
ServicesSectionComponent.propDecorators = {
_servicesEditor: [{ type: ViewChild, args: ['servicesEditor',] }],
_newItemDialog: [{ type: ViewChild, args: ['newItemDialog',] }],
_newOperationDialog: [{ type: ViewChild, args: ['newOperationDialog',] }],
_serviceCatalog: [{ type: ViewChild, args: ['serviceCatalog',] }]
};
ServicesSectionComponent = tslib_1.__decorate([
PluginView('JSON Channel', {
iconName: 'wa-ico-services',
userData: {
acl: {
permissions: ['com.vipera.osgi.core.platform.api.rest.PlatformApi:READ:getDomains',
'com.vipera.osgi.core.platform.api.rest.PlatformApi:READ:getApplications',
'com.vipera.osgi.bss.catalog.api.rest.CatalogApi:READ:getServiceList',
'com.vipera.osgi.bss.catalog.api.rest.CatalogApi:READ:getServiceOperation']
}
}
}),
tslib_1.__metadata("design:paramtypes", [NGXLogger,
MotifACLService,
ServiceCatalogService,
WCNotificationCenter,
Renderer2,
ChangeDetectorRef,
ConfirmationService])
], ServicesSectionComponent);
return ServicesSectionComponent;
}());
export { ServicesSectionComponent };
if (false) {
/** @type {?} */
ServicesSectionComponent.prototype.menuItems;
/** @type {?} */
ServicesSectionComponent.prototype.faGlobe;
/** @type {?} */
ServicesSectionComponent.prototype.faBoxOpen;
/** @type {?} */
ServicesSectionComponent.prototype.faArchive;
/** @type {?} */
ServicesSectionComponent.prototype.faCompass;
/** @type {?} */
ServicesSectionComponent.prototype.faDesktop;
/** @type {?} */
ServicesSectionComponent.prototype.deleteButtonCaption;
/** @type {?} */
ServicesSectionComponent.prototype.deleteButtonEnabled;
/** @type {?} */
ServicesSectionComponent.prototype._servicesEditor;
/** @type {?} */
ServicesSectionComponent.prototype._newItemDialog;
/** @type {?} */
ServicesSectionComponent.prototype._newOperationDialog;
/** @type {?} */
ServicesSectionComponent.prototype._serviceCatalog;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype._deleteMenuItem;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype._addDomainMenuItem;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype._addApplicationMenuItem;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype._addServiceMenuItem;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype._addOperationMenuItem;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype._addMenuItem;
/** @type {?} */
ServicesSectionComponent.prototype.statsModel;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype._subHandler;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype.logger;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype.motifACLService;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype.serviceCatalogService;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype.notificationCenter;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype.renderer2;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype.changeDetector;
/**
* @type {?}
* @private
*/
ServicesSectionComponent.prototype.confirmationService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMtc2VjdGlvbi1jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tb3RpZi13ZWItYWRtaW4tY29yZS8iLCJzb3VyY2VzIjpbImxpYi9zZWN0aW9ucy9TZXJ2aWNlcy9jb21wb25lbnRzL3NlcnZpY2VzLXNlY3Rpb24tY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLCtCQUErQixFQUFvRSxNQUFNLGdHQUFnRyxDQUFDO0FBQ25OLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFnQixNQUFNLG1DQUFtQyxDQUFDO0FBQ3RILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBR2hGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzVFLE9BQU8sRUFBRSxzQkFBc0IsRUFBZ0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RixPQUFPLEVBQUUsMkJBQTJCLEVBQTRCLE1BQU0sa0RBQWtELENBQUM7QUFDekgsT0FBTyxFQUFvQyxXQUFXLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUd6RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFFNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFD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QjtPQXRDM0Msd0JBQXdCLENBbXJCcEM7SUFBRCwrQkFBQztDQUFBLElBQUE7U0FuckJZLHdCQUF3Qjs7O0lBR2pDLDZDQUFzQjs7SUFHdEIsMkNBQWtCOztJQUNsQiw2Q0FBc0I7O0lBQ3RCLDZDQUFzQjs7SUFDdEIsNkNBQXNCOztJQUN0Qiw2Q0FBc0I7O0lBRXRCLHVEQUFnRDs7SUFDaEQsdURBQTZCOztJQUU3QixtREFBNkU7O0lBQzdFLGtEQUFtRTs7SUFDbkUsdURBQWtGOztJQUNsRixtREFBOEU7Ozs7O0lBRzlFLG1EQUFrQzs7Ozs7SUFDbEMsc0RBQXFDOzs7OztJQUNyQywyREFBMEM7Ozs7O0lBQzFDLHVEQUFzQzs7Ozs7SUFDdEMseURBQXdDOzs7OztJQUN4QyxnREFBK0I7O0lBRS9CLDhDQUE2Qzs7Ozs7SUFFN0MsK0NBQXlFOzs7OztJQUU3RCwwQ0FBeUI7Ozs7O0lBQ2pDLG1EQUF3Qzs7Ozs7SUFDeEMseURBQW9EOzs7OztJQUNwRCxzREFBZ0Q7Ozs7O0lBQ2hELDZDQUE0Qjs7Ozs7SUFDNUIsa0RBQXlDOzs7OztJQUN6Qyx1REFBZ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZXJ2aWNlQ2F0YWxvZ1NlbGVjdG9yQ29tcG9uZW50LCBTZXJ2aWNlQ2F0YWxvZ05vZGVTZWxlY3Rpb25FdmVudCwgU2VydmljZUNhdGFsb2dOb2RlQ29tbWFuZEV2ZW50IH0gZnJvbSAnLi8uLi8uLi8uLi9jb21wb25lbnRzL1VJL3NlbGVjdG9ycy9zZXJ2aWNlLWNhdGFsb2ctc2VsZWN0b3Ivc2VydmljZS1jYXRhbG9nLXNlbGVjdG9yLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgUmVuZGVyZXIyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBsdWdpblZpZXcgfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcbmltcG9ydCB7IE5HWExvZ2dlciB9IGZyb20gJ3dlYi1jb25zb2xlLWNvcmUnO1xuaW1wb3J0IHsgUmVnaXN0cnlTZXJ2aWNlIH0gZnJvbSAnQHdhLW1vdGlmLW9wZW4tYXBpL3BsdWdpbi1yZWdpc3RyeS1zZXJ2aWNlJztcbmltcG9ydCB7IGZhR2xvYmUsIGZhQXJjaGl2ZSwgZmFCb3hPcGVuLCBmYUNvbXBhc3MsIGZhRGVza3RvcCwgZmFUaHVtYnNEb3duIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcbmltcG9ydCB7IFNlcnZpY2VDYXRhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL1NlcnZpY2VDYXRhbG9nU2VydmljZSc7XG5pbXBvcnQgeyBUcmVlTm9kZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IENhdGFsb2dFbnRyeSB9IGZyb20gJy4uL2RhdGEvbW9kZWwnO1xuaW1wb3J0IHsgU2VydmljZUNhdGFnbG9nRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9lZGl0b3JzL3NlcnZpY2UtY2F0YWxvZy1lZGl0b3ItY29tcG9uZW50JztcbmltcG9ydCB7IFdDTm90aWZpY2F0aW9uQ2VudGVyLCBOb3RpZmljYXRpb25UeXBlIH0gZnJvbSAnd2ViLWNvbnNvbGUtdWkta2l0JztcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgTmV3SXRlbURpYWxvZ0NvbXBvbmVudCwgRGlhbG9nUmVzdWx0IH0gZnJvbSAnLi9kaWFsb2dzL2dlbmVyaWMvbmV3LWl0ZW0tZGlhbG9nJztcbmltcG9ydCB7IE5ld09wZXJhdGlvbkRpYWxvZ0NvbXBvbmVudCwgTmV3T3BlcmF0aW9uRGlhbG9nUmVzdWx0IH0gZnJvbSAnLi9kaWFsb2dzL3NlcnZpY2Utb3BlcmF0aW9uL25ldy1vcGVyYXRpb24tZGlhbG9nJztcbmltcG9ydCB7IFNlcnZpY2VDYXRhbG9nRWRpdG9yQ2hhbmdlc0V2ZW50LCBFZGl0aW5nVHlwZSB9IGZyb20gJy4vZWRpdG9ycy9zZXJ2aWNlLWNhdGFsb2ctZWRpdG9yLWNvbnRleHQnO1xuaW1wb3J0IHsgRG9tYWluLCBBcHBsaWNhdGlvbiB9IGZyb20gJ0B3YS1tb3RpZi1vcGVuLWFwaS9wbGF0Zm9ybS1zZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2UsIFNlcnZpY2VPcGVyYXRpb24gfSBmcm9tICdAd2EtbW90aWYtb3Blbi1hcGkvY2F0YWxvZy1zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0NvbW1vbnMvd2Mtc3Vic2NyaXB0aW9uLWhhbmRsZXInO1xuaW1wb3J0IHsgV0NTdGF0c0luZm9Nb2RlbCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvU3RhdHMvc3RhdHMtaW5mby1jb21wb25lbnQnO1xuaW1wb3J0IHsgTW90aWZBQ0xTZXJ2aWNlIH0gZnJvbSAnd2ViLWNvbnNvbGUtbW90aWYtYWNsJztcblxuY29uc3QgTE9HX1RBRyA9ICdbU2VydmljZXNTZWN0aW9uXSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnd2Etc2VydmljZXMtc2VjdGlvbicsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VydmljZXMtc2VjdGlvbi1jb21wb25lbnQuc2NzcyddLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZXJ2aWNlcy1zZWN0aW9uLWNvbXBvbmVudC5odG1sJ1xufSlcbkBQbHVnaW5WaWV3KCdKU09OIENoYW5uZWwnLCB7XG4gICAgaWNvbk5hbWU6ICd3YS1pY28tc2VydmljZXMnLFxuICAgIHVzZXJEYXRhOiB7XG4gICAgICAgIGFjbDoge1xuICAgICAgICAgICAgcGVybWlzc2lvbnM6IFsnY29tLnZpcGVyYS5vc2dpLmNvcmUucGxhdGZvcm0uYXBpLnJlc3QuUGxhdGZvcm1BcGk6UkVBRDpnZXREb21haW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tLnZpcGVyYS5vc2dpLmNvcmUucGxhdGZvcm0uYXBpLnJlc3QuUGxhdGZvcm1BcGk6UkVBRDpnZXRBcHBsaWNhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb20udmlwZXJhLm9zZ2kuYnNzLmNhdGFsb2cuYXBpLnJlc3QuQ2F0YWxvZ0FwaTpSRUFEOmdldFNlcnZpY2VMaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tLnZpcGVyYS5vc2dpLmJzcy5jYXRhbG9nLmFwaS5yZXN0LkNhdGFsb2dBcGk6UkVBRDpnZXRTZXJ2aWNlT3BlcmF0aW9uJ11cbiAgICAgICAgfVxuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgU2VydmljZXNTZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLy8gTWVudXNcbiAgICBtZW51SXRlbXM6IE1lbnVJdGVtW107XG5cbiAgICAvLyBJY29uc1xuICAgIGZhR2xvYmUgPSBmYUdsb2JlO1xuICAgIGZhQm94T3BlbiA9IGZhQm94T3BlbjtcbiAgICBmYUFyY2hpdmUgPSBmYUFyY2hpdmU7XG4gICAgZmFDb21wYXNzID0gZmFDb21wYXNzO1xuICAgIGZhRGVza3RvcCA9IGZhRGVza3RvcDtcblxuICAgIGRlbGV0ZUJ1dHRvbkNhcHRpb24gPSAnRGVsZXRlIHNlbGVjdGVkIERvbWFpbiAnO1xuICAgIGRlbGV0ZUJ1dHRvbkVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgICBAVmlld0NoaWxkKCdzZXJ2aWNlc0VkaXRvcicpIF9zZXJ2aWNlc0VkaXRvcjogU2VydmljZUNhdGFnbG9nRWRpdG9yQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ25ld0l0ZW1EaWFsb2cnKSBfbmV3SXRlbURpYWxvZzogTmV3SXRlbURpYWxvZ0NvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCduZXdPcGVyYXRpb25EaWFsb2cnKSBfbmV3T3BlcmF0aW9uRGlhbG9nOiBOZXdPcGVyYXRpb25EaWFsb2dDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnc2VydmljZUNhdGFsb2cnKSBfc2VydmljZUNhdGFsb2c6IFNlcnZpY2VDYXRhbG9nU2VsZWN0b3JDb21wb25lbnQ7XG5cbiAgICAvLyBNZW51c1xuICAgIHByaXZhdGUgX2RlbGV0ZU1lbnVJdGVtOiBNZW51SXRlbTtcbiAgICBwcml2YXRlIF9hZGREb21haW5NZW51SXRlbTogTWVudUl0ZW07XG4gICAgcHJpdmF0ZSBfYWRkQXBwbGljYXRpb25NZW51SXRlbTogTWVudUl0ZW07XG4gICAgcHJpdmF0ZSBfYWRkU2VydmljZU1lbnVJdGVtOiBNZW51SXRlbTtcbiAgICBwcml2YXRlIF9hZGRPcGVyYXRpb25NZW51SXRlbTogTWVudUl0ZW07XG4gICAgcHJpdmF0ZSBfYWRkTWVudUl0ZW06IE1lbnVJdGVtO1xuXG4gICAgc3RhdHNNb2RlbDogV0NTdGF0c0luZm9Nb2RlbCA9IHsgaXRlbXM6IFtdIH07XG5cbiAgICBwcml2YXRlIF9zdWJIYW5kbGVyOiBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIgPSBuZXcgV0NTdWJzY3JpcHRpb25IYW5kbGVyKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyLFxuICAgICAgICBwcml2YXRlIG1vdGlmQUNMU2VydmljZTogTW90aWZBQ0xTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNlcnZpY2VDYXRhbG9nU2VydmljZTogU2VydmljZUNhdGFsb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5vdGlmaWNhdGlvbkNlbnRlcjogV0NOb3RpZmljYXRpb25DZW50ZXIsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjIsXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2VcbiAgICAgICAgKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdPcGVuaW5nLi4uJyk7XG5cbiAgICAgICAgdGhpcy5fc3ViSGFuZGxlci5hZGQodGhpcy5tb3RpZkFDTFNlcnZpY2UuY2FuKCdjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5QbGF0Zm9ybUFwaTpDUkVBVEU6Y3JlYXRlRG9tYWluJylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoY2FuRGVsZXRlRG9tYWluID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2RlbGV0ZU1lbnVJdGVtID0ge1xuICAgICAgICAgICAgICAgIGlkOiAnZGVsZXRlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0RlbGV0ZScsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29tbWFuZDogKGV2ZW50KSA9PiB7IHRoaXMub25EZWxldGVTZWxlY3RlZE5vZGUoKTsgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2FkZERvbWFpbk1lbnVJdGVtID0ge1xuICAgICAgICAgICAgICAgIGlkOiAnbmV3RG9tYWluJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ05ldyBEb21haW4nLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY2FuRGVsZXRlRG9tYWluLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IChldmVudCkgPT4geyB0aGlzLm9uQWRkRG9tYWluQ2xpY2soKTsgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2FkZEFwcGxpY2F0aW9uTWVudUl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICduZXdBcHBsaWNhdGlvbicsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdOZXcgQXBwbGljYXRpb24nLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IChldmVudCkgPT4geyB0aGlzLm9uQWRkQXBwbGljYXRpb25DbGljaygpOyB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fYWRkU2VydmljZU1lbnVJdGVtID0gIHtcbiAgICAgICAgICAgICAgICBpZDogJ25ld1NlcnZpY2UnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnTmV3IFNlcnZpY2UnLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IChldmVudCkgPT4geyB0aGlzLm9uQWRkU2VydmljZUNsaWNrKCk7IH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9hZGRPcGVyYXRpb25NZW51SXRlbSA9ICB7XG4gICAgICAgICAgICAgICAgaWQ6ICduZXdPcGVyYXRpb24nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnTmV3IE9wZXJhdGlvbicsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29tbWFuZDogKGV2ZW50KSA9PiB7IHRoaXMub25BZGRPcGVyYXRpb25DbGljaygpOyB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fYWRkTWVudUl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdOZXcuLi4nLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZERvbWFpbk1lbnVJdGVtLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRBcHBsaWNhdGlvbk1lbnVJdGVtLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRTZXJ2aWNlTWVudUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZE9wZXJhdGlvbk1lbnVJdGVtXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zID0gW1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkZE1lbnVJdGVtLFxuICAgICAgICAgICAgICAgIHRoaXMuX2RlbGV0ZU1lbnVJdGVtXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgbG9hZCBwZXJtaXNzaW9ucyEnKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuZ3VsYXIgbmdPbkluaXRcbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ0luaXRpYWxpemluZy4uLicpO1xuXG4gICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICduZ09uRGVzdHJveSAnKTtcbiAgICAgICAgdGhpcy5mcmVlTWVtKCk7XG4gICAgfVxuXG4gICAgZnJlZU1lbSgpIHtcbiAgICAgICAgdGhpcy5fZGVsZXRlTWVudUl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLl9hZGREb21haW5NZW51SXRlbSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2FkZEFwcGxpY2F0aW9uTWVudUl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLl9hZGRTZXJ2aWNlTWVudUl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLl9hZGRPcGVyYXRpb25NZW51SXRlbSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2FkZE1lbnVJdGVtID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2VydmljZUNhdGFsb2cuZnJlZU1lbSgpO1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJlZnJlc2hDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnUmVmcmVzaCBjbGlja2VkJyk7XG4gICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaERhdGEoKSB7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VDYXRhbG9nLnJlbG9hZERhdGEoKS5zdWJzY3JpYmUoKGRhdGEpPT57XG4gICAgICAgICAgICB0aGlzLmJ1aWxkU3RhdHMoZGF0YSk7XG4gICAgICAgIH0sIChlcnJvcik9PntcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGF0c0luZm8oKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyU3RhdHNJbmZvKCl7XG4gICAgICAgIHRoaXMuc3RhdHNNb2RlbCA9IHsgaXRlbXM6IFtdIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZFN0YXRzKGRhdGEpe1xuICAgICAgICBsZXQgc2VydmljZXMgPSBbXTtcbiAgICAgICAgbGV0IGpzb25DYWxscyA9IDA7XG4gICAgICAgIGxldCByZXN0Q2FsbHMgPSAwO1xuICAgICAgICBmb3IgKGxldCBpPTA7aTxkYXRhLmxlbmd0aDtpKyspe1xuICAgICAgICAgICAgbGV0IGRvbWFpbiA9IGRhdGFbaV07XG4gICAgICAgICAgICBmb3IgKGxldCB5PTA7eTxkb21haW4uYXBwbGljYXRpb25zLmxlbmd0aDt5Kyspe1xuICAgICAgICAgICAgICAgIGxldCBhcHBsaWNhdGlvbiA9IGRvbWFpbi5hcHBsaWNhdGlvbnNbeV07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgej0wO3o8YXBwbGljYXRpb24uc2VydmljZXMubGVuZ3RoO3orKyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2aWNlID0gYXBwbGljYXRpb24uc2VydmljZXNbel07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmNoYW5uZWwgPT09IFwiUkVTVFwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RDYWxscyArPSBzZXJ2aWNlLnNlcnZpY2VPcGVyYXRpb25MaXN0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5jaGFubmVsID09PSBcIkpTT05cIil7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uQ2FsbHMgKz0gc2VydmljZS5zZXJ2aWNlT3BlcmF0aW9uTGlzdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0c01vZGVsID0ge1xuICAgICAgICBpdGVtczogWyBcbiAgICAgICAgICAgIHsgbGFiZWw6IFwiT3BlcmF0aW9uc1wiLCB2YWx1ZTogXCJcIitqc29uQ2FsbHMsIGNzc0NsYXNzOlwic3RhdHMtaW5mby1qc29uLXNlcnZpY2VzXCIgfVxuICAgICAgICBdXG4gICAgfSBcblxuICAgIH1cblxuICAgIG5vZGVTZWxlY3Qobm9kZUV2ZW50OiBTZXJ2aWNlQ2F0YWxvZ05vZGVTZWxlY3Rpb25FdmVudCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnTm9kZSBzZWxlY3RlZDogJywgbm9kZUV2ZW50KTtcblxuICAgICAgICBjb25zdCBjYXRhbG9nRW50cnkgPSBub2RlRXZlbnQubm9kZS5kYXRhO1xuICAgICAgICBjb25zdCBub2RlVHlwZSA9IG5vZGVFdmVudC5ub2RlLm5vZGVUeXBlO1xuXG4gICAgICAgIGlmIChub2RlVHlwZSA9PT0gJ0RvbWFpbicpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlcnZpY2VzRWRpdG9yLnN0YXJ0RWRpdERvbWFpbihjYXRhbG9nRW50cnkuZG9tYWluKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlVHlwZSA9PT0gJ0FwcGxpY2F0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fc2VydmljZXNFZGl0b3Iuc3RhcnRFZGl0QXBwbGljYXRpb24oY2F0YWxvZ0VudHJ5LmRvbWFpbiwgY2F0YWxvZ0VudHJ5LmFwcGxpY2F0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlVHlwZSA9PT0gJ1NlcnZpY2UnKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlc0VkaXRvci5zdGFydEVkaXRTZXJ2aWNlKGNhdGFsb2dFbnRyeS5kb21haW4sXG4gICAgICAgICAgICAgICAgY2F0YWxvZ0VudHJ5LmFwcGxpY2F0aW9uLFxuICAgICAgICAgICAgICAgIGNhdGFsb2dFbnRyeS5zZXJ2aWNlLFxuICAgICAgICAgICAgICAgIGNhdGFsb2dFbnRyeS5jaGFubmVsKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlVHlwZSA9PT0gJ09wZXJhdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlcnZpY2VzRWRpdG9yLnN0YXJ0RWRpdE9wZXJhdGlvbihjYXRhbG9nRW50cnkuZG9tYWluLFxuICAgICAgICAgICAgICAgIGNhdGFsb2dFbnRyeS5hcHBsaWNhdGlvbixcbiAgICAgICAgICAgICAgICBjYXRhbG9nRW50cnkuc2VydmljZSxcbiAgICAgICAgICAgICAgICBjYXRhbG9nRW50cnkuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBjYXRhbG9nRW50cnkub3BlcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUNvbW1hbmRzKG5vZGVUeXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNvbW1hbmRzKG5vZGVUeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGRlbGV0ZUVuYWJsZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBhZGREb21haW5FbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGFkZEFwcGxpY2F0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgYWRkU2VydmljZUVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGFkZE9wZXJhdGlvbkVuYWJsZWQgPSBmYWxzZTtcblxuICAgICAgICBsZXQgZGVsZXRlQnV0dG9uQ2FwdGlvbiA9ICcnO1xuICAgICAgICBpZiAobm9kZVR5cGUgPT09ICdEb21haW4nKSB7XG4gICAgICAgICAgICBkZWxldGVCdXR0b25DYXB0aW9uID0gJ0RlbGV0ZSBzZWxlY3RlZCBEb21haW4nO1xuICAgICAgICAgICAgdGhpcy5fc3ViSGFuZGxlci5hZGQodGhpcy5tb3RpZkFDTFNlcnZpY2UuY2FuKCdjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5QbGF0Zm9ybUFwaTpDUkVBVEU6Y3JlYXRlQXBwbGljYXRpb24nKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoY2FuRG9JdCA9PiB7XG4gICAgICAgICAgICAgICAgYWRkQXBwbGljYXRpb25FbmFibGVkID0gY2FuRG9JdDtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBhZGRBcHBsaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKExPR19UQUcsICdDYW5ub3QgY2hlY2sgaWYgdXNlciBjYW4gYWRkIGFwcGxpY2F0aW9uOiAnICsgZXJyb3IpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdGhpcy5fc3ViSGFuZGxlci5hZGQodGhpcy5tb3RpZkFDTFNlcnZpY2UuY2FuKCdjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5QbGF0Zm9ybUFwaTpERUxFVEU6ZGVsZXRlRG9tYWluJylcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGNhbkRvSXQgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZUVuYWJsZWQgPSBjYW5Eb0l0O1xuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZUVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKExPR19UQUcsICdDYW5ub3QgY2hlY2sgaWYgdXNlciBjYW4gZGVsZXRlIGRvbWFpbjogJyArIGVycm9yKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlVHlwZSA9PT0gJ0FwcGxpY2F0aW9uJykge1xuICAgICAgICAgICAgZGVsZXRlQnV0dG9uQ2FwdGlvbiA9ICdEZWxldGUgc2VsZWN0ZWQgQXBwbGljYXRpb24nO1xuICAgICAgICAgICAgdGhpcy5fc3ViSGFuZGxlci5hZGQodGhpcy5tb3RpZkFDTFNlcnZpY2UuY2FuKCdjb20udmlwZXJhLm9zZ2kuYnNzLmNhdGFsb2cuYXBpLnJlc3QuQ2F0YWxvZ0FwaTpDUkVBVEU6Y3JlYXRlU2VydmljZScpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShjYW5Eb0l0ID0+IHtcbiAgICAgICAgICAgICAgICBhZGRTZXJ2aWNlRW5hYmxlZCA9IGNhbkRvSXQ7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgYWRkU2VydmljZUVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKExPR19UQUcsICdDYW5ub3QgY2hlY2sgaWYgdXNlciBjYW4gYWRkIHNlcnZpY2U6ICcgKyBlcnJvcik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZCh0aGlzLm1vdGlmQUNMU2VydmljZS5jYW4oJ2NvbS52aXBlcmEub3NnaS5jb3JlLnBsYXRmb3JtLmFwaS5yZXN0LlBsYXRmb3JtQXBpOkRFTEVURTpkZWxldGVBcHBsaWNhdGlvbicpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShjYW5Eb0l0ID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGVFbmFibGVkID0gY2FuRG9JdDtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGVFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihMT0dfVEFHLCAnQ2Fubm90IGNoZWNrIGlmIHVzZXIgY2FuIGRlbGV0ZSBhcHBsaWNhdGlvbjogJyArIGVycm9yKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlVHlwZSA9PT0gJ1NlcnZpY2UnKSB7XG4gICAgICAgICAgICBkZWxldGVCdXR0b25DYXB0aW9uID0gJ0RlbGV0ZSBzZWxlY3RlZCBTZXJ2aWNlJztcbiAgICAgICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMubW90aWZBQ0xTZXJ2aWNlLmNhbignY29tLnZpcGVyYS5vc2dpLmJzcy5jYXRhbG9nLmFwaS5yZXN0LkNhdGFsb2dBcGk6Q1JFQVRFOmNyZWF0ZVNlcnZpY2VPcGVyYXRpb24nKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoY2FuRG9JdCA9PiB7XG4gICAgICAgICAgICAgICAgYWRkT3BlcmF0aW9uRW5hYmxlZCA9IGNhbkRvSXQ7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgYWRkT3BlcmF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oTE9HX1RBRywgJ0Nhbm5vdCBjaGVjayBpZiB1c2VyIGNhbiBhZGQgb3BlcmF0aW9uOiAnICsgZXJyb3IpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdGhpcy5fc3ViSGFuZGxlci5hZGQodGhpcy5tb3RpZkFDTFNlcnZpY2UuY2FuKCdjb20udmlwZXJhLm9zZ2kuYnNzLmNhdGFsb2cuYXBpLnJlc3QuQ2F0YWxvZ0FwaTpERUxFVEU6ZGVsZXRlU2VydmljZScpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShjYW5Eb0l0ID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGVFbmFibGVkID0gY2FuRG9JdDtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGVFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihMT0dfVEFHLCAnQ2Fubm90IGNoZWNrIGlmIHVzZXIgY2FuIGRlbGV0ZSBzZXJ2aWNlOiAnICsgZXJyb3IpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVUeXBlID09PSAnT3BlcmF0aW9uJykge1xuICAgICAgICAgICAgZGVsZXRlQnV0dG9uQ2FwdGlvbiA9ICdEZWxldGUgc2VsZWN0ZWQgT3BlcmF0aW9uJztcbiAgICAgICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMubW90aWZBQ0xTZXJ2aWNlLmNhbignY29tLnZpcGVyYS5vc2dpLmJzcy5jYXRhbG9nLmFwaS5yZXN0LkNhdGFsb2dBcGk6Q1JFQVRFOmNyZWF0ZVNlcnZpY2VPcGVyYXRpb24nKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoY2FuRG9JdCA9PiB7XG4gICAgICAgICAgICAgICAgYWRkT3BlcmF0aW9uRW5hYmxlZCA9IGNhbkRvSXQ7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgYWRkT3BlcmF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oTE9HX1RBRywgJ0Nhbm5vdCBjaGVjayBpZiB1c2VyIGNhbiBhZGQgb3BlcmF0aW9uOiAnICsgZXJyb3IpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdGhpcy5fc3ViSGFuZGxlci5hZGQodGhpcy5tb3RpZkFDTFNlcnZpY2UuY2FuKCdjb20udmlwZXJhLm9zZ2kuYnNzLmNhdGFsb2cuYXBpLnJlc3QuQ2F0YWxvZ0FwaTpERUxFVEU6ZGVsZXRlU2VydmljZU9wZXJhdGlvbicpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShjYW5Eb0l0ID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGVFbmFibGVkID0gY2FuRG9JdDtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGVFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihMT0dfVEFHLCAnQ2Fubm90IGNoZWNrIGlmIHVzZXIgY2FuIGRlbGV0ZSBzZXJ2aWNlIG9wZXJhdGlvbjogJyArIGVycm9yKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBtZW51IGl0ZW1zXG4gICAgICAgIHRoaXMuX2RlbGV0ZU1lbnVJdGVtLmxhYmVsID0gZGVsZXRlQnV0dG9uQ2FwdGlvbjtcbiAgICAgICAgdGhpcy5fZGVsZXRlTWVudUl0ZW0uZGlzYWJsZWQgPSAhZGVsZXRlRW5hYmxlZDtcbiAgICAgICAgdGhpcy5fYWRkRG9tYWluTWVudUl0ZW0uZGlzYWJsZWQgPSAhYWRkRG9tYWluRW5hYmxlZDtcbiAgICAgICAgdGhpcy5fYWRkQXBwbGljYXRpb25NZW51SXRlbS5kaXNhYmxlZCA9ICFhZGRBcHBsaWNhdGlvbkVuYWJsZWQ7XG4gICAgICAgIHRoaXMuX2FkZFNlcnZpY2VNZW51SXRlbS5kaXNhYmxlZCA9ICFhZGRTZXJ2aWNlRW5hYmxlZDtcbiAgICAgICAgdGhpcy5fYWRkT3BlcmF0aW9uTWVudUl0ZW0uZGlzYWJsZWQgPSAhYWRkT3BlcmF0aW9uRW5hYmxlZDtcblxuICAgIH1cblxuICAgIHB1YmxpYyBvbkZpbHRlckNoYW5nZShldmVudDogYW55KSB7XG4gICAgICAgIC8vIFRPRE8hIVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkNoYW5nZXNTYXZlZChldmVudDogU2VydmljZUNhdGFsb2dFZGl0b3JDaGFuZ2VzRXZlbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ29uQ2hhbmdlc1NhdmVkOiAnLCBldmVudCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlcyhldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVDaGFuZ2VzKGV2ZW50OiBTZXJ2aWNlQ2F0YWxvZ0VkaXRvckNoYW5nZXNFdmVudCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnaGFuZGxlQ2hhbmdlczogJywgZXZlbnQpO1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGV2ZW50Lm1vZGVsLml0ZW1zWzBdLnZhbHVlO1xuICAgICAgICBsZXQgdHJlZU5vZGU6IFRyZWVOb2RlO1xuICAgICAgICBpZiAoZXZlbnQuY29udGV4dC5lZGl0aW5nVHlwZSA9PT0gRWRpdGluZ1R5cGUuRG9tYWluKSB7XG4gICAgICAgICAgICB0cmVlTm9kZSA9IHRoaXMuX3NlcnZpY2VDYXRhbG9nLnRhYmxlTW9kZWwuZ2V0RG9tYWluTm9kZShldmVudC5jb250ZXh0LmRvbWFpbk5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmNvbnRleHQuZWRpdGluZ1R5cGUgPT09IEVkaXRpbmdUeXBlLkFwcGxpY2F0aW9uKSB7XG4gICAgICAgICAgICB0cmVlTm9kZSA9IHRoaXMuX3NlcnZpY2VDYXRhbG9nLnRhYmxlTW9kZWwuZ2V0QXBwbGljYXRpb25Ob2RlKGV2ZW50LmNvbnRleHQuZG9tYWluTmFtZSwgZXZlbnQuY29udGV4dC5hcHBsaWNhdGlvbk5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmNvbnRleHQuZWRpdGluZ1R5cGUgPT09IEVkaXRpbmdUeXBlLk9wZXJhdGlvbikge1xuICAgICAgICAgICAgdHJlZU5vZGUgPSB0aGlzLl9zZXJ2aWNlQ2F0YWxvZy50YWJsZU1vZGVsLmdldE9wZXJhdGlvbk5vZGUoXG4gICAgICAgICAgICAgICAgZXZlbnQuY29udGV4dC5jaGFubmVsLFxuICAgICAgICAgICAgICAgIGV2ZW50LmNvbnRleHQuZG9tYWluTmFtZSxcbiAgICAgICAgICAgICAgICBldmVudC5jb250ZXh0LmFwcGxpY2F0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICBldmVudC5jb250ZXh0LnNlcnZpY2VOYW1lLFxuICAgICAgICAgICAgICAgIGV2ZW50LmNvbnRleHQub3BlcmF0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyZWVOb2RlKSB7XG4gICAgICAgICAgICB0cmVlTm9kZS5kYXRhLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgcHJpdmF0ZSBvbkFkZERvbWFpbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdvbkFkZERvbWFpbkNsaWNrJyk7XG4gICAgdGhpcy5fbmV3SXRlbURpYWxvZy5zaG93KEVkaXRpbmdUeXBlLkRvbWFpbik7XG4gICB9XG5cbiAgIHByaXZhdGUgb25BZGRBcHBsaWNhdGlvbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdvbkFkZEFwcGxpY2F0aW9uQ2xpY2snKTtcbiAgICB0aGlzLl9uZXdJdGVtRGlhbG9nLnNob3coRWRpdGluZ1R5cGUuQXBwbGljYXRpb24pO1xuICAgfVxuXG4gICBwcml2YXRlIG9uQWRkU2VydmljZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdvbkFkZFNlcnZpY2VDbGljaycpO1xuICAgIHRoaXMuX25ld0l0ZW1EaWFsb2cuc2hvdyhFZGl0aW5nVHlwZS5TZXJ2aWNlKTtcbiAgIH1cblxuICAgIHByaXZhdGUgb25BZGRPcGVyYXRpb25DbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ29uQWRkT3BlcmF0aW9uQ2xpY2snKTtcbiAgICAgICAgdGhpcy5fbmV3T3BlcmF0aW9uRGlhbG9nLnNob3coRWRpdGluZ1R5cGUuT3BlcmF0aW9uLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWRDaGFubmVsLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWREb21haW4sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3RlZEFwcGxpY2F0aW9uLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWRTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRGVsZXRlU2VsZWN0ZWROb2RlKCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZygnT25EZWxldGVTZWxlY3RlZCBub2RlOiAnLCB0aGlzLnNlbGVjdGVkTm9kZS5kYXRhKTtcbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGVSZXF1ZXN0KHRoaXMuc2VsZWN0ZWROb2RlLmRhdGEuY2F0YWxvZ0VudHJ5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURlbGV0ZVJlcXVlc3QoY2F0YWxvZ0VudHJ5OiBDYXRhbG9nRW50cnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNhdGFsb2dFbnRyeS5vcGVyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGVsZXRlT3BlcmF0aW9uKGNhdGFsb2dFbnRyeSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2F0YWxvZ0VudHJ5LnNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZURlbGV0ZVNlcnZpY2UoY2F0YWxvZ0VudHJ5KTtcbiAgICAgICAgfSBlbHNlIGlmIChjYXRhbG9nRW50cnkuYXBwbGljYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZURlbGV0ZUFwcGxpY2F0aW9uKGNhdGFsb2dFbnRyeSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2F0YWxvZ0VudHJ5LmRvbWFpbikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRGVsZXRlRG9tYWluKGNhdGFsb2dFbnRyeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKExPR19UQUcsICdVbmFibGUgdG8gaGFuZGxlIGRlbGV0ZSBmb3I6ICcsIGNhdGFsb2dFbnRyeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURlbGV0ZU9wZXJhdGlvbihjYXRhbG9nRW50cnk6IENhdGFsb2dFbnRyeSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICAgICAgICBtZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBvcGVyYXRpb24gJyArIGNhdGFsb2dFbnRyeS5vcGVyYXRpb24gKyAnID8nLFxuICAgICAgICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ViSGFuZGxlci5hZGQodGhpcy5zZXJ2aWNlQ2F0YWxvZ1NlcnZpY2UuZGVsZXRlT3BlcmF0aW9uKGNhdGFsb2dFbnRyeS5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICBjYXRhbG9nRW50cnkuZG9tYWluLCBjYXRhbG9nRW50cnkuYXBwbGljYXRpb24sIGNhdGFsb2dFbnRyeS5zZXJ2aWNlLCBjYXRhbG9nRW50cnkub3BlcmF0aW9uKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ09wZXJhdGlvbiBkZWxldGVkOiAnLCBkYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZUNhdGFsb2cudGFibGVNb2RlbC5yZW1vdmVPcGVyYXRpb25Ob2RlKGNhdGFsb2dFbnRyeS5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2dFbnRyeS5kb21haW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZ0VudHJ5LmFwcGxpY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2dFbnRyeS5zZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2dFbnRyeS5vcGVyYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRGVsZXRlT3BlcmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0RlbGV0ZSBPcGVyYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdPcGVyYXRpb24gZGVsZXRlZCBzdWNjZXNzZnVsbHkuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHICwgJ0RlbGV0ZSBvcGVyYXRpb24gZXJyb3I6ICcsIGVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0RlbGV0ZU9wZXJhdGlvbkVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0RlbGV0ZSBPcGVyYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciBkZWxldGluZyB0aGUgb3BlcmF0aW9uOicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVEZWxldGVTZXJ2aWNlKGNhdGFsb2dFbnRyeTogQ2F0YWxvZ0VudHJ5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHNlcnZpY2UgJyArIGNhdGFsb2dFbnRyeS5zZXJ2aWNlICsgJyA/JyxcbiAgICAgICAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMuc2VydmljZUNhdGFsb2dTZXJ2aWNlLmRlbGV0ZVNlcnZpY2UoY2F0YWxvZ0VudHJ5LmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgIGNhdGFsb2dFbnRyeS5kb21haW4sIGNhdGFsb2dFbnRyeS5hcHBsaWNhdGlvbiwgY2F0YWxvZ0VudHJ5LnNlcnZpY2UpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnU2VydmljZSBkZWxldGVkOiAnLCBkYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZUNhdGFsb2cudGFibGVNb2RlbC5yZW1vdmVTZXJ2aWNlTm9kZShjYXRhbG9nRW50cnkuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZ0VudHJ5LmRvbWFpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZ0VudHJ5LmFwcGxpY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRhbG9nRW50cnkuc2VydmljZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdEZWxldGVTZXJ2aWNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0RlbGV0ZSBTZXJ2aWNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnU2VydmljZSBkZWxldGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcgLCAnRGVsZXRlIHNlcnZpY2UgZXJyb3I6ICcsIGVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0RlbGV0ZVNlcnZpY2VFcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdEZWxldGUgU2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGRlbGV0aW5nIHRoZSBzZXJ2aWNlOicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVEZWxldGVBcHBsaWNhdGlvbihjYXRhbG9nRW50cnk6IENhdGFsb2dFbnRyeSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICAgICAgICBtZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBhcHBsaWNhdGlvbiAnICsgY2F0YWxvZ0VudHJ5LmFwcGxpY2F0aW9uICsgJyA/JyxcbiAgICAgICAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMuc2VydmljZUNhdGFsb2dTZXJ2aWNlLmRlbGV0ZUFwcGxpY2F0aW9uKFxuICAgICAgICAgICAgICAgICAgICBjYXRhbG9nRW50cnkuZG9tYWluLCBjYXRhbG9nRW50cnkuYXBwbGljYXRpb24pLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnQXBwbGljYXRpb24gZGVsZXRlZDogJywgZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlcnZpY2VDYXRhbG9nLnRhYmxlTW9kZWwucmVtb3ZlQXBwbGljYXRpb25Ob2RlKGNhdGFsb2dFbnRyeS5kb21haW4sIGNhdGFsb2dFbnRyeS5hcHBsaWNhdGlvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdEZWxldGVBcHBsaWNhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdEZWxldGUgQXBwbGljYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBcHBsaWNhdGlvbiBkZWxldGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcgLCAnRGVsZXRlIGFwcGxpY2F0aW9uIGVycm9yOiAnLCBlcnJvcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdEZWxldGVBcHBsaWNhdGlvbkVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0RlbGV0ZSBBcHBsaWNhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGRlbGV0aW5nIHRoZSBhcHBsaWNhdGlvbjonLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURlbGV0ZURvbWFpbihjYXRhbG9nRW50cnk6IENhdGFsb2dFbnRyeSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICAgICAgICBtZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBkb21haW4gJyArIGNhdGFsb2dFbnRyeS5kb21haW4gKyAnID8nLFxuICAgICAgICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ViSGFuZGxlci5hZGQodGhpcy5zZXJ2aWNlQ2F0YWxvZ1NlcnZpY2UuZGVsZXRlRG9tYWluKGNhdGFsb2dFbnRyeS5kb21haW4pLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnRG9tYWluIGRlbGV0ZWQ6ICcsIGRhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlQ2F0YWxvZy50YWJsZU1vZGVsLnJlbW92ZURvbWFpbk5vZGUoY2F0YWxvZ0VudHJ5LmRvbWFpbik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdEZWxldGVEb21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRGVsZXRlIERvbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0RvbWFpbiBkZWxldGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcgLCAnRGVsZXRlIGRvbWFpbiBlcnJvcjogJywgZXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRGVsZXRlRG9tYWluRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRGVsZXRlIERvbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGRlbGV0aW5nIHRoZSBkb21haW46JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgIH1cblxuXG4gICAgZ2V0IHNlbGVjdGVkTm9kZSgpOiBUcmVlTm9kZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlQ2F0YWxvZy5zZWxlY3RlZE5vZGU7XG4gICAgfVxuXG4gICAgb25OZXdJdGVtQ29uZmlybShldmVudDogRGlhbG9nUmVzdWx0KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5lZGl0VHlwZSA9PT0gRWRpdGluZ1R5cGUuRG9tYWluKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU5ld0RvbWFpbihldmVudC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5lZGl0VHlwZSA9PT0gRWRpdGluZ1R5cGUuQXBwbGljYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTmV3QXBwbGljYXRpb24odGhpcy5jdXJyZW50U2VsZWN0ZWREb21haW4sIGV2ZW50Lm5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmVkaXRUeXBlID09PSBFZGl0aW5nVHlwZS5TZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU5ld1NlcnZpY2UodGhpcy5jdXJyZW50U2VsZWN0ZWREb21haW4sXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWRBcHBsaWNhdGlvbixcbiAgICAgICAgICAgICAgICBldmVudC5uYW1lLCBldmVudC5jaGFubmVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oTE9HX1RBRywgJ29uTmV3SXRlbUNvbmZpcm0gdW5rbm93biBmb3I6ICcsIGV2ZW50KTtcbiAgICAgICAgICAgIC8vYWxlcnQoJ1Vua25vd24gZXZlbnQgdHlwZTogJyArIGV2ZW50LmVkaXRUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTmV3U2VydmljZU9wZXJhdGlvbkNvbmZpcm0oZXZlbnQ6IE5ld09wZXJhdGlvbkRpYWxvZ1Jlc3VsdCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnY3JlYXRlTmV3T3BlcmF0aW9uIGNhbGxlZCBmb3I6ICcsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5fc3ViSGFuZGxlci5hZGQodGhpcy5zZXJ2aWNlQ2F0YWxvZ1NlcnZpY2UuY3JlYXRlTmV3T3BlcmF0aW9uKGV2ZW50LmNoYW5uZWwsXG4gICAgICAgICAgICBldmVudC5kb21haW4sXG4gICAgICAgICAgICBldmVudC5hcHBsaWNhdGlvbixcbiAgICAgICAgICAgIGV2ZW50LnNlcnZpY2UsXG4gICAgICAgICAgICBldmVudC5uYW1lLFxuICAgICAgICAgICAgZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBldmVudC5wbHVnaW5OYW1lLFxuICAgICAgICAgICAgZXZlbnQuZW5jcnlwdGVkLFxuICAgICAgICAgICAgZXZlbnQuc2VjdXJlLFxuICAgICAgICAgICAgZXZlbnQuY291bnRlZCxcbiAgICAgICAgICAgIGV2ZW50LnNlc3Npb25sZXNzLFxuICAgICAgICAgICAgKGV2ZW50LmlucHV0UGFyYW1zID8gYnRvYShldmVudC5pbnB1dFBhcmFtcykgOiBudWxsKSxcbiAgICAgICAgICAgIChldmVudC5vdXRwdXRQYXJhbXMgPyBidG9hKGV2ZW50Lm91dHB1dFBhcmFtcykgOiBudWxsKSkuc3Vic2NyaWJlKChvcGVyYXRpb246IFNlcnZpY2VPcGVyYXRpb24pID0+IHtcblxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdOZXcgT3BlcmF0aW9uIGFkZGVkOiAnLCBvcGVyYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZUNhdGFsb2cudGFibGVNb2RlbC5hZGRPcGVyYXRpb25Ob2RlKGV2ZW50LmNoYW5uZWwsIGV2ZW50LmRvbWFpbiwgZXZlbnQuYXBwbGljYXRpb24sIGV2ZW50LnNlcnZpY2UsIG9wZXJhdGlvbik7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0NyZWF0ZU5ld09wZXJhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ3JlYXRlIE5ldyBPcGVyYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTmV3IE9wZXJhdGlvbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3NcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcblxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRyAsICdOZXcgb3BlcmF0aW9uIGVycm9yOiAnLCBlcnJvcik7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDcmVhdGVOZXdPcGVyYXRpb25FcnJvcicsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDcmVhdGUgTmV3IE9wZXJhdGlvbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGNyZWF0aW5nIHRoZSBuZXcgb3BlcmF0aW9uOicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU5ld0RvbWFpbihkb21haW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ2NyZWF0ZU5ld0RvbWFpbiBjYWxsZWQgZm9yOiAnLCBkb21haW5OYW1lKTtcblxuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZCh0aGlzLnNlcnZpY2VDYXRhbG9nU2VydmljZS5jcmVhdGVOZXdEb21haW4oZG9tYWluTmFtZSkuc3Vic2NyaWJlKChuZXdEb21haW46IERvbWFpbikgPT4ge1xuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnTmV3IGRvbWFpbiBhZGRlZDogJywgbmV3RG9tYWluKTtcblxuICAgICAgICAgICAgdGhpcy5fc2VydmljZUNhdGFsb2cudGFibGVNb2RlbC5hZGREb21haW5Ob2RlKG5ld0RvbWFpbik7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDcmVhdGVOZXdEb21haW4nLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQ3JlYXRlIE5ldyBEb21haW4nLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdOZXcgRG9tYWluIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcblxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRyAsICdOZXcgZG9tYWluIGVycm9yOiAnLCBlcnJvcik7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDcmVhdGVOZXdEb21haW5FcnJvcicsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDcmVhdGUgTmV3IERvbWFpbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGNyZWF0aW5nIHRoZSBuZXcgZG9tYWluOicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU5ld0FwcGxpY2F0aW9uKGRvbWFpbk5hbWU6IHN0cmluZywgYXBwbGljYXRpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnY3JlYXRlTmV3QXBwbGljYXRpb24gY2FsbGVkIGZvcjogJywgZG9tYWluTmFtZSwgYXBwbGljYXRpb25OYW1lKTtcblxuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZCh0aGlzLnNlcnZpY2VDYXRhbG9nU2VydmljZS5jcmVhdGVOZXdBcHBsaWNhdGlvbihcbiAgICAgICAgICAgIGRvbWFpbk5hbWUsIGFwcGxpY2F0aW9uTmFtZSkuc3Vic2NyaWJlKChuZXdBcHBsaWNhdGlvbjogQXBwbGljYXRpb24pID0+IHtcblxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ05ldyBhcHBsaWNhdGlvbiBhZGRlZDogJywgbmV3QXBwbGljYXRpb24pO1xuXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlQ2F0YWxvZy50YWJsZU1vZGVsLmFkZEFwcGxpY2F0aW9uTm9kZShkb21haW5OYW1lLCBuZXdBcHBsaWNhdGlvbik7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDcmVhdGVOZXdBcHBsaWNhdGlvbicsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDcmVhdGUgTmV3IEFwcGxpY2F0aW9uJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTmV3IEFwcGxpY2F0aW9uIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcblxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRyAsICdOZXcgYXBwbGljYXRpb24gZXJyb3I6ICcsIGVycm9yKTtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NyZWF0ZU5ld0FwcGxpY2F0aW9uRXJyb3InLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQ3JlYXRlIE5ldyBBcHBsaWNhdGlvbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGNyZWF0aW5nIHRoZSBuZXcgYXBwbGljYXRpb246JyxcbiAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlTmV3U2VydmljZShkb21haW46IHN0cmluZyxcbiAgICAgICAgYXBwbGljYXRpb246IHN0cmluZyxcbiAgICAgICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICAgICAgY2hhbm5lbDogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ2NyZWF0ZU5ld1NlcnZpY2UgY2FsbGVkIGZvcjogJywgZG9tYWluLCBhcHBsaWNhdGlvbiwgc2VydmljZU5hbWUsIGNoYW5uZWwpO1xuXG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMuc2VydmljZUNhdGFsb2dTZXJ2aWNlLmNyZWF0ZU5ld1NlcnZpY2UoXG4gICAgICAgICAgICBkb21haW4sIGFwcGxpY2F0aW9uLCBzZXJ2aWNlTmFtZSwgY2hhbm5lbCkuc3Vic2NyaWJlKChuZXdTZXJ2aWNlOiBTZXJ2aWNlKSA9PiB7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdOZXcgc2VydmljZSBhZGRlZDogJywgbmV3U2VydmljZSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3NlcnZpY2VDYXRhbG9nLnRhYmxlTW9kZWwuYWRkU2VydmljZU5vZGUoZG9tYWluLCBhcHBsaWNhdGlvbiwgbmV3U2VydmljZSk7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDcmVhdGVOZXdTZXJ2aWNlJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgU2VydmljZScsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ05ldyBTZXJ2aWNlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcblxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRyAsICdOZXcgYXBwbGljYXRpb24gZXJyb3I6ICcsIGVycm9yKTtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NyZWF0ZU5ld1NlcnZpY2VFcnJvcicsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDcmVhdGUgTmV3IFNlcnZpY2UnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciBjcmVhdGluZyB0aGUgbmV3IHNlcnZpY2U6JyxcbiAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudFNlbGVjdGVkRG9tYWluKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTm9kZS5kYXRhLmNhdGFsb2dFbnRyeS5kb21haW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50U2VsZWN0ZWRBcHBsaWNhdGlvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE5vZGUuZGF0YS5jYXRhbG9nRW50cnkuYXBwbGljYXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50U2VsZWN0ZWRTZXJ2aWNlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTm9kZS5kYXRhLmNhdGFsb2dFbnRyeS5zZXJ2aWNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudFNlbGVjdGVkQ2hhbm5lbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE5vZGUuZGF0YS5jYXRhbG9nRW50cnkuY2hhbm5lbDtcbiAgICB9XG5cbiAgICBvbk5vZGVDb21tYW5kKGV2ZW50OlNlcnZpY2VDYXRhbG9nTm9kZUNvbW1hbmRFdmVudCl7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnb25Ob2RlQ29tbWFuZCBldmVudDogJywgZXZlbnQpO1xuICAgICAgICBsZXQgY2F0YWxvZ0VudHJ5OkNhdGFsb2dFbnRyeSA9IHtcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uOiBldmVudC5ub2RlLmFwcGxpY2F0aW9uLFxuICAgICAgICAgICAgZG9tYWluOiBldmVudC5ub2RlLmRvbWFpbixcbiAgICAgICAgICAgIGNoYW5uZWw6IGV2ZW50Lm5vZGUuY2hhbm5lbCxcbiAgICAgICAgICAgIG9wZXJhdGlvbjogZXZlbnQubm9kZS5vcGVyYXRpb24sXG4gICAgICAgICAgICBzZXJ2aWNlOiBldmVudC5ub2RlLnNlcnZpY2VcblxuICAgICAgICB9O1xuICAgICAgICBpZiAoZXZlbnQuY29tbWFuZD09PSdEZWxldGUnKXtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGVsZXRlUmVxdWVzdChjYXRhbG9nRW50cnkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19