@aggdirect/coolmap 2.5.2 → 2.5.3

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 (44) hide show
  1. package/README.md +57 -57
  2. package/esm2020/aggdirect-coolmap.mjs +4 -4
  3. package/esm2020/lib/component/add-route/add-route.component.mjs +335 -335
  4. package/esm2020/lib/component/job-code/job-code.component.mjs +181 -181
  5. package/esm2020/lib/component/map/map.component.mjs +37 -37
  6. package/esm2020/lib/component/nav/layout/add-route-nav/add-route-nav.component.mjs +146 -146
  7. package/esm2020/lib/component/nav/layout/job-code-nav/job-code-nav.component.mjs +114 -114
  8. package/esm2020/lib/component/nav/nav.component.mjs +52 -52
  9. package/esm2020/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.mjs +72 -72
  10. package/esm2020/lib/component/route-jobcode-list/route-jobcode-list.component.mjs +316 -316
  11. package/esm2020/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.mjs +19 -19
  12. package/esm2020/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.mjs +33 -33
  13. package/esm2020/lib/component/shared/dialog/dialog.component.mjs +29 -29
  14. package/esm2020/lib/component/shared/estimation-display/estimation-display.component.mjs +19 -19
  15. package/esm2020/lib/component/shared/job-route-list/job-route-list.component.mjs +71 -71
  16. package/esm2020/lib/component/shared/jobcode-overview/jobcode-overview.component.mjs +24 -24
  17. package/esm2020/lib/component/shared/jobcode-status/jobcode-status.component.mjs +14 -14
  18. package/esm2020/lib/component/shared/route-info-card/route-info-card.component.mjs +57 -57
  19. package/esm2020/lib/coolmap.module.mjs +185 -185
  20. package/esm2020/public-api.mjs +19 -19
  21. package/fesm2015/aggdirect-coolmap.mjs +1535 -1535
  22. package/fesm2015/aggdirect-coolmap.mjs.map +1 -1
  23. package/fesm2020/aggdirect-coolmap.mjs +1497 -1497
  24. package/fesm2020/aggdirect-coolmap.mjs.map +1 -1
  25. package/index.d.ts +5 -5
  26. package/lib/component/add-route/add-route.component.d.ts +61 -61
  27. package/lib/component/job-code/job-code.component.d.ts +42 -42
  28. package/lib/component/map/map.component.d.ts +15 -15
  29. package/lib/component/nav/layout/add-route-nav/add-route-nav.component.d.ts +49 -49
  30. package/lib/component/nav/layout/job-code-nav/job-code-nav.component.d.ts +42 -42
  31. package/lib/component/nav/nav.component.d.ts +31 -31
  32. package/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.d.ts +20 -20
  33. package/lib/component/route-jobcode-list/route-jobcode-list.component.d.ts +42 -42
  34. package/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.d.ts +9 -9
  35. package/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.d.ts +12 -12
  36. package/lib/component/shared/dialog/dialog.component.d.ts +13 -13
  37. package/lib/component/shared/estimation-display/estimation-display.component.d.ts +8 -8
  38. package/lib/component/shared/job-route-list/job-route-list.component.d.ts +26 -26
  39. package/lib/component/shared/jobcode-overview/jobcode-overview.component.d.ts +10 -10
  40. package/lib/component/shared/jobcode-status/jobcode-status.component.d.ts +7 -7
  41. package/lib/component/shared/route-info-card/route-info-card.component.d.ts +29 -29
  42. package/lib/coolmap.module.d.ts +44 -44
  43. package/package.json +10 -2
  44. package/public-api.d.ts +15 -15
