UNPKG

kwikid-agent-dashboard

Version:

KwikID's EKYC Agent Map View Module.

207 lines 29.2 kB
import { __awaiter } from "tslib"; import { Injectable, ViewChildren } from "@angular/core"; import { checkObjectPathExists, getObjectValueFromPath, isNotEmptyArray } from "kwikid-toolkit"; import { map } from "rxjs/operators"; import { addressConcator, nearestNeighborAlgorithm } from "../helpers/maps.helpers"; import * as i0 from "@angular/core"; import * as i1 from "./agent.service"; import * as i2 from "@angular/google-maps"; import * as i3 from "@angular/common/http"; export class GoogleMapsService { constructor(agentService, mapDirectionsService, httpClient) { this.agentService = agentService; this.mapDirectionsService = mapDirectionsService; this.httpClient = httpClient; this.allMarkers = []; } // To get Current Position getPosition() { return new Promise((resolve, reject) => { navigator.geolocation.watchPosition((resp) => { resolve({ lng: resp.coords.longitude, lat: resp.coords.latitude }); }, (err) => { reject(err); }); }); } // To Initialize Google Maps initializeMap() { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { this.myPosition = yield this.getPosition(); this.map = { zoom: 10, center: this.myPosition, streetViewControl: false, mapTypeControl: false, fullscreenControl: false, zoomControl: false }; resolve(true); })); }); } // To extract Location from the Task Details getLocation(task) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; let encodedAddres; // If Fetch Address from Multiple Paths if (checkObjectPathExists(this.agentService.config, "extendedFlags.taskLocationPaths")) { // Get address string from multiple paths const config = this.agentService.config.extendedFlags.taskLocationPaths; const address = addressConcator(task, config); // Encode the Address in URI encodedAddres = encodeURI(address); } // If Fetch Address from Single Path else if (checkObjectPathExists(this.agentService.config, "extendedFlags.taskLocationPath")) { // Get Address from Single Path const config = this.agentService.config.extendedFlags.taskLocationPath; const address = getObjectValueFromPath(task, config); // Encode the Address in URI encodedAddres = encodeURI(address); } // Default Address Paths Avaiable else { const address = (_k = (_j = (_g = (_d = (_c = (_b = (_a = task === null || task === void 0 ? void 0 : task.extras) === null || _a === void 0 ? void 0 : _a.task_details) === null || _b === void 0 ? void 0 : _b.customer_details) === null || _c === void 0 ? void 0 : _c.address) !== null && _d !== void 0 ? _d : (_f = (_e = task === null || task === void 0 ? void 0 : task.task_details) === null || _e === void 0 ? void 0 : _e.customer_details) === null || _f === void 0 ? void 0 : _f.address) !== null && _g !== void 0 ? _g : (_h = task === null || task === void 0 ? void 0 : task.extras) === null || _h === void 0 ? void 0 : _h.address) !== null && _j !== void 0 ? _j : task === null || task === void 0 ? void 0 : task.address) !== null && _k !== void 0 ? _k : ""; // Encode the Address in URI encodedAddres = encodeURI(address); } // URL to geocode Address String to Latitude & Longitude const url = `https://maps.googleapis.com/maps/api/geocode/json?key=${this.apiKey}&address=${encodedAddres}`; const response = yield fetch(url); const data = yield response.json(); // Set Location {lat: LAT, lng: LNG} from address geocoded const isValidLocation = isNotEmptyArray(data === null || data === void 0 ? void 0 : data.results); const location = isValidLocation ? (_m = (_l = data === null || data === void 0 ? void 0 : data.results[0]) === null || _l === void 0 ? void 0 : _l.geometry) === null || _m === void 0 ? void 0 : _m.location : { lat: null, lng: null }; // Set Location validation & Google Maps URL location.isValidLocation = isValidLocation; location.googleMapsUrl = `https://www.google.com/maps/place/${location === null || location === void 0 ? void 0 : location.lat},${location === null || location === void 0 ? void 0 : location.lng}`; resolve(location); })); }); } // Get Tasks | Markers Location Co Ordinates getMarkersLocation(myMarker, tasks) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { const markers = []; markers.push(myMarker); const promises = tasks.map((task) => __awaiter(this, void 0, void 0, function* () { const marker = yield this.getLocation(task); task = Object.assign(Object.assign({}, task), marker); markers.push(task); })); yield Promise.all(promises); resolve(markers); })); }); } // Plot All Markers plotAllMarkers(tasks) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { const path = []; const promises = tasks.map((task) => { if (task === null || task === void 0 ? void 0 : task.isValidLocation) { path.push({ location: task, stopover: true }); this.allMarkers.push(task); } }); yield Promise.all(promises); resolve(path); })); }); } // To Plot Directions for All Tasks plotDirectionsForAllTasks(tasks) { return __awaiter(this, void 0, void 0, function* () { if (!this.map || !this.myPosition) { return tasks; } this.allMarkers = []; // Create Agent Marker & Plot It. const myMarker = { lat: this.myPosition.lat, lng: this.myPosition.lng, title: 0, color: "red" }; // Get All Markers Location Co Ordinates const markers = yield this.getMarkersLocation(myMarker, tasks); // Run Algorithm to get optimized Routes const startingPoint = markers[0]; const unvisitedWaypoints = markers.slice(1); const optimizedRoute = nearestNeighborAlgorithm(startingPoint, unvisitedWaypoints); // Sort All Tasks as per optimized routes tasks = optimizedRoute.slice(1); this.allMarkers = [myMarker]; // Plot all markers & get path for directions const path = yield this.plotAllMarkers(tasks); // Set Directions in Google Maps const request = { origin: this.myPosition, destination: this.myPosition, waypoints: path, travelMode: google.maps.TravelMode.DRIVING }; this.directionsRenderOption = { suppressMarkers: true }; this.directionsResults$ = this.mapDirectionsService .route(request) .pipe(map((response) => response.result)); this.directionsResults$.subscribe((val) => { }); this.allDirectionsResults$ = this.directionsResults$; return tasks; }); } // To Plot Directions for Selected Tasks plotDirectionsForSelectedTask(task) { if (task != null) { const taskMarker = task; // If Location is Available in Task Details if (taskMarker === null || taskMarker === void 0 ? void 0 : taskMarker.isValidLocation) { const request = { origin: this.myPosition, destination: taskMarker, optimizeWaypoints: true, travelMode: google.maps.TravelMode.DRIVING }; this.directionsResults$ = this.mapDirectionsService .route(request) .pipe(map((response) => response.result)); this.directionsResults$.subscribe(); } else { alert("No Location Available"); this.directionsResults$ = this.allDirectionsResults$; } } else { this.directionsResults$ = this.allDirectionsResults$; } } } /** @nocollapse */ GoogleMapsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: GoogleMapsService, deps: [{ token: i1.AgentService }, { token: i2.MapDirectionsService }, { token: i3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ GoogleMapsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: GoogleMapsService, providedIn: "root" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: GoogleMapsService, decorators: [{ type: Injectable, args: [{ providedIn: "root" }] }], ctorParameters: function () { return [{ type: i1.AgentService }, { type: i2.MapDirectionsService }, { type: i3.HttpClient }]; }, propDecorators: { directionsRenders: [{ type: ViewChildren, args: ["directionsRender"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1hZ2VudC1kYXNoYm9hcmQvc3JjL2xpYi92MS9zZXJ2aWNlcy9nb29nbGUtbWFwcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFhLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEIsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFDTCxlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3pCLE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBS2pDLE1BQU0sT0FBTyxpQkFBaUI7SUFtQjVCLFlBQ1UsWUFBMEIsRUFDM0Isb0JBQTBDLEVBQzFDLFVBQXNCO1FBRnJCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzNCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWYvQixlQUFVLEdBQVEsRUFBRSxDQUFDO0lBZ0JsQixDQUFDO0lBRUosMEJBQTBCO0lBQzFCLFdBQVc7UUFDVCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUNqQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNQLE9BQU8sQ0FBQztvQkFDTixHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUMxQixHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2lCQUMxQixDQUFDLENBQUM7WUFDTCxDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDTixNQUFN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b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COytKQWdCbUMsaUJBQWlCO3NCQUFsRCxZQUFZO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIGNoZWNrT2JqZWN0UGF0aEV4aXN0cyxcbiAgZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aCxcbiAgaXNOb3RFbXB0eUFycmF5XG59IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuXG5pbXBvcnQgeyBNYXBEaXJlY3Rpb25zU2VydmljZSB9IGZyb20gXCJAYW5ndWxhci9nb29nbGUtbWFwc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBBZ2VudFNlcnZpY2UgfSBmcm9tIFwiLi9hZ2VudC5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBhZGRyZXNzQ29uY2F0b3IsXG4gIG5lYXJlc3ROZWlnaGJvckFsZ29yaXRobVxufSBmcm9tIFwiLi4vaGVscGVycy9tYXBzLmhlbHBlcnNcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBHb29nbGVNYXBzU2VydmljZSB7XG4gIG15UG9zaXRpb247XG5cbiAgbWFwOiBhbnk7XG5cbiAgYXBpS2V5OiBhbnk7XG5cbiAgYWxsTWFya2VyczogYW55ID0gW107XG5cbiAgZGlyZWN0aW9uc1JlbmRlck9wdGlvbjogYW55O1xuXG4gIGRpcmVjdGlvbnNSZXN1bHRzJDogYW55O1xuXG4gIGFsbERpcmVjdGlvbnNSZXN1bHRzJDogYW55O1xuXG4gIEBWaWV3Q2hpbGRyZW4oXCJkaXJlY3Rpb25zUmVuZGVyXCIpIGRpcmVjdGlvbnNSZW5kZXJzOiBRdWVyeUxpc3Q8XG4gICAgRWxlbWVudFJlZjxnb29nbGUubWFwcy5EaXJlY3Rpb25zUmVuZGVyZXI+XG4gID47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhZ2VudFNlcnZpY2U6IEFnZW50U2VydmljZSxcbiAgICBwdWJsaWMgbWFwRGlyZWN0aW9uc1NlcnZpY2U6IE1hcERpcmVjdGlvbnNTZXJ2aWNlLFxuICAgIHB1YmxpYyBodHRwQ2xpZW50OiBIdHRwQ2xpZW50XG4gICkge31cblxuICAvLyBUbyBnZXQgQ3VycmVudCBQb3NpdGlvblxuICBnZXRQb3NpdGlvbigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihcbiAgICAgICAgKHJlc3ApID0+IHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIGxuZzogcmVzcC5jb29yZHMubG9uZ2l0dWRlLFxuICAgICAgICAgICAgbGF0OiByZXNwLmNvb3Jkcy5sYXRpdHVkZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBUbyBJbml0aWFsaXplIEdvb2dsZSBNYXBzXG4gIGFzeW5jIGluaXRpYWxpemVNYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMubXlQb3NpdGlvbiA9IGF3YWl0IHRoaXMuZ2V0UG9zaXRpb24oKTtcbiAgICAgIHRoaXMubWFwID0ge1xuICAgICAgICB6b29tOiAxMCxcbiAgICAgICAgY2VudGVyOiB0aGlzLm15UG9zaXRpb24sXG4gICAgICAgIHN0cmVldFZpZXdDb250cm9sOiBmYWxzZSxcbiAgICAgICAgbWFwVHlwZUNvbnRyb2w6IGZhbHNlLFxuICAgICAgICBmdWxsc2NyZWVuQ29udHJvbDogZmFsc2UsXG4gICAgICAgIHpvb21Db250cm9sOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBUbyBleHRyYWN0IExvY2F0aW9uIGZyb20gdGhlIFRhc2sgRGV0YWlsc1xuICBhc3luYyBnZXRMb2NhdGlvbih0YXNrKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBlbmNvZGVkQWRkcmVzO1xuXG4gICAgICAvLyBJZiBGZXRjaCBBZGRyZXNzIGZyb20gTXVsdGlwbGUgUGF0aHNcbiAgICAgIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKFxuICAgICAgICAgIHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZyxcbiAgICAgICAgICBcImV4dGVuZGVkRmxhZ3MudGFza0xvY2F0aW9uUGF0aHNcIlxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgLy8gR2V0IGFkZHJlc3Mgc3RyaW5nIGZyb20gbXVsdGlwbGUgcGF0aHNcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5hZ2VudFNlcnZpY2UuY29uZmlnLmV4dGVuZGVkRmxhZ3MudGFza0xvY2F0aW9uUGF0aHM7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBhZGRyZXNzQ29uY2F0b3IodGFzaywgY29uZmlnKTtcblxuICAgICAgICAvLyBFbmNvZGUgdGhlIEFkZHJlc3MgaW4gVVJJXG4gICAgICAgIGVuY29kZWRBZGRyZXMgPSBlbmNvZGVVUkkoYWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIEZldGNoIEFkZHJlc3MgZnJvbSBTaW5nbGUgUGF0aFxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0UGF0aEV4aXN0cyhcbiAgICAgICAgICB0aGlzLmFnZW50U2VydmljZS5jb25maWcsXG4gICAgICAgICAgXCJleHRlbmRlZEZsYWdzLnRhc2tMb2NhdGlvblBhdGhcIlxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgLy8gR2V0IEFkZHJlc3MgZnJvbSBTaW5nbGUgUGF0aFxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmFnZW50U2VydmljZS5jb25maWcuZXh0ZW5kZWRGbGFncy50YXNrTG9jYXRpb25QYXRoO1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aCh0YXNrLCBjb25maWcpO1xuXG4gICAgICAgIC8vIEVuY29kZSB0aGUgQWRkcmVzcyBpbiBVUklcbiAgICAgICAgZW5jb2RlZEFkZHJlcyA9IGVuY29kZVVSSShhZGRyZXNzKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVmYXVsdCBBZGRyZXNzIFBhdGhzIEF2YWlhYmxlXG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9XG4gICAgICAgICAgdGFzaz8uZXh0cmFzPy50YXNrX2RldGFpbHM/LmN1c3RvbWVyX2RldGFpbHM/LmFkZHJlc3MgPz9cbiAgICAgICAgICB0YXNrPy50YXNrX2RldGFpbHM/LmN1c3RvbWVyX2RldGFpbHM/LmFkZHJlc3MgPz9cbiAgICAgICAgICB0YXNrPy5leHRyYXM/LmFkZHJlc3MgPz9cbiAgICAgICAgICB0YXNrPy5hZGRyZXNzID8/XG4gICAgICAgICAgXCJcIjtcblxuICAgICAgICAvLyBFbmNvZGUgdGhlIEFkZHJlc3MgaW4gVVJJXG4gICAgICAgIGVuY29kZWRBZGRyZXMgPSBlbmNvZGVVUkkoYWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVSTCB0byBnZW9jb2RlIEFkZHJlc3MgU3RyaW5nIHRvIExhdGl0dWRlICYgTG9uZ2l0dWRlXG4gICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2dlb2NvZGUvanNvbj9rZXk9JHt0aGlzLmFwaUtleX0mYWRkcmVzcz0ke2VuY29kZWRBZGRyZXN9YDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBTZXQgTG9jYXRpb24ge2xhdDogTEFULCBsbmc6IExOR30gZnJvbSBhZGRyZXNzIGdlb2NvZGVkXG4gICAgICBjb25zdCBpc1ZhbGlkTG9jYXRpb24gPSBpc05vdEVtcHR5QXJyYXkoZGF0YT8ucmVzdWx0cyk7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGlzVmFsaWRMb2NhdGlvblxuICAgICAgICA/IGRhdGE/LnJlc3VsdHNbMF0/Lmdlb21ldHJ5Py5sb2NhdGlvblxuICAgICAgICA6IHsgbGF0OiBudWxsLCBsbmc6IG51bGwgfTtcblxuICAgICAgLy8gU2V0IExvY2F0aW9uIHZhbGlkYXRpb24gJiBHb29nbGUgTWFwcyBVUkxcbiAgICAgIGxvY2F0aW9uLmlzVmFsaWRMb2NhdGlvbiA9IGlzVmFsaWRMb2NhdGlvbjtcbiAgICAgIGxvY2F0aW9uLmdvb2dsZU1hcHNVcmwgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3BsYWNlLyR7bG9jYXRpb24/LmxhdH0sJHtsb2NhdGlvbj8ubG5nfWA7XG5cbiAgICAgIHJlc29sdmUobG9jYXRpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gR2V0IFRhc2tzIHwgTWFya2VycyBMb2NhdGlvbiBDbyBPcmRpbmF0ZXNcbiAgYXN5bmMgZ2V0TWFya2Vyc0xvY2F0aW9uKG15TWFya2VyLCB0YXNrcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyhyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBtYXJrZXJzID0gW107XG4gICAgICBtYXJrZXJzLnB1c2gobXlNYXJrZXIpO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0YXNrcy5tYXAoYXN5bmModGFzaykgPT4ge1xuICAgICAgICBjb25zdCBtYXJrZXI6IGFueSA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb24odGFzayk7XG4gICAgICAgIHRhc2sgPSB7IC4uLnRhc2ssIC4uLm1hcmtlciB9O1xuICAgICAgICBtYXJrZXJzLnB1c2godGFzayk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuXG4gICAgICByZXNvbHZlKG1hcmtlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gUGxvdCBBbGwgTWFya2Vyc1xuICBhc3luYyBwbG90QWxsTWFya2Vycyh0YXNrcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyhyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gW107XG4gICAgICBjb25zdCBwcm9taXNlcyA9IHRhc2tzLm1hcCgodGFzaykgPT4ge1xuICAgICAgICBpZiAodGFzaz8uaXNWYWxpZExvY2F0aW9uKSB7XG4gICAgICAgICAgcGF0aC5wdXNoKHtcbiAgICAgICAgICAgIGxvY2F0aW9uOiB0YXNrLFxuICAgICAgICAgICAgc3RvcG92ZXI6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmFsbE1hcmtlcnMucHVzaCh0YXNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuICAgICAgcmVzb2x2ZShwYXRoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRvIFBsb3QgRGlyZWN0aW9ucyBmb3IgQWxsIFRhc2tzXG4gIGFzeW5jIHBsb3REaXJlY3Rpb25zRm9yQWxsVGFza3ModGFza3MpIHtcbiAgICBpZiAoIXRoaXMubWFwIHx8ICF0aGlzLm15UG9zaXRpb24pIHtcbiAgICAgIHJldHVybiB0YXNrcztcbiAgICB9XG4gICAgdGhpcy5hbGxNYXJrZXJzID0gW107XG5cbiAgICAvLyBDcmVhdGUgQWdlbnQgTWFya2VyICYgUGxvdCBJdC5cbiAgICBjb25zdCBteU1hcmtlciA9IHtcbiAgICAgIGxhdDogdGhpcy5teVBvc2l0aW9uLmxhdCxcbiAgICAgIGxuZzogdGhpcy5teVBvc2l0aW9uLmxuZyxcbiAgICAgIHRpdGxlOiAwLFxuICAgICAgY29sb3I6IFwicmVkXCJcbiAgICB9O1xuXG4gICAgLy8gR2V0IEFsbCBNYXJrZXJzIExvY2F0aW9uIENvIE9yZGluYXRlc1xuICAgIGNvbnN0IG1hcmtlcnM6IGFueSA9IGF3YWl0IHRoaXMuZ2V0TWFya2Vyc0xvY2F0aW9uKG15TWFya2VyLCB0YXNrcyk7XG5cbiAgICAvLyBSdW4gQWxnb3JpdGhtIHRvIGdldCBvcHRpbWl6ZWQgUm91dGVzXG4gICAgY29uc3Qgc3RhcnRpbmdQb2ludCA9IG1hcmtlcnNbMF07XG4gICAgY29uc3QgdW52aXNpdGVkV2F5cG9pbnRzID0gbWFya2Vycy5zbGljZSgxKTtcbiAgICBjb25zdCBvcHRpbWl6ZWRSb3V0ZSA9IG5lYXJlc3ROZWlnaGJvckFsZ29yaXRobShcbiAgICAgIHN0YXJ0aW5nUG9pbnQsXG4gICAgICB1bnZpc2l0ZWRXYXlwb2ludHNcbiAgICApO1xuXG4gICAgLy8gU29ydCBBbGwgVGFza3MgYXMgcGVyIG9wdGltaXplZCByb3V0ZXNcbiAgICB0YXNrcyA9IG9wdGltaXplZFJvdXRlLnNsaWNlKDEpO1xuICAgIHRoaXMuYWxsTWFya2VycyA9IFtteU1hcmtlcl07XG5cbiAgICAvLyBQbG90IGFsbCBtYXJrZXJzICYgZ2V0IHBhdGggZm9yIGRpcmVjdGlvbnNcbiAgICBjb25zdCBwYXRoOiBhbnkgPSBhd2FpdCB0aGlzLnBsb3RBbGxNYXJrZXJzKHRhc2tzKTtcblxuICAgIC8vIFNldCBEaXJlY3Rpb25zIGluIEdvb2dsZSBNYXBzXG4gICAgY29uc3QgcmVxdWVzdDogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlcXVlc3QgPSB7XG4gICAgICBvcmlnaW46IHRoaXMubXlQb3NpdGlvbixcbiAgICAgIGRlc3RpbmF0aW9uOiB0aGlzLm15UG9zaXRpb24sXG4gICAgICB3YXlwb2ludHM6IHBhdGgsXG4gICAgICB0cmF2ZWxNb2RlOiBnb29nbGUubWFwcy5UcmF2ZWxNb2RlLkRSSVZJTkdcbiAgICB9O1xuXG4gICAgdGhpcy5kaXJlY3Rpb25zUmVuZGVyT3B0aW9uID0ge1xuICAgICAgc3VwcHJlc3NNYXJrZXJzOiB0cnVlXG4gICAgfTtcblxuICAgIHRoaXMuZGlyZWN0aW9uc1Jlc3VsdHMkID0gdGhpcy5tYXBEaXJlY3Rpb25zU2VydmljZVxuICAgICAgLnJvdXRlKHJlcXVlc3QpXG4gICAgICAucGlwZShtYXAoKHJlc3BvbnNlKSA9PiByZXNwb25zZS5yZXN1bHQpKTtcblxuICAgIHRoaXMuZGlyZWN0aW9uc1Jlc3VsdHMkLnN1YnNjcmliZSgodmFsKSA9PiB7fSk7XG5cbiAgICB0aGlzLmFsbERpcmVjdGlvbnNSZXN1bHRzJCA9IHRoaXMuZGlyZWN0aW9uc1Jlc3VsdHMkO1xuXG4gICAgcmV0dXJuIHRhc2tzO1xuICB9XG5cbiAgLy8gVG8gUGxvdCBEaXJlY3Rpb25zIGZvciBTZWxlY3RlZCBUYXNrc1xuICBwbG90RGlyZWN0aW9uc0ZvclNlbGVjdGVkVGFzayh0YXNrKSB7XG4gICAgaWYgKHRhc2sgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdGFza01hcmtlciA9IHRhc2s7XG5cbiAgICAgIC8vIElmIExvY2F0aW9uIGlzIEF2YWlsYWJsZSBpbiBUYXNrIERldGFpbHNcbiAgICAgIGlmICh0YXNrTWFya2VyPy5pc1ZhbGlkTG9jYXRpb24pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdDogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlcXVlc3QgPSB7XG4gICAgICAgICAgb3JpZ2luOiB0aGlzLm15UG9zaXRpb24sXG4gICAgICAgICAgZGVzdGluYXRpb246IHRhc2tNYXJrZXIsXG4gICAgICAgICAgb3B0aW1pemVXYXlwb2ludHM6IHRydWUsXG4gICAgICAgICAgdHJhdmVsTW9kZTogZ29vZ2xlLm1hcHMuVHJhdmVsTW9kZS5EUklWSU5HXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQgPSB0aGlzLm1hcERpcmVjdGlvbnNTZXJ2aWNlXG4gICAgICAgICAgLnJvdXRlKHJlcXVlc3QpXG4gICAgICAgICAgLnBpcGUobWFwKChyZXNwb25zZSkgPT4gcmVzcG9uc2UucmVzdWx0KSk7XG5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQuc3Vic2NyaWJlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGVydChcIk5vIExvY2F0aW9uIEF2YWlsYWJsZVwiKTtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQgPSB0aGlzLmFsbERpcmVjdGlvbnNSZXN1bHRzJDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQgPSB0aGlzLmFsbERpcmVjdGlvbnNSZXN1bHRzJDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==