barsa-develop-components 2.2.73 → 2.2.75
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/fesm2022/barsa-develop-components.mjs +205 -204
- package/fesm2022/barsa-develop-components.mjs.map +1 -1
- package/lib/avatar/avatar.component.d.ts +1 -1
- package/lib/form-report-view/form-report-view.component.d.ts +1 -1
- package/lib/geographic-location/geographic-location.component.d.ts +1 -1
- package/lib/report-button-view/report-button-view.component.d.ts +1 -1
- package/package.json +3 -5
- package/esm2022/barsa-develop-components.mjs +0 -5
- package/esm2022/lib/accept-reject/accept-reject.component.mjs +0 -68
- package/esm2022/lib/avatar/avatar.component.mjs +0 -29
- package/esm2022/lib/barcode-format-pipe.mjs +0 -25
- package/esm2022/lib/barcode-reader/barcode-reader.component.mjs +0 -62
- package/esm2022/lib/barcode-reader-dialog/barcode-reader-dialog.component.mjs +0 -82
- package/esm2022/lib/barcode-reader-video/barcode-reader-video.component.mjs +0 -66
- package/esm2022/lib/barcode.service.mjs +0 -330
- package/esm2022/lib/barsa-develop-components.module.mjs +0 -292
- package/esm2022/lib/barsa-document-list-item/barsa-document-list-item.component.mjs +0 -104
- package/esm2022/lib/barsa-documents/barsa-documents.component.mjs +0 -159
- package/esm2022/lib/barsa-geographic-location/barsa-geographic-location.component.mjs +0 -173
- package/esm2022/lib/card-content-image-and-title/card-content-image-and-title.component.mjs +0 -50
- package/esm2022/lib/card-content-line-chart/card-content-line-chart.component.mjs +0 -36
- package/esm2022/lib/card-header-big-image-title-and-subtitle/card-header-big-image-title-and-subtitle.component.mjs +0 -19
- package/esm2022/lib/card-header-kpi/card-header-kpi.component.mjs +0 -40
- package/esm2022/lib/card-header-logo-title-subtitle/card-header-logo-title-subtitle.component.mjs +0 -45
- package/esm2022/lib/checkbox-button/checkbox-button.component.mjs +0 -23
- package/esm2022/lib/column-chip/column-chip.component.mjs +0 -44
- package/esm2022/lib/column-form-viewer/column-form-viewer.component.mjs +0 -88
- package/esm2022/lib/column-progressbar/column-progressbar.component.mjs +0 -87
- package/esm2022/lib/enum-info-micro-proccess-flow/enum-info-micro-proccess-flow.component.mjs +0 -18
- package/esm2022/lib/footer/footer.component.mjs +0 -43
- package/esm2022/lib/form-card/form-card.component.mjs +0 -17
- package/esm2022/lib/form-chart-content/form-chart-content.component.mjs +0 -36
- package/esm2022/lib/form-content-quick-view/form-content-quick-view.component.mjs +0 -102
- package/esm2022/lib/form-report-view/form-report-view.component.mjs +0 -25
- package/esm2022/lib/form-report-view-item/form-report-view-item.component.mjs +0 -45
- package/esm2022/lib/g4b-details/g4b-details.component.mjs +0 -28
- package/esm2022/lib/g4b-estelam/g4b-estelam.component.mjs +0 -30
- package/esm2022/lib/geographic-location/geographic-location.component.mjs +0 -88
- package/esm2022/lib/login-form/login-form.component.mjs +0 -55
- package/esm2022/lib/login-social-conncetions/login-social-conncetions.component.mjs +0 -30
- package/esm2022/lib/master-detail-card-form/master-detail-card-form.component.mjs +0 -17
- package/esm2022/lib/media-file-uploader/media-file-uploader.component.mjs +0 -238
- package/esm2022/lib/micro-proccess-flow/micro-proccess-flow.component.mjs +0 -52
- package/esm2022/lib/micro-process-flow-view/micro-process-flow-view.component.mjs +0 -24
- package/esm2022/lib/mo-info-micro-proccess-flow/mo-info-micro-proccess-flow.component.mjs +0 -23
- package/esm2022/lib/models/document-item.mjs +0 -2
- package/esm2022/lib/models/documents-setting.mjs +0 -2
- package/esm2022/lib/models/form-report-view-setting.mjs +0 -2
- package/esm2022/lib/models/index.mjs +0 -8
- package/esm2022/lib/models/micro-process-flow-view-setting.mjs +0 -2
- package/esm2022/lib/models/person.mjs +0 -2
- package/esm2022/lib/models/service-desk-view-of-services-setting.mjs +0 -2
- package/esm2022/lib/models/tab-process-view-setting.mjs +0 -2
- package/esm2022/lib/pipes/datasource-to-flow-item.mjs +0 -23
- package/esm2022/lib/pipes/index.mjs +0 -3
- package/esm2022/lib/pipes/mo-list-to-flow-item.pipe.mjs +0 -23
- package/esm2022/lib/query-string-form-observable/query-string-form-observable.component.mjs +0 -37
- package/esm2022/lib/query-string-observable/query-string-observable.component.mjs +0 -22
- package/esm2022/lib/report-button-view/report-button-view.component.mjs +0 -37
- package/esm2022/lib/report-line-chart-view/report-line-chart-view.component.mjs +0 -12
- package/esm2022/lib/report-tab-view/report-tab-view.component.mjs +0 -27
- package/esm2022/lib/resend-verification-code/resend-verification-code.component.mjs +0 -62
- package/esm2022/lib/service-desk-card-content-mojavezhay-akhz-shode/service-desk-card-content-mojavezhay-akhz-shode.component.mjs +0 -28
- package/esm2022/lib/service-desk-form-layout-content-mojavez/service-desk-form-layout-content-mojavez.component.mjs +0 -110
- package/esm2022/lib/service-desk-header/service-desk-header.component.mjs +0 -249
- package/esm2022/lib/service-desk-servcie-detail/service-desk-servcie-detail.component.mjs +0 -142
- package/esm2022/lib/service-desk-view-of-services/service-desk-view-of-services.component.mjs +0 -37
- package/esm2022/lib/setting-form/setting-form.component.mjs +0 -64
- package/esm2022/lib/subform-in-row-report/subform-in-row-report.component.mjs +0 -73
- package/esm2022/lib/tab-process-view/tab-process-view.component.mjs +0 -48
- package/esm2022/lib/table-view-vertical-columns/table-view-vertical-columns.component.mjs +0 -16
- package/esm2022/lib/timer-count-down/timer-count-down.component.mjs +0 -104
- package/esm2022/lib/token-report-view/token-report-view.component.mjs +0 -27
- package/esm2022/lib/ui-enum-segmented-button/ui-enum-segmented-button.component.mjs +0 -25
- package/esm2022/lib/ui-num-rate/ui-num-rate.component.mjs +0 -41
- package/esm2022/lib/ui-person/ui-person.component.mjs +0 -160
- package/esm2022/lib/ui-person/ui-person.pipe.mjs +0 -41
- package/esm2022/lib/ui-pictures-carousel/ui-pictures-carousel.component.mjs +0 -17
- package/esm2022/lib/ui-text-field-search/ui-text-field-search.component.mjs +0 -42
- package/esm2022/lib/ulv-context-menu-item-show-file-content/ulv-context-menu-item-show-file-content.component.mjs +0 -69
- package/esm2022/public-api.mjs +0 -64
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
import { DecodeHintType, BarcodeFormat } from '@zxing/library';
|
|
2
|
-
import { ChecksumException, FormatException, NotFoundException } from '@zxing/library';
|
|
3
|
-
import { BrowserCodeReader, BrowserMultiFormatReader } from '@zxing/browser';
|
|
4
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
5
|
-
import { filter, map, shareReplay } from 'rxjs/operators';
|
|
6
|
-
import { Injectable } from '@angular/core';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "barsa-novin-ray-core";
|
|
9
|
-
/**
|
|
10
|
-
* Based on zxing-typescript BrowserCodeReader
|
|
11
|
-
*/
|
|
12
|
-
export class BrowserMultiFormatContinuousReader extends BrowserMultiFormatReader {
|
|
13
|
-
/**
|
|
14
|
-
* Returns the code reader scanner controls.
|
|
15
|
-
*/
|
|
16
|
-
getScannerControls() {
|
|
17
|
-
if (!this.scannerControls) {
|
|
18
|
-
throw new Error('No scanning is running at the time.');
|
|
19
|
-
}
|
|
20
|
-
return this.scannerControls;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Starts the decoding from the current or a new video element.
|
|
24
|
-
*
|
|
25
|
-
* @param deviceId The device's to be used Id
|
|
26
|
-
* @param previewEl A new video element
|
|
27
|
-
*/
|
|
28
|
-
async scanFromDeviceObservable(deviceId, previewEl) {
|
|
29
|
-
const scan$ = new BehaviorSubject({});
|
|
30
|
-
let ctrls;
|
|
31
|
-
try {
|
|
32
|
-
ctrls = await this.decodeFromVideoDevice(deviceId, previewEl, (result, error) => {
|
|
33
|
-
if (!error) {
|
|
34
|
-
scan$.next({ result });
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
console.error(error);
|
|
38
|
-
const errorName = error.name;
|
|
39
|
-
// stream cannot stop on fails.
|
|
40
|
-
if (
|
|
41
|
-
// scan Failure - found nothing, no error
|
|
42
|
-
errorName === NotFoundException.name ||
|
|
43
|
-
// scan Error - found the QR but got error on decoding
|
|
44
|
-
errorName === ChecksumException.name ||
|
|
45
|
-
errorName === FormatException.name ||
|
|
46
|
-
error.message.includes('No MultiFormat Readers were able to detect the code.')) {
|
|
47
|
-
scan$.next({ error });
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
// probably fatal error
|
|
51
|
-
scan$.error(error);
|
|
52
|
-
this.scannerControls?.stop();
|
|
53
|
-
this.scannerControls = undefined;
|
|
54
|
-
return;
|
|
55
|
-
});
|
|
56
|
-
this.scannerControls = {
|
|
57
|
-
...ctrls,
|
|
58
|
-
stop() {
|
|
59
|
-
ctrls.stop();
|
|
60
|
-
scan$.complete();
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
catch (e) {
|
|
65
|
-
scan$.error(e);
|
|
66
|
-
this.scannerControls?.stop();
|
|
67
|
-
this.scannerControls = undefined;
|
|
68
|
-
}
|
|
69
|
-
return scan$.asObservable();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
export class UserMediaBaseService {
|
|
73
|
-
/**
|
|
74
|
-
*
|
|
75
|
-
*/
|
|
76
|
-
constructor(_logService) {
|
|
77
|
-
this._logService = _logService;
|
|
78
|
-
this.hasNavigator = false;
|
|
79
|
-
this.isMediaDevicesSupported = false;
|
|
80
|
-
this._camerasSource = new BehaviorSubject([]);
|
|
81
|
-
this.cameras$ = this._camerasSource
|
|
82
|
-
.asObservable()
|
|
83
|
-
.pipe(shareReplay(1))
|
|
84
|
-
.pipe(filter((items) => items && items.length > 0));
|
|
85
|
-
this._permissionResponse = new Subject();
|
|
86
|
-
this.permissionResponse$ = this._permissionResponse.asObservable();
|
|
87
|
-
this._hasDevicesSource = new BehaviorSubject(false);
|
|
88
|
-
this.hasDevices$ = this._hasDevicesSource.asObservable().pipe(shareReplay(1));
|
|
89
|
-
this._permissionSource = new BehaviorSubject(false);
|
|
90
|
-
this.permission$ = this._permissionSource.asObservable().pipe();
|
|
91
|
-
this._camerasNotFoundSource = new Subject();
|
|
92
|
-
this.camerasNotFound$ = this._camerasNotFoundSource.asObservable().pipe(shareReplay(1));
|
|
93
|
-
this.hasNavigator = typeof navigator !== 'undefined';
|
|
94
|
-
this.isMediaDevicesSupported = this.hasNavigator && !!navigator.mediaDevices;
|
|
95
|
-
}
|
|
96
|
-
async updateVideoInputDevices() {
|
|
97
|
-
// permissions aren't needed to get devices, but to access them and their info
|
|
98
|
-
const devices = (await BrowserCodeReader.listVideoInputDevices()) || [];
|
|
99
|
-
const hasDevices = devices && devices.length > 0;
|
|
100
|
-
// stores discovered devices and updates information
|
|
101
|
-
this._hasDevicesSource.next(hasDevices);
|
|
102
|
-
this._camerasSource.next([...devices]);
|
|
103
|
-
if (!hasDevices) {
|
|
104
|
-
const err = {
|
|
105
|
-
code: DOMException.NOT_FOUND_ERR,
|
|
106
|
-
message: 'Device not found.'
|
|
107
|
-
};
|
|
108
|
-
this._camerasNotFoundSource.next(err);
|
|
109
|
-
}
|
|
110
|
-
return devices;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Gets and registers all cammeras.
|
|
114
|
-
*/
|
|
115
|
-
async askForPermission() {
|
|
116
|
-
if (!this.hasNavigator) {
|
|
117
|
-
this._logService.error('user media', `Can't ask permission, navigator is not present.`);
|
|
118
|
-
this._setPermission(false);
|
|
119
|
-
}
|
|
120
|
-
if (!this.isMediaDevicesSupported) {
|
|
121
|
-
this._logService.error('user media', `Can't get user media, this is not supported.`);
|
|
122
|
-
this._setPermission(false);
|
|
123
|
-
}
|
|
124
|
-
let stream;
|
|
125
|
-
let permission = false;
|
|
126
|
-
try {
|
|
127
|
-
// Will try to ask for permission
|
|
128
|
-
stream = await this._getAnyVideoDevice();
|
|
129
|
-
permission = !!stream;
|
|
130
|
-
}
|
|
131
|
-
catch (err) {
|
|
132
|
-
this._handlePermissionException(err);
|
|
133
|
-
}
|
|
134
|
-
finally {
|
|
135
|
-
this.terminateStream(stream);
|
|
136
|
-
}
|
|
137
|
-
this._setPermission(permission);
|
|
138
|
-
return permission;
|
|
139
|
-
}
|
|
140
|
-
terminateStream(stream) {
|
|
141
|
-
if (stream) {
|
|
142
|
-
stream.getTracks().forEach((t) => t.stop());
|
|
143
|
-
}
|
|
144
|
-
stream = undefined;
|
|
145
|
-
}
|
|
146
|
-
_setPermission(permission) {
|
|
147
|
-
this._permissionSource.next(permission);
|
|
148
|
-
}
|
|
149
|
-
_getAnyVideoDevice() {
|
|
150
|
-
return navigator.mediaDevices.getUserMedia({ video: true });
|
|
151
|
-
}
|
|
152
|
-
_handlePermissionException(err) {
|
|
153
|
-
console.error('user media', 'Error when asking for permission.', err);
|
|
154
|
-
let permission = false;
|
|
155
|
-
switch (err.name) {
|
|
156
|
-
// usually caused by not secure origins
|
|
157
|
-
case 'NotSupportedError':
|
|
158
|
-
this._logService.warn('user media', err.message);
|
|
159
|
-
// could not claim
|
|
160
|
-
permission = false;
|
|
161
|
-
// can't check devices
|
|
162
|
-
this._hasDevicesSource.next(false);
|
|
163
|
-
break;
|
|
164
|
-
// user denied permission
|
|
165
|
-
case 'NotAllowedError':
|
|
166
|
-
this._logService.warn('user media', err.message);
|
|
167
|
-
// claimed and denied permission
|
|
168
|
-
permission = false;
|
|
169
|
-
// this means that input devices exists
|
|
170
|
-
this._hasDevicesSource.next(true);
|
|
171
|
-
break;
|
|
172
|
-
// the device has no attached input devices
|
|
173
|
-
case 'NotFoundError':
|
|
174
|
-
this._logService.warn('user media', err.message);
|
|
175
|
-
// no permissions claimed
|
|
176
|
-
permission = false;
|
|
177
|
-
// because there was no devices
|
|
178
|
-
this._hasDevicesSource.next(false);
|
|
179
|
-
// tells the listener about the error
|
|
180
|
-
this._camerasNotFoundSource.next(err);
|
|
181
|
-
break;
|
|
182
|
-
case 'NotReadableError':
|
|
183
|
-
this._logService.warn('user media', `Couldn't read the device(s)'s stream, it's probably in use by another app.`);
|
|
184
|
-
// no permissions claimed
|
|
185
|
-
permission = false;
|
|
186
|
-
// there are devices, which I couldn't use
|
|
187
|
-
this._hasDevicesSource.next(false);
|
|
188
|
-
// tells the listener about the error
|
|
189
|
-
this._camerasNotFoundSource.next(err);
|
|
190
|
-
break;
|
|
191
|
-
default:
|
|
192
|
-
this._logService.warn('user media', 'I was not able to define if I have permissions for camera or not.', err);
|
|
193
|
-
// unknown
|
|
194
|
-
permission = false;
|
|
195
|
-
// this.hasDevices.next(undefined;
|
|
196
|
-
break;
|
|
197
|
-
}
|
|
198
|
-
this._setPermission(permission);
|
|
199
|
-
// tells the listener about the error
|
|
200
|
-
this._permissionResponse.next(err);
|
|
201
|
-
return permission;
|
|
202
|
-
}
|
|
203
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserMediaBaseService, deps: [{ token: i1.LogService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
204
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserMediaBaseService }); }
|
|
205
|
-
}
|
|
206
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserMediaBaseService, decorators: [{
|
|
207
|
-
type: Injectable
|
|
208
|
-
}], ctorParameters: () => [{ type: i1.LogService }] });
|
|
209
|
-
export class WebBarcodeService {
|
|
210
|
-
constructor(userMediaService) {
|
|
211
|
-
this.userMediaService = userMediaService;
|
|
212
|
-
this._device = undefined;
|
|
213
|
-
this._codeReader = undefined;
|
|
214
|
-
this._hints = new Map();
|
|
215
|
-
this._scanErrorSource = new Subject();
|
|
216
|
-
this._scanFailureSource = new Subject();
|
|
217
|
-
this._scanCompleteSource = new Subject();
|
|
218
|
-
this._scanSuccessSource = new Subject();
|
|
219
|
-
this._options = {
|
|
220
|
-
delayBetweenScanAttempts: 50,
|
|
221
|
-
delayBetweenScanSuccess: 500
|
|
222
|
-
};
|
|
223
|
-
this.scanError$ = this._scanErrorSource.asObservable();
|
|
224
|
-
this.scanFailure$ = this._scanFailureSource.asObservable();
|
|
225
|
-
this.scanComplete$ = this._scanCompleteSource.asObservable();
|
|
226
|
-
this.scanSuccess$ = this._scanSuccessSource.asObservable().pipe(map((c) => c.getText()));
|
|
227
|
-
}
|
|
228
|
-
startScan(device, videoEl, options = this._options) {
|
|
229
|
-
// instantly stops the scan before changing devices
|
|
230
|
-
this.scanStop();
|
|
231
|
-
// correctly sets the new (or none) device
|
|
232
|
-
this._device = device || undefined;
|
|
233
|
-
this._videoEl = videoEl;
|
|
234
|
-
this._options = options;
|
|
235
|
-
if (!this._device) {
|
|
236
|
-
// cleans the video because user removed the device
|
|
237
|
-
BrowserCodeReader.cleanVideoSource(videoEl);
|
|
238
|
-
}
|
|
239
|
-
if (this._scanSubscription) {
|
|
240
|
-
throw new Error('There is already a scan proccess running.');
|
|
241
|
-
}
|
|
242
|
-
if (!this._device) {
|
|
243
|
-
throw new Error('No device defined, cannot start scan, please define a device.');
|
|
244
|
-
}
|
|
245
|
-
// if enabled, starts scanning
|
|
246
|
-
if (device) {
|
|
247
|
-
this.scanFromDevice(device.deviceId);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
setFormat(input) {
|
|
251
|
-
if (typeof input === 'string') {
|
|
252
|
-
throw new Error('Invalid formats, make sure the [formats] input is a binding.');
|
|
253
|
-
}
|
|
254
|
-
// formats may be set from html template as BarcodeFormat or string array
|
|
255
|
-
const formats = input.map((f) => this.getBarcodeFormatOrFail(f));
|
|
256
|
-
const hints = this._hints;
|
|
257
|
-
// updates the hints
|
|
258
|
-
hints.set(DecodeHintType.POSSIBLE_FORMATS, formats);
|
|
259
|
-
// handles updating the codeReader
|
|
260
|
-
this._hints = hints;
|
|
261
|
-
}
|
|
262
|
-
scanStop() {
|
|
263
|
-
if (this._scanSubscription) {
|
|
264
|
-
this._codeReader?.getScannerControls().stop();
|
|
265
|
-
this._scanSubscription?.unsubscribe();
|
|
266
|
-
this._scanSubscription = undefined;
|
|
267
|
-
}
|
|
268
|
-
// this.torchCompatible.next(false);
|
|
269
|
-
}
|
|
270
|
-
destroy() {
|
|
271
|
-
// @note apenas necessario por enquanto causa da Torch
|
|
272
|
-
this.scanStop();
|
|
273
|
-
this._codeReader = undefined;
|
|
274
|
-
this._device = undefined;
|
|
275
|
-
}
|
|
276
|
-
getBarcodeFormatOrFail(format) {
|
|
277
|
-
return typeof format === 'string' ? BarcodeFormat[format.trim().toUpperCase()] : format;
|
|
278
|
-
}
|
|
279
|
-
async scanFromDevice(deviceId) {
|
|
280
|
-
const videoElement = this._videoEl;
|
|
281
|
-
const codeReader = this.getCodeReader();
|
|
282
|
-
const scanStream = await codeReader.scanFromDeviceObservable(deviceId, videoElement);
|
|
283
|
-
if (!scanStream) {
|
|
284
|
-
throw new Error('Undefined decoding stream, aborting.');
|
|
285
|
-
}
|
|
286
|
-
const next = (x) => this._onDecodeResult(x.result, x.error);
|
|
287
|
-
const error = (err) => this._onDecodeError(err);
|
|
288
|
-
const complete = () => { };
|
|
289
|
-
this._scanSubscription = scanStream.subscribe(next, error, complete);
|
|
290
|
-
if (this._scanSubscription.closed) {
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
// const controls = codeReader.getScannerControls();
|
|
294
|
-
// const hasTorchControl = typeof controls.switchTorch !== 'undefined';
|
|
295
|
-
// this.torchCompatible.next(hasTorchControl);
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Handles decode errors.
|
|
299
|
-
*/
|
|
300
|
-
_onDecodeError(err) {
|
|
301
|
-
this._scanErrorSource.next(err);
|
|
302
|
-
// this.reset();
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Handles decode results.
|
|
306
|
-
*/
|
|
307
|
-
_onDecodeResult(result, error) {
|
|
308
|
-
if (result) {
|
|
309
|
-
this._scanSuccessSource.next(result);
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
this._scanFailureSource.next(error);
|
|
313
|
-
}
|
|
314
|
-
if (result) {
|
|
315
|
-
this._scanCompleteSource.next(result);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
getCodeReader() {
|
|
319
|
-
if (!this._codeReader) {
|
|
320
|
-
this._codeReader = new BrowserMultiFormatContinuousReader(this._hints, this._options);
|
|
321
|
-
}
|
|
322
|
-
return this._codeReader;
|
|
323
|
-
}
|
|
324
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebBarcodeService, deps: [{ token: UserMediaBaseService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
325
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebBarcodeService }); }
|
|
326
|
-
}
|
|
327
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebBarcodeService, decorators: [{
|
|
328
|
-
type: Injectable
|
|
329
|
-
}], ctorParameters: () => [{ type: UserMediaBaseService }] });
|
|
330
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyY29kZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtZGV2ZWxvcC1jb21wb25lbnRzL3NyYy9saWIvYmFyY29kZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsd0JBQXdCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0YsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTzNDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtDQUFtQyxTQUFRLHdCQUF3QjtJQU81RTs7T0FFRztJQUNJLGtCQUFrQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyx3QkFBd0IsQ0FDakMsUUFBaUIsRUFDakIsU0FBNEI7UUFFNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFlLENBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksS0FBSyxDQUFDO1FBRVYsSUFBSSxDQUFDO1lBQ0QsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzVFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDVCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztvQkFDdkIsT0FBTztnQkFDWCxDQUFDO2dCQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBRTdCLCtCQUErQjtnQkFDL0I7Z0JBQ0kseUNBQXlDO2dCQUN6QyxTQUFTLEtBQUssaUJBQWlCLENBQUMsSUFBSTtvQkFDcEMsc0RBQXNEO29CQUN0RCxTQUFTLEtBQUssaUJBQWlCLENBQUMsSUFBSTtvQkFDcEMsU0FBUyxLQUFLLGVBQWUsQ0FBQyxJQUFJO29CQUNsQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxzREFBc0QsQ0FBQyxFQUNoRixDQUFDO29CQUNDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUN0QixPQUFPO2dCQUNYLENBQUM7Z0JBRUQsdUJBQXVCO2dCQUN2QixLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQixJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztnQkFDakMsT0FBTztZQUNYLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGVBQWUsR0FBRztnQkFDbkIsR0FBRyxLQUFLO2dCQUNSLElBQUk7b0JBQ0EsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNiLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckIsQ0FBQzthQUNKLENBQUM7UUFDTixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sb0JBQW9CO0lBc0I3Qjs7T0FFRztJQUNILFlBQW9CLFdBQXVCO1FBQXZCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBeEIzQyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQiw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFFaEMsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBb0IsRUFBRSxDQUFDLENBQUM7UUFDNUQsYUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjO2FBQ3pCLFlBQVksRUFBRTthQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4RCx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBZ0IsQ0FBQztRQUNsRCx3QkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFOUQsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDeEQsZ0JBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpFLHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3hELGdCQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTNELDJCQUFzQixHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO1FBQ3JELHFCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFNL0UsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLENBQUM7UUFDckQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7SUFDakYsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUI7UUFDekIsOEVBQThFO1FBQzlFLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVqRCxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDZCxNQUFNLEdBQUcsR0FBRztnQkFDUixJQUFJLEVBQUUsWUFBWSxDQUFDLGFBQWE7Z0JBQ2hDLE9BQU8sRUFBRSxtQkFBbUI7YUFDL0IsQ0FBQztZQUNGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsR0FBbUIsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLGlEQUFpRCxDQUFDLENBQUM7WUFDeEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO1lBQ3JGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQUksTUFBK0IsQ0FBQztRQUNwQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFFdkIsSUFBSSxDQUFDO1lBQ0QsaUNBQWlDO1lBQ2pDLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3pDLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzFCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQW1CLENBQUMsQ0FBQztRQUN6RCxDQUFDO2dCQUFTLENBQUM7WUFDUCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFDUyxlQUFlLENBQUMsTUFBK0I7UUFDckQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7SUFDUyxjQUFjLENBQUMsVUFBbUI7UUFDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ1Msa0JBQWtCO1FBQ3hCLE9BQU8sU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ1MsMEJBQTBCLENBQUMsR0FBaUI7UUFDbEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsbUNBQW1DLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEUsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXZCLFFBQVEsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsdUNBQXVDO1lBQ3ZDLEtBQUssbUJBQW1CO2dCQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNqRCxrQkFBa0I7Z0JBQ2xCLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ25CLHNCQUFzQjtnQkFDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsTUFBTTtZQUVWLHlCQUF5QjtZQUN6QixLQUFLLGlCQUFpQjtnQkFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDakQsZ0NBQWdDO2dCQUNoQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2dCQUNuQix1Q0FBdUM7Z0JBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xDLE1BQU07WUFFViwyQ0FBMkM7WUFDM0MsS0FBSyxlQUFlO2dCQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNqRCx5QkFBeUI7Z0JBQ3pCLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ25CLCtCQUErQjtnQkFDL0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMscUNBQXFDO2dCQUNyQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNO1lBRVYsS0FBSyxrQkFBa0I7Z0JBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUNqQixZQUFZLEVBQ1osNEVBQTRFLENBQy9FLENBQUM7Z0JBQ0YseUJBQXlCO2dCQUN6QixVQUFVLEdBQUcsS0FBSyxDQUFDO2dCQUNuQiwwQ0FBMEM7Z0JBQzFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25DLHFDQUFxQztnQkFDckMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEMsTUFBTTtZQUVWO2dCQUNJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUNqQixZQUFZLEVBQ1osbUVBQW1FLEVBQ25FLEdBQUcsQ0FDTixDQUFDO2dCQUNGLFVBQVU7Z0JBQ1YsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDbkIsa0NBQWtDO2dCQUNsQyxNQUFNO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFaEMscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbkMsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQzsrR0E5SlEsb0JBQW9CO21IQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVU7O0FBa0tYLE1BQU0sT0FBTyxpQkFBaUI7SUF1QjFCLFlBQW1CLGdCQUFzQztRQUF0QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXNCO1FBakJqRCxZQUFPLEdBQWdDLFNBQVMsQ0FBQztRQUVqRCxnQkFBVyxHQUFtRCxTQUFTLENBQUM7UUFDeEUsV0FBTSxHQUE2QixJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUNsRSxxQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBUyxDQUFDO1FBQ3hDLHVCQUFrQixHQUFHLElBQUksT0FBTyxFQUFTLENBQUM7UUFFMUMsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUM1Qyx1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQzNDLGFBQVEsR0FHWjtZQUNBLHdCQUF3QixFQUFFLEVBQUU7WUFDNUIsdUJBQXVCLEVBQUUsR0FBRztTQUMvQixDQUFDO1FBR0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQXVCLEVBQUUsT0FBeUIsRUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVE7UUFDeEYsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoQiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUksU0FBUyxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEIsbURBQW1EO1lBQ25ELGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELDhCQUE4QjtRQUM5QixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNMLENBQUM7SUFDTSxTQUFTLENBQUMsS0FBc0I7UUFDbkMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELHlFQUF5RTtRQUN6RSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVqRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTFCLG9CQUFvQjtRQUNwQixLQUFLLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVwRCxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUNNLFFBQVE7UUFDWCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUN2QyxDQUFDO1FBQ0Qsb0NBQW9DO0lBQ3hDLENBQUM7SUFFTSxPQUFPO1FBQ1Ysc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRU8sc0JBQXNCLENBQUMsTUFBOEI7UUFDekQsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVGLENBQUM7SUFDTyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQWdCO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFbkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXhDLE1BQU0sVUFBVSxHQUFHLE1BQU0sVUFBVSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVyRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBaUIsRUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQVEsRUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRCxNQUFNLFFBQVEsR0FBRyxHQUFTLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVyRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxPQUFPO1FBQ1gsQ0FBQztRQUVELG9EQUFvRDtRQUNwRCx1RUFBdUU7UUFFdkUsOENBQThDO0lBQ2xELENBQUM7SUFDRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxHQUFRO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsZ0JBQWdCO0lBQ3BCLENBQUM7SUFDRDs7T0FFRztJQUNLLGVBQWUsQ0FBQyxNQUEwQixFQUFFLEtBQTRCO1FBQzVFLElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFjLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNMLENBQUM7SUFDTyxhQUFhO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQzsrR0E5SVEsaUJBQWlCO21IQUFqQixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQsIEV4Y2VwdGlvbiwgRGVjb2RlSGludFR5cGUsIEJhcmNvZGVGb3JtYXQgfSBmcm9tICdAenhpbmcvbGlicmFyeSc7XHJcbmltcG9ydCB7IENoZWNrc3VtRXhjZXB0aW9uLCBGb3JtYXRFeGNlcHRpb24sIE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSAnQHp4aW5nL2xpYnJhcnknO1xyXG5pbXBvcnQgeyBCcm93c2VyQ29kZVJlYWRlciwgQnJvd3Nlck11bHRpRm9ybWF0UmVhZGVyLCBJU2Nhbm5lckNvbnRyb2xzIH0gZnJvbSAnQHp4aW5nL2Jyb3dzZXInO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcclxuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VsdEFuZEVycm9yIHtcclxuICAgIHJlc3VsdD86IFJlc3VsdDtcclxuICAgIGVycm9yPzogRXhjZXB0aW9uO1xyXG59XHJcblxyXG4vKipcclxuICogQmFzZWQgb24genhpbmctdHlwZXNjcmlwdCBCcm93c2VyQ29kZVJlYWRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEJyb3dzZXJNdWx0aUZvcm1hdENvbnRpbnVvdXNSZWFkZXIgZXh0ZW5kcyBCcm93c2VyTXVsdGlGb3JtYXRSZWFkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbGxvd3MgdG8gY2FsbCBzY2FubmVyIGNvbnRyb2xzIEFQSSB3aGlsZSBzY2FubmluZy5cclxuICAgICAqIFdpbGwgYmUgdW5kZWZpbmVkIGlmIG5vIHNjYW5uaW5nIGlzIHJ1bm5pZy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHNjYW5uZXJDb250cm9sczogSVNjYW5uZXJDb250cm9scyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNvZGUgcmVhZGVyIHNjYW5uZXIgY29udHJvbHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTY2FubmVyQ29udHJvbHMoKTogSVNjYW5uZXJDb250cm9scyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNjYW5uZXJDb250cm9scykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNjYW5uaW5nIGlzIHJ1bm5pbmcgYXQgdGhlIHRpbWUuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5uZXJDb250cm9scztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0cyB0aGUgZGVjb2RpbmcgZnJvbSB0aGUgY3VycmVudCBvciBhIG5ldyB2aWRlbyBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBkZXZpY2VJZCBUaGUgZGV2aWNlJ3MgdG8gYmUgdXNlZCBJZFxyXG4gICAgICogQHBhcmFtIHByZXZpZXdFbCBBIG5ldyB2aWRlbyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBzY2FuRnJvbURldmljZU9ic2VydmFibGUoXHJcbiAgICAgICAgZGV2aWNlSWQ/OiBzdHJpbmcsXHJcbiAgICAgICAgcHJldmlld0VsPzogSFRNTFZpZGVvRWxlbWVudFxyXG4gICAgKTogUHJvbWlzZTxPYnNlcnZhYmxlPFJlc3VsdEFuZEVycm9yPj4ge1xyXG4gICAgICAgIGNvbnN0IHNjYW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZXN1bHRBbmRFcnJvcj4oe30pO1xyXG4gICAgICAgIGxldCBjdHJscztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY3RybHMgPSBhd2FpdCB0aGlzLmRlY29kZUZyb21WaWRlb0RldmljZShkZXZpY2VJZCwgcHJldmlld0VsLCAocmVzdWx0LCBlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjYW4kLm5leHQoeyByZXN1bHQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvck5hbWUgPSBlcnJvci5uYW1lO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjYW5ub3Qgc3RvcCBvbiBmYWlscy5cclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAvLyBzY2FuIEZhaWx1cmUgLSBmb3VuZCBub3RoaW5nLCBubyBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9PT0gTm90Rm91bmRFeGNlcHRpb24ubmFtZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjYW4gRXJyb3IgLSBmb3VuZCB0aGUgUVIgYnV0IGdvdCBlcnJvciBvbiBkZWNvZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9PT0gQ2hlY2tzdW1FeGNlcHRpb24ubmFtZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9PT0gRm9ybWF0RXhjZXB0aW9uLm5hbWUgfHxcclxuICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdObyBNdWx0aUZvcm1hdCBSZWFkZXJzIHdlcmUgYWJsZSB0byBkZXRlY3QgdGhlIGNvZGUuJylcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjYW4kLm5leHQoeyBlcnJvciB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgZmF0YWwgZXJyb3JcclxuICAgICAgICAgICAgICAgIHNjYW4kLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lckNvbnRyb2xzPy5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scyA9IHtcclxuICAgICAgICAgICAgICAgIC4uLmN0cmxzLFxyXG4gICAgICAgICAgICAgICAgc3RvcCgpOiB2b2lkIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHJscy5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NhbiQuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHNjYW4kLmVycm9yKGUpO1xyXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scz8uc3RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scyA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzY2FuJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxufVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVc2VyTWVkaWFCYXNlU2VydmljZSB7XHJcbiAgICBoYXNOYXZpZ2F0b3IgPSBmYWxzZTtcclxuICAgIGlzTWVkaWFEZXZpY2VzU3VwcG9ydGVkID0gZmFsc2U7XHJcblxyXG4gICAgX2NhbWVyYXNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lZGlhRGV2aWNlSW5mb1tdPihbXSk7XHJcbiAgICBjYW1lcmFzJCA9IHRoaXMuX2NhbWVyYXNTb3VyY2VcclxuICAgICAgICAuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICAucGlwZShzaGFyZVJlcGxheSgxKSlcclxuICAgICAgICAucGlwZShmaWx0ZXIoKGl0ZW1zKSA9PiBpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSk7XHJcblxyXG4gICAgX3Blcm1pc3Npb25SZXNwb25zZSA9IG5ldyBTdWJqZWN0PERPTUV4Y2VwdGlvbj4oKTtcclxuICAgIHBlcm1pc3Npb25SZXNwb25zZSQgPSB0aGlzLl9wZXJtaXNzaW9uUmVzcG9uc2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgX2hhc0RldmljZXNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIGhhc0RldmljZXMkID0gdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuXHJcbiAgICBfcGVybWlzc2lvblNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcGVybWlzc2lvbiQgPSB0aGlzLl9wZXJtaXNzaW9uU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoKTtcclxuXHJcbiAgICBfY2FtZXJhc05vdEZvdW5kU291cmNlID0gbmV3IFN1YmplY3Q8RE9NRXhjZXB0aW9uPigpO1xyXG4gICAgY2FtZXJhc05vdEZvdW5kJCA9IHRoaXMuX2NhbWVyYXNOb3RGb3VuZFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLmhhc05hdmlnYXRvciA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnO1xyXG4gICAgICAgIHRoaXMuaXNNZWRpYURldmljZXNTdXBwb3J0ZWQgPSB0aGlzLmhhc05hdmlnYXRvciAmJiAhIW5hdmlnYXRvci5tZWRpYURldmljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlVmlkZW9JbnB1dERldmljZXMoKTogUHJvbWlzZTxNZWRpYURldmljZUluZm9bXT4ge1xyXG4gICAgICAgIC8vIHBlcm1pc3Npb25zIGFyZW4ndCBuZWVkZWQgdG8gZ2V0IGRldmljZXMsIGJ1dCB0byBhY2Nlc3MgdGhlbSBhbmQgdGhlaXIgaW5mb1xyXG4gICAgICAgIGNvbnN0IGRldmljZXMgPSAoYXdhaXQgQnJvd3NlckNvZGVSZWFkZXIubGlzdFZpZGVvSW5wdXREZXZpY2VzKCkpIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IGhhc0RldmljZXMgPSBkZXZpY2VzICYmIGRldmljZXMubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgLy8gc3RvcmVzIGRpc2NvdmVyZWQgZGV2aWNlcyBhbmQgdXBkYXRlcyBpbmZvcm1hdGlvblxyXG4gICAgICAgIHRoaXMuX2hhc0RldmljZXNTb3VyY2UubmV4dChoYXNEZXZpY2VzKTtcclxuICAgICAgICB0aGlzLl9jYW1lcmFzU291cmNlLm5leHQoWy4uLmRldmljZXNdKTtcclxuXHJcbiAgICAgICAgaWYgKCFoYXNEZXZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IHtcclxuICAgICAgICAgICAgICAgIGNvZGU6IERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0RldmljZSBub3QgZm91bmQuJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFzTm90Rm91bmRTb3VyY2UubmV4dChlcnIgYXMgRE9NRXhjZXB0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkZXZpY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbmQgcmVnaXN0ZXJzIGFsbCBjYW1tZXJhcy5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNrRm9yUGVybWlzc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZXJyb3IoJ3VzZXIgbWVkaWEnLCBgQ2FuJ3QgYXNrIHBlcm1pc3Npb24sIG5hdmlnYXRvciBpcyBub3QgcHJlc2VudC5gKTtcclxuICAgICAgICAgICAgdGhpcy5fc2V0UGVybWlzc2lvbihmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNNZWRpYURldmljZXNTdXBwb3J0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS5lcnJvcigndXNlciBtZWRpYScsIGBDYW4ndCBnZXQgdXNlciBtZWRpYSwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLmApO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRQZXJtaXNzaW9uKGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdHJlYW06IE1lZGlhU3RyZWFtIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBwZXJtaXNzaW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIFdpbGwgdHJ5IHRvIGFzayBmb3IgcGVybWlzc2lvblxyXG4gICAgICAgICAgICBzdHJlYW0gPSBhd2FpdCB0aGlzLl9nZXRBbnlWaWRlb0RldmljZSgpO1xyXG4gICAgICAgICAgICBwZXJtaXNzaW9uID0gISFzdHJlYW07XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVBlcm1pc3Npb25FeGNlcHRpb24oZXJyIGFzIERPTUV4Y2VwdGlvbik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy50ZXJtaW5hdGVTdHJlYW0oc3RyZWFtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NldFBlcm1pc3Npb24ocGVybWlzc2lvbik7XHJcbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb247XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgdGVybWluYXRlU3RyZWFtKHN0cmVhbTogTWVkaWFTdHJlYW0gfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoc3RyZWFtKSB7XHJcbiAgICAgICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdHJlYW0gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX3NldFBlcm1pc3Npb24ocGVybWlzc2lvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Blcm1pc3Npb25Tb3VyY2UubmV4dChwZXJtaXNzaW9uKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfZ2V0QW55VmlkZW9EZXZpY2UoKTogUHJvbWlzZTxNZWRpYVN0cmVhbT4ge1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVQZXJtaXNzaW9uRXhjZXB0aW9uKGVycjogRE9NRXhjZXB0aW9uKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcigndXNlciBtZWRpYScsICdFcnJvciB3aGVuIGFza2luZyBmb3IgcGVybWlzc2lvbi4nLCBlcnIpO1xyXG4gICAgICAgIGxldCBwZXJtaXNzaW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZXJyLm5hbWUpIHtcclxuICAgICAgICAgICAgLy8gdXN1YWxseSBjYXVzZWQgYnkgbm90IHNlY3VyZSBvcmlnaW5zXHJcbiAgICAgICAgICAgIGNhc2UgJ05vdFN1cHBvcnRlZEVycm9yJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2Uud2FybigndXNlciBtZWRpYScsIGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvdWxkIG5vdCBjbGFpbVxyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gY2FuJ3QgY2hlY2sgZGV2aWNlc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgLy8gdXNlciBkZW5pZWQgcGVybWlzc2lvblxyXG4gICAgICAgICAgICBjYXNlICdOb3RBbGxvd2VkRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKCd1c2VyIG1lZGlhJywgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gY2xhaW1lZCBhbmQgZGVuaWVkIHBlcm1pc3Npb25cclxuICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCBpbnB1dCBkZXZpY2VzIGV4aXN0c1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAvLyB0aGUgZGV2aWNlIGhhcyBubyBhdHRhY2hlZCBpbnB1dCBkZXZpY2VzXHJcbiAgICAgICAgICAgIGNhc2UgJ05vdEZvdW5kRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKCd1c2VyIG1lZGlhJywgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gcGVybWlzc2lvbnMgY2xhaW1lZFxyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSB3YXMgbm8gZGV2aWNlc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vIHRlbGxzIHRoZSBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbWVyYXNOb3RGb3VuZFNvdXJjZS5uZXh0KGVycik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ05vdFJlYWRhYmxlRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKFxyXG4gICAgICAgICAgICAgICAgICAgICd1c2VyIG1lZGlhJyxcclxuICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgcmVhZCB0aGUgZGV2aWNlKHMpJ3Mgc3RyZWFtLCBpdCdzIHByb2JhYmx5IGluIHVzZSBieSBhbm90aGVyIGFwcC5gXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gcGVybWlzc2lvbnMgY2xhaW1lZFxyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIGRldmljZXMsIHdoaWNoIEkgY291bGRuJ3QgdXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNEZXZpY2VzU291cmNlLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGVsbHMgdGhlIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FtZXJhc05vdEZvdW5kU291cmNlLm5leHQoZXJyKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2Uud2FybihcclxuICAgICAgICAgICAgICAgICAgICAndXNlciBtZWRpYScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ0kgd2FzIG5vdCBhYmxlIHRvIGRlZmluZSBpZiBJIGhhdmUgcGVybWlzc2lvbnMgZm9yIGNhbWVyYSBvciBub3QuJyxcclxuICAgICAgICAgICAgICAgICAgICBlcnJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAvLyB1bmtub3duXHJcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmhhc0RldmljZXMubmV4dCh1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NldFBlcm1pc3Npb24ocGVybWlzc2lvbik7XHJcblxyXG4gICAgICAgIC8vIHRlbGxzIHRoZSBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3JcclxuICAgICAgICB0aGlzLl9wZXJtaXNzaW9uUmVzcG9uc2UubmV4dChlcnIpO1xyXG5cclxuICAgICAgICByZXR1cm4gcGVybWlzc2lvbjtcclxuICAgIH1cclxufVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBXZWJCYXJjb2RlU2VydmljZSB7XHJcbiAgICBzY2FuRXJyb3IkOiBPYnNlcnZhYmxlPEVycm9yPjtcclxuICAgIHNjYW5GYWlsdXJlJDogT2JzZXJ2YWJsZTxFcnJvcj47XHJcbiAgICBzY2FuQ29tcGxldGUkOiBPYnNlcnZhYmxlPFJlc3VsdD47XHJcbiAgICBzY2FuU3VjY2VzcyQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuXHJcbiAgICBwcml2YXRlIF9kZXZpY2U6IE1lZGlhRGV2aWNlSW5mbyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgX3ZpZGVvRWw6IEhUTUxWaWRlb0VsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9jb2RlUmVhZGVyOiBCcm93c2VyTXVsdGlGb3JtYXRDb250aW51b3VzUmVhZGVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBfaGludHM6IE1hcDxEZWNvZGVIaW50VHlwZSwgYW55PiA9IG5ldyBNYXA8RGVjb2RlSGludFR5cGUsIGFueT4oKTtcclxuICAgIHByaXZhdGUgX3NjYW5FcnJvclNvdXJjZSA9IG5ldyBTdWJqZWN0PEVycm9yPigpO1xyXG4gICAgcHJpdmF0ZSBfc2NhbkZhaWx1cmVTb3VyY2UgPSBuZXcgU3ViamVjdDxFcnJvcj4oKTtcclxuICAgIHByaXZhdGUgX3NjYW5TdWJzY3JpcHRpb246IGFueTtcclxuICAgIHByaXZhdGUgX3NjYW5Db21wbGV0ZVNvdXJjZSA9IG5ldyBTdWJqZWN0PFJlc3VsdD4oKTtcclxuICAgIHByaXZhdGUgX3NjYW5TdWNjZXNzU291cmNlID0gbmV3IFN1YmplY3Q8UmVzdWx0PigpO1xyXG4gICAgcHJpdmF0ZSBfb3B0aW9uczoge1xyXG4gICAgICAgIGRlbGF5QmV0d2VlblNjYW5BdHRlbXB0czogbnVtYmVyO1xyXG4gICAgICAgIGRlbGF5QmV0d2VlblNjYW5TdWNjZXNzOiBudW1iZXI7XHJcbiAgICB9ID0ge1xyXG4gICAgICAgIGRlbGF5QmV0d2VlblNjYW5BdHRlbXB0czogNTAsXHJcbiAgICAgICAgZGVsYXlCZXR3ZWVuU2NhblN1Y2Nlc3M6IDUwMFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdXNlck1lZGlhU2VydmljZTogVXNlck1lZGlhQmFzZVNlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLnNjYW5FcnJvciQgPSB0aGlzLl9zY2FuRXJyb3JTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5zY2FuRmFpbHVyZSQgPSB0aGlzLl9zY2FuRmFpbHVyZVNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB0aGlzLnNjYW5Db21wbGV0ZSQgPSB0aGlzLl9zY2FuQ29tcGxldGVTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5zY2FuU3VjY2VzcyQgPSB0aGlzLl9zY2FuU3VjY2Vzc1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKG1hcCgoYykgPT4gYy5nZXRUZXh0KCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhcnRTY2FuKGRldmljZTogTWVkaWFEZXZpY2VJbmZvLCB2aWRlb0VsOiBIVE1MVmlkZW9FbGVtZW50LCBvcHRpb25zID0gdGhpcy5fb3B0aW9ucyk6IHZvaWQge1xyXG4gICAgICAgIC8vIGluc3RhbnRseSBzdG9wcyB0aGUgc2NhbiBiZWZvcmUgY2hhbmdpbmcgZGV2aWNlc1xyXG4gICAgICAgIHRoaXMuc2NhblN0b3AoKTtcclxuXHJcbiAgICAgICAgLy8gY29ycmVjdGx5IHNldHMgdGhlIG5ldyAob3Igbm9uZSkgZGV2aWNlXHJcbiAgICAgICAgdGhpcy5fZGV2aWNlID0gZGV2aWNlIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl92aWRlb0VsID0gdmlkZW9FbDtcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICBpZiAoIXRoaXMuX2RldmljZSkge1xyXG4gICAgICAgICAgICAvLyBjbGVhbnMgdGhlIHZpZGVvIGJlY2F1c2UgdXNlciByZW1vdmVkIHRoZSBkZXZpY2VcclxuICAgICAgICAgICAgQnJvd3NlckNvZGVSZWFkZXIuY2xlYW5WaWRlb1NvdXJjZSh2aWRlb0VsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3NjYW5TdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgc2NhbiBwcm9jY2VzcyBydW5uaW5nLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9kZXZpY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBkZXZpY2UgZGVmaW5lZCwgY2Fubm90IHN0YXJ0IHNjYW4sIHBsZWFzZSBkZWZpbmUgYSBkZXZpY2UuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiBlbmFibGVkLCBzdGFydHMgc2Nhbm5pbmdcclxuICAgICAgICBpZiAoZGV2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NhbkZyb21EZXZpY2UoZGV2aWNlLmRldmljZUlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0Rm9ybWF0KGlucHV0OiBCYXJjb2RlRm9ybWF0W10pOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0cywgbWFrZSBzdXJlIHRoZSBbZm9ybWF0c10gaW5wdXQgaXMgYSBiaW5kaW5nLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZm9ybWF0cyBtYXkgYmUgc2V0IGZyb20gaHRtbCB0ZW1wbGF0ZSBhcyBCYXJjb2RlRm9ybWF0IG9yIHN0cmluZyBhcnJheVxyXG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBpbnB1dC5tYXAoKGYpID0+IHRoaXMuZ2V0QmFyY29kZUZvcm1hdE9yRmFpbChmKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbnRzID0gdGhpcy5faGludHM7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZXMgdGhlIGhpbnRzXHJcbiAgICAgICAgaGludHMuc2V0KERlY29kZUhpbnRUeXBlLlBPU1NJQkxFX0ZPUk1BVFMsIGZvcm1hdHMpO1xyXG5cclxuICAgICAgICAvLyBoYW5kbGVzIHVwZGF0aW5nIHRoZSBjb2RlUmVhZGVyXHJcbiAgICAgICAgdGhpcy5faGludHMgPSBoaW50cztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzY2FuU3RvcCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fc2NhblN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLl9jb2RlUmVhZGVyPy5nZXRTY2FubmVyQ29udHJvbHMoKS5zdG9wKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYW5TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYW5TdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMudG9yY2hDb21wYXRpYmxlLm5leHQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIEBub3RlIGFwZW5hcyBuZWNlc3NhcmlvIHBvciBlbnF1YW50byBjYXVzYSBkYSBUb3JjaFxyXG4gICAgICAgIHRoaXMuc2NhblN0b3AoKTtcclxuICAgICAgICB0aGlzLl9jb2RlUmVhZGVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2RldmljZSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhcmNvZGVGb3JtYXRPckZhaWwoZm9ybWF0OiBzdHJpbmcgfCBCYXJjb2RlRm9ybWF0KTogQmFyY29kZUZvcm1hdCB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnID8gQmFyY29kZUZvcm1hdFtmb3JtYXQudHJpbSgpLnRvVXBwZXJDYXNlKCldIDogZm9ybWF0O1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBhc3luYyBzY2FuRnJvbURldmljZShkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcy5fdmlkZW9FbDtcclxuXHJcbiAgICAgICAgY29uc3QgY29kZVJlYWRlciA9IHRoaXMuZ2V0Q29kZVJlYWRlcigpO1xyXG5cclxuICAgICAgICBjb25zdCBzY2FuU3RyZWFtID0gYXdhaXQgY29kZVJlYWRlci5zY2FuRnJvbURldmljZU9ic2VydmFibGUoZGV2aWNlSWQsIHZpZGVvRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICghc2NhblN0cmVhbSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZGVmaW5lZCBkZWNvZGluZyBzdHJlYW0sIGFib3J0aW5nLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmV4dCA9ICh4OiBSZXN1bHRBbmRFcnJvcik6IHZvaWQgPT4gdGhpcy5fb25EZWNvZGVSZXN1bHQoeC5yZXN1bHQsIHguZXJyb3IpO1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gKGVycjogYW55KTogdm9pZCA9PiB0aGlzLl9vbkRlY29kZUVycm9yKGVycik7XHJcbiAgICAgICAgY29uc3QgY29tcGxldGUgPSAoKTogdm9pZCA9PiB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2NhblN1YnNjcmlwdGlvbiA9IHNjYW5TdHJlYW0uc3Vic2NyaWJlKG5leHQsIGVycm9yLCBjb21wbGV0ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zY2FuU3Vic2NyaXB0aW9uLmNsb3NlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjb25zdCBjb250cm9scyA9IGNvZGVSZWFkZXIuZ2V0U2Nhbm5lckNvbnRyb2xzKCk7XHJcbiAgICAgICAgLy8gY29uc3QgaGFzVG9yY2hDb250cm9sID0gdHlwZW9mIGNvbnRyb2xzLnN3aXRjaFRvcmNoICE9PSAndW5kZWZpbmVkJztcclxuXHJcbiAgICAgICAgLy8gdGhpcy50b3JjaENvbXBhdGlibGUubmV4dChoYXNUb3JjaENvbnRyb2wpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIGRlY29kZSBlcnJvcnMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX29uRGVjb2RlRXJyb3IoZXJyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zY2FuRXJyb3JTb3VyY2UubmV4dChlcnIpO1xyXG4gICAgICAgIC8vIHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyBkZWNvZGUgcmVzdWx0cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb25EZWNvZGVSZXN1bHQocmVzdWx0OiBSZXN1bHQgfCB1bmRlZmluZWQsIGVycm9yOiBFeGNlcHRpb24gfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYW5TdWNjZXNzU291cmNlLm5leHQocmVzdWx0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zY2FuRmFpbHVyZVNvdXJjZS5uZXh0KGVycm9yIGFzIEVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zY2FuQ29tcGxldGVTb3VyY2UubmV4dChyZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0Q29kZVJlYWRlcigpOiBCcm93c2VyTXVsdGlGb3JtYXRDb250aW51b3VzUmVhZGVyIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2NvZGVSZWFkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29kZVJlYWRlciA9IG5ldyBCcm93c2VyTXVsdGlGb3JtYXRDb250aW51b3VzUmVhZGVyKHRoaXMuX2hpbnRzLCB0aGlzLl9vcHRpb25zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb2RlUmVhZGVyO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|