@aggdirect/coolmap-services 1.0.4 → 1.0.6
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.
- package/bundles/coolmap-services.umd.js +1125 -0
- package/bundles/coolmap-services.umd.js.map +1 -0
- package/bundles/coolmap-services.umd.min.js +2 -0
- package/bundles/coolmap-services.umd.min.js.map +1 -0
- package/{index.d.ts → coolmap-services.d.ts} +0 -1
- package/coolmap-services.metadata.json +1 -0
- package/esm2015/lib/service/coolmap.service.js +449 -0
- package/esm2015/lib/service/utils.service.js +216 -0
- package/fesm2015/{coolmap-services.mjs → coolmap-services.js} +49 -56
- package/fesm2015/coolmap-services.js.map +1 -0
- package/lib/service/coolmap.service.d.ts +0 -3
- package/lib/service/utils.service.d.ts +0 -3
- package/package.json +8 -21
- package/esm2020/aggdirect-coolmap-services.mjs +0 -5
- package/esm2020/lib/service/coolmap.service.mjs +0 -439
- package/esm2020/lib/service/utils.service.mjs +0 -210
- package/fesm2015/aggdirect-coolmap-services.mjs +0 -709
- package/fesm2015/aggdirect-coolmap-services.mjs.map +0 -1
- package/fesm2015/coolmap-services.mjs.map +0 -1
- package/fesm2020/aggdirect-coolmap-services.mjs +0 -691
- package/fesm2020/aggdirect-coolmap-services.mjs.map +0 -1
- package/fesm2020/coolmap-services.mjs +0 -691
- package/fesm2020/coolmap-services.mjs.map +0 -1
- /package/{esm2020/coolmap-services.mjs → esm2015/coolmap-services.js} +0 -0
- /package/{esm2020/lib/service/data-model.mjs → esm2015/lib/service/data-model.js} +0 -0
- /package/{esm2020/public-api.mjs → esm2015/public-api.js} +0 -0
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/common/http";
|
|
5
|
-
import * as i2 from "@angular/material/snack-bar";
|
|
6
|
-
export class UtilsService {
|
|
7
|
-
constructor(http, snackBar) {
|
|
8
|
-
this.http = http;
|
|
9
|
-
this.snackBar = snackBar;
|
|
10
|
-
this.analyticsRESTURL = '';
|
|
11
|
-
this.RESTURLPrefix = '';
|
|
12
|
-
this.pickupOptions = [];
|
|
13
|
-
this.destOptions = [];
|
|
14
|
-
this.ownerOptions = [];
|
|
15
|
-
this.customerOptions = [];
|
|
16
|
-
this.unitOptions = [];
|
|
17
|
-
this.materialOptions = [];
|
|
18
|
-
this.jcodeOptions = [];
|
|
19
|
-
this.driverOption = [];
|
|
20
|
-
this.truckingCompanayOption = [];
|
|
21
|
-
this.routeNameOptions = [];
|
|
22
|
-
this.preventnavChange = new BehaviorSubject(false);
|
|
23
|
-
this.navChangeObserve = this.preventnavChange.asObservable();
|
|
24
|
-
this.clearViewRouteforJobCode = new BehaviorSubject(false);
|
|
25
|
-
this.clearViewRouteforJobCodeObserve = this.clearViewRouteforJobCode.asObservable();
|
|
26
|
-
this.preVentJobdetailclose = new BehaviorSubject(false);
|
|
27
|
-
this.getpreVentJobdetailclose = this.preVentJobdetailclose.asObservable();
|
|
28
|
-
this.routeDetailsUtility = new BehaviorSubject({});
|
|
29
|
-
this.getrouteDetailsUtility = this.routeDetailsUtility.asObservable();
|
|
30
|
-
this.removeMapEntity = new BehaviorSubject({});
|
|
31
|
-
this.removeMapEntityUtility = this.removeMapEntity.asObservable();
|
|
32
|
-
this.dict = new Map();
|
|
33
|
-
this.analyticsRESTURL = 'https://test-analytics.aggdirect.com/REST/';
|
|
34
|
-
this.RESTURLPrefix = 'https://test-server.aggdirect.com/REST/';
|
|
35
|
-
}
|
|
36
|
-
getDateFormat(strVal, seprater) {
|
|
37
|
-
seprater = seprater ? seprater : '-';
|
|
38
|
-
const mydate = strVal;
|
|
39
|
-
return mydate?.getFullYear() + seprater + ((mydate ? mydate.getMonth() : 0) + 1) + seprater + mydate?.getDate();
|
|
40
|
-
}
|
|
41
|
-
getData(path) { return this.http.get(`${this.analyticsRESTURL}${path}`); }
|
|
42
|
-
postdata(path, data) { return this.http.post(`${this.analyticsRESTURL}${path}`, data); }
|
|
43
|
-
postDataWithRestUrl(path, data) { return this.http.post(`${this.RESTURLPrefix}${path}`, data); }
|
|
44
|
-
fetchAutoCompleteLocations(keyword) {
|
|
45
|
-
return this.http.get(`https://api.mapbox.com/geocoding/v5/mapbox.places/${keyword}.json?access_token=pk.eyJ1Ijoic2FudGFudS1vZ21hIiwiYSI6ImNsOGQ0cDVrNjAweTMzb3RmdG9ieTU5ZDkifQ.I6ZS7mViZYSvBo4zz-mGQQ&country=US`);
|
|
46
|
-
}
|
|
47
|
-
openSnackBar(message, className) {
|
|
48
|
-
this.snackBar.open(message, '', {
|
|
49
|
-
duration: 5000, verticalPosition: 'top', horizontalPosition: 'center', panelClass: [className ? className : 'default']
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
makeOptions(item) {
|
|
53
|
-
if (item.order_number) {
|
|
54
|
-
(this.jcodeOptions.findIndex((elem) => elem.job_id === item.job_id) === -1) ? this.jcodeOptions.push({ job_code: item.order_number, job_id: item.job_id }) : null;
|
|
55
|
-
if (item.driver_list && item.driver_list?.length > 0) {
|
|
56
|
-
item.driver_list.forEach((driver) => {
|
|
57
|
-
this.driverOption.findIndex(elem => elem === driver['driver_name']) === -1 ? this.driverOption.push(driver['driver_name']) : null;
|
|
58
|
-
this.truckingCompanayOption.findIndex(elem => elem === driver['trucking_company']) === -1 ? this.truckingCompanayOption.push(driver['trucking_company']) : null;
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
((this.pickupOptions.findIndex((elem) => elem === item.pickup_location)) === -1) ? this.pickupOptions.push(item.pickup_location) : null;
|
|
63
|
-
((this.destOptions.findIndex((elem) => elem === item.delivery_location)) === -1) ? this.destOptions.push(item.delivery_location) : null;
|
|
64
|
-
(this.customerOptions.findIndex((customer) => customer === item.customer_name) === -1) ? this.customerOptions.push(item.customer_name) : null;
|
|
65
|
-
(this.unitOptions.findIndex((elem) => elem === item.unit) === -1) ? this.unitOptions.push(item.unit) : null;
|
|
66
|
-
(this.materialOptions.findIndex((elem) => elem === item.material) === -1) ? this.materialOptions.push(item.material) : null;
|
|
67
|
-
if (item.route_name)
|
|
68
|
-
this.routeNameOptions.findIndex(elem => elem === item.route_name) === -1 ? this.routeNameOptions.push(item.route_name) : null;
|
|
69
|
-
}
|
|
70
|
-
filter(value, filters) {
|
|
71
|
-
if (typeof value !== 'string') {
|
|
72
|
-
return [];
|
|
73
|
-
}
|
|
74
|
-
const filterValue = value.toLowerCase();
|
|
75
|
-
if (filterValue === '') {
|
|
76
|
-
return [];
|
|
77
|
-
}
|
|
78
|
-
const searchResults = [];
|
|
79
|
-
this.unitOptions.map(unit => {
|
|
80
|
-
if (unit.toLowerCase().includes(filterValue)) {
|
|
81
|
-
searchResults.push({ "type": "unit", "label": unit, "value": unit });
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
this.customerOptions.map(unit => {
|
|
85
|
-
if (unit.toLowerCase().includes(filterValue)) {
|
|
86
|
-
searchResults.push({ "type": "customer", "label": unit, "value": unit });
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
this.materialOptions.map(unit => {
|
|
90
|
-
if (unit.toLowerCase().includes(filterValue)) {
|
|
91
|
-
searchResults.push({ "type": "material", "label": unit, "value": unit });
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
this.pickupOptions.map(unit => {
|
|
95
|
-
if (unit.toLowerCase().includes(filterValue)) {
|
|
96
|
-
searchResults.push({ "type": "pickup location", "label": unit, "value": unit });
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
this.destOptions.map(unit => {
|
|
100
|
-
if (unit.toLowerCase().includes(filterValue)) {
|
|
101
|
-
searchResults.push({ "type": "destination location", "label": unit, "value": unit });
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
this.jcodeOptions.map(unit => {
|
|
105
|
-
if (unit.job_code.toLowerCase().includes(filterValue)) {
|
|
106
|
-
searchResults.push({ "type": "job", "label": unit['job_code'], "value": unit });
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
this.driverOption.map(unit => {
|
|
110
|
-
if (unit.toLowerCase().includes(filterValue)) {
|
|
111
|
-
searchResults.push({ "type": "Driver", "label": unit, "value": unit });
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
this.truckingCompanayOption.map(unit => {
|
|
115
|
-
if (unit.toLowerCase().includes(filterValue)) {
|
|
116
|
-
searchResults.push({ "type": "Trucking Company", "label": unit, "value": unit });
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
this.routeNameOptions.map(unit => {
|
|
120
|
-
if (unit.toLowerCase().includes(filterValue)) {
|
|
121
|
-
searchResults.push({ "type": "Route name", "label": unit, "value": unit });
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
const searchDict = {};
|
|
125
|
-
filters.map((filter) => {
|
|
126
|
-
searchDict[filter['name'] + filter['type']] = filter;
|
|
127
|
-
});
|
|
128
|
-
const furtherFilter = [];
|
|
129
|
-
searchResults.map(search => {
|
|
130
|
-
if ((search['label'] + search['type']) in searchDict) { }
|
|
131
|
-
else {
|
|
132
|
-
furtherFilter.push(search);
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
return furtherFilter;
|
|
136
|
-
}
|
|
137
|
-
getSearchResults(list, filterval) {
|
|
138
|
-
return list.filter(element => {
|
|
139
|
-
const result_list_boolean = [];
|
|
140
|
-
if (filterval.length > 0) {
|
|
141
|
-
if (filterval[0]['type'] === 'unit') {
|
|
142
|
-
result_list_boolean.push(filterval[0]['name'] === element[filterval[0]['type']]);
|
|
143
|
-
}
|
|
144
|
-
if (filterval[0]['type'] === 'customer') {
|
|
145
|
-
result_list_boolean.push(filterval[0]['name'] === element['customer_name']);
|
|
146
|
-
}
|
|
147
|
-
if (filterval[0]['type'] === 'material') {
|
|
148
|
-
result_list_boolean.push(filterval[0]['name'] === element[filterval[0]['type']]);
|
|
149
|
-
}
|
|
150
|
-
if (filterval[0]['type'] === 'pickup location') {
|
|
151
|
-
result_list_boolean.push(filterval[0]['name'] === element['pickup_location']);
|
|
152
|
-
}
|
|
153
|
-
if (filterval[0]['type'] === 'destination location') {
|
|
154
|
-
result_list_boolean.push(filterval[0]['name'] === element['delivery_location']);
|
|
155
|
-
}
|
|
156
|
-
if (filterval[0]['type'] === 'job') {
|
|
157
|
-
result_list_boolean.push(filterval[0]['name'] === element['order_number']);
|
|
158
|
-
}
|
|
159
|
-
if (filterval[0]['type'] === 'Route name') {
|
|
160
|
-
result_list_boolean.push(filterval[0]['name'] === element['route_name']);
|
|
161
|
-
}
|
|
162
|
-
if (filterval[0]['type'] === 'Driver') {
|
|
163
|
-
const index = element.driver_list?.findIndex(ele => { return filterval[0]['name'] === ele['driver_name']; });
|
|
164
|
-
if (index !== -1)
|
|
165
|
-
result_list_boolean.push(true);
|
|
166
|
-
}
|
|
167
|
-
if (filterval[0]['type'] === 'Trucking Company') {
|
|
168
|
-
const index = element.driver_list?.findIndex(ele => { return filterval[0]['name'] === ele['trucking_company']; });
|
|
169
|
-
if (index !== -1)
|
|
170
|
-
result_list_boolean.push(true);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
if (result_list_boolean.length > 0) {
|
|
174
|
-
return result_list_boolean.reduce((prev, curr) => prev && curr);
|
|
175
|
-
}
|
|
176
|
-
return false;
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
clearOptions() {
|
|
180
|
-
this.pickupOptions = [];
|
|
181
|
-
this.destOptions = [];
|
|
182
|
-
this.ownerOptions = [];
|
|
183
|
-
this.customerOptions = [];
|
|
184
|
-
this.unitOptions = [];
|
|
185
|
-
this.materialOptions = [];
|
|
186
|
-
this.jcodeOptions = [];
|
|
187
|
-
this.routeNameOptions = [];
|
|
188
|
-
}
|
|
189
|
-
setdictValue(key, value) {
|
|
190
|
-
this.dict.set(key, value);
|
|
191
|
-
}
|
|
192
|
-
getdictValue(key) {
|
|
193
|
-
return JSON.parse(this.dict.get(key));
|
|
194
|
-
}
|
|
195
|
-
removedictValue(key) {
|
|
196
|
-
this.dict.delete(key);
|
|
197
|
-
}
|
|
198
|
-
conveySearchIcon(value) {
|
|
199
|
-
if (value && typeof (value) !== 'object')
|
|
200
|
-
return true;
|
|
201
|
-
return false;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
UtilsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UtilsService, deps: [{ token: i1.HttpClient }, { token: i2.MatSnackBar }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
205
|
-
UtilsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UtilsService, providedIn: 'root' });
|
|
206
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UtilsService, decorators: [{
|
|
207
|
-
type: Injectable,
|
|
208
|
-
args: [{ providedIn: 'root' }]
|
|
209
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.MatSnackBar }]; } });
|
|
210
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAtc2VydmljZXMvc3JjL2xpYi9zZXJ2aWNlL3V0aWxzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7O0FBSXZDLE1BQU0sT0FBTyxZQUFZO0lBd0J2QixZQUFtQixJQUFnQixFQUFRLFFBQXFCO1FBQTdDLFNBQUksR0FBSixJQUFJLENBQVk7UUFBUSxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBdkJoRSxxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDdEIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsa0JBQWEsR0FBVSxFQUFFLENBQUM7UUFDMUIsZ0JBQVcsR0FBVSxFQUFFLENBQUM7UUFDeEIsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFDekIsb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFDNUIsZ0JBQVcsR0FBVSxFQUFFLENBQUM7UUFDeEIsb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFDNUIsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFDekIsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFDekIsMkJBQXNCLEdBQVUsRUFBRSxDQUFDO1FBQ25DLHFCQUFnQixHQUFVLEVBQUUsQ0FBQztRQUN0QixxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxxQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEQsNkJBQXdCLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsb0NBQStCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQy9FLDBCQUFxQixH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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM1RyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVILElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJ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LENBQUM7SUFDN0IsQ0FBQztJQUNELFlBQVksQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELFlBQVksQ0FBQyxHQUFXO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxlQUFlLENBQUMsR0FBVztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsS0FBVTtRQUN6QixJQUFHLEtBQUssSUFBSSxPQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3BELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQzs7MEdBN0xVLFlBQVk7OEdBQVosWUFBWSxjQURDLE1BQU07NEZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSb3V0ZSB9IGZyb20gJy4vZGF0YS1tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgVXRpbHNTZXJ2aWNlIHtcclxuICBhbmFseXRpY3NSRVNUVVJMID0gJyc7XHJcbiAgUkVTVFVSTFByZWZpeCA9ICcnO1xyXG4gIHBpY2t1cE9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgZGVzdE9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgb3duZXJPcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIGN1c3RvbWVyT3B0aW9uczogYW55W10gPSBbXTtcclxuICB1bml0T3B0aW9uczogYW55W10gPSBbXTtcclxuICBtYXRlcmlhbE9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgamNvZGVPcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIGRyaXZlck9wdGlvbjogYW55W10gPSBbXTtcclxuICB0cnVja2luZ0NvbXBhbmF5T3B0aW9uOiBhbnlbXSA9IFtdO1xyXG4gIHJvdXRlTmFtZU9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgcHVibGljIHByZXZlbnRuYXZDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcclxuICBuYXZDaGFuZ2VPYnNlcnZlID0gdGhpcy5wcmV2ZW50bmF2Q2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIGNsZWFyVmlld1JvdXRlZm9ySm9iQ29kZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG4gIGNsZWFyVmlld1JvdXRlZm9ySm9iQ29kZU9ic2VydmUgPSB0aGlzLmNsZWFyVmlld1JvdXRlZm9ySm9iQ29kZS5hc09ic2VydmFibGUoKTtcclxuICBwcmVWZW50Sm9iZGV0YWlsY2xvc2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcclxuICBnZXRwcmVWZW50Sm9iZGV0YWlsY2xvc2UgPSB0aGlzLnByZVZlbnRKb2JkZXRhaWxjbG9zZS5hc09ic2VydmFibGUoKTtcclxuICByb3V0ZURldGFpbHNVdGlsaXR5ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7fSk7XHJcbiAgZ2V0cm91dGVEZXRhaWxzVXRpbGl0eSA9IHRoaXMucm91dGVEZXRhaWxzVXRpbGl0eS5hc09ic2VydmFibGUoKTtcclxuICByZW1vdmVNYXBFbnRpdHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcclxuICByZW1vdmVNYXBFbnRpdHlVdGlsaXR5ID0gdGhpcy5yZW1vdmVNYXBFbnRpdHkuYXNPYnNlcnZhYmxlKCk7XHJcbiAgZGljdCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgY29uc3RydWN0b3IocHVibGljIGh0dHA6IEh0dHBDbGllbnQscHVibGljIHNuYWNrQmFyOiBNYXRTbmFja0Jhcikge1xyXG4gICAgdGhpcy5hbmFseXRpY3NSRVNUVVJMID0gJ2h0dHBzOi8vdGVzdC1hbmFseXRpY3MuYWdnZGlyZWN0LmNvbS9SRVNULyc7XHJcbiAgICB0aGlzLlJFU1RVUkxQcmVmaXggPSAnaHR0cHM6Ly90ZXN0LXNlcnZlci5hZ2dkaXJlY3QuY29tL1JFU1QvJztcclxuICB9XHJcbiAgZ2V0RGF0ZUZvcm1hdChzdHJWYWw6IERhdGUgfCBudWxsLCBzZXByYXRlcj86IHN0cmluZykge1xyXG4gICAgc2VwcmF0ZXIgPSBzZXByYXRlciA/IHNlcHJhdGVyIDogJy0nO1xyXG4gICAgY29uc3QgbXlkYXRlID0gc3RyVmFsO1xyXG4gICAgcmV0dXJuIG15ZGF0ZT8uZ2V0RnVsbFllYXIoKSArIHNlcHJhdGVyICsgKChteWRhdGUgPyBteWRhdGUuZ2V0TW9udGgoKSA6IDApICsgMSkgKyBzZXByYXRlciArIG15ZGF0ZT8uZ2V0RGF0ZSgpO1xyXG4gIH1cclxuICBnZXREYXRhKHBhdGg6IHN0cmluZykgeyByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmFuYWx5dGljc1JFU1RVUkx9JHtwYXRofWApIH1cclxuICBwb3N0ZGF0YShwYXRoOiBzdHJpbmcsIGRhdGE6IGFueSkgeyByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5hbmFseXRpY3NSRVNUVVJMfSR7cGF0aH1gLCBkYXRhKSB9XHJcbiAgcG9zdERhdGFXaXRoUmVzdFVybChwYXRoOiBzdHJpbmcsIGRhdGE6IGFueSkgeyByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5SRVNUVVJMUHJlZml4fSR7cGF0aH1gLCBkYXRhKSB9XHJcbiAgZmV0Y2hBdXRvQ29tcGxldGVMb2NhdGlvbnMoa2V5d29yZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChgaHR0cHM6Ly9hcGkubWFwYm94LmNvbS9nZW9jb2RpbmcvdjUvbWFwYm94LnBsYWNlcy8ke2tleXdvcmR9Lmpzb24/YWNjZXNzX3Rva2VuPXBrLmV5SjFJam9pYzJGdWRHRnVkUzF2WjIxaElpd2lZU0k2SW1Oc09HUTBjRFZyTmpBd2VUTXpiM1JtZEc5aWVUVTVaRGtpZlEuSTZaUzdtVmlaWVN2Qm80enotbUdRUSZjb3VudHJ5PVVTYClcclxuICB9XHJcbiAgb3BlblNuYWNrQmFyKG1lc3NhZ2U6IHN0cmluZywgY2xhc3NOYW1lPzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4obWVzc2FnZSwgJycsIHtcclxuICAgICAgZHVyYXRpb246IDUwMDAsIHZlcnRpY2FsUG9zaXRpb246ICd0b3AnLCBob3Jpem9udGFsUG9zaXRpb246ICdjZW50ZXInLCBwYW5lbENsYXNzOiBbY2xhc3NOYW1lID8gY2xhc3NOYW1lIDogJ2RlZmF1bHQnXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBtYWtlT3B0aW9ucyhpdGVtOiBSb3V0ZSkge1xyXG4gICAgaWYgKGl0ZW0ub3JkZXJfbnVtYmVyKSB7XHJcbiAgICAgICh0aGlzLmpjb2RlT3B0aW9ucy5maW5kSW5kZXgoKGVsZW0pID0+IGVsZW0uam9iX2lkID09PSBpdGVtLmpvYl9pZCkgPT09IC0xKSA/IHRoaXMuamNvZGVPcHRpb25zLnB1c2goeyBqb2JfY29kZTogaXRlbS5vcmRlcl9udW1iZXIsIGpvYl9pZDogaXRlbS5qb2JfaWQgfSkgOiBudWxsO1xyXG4gICAgICBpZiAoaXRlbS5kcml2ZXJfbGlzdCAmJiBpdGVtLmRyaXZlcl9saXN0Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaXRlbS5kcml2ZXJfbGlzdC5mb3JFYWNoKChkcml2ZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuZHJpdmVyT3B0aW9uLmZpbmRJbmRleChlbGVtID0+IGVsZW0gPT09IGRyaXZlclsnZHJpdmVyX25hbWUnXSkgPT09IC0xID8gdGhpcy5kcml2ZXJPcHRpb24ucHVzaChkcml2ZXJbJ2RyaXZlcl9uYW1lJ10pIDogbnVsbDtcclxuICAgICAgICAgIHRoaXMudHJ1Y2tpbmdDb21wYW5heU9wdGlvbi5maW5kSW5kZXgoZWxlbSA9PiBlbGVtID09PSBkcml2ZXJbJ3RydWNraW5nX2NvbXBhbnknXSkgPT09IC0xID8gdGhpcy50cnVja2luZ0NvbXBhbmF5T3B0aW9uLnB1c2goZHJpdmVyWyd0cnVja2luZ19jb21wYW55J10pIDogbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgKCh0aGlzLnBpY2t1cE9wdGlvbnMuZmluZEluZGV4KChlbGVtKSA9PiBlbGVtID09PSBpdGVtLnBpY2t1cF9sb2NhdGlvbikpID09PSAtMSkgPyB0aGlzLnBpY2t1cE9wdGlvbnMucHVzaChpdGVtLnBpY2t1cF9sb2NhdGlvbikgOiBudWxsO1xyXG4gICAgKCh0aGlzLmRlc3RPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbSA9PT0gaXRlbS5kZWxpdmVyeV9sb2NhdGlvbikpID09PSAtMSkgPyB0aGlzLmRlc3RPcHRpb25zLnB1c2goaXRlbS5kZWxpdmVyeV9sb2NhdGlvbikgOiBudWxsO1xyXG4gICAgKHRoaXMuY3VzdG9tZXJPcHRpb25zLmZpbmRJbmRleCgoY3VzdG9tZXIpID0+IGN1c3RvbWVyID09PSBpdGVtLmN1c3RvbWVyX25hbWUpID09PSAtMSkgPyB0aGlzLmN1c3RvbWVyT3B0aW9ucy5wdXNoKGl0ZW0uY3VzdG9tZXJfbmFtZSkgOiBudWxsO1xyXG4gICAgKHRoaXMudW5pdE9wdGlvbnMuZmluZEluZGV4KChlbGVtKSA9PiBlbGVtID09PSBpdGVtLnVuaXQpID09PSAtMSkgPyB0aGlzLnVuaXRPcHRpb25zLnB1c2goaXRlbS51bml0KSA6IG51bGw7XHJcbiAgICAodGhpcy5tYXRlcmlhbE9wdGlvbnMuZmluZEluZGV4KChlbGVtKSA9PiBlbGVtID09PSBpdGVtLm1hdGVyaWFsKSA9PT0gLTEpID8gdGhpcy5tYXRlcmlhbE9wdGlvbnMucHVzaChpdGVtLm1hdGVyaWFsKSA6IG51bGw7XHJcbiAgICBpZiAoaXRlbS5yb3V0ZV9uYW1lKSB0aGlzLnJvdXRlTmFtZU9wdGlvbnMuZmluZEluZGV4KGVsZW0gPT4gZWxlbSA9PT0gaXRlbS5yb3V0ZV9uYW1lKSA9PT0gLTEgPyB0aGlzLnJvdXRlTmFtZU9wdGlvbnMucHVzaChpdGVtLnJvdXRlX25hbWUpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGZpbHRlcih2YWx1ZTogc3RyaW5nLCBmaWx0ZXJzOiBhbnkpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7IHJldHVybiBbXSB9XHJcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoZmlsdGVyVmFsdWUgPT09ICcnKSB7IHJldHVybiBbXSB9XHJcbiAgICBjb25zdCBzZWFyY2hSZXN1bHRzOiBhbnlbXSA9IFtdO1xyXG4gICAgdGhpcy51bml0T3B0aW9ucy5tYXAodW5pdCA9PiB7XHJcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwidW5pdFwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuY3VzdG9tZXJPcHRpb25zLm1hcCh1bml0ID0+IHtcclxuICAgICAgaWYgKHVuaXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcclxuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJjdXN0b21lclwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMubWF0ZXJpYWxPcHRpb25zLm1hcCh1bml0ID0+IHtcclxuICAgICAgaWYgKHVuaXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcclxuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJtYXRlcmlhbFwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMucGlja3VwT3B0aW9ucy5tYXAodW5pdCA9PiB7XHJcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwicGlja3VwIGxvY2F0aW9uXCIsIFwibGFiZWxcIjogdW5pdCwgXCJ2YWx1ZVwiOiB1bml0IH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5kZXN0T3B0aW9ucy5tYXAodW5pdCA9PiB7XHJcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwiZGVzdGluYXRpb24gbG9jYXRpb25cIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmpjb2RlT3B0aW9ucy5tYXAodW5pdCA9PiB7XHJcbiAgICAgIGlmICh1bml0LmpvYl9jb2RlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwiam9iXCIsIFwibGFiZWxcIjogdW5pdFsnam9iX2NvZGUnXSwgXCJ2YWx1ZVwiOiB1bml0IH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5kcml2ZXJPcHRpb24ubWFwKHVuaXQgPT4ge1xyXG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xyXG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcIkRyaXZlclwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnRydWNraW5nQ29tcGFuYXlPcHRpb24ubWFwKHVuaXQgPT4ge1xyXG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xyXG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcIlRydWNraW5nIENvbXBhbnlcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJvdXRlTmFtZU9wdGlvbnMubWFwKHVuaXQgPT4ge1xyXG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xyXG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcIlJvdXRlIG5hbWVcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBzZWFyY2hEaWN0OiBhbnkgPSB7fVxyXG4gICAgZmlsdGVycy5tYXAoKGZpbHRlcjogeyBbeDogc3RyaW5nXTogYW55OyB9KSA9PiB7XHJcbiAgICAgIHNlYXJjaERpY3RbZmlsdGVyWyduYW1lJ10gKyBmaWx0ZXJbJ3R5cGUnXV0gPSBmaWx0ZXI7XHJcbiAgICB9KVxyXG4gICAgY29uc3QgZnVydGhlckZpbHRlcjogYW55W10gPSBbXTtcclxuICAgIHNlYXJjaFJlc3VsdHMubWFwKHNlYXJjaCA9PiB7XHJcbiAgICAgIGlmICgoc2VhcmNoWydsYWJlbCddICsgc2VhcmNoWyd0eXBlJ10pIGluIHNlYXJjaERpY3QpIHsgfVxyXG4gICAgICBlbHNlIHsgZnVydGhlckZpbHRlci5wdXNoKHNlYXJjaCkgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnVydGhlckZpbHRlcjtcclxuICB9XHJcblxyXG4gIGdldFNlYXJjaFJlc3VsdHMobGlzdDogUm91dGVbXSwgZmlsdGVydmFsOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKGVsZW1lbnQgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHRfbGlzdF9ib29sZWFuID0gW11cclxuICAgICAgaWYgKGZpbHRlcnZhbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAndW5pdCcpIHtcclxuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFtmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSBhcyBrZXlvZiBSb3V0ZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdjdXN0b21lcicpIHtcclxuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFsnY3VzdG9tZXJfbmFtZSddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAnbWF0ZXJpYWwnKSB7XHJcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbZmlsdGVydmFsWzBdWyd0eXBlJ10gYXMga2V5b2YgUm91dGVdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAncGlja3VwIGxvY2F0aW9uJykge1xyXG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50WydwaWNrdXBfbG9jYXRpb24nXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ2Rlc3RpbmF0aW9uIGxvY2F0aW9uJykge1xyXG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50WydkZWxpdmVyeV9sb2NhdGlvbiddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAnam9iJykge1xyXG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50WydvcmRlcl9udW1iZXInXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ1JvdXRlIG5hbWUnKSB7XHJcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbJ3JvdXRlX25hbWUnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ0RyaXZlcicpIHtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gZWxlbWVudC5kcml2ZXJfbGlzdD8uZmluZEluZGV4KGVsZSA9PiB7IHJldHVybiBmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlWydkcml2ZXJfbmFtZSddIH0pO1xyXG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdUcnVja2luZyBDb21wYW55Jykge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBlbGVtZW50LmRyaXZlcl9saXN0Py5maW5kSW5kZXgoZWxlID0+IHsgcmV0dXJuIGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVbJ3RydWNraW5nX2NvbXBhbnknXSB9KTtcclxuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlc3VsdF9saXN0X2Jvb2xlYW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRfbGlzdF9ib29sZWFuLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiAmJiBjdXJyKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsZWFyT3B0aW9ucygpIHtcclxuICAgIHRoaXMucGlja3VwT3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5kZXN0T3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5vd25lck9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuY3VzdG9tZXJPcHRpb25zID0gW107XHJcbiAgICB0aGlzLnVuaXRPcHRpb25zID0gW107XHJcbiAgICB0aGlzLm1hdGVyaWFsT3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5qY29kZU9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMucm91dGVOYW1lT3B0aW9ucyA9IFtdO1xyXG4gIH1cclxuICBzZXRkaWN0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGljdC5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgfVxyXG4gIGdldGRpY3RWYWx1ZShrZXk6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5kaWN0LmdldChrZXkpKTtcclxuICB9XHJcbiAgcmVtb3ZlZGljdFZhbHVlKGtleTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRpY3QuZGVsZXRlKGtleSk7XHJcbiAgfVxyXG4gIGNvbnZleVNlYXJjaEljb24odmFsdWU6IGFueSk6IGJvb2xlYW57XHJcbiAgICBpZih2YWx1ZSAmJiB0eXBlb2YodmFsdWUpICE9PSAnb2JqZWN0JykgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbn1cclxuIl19
|