kwikid-agent-dashboard 0.0.37 → 0.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/bundles/kwikid-agent-dashboard.umd.js +3655 -1317
  2. package/bundles/kwikid-agent-dashboard.umd.js.map +1 -1
  3. package/esm2015/lib/kwikid-agent-dashboard.component.js +39 -120
  4. package/esm2015/lib/kwikid-agent-dashboard.module.js +26 -35
  5. package/esm2015/lib/v1/components/action-button/action-button.component.js +91 -0
  6. package/esm2015/lib/v1/components/customer-details/customer-details.component.js +139 -0
  7. package/esm2015/lib/v1/components/customer-list/customer-list.component.js +201 -0
  8. package/esm2015/lib/v1/components/customer-tile/customer-tile.component.js +137 -0
  9. package/esm2015/lib/v1/components/customer-tile/status-pill/status-pill.component.js +54 -0
  10. package/esm2015/lib/v1/components/customer-tile/status-pill/status-pill.definitions.js +36 -0
  11. package/esm2015/lib/v1/helpers/maps.helpers.js +46 -0
  12. package/esm2015/lib/v1/kwikid-agent-dashboard.component.js +177 -0
  13. package/esm2015/lib/v1/kwikid-agent-dashboard.module.js +120 -0
  14. package/esm2015/lib/v1/pipes/search-filter.pipe.js +62 -0
  15. package/esm2015/lib/v1/services/agent.service.js +149 -0
  16. package/esm2015/lib/v1/services/google-maps.service.js +201 -0
  17. package/esm2015/lib/v1/services/open-street-maps.service.js +252 -0
  18. package/esm2015/lib/v2/components/agent-info/agent-info.component.js +20 -0
  19. package/esm2015/lib/v2/components/agent-info/agent-info.module.js +37 -0
  20. package/esm2015/lib/v2/components/bottom-sheet/bottom-sheet.component.js +111 -0
  21. package/esm2015/lib/v2/components/bottom-sheet/bottom-sheet.module.js +41 -0
  22. package/esm2015/lib/v2/components/components.module.js +79 -0
  23. package/esm2015/lib/v2/components/map-view/map-view.component.js +39 -0
  24. package/esm2015/lib/v2/components/map-view/map-view.module.js +37 -0
  25. package/esm2015/lib/v2/components/primary-actions/primary-actions.component.js +65 -0
  26. package/esm2015/lib/v2/components/primary-actions/primary-actions.module.js +54 -0
  27. package/esm2015/lib/v2/components/task-detail/task-detail.component.js +82 -0
  28. package/esm2015/lib/v2/components/task-detail/task-detail.module.js +41 -0
  29. package/esm2015/lib/v2/components/task-item/task-item.component.js +107 -0
  30. package/esm2015/lib/v2/components/task-item/task-item.constant.js +12 -0
  31. package/esm2015/lib/v2/components/task-item/task-item.module.js +45 -0
  32. package/esm2015/lib/v2/components/task-item-status/task-item-status.component.js +51 -0
  33. package/esm2015/lib/v2/components/task-item-status/task-item-status.module.js +19 -0
  34. package/esm2015/lib/v2/components/task-list/task-list.component.js +186 -0
  35. package/esm2015/lib/v2/components/task-list/task-list.module.js +57 -0
  36. package/esm2015/lib/v2/components/task-list-search/task-list-search.component.js +118 -0
  37. package/esm2015/lib/v2/components/task-list-search/task-list-search.module.js +41 -0
  38. package/esm2015/lib/v2/components/task-preview/task-preview.component.js +30 -0
  39. package/esm2015/lib/v2/components/task-preview/task-preview.module.js +37 -0
  40. package/esm2015/lib/v2/helpers/array.helper.js +10 -0
  41. package/esm2015/lib/v2/helpers/date.helplers.js +17 -0
  42. package/esm2015/lib/v2/kwikid-agent-dashboard.component.js +61 -0
  43. package/esm2015/lib/v2/kwikid-agent-dashboard.module.js +45 -0
  44. package/esm2015/lib/v2/layout/layout-body/layout-body.component.js +274 -0
  45. package/esm2015/lib/v2/layout/layout-body/layout-body.module.js +55 -0
  46. package/esm2015/lib/v2/layout/layout-header/layout-header.component.js +60 -0
  47. package/esm2015/lib/v2/layout/layout-header/layout-header.module.js +48 -0
  48. package/esm2015/lib/v2/layout/layout.module.js +18 -0
  49. package/esm2015/lib/v2/pipes/search-filter.pipe.js +62 -0
  50. package/fesm2015/kwikid-agent-dashboard.js +3255 -1100
  51. package/fesm2015/kwikid-agent-dashboard.js.map +1 -1
  52. package/lib/kwikid-agent-dashboard.component.d.ts +11 -36
  53. package/lib/kwikid-agent-dashboard.module.d.ts +13 -16
  54. package/lib/v1/components/action-button/action-button.component.d.ts +18 -0
  55. package/lib/{components → v1/components}/customer-details/customer-details.component.d.ts +13 -6
  56. package/lib/{components → v1/components}/customer-list/customer-list.component.d.ts +25 -15
  57. package/lib/{components → v1/components}/customer-tile/customer-tile.component.d.ts +12 -5
  58. package/lib/{components → v1/components}/customer-tile/status-pill/status-pill.component.d.ts +6 -2
  59. package/lib/{components → v1/components}/customer-tile/status-pill/status-pill.definitions.d.ts +1 -1
  60. package/lib/v1/kwikid-agent-dashboard.component.d.ts +54 -0
  61. package/lib/v1/kwikid-agent-dashboard.module.d.ts +23 -0
  62. package/lib/{pipes → v1/pipes}/search-filter.pipe.d.ts +1 -1
  63. package/lib/{services → v1/services}/agent.service.d.ts +1 -1
  64. package/lib/{services → v1/services}/google-maps.service.d.ts +4 -4
  65. package/lib/{services → v1/services}/open-street-maps.service.d.ts +5 -5
  66. package/lib/v2/components/agent-info/agent-info.component.d.ts +8 -0
  67. package/lib/v2/components/agent-info/agent-info.module.d.ts +11 -0
  68. package/lib/v2/components/bottom-sheet/bottom-sheet.component.d.ts +24 -0
  69. package/lib/v2/components/bottom-sheet/bottom-sheet.module.d.ts +12 -0
  70. package/lib/v2/components/components.module.d.ts +15 -0
  71. package/lib/v2/components/map-view/map-view.component.d.ts +10 -0
  72. package/lib/v2/components/map-view/map-view.module.d.ts +11 -0
  73. package/lib/v2/components/primary-actions/primary-actions.component.d.ts +14 -0
  74. package/lib/v2/components/primary-actions/primary-actions.module.d.ts +13 -0
  75. package/lib/v2/components/task-detail/task-detail.component.d.ts +23 -0
  76. package/lib/v2/components/task-detail/task-detail.module.d.ts +12 -0
  77. package/lib/v2/components/task-item/task-item.component.d.ts +23 -0
  78. package/lib/v2/components/task-item/task-item.constant.d.ts +11 -0
  79. package/lib/v2/components/task-item/task-item.module.d.ts +13 -0
  80. package/lib/v2/components/task-item-status/task-item-status.component.d.ts +14 -0
  81. package/lib/v2/components/task-item-status/task-item-status.module.d.ts +9 -0
  82. package/lib/v2/components/task-list/task-list.component.d.ts +45 -0
  83. package/lib/v2/components/task-list/task-list.module.d.ts +16 -0
  84. package/lib/v2/components/task-list-search/task-list-search.component.d.ts +34 -0
  85. package/lib/v2/components/task-list-search/task-list-search.module.d.ts +12 -0
  86. package/lib/v2/components/task-preview/task-preview.component.d.ts +11 -0
  87. package/lib/v2/components/task-preview/task-preview.module.d.ts +11 -0
  88. package/lib/v2/helpers/array.helper.d.ts +1 -0
  89. package/lib/v2/helpers/date.helplers.d.ts +3 -0
  90. package/lib/v2/kwikid-agent-dashboard.component.d.ts +17 -0
  91. package/lib/v2/kwikid-agent-dashboard.module.d.ts +13 -0
  92. package/lib/v2/layout/layout-body/layout-body.component.d.ts +42 -0
  93. package/lib/v2/layout/layout-body/layout-body.module.d.ts +14 -0
  94. package/lib/v2/layout/layout-header/layout-header.component.d.ts +20 -0
  95. package/lib/v2/layout/layout-header/layout-header.module.d.ts +13 -0
  96. package/lib/v2/layout/layout.module.d.ts +8 -0
  97. package/lib/v2/pipes/search-filter.pipe.d.ts +25 -0
  98. package/package.json +2 -2
  99. package/esm2015/lib/components/customer-details/customer-details.component.js +0 -90
  100. package/esm2015/lib/components/customer-list/customer-list.component.js +0 -165
  101. package/esm2015/lib/components/customer-tile/customer-tile.component.js +0 -87
  102. package/esm2015/lib/components/customer-tile/status-pill/status-pill.component.js +0 -32
  103. package/esm2015/lib/components/customer-tile/status-pill/status-pill.definitions.js +0 -36
  104. package/esm2015/lib/helpers/maps.helpers.js +0 -46
  105. package/esm2015/lib/pipes/search-filter.pipe.js +0 -62
  106. package/esm2015/lib/services/agent.service.js +0 -153
  107. package/esm2015/lib/services/google-maps.service.js +0 -201
  108. package/esm2015/lib/services/open-street-maps.service.js +0 -252
  109. /package/lib/{helpers → v1/helpers}/maps.helpers.d.ts +0 -0
