@aggdirect/coolmap 3.0.3 → 5.0.1

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 (46) hide show
  1. package/README.md +39 -33
  2. package/fesm2022/coolmap.mjs +1436 -0
  3. package/fesm2022/coolmap.mjs.map +1 -0
  4. package/index.d.ts +101 -5
  5. package/package.json +12 -32
  6. package/esm2022/aggdirect-coolmap.mjs +0 -5
  7. package/esm2022/lib/component/add-route/add-route.component.mjs +0 -433
  8. package/esm2022/lib/component/job-code/job-code.component.mjs +0 -181
  9. package/esm2022/lib/component/map/map.component.mjs +0 -39
  10. package/esm2022/lib/component/nav/layout/add-route-nav/add-route-nav.component.mjs +0 -151
  11. package/esm2022/lib/component/nav/layout/job-code-nav/job-code-nav.component.mjs +0 -194
  12. package/esm2022/lib/component/nav/nav.component.mjs +0 -54
  13. package/esm2022/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.mjs +0 -77
  14. package/esm2022/lib/component/route-jobcode-list/route-jobcode-list.component.mjs +0 -319
  15. package/esm2022/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.mjs +0 -19
  16. package/esm2022/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.mjs +0 -37
  17. package/esm2022/lib/component/shared/dialog/dialog.component.mjs +0 -31
  18. package/esm2022/lib/component/shared/estimation-display/estimation-display.component.mjs +0 -18
  19. package/esm2022/lib/component/shared/job-route-list/job-route-list.component.mjs +0 -79
  20. package/esm2022/lib/component/shared/jobcode-overview/jobcode-overview.component.mjs +0 -24
  21. package/esm2022/lib/component/shared/jobcode-status/jobcode-status.component.mjs +0 -15
  22. package/esm2022/lib/component/shared/route-info-card/route-info-card.component.mjs +0 -62
  23. package/esm2022/lib/component/shared/searchoptiongroup/searchoptiongroup.component.mjs +0 -25
  24. package/esm2022/lib/coolmap.module.mjs +0 -193
  25. package/esm2022/public-api.mjs +0 -19
  26. package/fesm2022/aggdirect-coolmap.mjs +0 -1822
  27. package/fesm2022/aggdirect-coolmap.mjs.map +0 -1
  28. package/lib/component/add-route/add-route.component.d.ts +0 -73
  29. package/lib/component/job-code/job-code.component.d.ts +0 -41
  30. package/lib/component/map/map.component.d.ts +0 -15
  31. package/lib/component/nav/layout/add-route-nav/add-route-nav.component.d.ts +0 -49
  32. package/lib/component/nav/layout/job-code-nav/job-code-nav.component.d.ts +0 -48
  33. package/lib/component/nav/nav.component.d.ts +0 -31
  34. package/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.d.ts +0 -20
  35. package/lib/component/route-jobcode-list/route-jobcode-list.component.d.ts +0 -42
  36. package/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.d.ts +0 -9
  37. package/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.d.ts +0 -12
  38. package/lib/component/shared/dialog/dialog.component.d.ts +0 -13
  39. package/lib/component/shared/estimation-display/estimation-display.component.d.ts +0 -8
  40. package/lib/component/shared/job-route-list/job-route-list.component.d.ts +0 -26
  41. package/lib/component/shared/jobcode-overview/jobcode-overview.component.d.ts +0 -10
  42. package/lib/component/shared/jobcode-status/jobcode-status.component.d.ts +0 -7
  43. package/lib/component/shared/route-info-card/route-info-card.component.d.ts +0 -32
  44. package/lib/component/shared/searchoptiongroup/searchoptiongroup.component.d.ts +0 -14
  45. package/lib/coolmap.module.d.ts +0 -46
  46. package/public-api.d.ts +0 -15
