@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
141 lines • 21.7 kB
JavaScript
import { AzureConstants } from '@microsoft/windows-admin-center-sdk/core/azure/azure-constants';
import { GatewayUrls } from '@microsoft/windows-admin-center-sdk/core/data/gateway-urls';
import { Http } from '@microsoft/windows-admin-center-sdk/core/data/http';
import { Logging } from '@microsoft/windows-admin-center-sdk/core/diagnostics/logging';
import { EMPTY, of, throwError } from 'rxjs';
import { map, mergeMap, take } from 'rxjs/operators';
/**
* Defines the connectivity levels.
*/
export var ConnectivityLevel;
(function (ConnectivityLevel) {
/**
* All connections are allowed.
*/
ConnectivityLevel["All"] = "All";
/**
* Connections to Azure and gateway are allowed.
*/
ConnectivityLevel["AzureAndGateway"] = "AzureAndGateway";
/**
* Only connections to gateway are allowed.
*/
ConnectivityLevel["Gateway"] = "Gateway";
})(ConnectivityLevel || (ConnectivityLevel = {}));
/**
* Connectivity enforcer class
*/
export class ConnectivityEnforcer {
/**
* Registers the connectivity enforcer with the http if connectivity level is not 'All'
* @param appContextService The appcontext service
*/
static register(appContextService) {
const self = MsftSme.self();
const connectivityLevel = self.Init.connectivityLevel;
if (!connectivityLevel || connectivityLevel === ConnectivityLevel.All) {
Http.unregisterMonitors(ConnectivityEnforcer.monitorName);
return;
}
Http.registerMonitorSet({
name: ConnectivityEnforcer.monitorName,
preMonitor: (request) => {
if (!request) {
Logging.logWarning('ConnectivityEnforcer', 'Connectivity enforcer failed to access the AjaxRequest object.');
return of(request);
}
const requestUrl = request.url;
if (!requestUrl) {
Logging.logWarning('ConnectivityEnforcer', 'Connectivity enforcer failed to get the request url.');
return of(request);
}
if (ConnectivityEnforcer.isGatewayRequest(appContextService, requestUrl) ||
ConnectivityEnforcer.isRequestAllowed(connectivityLevel, requestUrl)) {
// Let request go through
return of(request);
}
return ConnectivityEnforcer.getDialogContent(appContextService, false, requestUrl)
.pipe(take(1), mergeMap(dialogContent => {
return appContextService.frame.showDialogMessage(dialogContent);
}), mergeMap(() => {
return EMPTY;
}));
},
successMonitor: (response) => {
return of(response);
},
errorMonitor: (error) => {
return throwError(() => error);
}
});
}
/**
* Checks if Azure login is allowed. Shows a connectivity dialog if its not.
* @param appContextService The appcontext service
* @returns true if Azure login is allowed, else false.
*/
static checkAzureLoginAllowed(appContextService, dialogService) {
const self = MsftSme.self();
const connectivityLevel = self.Init.connectivityLevel;
if (connectivityLevel === ConnectivityLevel.Gateway) {
ConnectivityEnforcer.getDialogContent(appContextService, true)
.pipe(take(1), mergeMap(dialogContent => {
return dialogService.showMessage(dialogContent);
}))
.subscribe();
return false;
}
return true;
}
/**
* Checks to see if the request is a gateway request.
*/
static isGatewayRequest(appContextService, requestUrl) {
return !requestUrl.startsWith('http') || requestUrl.startsWith(appContextService.gateway.gatewayUrl);
}
/**
* Checks to see if the request can be allowed to go through.
*/
static isRequestAllowed(connectivityLevel, requestUrl) {
const announcementsBlobGlobal = 'https://announcements.blob.core.windows.net';
const announcementsBlobChina = 'https://announcements.blob.core.chinacloudapi.cn';
const announcementsBlobFairfax = 'https://announcements.blob.core.usgovcloudapi.net';
// TODO: Load from manifest.
if (connectivityLevel === ConnectivityLevel.AzureAndGateway) {
const approvedUrls = [
AzureConstants.azureGlobalArmEndpoint,
AzureConstants.azureChinaArmEndpoint,
AzureConstants.azureUSGovArmEndpoint,
announcementsBlobGlobal,
announcementsBlobChina,
announcementsBlobFairfax
];
return approvedUrls.some(url => requestUrl.startsWith(url));
}
return false;
}
static getDialogContent(appContextService, isAzureLogin, requestUrl = '') {
// TODO: Check if service/desktop mode
return appContextService.gateway.get(GatewayUrls.accessCheck)
.pipe(take(1), map(isAdmin => {
const strings = MsftSme.getStrings().MsftSmeShell.Angular;
let externalLink;
if (isAdmin) {
externalLink = {
url: appContextService.gateway.gatewayUrl + GatewayUrls.settingsConnectivityRelativeUrl,
title: strings.Connectivity.Restricted.ChangeSettings.text
};
}
const dialogContent = {
buttonText: strings.Common.OK.state,
message: isAzureLogin ?
strings.Connectivity.Restricted.Azure.text : strings.Connectivity.Restricted.Offline.text.format(requestUrl),
title: strings.Connectivity.Restricted.title,
externalLink: externalLink
};
return dialogContent;
}));
}
}
ConnectivityEnforcer.monitorName = 'ConnectivityEnforcer';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGl2aXR5LWVuZm9yY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvc2VydmljZS9jb25uZWN0aXZpdHktZW5mb3JjZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN6RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDMUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV6RCxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU1yRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGlCQWFYO0FBYkQsV0FBWSxpQkFBaUI7SUFDekI7O09BRUc7SUFDSCxnQ0FBVyxDQUFBO0lBQ1g7O09BRUc7SUFDSCx3REFBbUMsQ0FBQTtJQUNuQzs7T0FFRztJQUNILHdDQUFtQixDQUFBO0FBQ3ZCLENBQUMsRUFiVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBYTVCO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBRzdCOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsaUJBQW9DO1FBQ3ZELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDdEQsSUFBSSxDQUFDLGlCQUFpQixJQUFJLGlCQUFpQixLQUFLLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNuRSxJQUFJLENBQUMs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LGNBQWMsQ0FBQyxJQUFJO2lCQUM3RCxDQUFDO2FBQ0w7WUFFRCxNQUFNLGFBQWEsR0FBeUI7Z0JBQ3hDLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLO2dCQUNuQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ25CLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDaEgsS0FBSyxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUs7Z0JBQzVDLFlBQVksRUFBRSxZQUFZO2FBQzdCLENBQUM7WUFFRixPQUFPLGFBQWEsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7O0FBdkljLGdDQUFXLEdBQUcsc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBenVyZUNvbnN0YW50cyB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYXp1cmUvYXp1cmUtY29uc3RhbnRzJztcclxuaW1wb3J0IHsgR2F0ZXdheVVybHMgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvZ2F0ZXdheS11cmxzJztcclxuaW1wb3J0IHsgSHR0cCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9odHRwJztcclxuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nZ2luZyc7XHJcbmltcG9ydCB7IEVNUFRZLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBamF4RXJyb3IsIEFqYXhSZXF1ZXN0LCBBamF4UmVzcG9uc2UgfSBmcm9tICdyeGpzL2FqYXgnO1xyXG5pbXBvcnQgeyBtYXAsIG1lcmdlTWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vY29udHJvbHMvZGlhbG9nL2RpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWVzc2FnZURpYWxvZ0xpbmssIE1lc3NhZ2VEaWFsb2dPcHRpb25zIH0gZnJvbSAnLi4vY29udHJvbHMvZGlhbG9nL21lc3NhZ2UtZGlhbG9nL21lc3NhZ2UtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFN0cmluZ3MgfSBmcm9tICcuLi9nZW5lcmF0ZWQvc3RyaW5ncyc7XHJcbmltcG9ydCB7IEFwcENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi9hcHAtY29udGV4dC5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBEZWZpbmVzIHRoZSBjb25uZWN0aXZpdHkgbGV2ZWxzLlxyXG4gKi9cclxuZXhwb3J0IGVudW0gQ29ubmVjdGl2aXR5TGV2ZWwge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbGwgY29ubmVjdGlvbnMgYXJlIGFsbG93ZWQuXHJcbiAgICAgKi9cclxuICAgIEFsbCA9ICdBbGwnLFxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0aW9ucyB0byBBenVyZSBhbmQgZ2F0ZXdheSBhcmUgYWxsb3dlZC5cclxuICAgICAqL1xyXG4gICAgQXp1cmVBbmRHYXRld2F5ID0gJ0F6dXJlQW5kR2F0ZXdheScsXHJcbiAgICAvKipcclxuICAgICAqIE9ubHkgY29ubmVjdGlvbnMgdG8gZ2F0ZXdheSBhcmUgYWxsb3dlZC5cclxuICAgICAqL1xyXG4gICAgR2F0ZXdheSA9ICdHYXRld2F5J1xyXG59XHJcblxyXG4vKipcclxuICogQ29ubmVjdGl2aXR5IGVuZm9yY2VyIGNsYXNzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29ubmVjdGl2aXR5RW5mb3JjZXIge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbW9uaXRvck5hbWUgPSAnQ29ubmVjdGl2aXR5RW5mb3JjZXInO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJzIHRoZSBjb25uZWN0aXZpdHkgZW5mb3JjZXIgd2l0aCB0aGUgaHR0cCBpZiBjb25uZWN0aXZpdHkgbGV2ZWwgaXMgbm90ICdBbGwnXHJcbiAgICAgKiBAcGFyYW0gYXBwQ29udGV4dFNlcnZpY2UgVGhlIGFwcGNvbnRleHQgc2VydmljZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyKGFwcENvbnRleHRTZXJ2aWNlOiBBcHBDb250ZXh0U2VydmljZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSBNc2Z0U21lLnNlbGYoKTtcclxuICAgICAgICBjb25zdCBjb25uZWN0aXZpdHlMZXZlbCA9IHNlbGYuSW5pdC5jb25uZWN0aXZpdHlMZXZlbDtcclxuICAgICAgICBpZiAoIWNvbm5lY3Rpdml0eUxldmVsIHx8IGNvbm5lY3Rpdml0eUxldmVsID09PSBDb25uZWN0aXZpdHlMZXZlbC5BbGwpIHtcclxuICAgICAgICAgICAgSHR0cC51bnJlZ2lzdGVyTW9uaXRvcnMoQ29ubmVjdGl2aXR5RW5mb3JjZXIubW9uaXRvck5hbWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBIdHRwLnJlZ2lzdGVyTW9uaXRvclNldCh7XHJcbiAgICAgICAgICAgIG5hbWU6IENvbm5lY3Rpdml0eUVuZm9yY2VyLm1vbml0b3JOYW1lLFxyXG4gICAgICAgICAgICBwcmVNb25pdG9yOiAocmVxdWVzdDogQWpheFJlcXVlc3QpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dpbmcubG9nV2FybmluZygnQ29ubmVjdGl2aXR5RW5mb3JjZXInLCAnQ29ubmVjdGl2aXR5IGVuZm9yY2VyIGZhaWxlZCB0byBhY2Nlc3MgdGhlIEFqYXhSZXF1ZXN0IG9iamVjdC4nKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YocmVxdWVzdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdFVybCA9IHJlcXVlc3QudXJsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdFVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dpbmcubG9nV2FybmluZygnQ29ubmVjdGl2aXR5RW5mb3JjZXInLCAnQ29ubmVjdGl2aXR5IGVuZm9yY2VyIGZhaWxlZCB0byBnZXQgdGhlIHJlcXVlc3QgdXJsLicpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihyZXF1ZXN0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoQ29ubmVjdGl2aXR5RW5mb3JjZXIuaXNHYXRld2F5UmVxdWVzdChhcHBDb250ZXh0U2VydmljZSwgcmVxdWVzdFVybCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5RW5mb3JjZXIuaXNSZXF1ZXN0QWxsb3dlZChjb25uZWN0aXZpdHlMZXZlbCwgcmVxdWVzdFVybCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBMZXQgcmVxdWVzdCBnbyB0aHJvdWdoXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBDb25uZWN0aXZpdHlFbmZvcmNlci5nZXREaWFsb2dDb250ZW50KGFwcENvbnRleHRTZXJ2aWNlLCBmYWxzZSwgcmVxdWVzdFVybClcclxuICAgICAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VNYXAoZGlhbG9nQ29udGVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwQ29udGV4dFNlcnZpY2UuZnJhbWUuc2hvd0RpYWxvZ01lc3NhZ2UoZGlhbG9nQ29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZU1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3VjY2Vzc01vbml0b3I6IChyZXNwb25zZTogQWpheFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvZihyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yTW9uaXRvcjogKGVycm9yOiBBamF4RXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIEF6dXJlIGxvZ2luIGlzIGFsbG93ZWQuIFNob3dzIGEgY29ubmVjdGl2aXR5IGRpYWxvZyBpZiBpdHMgbm90LlxyXG4gICAgICogQHBhcmFtIGFwcENvbnRleHRTZXJ2aWNlIFRoZSBhcHBjb250ZXh0IHNlcnZpY2VcclxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgQXp1cmUgbG9naW4gaXMgYWxsb3dlZCwgZWxzZSBmYWxzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjaGVja0F6dXJlTG9naW5BbGxvd2VkKGFwcENvbnRleHRTZXJ2aWNlOiBBcHBDb250ZXh0U2VydmljZSwgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSBNc2Z0U21lLnNlbGYoKTtcclxuICAgICAgICBjb25zdCBjb25uZWN0aXZpdHlMZXZlbCA9IHNlbGYuSW5pdC5jb25uZWN0aXZpdHlMZXZlbDtcclxuICAgICAgICBpZiAoY29ubmVjdGl2aXR5TGV2ZWwgPT09IENvbm5lY3Rpdml0eUxldmVsLkdhdGV3YXkpIHtcclxuICAgICAgICAgICAgQ29ubmVjdGl2aXR5RW5mb3JjZXIuZ2V0RGlhbG9nQ29udGVudChhcHBDb250ZXh0U2VydmljZSwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VNYXAoZGlhbG9nQ29udGVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaWFsb2dTZXJ2aWNlLnNob3dNZXNzYWdlKGRpYWxvZ0NvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIHJlcXVlc3QgaXMgYSBnYXRld2F5IHJlcXVlc3QuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGlzR2F0ZXdheVJlcXVlc3QoYXBwQ29udGV4dFNlcnZpY2U6IEFwcENvbnRleHRTZXJ2aWNlLCByZXF1ZXN0VXJsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXJlcXVlc3RVcmwuc3RhcnRzV2l0aCgnaHR0cCcpIHx8IHJlcXVlc3RVcmwuc3RhcnRzV2l0aChhcHBDb250ZXh0U2VydmljZS5nYXRld2F5LmdhdGV3YXlVcmwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVxdWVzdCBjYW4gYmUgYWxsb3dlZCB0byBnbyB0aHJvdWdoLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpc1JlcXVlc3RBbGxvd2VkKGNvbm5lY3Rpdml0eUxldmVsOiBzdHJpbmcsIHJlcXVlc3RVcmw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGFubm91bmNlbWVudHNCbG9iR2xvYmFsID0gJ2h0dHBzOi8vYW5ub3VuY2VtZW50cy5ibG9iLmNvcmUud2luZG93cy5uZXQnO1xyXG4gICAgICAgIGNvbnN0IGFubm91bmNlbWVudHNCbG9iQ2hpbmEgPSAnaHR0cHM6Ly9hbm5vdW5jZW1lbnRzLmJsb2IuY29yZS5jaGluYWNsb3VkYXBpLmNuJztcclxuICAgICAgICBjb25zdCBhbm5vdW5jZW1lbnRzQmxvYkZhaXJmYXggPSAnaHR0cHM6Ly9hbm5vdW5jZW1lbnRzLmJsb2IuY29yZS51c2dvdmNsb3VkYXBpLm5ldCc7XHJcbiAgICAgICAgLy8gVE9ETzogTG9hZCBmcm9tIG1hbmlmZXN0LlxyXG4gICAgICAgIGlmIChjb25uZWN0aXZpdHlMZXZlbCA9PT0gQ29ubmVjdGl2aXR5TGV2ZWwuQXp1cmVBbmRHYXRld2F5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFwcHJvdmVkVXJscyA9IFtcclxuICAgICAgICAgICAgICAgIEF6dXJlQ29uc3RhbnRzLmF6dXJlR2xvYmFsQXJtRW5kcG9pbnQsXHJcbiAgICAgICAgICAgICAgICBBenVyZUNvbnN0YW50cy5henVyZUNoaW5hQXJtRW5kcG9pbnQsXHJcbiAgICAgICAgICAgICAgICBBenVyZUNvbnN0YW50cy5henVyZVVTR292QXJtRW5kcG9pbnQsXHJcbiAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnRzQmxvYkdsb2JhbCxcclxuICAgICAgICAgICAgICAgIGFubm91bmNlbWVudHNCbG9iQ2hpbmEsXHJcbiAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnRzQmxvYkZhaXJmYXhcclxuICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgcmV0dXJuIGFwcHJvdmVkVXJscy5zb21lKHVybCA9PiByZXF1ZXN0VXJsLnN0YXJ0c1dpdGgodXJsKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RGlhbG9nQ29udGVudChcclxuICAgICAgICBhcHBDb250ZXh0U2VydmljZTogQXBwQ29udGV4dFNlcnZpY2UsXHJcbiAgICAgICAgaXNBenVyZUxvZ2luOiBib29sZWFuLFxyXG4gICAgICAgIHJlcXVlc3RVcmw6IHN0cmluZyA9ICcnKTogT2JzZXJ2YWJsZTxNZXNzYWdlRGlhbG9nT3B0aW9ucz4ge1xyXG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIHNlcnZpY2UvZGVza3RvcCBtb2RlXHJcbiAgICAgICAgcmV0dXJuIGFwcENvbnRleHRTZXJ2aWNlLmdhdGV3YXkuZ2V0KEdhdGV3YXlVcmxzLmFjY2Vzc0NoZWNrKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICBtYXAoaXNBZG1pbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5ncyA9IE1zZnRTbWUuZ2V0U3RyaW5nczxTdHJpbmdzPigpLk1zZnRTbWVTaGVsbC5Bbmd1bGFyO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgZXh0ZXJuYWxMaW5rOiBNZXNzYWdlRGlhbG9nTGluaztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBZG1pbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbExpbmsgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGFwcENvbnRleHRTZXJ2aWNlLmdhdGV3YXkuZ2F0ZXdheVVybCArIEdhdGV3YXlVcmxzLnNldHRpbmdzQ29ubmVjdGl2aXR5UmVsYXRpdmVVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogc3RyaW5ncy5Db25uZWN0aXZpdHkuUmVzdHJpY3RlZC5DaGFuZ2VTZXR0aW5ncy50ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWFsb2dDb250ZW50OiBNZXNzYWdlRGlhbG9nT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uVGV4dDogc3RyaW5ncy5Db21tb24uT0suc3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGlzQXp1cmVMb2dpbiA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLkNvbm5lY3Rpdml0eS5SZXN0cmljdGVkLkF6dXJlLnRleHQgOiBzdHJpbmdzLkNvbm5lY3Rpdml0eS5SZXN0cmljdGVkLk9mZmxpbmUudGV4dC5mb3JtYXQocmVxdWVzdFVybCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBzdHJpbmdzLkNvbm5lY3Rpdml0eS5SZXN0cmljdGVkLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbExpbms6IGV4dGVybmFsTGlua1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkaWFsb2dDb250ZW50O1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==