@@ -1,252 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Injectable, ViewChildren } from '@angular/core';
3
- import * as L from 'leaflet';
4
- import 'leaflet-routing-machine';
5
- import { checkObjectPathExists, getObjectValueFromPath, isNotEmptyArray } from 'kwikid-toolkit';
6
- import { addressConcator, nearestNeighborAlgorithm } from '../helpers/maps.helpers';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "./agent.service";
9
- import * as i2 from "@angular/google-maps";
10
- import * as i3 from "@angular/common/http";
11
- export class OpenStreetMapsService {
12
- constructor(agentService, mapDirectionsService, httpClient) {
13
- this.agentService = agentService;
14
- this.mapDirectionsService = mapDirectionsService;
15
- this.httpClient = httpClient;
16
- this.allMarkers = [];
17
- }
18
- // To get Current Position
19
- getPosition() {
20
- return new Promise((resolve, reject) => {
21
- navigator.geolocation.watchPosition((resp) => {
22
- resolve({
23
- lng: resp.coords.longitude,
24
- lat: resp.coords.latitude
25
- });
26
- }, (err) => {
27
- reject(err);
28
- });
29
- });
30
- }
31
- // To extract Location from the Task Details
32
- getLocation(task) {
33
- return __awaiter(this, void 0, void 0, function* () {
34
- return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
35
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
36
- let encodedAddres;
37
- // If Fetch Address from Multiple Paths
38
- if (checkObjectPathExists(this.agentService.config, 'dashboard.taskLocationPaths')) {
39
- // Get address string from multiple paths
40
- const config = this.agentService.config.dashboard.taskLocationPaths;
41
- const address = addressConcator(task, config);
42
- // Encode the Address in URI
43
- encodedAddres = encodeURI(address);
44
- }
45
- // If Fetch Address from Single Path
46
- else if (checkObjectPathExists(this.agentService.config, 'dashboard.taskLocationPath')) {
47
- // Get Address from Single Path
48
- const config = this.agentService.config.dashboard.taskLocationPath;
49
- const address = getObjectValueFromPath(task, config);
50
- // Encode the Address in URI
51
- encodedAddres = encodeURI(address);
52
- }
53
- // Default Address Paths Avaiable
54
- else {
55
- 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 : '';
56
- // Encode the Address in URI
57
- encodedAddres = encodeURI(address);
58
- }
59
- // URL to geocode Address String to Latitude & Longitude
60
- const url = `https://nominatim.openstreetmap.org/search?q=${encodedAddres}&format=json`;
61
- const response = yield fetch(url);
62
- const data = yield response.json();
63
- // Set Location {lat: LAT, lng: LNG} from address geocoded
64
- const isValidLocation = isNotEmptyArray(data) && ((_l = data[0]) === null || _l === void 0 ? void 0 : _l.lat) & ((_m = data[0]) === null || _m === void 0 ? void 0 : _m.lon);
65
- const location = isValidLocation
66
- ? { lat: (_o = data[0]) === null || _o === void 0 ? void 0 : _o.lat, lng: (_p = data[0]) === null || _p === void 0 ? void 0 : _p.lon }
67
- : { lat: null, lng: null };
68
- // Set Location validation & Google Maps URL
69
- location['isValidLocation'] = isValidLocation;
70
- location['color'] = isValidLocation ? 'blue' : 'red';
71
- 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}`;
72
- resolve(location);
73
- }));
74
- });
75
- }
76
- // Get Tasks | Markers Location Co Ordinates
77
- getMarkersLocation(myMarker, tasks) {
78
- return __awaiter(this, void 0, void 0, function* () {
79
- return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
80
- let markers = [];
81
- markers.push(myMarker);
82
- const promises = tasks.map((task) => __awaiter(this, void 0, void 0, function* () {
83
- const marker = yield this.getLocation(task);
84
- task = Object.assign(Object.assign({}, task), marker);
85
- markers.push(task);
86
- }));
87
- yield Promise.all(promises);
88
- resolve(markers);
89
- }));
90
- });
91
- }
92
- // To Initialize Open Street Map
93
- initializeMap() {
94
- return __awaiter(this, void 0, void 0, function* () {
95
- console.log('Running Init Open Street Maps');
96
- this.myPosition = yield this.getPosition();
97
- this.map = L.map('map', {
98
- center: [this.myPosition.lat, this.myPosition.lng],
99
- zoom: 11
100
- });
101
- L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(this.map);
102
- });
103
- }
104
- // To Add Open Street Marker in Map
105
- addMarker({ lat, lng, title, color }) {
106
- L.marker([lat, lng], {
107
- icon: L.icon({
108
- iconUrl: color == 'red'
109
- ? 'https://kwikid.s3.ap-south-1.amazonaws.com/CONFIG/USER/assets/map-marker-0.png'
110
- : 'https://kwikid.s3.ap-south-1.amazonaws.com/CONFIG/USER/assets/map-marker-1.png'
111
- })
112
- })
113
- .addTo(this.map)
114
- .bindPopup(title);
115
- }
116
- // To Plot Open Street Directions for All Tasks
117
- plotDirectionsForAllTasks(tasks) {
118
- return __awaiter(this, void 0, void 0, function* () {
119
- if (this.map) {
120
- this.allMarkers = [];
121
- // Create Agent Marker & Plot It.
122
- const myMarker = {
123
- lat: this.myPosition.lat,
124
- lng: this.myPosition.lng,
125
- title: 0,
126
- color: 'red'
127
- };
128
- this.addMarker(myMarker);
129
- this.allMarkers.push(myMarker);
130
- // Create Markers for all Tasks
131
- this.allMarkers = yield this.getMarkersLocation(myMarker, tasks);
132
- // Run Algorithm to get optimized Routes
133
- const startingPoint = this.allMarkers[0];
134
- const unvisitedWaypoints = this.allMarkers.slice(1);
135
- const optimizedRoute = nearestNeighborAlgorithm(startingPoint, unvisitedWaypoints);
136
- // Sort All Markers as per optimized routes
137
- this.allMarkers = this.sortTasksAsPerDistance(optimizedRoute, this.allMarkers, true);
138
- // Sort All Tasks as per optimized routes
139
- tasks = this.sortTasksAsPerDistance(optimizedRoute.slice(1), tasks, false);
140
- // Plot Markers for All Tasks
141
- tasks.map((task) => {
142
- if (task === null || task === void 0 ? void 0 : task.isValidLocation) {
143
- const marker = this.getLocation(task);
144
- this.addMarker(marker);
145
- }
146
- });
147
- // Set Styles for all Task Routes
148
- const styles = [
149
- { color: 'blue', opacity: 1, weight: 8 },
150
- { color: 'white', opacity: 0.6, weight: 12 }
151
- ];
152
- // Set Routes for all Tasks
153
- this.allTasksRoutes = this.setRoutes(this.allMarkers, styles);
154
- this.fitMapBounds();
155
- }
156
- return tasks;
157
- });
158
- }
159
- // To plot Open Street Direction for selected Task
160
- plotDirectionsForSelectedTask(task) {
161
- if (task !== null) {
162
- // Remove Previously Selected Task Route
163
- if (this.selectedTaskRoutes) {
164
- this.map.removeControl(this.selectedTaskRoutes);
165
- }
166
- // Remove All Tasks Routes
167
- if (this.allTasksRoutes) {
168
- this.map.removeControl(this.allTasksRoutes);
169
- }
170
- const taskMarker = task;
171
- // If Location is Available in Task Details
172
- if (taskMarker.color != 'red') {
173
- const markers = [this.allMarkers[0], taskMarker];
174
- const styles = [
175
- { color: 'green', opacity: 1, weight: 8 },
176
- { color: 'white', opacity: 0.4, weight: 12 }
177
- ];
178
- this.selectedTaskRoutes = this.setRoutes(markers, styles);
179
- this.setSelectedTaskDistanceAndTime();
180
- }
181
- else {
182
- alert('No Location Available');
183
- }
184
- }
185
- // Set All Tasks Routes Again & Remove Selected Tasks route
186
- else {
187
- if (this.selectedTaskRoutes) {
188
- this.map.removeControl(this.selectedTaskRoutes);
189
- }
190
- this.map.addControl(this.allTasksRoutes);
191
- this.selectedTaskRoutes = undefined;
192
- }
193
- this.fitMapBounds();
194
- }
195
- // Get Distance & Time of Selected Task
196
- getSelectedTaskDistanceAndTime() {
197
- return this.selectedTaskDistanceAndTime;
198
- }
199
- // Set Distance & Time of Selected Task
200
- setSelectedTaskDistanceAndTime() {
201
- this.selectedTaskRoutes.on('routesfound', function (e) {
202
- let routes = e.routes;
203
- let summary = routes[0].summary;
204
- const distance = summary.totalDistance / 1000;
205
- const time = Math.round((summary.totalTime % 3600) / 60);
206
- this.selectedTaskDistanceAndTime = {
207
- distance: distance,
208
- time: time
209
- };
210
- });
211
- }
212
- // To sort Open Street Maps Task as per nearest distance
213
- sortTasksAsPerDistance(order, tasks, isMarker) {
214
- let sortedTasks = [];
215
- for (let i = 0; i < tasks.length; i++) {
216
- const title = isMarker ? order[i].title : order[i].title - 1;
217
- let task = tasks[title];
218
- sortedTasks.push(task);
219
- }
220
- return sortedTasks;
221
- }
222
- // To set Open Street routes in the maps
223
- setRoutes(markers, styles) {
224
- return L.Routing.control({
225
- waypoints: markers,
226
- lineOptions: {
227
- styles: styles
228
- },
229
- createMarker: function () {
230
- return null;
231
- },
232
- routeWhileDragging: true
233
- }).addTo(this.map);
234
- }
235
- // To set Open Street view point on the map
236
- fitMapBounds() {
237
- const markerLatLngs = this.allMarkers.map((marker) => L.latLng(marker.lat, marker.lng));
238
- this.map.fitBounds(markerLatLngs);
239
- }
240
- }
241
- /** @nocollapse */ OpenStreetMapsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: OpenStreetMapsService, deps: [{ token: i1.AgentService }, { token: i2.MapDirectionsService }, { token: i3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
242
- /** @nocollapse */ OpenStreetMapsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: OpenStreetMapsService, providedIn: 'root' });
243
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: OpenStreetMapsService, decorators: [{
244
- type: Injectable,
245
- args: [{
246
- providedIn: 'root'
247
- }]
248
- }], ctorParameters: function () { return [{ type: i1.AgentService }, { type: i2.MapDirectionsService }, { type: i3.HttpClient }]; }, propDecorators: { directionsRenders: [{
249
- type: ViewChildren,
250
- args: ['directionsRender']
251
- }] } });
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1zdHJlZXQtbWFwcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWFnZW50LWRhc2hib2FyZC9zcmMvbGliL3NlcnZpY2VzL29wZW4tc3RyZWV0LW1hcHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFjLFVBQVUsRUFBYSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxLQUFLLENBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEIsT0FBTyxFQUNMLGVBQWUsRUFDZix3QkFBd0IsRUFDekIsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7QUFLakMsTUFBTSxPQUFPLHFCQUFxQjtJQWFoQyxZQUNVLFlBQTBCLEVBQzNCLG9CQUEwQyxFQUMxQyxVQUFzQjtRQUZyQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMzQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFiL0IsZUFBVSxHQUFRLEVBQUUsQ0FBQztJQWNsQixDQUFDO0lBRUosMEJBQTBCO0lBQzFCLFdBQVc7UUFDVCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUNqQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNQLE9BQU8sQ0FBQztvQkFDTixHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUMxQixHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2lCQUMxQixDQUFDLENBQUM7WUFDTCxDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVB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RSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQ2pDLENBQUM7UUFDRixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwQyxDQUFDOztzSUFoVFUscUJBQXFCOzBJQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs0RkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COytKQVVtQyxpQkFBaUI7c0JBQWxELFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgJ2xlYWZsZXQtcm91dGluZy1tYWNoaW5lJztcbmltcG9ydCB7IEFnZW50U2VydmljZSB9IGZyb20gJy4vYWdlbnQuc2VydmljZSc7XG5pbXBvcnQge1xuICBjaGVja09iamVjdFBhdGhFeGlzdHMsXG4gIGdldE9iamVjdFZhbHVlRnJvbVBhdGgsXG4gIGlzTm90RW1wdHlBcnJheVxufSBmcm9tICdrd2lraWQtdG9vbGtpdCc7XG5cbmltcG9ydCB7IE1hcERpcmVjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGFuZ3VsYXIvZ29vZ2xlLW1hcHMnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIGFkZHJlc3NDb25jYXRvcixcbiAgbmVhcmVzdE5laWdoYm9yQWxnb3JpdGhtXG59IGZyb20gJy4uL2hlbHBlcnMvbWFwcy5oZWxwZXJzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgT3BlblN0cmVldE1hcHNTZXJ2aWNlIHtcbiAgbXlQb3NpdGlvbjtcbiAgbWFwOiBhbnk7XG4gIGFsbE1hcmtlcnM6IGFueSA9IFtdO1xuXG4gIGFsbFRhc2tzUm91dGVzOiBhbnk7XG4gIHNlbGVjdGVkVGFza1JvdXRlczogYW55O1xuICBzZWxlY3RlZFRhc2tEaXN0YW5jZUFuZFRpbWU6IGFueTtcblxuICBAVmlld0NoaWxkcmVuKCdkaXJlY3Rpb25zUmVuZGVyJykgZGlyZWN0aW9uc1JlbmRlcnM6IFF1ZXJ5TGlzdDxcbiAgICBFbGVtZW50UmVmPGdvb2dsZS5tYXBzLkRpcmVjdGlvbnNSZW5kZXJlcj5cbiAgPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFnZW50U2VydmljZTogQWdlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBtYXBEaXJlY3Rpb25zU2VydmljZTogTWFwRGlyZWN0aW9uc1NlcnZpY2UsXG4gICAgcHVibGljIGh0dHBDbGllbnQ6IEh0dHBDbGllbnRcbiAgKSB7fVxuXG4gIC8vIFRvIGdldCBDdXJyZW50IFBvc2l0aW9uXG4gIGdldFBvc2l0aW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKFxuICAgICAgICAocmVzcCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgbG5nOiByZXNwLmNvb3Jkcy5sb25naXR1ZGUsXG4gICAgICAgICAgICBsYXQ6IHJlc3AuY29vcmRzLmxhdGl0dWRlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRvIGV4dHJhY3QgTG9jYXRpb24gZnJvbSB0aGUgVGFzayBEZXRhaWxzXG4gIGFzeW5jIGdldExvY2F0aW9uKHRhc2spIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBlbmNvZGVkQWRkcmVzO1xuXG4gICAgICAvLyBJZiBGZXRjaCBBZGRyZXNzIGZyb20gTXVsdGlwbGUgUGF0aHNcbiAgICAgIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKFxuICAgICAgICAgIHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZyxcbiAgICAgICAgICAnZGFzaGJvYXJkLnRhc2tMb2NhdGlvblBhdGhzJ1xuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgLy8gR2V0IGFkZHJlc3Mgc3RyaW5nIGZyb20gbXVsdGlwbGUgcGF0aHNcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5hZ2VudFNlcnZpY2UuY29uZmlnLmRhc2hib2FyZC50YXNrTG9jYXRpb25QYXRocztcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGFkZHJlc3NDb25jYXRvcih0YXNrLCBjb25maWcpO1xuXG4gICAgICAgIC8vIEVuY29kZSB0aGUgQWRkcmVzcyBpbiBVUklcbiAgICAgICAgZW5jb2RlZEFkZHJlcyA9IGVuY29kZVVSSShhZGRyZXNzKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgRmV0Y2ggQWRkcmVzcyBmcm9tIFNpbmdsZSBQYXRoXG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKFxuICAgICAgICAgIHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZyxcbiAgICAgICAgICAnZGFzaGJvYXJkLnRhc2tMb2NhdGlvblBhdGgnXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICAvLyBHZXQgQWRkcmVzcyBmcm9tIFNpbmdsZSBQYXRoXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZy5kYXNoYm9hcmQudGFza0xvY2F0aW9uUGF0aDtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGdldE9iamVjdFZhbHVlRnJvbVBhdGgodGFzaywgY29uZmlnKTtcblxuICAgICAgICAvLyBFbmNvZGUgdGhlIEFkZHJlc3MgaW4gVVJJXG4gICAgICAgIGVuY29kZWRBZGRyZXMgPSBlbmNvZGVVUkkoYWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlZmF1bHQgQWRkcmVzcyBQYXRocyBBdmFpYWJsZVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgICAgIHRhc2s/LmV4dHJhcz8udGFza19kZXRhaWxzPy5jdXN0b21lcl9kZXRhaWxzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8udGFza19kZXRhaWxzPy5jdXN0b21lcl9kZXRhaWxzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8uZXh0cmFzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8uYWRkcmVzcyA/P1xuICAgICAgICAgICcnO1xuXG4gICAgICAgIC8vIEVuY29kZSB0aGUgQWRkcmVzcyBpbiBVUklcbiAgICAgICAgZW5jb2RlZEFkZHJlcyA9IGVuY29kZVVSSShhZGRyZXNzKTtcbiAgICAgIH1cblxuICAgICAgLy8gVVJMIHRvIGdlb2NvZGUgQWRkcmVzcyBTdHJpbmcgdG8gTGF0aXR1ZGUgJiBMb25naXR1ZGVcbiAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL25vbWluYXRpbS5vcGVuc3RyZWV0bWFwLm9yZy9zZWFyY2g/cT0ke2VuY29kZWRBZGRyZXN9JmZvcm1hdD1qc29uYDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBTZXQgTG9jYXRpb24ge2xhdDogTEFULCBsbmc6IExOR30gZnJvbSBhZGRyZXNzIGdlb2NvZGVkXG4gICAgICBjb25zdCBpc1ZhbGlkTG9jYXRpb24gPVxuICAgICAgICBpc05vdEVtcHR5QXJyYXkoZGF0YSkgJiYgZGF0YVswXT8ubGF0ICYgZGF0YVswXT8ubG9uO1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBpc1ZhbGlkTG9jYXRpb25cbiAgICAgICAgPyB7IGxhdDogZGF0YVswXT8ubGF0LCBsbmc6IGRhdGFbMF0/LmxvbiB9XG4gICAgICAgIDoge2xhdDogbnVsbCwgbG5nOiBudWxsfTtcblxuICAgICAgLy8gU2V0IExvY2F0aW9uIHZhbGlkYXRpb24gJiBHb29nbGUgTWFwcyBVUkxcbiAgICAgIGxvY2F0aW9uWydpc1ZhbGlkTG9jYXRpb24nXSA9IGlzVmFsaWRMb2NhdGlvbjtcbiAgICAgIGxvY2F0aW9uWydjb2xvciddID0gaXNWYWxpZExvY2F0aW9uID8gJ2JsdWUnIDogJ3JlZCc7XG4gICAgICBsb2NhdGlvbltcbiAgICAgICAgJ2dvb2dsZU1hcHNVcmwnXG4gICAgICBdID0gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcy9wbGFjZS8ke2xvY2F0aW9uPy5sYXR9LCR7bG9jYXRpb24/LmxuZ31gO1xuXG4gICAgICByZXNvbHZlKGxvY2F0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdldCBUYXNrcyB8IE1hcmtlcnMgTG9jYXRpb24gQ28gT3JkaW5hdGVzXG4gIGFzeW5jIGdldE1hcmtlcnNMb2NhdGlvbihteU1hcmtlciwgdGFza3MpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBtYXJrZXJzID0gW107XG4gICAgICBtYXJrZXJzLnB1c2gobXlNYXJrZXIpO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0YXNrcy5tYXAoYXN5bmMgKHRhc2spID0+IHtcbiAgICAgICAgY29uc3QgbWFya2VyOiBhbnkgPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uKHRhc2spO1xuICAgICAgICB0YXNrID0geyAuLi50YXNrLCAuLi5tYXJrZXIgfTtcbiAgICAgICAgbWFya2Vycy5wdXNoKHRhc2spO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuICAgICAgcmVzb2x2ZShtYXJrZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRvIEluaXRpYWxpemUgT3BlbiBTdHJlZXQgTWFwXG4gIGFzeW5jIGluaXRpYWxpemVNYXAoKSB7XG4gICAgY29uc29sZS5sb2coJ1J1bm5pbmcgSW5pdCBPcGVuIFN0cmVldCBNYXBzJyk7XG4gICAgdGhpcy5teVBvc2l0aW9uID0gYXdhaXQgdGhpcy5nZXRQb3NpdGlvbigpO1xuICAgIHRoaXMubWFwID0gTC5tYXAoJ21hcCcsIHtcbiAgICAgIGNlbnRlcjogW3RoaXMubXlQb3NpdGlvbi5sYXQsIHRoaXMubXlQb3NpdGlvbi5sbmddLFxuICAgICAgem9vbTogMTFcbiAgICB9KTtcbiAgICBMLnRpbGVMYXllcignaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnKS5hZGRUbyhcbiAgICAgIHRoaXMubWFwXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRvIEFkZCBPcGVuIFN0cmVldCBNYXJrZXIgaW4gTWFwXG4gIGFkZE1hcmtlcih7IGxhdCwgbG5nLCB0aXRsZSwgY29sb3IgfSkge1xuICAgIEwubWFya2VyKFtsYXQsIGxuZ10sIHtcbiAgICAgIGljb246IEwuaWNvbih7XG4gICAgICAgIGljb25Vcmw6XG4gICAgICAgICAgY29sb3IgPT0gJ3JlZCdcbiAgICAgICAgICAgID8gJ2h0dHBzOi8va3dpa2lkLnMzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbS9DT05GSUcvVVNFUi9hc3NldHMvbWFwLW1hcmtlci0wLnBuZydcbiAgICAgICAgICAgIDogJ2h0dHBzOi8va3dpa2lkLnMzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbS9DT05GSUcvVVNFUi9hc3NldHMvbWFwLW1hcmtlci0xLnBuZydcbiAgICAgIH0pXG4gICAgfSlcbiAgICAgIC5hZGRUbyh0aGlzLm1hcClcbiAgICAgIC5iaW5kUG9wdXAodGl0bGUpO1xuICB9XG5cbiAgLy8gVG8gUGxvdCBPcGVuIFN0cmVldCBEaXJlY3Rpb25zIGZvciBBbGwgVGFza3NcbiAgYXN5bmMgcGxvdERpcmVjdGlvbnNGb3JBbGxUYXNrcyh0YXNrcykge1xuICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgdGhpcy5hbGxNYXJrZXJzID0gW107XG5cbiAgICAgIC8vIENyZWF0ZSBBZ2VudCBNYXJrZXIgJiBQbG90IEl0LlxuICAgICAgY29uc3QgbXlNYXJrZXIgPSB7XG4gICAgICAgIGxhdDogdGhpcy5teVBvc2l0aW9uLmxhdCxcbiAgICAgICAgbG5nOiB0aGlzLm15UG9zaXRpb24ubG5nLFxuICAgICAgICB0aXRsZTogMCxcbiAgICAgICAgY29sb3I6ICdyZWQnXG4gICAgICB9O1xuICAgICAgdGhpcy5hZGRNYXJrZXIobXlNYXJrZXIpO1xuICAgICAgdGhpcy5hbGxNYXJrZXJzLnB1c2gobXlNYXJrZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgTWFya2VycyBmb3IgYWxsIFRhc2tzXG4gICAgICB0aGlzLmFsbE1hcmtlcnMgPSBhd2FpdCB0aGlzLmdldE1hcmtlcnNMb2NhdGlvbihteU1hcmtlciwgdGFza3MpO1xuXG4gICAgICAvLyBSdW4gQWxnb3JpdGhtIHRvIGdldCBvcHRpbWl6ZWQgUm91dGVzXG4gICAgICBjb25zdCBzdGFydGluZ1BvaW50ID0gdGhpcy5hbGxNYXJrZXJzWzBdO1xuICAgICAgY29uc3QgdW52aXNpdGVkV2F5cG9pbnRzID0gdGhpcy5hbGxNYXJrZXJzLnNsaWNlKDEpO1xuICAgICAgY29uc3Qgb3B0aW1pemVkUm91dGUgPSBuZWFyZXN0TmVpZ2hib3JBbGdvcml0aG0oXG4gICAgICAgIHN0YXJ0aW5nUG9pbnQsXG4gICAgICAgIHVudmlzaXRlZFdheXBvaW50c1xuICAgICAgKTtcblxuICAgICAgLy8gU29ydCBBbGwgTWFya2VycyBhcyBwZXIgb3B0aW1pemVkIHJvdXRlc1xuICAgICAgdGhpcy5hbGxNYXJrZXJzID0gdGhpcy5zb3J0VGFza3NBc1BlckRpc3RhbmNlKFxuICAgICAgICBvcHRpbWl6ZWRSb3V0ZSxcbiAgICAgICAgdGhpcy5hbGxNYXJrZXJzLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICAvLyBTb3J0IEFsbCBUYXNrcyBhcyBwZXIgb3B0aW1pemVkIHJvdXRlc1xuICAgICAgdGFza3MgPSB0aGlzLnNvcnRUYXNrc0FzUGVyRGlzdGFuY2UoXG4gICAgICAgIG9wdGltaXplZFJvdXRlLnNsaWNlKDEpLFxuICAgICAgICB0YXNrcyxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG5cbiAgICAgIC8vIFBsb3QgTWFya2VycyBmb3IgQWxsIFRhc2tzXG4gICAgICB0YXNrcy5tYXAoKHRhc2spID0+IHtcbiAgICAgICAgaWYgKHRhc2s/LmlzVmFsaWRMb2NhdGlvbikge1xuICAgICAgICAgIGNvbnN0IG1hcmtlcjogYW55ID0gdGhpcy5nZXRMb2NhdGlvbih0YXNrKTtcbiAgICAgICAgICB0aGlzLmFkZE1hcmtlcihtYXJrZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IFN0eWxlcyBmb3IgYWxsIFRhc2sgUm91dGVzXG4gICAgICBjb25zdCBzdHlsZXMgPSBbXG4gICAgICAgIHsgY29sb3I6ICdibHVlJywgb3BhY2l0eTogMSwgd2VpZ2h0OiA4IH0sXG4gICAgICAgIHsgY29sb3I6ICd3aGl0ZScsIG9wYWNpdHk6IDAuNiwgd2VpZ2h0OiAxMiB9XG4gICAgICBdO1xuXG4gICAgICAvLyBTZXQgUm91dGVzIGZvciBhbGwgVGFza3NcbiAgICAgIHRoaXMuYWxsVGFza3NSb3V0ZXMgPSB0aGlzLnNldFJvdXRlcyh0aGlzLmFsbE1hcmtlcnMsIHN0eWxlcyk7XG4gICAgICB0aGlzLmZpdE1hcEJvdW5kcygpO1xuICAgIH1cbiAgICByZXR1cm4gdGFza3M7XG4gIH1cblxuICAvLyBUbyBwbG90IE9wZW4gU3RyZWV0IERpcmVjdGlvbiBmb3Igc2VsZWN0ZWQgVGFza1xuICBwbG90RGlyZWN0aW9uc0ZvclNlbGVjdGVkVGFzayh0YXNrKSB7XG4gICAgaWYgKHRhc2sgIT09IG51bGwpIHtcbiAgICAgIC8vIFJlbW92ZSBQcmV2aW91c2x5IFNlbGVjdGVkIFRhc2sgUm91dGVcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGFza1JvdXRlcykge1xuICAgICAgICB0aGlzLm1hcC5yZW1vdmVDb250cm9sKHRoaXMuc2VsZWN0ZWRUYXNrUm91dGVzKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIEFsbCBUYXNrcyBSb3V0ZXNcbiAgICAgIGlmICh0aGlzLmFsbFRhc2tzUm91dGVzKSB7XG4gICAgICAgIHRoaXMubWFwLnJlbW92ZUNvbnRyb2wodGhpcy5hbGxUYXNrc1JvdXRlcyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhc2tNYXJrZXIgPSB0YXNrO1xuXG4gICAgICAvLyBJZiBMb2NhdGlvbiBpcyBBdmFpbGFibGUgaW4gVGFzayBEZXRhaWxzXG4gICAgICBpZiAodGFza01hcmtlci5jb2xvciAhPSAncmVkJykge1xuICAgICAgICBjb25zdCBtYXJrZXJzID0gW3RoaXMuYWxsTWFya2Vyc1swXSwgdGFza01hcmtlcl07XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IFtcbiAgICAgICAgICB7IGNvbG9yOiAnZ3JlZW4nLCBvcGFjaXR5OiAxLCB3ZWlnaHQ6IDggfSxcbiAgICAgICAgICB7IGNvbG9yOiAnd2hpdGUnLCBvcGFjaXR5OiAwLjQsIHdlaWdodDogMTIgfVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFza1JvdXRlcyA9IHRoaXMuc2V0Um91dGVzKG1hcmtlcnMsIHN0eWxlcyk7XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRUYXNrRGlzdGFuY2VBbmRUaW1lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGVydCgnTm8gTG9jYXRpb24gQXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNldCBBbGwgVGFza3MgUm91dGVzIEFnYWluICYgUmVtb3ZlIFNlbGVjdGVkIFRhc2tzIHJvdXRlXG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFRhc2tSb3V0ZXMpIHtcbiAgICAgICAgdGhpcy5tYXAucmVtb3ZlQ29udHJvbCh0aGlzLnNlbGVjdGVkVGFza1JvdXRlcyk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcC5hZGRDb250cm9sKHRoaXMuYWxsVGFza3NSb3V0ZXMpO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhc2tSb3V0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuZml0TWFwQm91bmRzKCk7XG4gIH1cblxuICAvLyBHZXQgRGlzdGFuY2UgJiBUaW1lIG9mIFNlbGVjdGVkIFRhc2tcbiAgZ2V0U2VsZWN0ZWRUYXNrRGlzdGFuY2VBbmRUaW1lKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGFza0Rpc3RhbmNlQW5kVGltZTtcbiAgfVxuXG4gIC8vIFNldCBEaXN0YW5jZSAmIFRpbWUgb2YgU2VsZWN0ZWQgVGFza1xuICBzZXRTZWxlY3RlZFRhc2tEaXN0YW5jZUFuZFRpbWUoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFRhc2tSb3V0ZXMub24oJ3JvdXRlc2ZvdW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGxldCByb3V0ZXMgPSBlLnJvdXRlcztcbiAgICAgIGxldCBzdW1tYXJ5ID0gcm91dGVzWzBdLnN1bW1hcnk7XG5cbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gc3VtbWFyeS50b3RhbERpc3RhbmNlIC8gMTAwMDtcbiAgICAgIGNvbnN0IHRpbWUgPSBNYXRoLnJvdW5kKChzdW1tYXJ5LnRvdGFsVGltZSAlIDM2MDApIC8gNjApO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkVGFza0Rpc3RhbmNlQW5kVGltZSA9IHtcbiAgICAgICAgZGlzdGFuY2U6IGRpc3RhbmNlLFxuICAgICAgICB0aW1lOiB0aW1lXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVG8gc29ydCBPcGVuIFN0cmVldCBNYXBzIFRhc2sgYXMgcGVyIG5lYXJlc3QgZGlzdGFuY2VcbiAgc29ydFRhc2tzQXNQZXJEaXN0YW5jZShvcmRlciwgdGFza3MsIGlzTWFya2VyKSB7XG4gICAgbGV0IHNvcnRlZFRhc2tzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGl0bGUgPSBpc01hcmtlciA/IG9yZGVyW2ldLnRpdGxlIDogb3JkZXJbaV0udGl0bGUgLSAxO1xuICAgICAgbGV0IHRhc2sgPSB0YXNrc1t0aXRsZV07XG4gICAgICBzb3J0ZWRUYXNrcy5wdXNoKHRhc2spO1xuICAgIH1cbiAgICByZXR1cm4gc29ydGVkVGFza3M7XG4gIH1cblxuICAvLyBUbyBzZXQgT3BlbiBTdHJlZXQgcm91dGVzIGluIHRoZSBtYXBzXG4gIHNldFJvdXRlcyhtYXJrZXJzLCBzdHlsZXMpIHtcbiAgICByZXR1cm4gTC5Sb3V0aW5nLmNvbnRyb2woe1xuICAgICAgd2F5cG9pbnRzOiBtYXJrZXJzLFxuICAgICAgbGluZU9wdGlvbnM6IHtcbiAgICAgICAgc3R5bGVzOiBzdHlsZXNcbiAgICAgIH0sXG4gICAgICBjcmVhdGVNYXJrZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuICAgICAgcm91dGVXaGlsZURyYWdnaW5nOiB0cnVlXG4gICAgfSkuYWRkVG8odGhpcy5tYXApO1xuICB9XG5cbiAgLy8gVG8gc2V0IE9wZW4gU3RyZWV0IHZpZXcgcG9pbnQgb24gdGhlIG1hcFxuICBmaXRNYXBCb3VuZHMoKSB7XG4gICAgY29uc3QgbWFya2VyTGF0TG5ncyA9IHRoaXMuYWxsTWFya2Vycy5tYXAoKG1hcmtlcikgPT5cbiAgICAgIEwubGF0TG5nKG1hcmtlci5sYXQsIG1hcmtlci5sbmcpXG4gICAgKTtcbiAgICB0aGlzLm1hcC5maXRCb3VuZHMobWFya2VyTGF0TG5ncyk7XG4gIH1cbn1cbiJdfQ==
File without changes