UNPKG

wft-geodb-angular-client

Version:
428 lines 65.1 kB
import { HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "./model/geodb-config.model";
export class GeoDbService {
    constructor(httpClient, config) {
        this.httpClient = httpClient;
        this.config = config;
        this.adminDivisionsEndpoint = config.serviceUri + '/v1/geo/adminDivisions';
        this.countriesEndpoint = config.serviceUri + '/v1/geo/countries';
        this.currenciesEndpoint = config.serviceUri + '/v1/locale/currencies';
        this.languagesEndpoint = config.serviceUri + '/v1/locale/languages';
        this.localesEndpoint = config.serviceUri + '/v1/locale/locales';
        this.placesEndpoint = config.serviceUri + '/v1/geo/places';
        this.timeZonesEndpoint = config.serviceUri + '/v1/locale/timezones';
    }
    static buildPagingParams(request) {
        return new HttpParams()
            .set('offset', '' + request.offset)
            .set('limit', '' + request.limit)
            .set('hateoasMode', 'false');
    }
    static toLocationString(nearLocation) {
        let locationString = '';
        if (nearLocation.latitude > 0) {
            locationString += '+';
        }
        locationString += nearLocation.latitude;
        if (nearLocation.longitude > 0) {
            locationString += '+';
        }
        locationString += nearLocation.longitude;
        return locationString;
    }
    findAdminDivisions(request) {
        let params = GeoDbService.buildPagingParams(request);
        if (request.countryIds) {
            params = params.set('countryIds', request.countryIds.join(','));
        }
        if (request.excludedCountryIds) {
            params = params.set('excludedCountryIds', request.excludedCountryIds.join(','));
        }
        if (request.namePrefix) {
            params = params.set('namePrefix', request.namePrefix);
        }
        if (request.namePrefixDefaultLangResults) {
            params = params.set('namePrefixDefaultLangResults', request.namePrefixDefaultLangResults);
        }
        if (request.minPopulation) {
            params = params.set('minPopulation', '' + request.minPopulation);
        }
        if (request.maxPopulation) {
            params = params.set('maxPopulation', '' + request.maxPopulation);
        }
        if (request.timeZoneIds) {
            params = params.set('timeZoneIds', request.timeZoneIds.join(','));
        }
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        if (request.sortDirectives) {
            params = params.set('sort', request.sortDirectives.join(','));
        }
        if (request.includeDeleted) {
            params = params.set('includeDeleted', request.includeDeleted);
        }
        return this.httpClient.get(this.adminDivisionsEndpoint, {
            params: params
        });
    }
    findCountries(request) {
        let params = GeoDbService.buildPagingParams(request);
        if (request.currencyCode) {
            params = params.set('currencyCode', request.currencyCode);
        }
        if (request.namePrefix) {
            params = params.set('namePrefix', request.namePrefix);
        }
        if (request.namePrefixDefaultLangResults) {
            params = params.set('namePrefixDefaultLangResults', request.namePrefixDefaultLangResults);
        }
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        return this.httpClient.get(this.countriesEndpoint, {
            params: params
        });
    }
    findCountryPlaces(request) {
        const endpoint = this.buildCountryEndpoint(request.countryId) + '/places';
        let params = GeoDbService.buildPagingParams(request);
        if (request.namePrefix) {
            params = params.set('namePrefix', request.namePrefix);
        }
        if (request.namePrefixDefaultLangResults) {
            params = params.set('namePrefixDefaultLangResults', request.namePrefixDefaultLangResults);
        }
        if (request.minPopulation) {
            params = params.set('minPopulation', '' + request.minPopulation);
        }
        if (request.maxPopulation) {
            params = params.set('maxPopulation', '' + request.maxPopulation);
        }
        if (request.types) {
            params = params.set('types', request.types.join(','));
        }
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        if (request.sortDirectives) {
            params = params.set('sort', request.sortDirectives.join(','));
        }
        return this.httpClient.get(endpoint, {
            params: params
        });
    }
    findCountry(request) {
        const endpoint = this.countriesEndpoint + '/' + request.countryId;
        let params = new HttpParams();
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        return this.httpClient.get(endpoint, {
            params: params
        });
    }
    findCurrencies(request) {
        let params = GeoDbService.buildPagingParams(request);
        if (request.countryId) {
            params = params.set('countryId', request.countryId);
        }
        return this.httpClient.get(this.currenciesEndpoint, {
            params: params
        });
    }
    findLanguages(request) {
        const params = GeoDbService.buildPagingParams(request);
        return this.httpClient.get(this.languagesEndpoint, {
            params: params
        });
    }
    findLocales(request) {
        const params = GeoDbService.buildPagingParams(request);
        return this.httpClient.get(this.localesEndpoint, {
            params: params
        });
    }
    findPlaces(request) {
        let params = GeoDbService.buildPagingParams(request);
        if (request.countryIds) {
            params = params.set('countryIds', request.countryIds.join(','));
        }
        if (request.excludedCountryIds) {
            params = params.set('excludedCountryIds', request.excludedCountryIds.join(','));
        }
        if (request.namePrefix) {
            params = params.set('namePrefix', request.namePrefix);
        }
        if (request.namePrefixDefaultLangResults) {
            params = params.set('namePrefixDefaultLangResults', request.namePrefixDefaultLangResults);
        }
        if (request.minPopulation) {
            params = params.set('minPopulation', '' + request.minPopulation);
        }
        if (request.maxPopulation) {
            params = params.set('maxPopulation', '' + request.maxPopulation);
        }
        if (request.timeZoneIds) {
            params = params.set('timeZoneIds', request.timeZoneIds.join(','));
        }
        if (request.types) {
            params = params.set('types', request.types.join(','));
        }
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        if (request.sortDirectives) {
            params = params.set('sort', request.sortDirectives.join(','));
        }
        if (request.includeDeleted) {
            params = params.set('includeDeleted', request.includeDeleted);
        }
        return this.httpClient.get(this.placesEndpoint, {
            params: params
        });
    }
    findPlacesNearLocation(request) {
        let params = GeoDbService.buildPagingParams(request);
        params = params
            .set('radius', '' + request.location.radius)
            .set('distanceUnit', request.location.distanceUnit);
        if (request.namePrefix) {
            params = params.set('namePrefix', request.namePrefix);
        }
        if (request.namePrefixDefaultLangResults) {
            params = params.set('namePrefixDefaultLangResults', request.namePrefixDefaultLangResults);
        }
        if (request.minPopulation) {
            params = params.set('minPopulation', '' + request.minPopulation);
        }
        if (request.maxPopulation) {
            params = params.set('maxPopulation', '' + request.maxPopulation);
        }
        if (request.types) {
            params = params.set('types', request.types.join(','));
        }
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        if (request.sortDirectives) {
            params = params.set('sort', request.sortDirectives.join(','));
        }
        if (request.includeDeleted) {
            params = params.set('includeDeleted', request.includeDeleted);
        }
        // Workaround for HttpClient '+' encoding bug.
        const locationId = GeoDbService
            .toLocationString(request.location)
            .replace(/\+/g, '%2B');
        const endpoint = this.placesEndpoint + '?location=' + locationId;
        return this.httpClient.get(endpoint, {
            params: params
        });
    }
    findPlacesNearPlace(request) {
        let params = GeoDbService.buildPagingParams(request);
        params = params
            .set('radius', '' + request.radius)
            .set('distanceUnit', request.distanceUnit);
        if (request.namePrefix) {
            params = params.set('namePrefix', request.namePrefix);
        }
        if (request.namePrefixDefaultLangResults) {
            params = params.set('namePrefixDefaultLangResults', request.namePrefixDefaultLangResults);
        }
        if (request.minPopulation) {
            params = params.set('minPopulation', '' + request.minPopulation);
        }
        if (request.maxPopulation) {
            params = params.set('maxPopulation', '' + request.maxPopulation);
        }
        if (request.types) {
            params = params.set('types', request.types.join(','));
        }
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        if (request.sortDirectives) {
            params = params.set('sort', request.sortDirectives.join(','));
        }
        if (request.includeDeleted) {
            params = params.set('includeDeleted', request.includeDeleted);
        }
        const endpoint = this.placesEndpoint + '/' + request.placeId + '/nearbyPlaces';
        return this.httpClient.get(endpoint, {
            params: params
        });
    }
    findRegion(request) {
        const endpoint = this.buildRegionsEndpoint(request.countryId) + '/' + request.regionCode;
        let params = new HttpParams();
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        return this.httpClient.get(endpoint, {
            params: params
        });
    }
    findRegionPlaces(request) {
        const endpoint = this.buildRegionEndpoint(request.countryId, request.regionId) + '/places';
        let params = GeoDbService.buildPagingParams(request);
        if (request.namePrefix) {
            params = params.set('namePrefix', request.namePrefix);
        }
        if (request.namePrefixDefaultLangResults) {
            params = params.set('namePrefixDefaultLangResults', request.namePrefixDefaultLangResults);
        }
        if (request.minPopulation) {
            params = params.set('minPopulation', '' + request.minPopulation);
        }
        if (request.maxPopulation) {
            params = params.set('maxPopulation', '' + request.maxPopulation);
        }
        if (request.types) {
            params = params.set('types', request.types.join(','));
        }
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        if (request.sortDirectives) {
            params = params.set('sort', request.sortDirectives.join(','));
        }
        return this.httpClient.get(endpoint, {
            params: params
        });
    }
    findRegions(request) {
        const endpoint = this.buildRegionsEndpoint(request.countryId);
        let params = GeoDbService.buildPagingParams(request);
        if (request.namePrefix) {
            params = params.set('namePrefix', request.namePrefix);
        }
        if (request.namePrefixDefaultLangResults) {
            params = params.set('namePrefixDefaultLangResults', request.namePrefixDefaultLangResults);
        }
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        return this.httpClient.get(endpoint, {
            params: params
        });
    }
    findTimeZones(request) {
        const params = GeoDbService.buildPagingParams(request);
        return this.httpClient.get(this.timeZonesEndpoint, {
            params: params
        });
    }
    get apiKey() {
        return this.config.apiKey;
    }
    setApiKey(apiKey) {
        this.config.apiKey = apiKey;
    }
    getPlace(request) {
        const endpoint = this.buildPlaceEndpoint(request.placeId);
        let params = new HttpParams();
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        return this.httpClient.get(endpoint, {
            params: params
        });
    }
    getPlaceAdminRegion(request) {
        const endpoint = this.buildPlaceEndpoint(request.placeId) + '/locatedIn';
        let params = new HttpParams();
        if (request.asciiMode) {
            params = params.set('asciiMode', '' + request.asciiMode);
        }
        if (request.languageCode) {
            params = params.set('languageCode', request.languageCode);
        }
        return this.httpClient.get(endpoint, {
            params: params
        });
    }
    getPlaceDateTime(id) {
        const endpoint = this.buildPlaceEndpoint(id) + '/dateTime';
        return this.httpClient.get(endpoint);
    }
    getPlaceDistance(request) {
        const endpoint = this.buildPlaceEndpoint(request.fromPlaceId) + '/distance';
        const params = new HttpParams()
            .set('toPlaceId', '' + request.toPlaceId)
            .set('distanceUnit', '' + request.distanceUnit);
        return this.httpClient.get(endpoint, {
            params: params
        });
    }
    getPlaceTime(placeId) {
        const endpoint = this.buildPlaceEndpoint(placeId) + '/time';
        return this.httpClient.get(endpoint);
    }
    getTimeZoneDateTime(zoneId) {
        const endpoint = this.buildTimeZoneEndpoint(zoneId) + '/dateTime';
        return this.httpClient.get(endpoint);
    }
    getTimeZoneTime(zoneId) {
        const endpoint = this.buildTimeZoneEndpoint(zoneId) + '/time';
        return this.httpClient.get(endpoint);
    }
    buildCountryEndpoint(countryId) {
        return this.countriesEndpoint + '/' + countryId;
    }
    buildPlaceEndpoint(olaceId) {
        return this.placesEndpoint + '/' + olaceId;
    }
    buildRegionEndpoint(countryId, regionId) {
        return this.buildRegionsEndpoint(countryId) + '/' + regionId;
    }
    buildRegionsEndpoint(countryId) {
        return this.buildCountryEndpoint(countryId) + '/regions';
    }
    buildTimeZoneEndpoint(zoneId) {
        return this.timeZonesEndpoint + '/' + zoneId;
    }
}
GeoDbService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: GeoDbService, deps: [{ token: i1.HttpClient }, { token: i2.GeoDbConfig }], target: i0.ɵɵFactoryTarget.Injectable });
GeoDbService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: GeoDbService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: GeoDbService, decorators: [{
            type: Injectable
        }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.GeoDbConfig }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvZGIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3dmdC1nZW9kYi1hbmd1bGFyLWNsaWVudC9zcmMvbGliL2dlb2RiLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFhLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7Ozs7QUFnQ3pDLE1BQU0sT0FBTyxZQUFZO0lBU3ZCLFlBQW9CLFVBQXNCLEVBQVUsTUFBbUI7UUFBbkQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQWE7UUFFckUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsd0JBQXdCLENBQUM7UUFDM0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsbUJBQW1CLENBQUM7UUFDakUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsdUJBQXVCLENBQUM7UUFDdEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsc0JBQXNCLENBQUM7UUFDcEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFHLG9CQUFvQixDQUFDO1FBQ2hFLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztRQUMzRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQztJQUN0RSxDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQThCO1FBRTdELE9BQU8sSUFBSSxVQUFVLEVBQUU7YUFDcEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQzthQUNsQyxH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LENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxTQUFpQixFQUFFLFFBQWdCO1FBQzdELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDL0QsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFNBQWlCO1FBQzVDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztJQUMzRCxDQUFDO0lBRU8scUJBQXFCLENBQUMsTUFBYztRQUMxQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0lBQy9DLENBQUM7O3lHQS9uQlUsWUFBWTs2R0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7UGxhY2VEZXRhaWxzfSBmcm9tICcuL21vZGVsL3BsYWNlLWRldGFpbHMubW9kZWwnO1xuaW1wb3J0IHtQbGFjZVN1bW1hcnl9IGZyb20gJy4vbW9kZWwvcGxhY2Utc3VtbWFyeS5tb2RlbCc7XG5pbXBvcnQge0NvdW50cnlTdW1tYXJ5fSBmcm9tICcuL21vZGVsL2NvdW50cnktc3VtbWFyeS5tb2RlbCc7XG5pbXBvcnQge0dlb1Jlc3BvbnNlfSBmcm9tICcuL21vZGVsL2dlby1yZXNwb25zZS5tb2RlbCc7XG5pbXBvcnQge05lYXJMb2NhdGlvblJlcXVlc3R9IGZyb20gJy4vcmVxdWVzdC9uZWFyLWxvY2F0aW9uLXJlcXVlc3QubW9kZWwnO1xuaW1wb3J0IHtSZWdpb25TdW1tYXJ5fSBmcm9tICcuL21vZGVsL3JlZ2lvbi1zdW1tYXJ5Lm1vZGVsJztcblxuaW1wb3J0IHtHZW9EYkNvbmZpZ30gZnJvbSAnLi9tb2RlbC9nZW9kYi1jb25maWcubW9kZWwnO1xuaW1wb3J0IHtDb3VudHJ5RGV0YWlsc30gZnJvbSAnLi9tb2RlbC9jb3VudHJ5LWRldGFpbHMubW9kZWwnO1xuaW1wb3J0IHtSZWdpb25EZXRhaWxzfSBmcm9tICcuL21vZGVsL3JlZ2lvbi1kZXRhaWxzLm1vZGVsJztcbmltcG9ydCB7Q3VycmVuY3l9IGZyb20gJy4vbW9kZWwvY3VycmVuY3kubW9kZWwnO1xuaW1wb3J0IHtMb2NhbGV9IGZyb20gJy4vbW9kZWwvbG9jYWxlLm1vZGVsJztcbmltcG9ydCB7RmluZEFkbWluRGl2aXNpb25zUmVxdWVzdH0gZnJvbSAnLi9yZXF1ZXN0L2ZpbmQtYWRtaW4tZGl2aXNpb25zLXJlcXVlc3QubW9kZWwnO1xuaW1wb3J0IHtGaW5kQ291bnRyeVBsYWNlc1JlcXVlc3R9IGZyb20gJy4vcmVxdWVzdC9maW5kLWNvdW50cnktcGxhY2VzLXJlcXVlc3QubW9kZWwnO1xuaW1wb3J0IHtGaW5kUGxhY2VzUmVxdWVzdH0gZnJvbSAnLi9yZXF1ZXN0L2ZpbmQtcGxhY2VzLXJlcXVlc3QubW9kZWwnO1xuaW1wb3J0IHtGaW5kQ29sbGVjdGlvblJlcXVlc3R9IGZyb20gJy4vcmVxdWVzdC9maW5kLWNvbGxlY3Rpb24tcmVxdWVzdC5tb2RlbCc7XG5pbXBvcnQge0ZpbmRDb3VudHJpZXNSZXF1ZXN0fSBmcm9tICcuL3JlcXVlc3QvZmluZC1jb3VudHJpZXMtcmVxdWVzdC5tb2RlbCc7XG5pbXBvcnQge0ZpbmRDdXJyZW5jaWVzUmVxdWVzdH0gZnJvbSAnLi9yZXF1ZXN0L2ZpbmQtY3VycmVuY2llcy1yZXF1ZXN0Lm1vZGVsJztcbmltcG9ydCB7RmluZFJlZ2lvbnNSZXF1ZXN0fSBmcm9tICcuL3JlcXVlc3QvZmluZC1yZWdpb25zLXJlcXVlc3QubW9kZWwnO1xuaW1wb3J0IHtGaW5kUmVnaW9uUGxhY2VzUmVxdWVzdH0gZnJvbSAnLi9yZXF1ZXN0L2ZpbmQtcmVnaW9uLXBsYWNlcy1yZXF1ZXN0Lm1vZGVsJztcbmltcG9ydCB7RmluZFBsYWNlc05lYXJQbGFjZVJlcXVlc3R9IGZyb20gJy4vcmVxdWVzdC9maW5kLXBsYWNlcy1uZWFyLXBsYWNlLXJlcXVlc3QubW9kZWwnO1xuaW1wb3J0IHtUaW1lWm9uZX0gZnJvbSAnLi9tb2RlbC90aW1lLXpvbmUubW9kZWwnO1xuaW1wb3J0IHtHZXRQbGFjZURpc3RhbmNlUmVxdWVzdH0gZnJvbSAnLi9yZXF1ZXN0L2dldC1wbGFjZS1kaXN0YW5jZS1yZXF1ZXN0Lm1vZGVsJztcbmltcG9ydCB7RmluZFBsYWNlc05lYXJMb2NhdGlvblJlcXVlc3R9IGZyb20gJy4vcmVxdWVzdC9maW5kLXBsYWNlcy1uZWFyLWxvY2F0aW9uLXJlcXVlc3QubW9kZWwnO1xuaW1wb3J0IHtHZXRQbGFjZURldGFpbHNSZXF1ZXN0fSBmcm9tICcuL3JlcXVlc3QvZ2V0LXBsYWNlLWRldGFpbHMtcmVxdWVzdC5tb2RlbCc7XG5pbXBvcnQge0dldENvdW50cnlEZXRhaWxzUmVxdWVzdH0gZnJvbSAnLi9yZXF1ZXN0L2dldC1jb3VudHJ5LWRldGFpbHMtcmVxdWVzdC5tb2RlbCc7XG5pbXBvcnQge0dldFJlZ2lvbkRldGFpbHNSZXF1ZXN0fSBmcm9tICcuL3JlcXVlc3QvZ2V0LXJlZ2lvbi1kZXRhaWxzLXJlcXVlc3QubW9kZWwnO1xuaW1wb3J0IHtMYW5ndWFnZX0gZnJvbSAnLi9tb2RlbC9sYW5ndWFnZS5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHZW9EYlNlcnZpY2Uge1xuICBwcml2YXRlIGFkbWluRGl2aXNpb25zRW5kcG9pbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBjb3VudHJpZXNFbmRwb2ludDogc3RyaW5nO1xuICBwcml2YXRlIGN1cnJlbmNpZXNFbmRwb2ludDogc3RyaW5nO1xuICBwcml2YXRlIGxhbmd1YWdlc0VuZHBvaW50OiBzdHJpbmc7XG4gIHByaXZhdGUgbG9jYWxlc0VuZHBvaW50OiBzdHJpbmc7XG4gIHByaXZhdGUgcGxhY2VzRW5kcG9pbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0aW1lWm9uZXNFbmRwb2ludDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCwgcHJpdmF0ZSBjb25maWc6IEdlb0RiQ29uZmlnKSB7XG5cbiAgICB0aGlzLmFkbWluRGl2aXNpb25zRW5kcG9pbnQgPSBjb25maWcuc2VydmljZVVyaSArICcvdjEvZ2VvL2FkbWluRGl2aXNpb25zJztcbiAgICB0aGlzLmNvdW50cmllc0VuZHBvaW50ID0gY29uZmlnLnNlcnZpY2VVcmkgKyAnL3YxL2dlby9jb3VudHJpZXMnO1xuICAgIHRoaXMuY3VycmVuY2llc0VuZHBvaW50ID0gY29uZmlnLnNlcnZpY2VVcmkgKyAnL3YxL2xvY2FsZS9jdXJyZW5jaWVzJztcbiAgICB0aGlzLmxhbmd1YWdlc0VuZHBvaW50ID0gY29uZmlnLnNlcnZpY2VVcmkgKyAnL3YxL2xvY2FsZS9sYW5ndWFnZXMnO1xuICAgIHRoaXMubG9jYWxlc0VuZHBvaW50ID0gY29uZmlnLnNlcnZpY2VVcmkgKyAnL3YxL2xvY2FsZS9sb2NhbGVzJztcbiAgICB0aGlzLnBsYWNlc0VuZHBvaW50ID0gY29uZmlnLnNlcnZpY2VVcmkgKyAnL3YxL2dlby9wbGFjZXMnO1xuICAgIHRoaXMudGltZVpvbmVzRW5kcG9pbnQgPSBjb25maWcuc2VydmljZVVyaSArICcvdjEvbG9jYWxlL3RpbWV6b25lcyc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWlsZFBhZ2luZ1BhcmFtcyhyZXF1ZXN0OiBGaW5kQ29sbGVjdGlvblJlcXVlc3QpOiBIdHRwUGFyYW1zIHtcblxuICAgIHJldHVybiBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAuc2V0KCdvZmZzZXQnLCAnJyArIHJlcXVlc3Qub2Zmc2V0KVxuICAgICAgLnNldCgnbGltaXQnLCAnJyArIHJlcXVlc3QubGltaXQpXG4gICAgICAuc2V0KCdoYXRlb2FzTW9kZScsICdmYWxzZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdG9Mb2NhdGlvblN0cmluZyhuZWFyTG9jYXRpb246IE5lYXJMb2NhdGlvblJlcXVlc3QpOiBzdHJpbmcge1xuXG4gICAgbGV0IGxvY2F0aW9uU3RyaW5nID0gJyc7XG5cbiAgICBpZiAobmVhckxvY2F0aW9uLmxhdGl0dWRlID4gMCkge1xuICAgICAgbG9jYXRpb25TdHJpbmcgKz0gJysnO1xuICAgIH1cblxuICAgIGxvY2F0aW9uU3RyaW5nICs9IG5lYXJMb2NhdGlvbi5sYXRpdHVkZTtcblxuICAgIGlmIChuZWFyTG9jYXRpb24ubG9uZ2l0dWRlID4gMCkge1xuICAgICAgbG9jYXRpb25TdHJpbmcgKz0gJysnO1xuICAgIH1cblxuICAgIGxvY2F0aW9uU3RyaW5nICs9IG5lYXJMb2NhdGlvbi5sb25naXR1ZGU7XG5cbiAgICByZXR1cm4gbG9jYXRpb25TdHJpbmc7XG4gIH1cblxuICBmaW5kQWRtaW5EaXZpc2lvbnMocmVxdWVzdDogRmluZEFkbWluRGl2aXNpb25zUmVxdWVzdCk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8UGxhY2VTdW1tYXJ5W10+PiB7XG5cbiAgICBsZXQgcGFyYW1zOiBIdHRwUGFyYW1zID0gR2VvRGJTZXJ2aWNlLmJ1aWxkUGFnaW5nUGFyYW1zKHJlcXVlc3QpO1xuXG4gICAgaWYgKHJlcXVlc3QuY291bnRyeUlkcykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnY291bnRyeUlkcycsIHJlcXVlc3QuY291bnRyeUlkcy5qb2luKCcsJykpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LmV4Y2x1ZGVkQ291bnRyeUlkcykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnZXhjbHVkZWRDb3VudHJ5SWRzJywgcmVxdWVzdC5leGNsdWRlZENvdW50cnlJZHMuam9pbignLCcpKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5uYW1lUHJlZml4KSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCduYW1lUHJlZml4JywgcmVxdWVzdC5uYW1lUHJlZml4KTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5uYW1lUHJlZml4RGVmYXVsdExhbmdSZXN1bHRzKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCduYW1lUHJlZml4RGVmYXVsdExhbmdSZXN1bHRzJywgcmVxdWVzdC5uYW1lUHJlZml4RGVmYXVsdExhbmdSZXN1bHRzKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5taW5Qb3B1bGF0aW9uKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdtaW5Qb3B1bGF0aW9uJywgJycgKyByZXF1ZXN0Lm1pblBvcHVsYXRpb24pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lm1heFBvcHVsYXRpb24pIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ21heFBvcHVsYXRpb24nLCAnJyArIHJlcXVlc3QubWF4UG9wdWxhdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QudGltZVpvbmVJZHMpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3RpbWVab25lSWRzJywgcmVxdWVzdC50aW1lWm9uZUlkcy5qb2luKCcsJykpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LmFzY2lpTW9kZSkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnYXNjaWlNb2RlJywgJycgKyByZXF1ZXN0LmFzY2lpTW9kZSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdsYW5ndWFnZUNvZGUnLCByZXF1ZXN0Lmxhbmd1YWdlQ29kZSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc29ydERpcmVjdGl2ZXMpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3NvcnQnLCByZXF1ZXN0LnNvcnREaXJlY3RpdmVzLmpvaW4oJywnKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QuaW5jbHVkZURlbGV0ZWQpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2luY2x1ZGVEZWxldGVkJywgcmVxdWVzdC5pbmNsdWRlRGVsZXRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8R2VvUmVzcG9uc2U8UGxhY2VTdW1tYXJ5W10+PihcbiAgICAgIHRoaXMuYWRtaW5EaXZpc2lvbnNFbmRwb2ludCxcbiAgICAgIHtcbiAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZmluZENvdW50cmllcyhyZXF1ZXN0OiBGaW5kQ291bnRyaWVzUmVxdWVzdCk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8Q291bnRyeVN1bW1hcnlbXT4+IHtcblxuICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBHZW9EYlNlcnZpY2UuYnVpbGRQYWdpbmdQYXJhbXMocmVxdWVzdCk7XG5cbiAgICBpZiAocmVxdWVzdC5jdXJyZW5jeUNvZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2N1cnJlbmN5Q29kZScsIHJlcXVlc3QuY3VycmVuY3lDb2RlKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5uYW1lUHJlZml4KSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCduYW1lUHJlZml4JywgcmVxdWVzdC5uYW1lUHJlZml4KTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5uYW1lUHJlZml4RGVmYXVsdExhbmdSZXN1bHRzKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCduYW1lUHJlZml4RGVmYXVsdExhbmdSZXN1bHRzJywgcmVxdWVzdC5uYW1lUHJlZml4RGVmYXVsdExhbmdSZXN1bHRzKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5hc2NpaU1vZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2FzY2lpTW9kZScsICcnICsgcmVxdWVzdC5hc2NpaU1vZGUpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lmxhbmd1YWdlQ29kZSkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbGFuZ3VhZ2VDb2RlJywgcmVxdWVzdC5sYW5ndWFnZUNvZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEdlb1Jlc3BvbnNlPENvdW50cnlTdW1tYXJ5W10+PihcbiAgICAgIHRoaXMuY291bnRyaWVzRW5kcG9pbnQsXG4gICAgICB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGZpbmRDb3VudHJ5UGxhY2VzKHJlcXVlc3Q6IEZpbmRDb3VudHJ5UGxhY2VzUmVxdWVzdCk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8UGxhY2VTdW1tYXJ5W10+PiB7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYnVpbGRDb3VudHJ5RW5kcG9pbnQocmVxdWVzdC5jb3VudHJ5SWQpICsgJy9wbGFjZXMnO1xuXG4gICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IEdlb0RiU2VydmljZS5idWlsZFBhZ2luZ1BhcmFtcyhyZXF1ZXN0KTtcblxuICAgIGlmIChyZXF1ZXN0Lm5hbWVQcmVmaXgpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ25hbWVQcmVmaXgnLCByZXF1ZXN0Lm5hbWVQcmVmaXgpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lm5hbWVQcmVmaXhEZWZhdWx0TGFuZ1Jlc3VsdHMpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ25hbWVQcmVmaXhEZWZhdWx0TGFuZ1Jlc3VsdHMnLCByZXF1ZXN0Lm5hbWVQcmVmaXhEZWZhdWx0TGFuZ1Jlc3VsdHMpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lm1pblBvcHVsYXRpb24pIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ21pblBvcHVsYXRpb24nLCAnJyArIHJlcXVlc3QubWluUG9wdWxhdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWF4UG9wdWxhdGlvbikge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbWF4UG9wdWxhdGlvbicsICcnICsgcmVxdWVzdC5tYXhQb3B1bGF0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC50eXBlcykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgndHlwZXMnLCByZXF1ZXN0LnR5cGVzLmpvaW4oJywnKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QuYXNjaWlNb2RlKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdhc2NpaU1vZGUnLCAnJyArIHJlcXVlc3QuYXNjaWlNb2RlKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2xhbmd1YWdlQ29kZScsIHJlcXVlc3QubGFuZ3VhZ2VDb2RlKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5zb3J0RGlyZWN0aXZlcykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc29ydCcsIHJlcXVlc3Quc29ydERpcmVjdGl2ZXMuam9pbignLCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxHZW9SZXNwb25zZTxQbGFjZVN1bW1hcnlbXT4+KFxuICAgICAgZW5kcG9pbnQsXG4gICAgICB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGZpbmRDb3VudHJ5KHJlcXVlc3Q6IEdldENvdW50cnlEZXRhaWxzUmVxdWVzdCk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8Q291bnRyeURldGFpbHM+PiB7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuY291bnRyaWVzRW5kcG9pbnQgKyAnLycgKyByZXF1ZXN0LmNvdW50cnlJZDtcblxuICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuXG4gICAgaWYgKHJlcXVlc3QuYXNjaWlNb2RlKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdhc2NpaU1vZGUnLCAnJyArIHJlcXVlc3QuYXNjaWlNb2RlKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2xhbmd1YWdlQ29kZScsIHJlcXVlc3QubGFuZ3VhZ2VDb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxHZW9SZXNwb25zZTxDb3VudHJ5RGV0YWlscz4+KFxuICAgICAgZW5kcG9pbnQsXG4gICAgICB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICB9KTtcbiAgfVxuXG4gIGZpbmRDdXJyZW5jaWVzKHJlcXVlc3Q6IEZpbmRDdXJyZW5jaWVzUmVxdWVzdCk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8Q3VycmVuY3lbXT4+IHtcblxuICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBHZW9EYlNlcnZpY2UuYnVpbGRQYWdpbmdQYXJhbXMocmVxdWVzdCk7XG5cbiAgICBpZiAocmVxdWVzdC5jb3VudHJ5SWQpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NvdW50cnlJZCcsIHJlcXVlc3QuY291bnRyeUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxHZW9SZXNwb25zZTxDdXJyZW5jeVtdPj4oXG4gICAgICB0aGlzLmN1cnJlbmNpZXNFbmRwb2ludCxcbiAgICAgIHtcbiAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZmluZExhbmd1YWdlcyhyZXF1ZXN0OiBGaW5kQ29sbGVjdGlvblJlcXVlc3QpOiBPYnNlcnZhYmxlPEdlb1Jlc3BvbnNlPExhbmd1YWdlW10+PiB7XG5cbiAgICBjb25zdCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBHZW9EYlNlcnZpY2UuYnVpbGRQYWdpbmdQYXJhbXMocmVxdWVzdCk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxHZW9SZXNwb25zZTxMYW5ndWFnZVtdPj4oXG4gICAgICB0aGlzLmxhbmd1YWdlc0VuZHBvaW50LFxuICAgICAge1xuICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBmaW5kTG9jYWxlcyhyZXF1ZXN0OiBGaW5kQ29sbGVjdGlvblJlcXVlc3QpOiBPYnNlcnZhYmxlPEdlb1Jlc3BvbnNlPExvY2FsZVtdPj4ge1xuXG4gICAgY29uc3QgcGFyYW1zOiBIdHRwUGFyYW1zID0gR2VvRGJTZXJ2aWNlLmJ1aWxkUGFnaW5nUGFyYW1zKHJlcXVlc3QpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8R2VvUmVzcG9uc2U8TG9jYWxlW10+PihcbiAgICAgIHRoaXMubG9jYWxlc0VuZHBvaW50LFxuICAgICAge1xuICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuXG4gIGZpbmRQbGFjZXMocmVxdWVzdDogRmluZFBsYWNlc1JlcXVlc3QpOiBPYnNlcnZhYmxlPEdlb1Jlc3BvbnNlPFBsYWNlU3VtbWFyeVtdPj4ge1xuXG4gICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IEdlb0RiU2VydmljZS5idWlsZFBhZ2luZ1BhcmFtcyhyZXF1ZXN0KTtcblxuICAgIGlmIChyZXF1ZXN0LmNvdW50cnlJZHMpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NvdW50cnlJZHMnLCByZXF1ZXN0LmNvdW50cnlJZHMuam9pbignLCcpKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5leGNsdWRlZENvdW50cnlJZHMpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2V4Y2x1ZGVkQ291bnRyeUlkcycsIHJlcXVlc3QuZXhjbHVkZWRDb3VudHJ5SWRzLmpvaW4oJywnKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubmFtZVByZWZpeCkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbmFtZVByZWZpeCcsIHJlcXVlc3QubmFtZVByZWZpeCk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cycsIHJlcXVlc3QubmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWluUG9wdWxhdGlvbikge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbWluUG9wdWxhdGlvbicsICcnICsgcmVxdWVzdC5taW5Qb3B1bGF0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5tYXhQb3B1bGF0aW9uKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdtYXhQb3B1bGF0aW9uJywgJycgKyByZXF1ZXN0Lm1heFBvcHVsYXRpb24pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LnRpbWVab25lSWRzKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCd0aW1lWm9uZUlkcycsIHJlcXVlc3QudGltZVpvbmVJZHMuam9pbignLCcpKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC50eXBlcykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgndHlwZXMnLCByZXF1ZXN0LnR5cGVzLmpvaW4oJywnKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QuYXNjaWlNb2RlKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdhc2NpaU1vZGUnLCAnJyArIHJlcXVlc3QuYXNjaWlNb2RlKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2xhbmd1YWdlQ29kZScsIHJlcXVlc3QubGFuZ3VhZ2VDb2RlKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5zb3J0RGlyZWN0aXZlcykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc29ydCcsIHJlcXVlc3Quc29ydERpcmVjdGl2ZXMuam9pbignLCcpKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5pbmNsdWRlRGVsZXRlZCkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnaW5jbHVkZURlbGV0ZWQnLCByZXF1ZXN0LmluY2x1ZGVEZWxldGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxHZW9SZXNwb25zZTxQbGFjZVN1bW1hcnlbXT4+KFxuICAgICAgdGhpcy5wbGFjZXNFbmRwb2ludCxcbiAgICAgIHtcbiAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZmluZFBsYWNlc05lYXJMb2NhdGlvbihyZXF1ZXN0OiBGaW5kUGxhY2VzTmVhckxvY2F0aW9uUmVxdWVzdCk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8UGxhY2VTdW1tYXJ5W10+PiB7XG5cbiAgICBsZXQgcGFyYW1zOiBIdHRwUGFyYW1zID0gR2VvRGJTZXJ2aWNlLmJ1aWxkUGFnaW5nUGFyYW1zKHJlcXVlc3QpO1xuXG4gICAgcGFyYW1zID0gcGFyYW1zXG4gICAgICAuc2V0KCdyYWRpdXMnLCAnJyArIHJlcXVlc3QubG9jYXRpb24ucmFkaXVzKVxuICAgICAgLnNldCgnZGlzdGFuY2VVbml0JywgcmVxdWVzdC5sb2NhdGlvbi5kaXN0YW5jZVVuaXQpO1xuXG4gICAgaWYgKHJlcXVlc3QubmFtZVByZWZpeCkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbmFtZVByZWZpeCcsIHJlcXVlc3QubmFtZVByZWZpeCk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cycsIHJlcXVlc3QubmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWluUG9wdWxhdGlvbikge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbWluUG9wdWxhdGlvbicsICcnICsgcmVxdWVzdC5taW5Qb3B1bGF0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5tYXhQb3B1bGF0aW9uKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdtYXhQb3B1bGF0aW9uJywgJycgKyByZXF1ZXN0Lm1heFBvcHVsYXRpb24pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LnR5cGVzKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCd0eXBlcycsIHJlcXVlc3QudHlwZXMuam9pbignLCcpKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5hc2NpaU1vZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2FzY2lpTW9kZScsICcnICsgcmVxdWVzdC5hc2NpaU1vZGUpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lmxhbmd1YWdlQ29kZSkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbGFuZ3VhZ2VDb2RlJywgcmVxdWVzdC5sYW5ndWFnZUNvZGUpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LnNvcnREaXJlY3RpdmVzKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdzb3J0JywgcmVxdWVzdC5zb3J0RGlyZWN0aXZlcy5qb2luKCcsJykpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LmluY2x1ZGVEZWxldGVkKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdpbmNsdWRlRGVsZXRlZCcsIHJlcXVlc3QuaW5jbHVkZURlbGV0ZWQpO1xuICAgIH1cblxuICAgIC8vIFdvcmthcm91bmQgZm9yIEh0dHBDbGllbnQgJysnIGVuY29kaW5nIGJ1Zy5cbiAgICBjb25zdCBsb2NhdGlvbklkID0gR2VvRGJTZXJ2aWNlXG4gICAgICAudG9Mb2NhdGlvblN0cmluZyhyZXF1ZXN0LmxvY2F0aW9uKVxuICAgICAgLnJlcGxhY2UoL1xcKy9nLCAnJTJCJyk7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMucGxhY2VzRW5kcG9pbnQgKyAnP2xvY2F0aW9uPScgKyBsb2NhdGlvbklkO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8R2VvUmVzcG9uc2U8UGxhY2VTdW1tYXJ5W10+PihcbiAgICAgIGVuZHBvaW50LFxuICAgICAge1xuICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBmaW5kUGxhY2VzTmVhclBsYWNlKHJlcXVlc3Q6IEZpbmRQbGFjZXNOZWFyUGxhY2VSZXF1ZXN0KTogT2JzZXJ2YWJsZTxHZW9SZXNwb25zZTxQbGFjZVN1bW1hcnlbXT4+IHtcblxuICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBHZW9EYlNlcnZpY2UuYnVpbGRQYWdpbmdQYXJhbXMocmVxdWVzdCk7XG5cbiAgICBwYXJhbXMgPSBwYXJhbXNcbiAgICAgIC5zZXQoJ3JhZGl1cycsICcnICsgcmVxdWVzdC5yYWRpdXMpXG4gICAgICAuc2V0KCdkaXN0YW5jZVVuaXQnLCByZXF1ZXN0LmRpc3RhbmNlVW5pdCk7XG5cbiAgICBpZiAocmVxdWVzdC5uYW1lUHJlZml4KSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCduYW1lUHJlZml4JywgcmVxdWVzdC5uYW1lUHJlZml4KTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5uYW1lUHJlZml4RGVmYXVsdExhbmdSZXN1bHRzKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCduYW1lUHJlZml4RGVmYXVsdExhbmdSZXN1bHRzJywgcmVxdWVzdC5uYW1lUHJlZml4RGVmYXVsdExhbmdSZXN1bHRzKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5taW5Qb3B1bGF0aW9uKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdtaW5Qb3B1bGF0aW9uJywgJycgKyByZXF1ZXN0Lm1pblBvcHVsYXRpb24pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lm1heFBvcHVsYXRpb24pIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ21heFBvcHVsYXRpb24nLCAnJyArIHJlcXVlc3QubWF4UG9wdWxhdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QudHlwZXMpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3R5cGVzJywgcmVxdWVzdC50eXBlcy5qb2luKCcsJykpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LmFzY2lpTW9kZSkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnYXNjaWlNb2RlJywgJycgKyByZXF1ZXN0LmFzY2lpTW9kZSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdsYW5ndWFnZUNvZGUnLCByZXF1ZXN0Lmxhbmd1YWdlQ29kZSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc29ydERpcmVjdGl2ZXMpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3NvcnQnLCByZXF1ZXN0LnNvcnREaXJlY3RpdmVzLmpvaW4oJywnKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QuaW5jbHVkZURlbGV0ZWQpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2luY2x1ZGVEZWxldGVkJywgcmVxdWVzdC5pbmNsdWRlRGVsZXRlZCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLnBsYWNlc0VuZHBvaW50ICsgJy8nICsgcmVxdWVzdC5wbGFjZUlkICsgJy9uZWFyYnlQbGFjZXMnO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8R2VvUmVzcG9uc2U8UGxhY2VTdW1tYXJ5W10+PihcbiAgICAgIGVuZHBvaW50LFxuICAgICAge1xuICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBmaW5kUmVnaW9uKHJlcXVlc3Q6IEdldFJlZ2lvbkRldGFpbHNSZXF1ZXN0KTogT2JzZXJ2YWJsZTxHZW9SZXNwb25zZTxSZWdpb25EZXRhaWxzPj4ge1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmJ1aWxkUmVnaW9uc0VuZHBvaW50KHJlcXVlc3QuY291bnRyeUlkKSArICcvJyArIHJlcXVlc3QucmVnaW9uQ29kZTtcblxuICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuXG4gICAgaWYgKHJlcXVlc3QuYXNjaWlNb2RlKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdhc2NpaU1vZGUnLCAnJyArIHJlcXVlc3QuYXNjaWlNb2RlKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2xhbmd1YWdlQ29kZScsIHJlcXVlc3QubGFuZ3VhZ2VDb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxHZW9SZXNwb25zZTxSZWdpb25EZXRhaWxzPj4oXG4gICAgICBlbmRwb2ludCxcbiAgICAgIHtcbiAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgIH0pO1xuICB9XG5cbiAgZmluZFJlZ2lvblBsYWNlcyhyZXF1ZXN0OiBGaW5kUmVnaW9uUGxhY2VzUmVxdWVzdCk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8UGxhY2VTdW1tYXJ5W10+PiB7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYnVpbGRSZWdpb25FbmRwb2ludChyZXF1ZXN0LmNvdW50cnlJZCwgcmVxdWVzdC5yZWdpb25JZCkgKyAnL3BsYWNlcyc7XG5cbiAgICBsZXQgcGFyYW1zOiBIdHRwUGFyYW1zID0gR2VvRGJTZXJ2aWNlLmJ1aWxkUGFnaW5nUGFyYW1zKHJlcXVlc3QpO1xuXG4gICAgaWYgKHJlcXVlc3QubmFtZVByZWZpeCkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbmFtZVByZWZpeCcsIHJlcXVlc3QubmFtZVByZWZpeCk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cycsIHJlcXVlc3QubmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWluUG9wdWxhdGlvbikge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbWluUG9wdWxhdGlvbicsICcnICsgcmVxdWVzdC5taW5Qb3B1bGF0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5tYXhQb3B1bGF0aW9uKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdtYXhQb3B1bGF0aW9uJywgJycgKyByZXF1ZXN0Lm1heFBvcHVsYXRpb24pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LnR5cGVzKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCd0eXBlcycsIHJlcXVlc3QudHlwZXMuam9pbignLCcpKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5hc2NpaU1vZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2FzY2lpTW9kZScsICcnICsgcmVxdWVzdC5hc2NpaU1vZGUpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lmxhbmd1YWdlQ29kZSkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbGFuZ3VhZ2VDb2RlJywgcmVxdWVzdC5sYW5ndWFnZUNvZGUpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LnNvcnREaXJlY3RpdmVzKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdzb3J0JywgcmVxdWVzdC5zb3J0RGlyZWN0aXZlcy5qb2luKCcsJykpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEdlb1Jlc3BvbnNlPFBsYWNlU3VtbWFyeVtdPj4oXG4gICAgICBlbmRwb2ludCxcbiAgICAgIHtcbiAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZmluZFJlZ2lvbnMocmVxdWVzdDogRmluZFJlZ2lvbnNSZXF1ZXN0KTogT2JzZXJ2YWJsZTxHZW9SZXNwb25zZTxSZWdpb25TdW1tYXJ5W10+PiB7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYnVpbGRSZWdpb25zRW5kcG9pbnQocmVxdWVzdC5jb3VudHJ5SWQpO1xuXG4gICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IEdlb0RiU2VydmljZS5idWlsZFBhZ2luZ1BhcmFtcyhyZXF1ZXN0KTtcblxuICAgIGlmIChyZXF1ZXN0Lm5hbWVQcmVmaXgpIHtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbmFtZVByZWZpeCcsIHJlcXVlc3QubmFtZVByZWZpeCk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cycsIHJlcXVlc3QubmFtZVByZWZpeERlZmF1bHRMYW5nUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QuYXNjaWlNb2RlKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdhc2NpaU1vZGUnLCAnJyArIHJlcXVlc3QuYXNjaWlNb2RlKTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2xhbmd1YWdlQ29kZScsIHJlcXVlc3QubGFuZ3VhZ2VDb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxHZW9SZXNwb25zZTxSZWdpb25TdW1tYXJ5W10+PihcbiAgICAgIGVuZHBvaW50LFxuICAgICAge1xuICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBmaW5kVGltZVpvbmVzKHJlcXVlc3Q6IEZpbmRDb2xsZWN0aW9uUmVxdWVzdCk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8VGltZVpvbmVbXT4+IHtcblxuICAgIGNvbnN0IHBhcmFtczogSHR0cFBhcmFtcyA9IEdlb0RiU2VydmljZS5idWlsZFBhZ2luZ1BhcmFtcyhyZXF1ZXN0KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEdlb1Jlc3BvbnNlPFRpbWVab25lW10+PihcbiAgICAgIHRoaXMudGltZVpvbmVzRW5kcG9pbnQsXG4gICAgICB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGdldCBhcGlLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXBpS2V5O1xuICB9XG5cbiAgc2V0QXBpS2V5KGFwaUtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5jb25maWcuYXBpS2V5ID0gYXBpS2V5O1xuICB9XG5cbiAgZ2V0UGxhY2UocmVxdWVzdDogR2V0UGxhY2VEZXRhaWxzUmVxdWVzdCk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8UGxhY2VEZXRhaWxzPj4ge1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmJ1aWxkUGxhY2VFbmRwb2ludChyZXF1ZXN0LnBsYWNlSWQpO1xuXG4gICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG5cbiAgICBpZiAocmVxdWVzdC5hc2NpaU1vZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2FzY2lpTW9kZScsICcnICsgcmVxdWVzdC5hc2NpaU1vZGUpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lmxhbmd1YWdlQ29kZSkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbGFuZ3VhZ2VDb2RlJywgcmVxdWVzdC5sYW5ndWFnZUNvZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEdlb1Jlc3BvbnNlPFBsYWNlRGV0YWlscz4+KFxuICAgICAgZW5kcG9pbnQsXG4gICAgICB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGdldFBsYWNlQWRtaW5SZWdpb24ocmVxdWVzdDogR2V0UGxhY2VEZXRhaWxzUmVxdWVzdCk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8UGxhY2VEZXRhaWxzPj4ge1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmJ1aWxkUGxhY2VFbmRwb2ludChyZXF1ZXN0LnBsYWNlSWQpICsgJy9sb2NhdGVkSW4nO1xuXG4gICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG5cbiAgICBpZiAocmVxdWVzdC5hc2NpaU1vZGUpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2FzY2lpTW9kZScsICcnICsgcmVxdWVzdC5hc2NpaU1vZGUpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lmxhbmd1YWdlQ29kZSkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbGFuZ3VhZ2VDb2RlJywgcmVxdWVzdC5sYW5ndWFnZUNvZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEdlb1Jlc3BvbnNlPFBsYWNlRGV0YWlscz4+KFxuICAgICAgZW5kcG9pbnQsXG4gICAgICB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGdldFBsYWNlRGF0ZVRpbWUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8c3RyaW5nPj4ge1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmJ1aWxkUGxhY2VFbmRwb2ludChpZCkgKyAnL2RhdGVUaW1lJztcblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEdlb1Jlc3BvbnNlPHN0cmluZz4+KGVuZHBvaW50KTtcbiAgfVxuXG4gIGdldFBsYWNlRGlzdGFuY2UocmVxdWVzdDogR2V0UGxhY2VEaXN0YW5jZVJlcXVlc3QpOiBPYnNlcnZhYmxlPEdlb1Jlc3BvbnNlPG51bWJlcj4+IHtcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5idWlsZFBsYWNlRW5kcG9pbnQocmVxdWVzdC5mcm9tUGxhY2VJZCkgKyAnL2Rpc3RhbmNlJztcblxuICAgIGNvbnN0IHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcbiAgICAgIC5zZXQoJ3RvUGxhY2VJZCcsICcnICsgcmVxdWVzdC50b1BsYWNlSWQpXG4gICAgICAuc2V0KCdkaXN0YW5jZVVuaXQnLCAnJyArIHJlcXVlc3QuZGlzdGFuY2VVbml0KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEdlb1Jlc3BvbnNlPG51bWJlcj4+KFxuICAgICAgZW5kcG9pbnQsXG4gICAgICB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGdldFBsYWNlVGltZShwbGFjZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEdlb1Jlc3BvbnNlPHN0cmluZz4+IHtcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5idWlsZFBsYWNlRW5kcG9pbnQocGxhY2VJZCkgKyAnL3RpbWUnO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8R2VvUmVzcG9uc2U8c3RyaW5nPj4oZW5kcG9pbnQpO1xuICB9XG5cbiAgZ2V0VGltZVpvbmVEYXRlVGltZSh6b25lSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8R2VvUmVzcG9uc2U8c3RyaW5nPj4ge1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmJ1aWxkVGltZVpvbmVFbmRwb2ludCh6b25lSWQpICsgJy9kYXRlVGltZSc7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxHZW9SZXNwb25zZTxzdHJpbmc+PihlbmRwb2ludCk7XG4gIH1cblxuICBnZXRUaW1lWm9uZVRpbWUoem9uZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEdlb1Jlc3BvbnNlPHN0cmluZz4+IHtcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5idWlsZFRpbWVab25lRW5kcG9pbnQoem9uZUlkKSArICcvdGltZSc7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxHZW9SZXNwb25zZTxzdHJpbmc+PihlbmRwb2ludCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ291bnRyeUVuZHBvaW50KGNvdW50cnlJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudHJpZXNFbmRwb2ludCArICcvJyArIGNvdW50cnlJZDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRQbGFjZUVuZHBvaW50KG9sYWNlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGxhY2VzRW5kcG9pbnQgKyAnLycgKyBvbGFjZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlZ2lvbkVuZHBvaW50KGNvdW50cnlJZDogc3RyaW5nLCByZWdpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFJlZ2lvbnNFbmRwb2ludChjb3VudHJ5SWQpICsgJy8nICsgcmVnaW9uSWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUmVnaW9uc0VuZHBvaW50KGNvdW50cnlJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZENvdW50cnlFbmRwb2ludChjb3VudHJ5SWQpICsgJy9yZWdpb25zJztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRUaW1lWm9uZUVuZHBvaW50KHpvbmVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50aW1lWm9uZXNFbmRwb2ludCArICcvJyArIHpvbmVJZDtcbiAgfVxufVxuIl19