@aggdirect/coolmap 2.6.8 → 2.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/esm2022/aggdirect-coolmap.mjs +5 -0
  2. package/esm2022/lib/component/add-route/add-route.component.mjs +348 -0
  3. package/esm2022/lib/component/job-code/job-code.component.mjs +192 -0
  4. package/esm2022/lib/component/map/map.component.mjs +39 -0
  5. package/esm2022/lib/component/nav/layout/add-route-nav/add-route-nav.component.mjs +152 -0
  6. package/esm2022/lib/component/nav/layout/job-code-nav/job-code-nav.component.mjs +147 -0
  7. package/esm2022/lib/component/nav/nav.component.mjs +54 -0
  8. package/esm2022/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.mjs +77 -0
  9. package/esm2022/lib/component/route-jobcode-list/route-jobcode-list.component.mjs +321 -0
  10. package/esm2022/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.mjs +19 -0
  11. package/esm2022/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.mjs +37 -0
  12. package/esm2022/lib/component/shared/dialog/dialog.component.mjs +31 -0
  13. package/esm2022/lib/component/shared/estimation-display/estimation-display.component.mjs +18 -0
  14. package/esm2022/lib/component/shared/job-route-list/job-route-list.component.mjs +79 -0
  15. package/esm2022/lib/component/shared/jobcode-overview/jobcode-overview.component.mjs +24 -0
  16. package/esm2022/lib/component/shared/jobcode-status/jobcode-status.component.mjs +15 -0
  17. package/esm2022/lib/component/shared/route-info-card/route-info-card.component.mjs +57 -0
  18. package/esm2022/lib/coolmap.module.mjs +186 -0
  19. package/esm2022/public-api.mjs +19 -0
  20. package/fesm2022/aggdirect-coolmap.mjs +1672 -0
  21. package/fesm2022/aggdirect-coolmap.mjs.map +1 -0
  22. package/index.d.ts +5 -0
  23. package/lib/component/add-route/add-route.component.d.ts +61 -0
  24. package/lib/component/job-code/job-code.component.d.ts +42 -0
  25. package/lib/component/map/map.component.d.ts +15 -0
  26. package/lib/component/nav/layout/add-route-nav/add-route-nav.component.d.ts +49 -0
  27. package/lib/component/nav/layout/job-code-nav/job-code-nav.component.d.ts +42 -0
  28. package/lib/component/nav/nav.component.d.ts +31 -0
  29. package/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.d.ts +20 -0
  30. package/lib/component/route-jobcode-list/route-jobcode-list.component.d.ts +42 -0
  31. package/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.d.ts +9 -0
  32. package/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.d.ts +12 -0
  33. package/lib/component/shared/dialog/dialog.component.d.ts +13 -0
  34. package/lib/component/shared/estimation-display/estimation-display.component.d.ts +8 -0
  35. package/lib/component/shared/job-route-list/job-route-list.component.d.ts +26 -0
  36. package/lib/component/shared/jobcode-overview/jobcode-overview.component.d.ts +10 -0
  37. package/lib/component/shared/jobcode-status/jobcode-status.component.d.ts +7 -0
  38. package/lib/component/shared/route-info-card/route-info-card.component.d.ts +29 -0
  39. package/lib/coolmap.module.d.ts +44 -0
  40. package/package.json +22 -5
  41. package/{src/public-api.ts → public-api.d.ts} +0 -8
  42. package/karma.conf.js +0 -44
  43. package/ng-package.json +0 -7
  44. package/src/assets/mixin.scss +0 -28
  45. package/src/assets/palette.scss +0 -24
  46. package/src/assets/variable.scss +0 -15
  47. package/src/lib/component/add-route/add-route.component.html +0 -136
  48. package/src/lib/component/add-route/add-route.component.scss +0 -236
  49. package/src/lib/component/add-route/add-route.component.spec.ts +0 -23
  50. package/src/lib/component/add-route/add-route.component.ts +0 -295
  51. package/src/lib/component/job-code/job-code.component.html +0 -79
  52. package/src/lib/component/job-code/job-code.component.scss +0 -396
  53. package/src/lib/component/job-code/job-code.component.ts +0 -157
  54. package/src/lib/component/map/map.component.css +0 -0
  55. package/src/lib/component/map/map.component.html +0 -4
  56. package/src/lib/component/map/map.component.spec.ts +0 -23
  57. package/src/lib/component/map/map.component.ts +0 -34
  58. package/src/lib/component/nav/layout/add-route-nav/add-route-nav.component.html +0 -46
  59. package/src/lib/component/nav/layout/add-route-nav/add-route-nav.component.scss +0 -18
  60. package/src/lib/component/nav/layout/add-route-nav/add-route-nav.component.spec.ts +0 -23
  61. package/src/lib/component/nav/layout/add-route-nav/add-route-nav.component.ts +0 -131
  62. package/src/lib/component/nav/layout/job-code-nav/job-code-nav.component.html +0 -48
  63. package/src/lib/component/nav/layout/job-code-nav/job-code-nav.component.scss +0 -24
  64. package/src/lib/component/nav/layout/job-code-nav/job-code-nav.component.ts +0 -154
  65. package/src/lib/component/nav/nav.component.html +0 -19
  66. package/src/lib/component/nav/nav.component.scss +0 -67
  67. package/src/lib/component/nav/nav.component.ts +0 -38
  68. package/src/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.html +0 -56
  69. package/src/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.scss +0 -168
  70. package/src/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.spec.ts +0 -23
  71. package/src/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.ts +0 -43
  72. package/src/lib/component/route-jobcode-list/route-jobcode-list.component.html +0 -66
  73. package/src/lib/component/route-jobcode-list/route-jobcode-list.component.scss +0 -232
  74. package/src/lib/component/route-jobcode-list/route-jobcode-list.component.ts +0 -234
  75. package/src/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.html +0 -7
  76. package/src/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.scss +0 -10
  77. package/src/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.spec.ts +0 -23
  78. package/src/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.ts +0 -15
  79. package/src/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.html +0 -28
  80. package/src/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.scss +0 -172
  81. package/src/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.spec.ts +0 -23
  82. package/src/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.ts +0 -20
  83. package/src/lib/component/shared/dialog/dialog.component.html +0 -7
  84. package/src/lib/component/shared/dialog/dialog.component.scss +0 -30
  85. package/src/lib/component/shared/dialog/dialog.component.ts +0 -18
  86. package/src/lib/component/shared/estimation-display/estimation-display.component.html +0 -7
  87. package/src/lib/component/shared/estimation-display/estimation-display.component.scss +0 -7
  88. package/src/lib/component/shared/estimation-display/estimation-display.component.ts +0 -13
  89. package/src/lib/component/shared/job-route-list/job-route-list.component.html +0 -30
  90. package/src/lib/component/shared/job-route-list/job-route-list.component.scss +0 -15
  91. package/src/lib/component/shared/job-route-list/job-route-list.component.spec.ts +0 -23
  92. package/src/lib/component/shared/job-route-list/job-route-list.component.ts +0 -54
  93. package/src/lib/component/shared/jobcode-overview/jobcode-overview.component.html +0 -11
  94. package/src/lib/component/shared/jobcode-overview/jobcode-overview.component.scss +0 -13
  95. package/src/lib/component/shared/jobcode-overview/jobcode-overview.component.spec.ts +0 -23
  96. package/src/lib/component/shared/jobcode-overview/jobcode-overview.component.ts +0 -19
  97. package/src/lib/component/shared/jobcode-status/jobcode-status.component.html +0 -5
  98. package/src/lib/component/shared/jobcode-status/jobcode-status.component.scss +0 -40
  99. package/src/lib/component/shared/jobcode-status/jobcode-status.component.spec.ts +0 -23
  100. package/src/lib/component/shared/jobcode-status/jobcode-status.component.ts +0 -11
  101. package/src/lib/component/shared/route-info-card/route-info-card.component.html +0 -11
  102. package/src/lib/component/shared/route-info-card/route-info-card.component.scss +0 -50
  103. package/src/lib/component/shared/route-info-card/route-info-card.component.spec.ts +0 -23
  104. package/src/lib/component/shared/route-info-card/route-info-card.component.ts +0 -69
  105. package/src/lib/coolmap.module.ts +0 -117
  106. package/src/test.ts +0 -27
  107. package/tsconfig.lib.json +0 -15
  108. package/tsconfig.lib.prod.json +0 -10
  109. package/tsconfig.spec.json +0 -17
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdnZGlyZWN0LWNvb2xtYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9jb29sbWFwL3NyYy9hZ2dkaXJlY3QtY29vbG1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,348 @@
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/input";
12
+ import * as i7 from "@angular/material/form-field";
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
+ coolMapService;
23
+ utils;
24
+ dialog;
25
+ config;
26
+ filterPickup;
27
+ filterDelivery;
28
+ changeNav = new EventEmitter();
29
+ updateRouteList = new EventEmitter();
30
+ pickupOptions = [];
31
+ deliveryOptions = [];
32
+ requestParmsForRouteDetails = { pickup_lat_lng: '', delivery_lat_lng: '' };
33
+ customersList = [];
34
+ unitsList = [];
35
+ materialsList = [];
36
+ addRouteForm;
37
+ routeData;
38
+ customerRepoDetails;
39
+ routeId;
40
+ preventSave = false;
41
+ preventInitialSave = false;
42
+ customersList$;
43
+ routeDetails;
44
+ destroyer$ = new Subject();
45
+ popupDetails;
46
+ enablePopUp = false;
47
+ prevantPopupClose = false;
48
+ enableForm = false;
49
+ constructor(coolMapService, utils, dialog, config) {
50
+ this.coolMapService = coolMapService;
51
+ this.utils = utils;
52
+ this.dialog = dialog;
53
+ this.config = config;
54
+ if (this.config.repository === 'customer') {
55
+ this.utils.fetchMaterialsListForCustomer().then((res) => {
56
+ this.materialsList = res;
57
+ });
58
+ }
59
+ else {
60
+ this.utils.fetchMaterialsList().then((res) => {
61
+ this.materialsList = res;
62
+ });
63
+ }
64
+ this.utils.fetchUnitsList().then((res) => {
65
+ this.unitsList = res;
66
+ });
67
+ this.formInit();
68
+ this.utils.getrouteDetailsUtility.subscribe(res => {
69
+ if (res) {
70
+ if (res['event'] !== 'click' && !this.prevantPopupClose) {
71
+ this.enablePopUp = res['event'];
72
+ }
73
+ else if (this.enablePopUp && !this.prevantPopupClose) {
74
+ this.prevantPopupClose = true;
75
+ }
76
+ if (res['event'] !== 'click' && !res['event'] && this.prevantPopupClose) {
77
+ this.popupDetails = this.utils.getdictValue('route-detailsv2');
78
+ }
79
+ else {
80
+ this.popupDetails = res['route'];
81
+ }
82
+ if (this.enablePopUp)
83
+ this.popupDetails['created_at'] = this.utils.getDateFormat(new Date(this.popupDetails['created_at']), '/');
84
+ }
85
+ });
86
+ }
87
+ filterCustomerList() {
88
+ this.customersList$ = this.addRouteForm.controls['customer_name'].valueChanges.pipe(startWith(''), map(value => this._filter(value || '')));
89
+ }
90
+ _filter(value) {
91
+ const filterValue = value.toLowerCase();
92
+ return this.customersList.filter((option) => option['customer_name'].toLowerCase().includes(filterValue));
93
+ }
94
+ ngOnChanges(changes) {
95
+ if (changes['routeData'] && !changes['routeData']['currentValue'])
96
+ this.inIt(null);
97
+ }
98
+ openDialog() {
99
+ const dialogRef = this.dialog.open(DialogComponent, {
100
+ data: { body: 'Are you sure you want to delete this route?' },
101
+ });
102
+ dialogRef.afterClosed().subscribe(res => { if (res) {
103
+ this.deleteRoute();
104
+ } });
105
+ }
106
+ editEvent() {
107
+ this.prevantPopupClose = false;
108
+ this.enableForm = true;
109
+ this.enablePopUp = false;
110
+ this.popupDetails['prevent'] = false;
111
+ this.utils.removeMapEntity.next(this.popupDetails);
112
+ this.inIt(this.popupDetails);
113
+ }
114
+ inIt(changes) {
115
+ if (changes) {
116
+ if (!changes['prevent']) {
117
+ this.preventSave = false;
118
+ this.formControlValue();
119
+ this.patchFormValue(changes).then(() => {
120
+ this.checkAndFetchRouteInformation(true);
121
+ });
122
+ }
123
+ }
124
+ if (!changes) {
125
+ this.enableForm = true;
126
+ this.preventSave = true;
127
+ this.patchFormValue().then(() => {
128
+ this.checkAndFetchRouteInformation();
129
+ });
130
+ }
131
+ }
132
+ ngOnInit() {
133
+ this.formControlValue();
134
+ if (this.config.repository === 'customer') {
135
+ this.addRouteForm.patchValue({
136
+ customer_id: this.customerRepoDetails.customer.id,
137
+ customer_name: this.customerRepoDetails.customer.name,
138
+ });
139
+ }
140
+ else {
141
+ this.utils.fetchCustomersList().then((res) => {
142
+ this.customersList = res;
143
+ this.filterCustomerList();
144
+ this.addRouteForm.controls['customer_name'].enable();
145
+ });
146
+ }
147
+ }
148
+ ngAfterViewInit() {
149
+ fromEvent(this.filterPickup.nativeElement, 'keyup').pipe(distinctUntilChanged(), debounceTime(150)).pipe(takeUntil(this.destroyer$)).subscribe(() => {
150
+ this.utils.fetchAutoCompleteLocations(this.filterPickup.nativeElement.value).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
151
+ this.pickupOptions = res.features;
152
+ });
153
+ });
154
+ fromEvent(this.filterDelivery.nativeElement, 'keyup').pipe(distinctUntilChanged(), debounceTime(150)).pipe(takeUntil(this.destroyer$)).subscribe(() => {
155
+ this.utils.fetchAutoCompleteLocations(this.filterDelivery.nativeElement.value).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
156
+ this.deliveryOptions = res.features;
157
+ });
158
+ });
159
+ }
160
+ formControlValue() {
161
+ this.addRouteForm.controls['pickup_location']?.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
162
+ if (this.addRouteForm.value.pickup_location && res !== this.addRouteForm.value.pickup_location) {
163
+ this.addRouteForm.patchValue({ pickup_lat_lng: '' });
164
+ this.addRouteForm.controls['pickup_lat_lng'].markAsTouched();
165
+ }
166
+ });
167
+ this.addRouteForm.controls['delivery_location']?.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
168
+ if (this.addRouteForm.value.delivery_location && res !== this.addRouteForm.value.delivery_location) {
169
+ this.addRouteForm.patchValue({ delivery_lat_lng: '' });
170
+ this.addRouteForm.controls['delivery_lat_lng'].markAsTouched();
171
+ }
172
+ });
173
+ }
174
+ formInit() {
175
+ this.addRouteForm = new FormGroup({
176
+ route_name: new FormControl('', [Validators.required]),
177
+ customer_name: new FormControl({ value: '', disabled: true }, [Validators.required]),
178
+ customer_id: new FormControl(''),
179
+ materials_id: new FormControl('', [Validators.required]),
180
+ unit_id: new FormControl('', [Validators.required]),
181
+ path: new FormControl('', [Validators.required]),
182
+ pickup_location: new FormControl('', [Validators.required]),
183
+ pickup_lat_lng: new FormControl('', [Validators.required]),
184
+ delivery_location: new FormControl('', [Validators.required]),
185
+ delivery_lat_lng: new FormControl('', [Validators.required]),
186
+ estimated_distance: new FormControl('', [Validators.required]),
187
+ estimated_time: new FormControl('', [Validators.required]),
188
+ note: new FormControl('', [Validators.maxLength(2048)]),
189
+ trucker_pay_estimate: new FormControl(null),
190
+ customer_price_estimate: new FormControl(null),
191
+ });
192
+ }
193
+ async patchFormValue(data) {
194
+ this.addRouteForm.reset();
195
+ this.addRouteForm.patchValue(data);
196
+ if (this.config.repository === 'customer') {
197
+ this.addRouteForm.patchValue({
198
+ customer_id: this.customerRepoDetails.customer.id,
199
+ customer_name: this.customerRepoDetails.customer.name,
200
+ });
201
+ }
202
+ this.routeId = data?.route_id;
203
+ this.routeDetails = data ? { pickup_location: data.pickup_location, delivery_location: data.delivery_location } : null;
204
+ this.addRouteForm.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe(res => {
205
+ if (res) {
206
+ if (this.preventInitialSave)
207
+ this.preventInitialSave = false;
208
+ }
209
+ });
210
+ this.filterCustomerList();
211
+ await true;
212
+ }
213
+ selectedLongLat(type, event) {
214
+ if (type === 'pickup') {
215
+ this.addRouteForm.patchValue({
216
+ pickup_lat_lng: (event.geometry.coordinates[1] + ',' + event.geometry.coordinates[0]).toString()
217
+ });
218
+ this.coolMapService.clearBoundWithCordinates();
219
+ }
220
+ else if (type === 'delivery') {
221
+ this.addRouteForm.patchValue({
222
+ delivery_lat_lng: (event.geometry.coordinates[1] + ',' + event.geometry.coordinates[0]).toString()
223
+ });
224
+ }
225
+ this.checkAndFetchRouteInformation();
226
+ }
227
+ checkAndFetchRouteInformation(isinitial) {
228
+ if (this.addRouteForm.value?.delivery_lat_lng?.length > 0 && this.addRouteForm.value?.pickup_lat_lng?.length > 0 && this.addRouteForm.value.unit_id) {
229
+ let unit = this.unitsList.find((x) => x.id === this.addRouteForm.value.unit_id);
230
+ const param = {
231
+ delivery_lat_lng: this.addRouteForm.value.delivery_lat_lng,
232
+ pickup_lat_lng: this.addRouteForm.value.pickup_lat_lng,
233
+ unit: unit?.type
234
+ };
235
+ this.utils.postdata('calculate/routes/estimation', param).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
236
+ if (res && res['path']) {
237
+ this.addRouteForm.patchValue({
238
+ estimated_distance: res['dist'],
239
+ estimated_time: res['time'],
240
+ path: res['path'],
241
+ trucker_pay_estimate: res['trucker_haul_cost'],
242
+ customer_price_estimate: (+(+res['trucker_haul_cost'] / 0.80).toFixed(2))
243
+ });
244
+ let path = res['path'].split(';');
245
+ path = path.map((ele) => { return ele = this.formateLatLong(ele); });
246
+ res['path'] = path;
247
+ const element = {
248
+ type: 'FeatureCollection',
249
+ features: [{ type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates: res['path'] } }]
250
+ };
251
+ this.coolMapService.removeRouteAndMarker(1).then(() => {
252
+ const unit = this.unitsList.find((x) => x.id === this.addRouteForm.value.unit_id);
253
+ const materialDetails = this.materialsList.find((x) => x.sub_material_id === this.addRouteForm.value.materials_id);
254
+ this.coolMapService.loadMapProperty(element, 1, unit?.type, {
255
+ pickup_location: this.addRouteForm.get('pickup_location')?.value,
256
+ delivery_location: this.addRouteForm.get('delivery_location')?.value,
257
+ route_name: this.addRouteForm.get('route_name')?.value,
258
+ materialLabel: materialDetails?.label,
259
+ unit: unit?.type
260
+ }).then((res) => { this.preventSave = true; });
261
+ });
262
+ }
263
+ else {
264
+ this.coolMapService.removeRouteAndMarker(1);
265
+ this.utils.openSnackBar(res['status'], 'error');
266
+ }
267
+ if (this.routeId && isinitial)
268
+ this.preventInitialSave = true;
269
+ });
270
+ }
271
+ else {
272
+ this.coolMapService.removeRouteAndMarker(1);
273
+ }
274
+ }
275
+ formateLatLong(latlong) { return latlong ? latlong.split(',').map(x => +x).reverse() : null; }
276
+ saveRoute() {
277
+ if (this.addRouteForm.valid) {
278
+ this.preventSave = false;
279
+ const data = this.addRouteForm.getRawValue();
280
+ const url = this.routeId ? this.utils.postdata('update/routes', data) : this.utils.postdata('add/routes', data);
281
+ if (this.routeId)
282
+ data['id'] = this.routeId;
283
+ url.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
284
+ if (res.success) {
285
+ this.updateRouteList.emit(true);
286
+ this.utils.openSnackBar(res.message, 'success');
287
+ this.preventInitialSave = true;
288
+ this.preventSave = true;
289
+ if (!this.routeId)
290
+ this.changeNav.next('Addroute');
291
+ }
292
+ else {
293
+ this.utils.openSnackBar(res.message, 'error');
294
+ this.preventSave = true;
295
+ }
296
+ }, (err) => { if (err) {
297
+ this.preventSave = true;
298
+ } });
299
+ }
300
+ else {
301
+ this.addRouteForm.markAllAsTouched();
302
+ }
303
+ }
304
+ deleteRoute() {
305
+ this.preventSave = false;
306
+ this.utils.postdata('delete/routes', { uuid: this.routeId }).subscribe(res => {
307
+ if (res['data']['success']) {
308
+ this.utils.openSnackBar(res['data']['message'], 'success');
309
+ this.updateRouteList.emit(true);
310
+ this.changeNav.next('Addroute');
311
+ this.preventInitialSave = true;
312
+ this.preventSave = true;
313
+ }
314
+ else {
315
+ this.utils.openSnackBar('Somthing went wrong', 'error');
316
+ this.preventSave = true;
317
+ }
318
+ }, (err) => { this.preventSave = true; });
319
+ }
320
+ ngOnDestroy() {
321
+ this.destroyer$.next(true);
322
+ this.destroyer$.unsubscribe();
323
+ }
324
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AddRouteComponent, deps: [{ token: i1.CoolmapService }, { token: i1.UtilsService }, { token: i2.MatDialog }, { token: 'memberData' }], target: i0.ɵɵFactoryTarget.Component });
325
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.2", 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 <mat-label>Customer_name</mat-label>\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% - 340px);position:absolute;left:320px;bottom:10px;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:#fff;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:10px;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:#000;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:#fff;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;-webkit-box-flex:0;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;-webkit-box-flex:0;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:#fff;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.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: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], 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: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i11.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i12.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i13.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", 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" }] });
326
+ }
327
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AddRouteComponent, decorators: [{
328
+ type: Component,
329
+ 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 <mat-label>Customer_name</mat-label>\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% - 340px);position:absolute;left:320px;bottom:10px;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:#fff;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:10px;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:#000;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:#fff;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;-webkit-box-flex:0;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;-webkit-box-flex:0;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:#fff;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"] }]
330
+ }], ctorParameters: () => [{ type: i1.CoolmapService }, { type: i1.UtilsService }, { type: i2.MatDialog }, { type: i1.CoolmapConfigModel, decorators: [{
331
+ type: Inject,
332
+ args: ['memberData']
333
+ }] }], propDecorators: { filterPickup: [{
334
+ type: ViewChild,
335
+ args: ['filterPickup']
336
+ }], filterDelivery: [{
337
+ type: ViewChild,
338
+ args: ['filterDelivery']
339
+ }], changeNav: [{
340
+ type: Output
341
+ }], updateRouteList: [{
342
+ type: Output
343
+ }], routeData: [{
344
+ type: Input
345
+ }], customerRepoDetails: [{
346
+ type: Input
347
+ }] } });
348
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXJvdXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAvc3JjL2xpYi9jb21wb25lbnQvYWRkLXJvdXRlL2FkZC1yb3V0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb29sbWFwL3NyYy9saWIvY29tcG9uZW50L2FkZC1yb3V0ZS9hZGQtcm91dGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkosT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFjLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXJILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVcEUsTUFBTSxPQUFPLGlCQUFpQjtJQXlCVDtJQUF1QztJQUE0QjtJQUN2RDtJQXpCRyxZQUFZLENBQWM7SUFDeEIsY0FBYyxDQUFjO0lBQy9DLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBQ3ZDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBQy9ELGFBQWEsR0FBUSxFQUFFLENBQUM7SUFDeEIsZUFBZSxHQUFRLEVBQUUsQ0FBQztJQUMxQiwyQkFBMkIsR0FBRyxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUE7SUFDMUUsYUFBYSxHQUFRLEVBQUUsQ0FBQztJQUN4QixTQUFT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ZiwgT25Jbml0LCBWaWV3Q2hpbGQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsIElucHV0LCBPbkRlc3Ryb3ksIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZyb21FdmVudCwgbWFwLCBPYnNlcnZhYmxlLCBzdGFydFdpdGgsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL3NoYXJlZC9kaWFsb2cvZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb29sbWFwQ29uZmlnTW9kZWwsIENvb2xtYXBTZXJ2aWNlLCBDdXN0b21lclJlcG9EZXRhaWxzTW9kZWwsIFJvdXRlLCBVdGlsc1NlcnZpY2UgfSBmcm9tICdAYWdnZGlyZWN0L2Nvb2xtYXAtc2VydmljZXMnO1xuXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFkZC1yb3V0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtcm91dGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hZGQtcm91dGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBBZGRSb3V0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdmaWx0ZXJQaWNrdXAnKSBwdWJsaWMgZmlsdGVyUGlja3VwITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZmlsdGVyRGVsaXZlcnknKSBwdWJsaWMgZmlsdGVyRGVsaXZlcnkhOiBFbGVtZW50UmVmO1xuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZU5hdiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcHVibGljIHVwZGF0ZVJvdXRlTGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgcGlja3VwT3B0aW9uczogYW55ID0gW107XG4gIGRlbGl2ZXJ5T3B0aW9uczogYW55ID0gW107XG4gIHJlcXVlc3RQYXJtc0ZvclJvdXRlRGV0YWlscyA9IHsgcGlja3VwX2xhdF9sbmc6ICcnLCBkZWxpdmVyeV9sYXRfbG5nOiAnJyB9XG4gIGN1c3RvbWVyc0xpc3Q6IGFueSA9IFtdO1xuICB1bml0c0xpc3Q6IGFueSA9IFtdO1xuICBtYXRlcmlhbHNMaXN0OiBhbnkgPSBbXTtcbiAgYWRkUm91dGVGb3JtITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBwdWJsaWMgcm91dGVEYXRhITogUm91dGU7XG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21lclJlcG9EZXRhaWxzITogQ3VzdG9tZXJSZXBvRGV0YWlsc01vZGVsO1xuICByb3V0ZUlkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBwcmV2ZW50U2F2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcmV2ZW50SW5pdGlhbFNhdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VzdG9tZXJzTGlzdCQhOiBPYnNlcnZhYmxlPGFueT47XG4gIHJvdXRlRGV0YWlscyE6IHsgcGlja3VwX2xvY2F0aW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkOyBkZWxpdmVyeV9sb2NhdGlvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDsgfSB8IG51bGw7XG4gIHB1YmxpYyBkZXN0cm95ZXIkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcG9wdXBEZXRhaWxzOiBSb3V0ZTtcbiAgZW5hYmxlUG9wVXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJldmFudFBvcHVwQ2xvc2UgPSBmYWxzZTtcbiAgZW5hYmxlRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb29sTWFwU2VydmljZTogQ29vbG1hcFNlcnZpY2UsIHB1YmxpYyB1dGlsczogVXRpbHNTZXJ2aWNlLCBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgQEluamVjdCgnbWVtYmVyRGF0YScpIHB1YmxpYyBjb25maWc6IENvb2xtYXBDb25maWdNb2RlbCkgeyAgICAgIFxuICAgIGlmICh0aGlzLmNvbmZpZy5yZXBvc2l0b3J5ID09PSAnY3VzdG9tZXInKSB7XG4gICAgICB0aGlzLnV0aWxzLmZldGNoTWF0ZXJpYWxzTGlzdEZvckN1c3RvbWVyKCkudGhlbigocmVzKT0+eyAgICAgICAgXG4gICAgICAgIHRoaXMubWF0ZXJpYWxzTGlzdCA9IHJlcztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnV0aWxzLmZldGNoTWF0ZXJpYWxzTGlzdCgpLnRoZW4oKHJlcyk9PntcbiAgICAgICAgdGhpcy5tYXRlcmlhbHNMaXN0ID0gcmVzO1xuICAgICAgfSk7XG4gICAgfVxuICAgXG4gICAgdGhpcy51dGlscy5mZXRjaFVuaXRzTGlzdCgpLnRoZW4oKHJlcyk9PntcbiAgICAgIHRoaXMudW5pdHNMaXN0ID0gcmVzO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybUluaXQoKTtcbiAgICB0aGlzLnV0aWxzLmdldHJvdXRlRGV0YWlsc1V0aWxpdHkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmIChyZXNbJ2V2ZW50J10gIT09ICdjbGljaycgJiYgIXRoaXMucHJldmFudFBvcHVwQ2xvc2UpIHsgdGhpcy5lbmFibGVQb3BVcCA9IHJlc1snZXZlbnQnXSB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZW5hYmxlUG9wVXAgJiYgIXRoaXMucHJldmFudFBvcHVwQ2xvc2UpIHsgdGhpcy5wcmV2YW50UG9wdXBDbG9zZSA9IHRydWU7IH1cbiAgICAgICAgaWYgKHJlc1snZXZlbnQnXSAhPT0gJ2NsaWNrJyAmJiAhcmVzWydldmVudCddICYmIHRoaXMucHJldmFudFBvcHVwQ2xvc2UpIHtcbiAgICAgICAgICB0aGlzLnBvcHVwRGV0YWlscyA9IHRoaXMudXRpbHMuZ2V0ZGljdFZhbHVlKCdyb3V0ZS1kZXRhaWxzdjInKTtcbiAgICAgICAgfSBlbHNlIHsgdGhpcy5wb3B1cERldGFpbHMgPSByZXNbJ3JvdXRlJ10gfVxuICAgICAgICBpZiAodGhpcy5lbmFibGVQb3BVcCkgdGhpcy5wb3B1cERldGFpbHNbJ2NyZWF0ZWRfYXQnXSA9IHRoaXMudXRpbHMuZ2V0RGF0ZUZvcm1hdChuZXcgRGF0ZSh0aGlzLnBvcHVwRGV0YWlsc1snY3JlYXRlZF9hdCddKSwgJy8nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmaWx0ZXJDdXN0b21lckxpc3QoKSB7XG4gICAgdGhpcy5jdXN0b21lcnNMaXN0JCA9IHRoaXMuYWRkUm91dGVGb3JtLmNvbnRyb2xzWydjdXN0b21lcl9uYW1lJ10udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBzdGFydFdpdGgoJycpLFxuICAgICAgbWFwKHZhbHVlID0+IHRoaXMuX2ZpbHRlcih2YWx1ZSB8fCAnJykpLFxuICAgICk7XG4gIH1cbiAgcHVibGljIF9maWx0ZXIodmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tZXJzTGlzdC5maWx0ZXIoKG9wdGlvbjogYW55KSA9PiBvcHRpb25bJ2N1c3RvbWVyX25hbWUnXS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydyb3V0ZURhdGEnXSAmJiAhY2hhbmdlc1sncm91dGVEYXRhJ11bJ2N1cnJlbnRWYWx1ZSddKSB0aGlzLmluSXQobnVsbCk7XG4gIH1cbiAgb3BlbkRpYWxvZygpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YTogeyBib2R5OiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHJvdXRlPycgfSxcbiAgICB9KTtcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHsgaWYgKHJlcykgeyB0aGlzLmRlbGV0ZVJvdXRlKCkgfSB9KTtcbiAgfVxuICBlZGl0RXZlbnQoKSB7XG4gICAgdGhpcy5wcmV2YW50UG9wdXBDbG9zZSA9IGZhbHNlO1xuICAgIHRoaXMuZW5hYmxlRm9ybSA9IHRydWU7IHRoaXMuZW5hYmxlUG9wVXAgPSBmYWxzZTtcbiAgICB0aGlzLnBvcHVwRGV0YWlsc1sncHJldmVudCddID0gZmFsc2U7XG4gICAgdGhpcy51dGlscy5yZW1vdmVNYXBFbnRpdHkubmV4dCh0aGlzLnBvcHVwRGV0YWlscyk7XG4gICAgdGhpcy5pbkl0KHRoaXMucG9wdXBEZXRhaWxzKTtcbiAgfVxuICBpbkl0KGNoYW5nZXM6IFJvdXRlKSB7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIGlmICghY2hhbmdlc1sncHJldmVudCddKSB7XG4gICAgICAgIHRoaXMucHJldmVudFNhdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbFZhbHVlKCk7XG4gICAgICAgIHRoaXMucGF0Y2hGb3JtVmFsdWUoY2hhbmdlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGVja0FuZEZldGNoUm91dGVJbmZvcm1hdGlvbih0cnVlKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjaGFuZ2VzKSB7XG4gICAgICB0aGlzLmVuYWJsZUZvcm0gPSB0cnVlOyB0aGlzLnByZXZlbnRTYXZlID0gdHJ1ZTtcbiAgICAgIHRoaXMucGF0Y2hGb3JtVmFsdWUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja0FuZEZldGNoUm91dGVJbmZvcm1hdGlvbigpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtQ29udHJvbFZhbHVlKCk7XG4gICAgaWYgKHRoaXMuY29uZmlnLnJlcG9zaXRvcnkgPT09ICdjdXN0b21lcicpIHtcbiAgICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBjdXN0b21lcl9pZDogdGhpcy5jdXN0b21lclJlcG9EZXRhaWxzLmN1c3RvbWVyLmlkLFxuICAgICAgICBjdXN0b21lcl9uYW1lOiB0aGlzLmN1c3RvbWVyUmVwb0RldGFpbHMuY3VzdG9tZXIubmFtZSxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXRpbHMuZmV0Y2hDdXN0b21lcnNMaXN0KCkudGhlbigocmVzKT0+e1xuICAgICAgICB0aGlzLmN1c3RvbWVyc0xpc3QgPSByZXM7IHRoaXMuZmlsdGVyQ3VzdG9tZXJMaXN0KCk7IHRoaXMuYWRkUm91dGVGb3JtLmNvbnRyb2xzWydjdXN0b21lcl9uYW1lJ10uZW5hYmxlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgZnJvbUV2ZW50KHRoaXMuZmlsdGVyUGlja3VwLm5hdGl2ZUVsZW1lbnQsICdrZXl1cCcpLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBkZWJvdW5jZVRpbWUoMTUwKSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy51dGlscy5mZXRjaEF1dG9Db21wbGV0ZUxvY2F0aW9ucyh0aGlzLmZpbHRlclBpY2t1cC5uYXRpdmVFbGVtZW50LnZhbHVlKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5waWNrdXBPcHRpb25zID0gcmVzLmZlYXR1cmVzO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgZnJvbUV2ZW50KHRoaXMuZmlsdGVyRGVsaXZlcnkubmF0aXZlRWxlbWVudCwgJ2tleXVwJykucGlwZShcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlYm91bmNlVGltZSgxNTApKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnV0aWxzLmZldGNoQXV0b0NvbXBsZXRlTG9jYXRpb25zKHRoaXMuZmlsdGVyRGVsaXZlcnkubmF0aXZlRWxlbWVudC52YWx1ZSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVsaXZlcnlPcHRpb25zID0gcmVzLmZlYXR1cmVzO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZm9ybUNvbnRyb2xWYWx1ZSgpIHtcbiAgICB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1sncGlja3VwX2xvY2F0aW9uJ10/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICBpZiAodGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUucGlja3VwX2xvY2F0aW9uICYmIHJlcyAhPT0gdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUucGlja3VwX2xvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoeyBwaWNrdXBfbGF0X2xuZzogJycgfSk7XG4gICAgICAgIHRoaXMuYWRkUm91dGVGb3JtLmNvbnRyb2xzWydwaWNrdXBfbGF0X2xuZyddLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYWRkUm91dGVGb3JtLmNvbnRyb2xzWydkZWxpdmVyeV9sb2NhdGlvbiddPy52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLmRlbGl2ZXJ5X2xvY2F0aW9uICYmIHJlcyAhPT0gdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUuZGVsaXZlcnlfbG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5hZGRSb3V0ZUZvcm0ucGF0Y2hWYWx1ZSh7IGRlbGl2ZXJ5X2xhdF9sbmc6ICcnIH0pO1xuICAgICAgICB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1snZGVsaXZlcnlfbGF0X2xuZyddLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZvcm1Jbml0KCkge1xuICAgIHRoaXMuYWRkUm91dGVGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICByb3V0ZV9uYW1lOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBjdXN0b21lcl9uYW1lOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBjdXN0b21lcl9pZDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIG1hdGVyaWFsc19pZDogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgdW5pdF9pZDogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgcGF0aDogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgcGlja3VwX2xvY2F0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBwaWNrdXBfbGF0X2xuZzogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgZGVsaXZlcnlfbG9jYXRpb246IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIGRlbGl2ZXJ5X2xhdF9sbmc6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIGVzdGltYXRlZF9kaXN0YW5jZTogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgZXN0aW1hdGVkX3RpbWU6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIG5vdGU6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDIwNDgpXSksXG4gICAgICB0cnVja2VyX3BheV9lc3RpbWF0ZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgY3VzdG9tZXJfcHJpY2VfZXN0aW1hdGU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHBhdGNoRm9ybVZhbHVlKGRhdGE/OiBSb3V0ZSkge1xuICAgIHRoaXMuYWRkUm91dGVGb3JtLnJlc2V0KCk7XG4gICAgdGhpcy5hZGRSb3V0ZUZvcm0ucGF0Y2hWYWx1ZShkYXRhISk7XG4gICAgaWYgKHRoaXMuY29uZmlnLnJlcG9zaXRvcnkgPT09ICdjdXN0b21lcicpIHsgICAgICBcbiAgICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBjdXN0b21lcl9pZDogdGhpcy5jdXN0b21lclJlcG9EZXRhaWxzLmN1c3RvbWVyLmlkLFxuICAgICAgICBjdXN0b21lcl9uYW1lOiB0aGlzLmN1c3RvbWVyUmVwb0RldGFpbHMuY3VzdG9tZXIubmFtZSxcbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMucm91dGVJZCA9IGRhdGE/LnJvdXRlX2lkO1xuICAgIHRoaXMucm91dGVEZXRhaWxzID0gZGF0YSA/IHsgcGlja3VwX2xvY2F0aW9uOiBkYXRhLnBpY2t1cF9sb2NhdGlvbiwgZGVsaXZlcnlfbG9jYXRpb246IGRhdGEuZGVsaXZlcnlfbG9jYXRpb24gfSA6IG51bGw7XG4gICAgdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgaWYgKHJlcykgeyBpZiAodGhpcy5wcmV2ZW50SW5pdGlhbFNhdmUpIHRoaXMucHJldmVudEluaXRpYWxTYXZlID0gZmFsc2UgfVxuICAgIH0pO1xuICAgIHRoaXMuZmlsdGVyQ3VzdG9tZXJMaXN0KCk7XG4gICAgYXdhaXQgdHJ1ZTtcbiAgfVxuXG4gIHNlbGVjdGVkTG9uZ0xhdCh0eXBlOiBzdHJpbmcsIGV2ZW50OiBhbnkpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3BpY2t1cCcpIHtcbiAgICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBwaWNrdXBfbGF0X2xuZzogKGV2ZW50Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdICsgJywnICsgZXZlbnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0pLnRvU3RyaW5nKClcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb29sTWFwU2VydmljZS5jbGVhckJvdW5kV2l0aENvcmRpbmF0ZXMoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkZWxpdmVyeScpIHtcbiAgICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBkZWxpdmVyeV9sYXRfbG5nOiAoZXZlbnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0gKyAnLCcgKyBldmVudC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSkudG9TdHJpbmcoKVxuICAgICAgfSlcbiAgICB9XG4gICAgdGhpcy5jaGVja0FuZEZldGNoUm91dGVJbmZvcm1hdGlvbigpO1xuICB9XG5cbiAgY2hlY2tBbmRGZXRjaFJvdXRlSW5mb3JtYXRpb24oaXNpbml0aWFsPzogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZT8uZGVsaXZlcnlfbGF0X2xuZz8ubGVuZ3RoID4gMCAmJiB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZT8ucGlja3VwX2xhdF9sbmc/Lmxlbmd0aCA+IDAgJiYgdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUudW5pdF9pZCkge1xuICAgICAgbGV0IHVuaXQgPSB0aGlzLnVuaXRzTGlzdC5maW5kKCh4OiBhbnkpID0+IHguaWQgPT09IHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLnVuaXRfaWQpO1xuICAgICAgY29uc3QgcGFyYW0gPSB7XG4gICAgICAgIGRlbGl2ZXJ5X2xhdF9sbmc6IHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLmRlbGl2ZXJ5X2xhdF9sbmcsXG4gICAgICAgIHBpY2t1cF9sYXRfbG5nOiB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5waWNrdXBfbGF0X2xuZyxcbiAgICAgICAgdW5pdDogdW5pdD8udHlwZVxuICAgICAgfTtcbiAgICAgIHRoaXMudXRpbHMucG9zdGRhdGEoJ2NhbGN1bGF0ZS9yb3V0ZXMvZXN0aW1hdGlvbicsIHBhcmFtKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzWydwYXRoJ10pIHtcbiAgICAgICAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgIGVzdGltYXRlZF9kaXN0YW5jZTogcmVzWydkaXN0J10sXG4gICAgICAgICAgICBlc3RpbWF0ZWRfdGltZTogcmVzWyd0aW1lJ10sXG4gICAgICAgICAgICBwYXRoOiByZXNbJ3BhdGgnXSxcbiAgICAgICAgICAgIHRydWNrZXJfcGF5X2VzdGltYXRlOiByZXNbJ3RydWNrZXJfaGF1bF9jb3N0J10sXG4gICAgICAgICAgICBjdXN0b21lcl9wcmljZV9lc3RpbWF0ZTogKCsoK3Jlc1sndHJ1Y2tlcl9oYXVsX2Nvc3QnXSAvIDAuODApLnRvRml4ZWQoMikpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHBhdGggPSByZXNbJ3BhdGgnXS5zcGxpdCgnOycpO1xuICAgICAgICAgIHBhdGggPSBwYXRoLm1hcCgoZWxlOiBzdHJpbmcgfCBhbnkpID0+IHsgcmV0dXJuIGVsZSA9IHRoaXMuZm9ybWF0ZUxhdExvbmcoZWxlKSB9KTtcbiAgICAgICAgICByZXNbJ3BhdGgnXSA9IHBhdGg7XG4gICAgICAgICAgY29uc3QgZWxlbWVudDogYW55ID0ge1xuICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIGZlYXR1cmVzOiBbeyB0eXBlOiAnRmVhdHVyZScsIHByb3BlcnRpZXM6IHt9LCBnZW9tZXRyeTogeyB0eXBlOiAnTGluZVN0cmluZycsIGNvb3JkaW5hdGVzOiByZXNbJ3BhdGgnXSB9IH1dXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29vbE1hcFNlcnZpY2UucmVtb3ZlUm91dGVBbmRNYXJrZXIoMSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1bml0ID0gdGhpcy51bml0c0xpc3QuZmluZCgoeDogYW55KSA9PiB4LmlkID09PSB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS51bml0X2lkKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsRGV0YWlscyA9IHRoaXMubWF0ZXJpYWxzTGlzdC5maW5kKCh4OiBhbnkpID0+IHguc3ViX21hdGVyaWFsX2lkID09PSB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5tYXRlcmlhbHNfaWQpO1xuICAgICAgICAgICAgdGhpcy5jb29sTWFwU2VydmljZS5sb2FkTWFwUHJvcGVydHkoZWxlbWVudCwgMSwgdW5pdD8udHlwZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBpY2t1cF9sb2NhdGlvbjogdGhpcy5hZGRSb3V0ZUZvcm0uZ2V0KCdwaWNrdXBfbG9jYXRpb24nKT8udmFsdWUsXG4gICAgICAgICAgICAgICAgZGVsaXZlcnlfbG9jYXRpb246IHRoaXMuYWRkUm91dGVGb3JtLmdldCgnZGVsaXZlcnlfbG9jYXRpb24nKT8udmFsdWUsXG4gICAgICAgICAgICAgICAgcm91dGVfbmFtZTogdGhpcy5hZGRSb3V0ZUZvcm0uZ2V0KCdyb3V0ZV9uYW1lJyk/LnZhbHVlLFxuICAgICAgICAgICAgICAgIG1hdGVyaWFsTGFiZWw6IG1hdGVyaWFsRGV0YWlscz8ubGFiZWwsXG4gICAgICAgICAgICAgICAgdW5pdDogdW5pdD8udHlwZVxuICAgICAgICAgICAgICB9KS50aGVuKChyZXMpID0+IHsgdGhpcy5wcmV2ZW50U2F2ZSA9IHRydWUgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb29sTWFwU2VydmljZS5yZW1vdmVSb3V0ZUFuZE1hcmtlcigxKTtcbiAgICAgICAgICB0aGlzLnV0aWxzLm9wZW5TbmFja0JhcihyZXNbJ3N0YXR1cyddLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yb3V0ZUlkICYmIGlzaW5pdGlhbCkgdGhpcy5wcmV2ZW50SW5pdGlhbFNhdmUgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHsgdGhpcy5jb29sTWFwU2VydmljZS5yZW1vdmVSb3V0ZUFuZE1hcmtlcigxKSB9XG4gIH1cblxuICBmb3JtYXRlTGF0TG9uZyhsYXRsb25nOiBzdHJpbmcpIHsgcmV0dXJuIGxhdGxvbmcgPyBsYXRsb25nLnNwbGl0KCcsJykubWFwKHggPT4gK3gpLnJldmVyc2UoKSA6IG51bGwgfVxuICBzYXZlUm91dGUoKSB7XG4gICAgaWYgKHRoaXMuYWRkUm91dGVGb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLnByZXZlbnRTYXZlID0gZmFsc2U7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5hZGRSb3V0ZUZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVJZCA/IHRoaXMudXRpbHMucG9zdGRhdGEoJ3VwZGF0ZS9yb3V0ZXMnLCBkYXRhKSA6IHRoaXMudXRpbHMucG9zdGRhdGEoJ2FkZC9yb3V0ZXMnLCBkYXRhKVxuICAgICAgaWYgKHRoaXMucm91dGVJZCkgZGF0YVsnaWQnXSA9IHRoaXMucm91dGVJZDtcbiAgICAgIHVybC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMudXBkYXRlUm91dGVMaXN0LmVtaXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy51dGlscy5vcGVuU25hY2tCYXIocmVzLm1lc3NhZ2UsICdzdWNjZXNzJyk7XG4gICAgICAgICAgdGhpcy5wcmV2ZW50SW5pdGlhbFNhdmUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucHJldmVudFNhdmUgPSB0cnVlO1xuICAgICAgICAgIGlmICghdGhpcy5yb3V0ZUlkKSB0aGlzLmNoYW5nZU5hdi5uZXh0KCdBZGRyb3V0ZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXRpbHMub3BlblNuYWNrQmFyKHJlcy5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICB0aGlzLnByZXZlbnRTYXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSwgKGVycikgPT4geyBpZiAoZXJyKSB7IHRoaXMucHJldmVudFNhdmUgPSB0cnVlOyB9IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFJvdXRlRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgfVxuICB9XG4gIGRlbGV0ZVJvdXRlKCkge1xuICAgIHRoaXMucHJldmVudFNhdmUgPSBmYWxzZTtcbiAgICB0aGlzLnV0aWxzLnBvc3RkYXRhKCdkZWxldGUvcm91dGVzJywgeyB1dWlkOiB0aGlzLnJvdXRlSWQgfSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICBpZiAocmVzWydkYXRhJ11bJ3N1Y2Nlc3MnXSkge1xuICAgICAgICB0aGlzLnV0aWxzLm9wZW5TbmFja0JhcihyZXNbJ2RhdGEnXVsnbWVzc2FnZSddLCAnc3VjY2VzcycpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvdXRlTGlzdC5lbWl0KHRydWUpO1xuICAgICAgICB0aGlzLmNoYW5nZU5hdi5uZXh0KCdBZGRyb3V0ZScpO1xuICAgICAgICB0aGlzLnByZXZlbnRJbml0aWFsU2F2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMucHJldmVudFNhdmUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51dGlscy5vcGVuU25hY2tCYXIoJ1NvbXRoaW5nIHdlbnQgd3JvbmcnLCAnZXJyb3InKTtcbiAgICAgICAgdGhpcy5wcmV2ZW50U2F2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSwgKGVycikgPT4geyB0aGlzLnByZXZlbnRTYXZlID0gdHJ1ZSB9KVxuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVyJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveWVyJC51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYWRkcm91dGVib3hcIj5cbiAgPGRpdiBjbGFzcz1cInJvdXRlZGV0YWlsYm94XCIgKm5nSWY9XCJlbmFibGVQb3BVcFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjbG9zZWJ0bnJvdXRlZGV0YWlsXCI+XG4gICAgICA8bWF0LWljb24gKGNsaWNrKT1cInByZXZhbnRQb3B1cENsb3NlID0gZmFsc2U7IGVuYWJsZVBvcFVwID0gZmFsc2U7XCI+Y2xlYXI8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuICAgICAgPGxpYi1yb3V0ZS1pbmZvLWNhcmQgW3Byb3BEYXRhXT1cIntjbGFzc05hbWU6ICdyb3V0ZUNhcmQnLCByZXBvc2l0b3J5OiBjb25maWdbJ3JlcG9zaXRvcnknXX1cIiBbcG9wdXBEYXRhXT1cInBvcHVwRGV0YWlsc1wiPjwvbGliLXJvdXRlLWluZm8tY2FyZD5cbiAgICA8ZGl2IGNsYXNzPVwiY3JlYXRlVHh0XCI+XG4gICAgICA8c21hbGw+XG4gICAgICAgIENyZWF0ZWQgYnkge3twb3B1cERldGFpbHNbJ2NyZWF0ZWRfYnlfbmFtZSddfX0gb24ge3twb3B1cERldGFpbHNbJ2NyZWF0ZWRfYXQnXX19XG4gICAgICA8L3NtYWxsPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImVkaXRidG5cIiAoY2xpY2spPVwiZWRpdEV2ZW50KClcIj5FZGl0PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiYWRkX2FkZF9yb3V0ZV9ib3hcIiBjZGtEcmFnIFtzdHlsZS52aXNpYmlsaXR5XT1cIiFlbmFibGVGb3JtID8gJ2hpZGRlbicgOiAndmlzaWJsZSdcIj5cbiAgICA8ZGl2IGNsYXNzPVwidG9waGVhZGluZ3BydFwiPlxuICAgICAgPGgyPiB7e3JvdXRlSWQ/ICdFRElUJyA6ICdBREQnfX0gUk9VVEUgPC9oMj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25wcnRcIj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInJvdXRlSWRcIiBjbGFzcz1cImRlbGJ0blwiIChjbGljayk9XCJvcGVuRGlhbG9nKClcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJjbG9zZWJ0blwiIChjbGljayk9XCJjaGFuZ2VOYXYubmV4dCgnQWRkcm91dGUnKVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImFkZFJvdXRlRm9ybVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdXRlX2Zvcm1fYXJlYVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPlJvdXRlIE5hbWU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJyb3V0ZV9uYW1lXCIgYXV0b2NvbXBsZXRlPVwibm9wZVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWydyb3V0ZV9uYW1lJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgUm91dGUgTmFtZSBpcyByZXF1aXJlZFxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+Q3VzdG9tZXJfbmFtZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJDdXN0b21lciBOYW1lXCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiY3VzdG9tZXJfbmFtZVwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBhdXRvQWN0aXZlRmlyc3RPcHRpb24gI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGN1c3RvbWVyIG9mIGN1c3RvbWVyc0xpc3QkIHwgYXN5bmNcIiBbdmFsdWVdPVwiY3VzdG9tZXJbJ2N1c3RvbWVyX25hbWUnXVwiPlxuICAgICAgICAgICAgICAgIHt7Y3VzdG9tZXJbJ2N1c3RvbWVyX25hbWUnXX19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJhZGRSb3V0ZUZvcm0uY29udHJvbHNbJ2N1c3RvbWVyX25hbWUnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICBDdXN0b21lciBuYW1lIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+UGlja3VwPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIG1hdElucHV0ICNmaWx0ZXJQaWNrdXAgW21hdEF1dG9jb21wbGV0ZV09XCJwaWNrdXBBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaWNrdXBfbG9jYXRpb25cIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuXG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjcGlja3VwQXV0b2NvbXBsZXRlPVwibWF0QXV0b2NvbXBsZXRlXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIChjbGljayk9XCJzZWxlY3RlZExvbmdMYXQoJ3BpY2t1cCcsIG9wdGlvbilcIiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHBpY2t1cE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24/LnBsYWNlX25hbWVcIj5cbiAgICAgICAgICAgICAgICB7e29wdGlvbj8ucGxhY2VfbmFtZX19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJhZGRSb3V0ZUZvcm0uY29udHJvbHNbJ3BpY2t1cF9sYXRfbG5nJ10udG91Y2hlZCAmJiBhZGRSb3V0ZUZvcm0uY29udHJvbHNbJ3BpY2t1cF9sYXRfbG5nJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgcGlja3VwIGxvY2F0aW9uIGZyb20gdGhlIGxpc3QuXG4gICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPkRlbGl2ZXJ5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIG1hdElucHV0ICNmaWx0ZXJEZWxpdmVyeSBbbWF0QXV0b2NvbXBsZXRlXT1cImRlbGl2ZXJ5QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVsaXZlcnlfbG9jYXRpb25cIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2RlbGl2ZXJ5QXV0b2NvbXBsZXRlPVwibWF0QXV0b2NvbXBsZXRlXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIChjbGljayk9XCJzZWxlY3RlZExvbmdMYXQoJ2RlbGl2ZXJ5Jywgb3B0aW9uKVwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZGVsaXZlcnlPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uPy5wbGFjZV9uYW1lXCI+XG4gICAgICAgICAgICAgICAge3tvcHRpb24/LnBsYWNlX25hbWV9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWydkZWxpdmVyeV9sYXRfbG5nJ10udG91Y2hlZCAmJiBhZGRSb3V0ZUZvcm0uY29udHJvbHNbJ2RlbGl2ZXJ5X2xhdF9sbmcnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgUGxlYXNlIHNlbGVjdCBkZWxpdmVyeSBsb2NhdGlvbiBmcm9tIHRoZSBsaXN0LlxuICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5Ob3RlczwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIHN0eWxlPVwiaGVpZ2h0OiAxOHB4OyByZXNpemU6IG5vbmU7XCIgbWF0SW5wdXQgbmFtZT1cIlwiIGlkPVwiXCIgY29scz1cIjMwXCIgcm93cz1cIjEwXCIgZm9ybUNvbnRyb2xOYW1lPVwibm90ZVwiIGF1dG9jb21wbGV0ZT1cIm5vcGVcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWydub3RlJ10uaGFzRXJyb3IoJ21heGxlbmd0aCcpXCI+XG4gICAgICAgICAgICAgIE5vdGVzIHNob3VsZCBiZSB3aXRoaW4gMjA0OCBjaGFyYWN0ZXJzLlxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGQtZmxleFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dGJveCBtLTBcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5Vbml0IHR5cGU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidW5pdF9pZFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hlY2tBbmRGZXRjaFJvdXRlSW5mb3JtYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHVuaXQgb2YgdW5pdHNMaXN0XCIgW3ZhbHVlXT1cInVuaXQ/LmlkXCI+IHt7dW5pdD8udHlwZX19IDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWyd1bml0X2lkJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICBVbml0IGlzIHJlcXVpcmVkXG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dGJveCBtLTBcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5NYXRlcmlhbDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJtYXRlcmlhbHNfaWRcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBtYXRlcmlhbCBvZiBtYXRlcmlhbHNMaXN0XCIgW3ZhbHVlXT1cImNvbmZpZy5yZXBvc2l0b3J5ID09PSAnY29vbG1hcCcgPyBtYXRlcmlhbD8ubWF0ZXJpYWxfaWQgOiBtYXRlcmlhbD8uc3ViX21hdGVyaWFsX2lkXCI+IHt7Y29uZmlnLnJlcG9zaXRvcnkgPT09ICdjb29sbWFwJyA/IG1hdGVyaWFsPy5tYXRlcmlhbCA6IG1hdGVyaWFsPy5sYWJlbH19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJhZGRSb3V0ZUZvcm0uY29udHJvbHNbJ21hdGVyaWFsc19pZCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgTWF0ZXJpYWwgaXMgcmVxdWlyZWRcbiAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGFwcC1lc3RpbWF0aW9uLWRpc3BsYXkgKm5nSWY9XCJhZGRSb3V0ZUZvcm0/LnZhbHVlPy5waWNrdXBfbGF0X2xuZyAmJiBhZGRSb3V0ZUZvcm0/LnZhbHVlPy5kZWxpdmVyeV9sYXRfbG5nXCIgW3ZhbHVlXT1cImFkZFJvdXRlRm9ybVsndmFsdWUnXVwiPjwvYXBwLWVzdGltYXRpb24tZGlzcGxheT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiICpuZ0lmPVwiYWRkUm91dGVGb3JtWyd2YWx1ZSddWyd0cnVja2VyX3BheV9lc3RpbWF0ZSddICYmIGFkZFJvdXRlRm9ybVsndmFsdWUnXVsnY3VzdG9tZXJfcHJpY2VfZXN0aW1hdGUnXVwiPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29uZmlnWydyZXBvc2l0b3J5J10gIT09ICdjdXN0b21lcidcIiBjbGFzcz1cImVzdGltYXRlXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgIFRydWNrZXIgUGF5IEVzdGltYXRlIC0gPGI+e3snJCcrIGFkZFJvdXRlRm9ybVsndmFsdWUnXVsndHJ1Y2tlcl9wYXlfZXN0aW1hdGUnXX19PC9iPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImVzdGltYXRlXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgIEN1c3RvbWVyIFByaWNlIEVzdGltYXRlIC0gPGI+e3snJCcrIGFkZFJvdXRlRm9ybVsndmFsdWUnXVsnY3VzdG9tZXJfcHJpY2VfZXN0aW1hdGUnXX19PC9iPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJzYXZlUm91dGUoKVwiICpuZ0lmPVwicHJldmVudFNhdmVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJhZGRSb3V0ZUZvcm0uaW52YWxpZCAmJiBwcmV2ZW50U2F2ZSB8fCBwcmV2ZW50SW5pdGlhbFNhdmVcIj57e3JvdXRlSWQ/ICdVcGRhdGUnIDogJ1NhdmUnfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkZXJcIj5cbiAgICAgICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCIhcHJldmVudFNhdmVcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==