@@ -1,335 +1,335 @@
1
- import { Component, ViewChild, Output, EventEmitter, Input, Inject } from '@angular/core';
2
- import { FormControl, FormGroup, Validators } from '@angular/forms';
3
- import { debounceTime, distinctUntilChanged, fromEvent, map, startWith, Subject, takeUntil } from 'rxjs';
4
- import { DialogComponent } from '../shared/dialog/dialog.component';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@aggdirect/coolmap-services";
7
- import * as i2 from "@angular/material/dialog";
8
- import * as i3 from "@angular/common";
9
- import * as i4 from "@angular/cdk/drag-drop";
10
- import * as i5 from "@angular/forms";
11
- import * as i6 from "@angular/material/form-field";
12
- import * as i7 from "@angular/material/input";
13
- import * as i8 from "@angular/material/select";
14
- import * as i9 from "@angular/material/core";
15
- import * as i10 from "@angular/material/icon";
16
- import * as i11 from "@angular/material/autocomplete";
17
- import * as i12 from "@angular/material/progress-spinner";
18
- import * as i13 from "@angular/material/button";
19
- import * as i14 from "../shared/estimation-display/estimation-display.component";
20
- import * as i15 from "../shared/route-info-card/route-info-card.component";
21
- export class AddRouteComponent {
22
- constructor(coolMapService, utils, dialog, config) {
23
- this.coolMapService = coolMapService;
24
- this.utils = utils;
25
- this.dialog = dialog;
26
- this.config = config;
27
- this.changeNav = new EventEmitter();
28
- this.updateRouteList = new EventEmitter();
29
- this.pickupOptions = [];
30
- this.deliveryOptions = [];
31
- this.requestParmsForRouteDetails = { pickup_lat_lng: '', delivery_lat_lng: '' };
32
- this.customersList = [];
33
- this.unitsList = [];
34
- this.materialsList = [];
35
- this.preventSave = false;
36
- this.preventInitialSave = false;
37
- this.destroyer$ = new Subject();
38
- this.enablePopUp = false;
39
- this.prevantPopupClose = false;
40
- this.enableForm = false;
41
- if (this.config.repository === 'customer') {
42
- this.utils.fetchMaterialsListForCustomer().then((res) => {
43
- this.materialsList = res;
44
- });
45
- }
46
- else {
47
- this.utils.fetchMaterialsList().then((res) => {
48
- this.materialsList = res;
49
- });
50
- }
51
- this.utils.fetchUnitsList().then((res) => {
52
- this.unitsList = res;
53
- });
54
- this.formInit();
55
- this.utils.getrouteDetailsUtility.subscribe(res => {
56
- if (res) {
57
- if (res['event'] !== 'click' && !this.prevantPopupClose) {
58
- this.enablePopUp = res['event'];
59
- }
60
- else if (this.enablePopUp && !this.prevantPopupClose) {
61
- this.prevantPopupClose = true;
62
- }
63
- if (res['event'] !== 'click' && !res['event'] && this.prevantPopupClose) {
64
- this.popupDetails = this.utils.getdictValue('route-detailsv2');
65
- }
66
- else {
67
- this.popupDetails = res['route'];
68
- }
69
- if (this.enablePopUp)
70
- this.popupDetails['created_at'] = this.utils.getDateFormat(new Date(this.popupDetails['created_at']), '/');
71
- }
72
- });
73
- }
74
- filterCustomerList() {
75
- this.customersList$ = this.addRouteForm.controls['customer_name'].valueChanges.pipe(startWith(''), map(value => this._filter(value || '')));
76
- }
77
- _filter(value) {
78
- const filterValue = value.toLowerCase();
79
- return this.customersList.filter((option) => option['customer_name'].toLowerCase().includes(filterValue));
80
- }
81
- ngOnChanges(changes) {
82
- if (changes['routeData'] && !changes['routeData']['currentValue'])
83
- this.inIt(null);
84
- }
85
- openDialog() {
86
- const dialogRef = this.dialog.open(DialogComponent, {
87
- data: { body: 'Are you sure you want to delete this route?' },
88
- });
89
- dialogRef.afterClosed().subscribe(res => { if (res) {
90
- this.deleteRoute();
91
- } });
92
- }
93
- editEvent() {
94
- this.prevantPopupClose = false;
95
- this.enableForm = true;
96
- this.enablePopUp = false;
97
- this.popupDetails['prevent'] = false;
98
- this.utils.removeMapEntity.next(this.popupDetails);
99
- this.inIt(this.popupDetails);
100
- }
101
- inIt(changes) {
102
- if (changes) {
103
- if (!changes['prevent']) {
104
- this.preventSave = false;
105
- this.formControlValue();
106
- this.patchFormValue(changes).then(() => {
107
- this.checkAndFetchRouteInformation(true);
108
- });
109
- }
110
- }
111
- if (!changes) {
112
- this.enableForm = true;
113
- this.preventSave = true;
114
- this.patchFormValue().then(() => {
115
- this.checkAndFetchRouteInformation();
116
- });
117
- }
118
- }
119
- ngOnInit() {
120
- this.formControlValue();
121
- if (this.config.repository === 'customer') {
122
- this.addRouteForm.patchValue({
123
- customer_id: this.customerRepoDetails.customer.id,
124
- customer_name: this.customerRepoDetails.customer.name,
125
- });
126
- }
127
- else {
128
- this.utils.fetchCustomersList().then((res) => {
129
- this.customersList = res;
130
- this.filterCustomerList();
131
- this.addRouteForm.controls['customer_name'].enable();
132
- });
133
- }
134
- }
135
- ngAfterViewInit() {
136
- fromEvent(this.filterPickup.nativeElement, 'keyup').pipe(distinctUntilChanged(), debounceTime(150)).pipe(takeUntil(this.destroyer$)).subscribe(() => {
137
- this.utils.fetchAutoCompleteLocations(this.filterPickup.nativeElement.value).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
138
- this.pickupOptions = res.features;
139
- });
140
- });
141
- fromEvent(this.filterDelivery.nativeElement, 'keyup').pipe(distinctUntilChanged(), debounceTime(150)).pipe(takeUntil(this.destroyer$)).subscribe(() => {
142
- this.utils.fetchAutoCompleteLocations(this.filterDelivery.nativeElement.value).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
143
- this.deliveryOptions = res.features;
144
- });
145
- });
146
- }
147
- formControlValue() {
148
- this.addRouteForm.controls['pickup_location']?.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
149
- if (this.addRouteForm.value.pickup_location && res !== this.addRouteForm.value.pickup_location) {
150
- this.addRouteForm.patchValue({ pickup_lat_lng: '' });
151
- this.addRouteForm.controls['pickup_lat_lng'].markAsTouched();
152
- }
153
- });
154
- this.addRouteForm.controls['delivery_location']?.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
155
- if (this.addRouteForm.value.delivery_location && res !== this.addRouteForm.value.delivery_location) {
156
- this.addRouteForm.patchValue({ delivery_lat_lng: '' });
157
- this.addRouteForm.controls['delivery_lat_lng'].markAsTouched();
158
- }
159
- });
160
- }
161
- formInit() {
162
- this.addRouteForm = new FormGroup({
163
- route_name: new FormControl('', [Validators.required]),
164
- customer_name: new FormControl({ value: '', disabled: true }, [Validators.required]),
165
- customer_id: new FormControl(''),
166
- materials_id: new FormControl('', [Validators.required]),
167
- unit_id: new FormControl('', [Validators.required]),
168
- path: new FormControl('', [Validators.required]),
169
- pickup_location: new FormControl('', [Validators.required]),
170
- pickup_lat_lng: new FormControl('', [Validators.required]),
171
- delivery_location: new FormControl('', [Validators.required]),
172
- delivery_lat_lng: new FormControl('', [Validators.required]),
173
- estimated_distance: new FormControl('', [Validators.required]),
174
- estimated_time: new FormControl('', [Validators.required]),
175
- note: new FormControl('', [Validators.maxLength(2048)]),
176
- trucker_pay_estimate: new FormControl(null),
177
- customer_price_estimate: new FormControl(null),
178
- });
179
- }
180
- async patchFormValue(data) {
181
- this.addRouteForm.reset();
182
- this.addRouteForm.patchValue(data);
183
- if (this.config.repository === 'customer') {
184
- this.addRouteForm.patchValue({
185
- customer_id: this.customerRepoDetails.customer.id,
186
- customer_name: this.customerRepoDetails.customer.name,
187
- });
188
- }
189
- this.routeId = data?.route_id;
190
- this.routeDetails = data ? { pickup_location: data.pickup_location, delivery_location: data.delivery_location } : null;
191
- this.addRouteForm.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe(res => {
192
- if (res) {
193
- if (this.preventInitialSave)
194
- this.preventInitialSave = false;
195
- }
196
- });
197
- this.filterCustomerList();
198
- await true;
199
- }
200
- selectedLongLat(type, event) {
201
- if (type === 'pickup') {
202
- this.addRouteForm.patchValue({
203
- pickup_lat_lng: (event.geometry.coordinates[1] + ',' + event.geometry.coordinates[0]).toString()
204
- });
205
- this.coolMapService.clearBoundWithCordinates();
206
- }
207
- else if (type === 'delivery') {
208
- this.addRouteForm.patchValue({
209
- delivery_lat_lng: (event.geometry.coordinates[1] + ',' + event.geometry.coordinates[0]).toString()
210
- });
211
- }
212
- this.checkAndFetchRouteInformation();
213
- }
214
- checkAndFetchRouteInformation(isinitial) {
215
- if (this.addRouteForm.value?.delivery_lat_lng?.length > 0 && this.addRouteForm.value?.pickup_lat_lng?.length > 0 && this.addRouteForm.value.unit_id) {
216
- let unit = this.unitsList.find((x) => x.id === this.addRouteForm.value.unit_id);
217
- const param = {
218
- delivery_lat_lng: this.addRouteForm.value.delivery_lat_lng,
219
- pickup_lat_lng: this.addRouteForm.value.pickup_lat_lng,
220
- unit: unit?.type
221
- };
222
- this.utils.postdata('calculate/routes/estimation', param).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
223
- if (res && res['path']) {
224
- this.addRouteForm.patchValue({
225
- estimated_distance: res['dist'],
226
- estimated_time: res['time'],
227
- path: res['path'],
228
- trucker_pay_estimate: res['trucker_haul_cost'],
229
- customer_price_estimate: (+(+res['trucker_haul_cost'] / 0.80).toFixed(2))
230
- });
231
- let path = res['path'].split(';');
232
- path = path.map((ele) => { return ele = this.formateLatLong(ele); });
233
- res['path'] = path;
234
- const element = {
235
- type: 'FeatureCollection',
236
- features: [{ type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates: res['path'] } }]
237
- };
238
- this.coolMapService.removeRouteAndMarker(1).then(() => {
239
- const unit = this.unitsList.find((x) => x.id === this.addRouteForm.value.unit_id);
240
- const materialDetails = this.materialsList.find((x) => x.sub_material_id === this.addRouteForm.value.materials_id);
241
- this.coolMapService.loadMapProperty(element, 1, unit?.type, {
242
- pickup_location: this.addRouteForm.get('pickup_location')?.value,
243
- delivery_location: this.addRouteForm.get('delivery_location')?.value,
244
- route_name: this.addRouteForm.get('route_name')?.value,
245
- materialLabel: materialDetails?.label,
246
- unit: unit?.type
247
- }).then((res) => { this.preventSave = true; });
248
- });
249
- }
250
- else {
251
- this.coolMapService.removeRouteAndMarker(1);
252
- this.utils.openSnackBar(res['status'], 'error');
253
- }
254
- if (this.routeId && isinitial)
255
- this.preventInitialSave = true;
256
- });
257
- }
258
- else {
259
- this.coolMapService.removeRouteAndMarker(1);
260
- }
261
- }
262
- formateLatLong(latlong) { return latlong ? latlong.split(',').map(x => +x).reverse() : null; }
263
- saveRoute() {
264
- if (this.addRouteForm.valid) {
265
- this.preventSave = false;
266
- const data = this.addRouteForm.getRawValue();
267
- const url = this.routeId ? this.utils.postdata('update/routes', data) : this.utils.postdata('add/routes', data);
268
- if (this.routeId)
269
- data['id'] = this.routeId;
270
- url.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
271
- if (res.success) {
272
- this.updateRouteList.emit(true);
273
- this.utils.openSnackBar(res.message, 'success');
274
- this.preventInitialSave = true;
275
- this.preventSave = true;
276
- if (!this.routeId)
277
- this.changeNav.next('Addroute');
278
- }
279
- else {
280
- this.utils.openSnackBar(res.message, 'error');
281
- this.preventSave = true;
282
- }
283
- }, (err) => { if (err) {
284
- this.preventSave = true;
285
- } });
286
- }
287
- else {
288
- this.addRouteForm.markAllAsTouched();
289
- }
290
- }
291
- deleteRoute() {
292
- this.preventSave = false;
293
- this.utils.postdata('delete/routes', { uuid: this.routeId }).subscribe(res => {
294
- if (res['data']['success']) {
295
- this.utils.openSnackBar(res['data']['message'], 'success');
296
- this.updateRouteList.emit(true);
297
- this.changeNav.next('Addroute');
298
- this.preventInitialSave = true;
299
- this.preventSave = true;
300
- }
301
- else {
302
- this.utils.openSnackBar('Somthing went wrong', 'error');
303
- this.preventSave = true;
304
- }
305
- }, (err) => { this.preventSave = true; });
306
- }
307
- ngOnDestroy() {
308
- this.destroyer$.next(true);
309
- this.destroyer$.unsubscribe();
310
- }
311
- }
312
- AddRouteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AddRouteComponent, deps: [{ token: i1.CoolmapService }, { token: i1.UtilsService }, { token: i2.MatDialog }, { token: 'memberData' }], target: i0.ɵɵFactoryTarget.Component });
313
- AddRouteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: AddRouteComponent, selector: "app-add-route", inputs: { routeData: "routeData", customerRepoDetails: "customerRepoDetails" }, outputs: { changeNav: "changeNav", updateRouteList: "updateRouteList" }, viewQueries: [{ propertyName: "filterPickup", first: true, predicate: ["filterPickup"], descendants: true }, { propertyName: "filterDelivery", first: true, predicate: ["filterDelivery"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"addroutebox\">\r\n <div class=\"routedetailbox\" *ngIf=\"enablePopUp\">\r\n <div class=\"closebtnroutedetail\">\r\n <mat-icon (click)=\"prevantPopupClose = false; enablePopUp = false;\">clear</mat-icon>\r\n </div>\r\n <lib-route-info-card [propData]=\"{className: 'routeCard', repository: config['repository']}\" [popupData]=\"popupDetails\"></lib-route-info-card>\r\n <div class=\"createTxt\">\r\n <small>\r\n Created by {{popupDetails['created_by_name']}} on {{popupDetails['created_at']}}\r\n </small>\r\n <button class=\"editbtn\" (click)=\"editEvent()\">Edit</button>\r\n </div>\r\n </div>\r\n <div class=\"add_add_route_box\" cdkDrag [style.visibility]=\"!enableForm ? 'hidden' : 'visible'\">\r\n <div class=\"topheadingprt\">\r\n <h2> {{routeId? 'EDIT' : 'ADD'}} ROUTE </h2>\r\n <div class=\"buttonprt\">\r\n <button *ngIf=\"routeId\" class=\"delbtn\" (click)=\"openDialog()\">Delete</button>\r\n <button mat-raised-button type=\"submit\" class=\"closebtn\" (click)=\"changeNav.next('Addroute')\">Close</button>\r\n </div>\r\n </div>\r\n <form [formGroup]=\"addRouteForm\">\r\n <div class=\"route_form_area\">\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Route Name</mat-label>\r\n <input matInput formControlName=\"route_name\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-error *ngIf=\"addRouteForm.controls['route_name'].hasError('required')\">\r\n Route Name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <input type=\"text\" placeholder=\"Customer Name\" matInput formControlName=\"customer_name\" [matAutocomplete]=\"auto\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let customer of customersList$ | async\" [value]=\"customer['customer_name']\">\r\n {{customer['customer_name']}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"addRouteForm.controls['customer_name'].hasError('required')\">\r\n Customer name is required.\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Pickup</mat-label>\r\n <input type=\"text\" placeholder=\"Search...\" matInput #filterPickup [matAutocomplete]=\"pickupAutocomplete\"\r\n formControlName=\"pickup_location\" (mousedown)=\"$event.stopPropagation()\">\r\n\r\n <mat-autocomplete #pickupAutocomplete=\"matAutocomplete\">\r\n <mat-option (click)=\"selectedLongLat('pickup', option)\" *ngFor=\"let option of pickupOptions\"\r\n [value]=\"option?.place_name\">\r\n {{option?.place_name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n <mat-error *ngIf=\"addRouteForm.controls['pickup_lat_lng'].touched && addRouteForm.controls['pickup_lat_lng'].hasError('required')\">\r\n Please select pickup location from the list.\r\n </mat-error>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Delivery</mat-label>\r\n <input type=\"text\" placeholder=\"Search...\" matInput #filterDelivery [matAutocomplete]=\"deliveryAutocomplete\"\r\n formControlName=\"delivery_location\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-autocomplete #deliveryAutocomplete=\"matAutocomplete\">\r\n <mat-option (click)=\"selectedLongLat('delivery', option)\" *ngFor=\"let option of deliveryOptions\"\r\n [value]=\"option?.place_name\">\r\n {{option?.place_name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n <mat-error *ngIf=\"addRouteForm.controls['delivery_lat_lng'].touched && addRouteForm.controls['delivery_lat_lng'].hasError('required')\">\r\n Please select delivery location from the list.\r\n </mat-error>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Notes</mat-label>\r\n <textarea style=\"height: 18px; resize: none;\" matInput name=\"\" id=\"\" cols=\"30\" rows=\"10\" formControlName=\"note\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\"></textarea>\r\n <mat-error *ngIf=\"addRouteForm.controls['note'].hasError('maxlength')\">\r\n Notes should be within 2048 characters.\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"col-6 d-flex\">\r\n <div class=\"inputbox m-0\">\r\n <mat-form-field>\r\n <mat-label>Unit type</mat-label>\r\n <mat-select formControlName=\"unit_id\" (selectionChange)=\"checkAndFetchRouteInformation()\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-option *ngFor=\"let unit of unitsList\" [value]=\"unit?.id\"> {{unit?.type}} </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"addRouteForm.controls['unit_id'].hasError('required')\">\r\n Unit is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"inputbox m-0\">\r\n <mat-form-field>\r\n <mat-label>Material</mat-label>\r\n <mat-select formControlName=\"materials_id\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-option *ngFor=\"let material of materialsList\" [value]=\"config.repository === 'coolmap' ? material?.material_id : material?.sub_material_id\"> {{config.repository === 'coolmap' ? material?.material : material?.label}}\r\n </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"addRouteForm.controls['materials_id'].hasError('required')\">\r\n Meterial is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-6\">\r\n <app-estimation-display *ngIf=\"addRouteForm?.value?.pickup_lat_lng && addRouteForm?.value?.delivery_lat_lng\" [value]=\"addRouteForm['value']\"></app-estimation-display>\r\n </div>\r\n <div class=\"col-6\" *ngIf=\"addRouteForm['value']['trucker_pay_estimate'] && addRouteForm['value']['customer_price_estimate']\">\r\n <span *ngIf=\"config['repository'] !== 'customer'\" class=\"estimate\" (mousedown)=\"$event.stopPropagation()\">\r\n Trucker Pay Estimate - <b>{{'$'+ addRouteForm['value']['trucker_pay_estimate']}}</b>\r\n </span>\r\n <span class=\"estimate\" (mousedown)=\"$event.stopPropagation()\">\r\n Customer Price Estimate - <b>{{'$'+ addRouteForm['value']['customer_price_estimate']}}</b>\r\n </span>\r\n </div>\r\n <button mat-raised-button type=\"submit\" (click)=\"saveRoute()\" *ngIf=\"preventSave\"\r\n [disabled]=\"addRouteForm.invalid && preventSave || preventInitialSave\">{{routeId? 'Update' : 'Save'}}\r\n </button>\r\n <div class=\"loader\">\r\n <mat-spinner *ngIf=\"!preventSave\"></mat-spinner>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n", styles: [".addroutebox{width:calc(100% - 315px);position:absolute;left:300px;bottom:10px;z-index:999;display:flex;justify-content:space-between;align-items:flex-start}.addroutebox .routedetailbox{max-width:300px;padding:10px;background-color:#fff;border-radius:20px;margin-right:20px}@media (min-width: 1600px){.addroutebox .routedetailbox{max-width:280px}}.addroutebox .editbtn{background:#326ad3;padding:10px 25px;color:#fff;font-size:.8125rem;border-radius:30px;float:right}.add_add_route_box{background:white;padding:10px 20px;border-radius:20px;box-shadow:2px 4px 4px 2px #00000024;height:370px;width:100%;position:relative;cursor:move}.add_add_route_box .route_form_area{display:flex;flex-wrap:wrap;justify-content:space-between}.add_add_route_box .route_form_area .col-6{width:48%;margin-top:15px;justify-content:space-between}.add_add_route_box .route_form_area .col-6 .inputbox{width:47%}.add_add_route_box .route_form_area .col-6 span{font-size:.875rem}.add_add_route_box .route_form_area button{background:#326ad3;padding:0 18px;color:#fff;font-size:.8125rem;border-radius:30px;position:absolute;right:18px;top:20px;height:35px}.closebtn{background:black;color:#fff;border-radius:30px;padding:0 18px;margin-left:10px;height:35px}.delbtn{background:red;color:#fff;border-radius:30px;padding:10px 18px}.add_route_listingpart .listing_toggle{background:white;border-radius:15px;padding:8px 10px;position:absolute;right:10px;top:30px;cursor:pointer}.listing_box{background:#282828;height:100vh;position:fixed;right:0;top:0;z-index:1111;box-shadow:-3px 0 5px #ffffff14;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;width:0;border-radius:40px 0 0 40px;opacity:0}.listing_box .closebtn{display:none}.show .listing_box{width:250px;max-width:250px;flex:0 0 250px;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;padding:40px 0 40px 20px;opacity:1}@media (min-width: 1600px){.show .listing_box{width:320px;max-width:320px;flex:0 0 320px}}.show .listing_box h2{color:#fff;white-space:nowrap}.show .listing_box ul{padding:0 20px 0 0}.show .listing_box ul li{background:#4a4a4a;padding:15px;border-radius:15px;display:flex;margin-bottom:15px}.show .listing_box ul li .companayIcon{width:40px;height:40px;border-radius:10px;background:white;margin-right:10px;display:flex;justify-content:center;align-items:center}.show .listing_box ul li .company_cont{width:calc(100% - 50px)}.show .listing_box ul li .company_cont h3{color:#fff;font-size:15px;font-weight:400;margin:0;text-overflow:ellipsis;max-width:129px;-webkit-box-orient:vertical;white-space:nowrap;overflow:hidden}@media (min-width: 1600px){.show .listing_box ul li .company_cont h3{max-width:170px}}.show .listing_box ul li .company_cont p{color:#bcbcbc;font-size:12px;margin:5px 0;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:16px}.show .closebtn{position:absolute;left:-33px;top:50px;background:#282828;color:#fff;padding:8px;border-top-left-radius:15px;border-bottom-left-radius:15px;cursor:pointer;box-shadow:-4px 2px 5px #ffffff14;display:block}.loader{position:absolute;width:95%;height:100%;display:flex;justify-content:center;align-items:center;pointer-events:none}.buttonprt{margin-right:83px}.closebtnroutedetail{box-shadow:0 0 5px #0000001c;border-radius:100%;width:30px;height:30px;display:flex;justify-content:center;align-items:center;cursor:pointer;background:#fff;position:absolute;top:-11px;left:-11px}.routenotes{max-height:170px;overflow:auto}.estimate{margin-right:20px;font-size:.7rem}@media (min-width: 1600px){.estimate{font-size:.95rem}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i11.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i12.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i13.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i14.EstimationDisplayComponent, selector: "app-estimation-display", inputs: ["value"] }, { kind: "component", type: i15.RouteInfoCardComponent, selector: "lib-route-info-card", inputs: ["popupData", "propData"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] });
314
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AddRouteComponent, decorators: [{
315
- type: Component,
316
- args: [{ selector: 'app-add-route', template: "<div class=\"addroutebox\">\r\n <div class=\"routedetailbox\" *ngIf=\"enablePopUp\">\r\n <div class=\"closebtnroutedetail\">\r\n <mat-icon (click)=\"prevantPopupClose = false; enablePopUp = false;\">clear</mat-icon>\r\n </div>\r\n <lib-route-info-card [propData]=\"{className: 'routeCard', repository: config['repository']}\" [popupData]=\"popupDetails\"></lib-route-info-card>\r\n <div class=\"createTxt\">\r\n <small>\r\n Created by {{popupDetails['created_by_name']}} on {{popupDetails['created_at']}}\r\n </small>\r\n <button class=\"editbtn\" (click)=\"editEvent()\">Edit</button>\r\n </div>\r\n </div>\r\n <div class=\"add_add_route_box\" cdkDrag [style.visibility]=\"!enableForm ? 'hidden' : 'visible'\">\r\n <div class=\"topheadingprt\">\r\n <h2> {{routeId? 'EDIT' : 'ADD'}} ROUTE </h2>\r\n <div class=\"buttonprt\">\r\n <button *ngIf=\"routeId\" class=\"delbtn\" (click)=\"openDialog()\">Delete</button>\r\n <button mat-raised-button type=\"submit\" class=\"closebtn\" (click)=\"changeNav.next('Addroute')\">Close</button>\r\n </div>\r\n </div>\r\n <form [formGroup]=\"addRouteForm\">\r\n <div class=\"route_form_area\">\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Route Name</mat-label>\r\n <input matInput formControlName=\"route_name\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-error *ngIf=\"addRouteForm.controls['route_name'].hasError('required')\">\r\n Route Name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <input type=\"text\" placeholder=\"Customer Name\" matInput formControlName=\"customer_name\" [matAutocomplete]=\"auto\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let customer of customersList$ | async\" [value]=\"customer['customer_name']\">\r\n {{customer['customer_name']}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"addRouteForm.controls['customer_name'].hasError('required')\">\r\n Customer name is required.\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Pickup</mat-label>\r\n <input type=\"text\" placeholder=\"Search...\" matInput #filterPickup [matAutocomplete]=\"pickupAutocomplete\"\r\n formControlName=\"pickup_location\" (mousedown)=\"$event.stopPropagation()\">\r\n\r\n <mat-autocomplete #pickupAutocomplete=\"matAutocomplete\">\r\n <mat-option (click)=\"selectedLongLat('pickup', option)\" *ngFor=\"let option of pickupOptions\"\r\n [value]=\"option?.place_name\">\r\n {{option?.place_name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n <mat-error *ngIf=\"addRouteForm.controls['pickup_lat_lng'].touched && addRouteForm.controls['pickup_lat_lng'].hasError('required')\">\r\n Please select pickup location from the list.\r\n </mat-error>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Delivery</mat-label>\r\n <input type=\"text\" placeholder=\"Search...\" matInput #filterDelivery [matAutocomplete]=\"deliveryAutocomplete\"\r\n formControlName=\"delivery_location\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-autocomplete #deliveryAutocomplete=\"matAutocomplete\">\r\n <mat-option (click)=\"selectedLongLat('delivery', option)\" *ngFor=\"let option of deliveryOptions\"\r\n [value]=\"option?.place_name\">\r\n {{option?.place_name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n <mat-error *ngIf=\"addRouteForm.controls['delivery_lat_lng'].touched && addRouteForm.controls['delivery_lat_lng'].hasError('required')\">\r\n Please select delivery location from the list.\r\n </mat-error>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Notes</mat-label>\r\n <textarea style=\"height: 18px; resize: none;\" matInput name=\"\" id=\"\" cols=\"30\" rows=\"10\" formControlName=\"note\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\"></textarea>\r\n <mat-error *ngIf=\"addRouteForm.controls['note'].hasError('maxlength')\">\r\n Notes should be within 2048 characters.\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"col-6 d-flex\">\r\n <div class=\"inputbox m-0\">\r\n <mat-form-field>\r\n <mat-label>Unit type</mat-label>\r\n <mat-select formControlName=\"unit_id\" (selectionChange)=\"checkAndFetchRouteInformation()\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-option *ngFor=\"let unit of unitsList\" [value]=\"unit?.id\"> {{unit?.type}} </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"addRouteForm.controls['unit_id'].hasError('required')\">\r\n Unit is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"inputbox m-0\">\r\n <mat-form-field>\r\n <mat-label>Material</mat-label>\r\n <mat-select formControlName=\"materials_id\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-option *ngFor=\"let material of materialsList\" [value]=\"config.repository === 'coolmap' ? material?.material_id : material?.sub_material_id\"> {{config.repository === 'coolmap' ? material?.material : material?.label}}\r\n </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"addRouteForm.controls['materials_id'].hasError('required')\">\r\n Meterial is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-6\">\r\n <app-estimation-display *ngIf=\"addRouteForm?.value?.pickup_lat_lng && addRouteForm?.value?.delivery_lat_lng\" [value]=\"addRouteForm['value']\"></app-estimation-display>\r\n </div>\r\n <div class=\"col-6\" *ngIf=\"addRouteForm['value']['trucker_pay_estimate'] && addRouteForm['value']['customer_price_estimate']\">\r\n <span *ngIf=\"config['repository'] !== 'customer'\" class=\"estimate\" (mousedown)=\"$event.stopPropagation()\">\r\n Trucker Pay Estimate - <b>{{'$'+ addRouteForm['value']['trucker_pay_estimate']}}</b>\r\n </span>\r\n <span class=\"estimate\" (mousedown)=\"$event.stopPropagation()\">\r\n Customer Price Estimate - <b>{{'$'+ addRouteForm['value']['customer_price_estimate']}}</b>\r\n </span>\r\n </div>\r\n <button mat-raised-button type=\"submit\" (click)=\"saveRoute()\" *ngIf=\"preventSave\"\r\n [disabled]=\"addRouteForm.invalid && preventSave || preventInitialSave\">{{routeId? 'Update' : 'Save'}}\r\n </button>\r\n <div class=\"loader\">\r\n <mat-spinner *ngIf=\"!preventSave\"></mat-spinner>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n", styles: [".addroutebox{width:calc(100% - 315px);position:absolute;left:300px;bottom:10px;z-index:999;display:flex;justify-content:space-between;align-items:flex-start}.addroutebox .routedetailbox{max-width:300px;padding:10px;background-color:#fff;border-radius:20px;margin-right:20px}@media (min-width: 1600px){.addroutebox .routedetailbox{max-width:280px}}.addroutebox .editbtn{background:#326ad3;padding:10px 25px;color:#fff;font-size:.8125rem;border-radius:30px;float:right}.add_add_route_box{background:white;padding:10px 20px;border-radius:20px;box-shadow:2px 4px 4px 2px #00000024;height:370px;width:100%;position:relative;cursor:move}.add_add_route_box .route_form_area{display:flex;flex-wrap:wrap;justify-content:space-between}.add_add_route_box .route_form_area .col-6{width:48%;margin-top:15px;justify-content:space-between}.add_add_route_box .route_form_area .col-6 .inputbox{width:47%}.add_add_route_box .route_form_area .col-6 span{font-size:.875rem}.add_add_route_box .route_form_area button{background:#326ad3;padding:0 18px;color:#fff;font-size:.8125rem;border-radius:30px;position:absolute;right:18px;top:20px;height:35px}.closebtn{background:black;color:#fff;border-radius:30px;padding:0 18px;margin-left:10px;height:35px}.delbtn{background:red;color:#fff;border-radius:30px;padding:10px 18px}.add_route_listingpart .listing_toggle{background:white;border-radius:15px;padding:8px 10px;position:absolute;right:10px;top:30px;cursor:pointer}.listing_box{background:#282828;height:100vh;position:fixed;right:0;top:0;z-index:1111;box-shadow:-3px 0 5px #ffffff14;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;width:0;border-radius:40px 0 0 40px;opacity:0}.listing_box .closebtn{display:none}.show .listing_box{width:250px;max-width:250px;flex:0 0 250px;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;padding:40px 0 40px 20px;opacity:1}@media (min-width: 1600px){.show .listing_box{width:320px;max-width:320px;flex:0 0 320px}}.show .listing_box h2{color:#fff;white-space:nowrap}.show .listing_box ul{padding:0 20px 0 0}.show .listing_box ul li{background:#4a4a4a;padding:15px;border-radius:15px;display:flex;margin-bottom:15px}.show .listing_box ul li .companayIcon{width:40px;height:40px;border-radius:10px;background:white;margin-right:10px;display:flex;justify-content:center;align-items:center}.show .listing_box ul li .company_cont{width:calc(100% - 50px)}.show .listing_box ul li .company_cont h3{color:#fff;font-size:15px;font-weight:400;margin:0;text-overflow:ellipsis;max-width:129px;-webkit-box-orient:vertical;white-space:nowrap;overflow:hidden}@media (min-width: 1600px){.show .listing_box ul li .company_cont h3{max-width:170px}}.show .listing_box ul li .company_cont p{color:#bcbcbc;font-size:12px;margin:5px 0;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:16px}.show .closebtn{position:absolute;left:-33px;top:50px;background:#282828;color:#fff;padding:8px;border-top-left-radius:15px;border-bottom-left-radius:15px;cursor:pointer;box-shadow:-4px 2px 5px #ffffff14;display:block}.loader{position:absolute;width:95%;height:100%;display:flex;justify-content:center;align-items:center;pointer-events:none}.buttonprt{margin-right:83px}.closebtnroutedetail{box-shadow:0 0 5px #0000001c;border-radius:100%;width:30px;height:30px;display:flex;justify-content:center;align-items:center;cursor:pointer;background:#fff;position:absolute;top:-11px;left:-11px}.routenotes{max-height:170px;overflow:auto}.estimate{margin-right:20px;font-size:.7rem}@media (min-width: 1600px){.estimate{font-size:.95rem}}\n"] }]
317
- }], ctorParameters: function () { return [{ type: i1.CoolmapService }, { type: i1.UtilsService }, { type: i2.MatDialog }, { type: i1.CoolmapConfigModel, decorators: [{
318
- type: Inject,
319
- args: ['memberData']
320
- }] }]; }, propDecorators: { filterPickup: [{
321
- type: ViewChild,
322
- args: ['filterPickup']
323
- }], filterDelivery: [{
324
- type: ViewChild,
325
- args: ['filterDelivery']
326
- }], changeNav: [{
327
- type: Output
328
- }], updateRouteList: [{
329
- type: Output
330
- }], routeData: [{
331
- type: Input
332
- }], customerRepoDetails: [{
333
- type: Input
334
- }] } });
335
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXJvdXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAvc3JjL2xpYi9jb21wb25lbnQvYWRkLXJvdXRlL2FkZC1yb3V0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb29sbWFwL3NyYy9saWIvY29tcG9uZW50L2FkZC1yb3V0ZS9hZGQtcm91dGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkosT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFjLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3JILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRcEUsTUFBTSxPQUFPLGlCQUFpQjtJQXlCNUIsWUFBbUIsY0FBOEIsRUFBUyxLQUFtQixFQUFTLE1BQWlCLEVBQ3hFLE1BQTBCO1FBRHRDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFTLFVBQUssR0FBTCxLQUFLLENBQWM7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ3hFLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBdkJ4QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN2QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDL0Qsa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFDeEIsb0JBQWUsR0FBUSxFQUFFLENBQUM7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UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7OzhHQXZSVSxpQkFBaUIscUdBMEJsQixZQUFZO2tHQTFCWCxpQkFBaUIsb2JDYjlCLDI5T0F1SUE7MkZEMUhhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxlQUFlOzswQkE4QnRCLE1BQU07MkJBQUMsWUFBWTs0Q0F6QlksWUFBWTtzQkFBN0MsU0FBUzt1QkFBQyxjQUFjO2dCQUNXLGNBQWM7c0JBQWpELFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNWLFNBQVM7c0JBQXpCLE1BQU07Z0JBQ1UsZUFBZTtzQkFBL0IsTUFBTTtnQkFRUyxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLG1CQUFtQjtzQkFBbEMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25Jbml0LCBWaWV3Q2hpbGQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsIElucHV0LCBPbkRlc3Ryb3ksIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmcm9tRXZlbnQsIG1hcCwgT2JzZXJ2YWJsZSwgc3RhcnRXaXRoLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQ29vbG1hcENvbmZpZ01vZGVsLCBDb29sbWFwU2VydmljZSwgQ3VzdG9tZXJSZXBvRGV0YWlsc01vZGVsLCBSb3V0ZSwgVXRpbHNTZXJ2aWNlIH0gZnJvbSAnQGFnZ2RpcmVjdC9jb29sbWFwLXNlcnZpY2VzJztcclxuaW1wb3J0IHsgRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vc2hhcmVkL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50JztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1hZGQtcm91dGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtcm91dGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FkZC1yb3V0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGRSb3V0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlclBpY2t1cCcpIHB1YmxpYyBmaWx0ZXJQaWNrdXAhOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlckRlbGl2ZXJ5JykgcHVibGljIGZpbHRlckRlbGl2ZXJ5ITogRWxlbWVudFJlZjtcclxuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZU5hdiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgdXBkYXRlUm91dGVMaXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIHBpY2t1cE9wdGlvbnM6IGFueSA9IFtdO1xyXG4gIGRlbGl2ZXJ5T3B0aW9uczogYW55ID0gW107XHJcbiAgcmVxdWVzdFBhcm1zRm9yUm91dGVEZXRhaWxzID0geyBwaWNrdXBfbGF0X2xuZzogJycsIGRlbGl2ZXJ5X2xhdF9sbmc6ICcnIH1cclxuICBjdXN0b21lcnNMaXN0OiBhbnkgPSBbXTtcclxuICB1bml0c0xpc3Q6IGFueSA9IFtdO1xyXG4gIG1hdGVyaWFsc0xpc3Q6IGFueSA9IFtdO1xyXG4gIGFkZFJvdXRlRm9ybSE6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBwdWJsaWMgcm91dGVEYXRhITogUm91dGU7XHJcbiAgQElucHV0KCkgcHVibGljIGN1c3RvbWVyUmVwb0RldGFpbHMhOiBDdXN0b21lclJlcG9EZXRhaWxzTW9kZWw7XHJcbiAgcm91dGVJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuICBwcmV2ZW50U2F2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByZXZlbnRJbml0aWFsU2F2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGN1c3RvbWVyc0xpc3QkITogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIHJvdXRlRGV0YWlscyE6IHsgcGlja3VwX2xvY2F0aW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkOyBkZWxpdmVyeV9sb2NhdGlvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDsgfSB8IG51bGw7XHJcbiAgcHVibGljIGRlc3Ryb3llciQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHBvcHVwRGV0YWlsczogUm91dGU7XHJcbiAgZW5hYmxlUG9wVXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcmV2YW50UG9wdXBDbG9zZSA9IGZhbHNlO1xyXG4gIGVuYWJsZUZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGNvb2xNYXBTZXJ2aWNlOiBDb29sbWFwU2VydmljZSwgcHVibGljIHV0aWxzOiBVdGlsc1NlcnZpY2UsIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIEBJbmplY3QoJ21lbWJlckRhdGEnKSBwdWJsaWMgY29uZmlnOiBDb29sbWFwQ29uZmlnTW9kZWwpIHsgICAgICBcclxuICAgIGlmICh0aGlzLmNvbmZpZy5yZXBvc2l0b3J5ID09PSAnY3VzdG9tZXInKSB7XHJcbiAgICAgIHRoaXMudXRpbHMuZmV0Y2hNYXRlcmlhbHNMaXN0Rm9yQ3VzdG9tZXIoKS50aGVuKChyZXMpPT57ICAgICAgICBcclxuICAgICAgICB0aGlzLm1hdGVyaWFsc0xpc3QgPSByZXM7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51dGlscy5mZXRjaE1hdGVyaWFsc0xpc3QoKS50aGVuKChyZXMpPT57XHJcbiAgICAgICAgdGhpcy5tYXRlcmlhbHNMaXN0ID0gcmVzO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgXHJcbiAgICB0aGlzLnV0aWxzLmZldGNoVW5pdHNMaXN0KCkudGhlbigocmVzKT0+e1xyXG4gICAgICB0aGlzLnVuaXRzTGlzdCA9IHJlcztcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mb3JtSW5pdCgpO1xyXG4gICAgdGhpcy51dGlscy5nZXRyb3V0ZURldGFpbHNVdGlsaXR5LnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgaWYgKHJlc1snZXZlbnQnXSAhPT0gJ2NsaWNrJyAmJiAhdGhpcy5wcmV2YW50UG9wdXBDbG9zZSkgeyB0aGlzLmVuYWJsZVBvcFVwID0gcmVzWydldmVudCddIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmVuYWJsZVBvcFVwICYmICF0aGlzLnByZXZhbnRQb3B1cENsb3NlKSB7IHRoaXMucHJldmFudFBvcHVwQ2xvc2UgPSB0cnVlOyB9XHJcbiAgICAgICAgaWYgKHJlc1snZXZlbnQnXSAhPT0gJ2NsaWNrJyAmJiAhcmVzWydldmVudCddICYmIHRoaXMucHJldmFudFBvcHVwQ2xvc2UpIHtcclxuICAgICAgICAgIHRoaXMucG9wdXBEZXRhaWxzID0gdGhpcy51dGlscy5nZXRkaWN0VmFsdWUoJ3JvdXRlLWRldGFpbHN2MicpO1xyXG4gICAgICAgIH0gZWxzZSB7IHRoaXMucG9wdXBEZXRhaWxzID0gcmVzWydyb3V0ZSddIH1cclxuICAgICAgICBpZiAodGhpcy5lbmFibGVQb3BVcCkgdGhpcy5wb3B1cERldGFpbHNbJ2NyZWF0ZWRfYXQnXSA9IHRoaXMudXRpbHMuZ2V0RGF0ZUZvcm1hdChuZXcgRGF0ZSh0aGlzLnBvcHVwRGV0YWlsc1snY3JlYXRlZF9hdCddKSwgJy8nKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGZpbHRlckN1c3RvbWVyTGlzdCgpIHtcclxuICAgIHRoaXMuY3VzdG9tZXJzTGlzdCQgPSB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1snY3VzdG9tZXJfbmFtZSddLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICBzdGFydFdpdGgoJycpLFxyXG4gICAgICBtYXAodmFsdWUgPT4gdGhpcy5fZmlsdGVyKHZhbHVlIHx8ICcnKSksXHJcbiAgICApO1xyXG4gIH1cclxuICBwdWJsaWMgX2ZpbHRlcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tZXJzTGlzdC5maWx0ZXIoKG9wdGlvbjogYW55KSA9PiBvcHRpb25bJ2N1c3RvbWVyX25hbWUnXS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSk7XHJcbiAgfVxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydyb3V0ZURhdGEnXSAmJiAhY2hhbmdlc1sncm91dGVEYXRhJ11bJ2N1cnJlbnRWYWx1ZSddKSB0aGlzLmluSXQobnVsbCk7XHJcbiAgfVxyXG4gIG9wZW5EaWFsb2coKTogdm9pZCB7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7IGJvZHk6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgcm91dGU/JyB9LFxyXG4gICAgfSk7XHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHsgaWYgKHJlcykgeyB0aGlzLmRlbGV0ZVJvdXRlKCkgfSB9KTtcclxuICB9XHJcbiAgZWRpdEV2ZW50KCkge1xyXG4gICAgdGhpcy5wcmV2YW50UG9wdXBDbG9zZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5lbmFibGVGb3JtID0gdHJ1ZTsgdGhpcy5lbmFibGVQb3BVcCA9IGZhbHNlO1xyXG4gICAgdGhpcy5wb3B1cERldGFpbHNbJ3ByZXZlbnQnXSA9IGZhbHNlO1xyXG4gICAgdGhpcy51dGlscy5yZW1vdmVNYXBFbnRpdHkubmV4dCh0aGlzLnBvcHVwRGV0YWlscyk7XHJcbiAgICB0aGlzLmluSXQodGhpcy5wb3B1cERldGFpbHMpO1xyXG4gIH1cclxuICBpbkl0KGNoYW5nZXM6IFJvdXRlKSB7XHJcbiAgICBpZiAoY2hhbmdlcykge1xyXG4gICAgICBpZiAoIWNoYW5nZXNbJ3ByZXZlbnQnXSkge1xyXG4gICAgICAgIHRoaXMucHJldmVudFNhdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sVmFsdWUoKTtcclxuICAgICAgICB0aGlzLnBhdGNoRm9ybVZhbHVlKGNoYW5nZXMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jaGVja0FuZEZldGNoUm91dGVJbmZvcm1hdGlvbih0cnVlKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIWNoYW5nZXMpIHtcclxuICAgICAgdGhpcy5lbmFibGVGb3JtID0gdHJ1ZTsgdGhpcy5wcmV2ZW50U2F2ZSA9IHRydWU7XHJcbiAgICAgIHRoaXMucGF0Y2hGb3JtVmFsdWUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrQW5kRmV0Y2hSb3V0ZUluZm9ybWF0aW9uKClcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbFZhbHVlKCk7XHJcbiAgICBpZiAodGhpcy5jb25maWcucmVwb3NpdG9yeSA9PT0gJ2N1c3RvbWVyJykge1xyXG4gICAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICBjdXN0b21lcl9pZDogdGhpcy5jdXN0b21lclJlcG9EZXRhaWxzLmN1c3RvbWVyLmlkLFxyXG4gICAgICAgIGN1c3RvbWVyX25hbWU6IHRoaXMuY3VzdG9tZXJSZXBvRGV0YWlscy5jdXN0b21lci5uYW1lLFxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51dGlscy5mZXRjaEN1c3RvbWVyc0xpc3QoKS50aGVuKChyZXMpPT57XHJcbiAgICAgICAgdGhpcy5jdXN0b21lcnNMaXN0ID0gcmVzOyB0aGlzLmZpbHRlckN1c3RvbWVyTGlzdCgpOyB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1snY3VzdG9tZXJfbmFtZSddLmVuYWJsZSgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGZyb21FdmVudCh0aGlzLmZpbHRlclBpY2t1cC5uYXRpdmVFbGVtZW50LCAna2V5dXAnKS5waXBlKFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBkZWJvdW5jZVRpbWUoMTUwKSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLnV0aWxzLmZldGNoQXV0b0NvbXBsZXRlTG9jYXRpb25zKHRoaXMuZmlsdGVyUGlja3VwLm5hdGl2ZUVsZW1lbnQudmFsdWUpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMucGlja3VwT3B0aW9ucyA9IHJlcy5mZWF0dXJlcztcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgZnJvbUV2ZW50KHRoaXMuZmlsdGVyRGVsaXZlcnkubmF0aXZlRWxlbWVudCwgJ2tleXVwJykucGlwZShcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDE1MCkpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy51dGlscy5mZXRjaEF1dG9Db21wbGV0ZUxvY2F0aW9ucyh0aGlzLmZpbHRlckRlbGl2ZXJ5Lm5hdGl2ZUVsZW1lbnQudmFsdWUpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGVsaXZlcnlPcHRpb25zID0gcmVzLmZlYXR1cmVzO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGZvcm1Db250cm9sVmFsdWUoKSB7XHJcbiAgICB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1sncGlja3VwX2xvY2F0aW9uJ10/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5waWNrdXBfbG9jYXRpb24gJiYgcmVzICE9PSB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5waWNrdXBfbG9jYXRpb24pIHtcclxuICAgICAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKHsgcGlja3VwX2xhdF9sbmc6ICcnIH0pO1xyXG4gICAgICAgIHRoaXMuYWRkUm91dGVGb3JtLmNvbnRyb2xzWydwaWNrdXBfbGF0X2xuZyddLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRSb3V0ZUZvcm0uY29udHJvbHNbJ2RlbGl2ZXJ5X2xvY2F0aW9uJ10/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5kZWxpdmVyeV9sb2NhdGlvbiAmJiByZXMgIT09IHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLmRlbGl2ZXJ5X2xvY2F0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5hZGRSb3V0ZUZvcm0ucGF0Y2hWYWx1ZSh7IGRlbGl2ZXJ5X2xhdF9sbmc6ICcnIH0pO1xyXG4gICAgICAgIHRoaXMuYWRkUm91dGVGb3JtLmNvbnRyb2xzWydkZWxpdmVyeV9sYXRfbG5nJ10ubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZvcm1Jbml0KCkge1xyXG4gICAgdGhpcy5hZGRSb3V0ZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgcm91dGVfbmFtZTogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBjdXN0b21lcl9uYW1lOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGN1c3RvbWVyX2lkOiBuZXcgRm9ybUNvbnRyb2woJycpLFxyXG4gICAgICBtYXRlcmlhbHNfaWQ6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcclxuICAgICAgdW5pdF9pZDogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBwYXRoOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIHBpY2t1cF9sb2NhdGlvbjogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBwaWNrdXBfbGF0X2xuZzogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBkZWxpdmVyeV9sb2NhdGlvbjogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBkZWxpdmVyeV9sYXRfbG5nOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGVzdGltYXRlZF9kaXN0YW5jZTogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBlc3RpbWF0ZWRfdGltZTogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBub3RlOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyMDQ4KV0pLFxyXG4gICAgICB0cnVja2VyX3BheV9lc3RpbWF0ZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICBjdXN0b21lcl9wcmljZV9lc3RpbWF0ZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwYXRjaEZvcm1WYWx1ZShkYXRhPzogUm91dGUpIHtcclxuICAgIHRoaXMuYWRkUm91dGVGb3JtLnJlc2V0KCk7XHJcbiAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKGRhdGEhKTtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5yZXBvc2l0b3J5ID09PSAnY3VzdG9tZXInKSB7ICAgICAgXHJcbiAgICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgIGN1c3RvbWVyX2lkOiB0aGlzLmN1c3RvbWVyUmVwb0RldGFpbHMuY3VzdG9tZXIuaWQsXHJcbiAgICAgICAgY3VzdG9tZXJfbmFtZTogdGhpcy5jdXN0b21lclJlcG9EZXRhaWxzLmN1c3RvbWVyLm5hbWUsXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLnJvdXRlSWQgPSBkYXRhPy5yb3V0ZV9pZDtcclxuICAgIHRoaXMucm91dGVEZXRhaWxzID0gZGF0YSA/IHsgcGlja3VwX2xvY2F0aW9uOiBkYXRhLnBpY2t1cF9sb2NhdGlvbiwgZGVsaXZlcnlfbG9jYXRpb246IGRhdGEuZGVsaXZlcnlfbG9jYXRpb24gfSA6IG51bGw7XHJcbiAgICB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHsgaWYgKHRoaXMucHJldmVudEluaXRpYWxTYXZlKSB0aGlzLnByZXZlbnRJbml0aWFsU2F2ZSA9IGZhbHNlIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWx0ZXJDdXN0b21lckxpc3QoKTtcclxuICAgIGF3YWl0IHRydWU7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZExvbmdMYXQodHlwZTogc3RyaW5nLCBldmVudDogYW55KSB7XHJcbiAgICBpZiAodHlwZSA9PT0gJ3BpY2t1cCcpIHtcclxuICAgICAgdGhpcy5hZGRSb3V0ZUZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgcGlja3VwX2xhdF9sbmc6IChldmVudC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSArICcsJyArIGV2ZW50Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdKS50b1N0cmluZygpXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmNvb2xNYXBTZXJ2aWNlLmNsZWFyQm91bmRXaXRoQ29yZGluYXRlcygpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZGVsaXZlcnknKSB7XHJcbiAgICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgIGRlbGl2ZXJ5X2xhdF9sbmc6IChldmVudC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSArICcsJyArIGV2ZW50Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdKS50b1N0cmluZygpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmNoZWNrQW5kRmV0Y2hSb3V0ZUluZm9ybWF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBjaGVja0FuZEZldGNoUm91dGVJbmZvcm1hdGlvbihpc2luaXRpYWw/OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5hZGRSb3V0ZUZvcm0udmFsdWU/LmRlbGl2ZXJ5X2xhdF9sbmc/Lmxlbmd0aCA+IDAgJiYgdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWU/LnBpY2t1cF9sYXRfbG5nPy5sZW5ndGggPiAwICYmIHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLnVuaXRfaWQpIHtcclxuICAgICAgbGV0IHVuaXQgPSB0aGlzLnVuaXRzTGlzdC5maW5kKCh4OiBhbnkpID0+IHguaWQgPT09IHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLnVuaXRfaWQpO1xyXG4gICAgICBjb25zdCBwYXJhbSA9IHtcclxuICAgICAgICBkZWxpdmVyeV9sYXRfbG5nOiB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5kZWxpdmVyeV9sYXRfbG5nLFxyXG4gICAgICAgIHBpY2t1cF9sYXRfbG5nOiB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5waWNrdXBfbGF0X2xuZyxcclxuICAgICAgICB1bml0OiB1bml0Py50eXBlXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMudXRpbHMucG9zdGRhdGEoJ2NhbGN1bGF0ZS9yb3V0ZXMvZXN0aW1hdGlvbicsIHBhcmFtKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXNbJ3BhdGgnXSkge1xyXG4gICAgICAgICAgdGhpcy5hZGRSb3V0ZUZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAgIGVzdGltYXRlZF9kaXN0YW5jZTogcmVzWydkaXN0J10sXHJcbiAgICAgICAgICAgIGVzdGltYXRlZF90aW1lOiByZXNbJ3RpbWUnXSxcclxuICAgICAgICAgICAgcGF0aDogcmVzWydwYXRoJ10sXHJcbiAgICAgICAgICAgIHRydWNrZXJfcGF5X2VzdGltYXRlOiByZXNbJ3RydWNrZXJfaGF1bF9jb3N0J10sXHJcbiAgICAgICAgICAgIGN1c3RvbWVyX3ByaWNlX2VzdGltYXRlOiAoKygrcmVzWyd0cnVja2VyX2hhdWxfY29zdCddIC8gMC44MCkudG9GaXhlZCgyKSlcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgbGV0IHBhdGggPSByZXNbJ3BhdGgnXS5zcGxpdCgnOycpO1xyXG4gICAgICAgICAgcGF0aCA9IHBhdGgubWFwKChlbGU6IHN0cmluZyB8IGFueSkgPT4geyByZXR1cm4gZWxlID0gdGhpcy5mb3JtYXRlTGF0TG9uZyhlbGUpIH0pO1xyXG4gICAgICAgICAgcmVzWydwYXRoJ10gPSBwYXRoO1xyXG4gICAgICAgICAgY29uc3QgZWxlbWVudDogYW55ID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxyXG4gICAgICAgICAgICBmZWF0dXJlczogW3sgdHlwZTogJ0ZlYXR1cmUnLCBwcm9wZXJ0aWVzOiB7fSwgZ2VvbWV0cnk6IHsgdHlwZTogJ0xpbmVTdHJpbmcnLCBjb29yZGluYXRlczogcmVzWydwYXRoJ10gfSB9XVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jb29sTWFwU2VydmljZS5yZW1vdmVSb3V0ZUFuZE1hcmtlcigxKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdW5pdCA9IHRoaXMudW5pdHNMaXN0LmZpbmQoKHg6IGFueSkgPT4geC5pZCA9PT0gdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUudW5pdF9pZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsRGV0YWlscyA9IHRoaXMubWF0ZXJpYWxzTGlzdC5maW5kKCh4OiBhbnkpID0+IHguc3ViX21hdGVyaWFsX2lkID09PSB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5tYXRlcmlhbHNfaWQpO1xyXG4gICAgICAgICAgICB0aGlzLmNvb2xNYXBTZXJ2aWNlLmxvYWRNYXBQcm9wZXJ0eShlbGVtZW50LCAxLCB1bml0Py50eXBlLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBpY2t1cF9sb2NhdGlvbjogdGhpcy5hZGRSb3V0ZUZvcm0uZ2V0KCdwaWNrdXBfbG9jYXRpb24nKT8udmFsdWUsXHJcbiAgICAgICAgICAgICAgICBkZWxpdmVyeV9sb2NhdGlvbjogdGhpcy5hZGRSb3V0ZUZvcm0uZ2V0KCdkZWxpdmVyeV9sb2NhdGlvbicpPy52YWx1ZSxcclxuICAgICAgICAgICAgICAgIHJvdXRlX25hbWU6IHRoaXMuYWRkUm91dGVGb3JtLmdldCgncm91dGVfbmFtZScpPy52YWx1ZSxcclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsTGFiZWw6IG1hdGVyaWFsRGV0YWlscz8ubGFiZWwsXHJcbiAgICAgICAgICAgICAgICB1bml0OiB1bml0Py50eXBlXHJcbiAgICAgICAgICAgICAgfSkudGhlbigocmVzKSA9PiB7IHRoaXMucHJldmVudFNhdmUgPSB0cnVlIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY29vbE1hcFNlcnZpY2UucmVtb3ZlUm91dGVBbmRNYXJrZXIoMSk7XHJcbiAgICAgICAgICB0aGlzLnV0aWxzLm9wZW5TbmFja0JhcihyZXNbJ3N0YXR1cyddLCAnZXJyb3InKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucm91dGVJZCAmJiBpc2luaXRpYWwpIHRoaXMucHJldmVudEluaXRpYWxTYXZlID0gdHJ1ZTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgeyB0aGlzLmNvb2xNYXBTZXJ2aWNlLnJlbW92ZVJvdXRlQW5kTWFya2VyKDEpIH1cclxuICB9XHJcblxyXG4gIGZvcm1hdGVMYXRMb25nKGxhdGxvbmc6IHN0cmluZykgeyByZXR1cm4gbGF0bG9uZyA/IGxhdGxvbmcuc3BsaXQoJywnKS5tYXAoeCA9PiAreCkucmV2ZXJzZSgpIDogbnVsbCB9XHJcbiAgc2F2ZVJvdXRlKCkge1xyXG4gICAgaWYgKHRoaXMuYWRkUm91dGVGb3JtLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMucHJldmVudFNhdmUgPSBmYWxzZTtcclxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYWRkUm91dGVGb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVJZCA/IHRoaXMudXRpbHMucG9zdGRhdGEoJ3VwZGF0ZS9yb3V0ZXMnLCBkYXRhKSA6IHRoaXMudXRpbHMucG9zdGRhdGEoJ2FkZC9yb3V0ZXMnLCBkYXRhKVxyXG4gICAgICBpZiAodGhpcy5yb3V0ZUlkKSBkYXRhWydpZCddID0gdGhpcy5yb3V0ZUlkO1xyXG4gICAgICB1cmwucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVSb3V0ZUxpc3QuZW1pdCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMudXRpbHMub3BlblNuYWNrQmFyKHJlcy5tZXNzYWdlLCAnc3VjY2VzcycpO1xyXG4gICAgICAgICAgdGhpcy5wcmV2ZW50SW5pdGlhbFNhdmUgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5wcmV2ZW50U2F2ZSA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoIXRoaXMucm91dGVJZCkgdGhpcy5jaGFuZ2VOYXYubmV4dCgnQWRkcm91dGUnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy51dGlscy5vcGVuU25hY2tCYXIocmVzLm1lc3NhZ2UsICdlcnJvcicpO1xyXG4gICAgICAgICAgdGhpcy5wcmV2ZW50U2F2ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAoZXJyKSA9PiB7IGlmIChlcnIpIHsgdGhpcy5wcmV2ZW50U2F2ZSA9IHRydWU7IH0gfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkZFJvdXRlRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGRlbGV0ZVJvdXRlKCkge1xyXG4gICAgdGhpcy5wcmV2ZW50U2F2ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy51dGlscy5wb3N0ZGF0YSgnZGVsZXRlL3JvdXRlcycsIHsgdXVpZDogdGhpcy5yb3V0ZUlkIH0pLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzWydkYXRhJ11bJ3N1Y2Nlc3MnXSkge1xyXG4gICAgICAgIHRoaXMudXRpbHMub3BlblNuYWNrQmFyKHJlc1snZGF0YSddWydtZXNzYWdlJ10sICdzdWNjZXNzJyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVSb3V0ZUxpc3QuZW1pdCh0cnVlKTtcclxuICAgICAgICB0aGlzLmNoYW5nZU5hdi5uZXh0KCdBZGRyb3V0ZScpO1xyXG4gICAgICAgIHRoaXMucHJldmVudEluaXRpYWxTYXZlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnByZXZlbnRTYXZlID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnV0aWxzLm9wZW5TbmFja0JhcignU29tdGhpbmcgd2VudCB3cm9uZycsICdlcnJvcicpO1xyXG4gICAgICAgIHRoaXMucHJldmVudFNhdmUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9LCAoZXJyKSA9PiB7IHRoaXMucHJldmVudFNhdmUgPSB0cnVlIH0pXHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95ZXIkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3llciQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImFkZHJvdXRlYm94XCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdXRlZGV0YWlsYm94XCIgKm5nSWY9XCJlbmFibGVQb3BVcFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNsb3NlYnRucm91dGVkZXRhaWxcIj5cclxuICAgICAgPG1hdC1pY29uIChjbGljayk9XCJwcmV2YW50UG9wdXBDbG9zZSA9IGZhbHNlOyBlbmFibGVQb3BVcCA9IGZhbHNlO1wiPmNsZWFyPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgICA8bGliLXJvdXRlLWluZm8tY2FyZCBbcHJvcERhdGFdPVwie2NsYXNzTmFtZTogJ3JvdXRlQ2FyZCcsIHJlcG9zaXRvcnk6IGNvbmZpZ1sncmVwb3NpdG9yeSddfVwiIFtwb3B1cERhdGFdPVwicG9wdXBEZXRhaWxzXCI+PC9saWItcm91dGUtaW5mby1jYXJkPlxyXG4gICAgPGRpdiBjbGFzcz1cImNyZWF0ZVR4dFwiPlxyXG4gICAgICA8c21hbGw+XHJcbiAgICAgICAgQ3JlYXRlZCBieSB7e3BvcHVwRGV0YWlsc1snY3JlYXRlZF9ieV9uYW1lJ119fSBvbiB7e3BvcHVwRGV0YWlsc1snY3JlYXRlZF9hdCddfX1cclxuICAgICAgPC9zbWFsbD5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImVkaXRidG5cIiAoY2xpY2spPVwiZWRpdEV2ZW50KClcIj5FZGl0PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiYWRkX2FkZF9yb3V0ZV9ib3hcIiBjZGtEcmFnIFtzdHlsZS52aXNpYmlsaXR5XT1cIiFlbmFibGVGb3JtID8gJ2hpZGRlbicgOiAndmlzaWJsZSdcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b3BoZWFkaW5ncHJ0XCI+XHJcbiAgICAgIDxoMj4ge3tyb3V0ZUlkPyAnRURJVCcgOiAnQUREJ319IFJPVVRFIDwvaDI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25wcnRcIj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwicm91dGVJZFwiIGNsYXNzPVwiZGVsYnRuXCIgKGNsaWNrKT1cIm9wZW5EaWFsb2coKVwiPkRlbGV0ZTwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiY2xvc2VidG5cIiAoY2xpY2spPVwiY2hhbmdlTmF2Lm5leHQoJ0FkZHJvdXRlJylcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJhZGRSb3V0ZUZvcm1cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdXRlX2Zvcm1fYXJlYVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPlJvdXRlIE5hbWU8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInJvdXRlX25hbWVcIiBhdXRvY29tcGxldGU9XCJub3BlXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImFkZFJvdXRlRm9ybS5jb250cm9sc1sncm91dGVfbmFtZSddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgUm91dGUgTmFtZSBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiQ3VzdG9tZXIgTmFtZVwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImN1c3RvbWVyX25hbWVcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBhdXRvQWN0aXZlRmlyc3RPcHRpb24gI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgY3VzdG9tZXIgb2YgY3VzdG9tZXJzTGlzdCQgfCBhc3luY1wiIFt2YWx1ZV09XCJjdXN0b21lclsnY3VzdG9tZXJfbmFtZSddXCI+XHJcbiAgICAgICAgICAgICAgICB7e2N1c3RvbWVyWydjdXN0b21lcl9uYW1lJ119fVxyXG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWydjdXN0b21lcl9uYW1lJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBDdXN0b21lciBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+UGlja3VwPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgbWF0SW5wdXQgI2ZpbHRlclBpY2t1cCBbbWF0QXV0b2NvbXBsZXRlXT1cInBpY2t1cEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGlja3VwX2xvY2F0aW9uXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuXHJcbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNwaWNrdXBBdXRvY29tcGxldGU9XCJtYXRBdXRvY29tcGxldGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAoY2xpY2spPVwic2VsZWN0ZWRMb25nTGF0KCdwaWNrdXAnLCBvcHRpb24pXCIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwaWNrdXBPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24/LnBsYWNlX25hbWVcIj5cclxuICAgICAgICAgICAgICAgIHt7b3B0aW9uPy5wbGFjZV9uYW1lfX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWydwaWNrdXBfbGF0X2xuZyddLnRvdWNoZWQgJiYgYWRkUm91dGVGb3JtLmNvbnRyb2xzWydwaWNrdXBfbGF0X2xuZyddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgcGlja3VwIGxvY2F0aW9uIGZyb20gdGhlIGxpc3QuXHJcbiAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD5EZWxpdmVyeTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIG1hdElucHV0ICNmaWx0ZXJEZWxpdmVyeSBbbWF0QXV0b2NvbXBsZXRlXT1cImRlbGl2ZXJ5QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWxpdmVyeV9sb2NhdGlvblwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNkZWxpdmVyeUF1dG9jb21wbGV0ZT1cIm1hdEF1dG9jb21wbGV0ZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIChjbGljayk9XCJzZWxlY3RlZExvbmdMYXQoJ2RlbGl2ZXJ5Jywgb3B0aW9uKVwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZGVsaXZlcnlPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24/LnBsYWNlX25hbWVcIj5cclxuICAgICAgICAgICAgICAgIHt7b3B0aW9uPy5wbGFjZV9uYW1lfX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWydkZWxpdmVyeV9sYXRfbG5nJ10udG91Y2hlZCAmJiBhZGRSb3V0ZUZvcm0uY29udHJvbHNbJ2RlbGl2ZXJ5X2xhdF9sbmcnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IGRlbGl2ZXJ5IGxvY2F0aW9uIGZyb20gdGhlIGxpc3QuXHJcbiAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD5Ob3RlczwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8dGV4dGFyZWEgc3R5bGU9XCJoZWlnaHQ6IDE4cHg7IHJlc2l6ZTogbm9uZTtcIiBtYXRJbnB1dCBuYW1lPVwiXCIgaWQ9XCJcIiBjb2xzPVwiMzBcIiByb3dzPVwiMTBcIiBmb3JtQ29udHJvbE5hbWU9XCJub3RlXCIgYXV0b2NvbXBsZXRlPVwibm9wZVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImFkZFJvdXRlRm9ybS5jb250cm9sc1snbm90ZSddLmhhc0Vycm9yKCdtYXhsZW5ndGgnKVwiPlxyXG4gICAgICAgICAgICAgIE5vdGVzIHNob3VsZCBiZSB3aXRoaW4gMjA0OCBjaGFyYWN0ZXJzLlxyXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBkLWZsZXhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dGJveCBtLTBcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+VW5pdCB0eXBlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidW5pdF9pZFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hlY2tBbmRGZXRjaFJvdXRlSW5mb3JtYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdW5pdCBvZiB1bml0c0xpc3RcIiBbdmFsdWVdPVwidW5pdD8uaWRcIj4ge3t1bml0Py50eXBlfX0gPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWyd1bml0X2lkJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgIFVuaXQgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dGJveCBtLTBcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+TWF0ZXJpYWw8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJtYXRlcmlhbHNfaWRcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG1hdGVyaWFsIG9mIG1hdGVyaWFsc0xpc3RcIiBbdmFsdWVdPVwiY29uZmlnLnJlcG9zaXRvcnkgPT09ICdjb29sbWFwJyA/IG1hdGVyaWFsPy5tYXRlcmlhbF9pZCA6IG1hdGVyaWFsPy5zdWJfbWF0ZXJpYWxfaWRcIj4ge3tjb25maWcucmVwb3NpdG9yeSA9PT0gJ2Nvb2xtYXAnID8gbWF0ZXJpYWw/Lm1hdGVyaWFsIDogbWF0ZXJpYWw/LmxhYmVsfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImFkZFJvdXRlRm9ybS5jb250cm9sc1snbWF0ZXJpYWxzX2lkJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgIE1ldGVyaWFsIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgIDxhcHAtZXN0aW1hdGlvbi1kaXNwbGF5ICpuZ0lmPVwiYWRkUm91dGVGb3JtPy52YWx1ZT8ucGlja3VwX2xhdF9sbmcgJiYgYWRkUm91dGVGb3JtPy52YWx1ZT8uZGVsaXZlcnlfbGF0X2xuZ1wiIFt2YWx1ZV09XCJhZGRSb3V0ZUZvcm1bJ3ZhbHVlJ11cIj48L2FwcC1lc3RpbWF0aW9uLWRpc3BsYXk+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCIgKm5nSWY9XCJhZGRSb3V0ZUZvcm1bJ3ZhbHVlJ11bJ3RydWNrZXJfcGF5X2VzdGltYXRlJ10gJiYgYWRkUm91dGVGb3JtWyd2YWx1ZSddWydjdXN0b21lcl9wcmljZV9lc3RpbWF0ZSddXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZ1sncmVwb3NpdG9yeSddICE9PSAnY3VzdG9tZXInXCIgY2xhc3M9XCJlc3RpbWF0ZVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIFRydWNrZXIgUGF5IEVzdGltYXRlIC0gPGI+e3snJCcrIGFkZFJvdXRlRm9ybVsndmFsdWUnXVsndHJ1Y2tlcl9wYXlfZXN0aW1hdGUnXX19PC9iPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJlc3RpbWF0ZVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIEN1c3RvbWVyIFByaWNlIEVzdGltYXRlIC0gPGI+e3snJCcrIGFkZFJvdXRlRm9ybVsndmFsdWUnXVsnY3VzdG9tZXJfcHJpY2VfZXN0aW1hdGUnXX19PC9iPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJzYXZlUm91dGUoKVwiICpuZ0lmPVwicHJldmVudFNhdmVcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImFkZFJvdXRlRm9ybS5pbnZhbGlkICYmIHByZXZlbnRTYXZlIHx8IHByZXZlbnRJbml0aWFsU2F2ZVwiPnt7cm91dGVJZD8gJ1VwZGF0ZScgOiAnU2F2ZSd9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkZXJcIj5cclxuICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cIiFwcmV2ZW50U2F2ZVwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
1
+ import { Component, ViewChild, Output, EventEmitter, Input, Inject } from '@angular/core';
2
+ import { FormControl, FormGroup, Validators } from '@angular/forms';
3
+ import { debounceTime, distinctUntilChanged, fromEvent, map, startWith, Subject, takeUntil } from 'rxjs';
4
+ import { DialogComponent } from '../shared/dialog/dialog.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@aggdirect/coolmap-services";
7
+ import * as i2 from "@angular/material/dialog";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "@angular/cdk/drag-drop";
10
+ import * as i5 from "@angular/forms";
11
+ import * as i6 from "@angular/material/form-field";
12
+ import * as i7 from "@angular/material/input";
13
+ import * as i8 from "@angular/material/select";
14
+ import * as i9 from "@angular/material/core";
15
+ import * as i10 from "@angular/material/icon";
16
+ import * as i11 from "@angular/material/autocomplete";
17
+ import * as i12 from "@angular/material/progress-spinner";
18
+ import * as i13 from "@angular/material/button";
19
+ import * as i14 from "../shared/estimation-display/estimation-display.component";
20
+ import * as i15 from "../shared/route-info-card/route-info-card.component";
21
+ export class AddRouteComponent {
22
+ constructor(coolMapService, utils, dialog, config) {
23
+ this.coolMapService = coolMapService;
24
+ this.utils = utils;
25
+ this.dialog = dialog;
26
+ this.config = config;
27
+ this.changeNav = new EventEmitter();
28
+ this.updateRouteList = new EventEmitter();
29
+ this.pickupOptions = [];
30
+ this.deliveryOptions = [];
31
+ this.requestParmsForRouteDetails = { pickup_lat_lng: '', delivery_lat_lng: '' };
32
+ this.customersList = [];
33
+ this.unitsList = [];
34
+ this.materialsList = [];
35
+ this.preventSave = false;
36
+ this.preventInitialSave = false;
37
+ this.destroyer$ = new Subject();
38
+ this.enablePopUp = false;
39
+ this.prevantPopupClose = false;
40
+ this.enableForm = false;
41
+ if (this.config.repository === 'customer') {
42
+ this.utils.fetchMaterialsListForCustomer().then((res) => {
43
+ this.materialsList = res;
44
+ });
45
+ }
46
+ else {
47
+ this.utils.fetchMaterialsList().then((res) => {
48
+ this.materialsList = res;
49
+ });
50
+ }
51
+ this.utils.fetchUnitsList().then((res) => {
52
+ this.unitsList = res;
53
+ });
54
+ this.formInit();
55
+ this.utils.getrouteDetailsUtility.subscribe(res => {
56
+ if (res) {
57
+ if (res['event'] !== 'click' && !this.prevantPopupClose) {
58
+ this.enablePopUp = res['event'];
59
+ }
60
+ else if (this.enablePopUp && !this.prevantPopupClose) {
61
+ this.prevantPopupClose = true;
62
+ }
63
+ if (res['event'] !== 'click' && !res['event'] && this.prevantPopupClose) {
64
+ this.popupDetails = this.utils.getdictValue('route-detailsv2');
65
+ }
66
+ else {
67
+ this.popupDetails = res['route'];
68
+ }
69
+ if (this.enablePopUp)
70
+ this.popupDetails['created_at'] = this.utils.getDateFormat(new Date(this.popupDetails['created_at']), '/');
71
+ }
72
+ });
73
+ }
74
+ filterCustomerList() {
75
+ this.customersList$ = this.addRouteForm.controls['customer_name'].valueChanges.pipe(startWith(''), map(value => this._filter(value || '')));
76
+ }
77
+ _filter(value) {
78
+ const filterValue = value.toLowerCase();
79
+ return this.customersList.filter((option) => option['customer_name'].toLowerCase().includes(filterValue));
80
+ }
81
+ ngOnChanges(changes) {
82
+ if (changes['routeData'] && !changes['routeData']['currentValue'])
83
+ this.inIt(null);
84
+ }
85
+ openDialog() {
86
+ const dialogRef = this.dialog.open(DialogComponent, {
87
+ data: { body: 'Are you sure you want to delete this route?' },
88
+ });
89
+ dialogRef.afterClosed().subscribe(res => { if (res) {
90
+ this.deleteRoute();
91
+ } });
92
+ }
93
+ editEvent() {
94
+ this.prevantPopupClose = false;
95
+ this.enableForm = true;
96
+ this.enablePopUp = false;
97
+ this.popupDetails['prevent'] = false;
98
+ this.utils.removeMapEntity.next(this.popupDetails);
99
+ this.inIt(this.popupDetails);
100
+ }
101
+ inIt(changes) {
102
+ if (changes) {
103
+ if (!changes['prevent']) {
104
+ this.preventSave = false;
105
+ this.formControlValue();
106
+ this.patchFormValue(changes).then(() => {
107
+ this.checkAndFetchRouteInformation(true);
108
+ });
109
+ }
110
+ }
111
+ if (!changes) {
112
+ this.enableForm = true;
113
+ this.preventSave = true;
114
+ this.patchFormValue().then(() => {
115
+ this.checkAndFetchRouteInformation();
116
+ });
117
+ }
118
+ }
119
+ ngOnInit() {
120
+ this.formControlValue();
121
+ if (this.config.repository === 'customer') {
122
+ this.addRouteForm.patchValue({
123
+ customer_id: this.customerRepoDetails.customer.id,
124
+ customer_name: this.customerRepoDetails.customer.name,
125
+ });
126
+ }
127
+ else {
128
+ this.utils.fetchCustomersList().then((res) => {
129
+ this.customersList = res;
130
+ this.filterCustomerList();
131
+ this.addRouteForm.controls['customer_name'].enable();
132
+ });
133
+ }
134
+ }
135
+ ngAfterViewInit() {
136
+ fromEvent(this.filterPickup.nativeElement, 'keyup').pipe(distinctUntilChanged(), debounceTime(150)).pipe(takeUntil(this.destroyer$)).subscribe(() => {
137
+ this.utils.fetchAutoCompleteLocations(this.filterPickup.nativeElement.value).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
138
+ this.pickupOptions = res.features;
139
+ });
140
+ });
141
+ fromEvent(this.filterDelivery.nativeElement, 'keyup').pipe(distinctUntilChanged(), debounceTime(150)).pipe(takeUntil(this.destroyer$)).subscribe(() => {
142
+ this.utils.fetchAutoCompleteLocations(this.filterDelivery.nativeElement.value).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
143
+ this.deliveryOptions = res.features;
144
+ });
145
+ });
146
+ }
147
+ formControlValue() {
148
+ this.addRouteForm.controls['pickup_location']?.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
149
+ if (this.addRouteForm.value.pickup_location && res !== this.addRouteForm.value.pickup_location) {
150
+ this.addRouteForm.patchValue({ pickup_lat_lng: '' });
151
+ this.addRouteForm.controls['pickup_lat_lng'].markAsTouched();
152
+ }
153
+ });
154
+ this.addRouteForm.controls['delivery_location']?.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
155
+ if (this.addRouteForm.value.delivery_location && res !== this.addRouteForm.value.delivery_location) {
156
+ this.addRouteForm.patchValue({ delivery_lat_lng: '' });
157
+ this.addRouteForm.controls['delivery_lat_lng'].markAsTouched();
158
+ }
159
+ });
160
+ }
161
+ formInit() {
162
+ this.addRouteForm = new FormGroup({
163
+ route_name: new FormControl('', [Validators.required]),
164
+ customer_name: new FormControl({ value: '', disabled: true }, [Validators.required]),
165
+ customer_id: new FormControl(''),
166
+ materials_id: new FormControl('', [Validators.required]),
167
+ unit_id: new FormControl('', [Validators.required]),
168
+ path: new FormControl('', [Validators.required]),
169
+ pickup_location: new FormControl('', [Validators.required]),
170
+ pickup_lat_lng: new FormControl('', [Validators.required]),
171
+ delivery_location: new FormControl('', [Validators.required]),
172
+ delivery_lat_lng: new FormControl('', [Validators.required]),
173
+ estimated_distance: new FormControl('', [Validators.required]),
174
+ estimated_time: new FormControl('', [Validators.required]),
175
+ note: new FormControl('', [Validators.maxLength(2048)]),
176
+ trucker_pay_estimate: new FormControl(null),
177
+ customer_price_estimate: new FormControl(null),
178
+ });
179
+ }
180
+ async patchFormValue(data) {
181
+ this.addRouteForm.reset();
182
+ this.addRouteForm.patchValue(data);
183
+ if (this.config.repository === 'customer') {
184
+ this.addRouteForm.patchValue({
185
+ customer_id: this.customerRepoDetails.customer.id,
186
+ customer_name: this.customerRepoDetails.customer.name,
187
+ });
188
+ }
189
+ this.routeId = data?.route_id;
190
+ this.routeDetails = data ? { pickup_location: data.pickup_location, delivery_location: data.delivery_location } : null;
191
+ this.addRouteForm.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe(res => {
192
+ if (res) {
193
+ if (this.preventInitialSave)
194
+ this.preventInitialSave = false;
195
+ }
196
+ });
197
+ this.filterCustomerList();
198
+ await true;
199
+ }
200
+ selectedLongLat(type, event) {
201
+ if (type === 'pickup') {
202
+ this.addRouteForm.patchValue({
203
+ pickup_lat_lng: (event.geometry.coordinates[1] + ',' + event.geometry.coordinates[0]).toString()
204
+ });
205
+ this.coolMapService.clearBoundWithCordinates();
206
+ }
207
+ else if (type === 'delivery') {
208
+ this.addRouteForm.patchValue({
209
+ delivery_lat_lng: (event.geometry.coordinates[1] + ',' + event.geometry.coordinates[0]).toString()
210
+ });
211
+ }
212
+ this.checkAndFetchRouteInformation();
213
+ }
214
+ checkAndFetchRouteInformation(isinitial) {
215
+ if (this.addRouteForm.value?.delivery_lat_lng?.length > 0 && this.addRouteForm.value?.pickup_lat_lng?.length > 0 && this.addRouteForm.value.unit_id) {
216
+ let unit = this.unitsList.find((x) => x.id === this.addRouteForm.value.unit_id);
217
+ const param = {
218
+ delivery_lat_lng: this.addRouteForm.value.delivery_lat_lng,
219
+ pickup_lat_lng: this.addRouteForm.value.pickup_lat_lng,
220
+ unit: unit?.type
221
+ };
222
+ this.utils.postdata('calculate/routes/estimation', param).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
223
+ if (res && res['path']) {
224
+ this.addRouteForm.patchValue({
225
+ estimated_distance: res['dist'],
226
+ estimated_time: res['time'],
227
+ path: res['path'],
228
+ trucker_pay_estimate: res['trucker_haul_cost'],
229
+ customer_price_estimate: (+(+res['trucker_haul_cost'] / 0.80).toFixed(2))
230
+ });
231
+ let path = res['path'].split(';');
232
+ path = path.map((ele) => { return ele = this.formateLatLong(ele); });
233
+ res['path'] = path;
234
+ const element = {
235
+ type: 'FeatureCollection',
236
+ features: [{ type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates: res['path'] } }]
237
+ };
238
+ this.coolMapService.removeRouteAndMarker(1).then(() => {
239
+ const unit = this.unitsList.find((x) => x.id === this.addRouteForm.value.unit_id);
240
+ const materialDetails = this.materialsList.find((x) => x.sub_material_id === this.addRouteForm.value.materials_id);
241
+ this.coolMapService.loadMapProperty(element, 1, unit?.type, {
242
+ pickup_location: this.addRouteForm.get('pickup_location')?.value,
243
+ delivery_location: this.addRouteForm.get('delivery_location')?.value,
244
+ route_name: this.addRouteForm.get('route_name')?.value,
245
+ materialLabel: materialDetails?.label,
246
+ unit: unit?.type
247
+ }).then((res) => { this.preventSave = true; });
248
+ });
249
+ }
250
+ else {
251
+ this.coolMapService.removeRouteAndMarker(1);
252
+ this.utils.openSnackBar(res['status'], 'error');
253
+ }
254
+ if (this.routeId && isinitial)
255
+ this.preventInitialSave = true;
256
+ });
257
+ }
258
+ else {
259
+ this.coolMapService.removeRouteAndMarker(1);
260
+ }
261
+ }
262
+ formateLatLong(latlong) { return latlong ? latlong.split(',').map(x => +x).reverse() : null; }
263
+ saveRoute() {
264
+ if (this.addRouteForm.valid) {
265
+ this.preventSave = false;
266
+ const data = this.addRouteForm.getRawValue();
267
+ const url = this.routeId ? this.utils.postdata('update/routes', data) : this.utils.postdata('add/routes', data);
268
+ if (this.routeId)
269
+ data['id'] = this.routeId;
270
+ url.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
271
+ if (res.success) {
272
+ this.updateRouteList.emit(true);
273
+ this.utils.openSnackBar(res.message, 'success');
274
+ this.preventInitialSave = true;
275
+ this.preventSave = true;
276
+ if (!this.routeId)
277
+ this.changeNav.next('Addroute');
278
+ }
279
+ else {
280
+ this.utils.openSnackBar(res.message, 'error');
281
+ this.preventSave = true;
282
+ }
283
+ }, (err) => { if (err) {
284
+ this.preventSave = true;
285
+ } });
286
+ }
287
+ else {
288
+ this.addRouteForm.markAllAsTouched();
289
+ }
290
+ }
291
+ deleteRoute() {
292
+ this.preventSave = false;
293
+ this.utils.postdata('delete/routes', { uuid: this.routeId }).subscribe(res => {
294
+ if (res['data']['success']) {
295
+ this.utils.openSnackBar(res['data']['message'], 'success');
296
+ this.updateRouteList.emit(true);
297
+ this.changeNav.next('Addroute');
298
+ this.preventInitialSave = true;
299
+ this.preventSave = true;
300
+ }
301
+ else {
302
+ this.utils.openSnackBar('Somthing went wrong', 'error');
303
+ this.preventSave = true;
304
+ }
305
+ }, (err) => { this.preventSave = true; });
306
+ }
307
+ ngOnDestroy() {
308
+ this.destroyer$.next(true);
309
+ this.destroyer$.unsubscribe();
310
+ }
311
+ }
312
+ AddRouteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AddRouteComponent, deps: [{ token: i1.CoolmapService }, { token: i1.UtilsService }, { token: i2.MatDialog }, { token: 'memberData' }], target: i0.ɵɵFactoryTarget.Component });
313
+ AddRouteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: AddRouteComponent, selector: "app-add-route", inputs: { routeData: "routeData", customerRepoDetails: "customerRepoDetails" }, outputs: { changeNav: "changeNav", updateRouteList: "updateRouteList" }, viewQueries: [{ propertyName: "filterPickup", first: true, predicate: ["filterPickup"], descendants: true }, { propertyName: "filterDelivery", first: true, predicate: ["filterDelivery"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"addroutebox\">\n <div class=\"routedetailbox\" *ngIf=\"enablePopUp\">\n <div class=\"closebtnroutedetail\">\n <mat-icon (click)=\"prevantPopupClose = false; enablePopUp = false;\">clear</mat-icon>\n </div>\n <lib-route-info-card [propData]=\"{className: 'routeCard', repository: config['repository']}\" [popupData]=\"popupDetails\"></lib-route-info-card>\n <div class=\"createTxt\">\n <small>\n Created by {{popupDetails['created_by_name']}} on {{popupDetails['created_at']}}\n </small>\n <button class=\"editbtn\" (click)=\"editEvent()\">Edit</button>\n </div>\n </div>\n <div class=\"add_add_route_box\" cdkDrag [style.visibility]=\"!enableForm ? 'hidden' : 'visible'\">\n <div class=\"topheadingprt\">\n <h2> {{routeId? 'EDIT' : 'ADD'}} ROUTE </h2>\n <div class=\"buttonprt\">\n <button *ngIf=\"routeId\" class=\"delbtn\" (click)=\"openDialog()\">Delete</button>\n <button mat-raised-button type=\"submit\" class=\"closebtn\" (click)=\"changeNav.next('Addroute')\">Close</button>\n </div>\n </div>\n <form [formGroup]=\"addRouteForm\">\n <div class=\"route_form_area\">\n <div class=\"col-6\">\n <mat-form-field>\n <mat-label>Route Name</mat-label>\n <input matInput formControlName=\"route_name\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\">\n <mat-error *ngIf=\"addRouteForm.controls['route_name'].hasError('required')\">\n Route Name is required\n </mat-error>\n </mat-form-field>\n </div>\n <div class=\"col-6\">\n <mat-form-field>\n <input type=\"text\" placeholder=\"Customer Name\" matInput formControlName=\"customer_name\" [matAutocomplete]=\"auto\" (mousedown)=\"$event.stopPropagation()\">\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let customer of customersList$ | async\" [value]=\"customer['customer_name']\">\n {{customer['customer_name']}}\n </mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"addRouteForm.controls['customer_name'].hasError('required')\">\n Customer name is required.\n </mat-error>\n </mat-form-field>\n </div>\n <div class=\"col-6\">\n <mat-form-field>\n <mat-label>Pickup</mat-label>\n <input type=\"text\" placeholder=\"Search...\" matInput #filterPickup [matAutocomplete]=\"pickupAutocomplete\"\n formControlName=\"pickup_location\" (mousedown)=\"$event.stopPropagation()\">\n\n <mat-autocomplete #pickupAutocomplete=\"matAutocomplete\">\n <mat-option (click)=\"selectedLongLat('pickup', option)\" *ngFor=\"let option of pickupOptions\"\n [value]=\"option?.place_name\">\n {{option?.place_name}}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n <mat-error *ngIf=\"addRouteForm.controls['pickup_lat_lng'].touched && addRouteForm.controls['pickup_lat_lng'].hasError('required')\">\n Please select pickup location from the list.\n </mat-error>\n </div>\n <div class=\"col-6\">\n <mat-form-field>\n <mat-label>Delivery</mat-label>\n <input type=\"text\" placeholder=\"Search...\" matInput #filterDelivery [matAutocomplete]=\"deliveryAutocomplete\"\n formControlName=\"delivery_location\" (mousedown)=\"$event.stopPropagation()\">\n <mat-autocomplete #deliveryAutocomplete=\"matAutocomplete\">\n <mat-option (click)=\"selectedLongLat('delivery', option)\" *ngFor=\"let option of deliveryOptions\"\n [value]=\"option?.place_name\">\n {{option?.place_name}}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n <mat-error *ngIf=\"addRouteForm.controls['delivery_lat_lng'].touched && addRouteForm.controls['delivery_lat_lng'].hasError('required')\">\n Please select delivery location from the list.\n </mat-error>\n </div>\n <div class=\"col-6\">\n <mat-form-field>\n <mat-label>Notes</mat-label>\n <textarea style=\"height: 18px; resize: none;\" matInput name=\"\" id=\"\" cols=\"30\" rows=\"10\" formControlName=\"note\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\"></textarea>\n <mat-error *ngIf=\"addRouteForm.controls['note'].hasError('maxlength')\">\n Notes should be within 2048 characters.\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"col-6 d-flex\">\n <div class=\"inputbox m-0\">\n <mat-form-field>\n <mat-label>Unit type</mat-label>\n <mat-select formControlName=\"unit_id\" (selectionChange)=\"checkAndFetchRouteInformation()\" (mousedown)=\"$event.stopPropagation()\">\n <mat-option *ngFor=\"let unit of unitsList\" [value]=\"unit?.id\"> {{unit?.type}} </mat-option>\n </mat-select>\n <mat-error *ngIf=\"addRouteForm.controls['unit_id'].hasError('required')\">\n Unit is required\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"inputbox m-0\">\n <mat-form-field>\n <mat-label>Material</mat-label>\n <mat-select formControlName=\"materials_id\" (mousedown)=\"$event.stopPropagation()\">\n <mat-option *ngFor=\"let material of materialsList\" [value]=\"config.repository === 'coolmap' ? material?.material_id : material?.sub_material_id\"> {{config.repository === 'coolmap' ? material?.material : material?.label}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"addRouteForm.controls['materials_id'].hasError('required')\">\n Material is required\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <div class=\"col-6\">\n <app-estimation-display *ngIf=\"addRouteForm?.value?.pickup_lat_lng && addRouteForm?.value?.delivery_lat_lng\" [value]=\"addRouteForm['value']\"></app-estimation-display>\n </div>\n <div class=\"col-6\" *ngIf=\"addRouteForm['value']['trucker_pay_estimate'] && addRouteForm['value']['customer_price_estimate']\">\n <span *ngIf=\"config['repository'] !== 'customer'\" class=\"estimate\" (mousedown)=\"$event.stopPropagation()\">\n Trucker Pay Estimate - <b>{{'$'+ addRouteForm['value']['trucker_pay_estimate']}}</b>\n </span>\n <span class=\"estimate\" (mousedown)=\"$event.stopPropagation()\">\n Customer Price Estimate - <b>{{'$'+ addRouteForm['value']['customer_price_estimate']}}</b>\n </span>\n </div>\n <button mat-raised-button type=\"submit\" (click)=\"saveRoute()\" *ngIf=\"preventSave\"\n [disabled]=\"addRouteForm.invalid && preventSave || preventInitialSave\">{{routeId? 'Update' : 'Save'}}\n </button>\n <div class=\"loader\">\n <mat-spinner *ngIf=\"!preventSave\"></mat-spinner>\n </div>\n </div>\n </form>\n </div>\n</div>\n", styles: [".addroutebox{width:calc(100% - 315px);position:absolute;left:300px;bottom:10px;z-index:999;display:flex;justify-content:space-between;align-items:flex-start}.addroutebox .routedetailbox{max-width:300px;padding:10px;background-color:#fff;border-radius:20px;margin-right:20px}@media (min-width: 1600px){.addroutebox .routedetailbox{max-width:280px}}.addroutebox .editbtn{background:#326ad3;padding:10px 25px;color:#fff;font-size:.8125rem;border-radius:30px;float:right}.add_add_route_box{background:white;padding:10px 20px;border-radius:20px;box-shadow:2px 4px 4px 2px #00000024;height:370px;width:100%;position:relative;cursor:move}.add_add_route_box .route_form_area{display:flex;flex-wrap:wrap;justify-content:space-between}.add_add_route_box .route_form_area .col-6{width:48%;margin-top:15px;justify-content:space-between}.add_add_route_box .route_form_area .col-6 .inputbox{width:47%}.add_add_route_box .route_form_area .col-6 span{font-size:.875rem}.add_add_route_box .route_form_area button{background:#326ad3;padding:0 18px;color:#fff;font-size:.8125rem;border-radius:30px;position:absolute;right:18px;top:20px;height:35px}.closebtn{background:black;color:#fff;border-radius:30px;padding:0 18px;margin-left:10px;height:35px}.delbtn{background:red;color:#fff;border-radius:30px;padding:10px 18px}.add_route_listingpart .listing_toggle{background:white;border-radius:15px;padding:8px 10px;position:absolute;right:10px;top:30px;cursor:pointer}.listing_box{background:#282828;height:100vh;position:fixed;right:0;top:0;z-index:1111;box-shadow:-3px 0 5px #ffffff14;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;width:0;border-radius:40px 0 0 40px;opacity:0}.listing_box .closebtn{display:none}.show .listing_box{width:250px;max-width:250px;flex:0 0 250px;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;padding:40px 0 40px 20px;opacity:1}@media (min-width: 1600px){.show .listing_box{width:320px;max-width:320px;flex:0 0 320px}}.show .listing_box h2{color:#fff;white-space:nowrap}.show .listing_box ul{padding:0 20px 0 0}.show .listing_box ul li{background:#4a4a4a;padding:15px;border-radius:15px;display:flex;margin-bottom:15px}.show .listing_box ul li .companayIcon{width:40px;height:40px;border-radius:10px;background:white;margin-right:10px;display:flex;justify-content:center;align-items:center}.show .listing_box ul li .company_cont{width:calc(100% - 50px)}.show .listing_box ul li .company_cont h3{color:#fff;font-size:15px;font-weight:400;margin:0;text-overflow:ellipsis;max-width:129px;-webkit-box-orient:vertical;white-space:nowrap;overflow:hidden}@media (min-width: 1600px){.show .listing_box ul li .company_cont h3{max-width:170px}}.show .listing_box ul li .company_cont p{color:#bcbcbc;font-size:12px;margin:5px 0;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:16px}.show .closebtn{position:absolute;left:-33px;top:50px;background:#282828;color:#fff;padding:8px;border-top-left-radius:15px;border-bottom-left-radius:15px;cursor:pointer;box-shadow:-4px 2px 5px #ffffff14;display:block}.loader{position:absolute;width:95%;height:100%;display:flex;justify-content:center;align-items:center;pointer-events:none}.buttonprt{margin-right:83px}.closebtnroutedetail{box-shadow:0 0 5px #0000001c;border-radius:100%;width:30px;height:30px;display:flex;justify-content:center;align-items:center;cursor:pointer;background:#fff;position:absolute;top:-11px;left:-11px}.routenotes{max-height:170px;overflow:auto}.estimate{margin-right:20px;font-size:.7rem}@media (min-width: 1600px){.estimate{font-size:.95rem}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i11.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i12.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i13.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i14.EstimationDisplayComponent, selector: "app-estimation-display", inputs: ["value"] }, { kind: "component", type: i15.RouteInfoCardComponent, selector: "lib-route-info-card", inputs: ["popupData", "propData"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] });
314
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AddRouteComponent, decorators: [{
315
+ type: Component,
316
+ args: [{ selector: 'app-add-route', template: "<div class=\"addroutebox\">\n <div class=\"routedetailbox\" *ngIf=\"enablePopUp\">\n <div class=\"closebtnroutedetail\">\n <mat-icon (click)=\"prevantPopupClose = false; enablePopUp = false;\">clear</mat-icon>\n </div>\n <lib-route-info-card [propData]=\"{className: 'routeCard', repository: config['repository']}\" [popupData]=\"popupDetails\"></lib-route-info-card>\n <div class=\"createTxt\">\n <small>\n Created by {{popupDetails['created_by_name']}} on {{popupDetails['created_at']}}\n </small>\n <button class=\"editbtn\" (click)=\"editEvent()\">Edit</button>\n </div>\n </div>\n <div class=\"add_add_route_box\" cdkDrag [style.visibility]=\"!enableForm ? 'hidden' : 'visible'\">\n <div class=\"topheadingprt\">\n <h2> {{routeId? 'EDIT' : 'ADD'}} ROUTE </h2>\n <div class=\"buttonprt\">\n <button *ngIf=\"routeId\" class=\"delbtn\" (click)=\"openDialog()\">Delete</button>\n <button mat-raised-button type=\"submit\" class=\"closebtn\" (click)=\"changeNav.next('Addroute')\">Close</button>\n </div>\n </div>\n <form [formGroup]=\"addRouteForm\">\n <div class=\"route_form_area\">\n <div class=\"col-6\">\n <mat-form-field>\n <mat-label>Route Name</mat-label>\n <input matInput formControlName=\"route_name\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\">\n <mat-error *ngIf=\"addRouteForm.controls['route_name'].hasError('required')\">\n Route Name is required\n </mat-error>\n </mat-form-field>\n </div>\n <div class=\"col-6\">\n <mat-form-field>\n <input type=\"text\" placeholder=\"Customer Name\" matInput formControlName=\"customer_name\" [matAutocomplete]=\"auto\" (mousedown)=\"$event.stopPropagation()\">\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let customer of customersList$ | async\" [value]=\"customer['customer_name']\">\n {{customer['customer_name']}}\n </mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"addRouteForm.controls['customer_name'].hasError('required')\">\n Customer name is required.\n </mat-error>\n </mat-form-field>\n </div>\n <div class=\"col-6\">\n <mat-form-field>\n <mat-label>Pickup</mat-label>\n <input type=\"text\" placeholder=\"Search...\" matInput #filterPickup [matAutocomplete]=\"pickupAutocomplete\"\n formControlName=\"pickup_location\" (mousedown)=\"$event.stopPropagation()\">\n\n <mat-autocomplete #pickupAutocomplete=\"matAutocomplete\">\n <mat-option (click)=\"selectedLongLat('pickup', option)\" *ngFor=\"let option of pickupOptions\"\n [value]=\"option?.place_name\">\n {{option?.place_name}}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n <mat-error *ngIf=\"addRouteForm.controls['pickup_lat_lng'].touched && addRouteForm.controls['pickup_lat_lng'].hasError('required')\">\n Please select pickup location from the list.\n </mat-error>\n </div>\n <div class=\"col-6\">\n <mat-form-field>\n <mat-label>Delivery</mat-label>\n <input type=\"text\" placeholder=\"Search...\" matInput #filterDelivery [matAutocomplete]=\"deliveryAutocomplete\"\n formControlName=\"delivery_location\" (mousedown)=\"$event.stopPropagation()\">\n <mat-autocomplete #deliveryAutocomplete=\"matAutocomplete\">\n <mat-option (click)=\"selectedLongLat('delivery', option)\" *ngFor=\"let option of deliveryOptions\"\n [value]=\"option?.place_name\">\n {{option?.place_name}}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n <mat-error *ngIf=\"addRouteForm.controls['delivery_lat_lng'].touched && addRouteForm.controls['delivery_lat_lng'].hasError('required')\">\n Please select delivery location from the list.\n </mat-error>\n </div>\n <div class=\"col-6\">\n <mat-form-field>\n <mat-label>Notes</mat-label>\n <textarea style=\"height: 18px; resize: none;\" matInput name=\"\" id=\"\" cols=\"30\" rows=\"10\" formControlName=\"note\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\"></textarea>\n <mat-error *ngIf=\"addRouteForm.controls['note'].hasError('maxlength')\">\n Notes should be within 2048 characters.\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"col-6 d-flex\">\n <div class=\"inputbox m-0\">\n <mat-form-field>\n <mat-label>Unit type</mat-label>\n <mat-select formControlName=\"unit_id\" (selectionChange)=\"checkAndFetchRouteInformation()\" (mousedown)=\"$event.stopPropagation()\">\n <mat-option *ngFor=\"let unit of unitsList\" [value]=\"unit?.id\"> {{unit?.type}} </mat-option>\n </mat-select>\n <mat-error *ngIf=\"addRouteForm.controls['unit_id'].hasError('required')\">\n Unit is required\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"inputbox m-0\">\n <mat-form-field>\n <mat-label>Material</mat-label>\n <mat-select formControlName=\"materials_id\" (mousedown)=\"$event.stopPropagation()\">\n <mat-option *ngFor=\"let material of materialsList\" [value]=\"config.repository === 'coolmap' ? material?.material_id : material?.sub_material_id\"> {{config.repository === 'coolmap' ? material?.material : material?.label}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"addRouteForm.controls['materials_id'].hasError('required')\">\n Material is required\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <div class=\"col-6\">\n <app-estimation-display *ngIf=\"addRouteForm?.value?.pickup_lat_lng && addRouteForm?.value?.delivery_lat_lng\" [value]=\"addRouteForm['value']\"></app-estimation-display>\n </div>\n <div class=\"col-6\" *ngIf=\"addRouteForm['value']['trucker_pay_estimate'] && addRouteForm['value']['customer_price_estimate']\">\n <span *ngIf=\"config['repository'] !== 'customer'\" class=\"estimate\" (mousedown)=\"$event.stopPropagation()\">\n Trucker Pay Estimate - <b>{{'$'+ addRouteForm['value']['trucker_pay_estimate']}}</b>\n </span>\n <span class=\"estimate\" (mousedown)=\"$event.stopPropagation()\">\n Customer Price Estimate - <b>{{'$'+ addRouteForm['value']['customer_price_estimate']}}</b>\n </span>\n </div>\n <button mat-raised-button type=\"submit\" (click)=\"saveRoute()\" *ngIf=\"preventSave\"\n [disabled]=\"addRouteForm.invalid && preventSave || preventInitialSave\">{{routeId? 'Update' : 'Save'}}\n </button>\n <div class=\"loader\">\n <mat-spinner *ngIf=\"!preventSave\"></mat-spinner>\n </div>\n </div>\n </form>\n </div>\n</div>\n", styles: [".addroutebox{width:calc(100% - 315px);position:absolute;left:300px;bottom:10px;z-index:999;display:flex;justify-content:space-between;align-items:flex-start}.addroutebox .routedetailbox{max-width:300px;padding:10px;background-color:#fff;border-radius:20px;margin-right:20px}@media (min-width: 1600px){.addroutebox .routedetailbox{max-width:280px}}.addroutebox .editbtn{background:#326ad3;padding:10px 25px;color:#fff;font-size:.8125rem;border-radius:30px;float:right}.add_add_route_box{background:white;padding:10px 20px;border-radius:20px;box-shadow:2px 4px 4px 2px #00000024;height:370px;width:100%;position:relative;cursor:move}.add_add_route_box .route_form_area{display:flex;flex-wrap:wrap;justify-content:space-between}.add_add_route_box .route_form_area .col-6{width:48%;margin-top:15px;justify-content:space-between}.add_add_route_box .route_form_area .col-6 .inputbox{width:47%}.add_add_route_box .route_form_area .col-6 span{font-size:.875rem}.add_add_route_box .route_form_area button{background:#326ad3;padding:0 18px;color:#fff;font-size:.8125rem;border-radius:30px;position:absolute;right:18px;top:20px;height:35px}.closebtn{background:black;color:#fff;border-radius:30px;padding:0 18px;margin-left:10px;height:35px}.delbtn{background:red;color:#fff;border-radius:30px;padding:10px 18px}.add_route_listingpart .listing_toggle{background:white;border-radius:15px;padding:8px 10px;position:absolute;right:10px;top:30px;cursor:pointer}.listing_box{background:#282828;height:100vh;position:fixed;right:0;top:0;z-index:1111;box-shadow:-3px 0 5px #ffffff14;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;width:0;border-radius:40px 0 0 40px;opacity:0}.listing_box .closebtn{display:none}.show .listing_box{width:250px;max-width:250px;flex:0 0 250px;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;padding:40px 0 40px 20px;opacity:1}@media (min-width: 1600px){.show .listing_box{width:320px;max-width:320px;flex:0 0 320px}}.show .listing_box h2{color:#fff;white-space:nowrap}.show .listing_box ul{padding:0 20px 0 0}.show .listing_box ul li{background:#4a4a4a;padding:15px;border-radius:15px;display:flex;margin-bottom:15px}.show .listing_box ul li .companayIcon{width:40px;height:40px;border-radius:10px;background:white;margin-right:10px;display:flex;justify-content:center;align-items:center}.show .listing_box ul li .company_cont{width:calc(100% - 50px)}.show .listing_box ul li .company_cont h3{color:#fff;font-size:15px;font-weight:400;margin:0;text-overflow:ellipsis;max-width:129px;-webkit-box-orient:vertical;white-space:nowrap;overflow:hidden}@media (min-width: 1600px){.show .listing_box ul li .company_cont h3{max-width:170px}}.show .listing_box ul li .company_cont p{color:#bcbcbc;font-size:12px;margin:5px 0;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:16px}.show .closebtn{position:absolute;left:-33px;top:50px;background:#282828;color:#fff;padding:8px;border-top-left-radius:15px;border-bottom-left-radius:15px;cursor:pointer;box-shadow:-4px 2px 5px #ffffff14;display:block}.loader{position:absolute;width:95%;height:100%;display:flex;justify-content:center;align-items:center;pointer-events:none}.buttonprt{margin-right:83px}.closebtnroutedetail{box-shadow:0 0 5px #0000001c;border-radius:100%;width:30px;height:30px;display:flex;justify-content:center;align-items:center;cursor:pointer;background:#fff;position:absolute;top:-11px;left:-11px}.routenotes{max-height:170px;overflow:auto}.estimate{margin-right:20px;font-size:.7rem}@media (min-width: 1600px){.estimate{font-size:.95rem}}\n"] }]
317
+ }], ctorParameters: function () { return [{ type: i1.CoolmapService }, { type: i1.UtilsService }, { type: i2.MatDialog }, { type: i1.CoolmapConfigModel, decorators: [{
318
+ type: Inject,
319
+ args: ['memberData']
320
+ }] }]; }, propDecorators: { filterPickup: [{
321
+ type: ViewChild,
322
+ args: ['filterPickup']
323
+ }], filterDelivery: [{
324
+ type: ViewChild,
325
+ args: ['filterDelivery']
326
+ }], changeNav: [{
327
+ type: Output
328
+ }], updateRouteList: [{
329
+ type: Output
330
+ }], routeData: [{
331
+ type: Input
332
+ }], customerRepoDetails: [{
333
+ type: Input
334
+ }] } });
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXJvdXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAvc3JjL2xpYi9jb21wb25lbnQvYWRkLXJvdXRlL2FkZC1yb3V0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb29sbWFwL3NyYy9saWIvY29tcG9uZW50L2FkZC1yb3V0ZS9hZGQtcm91dGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkosT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFjLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3JILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRcEUsTUFBTSxPQUFPLGlCQUFpQjtJQXlCNUIsWUFBbUIsY0FBOEIsRUFBUyxLQUFtQixFQUFTLE1BQWlCLEVBQ3hFLE1BQTBCO1FBRHRDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFTLFVBQUssR0FBTCxLQUFLLENBQWM7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ3hFLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBdkJ4QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN2QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDL0Qsa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFDeEIsb0JBQWUsR0FBUSxFQUFFLENBQUM7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UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7OzhHQXZSVSxpQkFBaUIscUdBMEJsQixZQUFZO2tHQTFCWCxpQkFBaUIsb2JDYjlCLDZzT0F1SUE7MkZEMUhhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxlQUFlOzswQkE4QnRCLE1BQU07MkJBQUMsWUFBWTs0Q0F6QlksWUFBWTtzQkFBN0MsU0FBUzt1QkFBQyxjQUFjO2dCQUNXLGNBQWM7c0JBQWpELFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNWLFNBQVM7c0JBQXpCLE1BQU07Z0JBQ1UsZUFBZTtzQkFBL0IsTUFBTTtnQkFRUyxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLG1CQUFtQjtzQkFBbEMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25Jbml0LCBWaWV3Q2hpbGQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsIElucHV0LCBPbkRlc3Ryb3ksIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZyb21FdmVudCwgbWFwLCBPYnNlcnZhYmxlLCBzdGFydFdpdGgsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IENvb2xtYXBDb25maWdNb2RlbCwgQ29vbG1hcFNlcnZpY2UsIEN1c3RvbWVyUmVwb0RldGFpbHNNb2RlbCwgUm91dGUsIFV0aWxzU2VydmljZSB9IGZyb20gJ0BhZ2dkaXJlY3QvY29vbG1hcC1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9zaGFyZWQvZGlhbG9nL2RpYWxvZy5jb21wb25lbnQnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hZGQtcm91dGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLXJvdXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWRkLXJvdXRlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQWRkUm91dGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnZmlsdGVyUGlja3VwJykgcHVibGljIGZpbHRlclBpY2t1cCE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlckRlbGl2ZXJ5JykgcHVibGljIGZpbHRlckRlbGl2ZXJ5ITogRWxlbWVudFJlZjtcbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFuZ2VOYXYgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyB1cGRhdGVSb3V0ZUxpc3QgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIHBpY2t1cE9wdGlvbnM6IGFueSA9IFtdO1xuICBkZWxpdmVyeU9wdGlvbnM6IGFueSA9IFtdO1xuICByZXF1ZXN0UGFybXNGb3JSb3V0ZURldGFpbHMgPSB7IHBpY2t1cF9sYXRfbG5nOiAnJywgZGVsaXZlcnlfbGF0X2xuZzogJycgfVxuICBjdXN0b21lcnNMaXN0OiBhbnkgPSBbXTtcbiAgdW5pdHNMaXN0OiBhbnkgPSBbXTtcbiAgbWF0ZXJpYWxzTGlzdDogYW55ID0gW107XG4gIGFkZFJvdXRlRm9ybSE6IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgcHVibGljIHJvdXRlRGF0YSE6IFJvdXRlO1xuICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tZXJSZXBvRGV0YWlscyE6IEN1c3RvbWVyUmVwb0RldGFpbHNNb2RlbDtcbiAgcm91dGVJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgcHJldmVudFNhdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJldmVudEluaXRpYWxTYXZlOiBib29sZWFuID0gZmFsc2U7XG4gIGN1c3RvbWVyc0xpc3QkITogT2JzZXJ2YWJsZTxhbnk+O1xuICByb3V0ZURldGFpbHMhOiB7IHBpY2t1cF9sb2NhdGlvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDsgZGVsaXZlcnlfbG9jYXRpb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7IH0gfCBudWxsO1xuICBwdWJsaWMgZGVzdHJveWVyJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHBvcHVwRGV0YWlsczogUm91dGU7XG4gIGVuYWJsZVBvcFVwOiBib29sZWFuID0gZmFsc2U7XG4gIHByZXZhbnRQb3B1cENsb3NlID0gZmFsc2U7XG4gIGVuYWJsZUZvcm06IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29vbE1hcFNlcnZpY2U6IENvb2xtYXBTZXJ2aWNlLCBwdWJsaWMgdXRpbHM6IFV0aWxzU2VydmljZSwgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIEBJbmplY3QoJ21lbWJlckRhdGEnKSBwdWJsaWMgY29uZmlnOiBDb29sbWFwQ29uZmlnTW9kZWwpIHsgICAgICBcbiAgICBpZiAodGhpcy5jb25maWcucmVwb3NpdG9yeSA9PT0gJ2N1c3RvbWVyJykge1xuICAgICAgdGhpcy51dGlscy5mZXRjaE1hdGVyaWFsc0xpc3RGb3JDdXN0b21lcigpLnRoZW4oKHJlcyk9PnsgICAgICAgIFxuICAgICAgICB0aGlzLm1hdGVyaWFsc0xpc3QgPSByZXM7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51dGlscy5mZXRjaE1hdGVyaWFsc0xpc3QoKS50aGVuKChyZXMpPT57XG4gICAgICAgIHRoaXMubWF0ZXJpYWxzTGlzdCA9IHJlcztcbiAgICAgIH0pO1xuICAgIH1cbiAgIFxuICAgIHRoaXMudXRpbHMuZmV0Y2hVbml0c0xpc3QoKS50aGVuKChyZXMpPT57XG4gICAgICB0aGlzLnVuaXRzTGlzdCA9IHJlcztcbiAgICB9KTtcbiAgICB0aGlzLmZvcm1Jbml0KCk7XG4gICAgdGhpcy51dGlscy5nZXRyb3V0ZURldGFpbHNVdGlsaXR5LnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICBpZiAocmVzWydldmVudCddICE9PSAnY2xpY2snICYmICF0aGlzLnByZXZhbnRQb3B1cENsb3NlKSB7IHRoaXMuZW5hYmxlUG9wVXAgPSByZXNbJ2V2ZW50J10gfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmVuYWJsZVBvcFVwICYmICF0aGlzLnByZXZhbnRQb3B1cENsb3NlKSB7IHRoaXMucHJldmFudFBvcHVwQ2xvc2UgPSB0cnVlOyB9XG4gICAgICAgIGlmIChyZXNbJ2V2ZW50J10gIT09ICdjbGljaycgJiYgIXJlc1snZXZlbnQnXSAmJiB0aGlzLnByZXZhbnRQb3B1cENsb3NlKSB7XG4gICAgICAgICAgdGhpcy5wb3B1cERldGFpbHMgPSB0aGlzLnV0aWxzLmdldGRpY3RWYWx1ZSgncm91dGUtZGV0YWlsc3YyJyk7XG4gICAgICAgIH0gZWxzZSB7IHRoaXMucG9wdXBEZXRhaWxzID0gcmVzWydyb3V0ZSddIH1cbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlUG9wVXApIHRoaXMucG9wdXBEZXRhaWxzWydjcmVhdGVkX2F0J10gPSB0aGlzLnV0aWxzLmdldERhdGVGb3JtYXQobmV3IERhdGUodGhpcy5wb3B1cERldGFpbHNbJ2NyZWF0ZWRfYXQnXSksICcvJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZmlsdGVyQ3VzdG9tZXJMaXN0KCkge1xuICAgIHRoaXMuY3VzdG9tZXJzTGlzdCQgPSB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1snY3VzdG9tZXJfbmFtZSddLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgc3RhcnRXaXRoKCcnKSxcbiAgICAgIG1hcCh2YWx1ZSA9PiB0aGlzLl9maWx0ZXIodmFsdWUgfHwgJycpKSxcbiAgICApO1xuICB9XG4gIHB1YmxpYyBfZmlsdGVyKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmN1c3RvbWVyc0xpc3QuZmlsdGVyKChvcHRpb246IGFueSkgPT4gb3B0aW9uWydjdXN0b21lcl9uYW1lJ10udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpO1xuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sncm91dGVEYXRhJ10gJiYgIWNoYW5nZXNbJ3JvdXRlRGF0YSddWydjdXJyZW50VmFsdWUnXSkgdGhpcy5pbkl0KG51bGwpO1xuICB9XG4gIG9wZW5EaWFsb2coKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgYm9keTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyByb3V0ZT8nIH0sXG4gICAgfSk7XG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7IGlmIChyZXMpIHsgdGhpcy5kZWxldGVSb3V0ZSgpIH0gfSk7XG4gIH1cbiAgZWRpdEV2ZW50KCkge1xuICAgIHRoaXMucHJldmFudFBvcHVwQ2xvc2UgPSBmYWxzZTtcbiAgICB0aGlzLmVuYWJsZUZvcm0gPSB0cnVlOyB0aGlzLmVuYWJsZVBvcFVwID0gZmFsc2U7XG4gICAgdGhpcy5wb3B1cERldGFpbHNbJ3ByZXZlbnQnXSA9IGZhbHNlO1xuICAgIHRoaXMudXRpbHMucmVtb3ZlTWFwRW50aXR5Lm5leHQodGhpcy5wb3B1cERldGFpbHMpO1xuICAgIHRoaXMuaW5JdCh0aGlzLnBvcHVwRGV0YWlscyk7XG4gIH1cbiAgaW5JdChjaGFuZ2VzOiBSb3V0ZSkge1xuICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICBpZiAoIWNoYW5nZXNbJ3ByZXZlbnQnXSkge1xuICAgICAgICB0aGlzLnByZXZlbnRTYXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xWYWx1ZSgpO1xuICAgICAgICB0aGlzLnBhdGNoRm9ybVZhbHVlKGNoYW5nZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2hlY2tBbmRGZXRjaFJvdXRlSW5mb3JtYXRpb24odHJ1ZSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghY2hhbmdlcykge1xuICAgICAgdGhpcy5lbmFibGVGb3JtID0gdHJ1ZTsgdGhpcy5wcmV2ZW50U2F2ZSA9IHRydWU7XG4gICAgICB0aGlzLnBhdGNoRm9ybVZhbHVlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tBbmRGZXRjaFJvdXRlSW5mb3JtYXRpb24oKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUNvbnRyb2xWYWx1ZSgpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5yZXBvc2l0b3J5ID09PSAnY3VzdG9tZXInKSB7XG4gICAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgY3VzdG9tZXJfaWQ6IHRoaXMuY3VzdG9tZXJSZXBvRGV0YWlscy5jdXN0b21lci5pZCxcbiAgICAgICAgY3VzdG9tZXJfbmFtZTogdGhpcy5jdXN0b21lclJlcG9EZXRhaWxzLmN1c3RvbWVyLm5hbWUsXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnV0aWxzLmZldGNoQ3VzdG9tZXJzTGlzdCgpLnRoZW4oKHJlcyk9PntcbiAgICAgICAgdGhpcy5jdXN0b21lcnNMaXN0ID0gcmVzOyB0aGlzLmZpbHRlckN1c3RvbWVyTGlzdCgpOyB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1snY3VzdG9tZXJfbmFtZSddLmVuYWJsZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGZyb21FdmVudCh0aGlzLmZpbHRlclBpY2t1cC5uYXRpdmVFbGVtZW50LCAna2V5dXAnKS5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDE1MCkpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudXRpbHMuZmV0Y2hBdXRvQ29tcGxldGVMb2NhdGlvbnModGhpcy5maWx0ZXJQaWNrdXAubmF0aXZlRWxlbWVudC52YWx1ZSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMucGlja3VwT3B0aW9ucyA9IHJlcy5mZWF0dXJlcztcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGZyb21FdmVudCh0aGlzLmZpbHRlckRlbGl2ZXJ5Lm5hdGl2ZUVsZW1lbnQsICdrZXl1cCcpLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBkZWJvdW5jZVRpbWUoMTUwKSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy51dGlscy5mZXRjaEF1dG9Db21wbGV0ZUxvY2F0aW9ucyh0aGlzLmZpbHRlckRlbGl2ZXJ5Lm5hdGl2ZUVsZW1lbnQudmFsdWUpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmRlbGl2ZXJ5T3B0aW9ucyA9IHJlcy5mZWF0dXJlcztcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGZvcm1Db250cm9sVmFsdWUoKSB7XG4gICAgdGhpcy5hZGRSb3V0ZUZvcm0uY29udHJvbHNbJ3BpY2t1cF9sb2NhdGlvbiddPy52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLnBpY2t1cF9sb2NhdGlvbiAmJiByZXMgIT09IHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLnBpY2t1cF9sb2NhdGlvbikge1xuICAgICAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKHsgcGlja3VwX2xhdF9sbmc6ICcnIH0pO1xuICAgICAgICB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1sncGlja3VwX2xhdF9sbmcnXS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1snZGVsaXZlcnlfbG9jYXRpb24nXT8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGlmICh0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5kZWxpdmVyeV9sb2NhdGlvbiAmJiByZXMgIT09IHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLmRlbGl2ZXJ5X2xvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoeyBkZWxpdmVyeV9sYXRfbG5nOiAnJyB9KTtcbiAgICAgICAgdGhpcy5hZGRSb3V0ZUZvcm0uY29udHJvbHNbJ2RlbGl2ZXJ5X2xhdF9sbmcnXS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmb3JtSW5pdCgpIHtcbiAgICB0aGlzLmFkZFJvdXRlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgcm91dGVfbmFtZTogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgY3VzdG9tZXJfbmFtZTogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgY3VzdG9tZXJfaWQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBtYXRlcmlhbHNfaWQ6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIHVuaXRfaWQ6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIHBhdGg6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIHBpY2t1cF9sb2NhdGlvbjogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgcGlja3VwX2xhdF9sbmc6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIGRlbGl2ZXJ5X2xvY2F0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBkZWxpdmVyeV9sYXRfbG5nOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBlc3RpbWF0ZWRfZGlzdGFuY2U6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIGVzdGltYXRlZF90aW1lOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBub3RlOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyMDQ4KV0pLFxuICAgICAgdHJ1Y2tlcl9wYXlfZXN0aW1hdGU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIGN1c3RvbWVyX3ByaWNlX2VzdGltYXRlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBwYXRjaEZvcm1WYWx1ZShkYXRhPzogUm91dGUpIHtcbiAgICB0aGlzLmFkZFJvdXRlRm9ybS5yZXNldCgpO1xuICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoZGF0YSEpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5yZXBvc2l0b3J5ID09PSAnY3VzdG9tZXInKSB7ICAgICAgXG4gICAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgY3VzdG9tZXJfaWQ6IHRoaXMuY3VzdG9tZXJSZXBvRGV0YWlscy5jdXN0b21lci5pZCxcbiAgICAgICAgY3VzdG9tZXJfbmFtZTogdGhpcy5jdXN0b21lclJlcG9EZXRhaWxzLmN1c3RvbWVyLm5hbWUsXG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLnJvdXRlSWQgPSBkYXRhPy5yb3V0ZV9pZDtcbiAgICB0aGlzLnJvdXRlRGV0YWlscyA9IGRhdGEgPyB7IHBpY2t1cF9sb2NhdGlvbjogZGF0YS5waWNrdXBfbG9jYXRpb24sIGRlbGl2ZXJ5X2xvY2F0aW9uOiBkYXRhLmRlbGl2ZXJ5X2xvY2F0aW9uIH0gOiBudWxsO1xuICAgIHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIGlmIChyZXMpIHsgaWYgKHRoaXMucHJldmVudEluaXRpYWxTYXZlKSB0aGlzLnByZXZlbnRJbml0aWFsU2F2ZSA9IGZhbHNlIH1cbiAgICB9KTtcbiAgICB0aGlzLmZpbHRlckN1c3RvbWVyTGlzdCgpO1xuICAgIGF3YWl0IHRydWU7XG4gIH1cblxuICBzZWxlY3RlZExvbmdMYXQodHlwZTogc3RyaW5nLCBldmVudDogYW55KSB7XG4gICAgaWYgKHR5cGUgPT09ICdwaWNrdXAnKSB7XG4gICAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgcGlja3VwX2xhdF9sbmc6IChldmVudC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSArICcsJyArIGV2ZW50Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdKS50b1N0cmluZygpXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29vbE1hcFNlcnZpY2UuY2xlYXJCb3VuZFdpdGhDb3JkaW5hdGVzKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZGVsaXZlcnknKSB7XG4gICAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgZGVsaXZlcnlfbGF0X2xuZzogKGV2ZW50Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdICsgJywnICsgZXZlbnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0pLnRvU3RyaW5nKClcbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMuY2hlY2tBbmRGZXRjaFJvdXRlSW5mb3JtYXRpb24oKTtcbiAgfVxuXG4gIGNoZWNrQW5kRmV0Y2hSb3V0ZUluZm9ybWF0aW9uKGlzaW5pdGlhbD86IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5hZGRSb3V0ZUZvcm0udmFsdWU/LmRlbGl2ZXJ5X2xhdF9sbmc/Lmxlbmd0aCA+IDAgJiYgdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWU/LnBpY2t1cF9sYXRfbG5nPy5sZW5ndGggPiAwICYmIHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLnVuaXRfaWQpIHtcbiAgICAgIGxldCB1bml0ID0gdGhpcy51bml0c0xpc3QuZmluZCgoeDogYW55KSA9PiB4LmlkID09PSB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS51bml0X2lkKTtcbiAgICAgIGNvbnN0IHBhcmFtID0ge1xuICAgICAgICBkZWxpdmVyeV9sYXRfbG5nOiB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5kZWxpdmVyeV9sYXRfbG5nLFxuICAgICAgICBwaWNrdXBfbGF0X2xuZzogdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUucGlja3VwX2xhdF9sbmcsXG4gICAgICAgIHVuaXQ6IHVuaXQ/LnR5cGVcbiAgICAgIH07XG4gICAgICB0aGlzLnV0aWxzLnBvc3RkYXRhKCdjYWxjdWxhdGUvcm91dGVzL2VzdGltYXRpb24nLCBwYXJhbSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzICYmIHJlc1sncGF0aCddKSB7XG4gICAgICAgICAgdGhpcy5hZGRSb3V0ZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICBlc3RpbWF0ZWRfZGlzdGFuY2U6IHJlc1snZGlzdCddLFxuICAgICAgICAgICAgZXN0aW1hdGVkX3RpbWU6IHJlc1sndGltZSddLFxuICAgICAgICAgICAgcGF0aDogcmVzWydwYXRoJ10sXG4gICAgICAgICAgICB0cnVja2VyX3BheV9lc3RpbWF0ZTogcmVzWyd0cnVja2VyX2hhdWxfY29zdCddLFxuICAgICAgICAgICAgY3VzdG9tZXJfcHJpY2VfZXN0aW1hdGU6ICgrKCtyZXNbJ3RydWNrZXJfaGF1bF9jb3N0J10gLyAwLjgwKS50b0ZpeGVkKDIpKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxldCBwYXRoID0gcmVzWydwYXRoJ10uc3BsaXQoJzsnKTtcbiAgICAgICAgICBwYXRoID0gcGF0aC5tYXAoKGVsZTogc3RyaW5nIHwgYW55KSA9PiB7IHJldHVybiBlbGUgPSB0aGlzLmZvcm1hdGVMYXRMb25nKGVsZSkgfSk7XG4gICAgICAgICAgcmVzWydwYXRoJ10gPSBwYXRoO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQ6IGFueSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICBmZWF0dXJlczogW3sgdHlwZTogJ0ZlYXR1cmUnLCBwcm9wZXJ0aWVzOiB7fSwgZ2VvbWV0cnk6IHsgdHlwZTogJ0xpbmVTdHJpbmcnLCBjb29yZGluYXRlczogcmVzWydwYXRoJ10gfSB9XVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNvb2xNYXBTZXJ2aWNlLnJlbW92ZVJvdXRlQW5kTWFya2VyKDEpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5pdCA9IHRoaXMudW5pdHNMaXN0LmZpbmQoKHg6IGFueSkgPT4geC5pZCA9PT0gdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUudW5pdF9pZCk7XG4gICAgICAgICAgICBjb25zdCBtYXRlcmlhbERldGFpbHMgPSB0aGlzLm1hdGVyaWFsc0xpc3QuZmluZCgoeDogYW55KSA9PiB4LnN1Yl9tYXRlcmlhbF9pZCA9PT0gdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUubWF0ZXJpYWxzX2lkKTtcbiAgICAgICAgICAgIHRoaXMuY29vbE1hcFNlcnZpY2UubG9hZE1hcFByb3BlcnR5KGVsZW1lbnQsIDEsIHVuaXQ/LnR5cGUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwaWNrdXBfbG9jYXRpb246IHRoaXMuYWRkUm91dGVGb3JtLmdldCgncGlja3VwX2xvY2F0aW9uJyk/LnZhbHVlLFxuICAgICAgICAgICAgICAgIGRlbGl2ZXJ5X2xvY2F0aW9uOiB0aGlzLmFkZFJvdXRlRm9ybS5nZXQoJ2RlbGl2ZXJ5X2xvY2F0aW9uJyk/LnZhbHVlLFxuICAgICAgICAgICAgICAgIHJvdXRlX25hbWU6IHRoaXMuYWRkUm91dGVGb3JtLmdldCgncm91dGVfbmFtZScpPy52YWx1ZSxcbiAgICAgICAgICAgICAgICBtYXRlcmlhbExhYmVsOiBtYXRlcmlhbERldGFpbHM/LmxhYmVsLFxuICAgICAgICAgICAgICAgIHVuaXQ6IHVuaXQ/LnR5cGVcbiAgICAgICAgICAgICAgfSkudGhlbigocmVzKSA9PiB7IHRoaXMucHJldmVudFNhdmUgPSB0cnVlIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29vbE1hcFNlcnZpY2UucmVtb3ZlUm91dGVBbmRNYXJrZXIoMSk7XG4gICAgICAgICAgdGhpcy51dGlscy5vcGVuU25hY2tCYXIocmVzWydzdGF0dXMnXSwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm91dGVJZCAmJiBpc2luaXRpYWwpIHRoaXMucHJldmVudEluaXRpYWxTYXZlID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7IHRoaXMuY29vbE1hcFNlcnZpY2UucmVtb3ZlUm91dGVBbmRNYXJrZXIoMSkgfVxuICB9XG5cbiAgZm9ybWF0ZUxhdExvbmcobGF0bG9uZzogc3RyaW5nKSB7IHJldHVybiBsYXRsb25nID8gbGF0bG9uZy5zcGxpdCgnLCcpLm1hcCh4ID0+ICt4KS5yZXZlcnNlKCkgOiBudWxsIH1cbiAgc2F2ZVJvdXRlKCkge1xuICAgIGlmICh0aGlzLmFkZFJvdXRlRm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5wcmV2ZW50U2F2ZSA9IGZhbHNlO1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYWRkUm91dGVGb3JtLmdldFJhd1ZhbHVlKCk7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlSWQgPyB0aGlzLnV0aWxzLnBvc3RkYXRhKCd1cGRhdGUvcm91dGVzJywgZGF0YSkgOiB0aGlzLnV0aWxzLnBvc3RkYXRhKCdhZGQvcm91dGVzJywgZGF0YSlcbiAgICAgIGlmICh0aGlzLnJvdXRlSWQpIGRhdGFbJ2lkJ10gPSB0aGlzLnJvdXRlSWQ7XG4gICAgICB1cmwucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVJvdXRlTGlzdC5lbWl0KHRydWUpO1xuICAgICAgICAgIHRoaXMudXRpbHMub3BlblNuYWNrQmFyKHJlcy5tZXNzYWdlLCAnc3VjY2VzcycpO1xuICAgICAgICAgIHRoaXMucHJldmVudEluaXRpYWxTYXZlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnByZXZlbnRTYXZlID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoIXRoaXMucm91dGVJZCkgdGhpcy5jaGFuZ2VOYXYubmV4dCgnQWRkcm91dGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnV0aWxzLm9wZW5TbmFja0JhcihyZXMubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgdGhpcy5wcmV2ZW50U2F2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0sIChlcnIpID0+IHsgaWYgKGVycikgeyB0aGlzLnByZXZlbnRTYXZlID0gdHJ1ZTsgfSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRSb3V0ZUZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuICBkZWxldGVSb3V0ZSgpIHtcbiAgICB0aGlzLnByZXZlbnRTYXZlID0gZmFsc2U7XG4gICAgdGhpcy51dGlscy5wb3N0ZGF0YSgnZGVsZXRlL3JvdXRlcycsIHsgdXVpZDogdGhpcy5yb3V0ZUlkIH0pLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgaWYgKHJlc1snZGF0YSddWydzdWNjZXNzJ10pIHtcbiAgICAgICAgdGhpcy51dGlscy5vcGVuU25hY2tCYXIocmVzWydkYXRhJ11bJ21lc3NhZ2UnXSwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgdGhpcy51cGRhdGVSb3V0ZUxpc3QuZW1pdCh0cnVlKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VOYXYubmV4dCgnQWRkcm91dGUnKTtcbiAgICAgICAgdGhpcy5wcmV2ZW50SW5pdGlhbFNhdmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZXZlbnRTYXZlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXRpbHMub3BlblNuYWNrQmFyKCdTb210aGluZyB3ZW50IHdyb25nJywgJ2Vycm9yJyk7XG4gICAgICAgIHRoaXMucHJldmVudFNhdmUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sIChlcnIpID0+IHsgdGhpcy5wcmV2ZW50U2F2ZSA9IHRydWUgfSlcbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llciQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3llciQudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFkZHJvdXRlYm94XCI+XG4gIDxkaXYgY2xhc3M9XCJyb3V0ZWRldGFpbGJveFwiICpuZ0lmPVwiZW5hYmxlUG9wVXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2xvc2VidG5yb3V0ZWRldGFpbFwiPlxuICAgICAgPG1hdC1pY29uIChjbGljayk9XCJwcmV2YW50UG9wdXBDbG9zZSA9IGZhbHNlOyBlbmFibGVQb3BVcCA9IGZhbHNlO1wiPmNsZWFyPC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cbiAgICAgIDxsaWItcm91dGUtaW5mby1jYXJkIFtwcm9wRGF0YV09XCJ7Y2xhc3NOYW1lOiAncm91dGVDYXJkJywgcmVwb3NpdG9yeTogY29uZmlnWydyZXBvc2l0b3J5J119XCIgW3BvcHVwRGF0YV09XCJwb3B1cERldGFpbHNcIj48L2xpYi1yb3V0ZS1pbmZvLWNhcmQ+XG4gICAgPGRpdiBjbGFzcz1cImNyZWF0ZVR4dFwiPlxuICAgICAgPHNtYWxsPlxuICAgICAgICBDcmVhdGVkIGJ5IHt7cG9wdXBEZXRhaWxzWydjcmVhdGVkX2J5X25hbWUnXX19IG9uIHt7cG9wdXBEZXRhaWxzWydjcmVhdGVkX2F0J119fVxuICAgICAgPC9zbWFsbD5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJlZGl0YnRuXCIgKGNsaWNrKT1cImVkaXRFdmVudCgpXCI+RWRpdDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImFkZF9hZGRfcm91dGVfYm94XCIgY2RrRHJhZyBbc3R5bGUudmlzaWJpbGl0eV09XCIhZW5hYmxlRm9ybSA/ICdoaWRkZW4nIDogJ3Zpc2libGUnXCI+XG4gICAgPGRpdiBjbGFzcz1cInRvcGhlYWRpbmdwcnRcIj5cbiAgICAgIDxoMj4ge3tyb3V0ZUlkPyAnRURJVCcgOiAnQUREJ319IFJPVVRFIDwvaDI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9ucHJ0XCI+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJyb3V0ZUlkXCIgY2xhc3M9XCJkZWxidG5cIiAoY2xpY2spPVwib3BlbkRpYWxvZygpXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiY2xvc2VidG5cIiAoY2xpY2spPVwiY2hhbmdlTmF2Lm5leHQoJ0FkZHJvdXRlJylcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJhZGRSb3V0ZUZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3V0ZV9mb3JtX2FyZWFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5Sb3V0ZSBOYW1lPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicm91dGVfbmFtZVwiIGF1dG9jb21wbGV0ZT1cIm5vcGVcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImFkZFJvdXRlRm9ybS5jb250cm9sc1sncm91dGVfbmFtZSddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgIFJvdXRlIE5hbWUgaXMgcmVxdWlyZWRcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkN1c3RvbWVyIE5hbWVcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJjdXN0b21lcl9uYW1lXCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlIGF1dG9BY3RpdmVGaXJzdE9wdGlvbiAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgY3VzdG9tZXIgb2YgY3VzdG9tZXJzTGlzdCQgfCBhc3luY1wiIFt2YWx1ZV09XCJjdXN0b21lclsnY3VzdG9tZXJfbmFtZSddXCI+XG4gICAgICAgICAgICAgICAge3tjdXN0b21lclsnY3VzdG9tZXJfbmFtZSddfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImFkZFJvdXRlRm9ybS5jb250cm9sc1snY3VzdG9tZXJfbmFtZSddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgIEN1c3RvbWVyIG5hbWUgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5QaWNrdXA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgbWF0SW5wdXQgI2ZpbHRlclBpY2t1cCBbbWF0QXV0b2NvbXBsZXRlXT1cInBpY2t1cEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBpY2t1cF9sb2NhdGlvblwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG5cbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNwaWNrdXBBdXRvY29tcGxldGU9XCJtYXRBdXRvY29tcGxldGVcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKGNsaWNrKT1cInNlbGVjdGVkTG9uZ0xhdCgncGlja3VwJywgb3B0aW9uKVwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcGlja3VwT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbj8ucGxhY2VfbmFtZVwiPlxuICAgICAgICAgICAgICAgIHt7b3B0aW9uPy5wbGFjZV9uYW1lfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImFkZFJvdXRlRm9ybS5jb250cm9sc1sncGlja3VwX2xhdF9sbmcnXS50b3VjaGVkICYmIGFkZFJvdXRlRm9ybS5jb250cm9sc1sncGlja3VwX2xhdF9sbmcnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgUGxlYXNlIHNlbGVjdCBwaWNrdXAgbG9jYXRpb24gZnJvbSB0aGUgbGlzdC5cbiAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+RGVsaXZlcnk8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgbWF0SW5wdXQgI2ZpbHRlckRlbGl2ZXJ5IFttYXRBdXRvY29tcGxldGVdPVwiZGVsaXZlcnlBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWxpdmVyeV9sb2NhdGlvblwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjZGVsaXZlcnlBdXRvY29tcGxldGU9XCJtYXRBdXRvY29tcGxldGVcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKGNsaWNrKT1cInNlbGVjdGVkTG9uZ0xhdCgnZGVsaXZlcnknLCBvcHRpb24pXCIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBkZWxpdmVyeU9wdGlvbnNcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24/LnBsYWNlX25hbWVcIj5cbiAgICAgICAgICAgICAgICB7e29wdGlvbj8ucGxhY2VfbmFtZX19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJhZGRSb3V0ZUZvcm0uY29udHJvbHNbJ2RlbGl2ZXJ5X2xhdF9sbmcnXS50b3VjaGVkICYmIGFkZFJvdXRlRm9ybS5jb250cm9sc1snZGVsaXZlcnlfbGF0X2xuZyddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IGRlbGl2ZXJ5IGxvY2F0aW9uIGZyb20gdGhlIGxpc3QuXG4gICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPk5vdGVzPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWEgc3R5bGU9XCJoZWlnaHQ6IDE4cHg7IHJlc2l6ZTogbm9uZTtcIiBtYXRJbnB1dCBuYW1lPVwiXCIgaWQ9XCJcIiBjb2xzPVwiMzBcIiByb3dzPVwiMTBcIiBmb3JtQ29udHJvbE5hbWU9XCJub3RlXCIgYXV0b2NvbXBsZXRlPVwibm9wZVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJhZGRSb3V0ZUZvcm0uY29udHJvbHNbJ25vdGUnXS5oYXNFcnJvcignbWF4bGVuZ3RoJylcIj5cbiAgICAgICAgICAgICAgTm90ZXMgc2hvdWxkIGJlIHdpdGhpbiAyMDQ4IGNoYXJhY3RlcnMuXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgZC1mbGV4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0Ym94IG0tMFwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlVuaXQgdHlwZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ1bml0X2lkXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGVja0FuZEZldGNoUm91dGVJbmZvcm1hdGlvbigpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdW5pdCBvZiB1bml0c0xpc3RcIiBbdmFsdWVdPVwidW5pdD8uaWRcIj4ge3t1bml0Py50eXBlfX0gPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJhZGRSb3V0ZUZvcm0uY29udHJvbHNbJ3VuaXRfaWQnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgIFVuaXQgaXMgcmVxdWlyZWRcbiAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0Ym94IG0tMFwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPk1hdGVyaWFsPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm1hdGVyaWFsc19pZFwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG1hdGVyaWFsIG9mIG1hdGVyaWFsc0xpc3RcIiBbdmFsdWVdPVwiY29uZmlnLnJlcG9zaXRvcnkgPT09ICdjb29sbWFwJyA/IG1hdGVyaWFsPy5tYXRlcmlhbF9pZCA6IG1hdGVyaWFsPy5zdWJfbWF0ZXJpYWxfaWRcIj4ge3tjb25maWcucmVwb3NpdG9yeSA9PT0gJ2Nvb2xtYXAnID8gbWF0ZXJpYWw/Lm1hdGVyaWFsIDogbWF0ZXJpYWw/LmxhYmVsfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImFkZFJvdXRlRm9ybS5jb250cm9sc1snbWF0ZXJpYWxzX2lkJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICBNYXRlcmlhbCBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICA8YXBwLWVzdGltYXRpb24tZGlzcGxheSAqbmdJZj1cImFkZFJvdXRlRm9ybT8udmFsdWU/LnBpY2t1cF9sYXRfbG5nICYmIGFkZFJvdXRlRm9ybT8udmFsdWU/LmRlbGl2ZXJ5X2xhdF9sbmdcIiBbdmFsdWVdPVwiYWRkUm91dGVGb3JtWyd2YWx1ZSddXCI+PC9hcHAtZXN0aW1hdGlvbi1kaXNwbGF5PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCIgKm5nSWY9XCJhZGRSb3V0ZUZvcm1bJ3ZhbHVlJ11bJ3RydWNrZXJfcGF5X2VzdGltYXRlJ10gJiYgYWRkUm91dGVGb3JtWyd2YWx1ZSddWydjdXN0b21lcl9wcmljZV9lc3RpbWF0ZSddXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWdbJ3JlcG9zaXRvcnknXSAhPT0gJ2N1c3RvbWVyJ1wiIGNsYXNzPVwiZXN0aW1hdGVcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgVHJ1Y2tlciBQYXkgRXN0aW1hdGUgLSA8Yj57eyckJysgYWRkUm91dGVGb3JtWyd2YWx1ZSddWyd0cnVja2VyX3BheV9lc3RpbWF0ZSddfX08L2I+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXN0aW1hdGVcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgQ3VzdG9tZXIgUHJpY2UgRXN0aW1hdGUgLSA8Yj57eyckJysgYWRkUm91dGVGb3JtWyd2YWx1ZSddWydjdXN0b21lcl9wcmljZV9lc3RpbWF0ZSddfX08L2I+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGNsaWNrKT1cInNhdmVSb3V0ZSgpXCIgKm5nSWY9XCJwcmV2ZW50U2F2ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImFkZFJvdXRlRm9ybS5pbnZhbGlkICYmIHByZXZlbnRTYXZlIHx8IHByZXZlbnRJbml0aWFsU2F2ZVwiPnt7cm91dGVJZD8gJ1VwZGF0ZScgOiAnU2F2ZSd9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRlclwiPlxuICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cIiFwcmV2ZW50U2F2ZVwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19