@@ -1,194 +0,0 @@
1
- import { Component, EventEmitter, Output, Inject, Input, } from '@angular/core';
2
- import { map, startWith } from 'rxjs';
3
- import { FormControl, FormGroup } from '@angular/forms';
4
- import { Subject, takeUntil } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@aggdirect/coolmap-services";
7
- import * as i2 from "@angular/common";
8
- import * as i3 from "@angular/forms";
9
- import * as i4 from "@angular/material/input";
10
- import * as i5 from "@angular/material/form-field";
11
- import * as i6 from "@angular/material/core";
12
- import * as i7 from "@angular/material/icon";
13
- import * as i8 from "@angular/material/autocomplete";
14
- import * as i9 from "@angular/material/chips";
15
- import * as i10 from "@angular/material/datepicker";
16
- import * as i11 from "@angular/material/button";
17
- import * as i12 from "../../../route-jobcode-list/route-jobcode-list.component";
18
- export class JobCodeNavComponent {
19
- utils;
20
- config;
21
- filterForm = new FormGroup({ search: new FormControl() });
22
- listData = [];
23
- loaderVal = false;
24
- dateValue = new Date();
25
- jobemit = new EventEmitter();
26
- value = '';
27
- filteredOptions;
28
- filters = [];
29
- clearJobDetails = new EventEmitter();
30
- destroyer$ = new Subject();
31
- customerRepoDetails;
32
- selectedDate;
33
- statLegend = [
34
- { label: 'Done', color: '#00CC00', total: 0 },
35
- { label: 'Incomplete', color: '#000000', total: 0 },
36
- { label: 'Ongoing', color: '#FFAA00', total: 0 },
37
- { label: 'Open', color: '#CCCCCC', total: 0 }
38
- ];
39
- constructor(utils, config) {
40
- this.utils = utils;
41
- this.config = config;
42
- this.selectedDate = this.utils.getDateFormat(new Date());
43
- utils.navChangeObserve.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
44
- if (res) {
45
- this.loaderVal = false;
46
- }
47
- else
48
- this.loaderVal = true;
49
- });
50
- }
51
- ngOnChanges(changes) {
52
- if (changes['customerRepoDetails'] &&
53
- changes['customerRepoDetails']['currentValue']) {
54
- this.loadData(this.selectedDate);
55
- this.filters = [];
56
- this.utils.clearViewRouteforJobCode.next(true);
57
- }
58
- }
59
- loadData(value) {
60
- this.selectedDate = value;
61
- this.filteredOptions = this.filterForm.get('search')?.valueChanges.pipe(startWith(''), map((value) => this.utils.filter(value, this.filters)));
62
- this.utils.preventnavChange.next(false);
63
- this.loaderVal = true;
64
- let dataSet;
65
- if (this.config.repository === 'customer') {
66
- dataSet = {
67
- date: value,
68
- customer_id: this.customerRepoDetails.customer.id,
69
- project_id: this.customerRepoDetails.projectId,
70
- };
71
- }
72
- else {
73
- dataSet = { date: value };
74
- }
75
- this.utils
76
- .postdata('jobs_report_v2', dataSet)
77
- .pipe(takeUntil(this.destroyer$))
78
- .subscribe((res) => {
79
- if (typeof res['data'] !== 'string') {
80
- if (res['data'].length > 0) {
81
- this.listData = res['data'].map((ele) => {
82
- ele['date'] = value;
83
- return ele;
84
- });
85
- }
86
- if (this.config.repository === 'customer') {
87
- let projectName = window.location.href.split('project=').pop();
88
- projectName = projectName.toLowerCase();
89
- this.listData = this.listData.filter(ele => {
90
- const project = ele.project.toLowerCase();
91
- let adjustedProject = project.replace(/\s+|\/+/g, "_");
92
- return adjustedProject === projectName;
93
- });
94
- }
95
- this.listData.forEach((ele) => {
96
- this.utils.makeOptions(ele);
97
- });
98
- }
99
- else
100
- this.listData = [];
101
- if (this.config.repository === 'coolmap') {
102
- this.calculateStatsTotals();
103
- }
104
- this.clearJobDetails.emit(true);
105
- this.utils.clearViewRouteforJobCode.next(true);
106
- this.filters = [];
107
- if (typeof res['data'] === 'string')
108
- this.utils.preventnavChange.next(true);
109
- }, (err) => {
110
- if (err)
111
- this.utils.preventnavChange.next(true);
112
- });
113
- }
114
- calculateStatsTotals() {
115
- this.statLegend.forEach(legend => {
116
- legend.total = 0;
117
- });
118
- if (this.listData && this.listData.length > 0) {
119
- this.listData.forEach((item) => {
120
- if (item.values) {
121
- if (item.values['Done'] !== undefined) {
122
- const doneLegend = this.statLegend.find(legend => legend.label === 'Done');
123
- if (doneLegend) {
124
- doneLegend.total += item.values['Done'] || 0;
125
- }
126
- }
127
- if (item.values['Incomplete'] !== undefined) {
128
- const incompleteLegend = this.statLegend.find(legend => legend.label === 'Incomplete');
129
- if (incompleteLegend) {
130
- incompleteLegend.total += item.values['Incomplete'] || 0;
131
- }
132
- }
133
- if (item.values['Ongoing'] !== undefined) {
134
- const ongoingLegend = this.statLegend.find(legend => legend.label === 'Ongoing');
135
- if (ongoingLegend) {
136
- ongoingLegend.total += item.values['Ongoing'] || 0;
137
- }
138
- }
139
- if (item.values['Open'] !== undefined) {
140
- const openLegend = this.statLegend.find(legend => legend.label === 'Open');
141
- if (openLegend) {
142
- openLegend.total += item.values['Open'] || 0;
143
- }
144
- }
145
- }
146
- });
147
- }
148
- }
149
- getRoute(job) {
150
- if (job['type'] === 'jobcode') {
151
- this.jobemit.emit(job);
152
- }
153
- }
154
- getDate(ev) {
155
- this.loadData(this.utils.getDateFormat(ev.value));
156
- }
157
- filterSearch(e) {
158
- this.filterForm.controls.search.setValue(null);
159
- this.filterForm.controls.search.updateValueAndValidity();
160
- this.filters = [
161
- {
162
- name: e.source.value.label,
163
- type: e.source.value.type,
164
- value: e.source.value,
165
- },
166
- ];
167
- }
168
- removeFromFilter(filter) {
169
- const index = this.filters.indexOf(filter);
170
- if (index >= 0) {
171
- this.filters = [];
172
- }
173
- }
174
- ngOnDestroy() {
175
- this.destroyer$.next(true);
176
- this.destroyer$.unsubscribe();
177
- }
178
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: JobCodeNavComponent, deps: [{ token: i1.UtilsService }, { token: 'memberData' }], target: i0.ɵɵFactoryTarget.Component });
179
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: JobCodeNavComponent, selector: "app-job-code-nav", inputs: { customerRepoDetails: "customerRepoDetails" }, outputs: { jobemit: "jobemit", clearJobDetails: "clearJobDetails" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"nav_body\">\n <div class=\"search-panel\">\n <div class=\"datepicker\">\n <mat-form-field>\n <mat-label>Choose a date</mat-label>\n <input readonly matInput (click)=\"picker.open()\" [disabled]=\"loaderVal\" [(ngModel)]=\"dateValue\" [matDatepicker]=\"picker\" (dateChange)=\"getDate($event)\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n </div>\n <div class=\"search\">\n <form [formGroup]=\"filterForm\">\n <mat-form-field class=\"full-width\" [class.disabled]=\"loaderVal\">\n <input matInput [matChipInputFor]=\"chipList\" formControlName=\"search\" [matAutocomplete]=\"auto\"\n [disabled]=\"loaderVal\" placeholder=\"Search\">\n @if (!utils.conveySearchIcon(filterForm.value.search)) {\n <mat-icon matSuffix>search</mat-icon>\n }\n @if (utils.conveySearchIcon(filterForm.value.search)) {\n <button\n matSuffix \n mat-icon-button \n aria-label=\"Clear\" \n (click)=\"filterForm.reset()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\" class=\"whole_width\">\n <mat-option *ngFor=\"let option of filteredOptions | async\" (onSelectionChange)=\"filterSearch($event)\"\n [value]=\"option\">\n {{option.type | titlecase }}: {{option['label']}}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </form>\n </div>\n\n <div class=\"chip-list\">\n <mat-chip-grid #chipList aria-label=\"Filter selection\">\n @for (filter of filters; track filter) {\n <mat-chip-row class=\"chip-grid\" (removed)=\"removeFromFilter(filter)\">\n {{filter.type | titlecase }}: {{filter.name}}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n </div>\n </div>\n @if (config.repository === 'coolmap') {\n <div>\n <div class=\"stats-legend-container\">\n @for (legend of statLegend; track legend.label) {\n <div [ngStyle]=\"{background: legend.color}\" class=\"stats-legend\">\n <div class=\"stats-legend-box\">\n {{legend.total}}\n </div>\n <div class=\"stats-legend-label\">{{legend.label}}</div>\n </div>\n }\n </div>\n </div>\n }\n <app-route-jobcode-list [type]=\"'jobcode'\" [searchTerm]=\"filters\" [data]=\"listData\" [loader]=\"loaderVal\" (clearJobDetailsFromList)=\"clearJobDetails.emit(true)\" (showAllRoute)=\"filters = []; clearJobDetails.emit(true)\" (emitroute)=\"getRoute($event)\"></app-route-jobcode-list>\n</div>\n", styles: [".search-panel .datepicker,.search-panel .search{width:47%}.chip-grid{width:auto;height:auto}.stats-legend{display:inline-block;width:60px;margin:0 .2em;border-radius:10px;font-family:Roboto;padding:.425em 0;border:3px solid #ccc}.stats-legend-box{margin:auto;text-align:center;font-size:1.5rem;padding:0;color:#fff}.stats-legend-label{text-align:center;width:100%;color:#fff;font-size:.6rem}.stats-legend-container{display:inline-block;margin-bottom:10px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.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: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.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: i8.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i9.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i9.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i9.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i9.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.RouteJobCodeListComponent, selector: "app-route-jobcode-list", inputs: ["loader", "type", "data", "currentNav", "searchTerm", "clearListSeletion"], outputs: ["emitroute", "showAllRoute", "clearJobDetailsFromList"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }] });
180
- }
181
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: JobCodeNavComponent, decorators: [{
182
- type: Component,
183
- args: [{ selector: 'app-job-code-nav', template: "<div class=\"nav_body\">\n <div class=\"search-panel\">\n <div class=\"datepicker\">\n <mat-form-field>\n <mat-label>Choose a date</mat-label>\n <input readonly matInput (click)=\"picker.open()\" [disabled]=\"loaderVal\" [(ngModel)]=\"dateValue\" [matDatepicker]=\"picker\" (dateChange)=\"getDate($event)\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n </div>\n <div class=\"search\">\n <form [formGroup]=\"filterForm\">\n <mat-form-field class=\"full-width\" [class.disabled]=\"loaderVal\">\n <input matInput [matChipInputFor]=\"chipList\" formControlName=\"search\" [matAutocomplete]=\"auto\"\n [disabled]=\"loaderVal\" placeholder=\"Search\">\n @if (!utils.conveySearchIcon(filterForm.value.search)) {\n <mat-icon matSuffix>search</mat-icon>\n }\n @if (utils.conveySearchIcon(filterForm.value.search)) {\n <button\n matSuffix \n mat-icon-button \n aria-label=\"Clear\" \n (click)=\"filterForm.reset()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\" class=\"whole_width\">\n <mat-option *ngFor=\"let option of filteredOptions | async\" (onSelectionChange)=\"filterSearch($event)\"\n [value]=\"option\">\n {{option.type | titlecase }}: {{option['label']}}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </form>\n </div>\n\n <div class=\"chip-list\">\n <mat-chip-grid #chipList aria-label=\"Filter selection\">\n @for (filter of filters; track filter) {\n <mat-chip-row class=\"chip-grid\" (removed)=\"removeFromFilter(filter)\">\n {{filter.type | titlecase }}: {{filter.name}}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n </div>\n </div>\n @if (config.repository === 'coolmap') {\n <div>\n <div class=\"stats-legend-container\">\n @for (legend of statLegend; track legend.label) {\n <div [ngStyle]=\"{background: legend.color}\" class=\"stats-legend\">\n <div class=\"stats-legend-box\">\n {{legend.total}}\n </div>\n <div class=\"stats-legend-label\">{{legend.label}}</div>\n </div>\n }\n </div>\n </div>\n }\n <app-route-jobcode-list [type]=\"'jobcode'\" [searchTerm]=\"filters\" [data]=\"listData\" [loader]=\"loaderVal\" (clearJobDetailsFromList)=\"clearJobDetails.emit(true)\" (showAllRoute)=\"filters = []; clearJobDetails.emit(true)\" (emitroute)=\"getRoute($event)\"></app-route-jobcode-list>\n</div>\n", styles: [".search-panel .datepicker,.search-panel .search{width:47%}.chip-grid{width:auto;height:auto}.stats-legend{display:inline-block;width:60px;margin:0 .2em;border-radius:10px;font-family:Roboto;padding:.425em 0;border:3px solid #ccc}.stats-legend-box{margin:auto;text-align:center;font-size:1.5rem;padding:0;color:#fff}.stats-legend-label{text-align:center;width:100%;color:#fff;font-size:.6rem}.stats-legend-container{display:inline-block;margin-bottom:10px}\n"] }]
184
- }], ctorParameters: () => [{ type: i1.UtilsService }, { type: i1.CoolmapConfigModel, decorators: [{
185
- type: Inject,
186
- args: ['memberData']
187
- }] }], propDecorators: { jobemit: [{
188
- type: Output
189
- }], clearJobDetails: [{
190
- type: Output
191
- }], customerRepoDetails: [{
192
- type: Input
193
- }] } });
194
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLWNvZGUtbmF2LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAvc3JjL2xpYi9jb21wb25lbnQvbmF2L2xheW91dC9qb2ItY29kZS1uYXYvam9iLWNvZGUtbmF2LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAvc3JjL2xpYi9jb21wb25lbnQvbmF2L2xheW91dC9qb2ItY29kZS1uYXYvam9iLWNvZGUtbmF2LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFFTixNQUFNLEVBQ04sS0FBSyxHQUdOLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxHQUFHLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBYTFDLE1BQU0sT0FBTyxtQkFBbUI7SUFvQnJCO0lBQ3NCO0lBcEIvQixVQUFVLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsUUFBUSxHQUFZLEVBQUUsQ0FBQztJQUN2QixTQUFTLEdBQVksS0FBSyxDQUFDO0lBQzNCLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ04sT0FBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDOUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLGVBQWUsQ0FBaUM7SUFDaEQsT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUNOLGVBQWUsR0FBRyxJQUFJLFlBQVks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QUMsQ0FBQyxNQUFNLENBQUMsS0FBSzthQUN0QjtTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsTUFBVztRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEMsQ0FBQzt3R0FsS1UsbUJBQW1CLDhDQXFCcEIsWUFBWTs0RkFyQlgsbUJBQW1CLDBNQ2hDaEMseTJGQWtFQTs7NEZEbENhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxrQkFBa0I7OzBCQXlCekIsTUFBTTsyQkFBQyxZQUFZO3lDQWhCTCxPQUFPO3NCQUF2QixNQUFNO2dCQUlVLGVBQWU7c0JBQS9CLE1BQU07Z0JBRVMsbUJBQW1CO3NCQUFsQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCxcbiAgT25EZXN0cm95LFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW50ZXJmYWNlIEZpbHRlciB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENvb2xtYXBDb25maWdNb2RlbCxcbiAgQ3VzdG9tZXJSZXBvRGV0YWlsc01vZGVsLFxuICBSb3V0ZSxcbiAgVXRpbHNTZXJ2aWNlLFxufSBmcm9tICdAYWdnZGlyZWN0L2Nvb2xtYXAtc2VydmljZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtam9iLWNvZGUtbmF2JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2pvYi1jb2RlLW5hdi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2pvYi1jb2RlLW5hdi5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBKb2JDb2RlTmF2Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cCh7IHNlYXJjaDogbmV3IEZvcm1Db250cm9sKCkgfSk7XG4gIGxpc3REYXRhOiBSb3V0ZVtdID0gW107XG4gIGxvYWRlclZhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBkYXRlVmFsdWUgPSBuZXcgRGF0ZSgpO1xuICBAT3V0cHV0KCkgcHVibGljIGpvYmVtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHZhbHVlID0gJyc7XG4gIGZpbHRlcmVkT3B0aW9ucyE6IE9ic2VydmFibGU8YW55W10+IHwgdW5kZWZpbmVkO1xuICBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuICBAT3V0cHV0KCkgcHVibGljIGNsZWFySm9iRGV0YWlscyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIGRlc3Ryb3llciQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tZXJSZXBvRGV0YWlscyE6IEN1c3RvbWVyUmVwb0RldGFpbHNNb2RlbDtcbiAgc2VsZWN0ZWREYXRlOiBzdHJpbmc7XG4gIHB1YmxpYyBzdGF0TGVnZW5kID0gW1xuICAgIHtsYWJlbDogJ0RvbmUnLCBjb2xvcjogJyMwMENDMDAnLCB0b3RhbDogMH0sXG4gICAge2xhYmVsOiAnSW5jb21wbGV0ZScsIGNvbG9yOiAnIzAwMDAwMCcsIHRvdGFsOiAwfSxcbiAgICB7bGFiZWw6ICdPbmdvaW5nJywgY29sb3I6ICcjRkZBQTAwJywgdG90YWw6IDB9LFxuICAgIHtsYWJlbDogJ09wZW4nLCBjb2xvcjogJyNDQ0NDQ0MnLCB0b3RhbDogMH1cbiAgXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHV0aWxzOiBVdGlsc1NlcnZpY2UsXG4gICAgQEluamVjdCgnbWVtYmVyRGF0YScpIHB1YmxpYyBjb25maWc6IENvb2xtYXBDb25maWdNb2RlbFxuICApIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHRoaXMudXRpbHMuZ2V0RGF0ZUZvcm1hdChuZXcgRGF0ZSgpKTtcbiAgICB1dGlscy5uYXZDaGFuZ2VPYnNlcnZlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHRoaXMubG9hZGVyVmFsID0gZmFsc2U7XG4gICAgICB9IGVsc2UgdGhpcy5sb2FkZXJWYWwgPSB0cnVlO1xuICAgIH0pO1xuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzWydjdXN0b21lclJlcG9EZXRhaWxzJ10gJiZcbiAgICAgIGNoYW5nZXNbJ2N1c3RvbWVyUmVwb0RldGFpbHMnXVsnY3VycmVudFZhbHVlJ11cbiAgICApIHtcbiAgICAgIHRoaXMubG9hZERhdGEodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgICAgdGhpcy5maWx0ZXJzID0gW107XG4gICAgICB0aGlzLnV0aWxzLmNsZWFyVmlld1JvdXRlZm9ySm9iQ29kZS5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuICBsb2FkRGF0YSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSB2YWx1ZTtcbiAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHRoaXMuZmlsdGVyRm9ybS5nZXQoJ3NlYXJjaCcpPy52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIHN0YXJ0V2l0aCgnJyksXG4gICAgICBtYXAoKHZhbHVlKSA9PiB0aGlzLnV0aWxzLmZpbHRlcih2YWx1ZSwgdGhpcy5maWx0ZXJzKSlcbiAgICApO1xuICAgIHRoaXMudXRpbHMucHJldmVudG5hdkNoYW5nZS5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmxvYWRlclZhbCA9IHRydWU7XG4gICAgbGV0IGRhdGFTZXQ7XG4gICAgaWYgKHRoaXMuY29uZmlnLnJlcG9zaXRvcnkgPT09ICdjdXN0b21lcicpIHtcbiAgICAgIGRhdGFTZXQgPSB7XG4gICAgICAgIGRhdGU6IHZhbHVlLFxuICAgICAgICBjdXN0b21lcl9pZDogdGhpcy5jdXN0b21lclJlcG9EZXRhaWxzLmN1c3RvbWVyLmlkLFxuICAgICAgICBwcm9qZWN0X2lkOiB0aGlzLmN1c3RvbWVyUmVwb0RldGFpbHMucHJvamVjdElkLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YVNldCA9IHsgZGF0ZTogdmFsdWUgfTtcbiAgICB9XG4gICAgdGhpcy51dGlsc1xuICAgICAgLnBvc3RkYXRhKCdqb2JzX3JlcG9ydF92MicsIGRhdGFTZXQpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzWydkYXRhJ10gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAocmVzWydkYXRhJ10ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLmxpc3REYXRhID0gcmVzWydkYXRhJ10ubWFwKChlbGU6IFJvdXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgZWxlWydkYXRlJ10gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5yZXBvc2l0b3J5ID09PSAnY3VzdG9tZXInKSB7XG4gICAgICAgICAgICAgIGxldCBwcm9qZWN0TmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCdwcm9qZWN0PScpLnBvcCgpO1xuICAgICAgICAgICAgICBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgdGhpcy5saXN0RGF0YSA9IHRoaXMubGlzdERhdGEuZmlsdGVyKGVsZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvamVjdCA9IGVsZS5wcm9qZWN0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgbGV0IGFkanVzdGVkUHJvamVjdCA9IHByb2plY3QucmVwbGFjZSgvXFxzK3xcXC8rL2csIFwiX1wiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRqdXN0ZWRQcm9qZWN0ID09PSBwcm9qZWN0TmFtZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxpc3REYXRhLmZvckVhY2goKGVsZTogUm91dGUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51dGlscy5tYWtlT3B0aW9ucyhlbGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmxpc3REYXRhID0gW107XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnJlcG9zaXRvcnkgPT09ICdjb29sbWFwJykge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVTdGF0c1RvdGFscygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNsZWFySm9iRGV0YWlscy5lbWl0KHRydWUpO1xuICAgICAgICAgIHRoaXMudXRpbHMuY2xlYXJWaWV3Um91dGVmb3JKb2JDb2RlLm5leHQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5maWx0ZXJzID0gW107XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNbJ2RhdGEnXSA9PT0gJ3N0cmluZycpIHRoaXMudXRpbHMucHJldmVudG5hdkNoYW5nZS5uZXh0KHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikgdGhpcy51dGlscy5wcmV2ZW50bmF2Q2hhbmdlLm5leHQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cbiAgY2FsY3VsYXRlU3RhdHNUb3RhbHMoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0TGVnZW5kLmZvckVhY2gobGVnZW5kID0+IHtcbiAgICAgIGxlZ2VuZC50b3RhbCA9IDA7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5saXN0RGF0YSAmJiB0aGlzLmxpc3REYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubGlzdERhdGEuZm9yRWFjaCgoaXRlbTogUm91dGUpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udmFsdWVzKSB7XG4gICAgICAgICAgaWYgKGl0ZW0udmFsdWVzWydEb25lJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZG9uZUxlZ2VuZCA9IHRoaXMuc3RhdExlZ2VuZC5maW5kKGxlZ2VuZCA9PiBsZWdlbmQubGFiZWwgPT09ICdEb25lJyk7XG4gICAgICAgICAgICBpZiAoZG9uZUxlZ2VuZCkge1xuICAgICAgICAgICAgICBkb25lTGVnZW5kLnRvdGFsICs9IGl0ZW0udmFsdWVzWydEb25lJ10gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZW0udmFsdWVzWydJbmNvbXBsZXRlJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgaW5jb21wbGV0ZUxlZ2VuZCA9IHRoaXMuc3RhdExlZ2VuZC5maW5kKGxlZ2VuZCA9PiBsZWdlbmQubGFiZWwgPT09ICdJbmNvbXBsZXRlJyk7XG4gICAgICAgICAgICBpZiAoaW5jb21wbGV0ZUxlZ2VuZCkge1xuICAgICAgICAgICAgICBpbmNvbXBsZXRlTGVnZW5kLnRvdGFsICs9IGl0ZW0udmFsdWVzWydJbmNvbXBsZXRlJ10gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZW0udmFsdWVzWydPbmdvaW5nJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgb25nb2luZ0xlZ2VuZCA9IHRoaXMuc3RhdExlZ2VuZC5maW5kKGxlZ2VuZCA9PiBsZWdlbmQubGFiZWwgPT09ICdPbmdvaW5nJyk7XG4gICAgICAgICAgICBpZiAob25nb2luZ0xlZ2VuZCkge1xuICAgICAgICAgICAgICBvbmdvaW5nTGVnZW5kLnRvdGFsICs9IGl0ZW0udmFsdWVzWydPbmdvaW5nJ10gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZW0udmFsdWVzWydPcGVuJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgb3BlbkxlZ2VuZCA9IHRoaXMuc3RhdExlZ2VuZC5maW5kKGxlZ2VuZCA9PiBsZWdlbmQubGFiZWwgPT09ICdPcGVuJyk7XG4gICAgICAgICAgICBpZiAob3BlbkxlZ2VuZCkge1xuICAgICAgICAgICAgICBvcGVuTGVnZW5kLnRvdGFsICs9IGl0ZW0udmFsdWVzWydPcGVuJ10gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldFJvdXRlKGpvYjogUm91dGUpIHtcbiAgICBpZiAoam9iWyd0eXBlJ10gPT09ICdqb2Jjb2RlJykge1xuICAgICAgdGhpcy5qb2JlbWl0LmVtaXQoam9iKTtcbiAgICB9XG4gIH1cbiAgZ2V0RGF0ZShldjogTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQ8RGF0ZT4pIHtcbiAgICB0aGlzLmxvYWREYXRhKHRoaXMudXRpbHMuZ2V0RGF0ZUZvcm1hdChldi52YWx1ZSkpO1xuICB9XG5cbiAgZmlsdGVyU2VhcmNoKGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5jb250cm9scy5zZWFyY2guc2V0VmFsdWUobnVsbCk7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmNvbnRyb2xzLnNlYXJjaC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgdGhpcy5maWx0ZXJzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiBlLnNvdXJjZS52YWx1ZS5sYWJlbCxcbiAgICAgICAgdHlwZTogZS5zb3VyY2UudmFsdWUudHlwZSxcbiAgICAgICAgdmFsdWU6IGUuc291cmNlLnZhbHVlLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG4gIHJlbW92ZUZyb21GaWx0ZXIoZmlsdGVyOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZmlsdGVycy5pbmRleE9mKGZpbHRlcik7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuZmlsdGVycyA9IFtdO1xuICAgIH1cbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llciQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3llciQudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5hdl9ib2R5XCI+XG4gIDxkaXYgY2xhc3M9XCJzZWFyY2gtcGFuZWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlclwiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsPkNob29zZSBhIGRhdGU8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0IHJlYWRvbmx5IG1hdElucHV0IChjbGljayk9XCJwaWNrZXIub3BlbigpXCIgW2Rpc2FibGVkXT1cImxvYWRlclZhbFwiICBbKG5nTW9kZWwpXT1cImRhdGVWYWx1ZVwiIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiIChkYXRlQ2hhbmdlKT1cImdldERhdGUoJGV2ZW50KVwiPlxuICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoXCI+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCIgW2NsYXNzLmRpc2FibGVkXT1cImxvYWRlclZhbFwiPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiIGZvcm1Db250cm9sTmFtZT1cInNlYXJjaFwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRlclZhbFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCI+XG4gICAgICAgICAgQGlmICghdXRpbHMuY29udmV5U2VhcmNoSWNvbihmaWx0ZXJGb3JtLnZhbHVlLnNlYXJjaCkpIHtcbiAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXg+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmICh1dGlscy5jb252ZXlTZWFyY2hJY29uKGZpbHRlckZvcm0udmFsdWUuc2VhcmNoKSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXRTdWZmaXggXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvbiBcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyXCIgXG4gICAgICAgICAgICAgIChjbGljayk9XCJmaWx0ZXJGb3JtLnJlc2V0KClcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgYXV0b0FjdGl2ZUZpcnN0T3B0aW9uICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCIgY2xhc3M9XCJ3aG9sZV93aWR0aFwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zIHwgYXN5bmNcIiAob25TZWxlY3Rpb25DaGFuZ2UpPVwiZmlsdGVyU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAge3tvcHRpb24udHlwZSB8IHRpdGxlY2FzZSB9fToge3tvcHRpb25bJ2xhYmVsJ119fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY2hpcC1saXN0XCI+XG4gICAgICA8bWF0LWNoaXAtZ3JpZCAjY2hpcExpc3QgYXJpYS1sYWJlbD1cIkZpbHRlciBzZWxlY3Rpb25cIj5cbiAgICAgICAgQGZvciAoZmlsdGVyIG9mIGZpbHRlcnM7IHRyYWNrIGZpbHRlcikge1xuICAgICAgICAgIDxtYXQtY2hpcC1yb3cgY2xhc3M9XCJjaGlwLWdyaWRcIiAocmVtb3ZlZCk9XCJyZW1vdmVGcm9tRmlsdGVyKGZpbHRlcilcIj5cbiAgICAgICAgICAgIHt7ZmlsdGVyLnR5cGUgfCB0aXRsZWNhc2UgfX06IHt7ZmlsdGVyLm5hbWV9fVxuICAgICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlPlxuICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgICB9XG4gICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBAaWYgKGNvbmZpZy5yZXBvc2l0b3J5ID09PSAnY29vbG1hcCcpIHtcbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXRzLWxlZ2VuZC1jb250YWluZXJcIj5cbiAgICAgICAgQGZvciAobGVnZW5kIG9mIHN0YXRMZWdlbmQ7IHRyYWNrIGxlZ2VuZC5sYWJlbCkge1xuICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwie2JhY2tncm91bmQ6IGxlZ2VuZC5jb2xvcn1cIiBjbGFzcz1cInN0YXRzLWxlZ2VuZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRzLWxlZ2VuZC1ib3hcIj5cbiAgICAgICAgICAgICAge3tsZWdlbmQudG90YWx9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHMtbGVnZW5kLWxhYmVsXCI+e3tsZWdlbmQubGFiZWx9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuICA8YXBwLXJvdXRlLWpvYmNvZGUtbGlzdCBbdHlwZV09XCInam9iY29kZSdcIiBbc2VhcmNoVGVybV09XCJmaWx0ZXJzXCIgW2RhdGFdPVwibGlzdERhdGFcIiBbbG9hZGVyXT1cImxvYWRlclZhbFwiIChjbGVhckpvYkRldGFpbHNGcm9tTGlzdCk9XCJjbGVhckpvYkRldGFpbHMuZW1pdCh0cnVlKVwiIChzaG93QWxsUm91dGUpPVwiZmlsdGVycyA9IFtdOyBjbGVhckpvYkRldGFpbHMuZW1pdCh0cnVlKVwiIChlbWl0cm91dGUpPVwiZ2V0Um91dGUoJGV2ZW50KVwiPjwvYXBwLXJvdXRlLWpvYmNvZGUtbGlzdD5cbjwvZGl2PlxuIl19
@@ -1,54 +0,0 @@
1
- import { Component, EventEmitter, Output } from '@angular/core';
2
- import { Subject, takeUntil } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@aggdirect/coolmap-services";
5
- import * as i2 from "@angular/common";
6
- import * as i3 from "@angular/material/tooltip";
7
- import * as i4 from "@angular/material/button";
8
- export class NavComponent {
9
- utils;
10
- coolMap;
11
- drawer = new EventEmitter();
12
- changeNav = new EventEmitter();
13
- navValue = 'Jobcode';
14
- isnavChange = true;
15
- paddinForJobCode = { top: 0, bottom: 250, left: 500, right: 400 };
16
- paddinForViewRoute = { top: 0, bottom: 400, left: 400, right: 0 };
17
- destroyer$ = new Subject();
18
- constructor(utils, coolMap) {
19
- this.utils = utils;
20
- this.coolMap = coolMap;
21
- this.utils.navChangeObserve.pipe(takeUntil(this.destroyer$)).subscribe(res => { this.isnavChange = res; });
22
- this.coolMap.setPadding(this.paddinForJobCode);
23
- }
24
- openDrawer() { this.drawer.emit(true); }
25
- chnageNav(name) {
26
- if (this.isnavChange) {
27
- this.changeNav.emit(name);
28
- this.navValue = name;
29
- this.coolMap.clearBound();
30
- if (name === 'Addroute') {
31
- this.coolMap.setPadding(this.paddinForViewRoute);
32
- }
33
- else {
34
- this.coolMap.setPadding(this.paddinForJobCode);
35
- }
36
- this.utils.clearOptions();
37
- }
38
- }
39
- ngOnDestroy() {
40
- this.destroyer$.next(true);
41
- this.destroyer$.unsubscribe();
42
- }
43
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NavComponent, deps: [{ token: i1.UtilsService }, { token: i1.CoolmapService }], target: i0.ɵɵFactoryTarget.Component });
44
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NavComponent, selector: "app-nav", outputs: { drawer: "drawer", changeNav: "changeNav" }, ngImport: i0, template: "<div class=\"nav\">\n <button (click)=\"openDrawer()\" class=\"toggle\">\n <img src=\"assets/images/toggle.svg\" alt=\"\" />\n </button>\n\n <ul class=\"m-100\">\n <li [ngClass]=\"{'active': navValue === 'Jobcode'}\">\n <a mat-raised-button #tooltip=\"matTooltip\" matTooltip=\"Job Code\" aria-label=\"Job-code\" (click)=\"chnageNav('Jobcode')\">\n <img src=\"assets/images/job-code.svg\" alt=\"\" />\n </a>\n </li>\n\n <li [ngClass]=\"{'active': navValue === 'Addroute', 'disabled': !isnavChange }\">\n <a mat-raised-button #tooltip=\"matTooltip\" matTooltip=\"View Route\" aria-label=\"View-route\" (click)=\"chnageNav('Addroute')\">\n <img src=\"assets/images/route.svg\" alt=\"\" />\n </a>\n </li>\n </ul>\n</div>\n", styles: [".nav{background:#e8e8e8;height:100vh;padding:15px 0;display:flex;align-items:center;flex-direction:column}.nav button{background:#fff;border-radius:15px;padding:5px 6px}.nav button img{width:28px}.nav ul{display:flex;flex-direction:column;align-items:center}.nav ul li{margin:10px 0;padding:0 5px;border-right:2px solid #e8e8e8}.nav ul li:hover{border-right:2px solid #326ad3;padding:0 5px}.nav ul li.disabled a{pointer-events:none;opacity:.5}.nav ul li.disabled:hover{border-right:2px solid #e8e8e8}.nav ul li a{padding:0!important;display:flex;border-radius:15px;min-width:42px;box-shadow:none;align-items:center;height:42px;line-height:10px}.nav ul li a img{width:27px}.nav ul li a:hover{background:#fff}.nav ul li a:hover img{filter:invert(.2) sepia(1) saturate(8) hue-rotate(180deg)}.nav ul li.active{border-right:2px solid #326ad3}.nav ul li.active a{background:#fff}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i4.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }] });
45
- }
46
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NavComponent, decorators: [{
47
- type: Component,
48
- args: [{ selector: 'app-nav', template: "<div class=\"nav\">\n <button (click)=\"openDrawer()\" class=\"toggle\">\n <img src=\"assets/images/toggle.svg\" alt=\"\" />\n </button>\n\n <ul class=\"m-100\">\n <li [ngClass]=\"{'active': navValue === 'Jobcode'}\">\n <a mat-raised-button #tooltip=\"matTooltip\" matTooltip=\"Job Code\" aria-label=\"Job-code\" (click)=\"chnageNav('Jobcode')\">\n <img src=\"assets/images/job-code.svg\" alt=\"\" />\n </a>\n </li>\n\n <li [ngClass]=\"{'active': navValue === 'Addroute', 'disabled': !isnavChange }\">\n <a mat-raised-button #tooltip=\"matTooltip\" matTooltip=\"View Route\" aria-label=\"View-route\" (click)=\"chnageNav('Addroute')\">\n <img src=\"assets/images/route.svg\" alt=\"\" />\n </a>\n </li>\n </ul>\n</div>\n", styles: [".nav{background:#e8e8e8;height:100vh;padding:15px 0;display:flex;align-items:center;flex-direction:column}.nav button{background:#fff;border-radius:15px;padding:5px 6px}.nav button img{width:28px}.nav ul{display:flex;flex-direction:column;align-items:center}.nav ul li{margin:10px 0;padding:0 5px;border-right:2px solid #e8e8e8}.nav ul li:hover{border-right:2px solid #326ad3;padding:0 5px}.nav ul li.disabled a{pointer-events:none;opacity:.5}.nav ul li.disabled:hover{border-right:2px solid #e8e8e8}.nav ul li a{padding:0!important;display:flex;border-radius:15px;min-width:42px;box-shadow:none;align-items:center;height:42px;line-height:10px}.nav ul li a img{width:27px}.nav ul li a:hover{background:#fff}.nav ul li a:hover img{filter:invert(.2) sepia(1) saturate(8) hue-rotate(180deg)}.nav ul li.active{border-right:2px solid #326ad3}.nav ul li.active a{background:#fff}\n"] }]
49
- }], ctorParameters: () => [{ type: i1.UtilsService }, { type: i1.CoolmapService }], propDecorators: { drawer: [{
50
- type: Output
51
- }], changeNav: [{
52
- type: Output
53
- }] } });
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAvc3JjL2xpYi9jb21wb25lbnQvbmF2L25hdi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb29sbWFwL3NyYy9saWIvY29tcG9uZW50L25hdi9uYXYuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRTNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFPMUMsTUFBTSxPQUFPLFlBQVk7SUFTSjtJQUE0QjtJQVI5QixNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJQUNyQyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUN4RCxRQUFRLEdBQVcsU0FBUyxDQUFDO0lBQzdCLFdBQVcsR0FBWSxJQUFJLENBQUM7SUFDNUIsZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDbEUsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDM0QsVUFBVSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFFM0MsWUFBbUIsS0FBbUIsRUFBUyxPQUF1QjtRQUFuRCxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDekcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELFVBQVUsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDdkMsU0FBUyxDQUFDLElBQVk7UUFDcEIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0UsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUE7WUFBQyxDQUFDO2lCQUN4RSxDQUFDO2dCQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1lBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEMsQ0FBQzt3R0EzQlUsWUFBWTs0RkFBWixZQUFZLHNHQ1R6Qixzd0JBbUJBOzs0RkRWYSxZQUFZO2tCQUx4QixTQUFTOytCQUNFLFNBQVM7OEdBS0YsTUFBTTtzQkFBdEIsTUFBTTtnQkFDVSxTQUFTO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb29sbWFwU2VydmljZSwgVXRpbHNTZXJ2aWNlIH0gZnJvbSAnQGFnZ2RpcmVjdC9jb29sbWFwLXNlcnZpY2VzJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbmF2JyxcbiAgdGVtcGxhdGVVcmw6ICcuL25hdi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25hdi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5hdkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBPdXRwdXQoKSBwdWJsaWMgZHJhd2VyID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZU5hdiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBuYXZWYWx1ZTogc3RyaW5nID0gJ0pvYmNvZGUnO1xuICBpc25hdkNoYW5nZTogYm9vbGVhbiA9IHRydWU7XG4gIHBhZGRpbkZvckpvYkNvZGUgPSB7IHRvcDogMCwgYm90dG9tOiAyNTAsIGxlZnQ6IDUwMCwgcmlnaHQ6IDQwMCB9O1xuICBwYWRkaW5Gb3JWaWV3Um91dGUgPSB7IHRvcDogMCwgYm90dG9tOiA0MDAsIGxlZnQ6IDQwMCwgcmlnaHQ6IDAgfTtcbiAgcHVibGljIGRlc3Ryb3llciQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB1dGlsczogVXRpbHNTZXJ2aWNlLCBwdWJsaWMgY29vbE1hcDogQ29vbG1hcFNlcnZpY2UpIHtcbiAgICB0aGlzLnV0aWxzLm5hdkNoYW5nZU9ic2VydmUucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKHJlcyA9PiB7IHRoaXMuaXNuYXZDaGFuZ2UgPSByZXMgfSlcbiAgICB0aGlzLmNvb2xNYXAuc2V0UGFkZGluZyh0aGlzLnBhZGRpbkZvckpvYkNvZGUpO1xuICB9XG5cbiAgb3BlbkRyYXdlcigpIHsgdGhpcy5kcmF3ZXIuZW1pdCh0cnVlKSB9XG4gIGNobmFnZU5hdihuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc25hdkNoYW5nZSkge1xuICAgICAgdGhpcy5jaGFuZ2VOYXYuZW1pdChuYW1lKTsgdGhpcy5uYXZWYWx1ZSA9IG5hbWU7IHRoaXMuY29vbE1hcC5jbGVhckJvdW5kKCk7XG4gICAgICBpZiAobmFtZSA9PT0gJ0FkZHJvdXRlJykgeyB0aGlzLmNvb2xNYXAuc2V0UGFkZGluZyh0aGlzLnBhZGRpbkZvclZpZXdSb3V0ZSkgfVxuICAgICAgZWxzZSB7IHRoaXMuY29vbE1hcC5zZXRQYWRkaW5nKHRoaXMucGFkZGluRm9ySm9iQ29kZSkgfVxuICAgICAgdGhpcy51dGlscy5jbGVhck9wdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llciQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3llciQudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5hdlwiPlxuICA8YnV0dG9uIChjbGljayk9XCJvcGVuRHJhd2VyKClcIiBjbGFzcz1cInRvZ2dsZVwiPlxuICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ltYWdlcy90b2dnbGUuc3ZnXCIgYWx0PVwiXCIgLz5cbiAgPC9idXR0b24+XG5cbiAgPHVsIGNsYXNzPVwibS0xMDBcIj5cbiAgICA8bGkgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBuYXZWYWx1ZSA9PT0gJ0pvYmNvZGUnfVwiPlxuICAgICAgPGEgbWF0LXJhaXNlZC1idXR0b24gI3Rvb2x0aXA9XCJtYXRUb29sdGlwXCIgbWF0VG9vbHRpcD1cIkpvYiBDb2RlXCIgYXJpYS1sYWJlbD1cIkpvYi1jb2RlXCIgKGNsaWNrKT1cImNobmFnZU5hdignSm9iY29kZScpXCI+XG4gICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ltYWdlcy9qb2ItY29kZS5zdmdcIiBhbHQ9XCJcIiAvPlxuICAgICAgPC9hPlxuICAgIDwvbGk+XG5cbiAgICA8bGkgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBuYXZWYWx1ZSA9PT0gJ0FkZHJvdXRlJywgJ2Rpc2FibGVkJzogIWlzbmF2Q2hhbmdlIH1cIj5cbiAgICAgIDxhIG1hdC1yYWlzZWQtYnV0dG9uICN0b29sdGlwPVwibWF0VG9vbHRpcFwiIG1hdFRvb2x0aXA9XCJWaWV3IFJvdXRlXCIgYXJpYS1sYWJlbD1cIlZpZXctcm91dGVcIiAoY2xpY2spPVwiY2huYWdlTmF2KCdBZGRyb3V0ZScpXCI+XG4gICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ltYWdlcy9yb3V0ZS5zdmdcIiBhbHQ9XCJcIiAvPlxuICAgICAgPC9hPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L2Rpdj5cbiJdfQ==
@@ -1,77 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, Inject } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@aggdirect/coolmap-services";
4
- import * as i2 from "@angular/common";
5
- import * as i3 from "@angular/material/tooltip";
6
- export class JobCodeListCardComponent {
7
- utils;
8
- config;
9
- route;
10
- routeSeletion = new EventEmitter();
11
- toggleDrivermenu = new EventEmitter();
12
- emitJobdetails;
13
- preventCloseDetails;
14
- constructor(utils, config) {
15
- this.utils = utils;
16
- this.config = config;
17
- }
18
- selectRoute(route) { this.routeSeletion.emit(route); }
19
- toggleDriverlist(mouseevntType, route, isHoverOut) {
20
- const data = { mouseevntType, route, isHoverOut };
21
- this.toggleDrivermenu.emit(data);
22
- if (mouseevntType === 'click')
23
- this.utils.setdictValue('driver-details', JSON.stringify(this.route));
24
- }
25
- toggleJobCodeDetails(mouseEventType, route) {
26
- if (mouseEventType) {
27
- route['type'] = 'jobcode';
28
- this.emitJobdetails.emitroute.emit(route);
29
- }
30
- else if (!mouseEventType && this.preventCloseDetails) {
31
- route = this.utils.getdictValue('route-details');
32
- route['type'] = 'jobcode';
33
- this.emitJobdetails.emitroute.emit(route);
34
- }
35
- else if (!mouseEventType && !this.preventCloseDetails)
36
- this.emitJobdetails.clearJobDetailsFromList.emit(true);
37
- }
38
- calculateStatusPercentage(type, route) {
39
- const total = route['Done'] + route['Ongoing'] + route['Open'];
40
- if (type === 'done') {
41
- return Math.round((100 * route['Done']) / total);
42
- }
43
- else if (type === 'ongoing') {
44
- return Math.round((100 * route['Ongoing']) / total);
45
- }
46
- else if (type === 'open') {
47
- return Math.round((100 * route['Open']) / total);
48
- }
49
- else {
50
- return null;
51
- }
52
- }
53
- setRouteItem() {
54
- this.utils.preVentJobdetailclose.next(true);
55
- this.utils.setdictValue('route-details', JSON.stringify(this.route));
56
- }
57
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: JobCodeListCardComponent, deps: [{ token: i1.UtilsService }, { token: 'memberData' }], target: i0.ɵɵFactoryTarget.Component });
58
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: JobCodeListCardComponent, selector: "app-job-code-list-card", inputs: { route: "route", emitJobdetails: "emitJobdetails", preventCloseDetails: "preventCloseDetails" }, outputs: { routeSeletion: "routeSeletion", toggleDrivermenu: "toggleDrivermenu" }, ngImport: i0, template: "<div class=\"innerbox\">\n <div class=\"inputarea\">\n <input type=\"checkbox\" name=\"selectroute\" [checked]=\"route['isSelected']\" (change)=\"$event ? selectRoute(route) : null\" />\n <label>&nbsp;</label>\n <div class=\"border\"></div>\n </div>\n <div class=\"job_intro\">\n <div class=\"heading\">\n <h2>\n {{route['order_number'] ? route['order_number'] : ''}}\n </h2>\n |\n <span>\n {{route['customer_name']}}\n </span>\n |\n <span>\n {{route['project']}}\n </span>\n </div>\n <div class=\"destinationprt\">\n <span style=\"padding-left: 0;\">\n {{route['pickup_location']}}\n </span>\n <b>></b>\n <span>\n {{route['delivery_location']}}\n </span>\n </div>\n <div class=\"mat_cat\">\n <span>\n {{route['material']}}\n </span>\n </div>\n\n <div class=\"statusbar\">\n <div class=\"status_percent\">\n <span class=\"done\" [style]=\"'width:'+calculateStatusPercentage('done',route['values'])+'%'\"></span>\n <span class=\"ongoing\" [style]=\"'width:'+calculateStatusPercentage('ongoing', route['values'])+'%'\"> </span>\n <span class=\"open\" [style]=\"'width:'+calculateStatusPercentage('open', route['values'])+'%'\"> </span>\n </div>\n </div>\n </div>\n <div class=\"statusarea\">\n <div class=\"statusunit\" [ngClass]=\"route['unit']\">{{route['unit']}}</div>\n <div class=\"driver_icon\" *ngIf=\"config.repository !== 'customer'\" (mouseover)=\"toggleDriverlist(true, route)\" (mouseout)=\"toggleDriverlist(false, route, true)\"\n mat-raised-button #tooltip=\"matTooltip\" matTooltip=\"Click on icon to show the driver list\" matTooltipPosition=\"above\"\n (click)=\"toggleDriverlist('click', route)\">\n <img src=\"assets/images/driver_icon.png\" [alt]=\"\" />\n </div>\n <div class=\"infoicon\" (click)=\"setRouteItem()\" (mouseover)=\"toggleJobCodeDetails(true, route)\"\n (mouseout)=\"toggleJobCodeDetails(false, route)\">\n <img src=\"assets/images/info_icon.png\" [alt]=\"\" />\n </div>\n </div>\n</div>\n", styles: [".innerbox{display:flex;justify-content:space-between}.innerbox .inputarea{display:flex;align-items:center}.innerbox .inputarea input[type=checkbox]{width:100%;height:100%;margin-right:10px;opacity:0;position:absolute;left:0;margin-left:0;top:0;z-index:3;cursor:pointer}.innerbox .inputarea label{width:100%;position:relative;z-index:2;font-size:12px;color:#878787;height:100%;position:absolute;top:0;left:0}.innerbox .inputarea .border{position:absolute;width:100%;height:100%;left:0;right:0;top:-1px;border-radius:15px}.innerbox .inputarea input:checked~.border{border-left:3px solid #39c471;border-right:1px solid #39c471;border-top:1px solid #39c471;border-bottom:1px solid #39c471}.innerbox .inputarea h2{margin-left:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:214px;padding-left:16px;margin-bottom:5px;margin-top:0}.innerbox .job_intro{width:90%}.innerbox .job_intro .heading{display:flex;font-size:.8rem}.innerbox .job_intro .heading h2{margin:0 4px 0 0;font-size:.8rem}.innerbox .job_intro .heading span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100px;padding:0 3px;display:block}.innerbox .job_intro .destinationprt{display:flex;margin-top:10px;font-size:.8rem}.innerbox .job_intro .destinationprt span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:132px;padding:0 5px;display:block}.innerbox .job_intro .mat_cat{margin-top:10px;font-size:.8rem}.innerbox .job_intro .statusbar{width:100%;position:relative;height:5px;margin-top:10px}.innerbox .job_intro .statusbar .status_percent{position:absolute;left:0;display:flex;width:100%;height:100%}.innerbox .job_intro .statusbar .status_percent span{display:block}.innerbox .job_intro .statusbar .status_percent .done{background:green}.innerbox .job_intro .statusbar .status_percent .ongoing{background:#fc0}.innerbox .job_intro .statusbar .status_percent .open{background:#bfbfbf}.innerbox .statusarea{display:flex;flex-direction:column;align-items:center;width:10%}.innerbox .statusarea .statusunit{border-radius:30px;font-size:0;color:#fff;text-transform:capitalize;font-weight:500;width:20px;height:20px;text-align:center;line-height:20px}.innerbox .statusarea .statusunit:first-letter{font-size:.8rem}.innerbox .statusarea .statusunit.routestatus{right:10px}.innerbox .statusarea .statusunit.Ton{background:#39c471}.innerbox .statusarea .statusunit.Load{background:#326ad3}.innerbox .statusarea .statusunit.Hourly{background:#ffad56}.innerbox .statusarea .driver_icon,.innerbox .statusarea .infoicon{z-index:9999}.innerbox .statusarea .driver_icon img,.innerbox .statusarea .infoicon img{width:20px;height:20px}.innerbox .statusarea .driver_icon{margin:5px 0}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
59
- }
60
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: JobCodeListCardComponent, decorators: [{
61
- type: Component,
62
- args: [{ selector: 'app-job-code-list-card', template: "<div class=\"innerbox\">\n <div class=\"inputarea\">\n <input type=\"checkbox\" name=\"selectroute\" [checked]=\"route['isSelected']\" (change)=\"$event ? selectRoute(route) : null\" />\n <label>&nbsp;</label>\n <div class=\"border\"></div>\n </div>\n <div class=\"job_intro\">\n <div class=\"heading\">\n <h2>\n {{route['order_number'] ? route['order_number'] : ''}}\n </h2>\n |\n <span>\n {{route['customer_name']}}\n </span>\n |\n <span>\n {{route['project']}}\n </span>\n </div>\n <div class=\"destinationprt\">\n <span style=\"padding-left: 0;\">\n {{route['pickup_location']}}\n </span>\n <b>></b>\n <span>\n {{route['delivery_location']}}\n </span>\n </div>\n <div class=\"mat_cat\">\n <span>\n {{route['material']}}\n </span>\n </div>\n\n <div class=\"statusbar\">\n <div class=\"status_percent\">\n <span class=\"done\" [style]=\"'width:'+calculateStatusPercentage('done',route['values'])+'%'\"></span>\n <span class=\"ongoing\" [style]=\"'width:'+calculateStatusPercentage('ongoing', route['values'])+'%'\"> </span>\n <span class=\"open\" [style]=\"'width:'+calculateStatusPercentage('open', route['values'])+'%'\"> </span>\n </div>\n </div>\n </div>\n <div class=\"statusarea\">\n <div class=\"statusunit\" [ngClass]=\"route['unit']\">{{route['unit']}}</div>\n <div class=\"driver_icon\" *ngIf=\"config.repository !== 'customer'\" (mouseover)=\"toggleDriverlist(true, route)\" (mouseout)=\"toggleDriverlist(false, route, true)\"\n mat-raised-button #tooltip=\"matTooltip\" matTooltip=\"Click on icon to show the driver list\" matTooltipPosition=\"above\"\n (click)=\"toggleDriverlist('click', route)\">\n <img src=\"assets/images/driver_icon.png\" [alt]=\"\" />\n </div>\n <div class=\"infoicon\" (click)=\"setRouteItem()\" (mouseover)=\"toggleJobCodeDetails(true, route)\"\n (mouseout)=\"toggleJobCodeDetails(false, route)\">\n <img src=\"assets/images/info_icon.png\" [alt]=\"\" />\n </div>\n </div>\n</div>\n", styles: [".innerbox{display:flex;justify-content:space-between}.innerbox .inputarea{display:flex;align-items:center}.innerbox .inputarea input[type=checkbox]{width:100%;height:100%;margin-right:10px;opacity:0;position:absolute;left:0;margin-left:0;top:0;z-index:3;cursor:pointer}.innerbox .inputarea label{width:100%;position:relative;z-index:2;font-size:12px;color:#878787;height:100%;position:absolute;top:0;left:0}.innerbox .inputarea .border{position:absolute;width:100%;height:100%;left:0;right:0;top:-1px;border-radius:15px}.innerbox .inputarea input:checked~.border{border-left:3px solid #39c471;border-right:1px solid #39c471;border-top:1px solid #39c471;border-bottom:1px solid #39c471}.innerbox .inputarea h2{margin-left:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:214px;padding-left:16px;margin-bottom:5px;margin-top:0}.innerbox .job_intro{width:90%}.innerbox .job_intro .heading{display:flex;font-size:.8rem}.innerbox .job_intro .heading h2{margin:0 4px 0 0;font-size:.8rem}.innerbox .job_intro .heading span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100px;padding:0 3px;display:block}.innerbox .job_intro .destinationprt{display:flex;margin-top:10px;font-size:.8rem}.innerbox .job_intro .destinationprt span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:132px;padding:0 5px;display:block}.innerbox .job_intro .mat_cat{margin-top:10px;font-size:.8rem}.innerbox .job_intro .statusbar{width:100%;position:relative;height:5px;margin-top:10px}.innerbox .job_intro .statusbar .status_percent{position:absolute;left:0;display:flex;width:100%;height:100%}.innerbox .job_intro .statusbar .status_percent span{display:block}.innerbox .job_intro .statusbar .status_percent .done{background:green}.innerbox .job_intro .statusbar .status_percent .ongoing{background:#fc0}.innerbox .job_intro .statusbar .status_percent .open{background:#bfbfbf}.innerbox .statusarea{display:flex;flex-direction:column;align-items:center;width:10%}.innerbox .statusarea .statusunit{border-radius:30px;font-size:0;color:#fff;text-transform:capitalize;font-weight:500;width:20px;height:20px;text-align:center;line-height:20px}.innerbox .statusarea .statusunit:first-letter{font-size:.8rem}.innerbox .statusarea .statusunit.routestatus{right:10px}.innerbox .statusarea .statusunit.Ton{background:#39c471}.innerbox .statusarea .statusunit.Load{background:#326ad3}.innerbox .statusarea .statusunit.Hourly{background:#ffad56}.innerbox .statusarea .driver_icon,.innerbox .statusarea .infoicon{z-index:9999}.innerbox .statusarea .driver_icon img,.innerbox .statusarea .infoicon img{width:20px;height:20px}.innerbox .statusarea .driver_icon{margin:5px 0}\n"] }]
63
- }], ctorParameters: () => [{ type: i1.UtilsService }, { type: i1.CoolmapConfigModel, decorators: [{
64
- type: Inject,
65
- args: ['memberData']
66
- }] }], propDecorators: { route: [{
67
- type: Input
68
- }], routeSeletion: [{
69
- type: Output
70
- }], toggleDrivermenu: [{
71
- type: Output
72
- }], emitJobdetails: [{
73
- type: Input
74
- }], preventCloseDetails: [{
75
- type: Input
76
- }] } });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLWNvZGUtbGlzdC1jYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAvc3JjL2xpYi9jb21wb25lbnQvcm91dGUtam9iY29kZS1saXN0L2pvYi1jb2RlLWxpc3QtY2FyZC9qb2ItY29kZS1saXN0LWNhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29vbG1hcC9zcmMvbGliL2NvbXBvbmVudC9yb3V0ZS1qb2Jjb2RlLWxpc3Qvam9iLWNvZGUtbGlzdC1jYXJkL2pvYi1jb2RlLWxpc3QtY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFRL0UsTUFBTSxPQUFPLHdCQUF3QjtJQU1oQjtJQUNZO0lBTmYsS0FBSyxDQUFTO0lBQ2IsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDbkMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUN2QyxjQUFjLENBQU07SUFDcEIsbUJBQW1CLENBQVc7SUFDOUMsWUFBbUIsS0FBbUIsRUFDUCxNQUEwQjtRQUR0QyxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ1AsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7SUFBSSxDQUFDO0lBRTlELFdBQVcsQ0FBQyxLQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQzVELGdCQUFnQixDQUFDLGFBQStCLEVBQUUsS0FBWSxFQUFFLFVBQW9CO1FBQ2xGLE1BQU0sSUFBSSxHQUFHLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQTtRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksYUFBYSxLQUFLLE9BQU87WUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFDRCxvQkFBb0IsQ0FBQyxjQUF1QixFQUFFLEtBQVk7UUFDeEQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7WUFBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFBQyxDQUFDO2FBQ3ZGLElBQUcsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFDLENBQUM7WUFDbkQsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2pELEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7WUFBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDckUsQ0FBQzthQUNHLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CO1lBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUNELHlCQUF5QixDQUFDLElBQVksRUFBRSxLQUFVO1FBQ2hELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFBO1FBQUMsQ0FBQzthQUNwRSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQTtRQUFDLENBQUM7YUFDL0UsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7UUFBQyxDQUFDO2FBQ3pFLENBQUM7WUFBQyxPQUFPLElBQUksQ0FBQTtRQUFDLENBQUM7SUFDdEIsQ0FBQztJQUNELFlBQVk7UUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO3dHQWpDVSx3QkFBd0IsOENBT3pCLFlBQVk7NEZBUFgsd0JBQXdCLDJQQ1JyQyx1bUVBd0RBOzs0RkRoRGEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHdCQUF3Qjs7MEJBVy9CLE1BQU07MkJBQUMsWUFBWTt5Q0FOTixLQUFLO3NCQUFwQixLQUFLO2dCQUNXLGFBQWE7c0JBQTdCLE1BQU07Z0JBQ1UsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUNTLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsbUJBQW1CO3NCQUFsQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29vbG1hcENvbmZpZ01vZGVsLCBSb3V0ZSwgVXRpbHNTZXJ2aWNlIH0gZnJvbSAnQGFnZ2RpcmVjdC9jb29sbWFwLXNlcnZpY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWpvYi1jb2RlLWxpc3QtY2FyZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9qb2ItY29kZS1saXN0LWNhcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9qb2ItY29kZS1saXN0LWNhcmQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBKb2JDb2RlTGlzdENhcmRDb21wb25lbnQge1xuICBASW5wdXQoKSBwdWJsaWMgcm91dGUhOiBSb3V0ZTtcbiAgQE91dHB1dCgpIHB1YmxpYyByb3V0ZVNlbGV0aW9uID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIHRvZ2dsZURyaXZlcm1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHB1YmxpYyBlbWl0Sm9iZGV0YWlsczogYW55O1xuICBASW5wdXQoKSBwdWJsaWMgcHJldmVudENsb3NlRGV0YWlscyE6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB1dGlsczogVXRpbHNTZXJ2aWNlLFxuICAgIEBJbmplY3QoJ21lbWJlckRhdGEnKSBwdWJsaWMgY29uZmlnOiBDb29sbWFwQ29uZmlnTW9kZWwpIHsgfVxuXG4gIHNlbGVjdFJvdXRlKHJvdXRlOiBSb3V0ZSkgeyB0aGlzLnJvdXRlU2VsZXRpb24uZW1pdChyb3V0ZSkgfVxuICB0b2dnbGVEcml2ZXJsaXN0KG1vdXNlZXZudFR5cGU6IGJvb2xlYW4gfCBzdHJpbmcsIHJvdXRlOiBSb3V0ZSwgaXNIb3Zlck91dD86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBkYXRhID0geyBtb3VzZWV2bnRUeXBlLCByb3V0ZSwgaXNIb3Zlck91dCB9XG4gICAgdGhpcy50b2dnbGVEcml2ZXJtZW51LmVtaXQoZGF0YSk7XG4gICAgaWYgKG1vdXNlZXZudFR5cGUgPT09ICdjbGljaycpIHRoaXMudXRpbHMuc2V0ZGljdFZhbHVlKCdkcml2ZXItZGV0YWlscycsIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGUpKTtcbiAgfVxuICB0b2dnbGVKb2JDb2RlRGV0YWlscyhtb3VzZUV2ZW50VHlwZTogYm9vbGVhbiwgcm91dGU6IFJvdXRlKSB7XG4gICAgaWYgKG1vdXNlRXZlbnRUeXBlKSB7IHJvdXRlWyd0eXBlJ10gPSAnam9iY29kZSc7IHRoaXMuZW1pdEpvYmRldGFpbHMuZW1pdHJvdXRlLmVtaXQocm91dGUpIH1cbiAgICBlbHNlIGlmKCFtb3VzZUV2ZW50VHlwZSAmJiB0aGlzLnByZXZlbnRDbG9zZURldGFpbHMpe1xuICAgICAgcm91dGUgPSB0aGlzLnV0aWxzLmdldGRpY3RWYWx1ZSgncm91dGUtZGV0YWlscycpO1xuICAgICAgcm91dGVbJ3R5cGUnXSA9ICdqb2Jjb2RlJzsgdGhpcy5lbWl0Sm9iZGV0YWlscy5lbWl0cm91dGUuZW1pdChyb3V0ZSlcbiAgICAgfVxuICAgIGVsc2UgaWYgKCFtb3VzZUV2ZW50VHlwZSAmJiAhdGhpcy5wcmV2ZW50Q2xvc2VEZXRhaWxzKSB0aGlzLmVtaXRKb2JkZXRhaWxzLmNsZWFySm9iRGV0YWlsc0Zyb21MaXN0LmVtaXQodHJ1ZSk7XG4gIH1cbiAgY2FsY3VsYXRlU3RhdHVzUGVyY2VudGFnZSh0eXBlOiBzdHJpbmcsIHJvdXRlOiBhbnkpIHtcbiAgICBjb25zdCB0b3RhbCA9IHJvdXRlWydEb25lJ10gKyByb3V0ZVsnT25nb2luZyddICsgcm91dGVbJ09wZW4nXTtcbiAgICBpZiAodHlwZSA9PT0gJ2RvbmUnKSB7IHJldHVybiBNYXRoLnJvdW5kKCgxMDAgKiByb3V0ZVsnRG9uZSddKSAvIHRvdGFsKSB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ29uZ29pbmcnKSB7IHJldHVybiBNYXRoLnJvdW5kKCgxMDAgKiByb3V0ZVsnT25nb2luZyddKSAvIHRvdGFsKSB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ29wZW4nKSB7IHJldHVybiBNYXRoLnJvdW5kKCgxMDAgKiByb3V0ZVsnT3BlbiddKSAvIHRvdGFsKSB9XG4gICAgZWxzZSB7IHJldHVybiBudWxsIH1cbiAgfVxuICBzZXRSb3V0ZUl0ZW0oKXtcbiAgICB0aGlzLnV0aWxzLnByZVZlbnRKb2JkZXRhaWxjbG9zZS5uZXh0KHRydWUpO1xuICAgIHRoaXMudXRpbHMuc2V0ZGljdFZhbHVlKCdyb3V0ZS1kZXRhaWxzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5yb3V0ZSkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaW5uZXJib3hcIj5cbiAgPGRpdiBjbGFzcz1cImlucHV0YXJlYVwiPlxuICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic2VsZWN0cm91dGVcIiBbY2hlY2tlZF09XCJyb3V0ZVsnaXNTZWxlY3RlZCddXCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3RSb3V0ZShyb3V0ZSkgOiBudWxsXCIgLz5cbiAgICA8bGFiZWw+Jm5ic3A7PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyXCI+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiam9iX2ludHJvXCI+XG4gICAgPGRpdiBjbGFzcz1cImhlYWRpbmdcIj5cbiAgICAgIDxoMj5cbiAgICAgICAge3tyb3V0ZVsnb3JkZXJfbnVtYmVyJ10gPyByb3V0ZVsnb3JkZXJfbnVtYmVyJ10gOiAnJ319XG4gICAgICA8L2gyPlxuICAgICAgfFxuICAgICAgPHNwYW4+XG4gICAgICAgIHt7cm91dGVbJ2N1c3RvbWVyX25hbWUnXX19XG4gICAgICA8L3NwYW4+XG4gICAgICB8XG4gICAgICA8c3Bhbj5cbiAgICAgICAge3tyb3V0ZVsncHJvamVjdCddfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGVzdGluYXRpb25wcnRcIj5cbiAgICAgIDxzcGFuIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAwO1wiPlxuICAgICAgICB7e3JvdXRlWydwaWNrdXBfbG9jYXRpb24nXX19XG4gICAgICA8L3NwYW4+XG4gICAgICA8Yj4+PC9iPlxuICAgICAgPHNwYW4+XG4gICAgICAgIHt7cm91dGVbJ2RlbGl2ZXJ5X2xvY2F0aW9uJ119fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYXRfY2F0XCI+XG4gICAgICA8c3Bhbj5cbiAgICAgICAge3tyb3V0ZVsnbWF0ZXJpYWwnXX19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwic3RhdHVzYmFyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzX3BlcmNlbnRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkb25lXCIgW3N0eWxlXT1cIid3aWR0aDonK2NhbGN1bGF0ZVN0YXR1c1BlcmNlbnRhZ2UoJ2RvbmUnLHJvdXRlWyd2YWx1ZXMnXSkrJyUnXCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm9uZ29pbmdcIiBbc3R5bGVdPVwiJ3dpZHRoOicrY2FsY3VsYXRlU3RhdHVzUGVyY2VudGFnZSgnb25nb2luZycsIHJvdXRlWyd2YWx1ZXMnXSkrJyUnXCI+IDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvcGVuXCIgW3N0eWxlXT1cIid3aWR0aDonK2NhbGN1bGF0ZVN0YXR1c1BlcmNlbnRhZ2UoJ29wZW4nLCByb3V0ZVsndmFsdWVzJ10pKyclJ1wiPiA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXNhcmVhXCI+XG4gICAgPGRpdiBjbGFzcz1cInN0YXR1c3VuaXRcIiBbbmdDbGFzc109XCJyb3V0ZVsndW5pdCddXCI+e3tyb3V0ZVsndW5pdCddfX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJpdmVyX2ljb25cIiAqbmdJZj1cImNvbmZpZy5yZXBvc2l0b3J5ICE9PSAnY3VzdG9tZXInXCIgKG1vdXNlb3Zlcik9XCJ0b2dnbGVEcml2ZXJsaXN0KHRydWUsIHJvdXRlKVwiIChtb3VzZW91dCk9XCJ0b2dnbGVEcml2ZXJsaXN0KGZhbHNlLCByb3V0ZSwgdHJ1ZSlcIlxuICAgICAgbWF0LXJhaXNlZC1idXR0b24gI3Rvb2x0aXA9XCJtYXRUb29sdGlwXCIgbWF0VG9vbHRpcD1cIkNsaWNrIG9uIGljb24gdG8gc2hvdyB0aGUgZHJpdmVyIGxpc3RcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlRHJpdmVybGlzdCgnY2xpY2snLCByb3V0ZSlcIj5cbiAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ltYWdlcy9kcml2ZXJfaWNvbi5wbmdcIiBbYWx0XT1cIlwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImluZm9pY29uXCIgKGNsaWNrKT1cInNldFJvdXRlSXRlbSgpXCIgKG1vdXNlb3Zlcik9XCJ0b2dnbGVKb2JDb2RlRGV0YWlscyh0cnVlLCByb3V0ZSlcIlxuICAgICAgKG1vdXNlb3V0KT1cInRvZ2dsZUpvYkNvZGVEZXRhaWxzKGZhbHNlLCByb3V0ZSlcIj5cbiAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ltYWdlcy9pbmZvX2ljb24ucG5nXCIgW2FsdF09XCJcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19