ngx-scandoc 0.0.1 → 1.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 (71) hide show
  1. package/core/app.worker.d.ts +1 -0
  2. package/core/components/components.module.d.ts +8 -0
  3. package/core/components/webcam/domain/webcam-image.d.ts +35 -0
  4. package/core/components/webcam/domain/webcam-init-error.d.ts +4 -0
  5. package/core/components/webcam/domain/webcam-mirror-properties.d.ts +3 -0
  6. package/core/components/webcam/util/webcam.util.d.ts +8 -0
  7. package/core/components/webcam/webcam/webcam.component.d.ts +202 -0
  8. package/core/components/webcam/webcam.module.d.ts +9 -0
  9. package/core/pipes/pipes.module.d.ts +7 -0
  10. package/core/pipes/safeResourceUrl.pipe.d.ts +10 -0
  11. package/core/shared/material.module.d.ts +28 -0
  12. package/dialogs/components/blank/blank.component.d.ts +17 -0
  13. package/dialogs/components/confirm/confirm.component.d.ts +30 -0
  14. package/dialogs/components/loading/loading.component.d.ts +5 -0
  15. package/dialogs/components/scan-mobile/scan-mobile.component.d.ts +16 -0
  16. package/dialogs/components/scan-profile/scan-profile.component.d.ts +124 -0
  17. package/dialogs/components/scan-selfie/scan-selfie.component.d.ts +83 -0
  18. package/dialogs/dialogs.core.provider.d.ts +18 -0
  19. package/dialogs/dialogs.module.d.ts +21 -0
  20. package/esm2020/core/app.worker.mjs +236 -0
  21. package/esm2020/core/components/components.module.mjs +18 -0
  22. package/esm2020/core/components/webcam/domain/webcam-image.mjs +58 -0
  23. package/esm2020/core/components/webcam/domain/webcam-init-error.mjs +3 -0
  24. package/esm2020/core/components/webcam/domain/webcam-mirror-properties.mjs +3 -0
  25. package/esm2020/core/components/webcam/util/webcam.util.mjs +48 -0
  26. package/esm2020/core/components/webcam/webcam/webcam.component.mjs +861 -0
  27. package/esm2020/core/components/webcam/webcam.module.mjs +22 -0
  28. package/esm2020/core/pipes/pipes.module.mjs +19 -0
  29. package/esm2020/core/pipes/safeResourceUrl.pipe.mjs +20 -0
  30. package/esm2020/core/shared/material.module.mjs +162 -0
  31. package/esm2020/dialogs/components/blank/blank.component.mjs +47 -0
  32. package/esm2020/dialogs/components/confirm/confirm.component.mjs +53 -0
  33. package/esm2020/dialogs/components/loading/loading.component.mjs +12 -0
  34. package/esm2020/dialogs/components/scan-mobile/scan-mobile.component.mjs +43 -0
  35. package/esm2020/dialogs/components/scan-profile/scan-profile.component.mjs +756 -0
  36. package/esm2020/dialogs/components/scan-selfie/scan-selfie.component.mjs +392 -0
  37. package/esm2020/dialogs/dialogs.core.provider.mjs +100 -0
  38. package/esm2020/dialogs/dialogs.module.mjs +89 -0
  39. package/esm2020/forms/form.module.mjs +87 -0
  40. package/esm2020/forms/types/avatar.type.mjs +53 -0
  41. package/esm2020/forms/types/profile.image.type.mjs +54 -0
  42. package/esm2020/forms/types/title.type.mjs +60 -0
  43. package/esm2020/lib/ngx-scandoc.module.mjs +28 -11
  44. package/esm2020/providers/auth.provider.mjs +57 -0
  45. package/esm2020/providers/interceptor.provider.mjs +61 -0
  46. package/esm2020/providers/scan.form.mjs +386 -0
  47. package/esm2020/providers/scan.provider.mjs +490 -0
  48. package/esm2020/providers/translation.provider.mjs +50 -0
  49. package/esm2020/providers/webrtc.provider.mjs +58 -0
  50. package/esm2020/public-api.mjs +22 -4
  51. package/fesm2015/ngx-scandoc.mjs +4178 -32
  52. package/fesm2015/ngx-scandoc.mjs.map +1 -1
  53. package/fesm2020/ngx-scandoc.mjs +4154 -32
  54. package/fesm2020/ngx-scandoc.mjs.map +1 -1
  55. package/forms/form.module.d.ts +18 -0
  56. package/forms/types/avatar.type.d.ts +14 -0
  57. package/forms/types/profile.image.type.d.ts +14 -0
  58. package/forms/types/title.type.d.ts +12 -0
  59. package/lib/ngx-scandoc.module.d.ts +20 -2
  60. package/package.json +6 -2
  61. package/providers/auth.provider.d.ts +21 -0
  62. package/providers/interceptor.provider.d.ts +13 -0
  63. package/providers/scan.form.d.ts +13 -0
  64. package/providers/scan.provider.d.ts +239 -0
  65. package/providers/translation.provider.d.ts +9 -0
  66. package/providers/webrtc.provider.d.ts +11 -0
  67. package/public-api.d.ts +21 -3
  68. package/esm2020/lib/ngx-scandoc.component.mjs +0 -22
  69. package/esm2020/lib/ngx-scandoc.service.mjs +0 -14
  70. package/lib/ngx-scandoc.component.d.ts +0 -8
  71. package/lib/ngx-scandoc.service.d.ts +0 -6
@@ -0,0 +1,392 @@
1
+ import { Component, ViewChild, EventEmitter, Output, HostListener, ChangeDetectionStrategy, Input, } from '@angular/core';
2
+ import { Subject, Observable, of } from 'rxjs';
3
+ import { FormGroup } from '@angular/forms';
4
+ import { switchMap } from 'rxjs/operators';
5
+ import { WebcamUtil } from '../../../core/components/webcam/util/webcam.util';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../../providers/scan.provider";
8
+ import * as i2 from "../../../dialogs/dialogs.core.provider";
9
+ import * as i3 from "@ngx-translate/core";
10
+ import * as i4 from "@angular/forms";
11
+ import * as i5 from "@angular/common";
12
+ import * as i6 from "@angular/material/form-field";
13
+ import * as i7 from "@angular/material/select";
14
+ import * as i8 from "@angular/material/core";
15
+ import * as i9 from "@angular/material/icon";
16
+ import * as i10 from "@angular/material/button";
17
+ import * as i11 from "@angular/material/progress-bar";
18
+ import * as i12 from "../../../core/components/webcam/webcam/webcam.component";
19
+ import * as i13 from "@angular/flex-layout";
20
+ import * as i14 from "@angular/flex-layout/extended";
21
+ export class ScanSelfieComponent {
22
+ constructor(cd, scanProvider, dialogs,
23
+ // private formProvider: ScanFieldsProvider,
24
+ translate) {
25
+ this.cd = cd;
26
+ this.scanProvider = scanProvider;
27
+ this.dialogs = dialogs;
28
+ this.translate = translate;
29
+ this.scanBlastData = [
30
+ {
31
+ title: 'pms.dialogs.components.scanProfile.front',
32
+ description: 'pms.dialogs.components.scanProfile.frontDescription',
33
+ side: 'FRONT',
34
+ },
35
+ {
36
+ title: 'pms.dialogs.components.scanProfile.back',
37
+ description: 'pms.dialogs.components.scanProfile.backDescription',
38
+ disabled: true,
39
+ side: 'BACK',
40
+ },
41
+ ];
42
+ this.type = 'desktop';
43
+ this.actions = new EventEmitter();
44
+ this.mediaDevices = [];
45
+ this.videoOptions = {
46
+ width: 1920,
47
+ height: 1080,
48
+ facingMode: 'environment',
49
+ };
50
+ this.multipleWebcamsAvailable = false;
51
+ // webcam snapshot trigger
52
+ this.documentTypeSelected = false;
53
+ this.preview = null;
54
+ this.allowCameraSwitch = true;
55
+ this.error = false;
56
+ this.cameraReady = false;
57
+ this.scaning = false;
58
+ this.scanDatas = [];
59
+ this.trigger = new Subject();
60
+ // switch to next / previous / specific webcam; true/false: forward/backwards, string: deviceId
61
+ this.nextWebcam = new Subject();
62
+ this.form = new FormGroup({});
63
+ }
64
+ onResize() {
65
+ if (this.wraper) {
66
+ this.width = this.wraper.nativeElement.clientWidth;
67
+ this.height = this.wraper.nativeElement.clientHeight;
68
+ console.log(this.width, this.height);
69
+ setTimeout(() => {
70
+ const video = this.wraper?.nativeElement.querySelector('video');
71
+ if (video) {
72
+ // console.log(video.clientWidth, video.clientHeight);
73
+ this.videoWidth = video.clientWidth;
74
+ this.videoHeight = video.clientHeight;
75
+ }
76
+ }, 100);
77
+ this.cd.detectChanges();
78
+ }
79
+ }
80
+ init() {
81
+ console.log('HAS MULTI');
82
+ // this.result=true;
83
+ // this.result ={};
84
+ this.fields = []; //this.formProvider.document();
85
+ WebcamUtil.getAvailableVideoInputs().subscribe((mediaDevices) => {
86
+ console.log('[DEVICES]', mediaDevices);
87
+ this.mediaDevices = mediaDevices;
88
+ this.multipleWebcamsAvailable = mediaDevices && mediaDevices.length > 1;
89
+ this.singleScan(this.scanBlastData[0]);
90
+ });
91
+ }
92
+ handleImage(webcamImage) {
93
+ console.log('[received webcam image]', webcamImage);
94
+ this.webcamImage = webcamImage;
95
+ this.preview = webcamImage.imageAsDataUrl;
96
+ this.cd.detectChanges();
97
+ }
98
+ handleInitError(error) {
99
+ console.log(error);
100
+ }
101
+ get scanBlastCanUpload() {
102
+ return this.scanBlastData[0].image ? true : false;
103
+ }
104
+ cameraWasSwitched(deviceId) {
105
+ console.log('active device: ' + deviceId);
106
+ this.deviceId = deviceId;
107
+ this.cameraReady = true;
108
+ this.defaultDevice = deviceId;
109
+ this.onResize();
110
+ }
111
+ get nextWebcamObservable() {
112
+ return this.nextWebcam.asObservable();
113
+ }
114
+ ngAfterViewInit() {
115
+ this.cd.detectChanges();
116
+ }
117
+ selectCamera(event) {
118
+ console.log(event);
119
+ this.nextWebcam.next(event.value);
120
+ }
121
+ close() {
122
+ this.dialogRef?.close();
123
+ }
124
+ singleScan(side) {
125
+ this.scanType = side.side;
126
+ this.preview = null;
127
+ this.selectedSide = side;
128
+ this.selectedSide.image = null;
129
+ this.documentTypeSelected = true;
130
+ this.scanBlastData[1].disabled = false;
131
+ this.cd.detectChanges();
132
+ setTimeout(() => {
133
+ this.onResize();
134
+ }, 10);
135
+ }
136
+ getBase64(file) {
137
+ return new Observable((observer) => {
138
+ const reader = new FileReader();
139
+ reader.readAsDataURL(file);
140
+ reader.onload = () => {
141
+ observer.next(reader.result);
142
+ };
143
+ reader.onerror = (error) => {
144
+ observer.error(error);
145
+ };
146
+ });
147
+ }
148
+ handleFileInput(target, event, side) {
149
+ const files = target.files;
150
+ this.selectedSide = side;
151
+ console.log(files);
152
+ const file = files.item(0);
153
+ this.resolutionLimit(file)
154
+ .pipe(switchMap((valid) => {
155
+ return valid ? this.getBase64(file) : of(false);
156
+ }))
157
+ .subscribe((imageAsDataUrl) => {
158
+ // console.log(imageAsDataUrl);
159
+ event.target.value = null;
160
+ if (!imageAsDataUrl) {
161
+ this.dialogs.alert('core.page.error', this.translate.instant('pms.dialogs.components.scanProfile.minResolution'));
162
+ }
163
+ else {
164
+ side.image = {
165
+ imageAsDataUrl,
166
+ };
167
+ if (this.selectedSide.side === 'FRONT') {
168
+ this.scanBlastData[1].disabled = false;
169
+ }
170
+ }
171
+ this.cd.detectChanges();
172
+ });
173
+ }
174
+ rotateBase64Image(base64data) {
175
+ return new Observable((observer) => {
176
+ const canvas = document.createElement('canvas');
177
+ const ctx = canvas.getContext('2d');
178
+ var image = new Image();
179
+ image.src = base64data;
180
+ image.onload = () => {
181
+ console.log(canvas);
182
+ canvas.width = image.height;
183
+ canvas.height = image.width;
184
+ if (ctx) {
185
+ ctx.rotate((90 * Math.PI) / 180);
186
+ ctx.translate(0, -canvas.width);
187
+ ctx.drawImage(image, 0, 0);
188
+ observer.next(canvas.toDataURL());
189
+ }
190
+ else {
191
+ observer.error({ type: 'generic error' });
192
+ }
193
+ };
194
+ image.onerror = (e) => {
195
+ observer.error(e);
196
+ };
197
+ });
198
+ }
199
+ sendMobile() {
200
+ this.dialogs.scanMobile({ id: 1 });
201
+ }
202
+ singleScanRotate(side) {
203
+ console.log(side);
204
+ this.rotateBase64Image(side.image.imageAsDataUrl).subscribe((data) => {
205
+ side.image = { imageAsDataUrl: data };
206
+ this.cd.detectChanges();
207
+ });
208
+ }
209
+ singleScanRemove(side) {
210
+ side.image = null;
211
+ if (side.side === 'FRONT') {
212
+ this.scanBlastData[1].disabled = true;
213
+ }
214
+ this.cd.detectChanges();
215
+ }
216
+ resolutionLimit(file) {
217
+ const minWidth = 1280;
218
+ const minHeight = 720;
219
+ return new Observable((observer) => {
220
+ const img = new Image();
221
+ img.src = window.URL.createObjectURL(file);
222
+ img.onload = () => {
223
+ const width = img.naturalWidth;
224
+ const height = img.naturalHeight;
225
+ let valid = false;
226
+ if (width > height) {
227
+ valid = width >= minWidth && height >= minHeight;
228
+ }
229
+ else {
230
+ valid = width >= minHeight && height >= minWidth;
231
+ }
232
+ observer.next(valid);
233
+ };
234
+ img.onerror = (error) => {
235
+ observer.error(error);
236
+ };
237
+ });
238
+ }
239
+ getImgBase64(num) {
240
+ return this.scanBlastData[num].image.dataUrl.split(',')[1];
241
+ }
242
+ scanBlastFinish() {
243
+ if (this.type === 'mobile') {
244
+ this.actions.emit({ data: this.scanBlastData });
245
+ this.retake();
246
+ return;
247
+ }
248
+ const loading = this.dialogs.loading();
249
+ this.scaning = true;
250
+ const payload = {
251
+ AcceptTermsAndConditions: true,
252
+ DataFields: {
253
+ FrontImageType: 'base64',
254
+ FrontImageCropped: false,
255
+ BackImageType: 'base64',
256
+ BackImageCropped: false,
257
+ FrontImage: this.getImgBase64(0),
258
+ BackImage: this.scanBlastData[1].image ? this.getImgBase64(1) : null,
259
+ },
260
+ Settings: {
261
+ ShouldValidate: true,
262
+ ShouldReturnDocumentImage: true,
263
+ ShouldReturnFaceIfDetected: true,
264
+ SkipImageSizeCheck: true,
265
+ CanStoreImages: this.scanProvider.canStoreImages,
266
+ },
267
+ // CallBackUrl: 'http://demo:5000/report/extracted/',
268
+ };
269
+ if (!this.scanBlastData[1].image) {
270
+ payload.Settings.IgnoreBackImage = true;
271
+ }
272
+ this.scanProvider.blastPost(payload).subscribe((data) => {
273
+ const results = data.Data;
274
+ loading.close();
275
+ this.documentTypeSelected = true;
276
+ this.scaning = false;
277
+ if (results && data.Metadata.length > 0) {
278
+ if (data.ImageData?.Documents) {
279
+ const { Documents } = data.ImageData;
280
+ this.images = Documents.map((image, i) => {
281
+ return { data: 'data:image/jpeg;base64,' + Documents[i] };
282
+ });
283
+ }
284
+ this.result = this.scanProvider.parseBlast(results);
285
+ console.log('RES', this.result);
286
+ this.model = this.result.model;
287
+ if (data.ImageData?.FaceImage) {
288
+ this.model._avatar =
289
+ 'data:image/jpeg;base64,' + data.ImageData?.FaceImage;
290
+ }
291
+ console.log('MODEL', this.model);
292
+ }
293
+ else {
294
+ console.log('ERROR');
295
+ // this.scanSide = 0;
296
+ this.error = true;
297
+ this.preview = true;
298
+ // this.documentTypeSelected = false;
299
+ // this.retry();
300
+ }
301
+ this.cd.detectChanges();
302
+ }, (err) => {
303
+ loading.close();
304
+ // this.scanSide = 0;
305
+ this.error = true;
306
+ this.preview = true;
307
+ this.documentTypeSelected = true;
308
+ this.scaning = false;
309
+ });
310
+ }
311
+ cameraOff(ev) {
312
+ this.cameraReady = false;
313
+ this.cd.detectChanges();
314
+ }
315
+ continue() {
316
+ if (this.scanProvider.enableVerification) {
317
+ const loading = this.dialogs.loading();
318
+ console.log(this.data.avatar);
319
+ this.scanProvider
320
+ .stateless(this.data.avatar.split(',')[1], this.webcamImage?.imageAsDataUrl.split(',')[1])
321
+ .subscribe((resp) => {
322
+ loading.close();
323
+ if (resp.Data?.Verified) {
324
+ this.dialogRef?.close(this.webcamImage);
325
+ }
326
+ else {
327
+ this.dialogs.alert('Verification failed!', "We can't verify that your selfie is same as image on document.");
328
+ }
329
+ console.log(resp);
330
+ }, (err) => {
331
+ loading.close();
332
+ this.dialogRef?.close(this.webcamImage);
333
+ });
334
+ }
335
+ else {
336
+ this.dialogRef?.close(this.webcamImage);
337
+ }
338
+ // this.dialogRef.close(this.webcamImage)
339
+ }
340
+ retry() {
341
+ this.preview = false;
342
+ this.result = false;
343
+ if (this.error) {
344
+ this.documentTypeSelected = false;
345
+ this.scanBlastData.forEach((element) => {
346
+ element.image = null;
347
+ });
348
+ }
349
+ this.error = false;
350
+ }
351
+ triggerSnapshot() {
352
+ this.trigger.next(0);
353
+ }
354
+ scan() {
355
+ console.log('SCAN');
356
+ this.triggerSnapshot();
357
+ this.scanDatas[0] = true;
358
+ }
359
+ retake() {
360
+ this.preview = false;
361
+ this.error = false;
362
+ this.result = false;
363
+ this.scanSide = 0;
364
+ this.scanDatas = [];
365
+ this.scaning = false;
366
+ this.images = [];
367
+ this.documentTypeSelected = false;
368
+ this.scanBlastData.forEach((m) => {
369
+ m.image = null;
370
+ });
371
+ this.cd.detectChanges();
372
+ }
373
+ use() { }
374
+ selfie() { }
375
+ }
376
+ ScanSelfieComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScanSelfieComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ScanProvider }, { token: i2.DialogsCoreProvider }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
377
+ ScanSelfieComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ScanSelfieComponent, selector: "app-scan-selfie", inputs: { type: "type" }, outputs: { actions: "actions" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "wraper", first: true, predicate: ["wraper"], descendants: true }], ngImport: i0, template: "<header class=\"page-header\" fxLayout=\"row\">\n <div class=\"title\" ngClass.lt-sm=\"title-small\">Selfie</div>\n\n <span fxFlex></span>\n <ng-container\n *ngIf=\"\n documentTypeSelected &&\n !result &&\n !error &&\n multipleWebcamsAvailable &&\n !preview\n \"\n >\n <div class=\"separator\"></div>\n <div style=\"padding: 0px 16px\">\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <mat-form-field\n style=\"font-size: 14px; width: 200px; margin-top: 8px\"\n class=\"w-200 mr-16 mt-8\"\n >\n <mat-label> Camera </mat-label>\n <mat-select\n (selectionChange)=\"selectCamera($event)\"\n [(ngModel)]=\"deviceId\"\n >\n <mat-option\n *ngFor=\"let device of mediaDevices\"\n [value]=\"device.deviceId\"\n >\n {{ device.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </ng-container>\n\n <ng-container>\n <div class=\"separator\"></div>\n\n <button mat-button (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button>\n </ng-container>\n <!-- <ng-container *ngIf=\"type === 'desktop'\">\n <div class=\"separator\"></div>\n <button mat-button (click)=\"sendMobile()\">\n <mat-icon>tablet_mac</mat-icon>\n </button>\n\n <div class=\"separator\"></div>\n\n <button mat-button (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button>\n </ng-container> -->\n</header>\n\n<div *ngIf=\"!result\" fxFlex fxLayout=\"column\">\n <div fxFlex #wraper class=\"wraper\" fxLayout=\"row\">\n <div\n style=\"\n position: absolute;\n top: 0px;\n left: 0px;\n right: 0px;\n bottom: 0px;\n z-index: 20;\n background-color: whitesmoke;\n \"\n *ngIf=\"!cameraReady && !preview\"\n >\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n\n <ng-container *ngIf=\"!error\">\n <!-- <div\n class=\"rectangle\"\n [ngStyle]=\"{\n 'width.px': videoHeight * 0.75 * 1.588,\n 'height.px': videoHeight * 0.75\n }\"\n ></div>\n <svg\n *ngIf=\"videoWidth\"\n style=\"position: absolute; left: 0px; top: 0px\"\n width=\"0\"\n height=\"0\"\n >\n <defs>\n <clipPath id=\"myClip\">\n <rect\n stroke-width=\"6\"\n stroke-color=\"red\"\n [attr.x]=\"(videoWidth - videoHeight * 0.75 * 1.588) / 2\"\n [attr.y]=\"(videoHeight * 0.25) / 2\"\n [attr.width]=\"videoHeight * 0.75 * 1.588\"\n [attr.height]=\"videoHeight * 0.75\"\n rx=\"25\"\n />\n </clipPath>\n </defs>\n </svg> -->\n\n <app-webcam\n *ngIf=\"!preview && !scaning\"\n class=\"main\"\n [imageQuality]=\"1\"\n #webcam\n fxFlex\n [trigger]=\"trigger\"\n (imageCapture)=\"handleImage($event)\"\n [allowCameraSwitch]=\"allowCameraSwitch\"\n [videoOptions]=\"videoOptions\"\n [switchCamera]=\"nextWebcamObservable\"\n (cameraSwitched)=\"cameraWasSwitched($event)\"\n (initError)=\"handleInitError($event)\"\n type=\"selfie\"\n [width]=\"width\"\n [height]=\"height\"\n (destroyed)=\"cameraOff($event)\"\n >\n </app-webcam>\n </ng-container>\n <div\n fxLayout=\"row\"\n fxFlex\n class=\"previewData\"\n *ngIf=\"preview\"\n style=\"z-index: 20; position: absolute; width: 100%; height: 100%\"\n >\n <div\n class=\"scanPreview\"\n fxFlex\n fxLayout=\"column\"\n *ngIf=\"!error && !scaning\"\n >\n <div\n fxFlex\n class=\"image\"\n [style.background-image]=\"'url(' + preview + ')'\"\n ></div>\n </div>\n </div>\n </div>\n\n <footer fxLayout=\"row\" class=\"p-8\">\n <button\n [disabled]=\"!cameraReady\"\n class=\"w-100-p\"\n *ngIf=\"!preview\"\n mat-raised-button\n (click)=\"scan()\"\n >\n <ng-container>\n TAKE SELFIE\n </ng-container>\n </button>\n\n <div\n class=\"w-100-p\"\n *ngIf=\"preview\"\n fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n fxFlex\n >\n <button fxFlex class=\"mr-4\" mat-raised-button (click)=\"retry()\">\n RETRY\n </button>\n\n <button\n [disabled]=\"error\"\n fxFlex\n class=\"ml-4\"\n mat-raised-button\n (click)=\"continue()\"\n >\n CONTINUE\n\n </button>\n </div>\n </footer>\n</div>\n", styles: [":host{display:flex;flex-direction:column!important;flex:1;background-color:#f5f5f5}.element{margin-bottom:8px}.element label{font-size:14px}.element div{font-size:18px}.wraper{position:relative;overflow:hidden}h3{color:#459ae5;font-size:16px}.preview{width:100%;border-radius:1%}.documentTypeWraper{width:400px}.documentTypeWraper .label{font-size:14px;margin-bottom:20px}.documentTypeWraper button{box-shadow:none}.overPane{position:absolute;width:100%;height:100%;top:0;left:0}.overPane app-webcam{clip-path:url(#myClip)}.subhead{height:55px;padding-top:8px}.rectangle{z-index:2;position:absolute;top:50%;left:50%;width:85.6mm;height:53.98mm;transform:translate(-50%,-50%);box-sizing:border-box;border:2px dashed #459be5;border-radius:3mm}.mask{z-index:1;position:absolute;width:100%;height:100%;background-position:center center;background-size:380mm;background-repeat:no-repeat}.label{font-size:11px;margin-top:4px}footer button{box-shadow:none!important;height:45px;min-height:45px;border:1px solid rgba(0,0,0,.12);text-transform:uppercase}h4{font-size:16px}.images label{font-size:11px;color:#888;line-height:20px}.images .title{padding:8px 0;font-weight:600}.images img{margin-bottom:16px}.error .title{font-size:22px}.error ul{font-size:18px}.photo{width:120px;height:120px;overflow:hidden}.signature{width:200px}mat-card{box-shadow:none!important}.scanBlastWraper button{text-transform:uppercase}.scanBlastWraper.mobile mat-card{margin:4px!important}.scanBlastWraper.mobile .description{font-size:12px;flex-direction:row!important}.scanBlastWraper.mobile .description .imgWrap{padding:0!important}.scanBlastWraper.mobile .description .btnActions{position:absolute;right:0}.scanBlastWraper.mobile .description button{font-size:11px!important;margin:0!important;position:absolute;right:16px}.scanBlastWraper.mobile .description button.rotateButton{top:58px}.scanBlastWraper.mobile .description button.remButton{top:8px}.scanBlastWraper.mobile .description button mat-icon{margin:0!important}.scanBlastWraper.mobile .description button div.label{display:none}.mobile .scanBlast button{font-size:11px!important}.scanBlast{display:flex;flex-direction:row;flex:1;padding:0 4px}.scanBlast mat-card{padding:0;box-shadow:none;margin:8px 4px;flex:1}.scanBlast mat-card .head{display:flex;flex-direction:row;align-items:center;justify-items:center;border-bottom:1px solid rgba(0,0,0,.12);height:60px;padding:8px}.scanBlast mat-card .head.small{height:30px!important;padding:4px 8px!important}.scanBlast mat-card .head.small .title{font-size:12px!important;margin-left:4px!important}.scanBlast mat-card .head button{max-width:120px;height:40px;box-shadow:none;border:1px solid rgba(0,0,0,.12)}.scanBlast mat-card .head .title{margin-left:16px;color:#459ae5;font-size:16px}.scanBlast mat-card .content{margin:8px;flex:1}.scanBlast mat-card .description{text-align:center;color:#888;font-size:14px}.scanBlast mat-card .actions{background-color:#e9e9e9;display:flex;flex-direction:row}.scanBlast mat-card .actions .mat-button-disabled{background-color:#fff!important}.scanBlast mat-card .actions button{box-shadow:none;width:50%;margin:8px;height:40px;font-size:12px}.scanBlast mat-card .actions button mat-icon{margin-right:8px}.scanBlast mat-card .previewPlaceholder{flex:1;border-radius:6px;display:flex;flex-direction:column}.scanBlast mat-card .previewPlaceholder .description{display:flex;flex:1;flex-direction:column;justify-content:center}.scanBlast mat-card .previewPlaceholder button{box-shadow:none;margin-top:8px;height:40px;font-size:12px}.scanBlast mat-card .previewPlaceholder button mat-icon{margin-right:8px}.scanBlast mat-card .previewPlaceholder .imgWrap{flex-direction:column;flex:1;padding:8px;background-color:#f5f5f5;border-radius:4px}.scanBlast mat-card .previewPlaceholder .imgWrap img{width:100%;border-radius:4px}.scanBlast mat-card .previewPlaceholder .imgWrap .image{background-position:center;background-repeat:no-repeat;background-size:contain}.mr-4{margin-right:4px}.ml-4{margin-left:4px}.p-16{padding:16px}.p-8{padding:8px}.py-16{padding:16px 0}.w-100-p{width:100%}.scanPreview{padding:16px}.scanPreview .image{background-position:center;background-repeat:no-repeat;background-size:contain}.empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.summary label{font-size:12px;color:#888;margin-top:2px}.summary .name{font-size:14px}.selfieContainer{display:flex;flex-direction:column;margin-bottom:20px}.selfieContainer button{box-shadow:none;border:1px solid rgba(0,0,0,.12)}.selfieContainer .selfie{margin:8px auto;width:120px;height:120px;border-radius:60px;border:1px solid rgba(0,0,0,.12)}\n", ".page-header{z-index:2000;height:64px;padding:0;background-color:#fff;border-bottom:1px solid rgba(0,0,0,.12)}.page-header .title{padding-left:24px;line-height:64px;font-size:18px}.page-header .separator{width:1px;background-color:#0000001f;height:100%}.page-header .total{line-height:64px}.page-header .total span{font-weight:700}.page-footer{height:64px}.page-footer button{margin-left:24px;box-shadow:none!important}\n"], dependencies: [{ kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i11.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i12.WebcamComponent, selector: "app-webcam", inputs: ["imageHandler", "id", "type", "width", "height", "videoOptions", "allowCameraSwitch", "mirrorImage", "captureImageData", "imageType", "imageQuality", "trigger", "switchCamera"], outputs: ["imageCapture", "initError", "imageClick", "cameraSwitched", "videoReady", "destroyed"] }, { kind: "directive", type: i13.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i13.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i13.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i14.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
378
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScanSelfieComponent, decorators: [{
379
+ type: Component,
380
+ args: [{ selector: 'app-scan-selfie', changeDetection: ChangeDetectionStrategy.OnPush, template: "<header class=\"page-header\" fxLayout=\"row\">\n <div class=\"title\" ngClass.lt-sm=\"title-small\">Selfie</div>\n\n <span fxFlex></span>\n <ng-container\n *ngIf=\"\n documentTypeSelected &&\n !result &&\n !error &&\n multipleWebcamsAvailable &&\n !preview\n \"\n >\n <div class=\"separator\"></div>\n <div style=\"padding: 0px 16px\">\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <mat-form-field\n style=\"font-size: 14px; width: 200px; margin-top: 8px\"\n class=\"w-200 mr-16 mt-8\"\n >\n <mat-label> Camera </mat-label>\n <mat-select\n (selectionChange)=\"selectCamera($event)\"\n [(ngModel)]=\"deviceId\"\n >\n <mat-option\n *ngFor=\"let device of mediaDevices\"\n [value]=\"device.deviceId\"\n >\n {{ device.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </ng-container>\n\n <ng-container>\n <div class=\"separator\"></div>\n\n <button mat-button (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button>\n </ng-container>\n <!-- <ng-container *ngIf=\"type === 'desktop'\">\n <div class=\"separator\"></div>\n <button mat-button (click)=\"sendMobile()\">\n <mat-icon>tablet_mac</mat-icon>\n </button>\n\n <div class=\"separator\"></div>\n\n <button mat-button (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button>\n </ng-container> -->\n</header>\n\n<div *ngIf=\"!result\" fxFlex fxLayout=\"column\">\n <div fxFlex #wraper class=\"wraper\" fxLayout=\"row\">\n <div\n style=\"\n position: absolute;\n top: 0px;\n left: 0px;\n right: 0px;\n bottom: 0px;\n z-index: 20;\n background-color: whitesmoke;\n \"\n *ngIf=\"!cameraReady && !preview\"\n >\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n\n <ng-container *ngIf=\"!error\">\n <!-- <div\n class=\"rectangle\"\n [ngStyle]=\"{\n 'width.px': videoHeight * 0.75 * 1.588,\n 'height.px': videoHeight * 0.75\n }\"\n ></div>\n <svg\n *ngIf=\"videoWidth\"\n style=\"position: absolute; left: 0px; top: 0px\"\n width=\"0\"\n height=\"0\"\n >\n <defs>\n <clipPath id=\"myClip\">\n <rect\n stroke-width=\"6\"\n stroke-color=\"red\"\n [attr.x]=\"(videoWidth - videoHeight * 0.75 * 1.588) / 2\"\n [attr.y]=\"(videoHeight * 0.25) / 2\"\n [attr.width]=\"videoHeight * 0.75 * 1.588\"\n [attr.height]=\"videoHeight * 0.75\"\n rx=\"25\"\n />\n </clipPath>\n </defs>\n </svg> -->\n\n <app-webcam\n *ngIf=\"!preview && !scaning\"\n class=\"main\"\n [imageQuality]=\"1\"\n #webcam\n fxFlex\n [trigger]=\"trigger\"\n (imageCapture)=\"handleImage($event)\"\n [allowCameraSwitch]=\"allowCameraSwitch\"\n [videoOptions]=\"videoOptions\"\n [switchCamera]=\"nextWebcamObservable\"\n (cameraSwitched)=\"cameraWasSwitched($event)\"\n (initError)=\"handleInitError($event)\"\n type=\"selfie\"\n [width]=\"width\"\n [height]=\"height\"\n (destroyed)=\"cameraOff($event)\"\n >\n </app-webcam>\n </ng-container>\n <div\n fxLayout=\"row\"\n fxFlex\n class=\"previewData\"\n *ngIf=\"preview\"\n style=\"z-index: 20; position: absolute; width: 100%; height: 100%\"\n >\n <div\n class=\"scanPreview\"\n fxFlex\n fxLayout=\"column\"\n *ngIf=\"!error && !scaning\"\n >\n <div\n fxFlex\n class=\"image\"\n [style.background-image]=\"'url(' + preview + ')'\"\n ></div>\n </div>\n </div>\n </div>\n\n <footer fxLayout=\"row\" class=\"p-8\">\n <button\n [disabled]=\"!cameraReady\"\n class=\"w-100-p\"\n *ngIf=\"!preview\"\n mat-raised-button\n (click)=\"scan()\"\n >\n <ng-container>\n TAKE SELFIE\n </ng-container>\n </button>\n\n <div\n class=\"w-100-p\"\n *ngIf=\"preview\"\n fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n fxFlex\n >\n <button fxFlex class=\"mr-4\" mat-raised-button (click)=\"retry()\">\n RETRY\n </button>\n\n <button\n [disabled]=\"error\"\n fxFlex\n class=\"ml-4\"\n mat-raised-button\n (click)=\"continue()\"\n >\n CONTINUE\n\n </button>\n </div>\n </footer>\n</div>\n", styles: [":host{display:flex;flex-direction:column!important;flex:1;background-color:#f5f5f5}.element{margin-bottom:8px}.element label{font-size:14px}.element div{font-size:18px}.wraper{position:relative;overflow:hidden}h3{color:#459ae5;font-size:16px}.preview{width:100%;border-radius:1%}.documentTypeWraper{width:400px}.documentTypeWraper .label{font-size:14px;margin-bottom:20px}.documentTypeWraper button{box-shadow:none}.overPane{position:absolute;width:100%;height:100%;top:0;left:0}.overPane app-webcam{clip-path:url(#myClip)}.subhead{height:55px;padding-top:8px}.rectangle{z-index:2;position:absolute;top:50%;left:50%;width:85.6mm;height:53.98mm;transform:translate(-50%,-50%);box-sizing:border-box;border:2px dashed #459be5;border-radius:3mm}.mask{z-index:1;position:absolute;width:100%;height:100%;background-position:center center;background-size:380mm;background-repeat:no-repeat}.label{font-size:11px;margin-top:4px}footer button{box-shadow:none!important;height:45px;min-height:45px;border:1px solid rgba(0,0,0,.12);text-transform:uppercase}h4{font-size:16px}.images label{font-size:11px;color:#888;line-height:20px}.images .title{padding:8px 0;font-weight:600}.images img{margin-bottom:16px}.error .title{font-size:22px}.error ul{font-size:18px}.photo{width:120px;height:120px;overflow:hidden}.signature{width:200px}mat-card{box-shadow:none!important}.scanBlastWraper button{text-transform:uppercase}.scanBlastWraper.mobile mat-card{margin:4px!important}.scanBlastWraper.mobile .description{font-size:12px;flex-direction:row!important}.scanBlastWraper.mobile .description .imgWrap{padding:0!important}.scanBlastWraper.mobile .description .btnActions{position:absolute;right:0}.scanBlastWraper.mobile .description button{font-size:11px!important;margin:0!important;position:absolute;right:16px}.scanBlastWraper.mobile .description button.rotateButton{top:58px}.scanBlastWraper.mobile .description button.remButton{top:8px}.scanBlastWraper.mobile .description button mat-icon{margin:0!important}.scanBlastWraper.mobile .description button div.label{display:none}.mobile .scanBlast button{font-size:11px!important}.scanBlast{display:flex;flex-direction:row;flex:1;padding:0 4px}.scanBlast mat-card{padding:0;box-shadow:none;margin:8px 4px;flex:1}.scanBlast mat-card .head{display:flex;flex-direction:row;align-items:center;justify-items:center;border-bottom:1px solid rgba(0,0,0,.12);height:60px;padding:8px}.scanBlast mat-card .head.small{height:30px!important;padding:4px 8px!important}.scanBlast mat-card .head.small .title{font-size:12px!important;margin-left:4px!important}.scanBlast mat-card .head button{max-width:120px;height:40px;box-shadow:none;border:1px solid rgba(0,0,0,.12)}.scanBlast mat-card .head .title{margin-left:16px;color:#459ae5;font-size:16px}.scanBlast mat-card .content{margin:8px;flex:1}.scanBlast mat-card .description{text-align:center;color:#888;font-size:14px}.scanBlast mat-card .actions{background-color:#e9e9e9;display:flex;flex-direction:row}.scanBlast mat-card .actions .mat-button-disabled{background-color:#fff!important}.scanBlast mat-card .actions button{box-shadow:none;width:50%;margin:8px;height:40px;font-size:12px}.scanBlast mat-card .actions button mat-icon{margin-right:8px}.scanBlast mat-card .previewPlaceholder{flex:1;border-radius:6px;display:flex;flex-direction:column}.scanBlast mat-card .previewPlaceholder .description{display:flex;flex:1;flex-direction:column;justify-content:center}.scanBlast mat-card .previewPlaceholder button{box-shadow:none;margin-top:8px;height:40px;font-size:12px}.scanBlast mat-card .previewPlaceholder button mat-icon{margin-right:8px}.scanBlast mat-card .previewPlaceholder .imgWrap{flex-direction:column;flex:1;padding:8px;background-color:#f5f5f5;border-radius:4px}.scanBlast mat-card .previewPlaceholder .imgWrap img{width:100%;border-radius:4px}.scanBlast mat-card .previewPlaceholder .imgWrap .image{background-position:center;background-repeat:no-repeat;background-size:contain}.mr-4{margin-right:4px}.ml-4{margin-left:4px}.p-16{padding:16px}.p-8{padding:8px}.py-16{padding:16px 0}.w-100-p{width:100%}.scanPreview{padding:16px}.scanPreview .image{background-position:center;background-repeat:no-repeat;background-size:contain}.empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.summary label{font-size:12px;color:#888;margin-top:2px}.summary .name{font-size:14px}.selfieContainer{display:flex;flex-direction:column;margin-bottom:20px}.selfieContainer button{box-shadow:none;border:1px solid rgba(0,0,0,.12)}.selfieContainer .selfie{margin:8px auto;width:120px;height:120px;border-radius:60px;border:1px solid rgba(0,0,0,.12)}\n", ".page-header{z-index:2000;height:64px;padding:0;background-color:#fff;border-bottom:1px solid rgba(0,0,0,.12)}.page-header .title{padding-left:24px;line-height:64px;font-size:18px}.page-header .separator{width:1px;background-color:#0000001f;height:100%}.page-header .total{line-height:64px}.page-header .total span{font-weight:700}.page-footer{height:64px}.page-footer button{margin-left:24px;box-shadow:none!important}\n"] }]
381
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.ScanProvider }, { type: i2.DialogsCoreProvider }, { type: i3.TranslateService }]; }, propDecorators: { type: [{
382
+ type: Input
383
+ }], actions: [{
384
+ type: Output
385
+ }], wraper: [{
386
+ type: ViewChild,
387
+ args: ['wraper']
388
+ }], onResize: [{
389
+ type: HostListener,
390
+ args: ['window:resize', ['$event']]
391
+ }] } });
392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi1zZWxmaWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2RpYWxvZ3MvY29tcG9uZW50cy9zY2FuLXNlbGZpZS9zY2FuLXNlbGZpZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvZGlhbG9ncy9jb21wb25lbnRzL3NjYW4tc2VsZmllL3NjYW4tc2VsZmllLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sWUFBWSxFQUlaLHVCQUF1QixFQUN2QixLQUFLLEdBQ04sTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFrQixNQUFNLE1BQU0sQ0FBQztBQUUvRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFNBQVMsRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQW9COUUsTUFBTSxPQUFPLG1CQUFtQjtJQXlFOUIsWUFDUyxFQUFxQixFQUNyQixZQUEwQixFQUN6QixPQUE0QjtJQUNwQyw4Q0FBOEM7SUFDdEMsU0FBMkI7UUFKNUIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFDckIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDekIsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7UUFFNUIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUE3RXJDLGtCQUFhLEdBQVE7WUFDbkI7Z0JBQ0UsS0FBSyxFQUFFLDBDQUEwQztnQkFDakQsV0FBVyxFQUFFLHFEQUFxRDtnQkFDbEUsSUFBSSxFQUFFLE9BQU87YUFDZDtZQUNEO2dCQUNFLEtBQUssRUFBRSx5Q0FBeUM7Z0JBQ2hELFdBQVcsRUFBRSxvREFBb0Q7Z0JBQ2pFLFFBQVEsRUFBRSxJQUFJO2dCQUNkLElBQUksRUFBRSxNQUFNO2FBQ2I7U0FDRixDQUFDO1FBQ08sU0FBSSxHQUFHLFNBQVMsQ0FBQztRQUNoQixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2QyxpQkFBWSxHQUFRLEVBQUUsQ0FBQztRQUVoQixpQkFBWSxHQUEwQjtZQUMzQyxLQUFLLEVBQUUsSUFBSTtZQUNYLE1BQU0sRUFBRSxJQUFJO1lBQ1osVUFBVSxFQUFFLGFBQWE7U0FDMUIsQ0FBQztRQUdGLDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUVqQywwQkFBMEI7UUFDMUIseUJBQW9CLEdBQUcsS0FBSyxDQUFDO1FBSTdCLFlBQU8sR0FBUSxJQUFJLENBQUM7UUFNcEIsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWhCLGNBQVMsR0FBUSxFQUFFLENBQUM7UUFJYixZQUFPLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7UUFDeEQsK0ZBQStGO1FBQ3hGLGVBQVUsR0FBOEIsSUFBSSxPQUFPLEVBRXZELENBQUM7UUFDSixTQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUEwQnRCLENBQUM7SUF0QkosUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO1lBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO1lBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksS0FBSyxFQUFFO29CQUNULHdEQUF3RDtvQkFDeEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO29CQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7aUJBQ3ZDO1lBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFRRCxJQUFJO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QixvQkFBb0I7UUFDcEIsbUJBQW1CO1FBRW5CLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsK0JBQStCO1FBRWpELFVBQVUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLFNBQVMsQ0FDNUMsQ0FBQyxZQUErQixFQUFFLEVBQUU7WUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7WUFDakMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUV4RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFDTSxXQUFXLENBQUMsV0FBd0I7UUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUM7UUFDMUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ00sZUFBZSxDQUFDLEtBQXNCO1FBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3BELENBQUM7SUFDTSxpQkFBaUIsQ0FBQyxRQUFnQjtRQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBVyxvQkFBb0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVU7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxVQUFVLENBQUMsSUFBUztRQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBQ0QsU0FBUyxDQUFDLElBQVM7UUFDakIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDbkIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDO1lBQ0YsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN6QixRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUFXLEVBQUUsS0FBVSxFQUFFLElBQVM7UUFDaEQsTUFBTSxLQUFLLEdBQWEsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7YUFDdkIsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3ZCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUM1QiwrQkFBK0I7WUFDL0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUNoQixpQkFBaUIsRUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQ3BCLGtEQUFrRCxDQUNuRCxDQUNGLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsS0FBSyxHQUFHO29CQUNYLGNBQWM7aUJBQ2YsQ0FBQztnQkFDRixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtvQkFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2lCQUN4QzthQUNGO1lBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxVQUFlO1FBQy9CLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNqQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQztZQUN2QixLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEIsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUM1QixNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQzVCLElBQUksR0FBRyxFQUFFO29CQUNQLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUNqQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2lCQUNuQztxQkFBTTtvQkFDTCxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7aUJBQzNDO1lBQ0gsQ0FBQyxDQUFDO1lBQ0YsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNwQixRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxJQUFTO1FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbkUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVM7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtZQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDdkM7UUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBUztRQUN2QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdEIsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7Z0JBQ2hCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUM7Z0JBQy9CLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUM7Z0JBRWpDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDbEIsSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFO29CQUNsQixLQUFLLEdBQUcsS0FBSyxJQUFJLFFBQVEsSUFBSSxNQUFNLElBQUksU0FBUyxDQUFDO2lCQUNsRDtxQkFBTTtvQkFDTCxLQUFLLEdBQUcsS0FBSyxJQUFJLFNBQVMsSUFBSSxNQUFNLElBQUksUUFBUSxDQUFDO2lCQUNsRDtnQkFFRCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQztZQUNGLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDdEIsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDTyxZQUFZLENBQUMsR0FBUTtRQUMzQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE9BQU87U0FDUjtRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsTUFBTSxPQUFPLEdBQVE7WUFDbkIsd0JBQXdCLEVBQUUsSUFBSTtZQUM5QixVQUFVLEVBQUU7Z0JBQ1YsY0FBYyxFQUFFLFFBQVE7Z0JBQ3hCLGlCQUFpQixFQUFFLEtBQUs7Z0JBQ3hCLGFBQWEsRUFBRSxRQUFRO2dCQUN2QixnQkFBZ0IsRUFBRSxLQUFLO2dCQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTthQUNyRTtZQUNELFFBQVEsRUFBRTtnQkFDUixjQUFjLEVBQUUsSUFBSTtnQkFDcEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsSUFBSTtnQkFDaEMsa0JBQWtCLEVBQUUsSUFBSTtnQkFDeEIsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYzthQUNqRDtZQUNELHFEQUFxRDtTQUN0RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO1lBQ2hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztTQUN6QztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FDNUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUNaLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDMUIsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN2QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFO29CQUM3QixNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLENBQVMsRUFBRSxFQUFFO3dCQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUM1RCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRWhDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQy9CLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUU7b0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTzt3QkFDaEIseUJBQXlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7aUJBQ3pEO2dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsQztpQkFBTTtnQkFDTCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyQixxQkFBcUI7Z0JBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFFcEIscUNBQXFDO2dCQUVyQyxnQkFBZ0I7YUFDakI7WUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFCLENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLHFCQUFxQjtZQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELFNBQVMsQ0FBQyxFQUFPO1FBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRTtZQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU5QixJQUFJLENBQUMsWUFBWTtpQkFDZCxTQUFTLENBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUM5QixJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQy9DO2lCQUNBLFNBQVMsQ0FDUixDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNaLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtvQkFDdkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUN6QztxQkFBTTtvQkFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FDaEIsc0JBQXNCLEVBQ3RCLGdFQUFnRSxDQUNqRSxDQUFDO2lCQUNIO2dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsQ0FBQyxFQUNELENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ04sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUMsQ0FBQyxDQUNGLENBQUM7U0FDTDthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QseUNBQXlDO0lBQzNDLENBQUM7SUFDRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO2dCQUMxQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUNNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQUk7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBQ00sTUFBTTtRQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUNwQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNELEdBQUcsS0FBSSxDQUFDO0lBQ1IsTUFBTSxLQUFJLENBQUM7O2dIQWxhQSxtQkFBbUI7b0dBQW5CLG1CQUFtQixrUkN0Q2hDLHVvSkF1TEE7MkZEakphLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTTtvTUFnQnRDLElBQUk7c0JBQVosS0FBSztnQkFDSSxPQUFPO3NCQUFoQixNQUFNO2dCQXVDYyxNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVE7Z0JBR25CLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIFZpZXdDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPdXRwdXQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgRWxlbWVudFJlZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBJbnB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIGZvcmtKb2luLCBmcm9tIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgc3dpdGNoTWFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBXZWJjYW1VdGlsIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9jb21wb25lbnRzL3dlYmNhbS91dGlsL3dlYmNhbS51dGlsJztcbmltcG9ydCB7IFdlYmNhbUltYWdlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9jb21wb25lbnRzL3dlYmNhbS9kb21haW4vd2ViY2FtLWltYWdlJztcbmltcG9ydCB7IFdlYmNhbUluaXRFcnJvciB9IGZyb20gJy4uLy4uLy4uL2NvcmUvY29tcG9uZW50cy93ZWJjYW0vZG9tYWluL3dlYmNhbS1pbml0LWVycm9yJztcblxuaW1wb3J0IHsgRGlhbG9nc0NvcmVQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL2RpYWxvZ3MvZGlhbG9ncy5jb3JlLnByb3ZpZGVyJztcbi8vaW1wb3J0IHsgU2NhbkZpZWxkc1Byb3ZpZGVyIH0gZnJvbSAnYXBwL3Byb3ZpZGVycy9zY2FuLmZvcm0nO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU2NhblByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vcHJvdmlkZXJzL3NjYW4ucHJvdmlkZXInO1xuLy8gaW1wb3J0IHsgU2VydmVyUHJvdmlkZXIgfSBmcm9tICcvZGF0YS9wcm92aWRlcnMvc2VydmVyLnByb3ZpZGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBJV2luZG93IGV4dGVuZHMgV2luZG93IHtcbiAgVGV4dERldGVjdG9yOiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zY2FuLXNlbGZpZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zY2FuLXNlbGZpZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NjYW4tc2VsZmllLmNvbXBvbmVudC5zY3NzJywgJy4uLy4uL3Njc3MvZGlhbG9nLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNjYW5TZWxmaWVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgc2NhbkJsYXN0RGF0YTogYW55ID0gW1xuICAgIHtcbiAgICAgIHRpdGxlOiAncG1zLmRpYWxvZ3MuY29tcG9uZW50cy5zY2FuUHJvZmlsZS5mcm9udCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ3Btcy5kaWFsb2dzLmNvbXBvbmVudHMuc2NhblByb2ZpbGUuZnJvbnREZXNjcmlwdGlvbicsXG4gICAgICBzaWRlOiAnRlJPTlQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdGl0bGU6ICdwbXMuZGlhbG9ncy5jb21wb25lbnRzLnNjYW5Qcm9maWxlLmJhY2snLFxuICAgICAgZGVzY3JpcHRpb246ICdwbXMuZGlhbG9ncy5jb21wb25lbnRzLnNjYW5Qcm9maWxlLmJhY2tEZXNjcmlwdGlvbicsXG4gICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgIHNpZGU6ICdCQUNLJyxcbiAgICB9LFxuICBdO1xuICBASW5wdXQoKSB0eXBlID0gJ2Rlc2t0b3AnO1xuICBAT3V0cHV0KCkgYWN0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgbWVkaWFEZXZpY2VzOiBhbnkgPSBbXTtcbiAgcHVibGljIGRldmljZUlkPzogc3RyaW5nO1xuICBwdWJsaWMgdmlkZW9PcHRpb25zOiBNZWRpYVRyYWNrQ29uc3RyYWludHMgPSB7XG4gICAgd2lkdGg6IDE5MjAsXG4gICAgaGVpZ2h0OiAxMDgwLFxuICAgIGZhY2luZ01vZGU6ICdlbnZpcm9ubWVudCcsXG4gIH07XG4gIGRpYWxvZ1JlZj86IE1hdERpYWxvZ1JlZjxhbnk+O1xuICBkYXRhOiBhbnk7XG4gIG11bHRpcGxlV2ViY2Ftc0F2YWlsYWJsZSA9IGZhbHNlO1xuICBmaWVsZHM6IGFueTtcbiAgLy8gd2ViY2FtIHNuYXBzaG90IHRyaWdnZXJcbiAgZG9jdW1lbnRUeXBlU2VsZWN0ZWQgPSBmYWxzZTtcblxuICBzZWxlY3RlZFNpZGU6IGFueTtcbiAgaW1hZ2VzOiBhbnk7XG4gIHByZXZpZXc6IGFueSA9IG51bGw7XG4gIHNjYW5UeXBlOiBhbnk7XG4gIHdpZHRoOiBhbnk7XG4gIGhlaWdodDogYW55O1xuICB2aWRlb1dpZHRoOiBhbnk7XG4gIHZpZGVvSGVpZ2h0OiBhbnk7XG4gIGFsbG93Q2FtZXJhU3dpdGNoID0gdHJ1ZTtcbiAgZXJyb3IgPSBmYWxzZTtcbiAgY2FtZXJhUmVhZHkgPSBmYWxzZTtcbiAgcmVzdWx0OiBhbnk7XG4gIHNjYW5pbmcgPSBmYWxzZTtcbiAgZGVmYXVsdERldmljZTogYW55O1xuICBzY2FuRGF0YXM6IGFueSA9IFtdO1xuICBzY2FuU2lkZTogYW55O1xuICB3ZWJjYW1JbWFnZT86IFdlYmNhbUltYWdlO1xuICBtb2RlbDogYW55O1xuICBwdWJsaWMgdHJpZ2dlcjogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICAvLyBzd2l0Y2ggdG8gbmV4dCAvIHByZXZpb3VzIC8gc3BlY2lmaWMgd2ViY2FtOyB0cnVlL2ZhbHNlOiBmb3J3YXJkL2JhY2t3YXJkcywgc3RyaW5nOiBkZXZpY2VJZFxuICBwdWJsaWMgbmV4dFdlYmNhbTogU3ViamVjdDxib29sZWFuIHwgc3RyaW5nPiA9IG5ldyBTdWJqZWN0PFxuICAgIGJvb2xlYW4gfCBzdHJpbmdcbiAgPigpO1xuICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gIEBWaWV3Q2hpbGQoJ3dyYXBlcicpIHdyYXBlcj86IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIG9uUmVzaXplKCkge1xuICAgIGlmICh0aGlzLndyYXBlcikge1xuICAgICAgdGhpcy53aWR0aCA9IHRoaXMud3JhcGVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICB0aGlzLmhlaWdodCA9IHRoaXMud3JhcGVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc29sZS5sb2codGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy53cmFwZXI/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTtcbiAgICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh2aWRlby5jbGllbnRXaWR0aCwgdmlkZW8uY2xpZW50SGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLnZpZGVvV2lkdGggPSB2aWRlby5jbGllbnRXaWR0aDtcbiAgICAgICAgICB0aGlzLnZpZGVvSGVpZ2h0ID0gdmlkZW8uY2xpZW50SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIHNjYW5Qcm92aWRlcjogU2NhblByb3ZpZGVyLFxuICAgIHByaXZhdGUgZGlhbG9nczogRGlhbG9nc0NvcmVQcm92aWRlcixcbiAgICAvLyAgIHByaXZhdGUgZm9ybVByb3ZpZGVyOiBTY2FuRmllbGRzUHJvdmlkZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7fVxuICBpbml0KCkge1xuICAgIGNvbnNvbGUubG9nKCdIQVMgTVVMVEknKTtcbiAgICAvLyB0aGlzLnJlc3VsdD10cnVlO1xuICAgIC8vIHRoaXMucmVzdWx0ID17fTtcblxuICAgIHRoaXMuZmllbGRzID0gW107IC8vdGhpcy5mb3JtUHJvdmlkZXIuZG9jdW1lbnQoKTtcblxuICAgIFdlYmNhbVV0aWwuZ2V0QXZhaWxhYmxlVmlkZW9JbnB1dHMoKS5zdWJzY3JpYmUoXG4gICAgICAobWVkaWFEZXZpY2VzOiBNZWRpYURldmljZUluZm9bXSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnW0RFVklDRVNdJywgbWVkaWFEZXZpY2VzKTtcbiAgICAgICAgdGhpcy5tZWRpYURldmljZXMgPSBtZWRpYURldmljZXM7XG4gICAgICAgIHRoaXMubXVsdGlwbGVXZWJjYW1zQXZhaWxhYmxlID0gbWVkaWFEZXZpY2VzICYmIG1lZGlhRGV2aWNlcy5sZW5ndGggPiAxO1xuXG4gICAgICAgIHRoaXMuc2luZ2xlU2Nhbih0aGlzLnNjYW5CbGFzdERhdGFbMF0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIGhhbmRsZUltYWdlKHdlYmNhbUltYWdlOiBXZWJjYW1JbWFnZSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbcmVjZWl2ZWQgd2ViY2FtIGltYWdlXScsIHdlYmNhbUltYWdlKTtcblxuICAgIHRoaXMud2ViY2FtSW1hZ2UgPSB3ZWJjYW1JbWFnZTtcbiAgICB0aGlzLnByZXZpZXcgPSB3ZWJjYW1JbWFnZS5pbWFnZUFzRGF0YVVybDtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICBwdWJsaWMgaGFuZGxlSW5pdEVycm9yKGVycm9yOiBXZWJjYW1Jbml0RXJyb3IpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gIH1cblxuICBnZXQgc2NhbkJsYXN0Q2FuVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLnNjYW5CbGFzdERhdGFbMF0uaW1hZ2UgPyB0cnVlIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIGNhbWVyYVdhc1N3aXRjaGVkKGRldmljZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnYWN0aXZlIGRldmljZTogJyArIGRldmljZUlkKTtcbiAgICB0aGlzLmRldmljZUlkID0gZGV2aWNlSWQ7XG4gICAgdGhpcy5jYW1lcmFSZWFkeSA9IHRydWU7XG4gICAgdGhpcy5kZWZhdWx0RGV2aWNlID0gZGV2aWNlSWQ7XG4gICAgdGhpcy5vblJlc2l6ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXh0V2ViY2FtT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5uZXh0V2ViY2FtLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHNlbGVjdENhbWVyYShldmVudDogYW55KSB7XG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xuICAgIHRoaXMubmV4dFdlYmNhbS5uZXh0KGV2ZW50LnZhbHVlKTtcbiAgfVxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcbiAgfVxuICBzaW5nbGVTY2FuKHNpZGU6IGFueSkge1xuICAgIHRoaXMuc2NhblR5cGUgPSBzaWRlLnNpZGU7XG4gICAgdGhpcy5wcmV2aWV3ID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkU2lkZSA9IHNpZGU7XG5cbiAgICB0aGlzLnNlbGVjdGVkU2lkZS5pbWFnZSA9IG51bGw7XG4gICAgdGhpcy5kb2N1bWVudFR5cGVTZWxlY3RlZCA9IHRydWU7XG4gICAgdGhpcy5zY2FuQmxhc3REYXRhWzFdLmRpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgfSwgMTApO1xuICB9XG4gIGdldEJhc2U2NChmaWxlOiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBvYnNlcnZlci5uZXh0KHJlYWRlci5yZXN1bHQpO1xuICAgICAgfTtcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVGaWxlSW5wdXQodGFyZ2V0OiBhbnksIGV2ZW50OiBhbnksIHNpZGU6IGFueSkge1xuICAgIGNvbnN0IGZpbGVzOiBGaWxlTGlzdCA9IHRhcmdldC5maWxlcztcbiAgICB0aGlzLnNlbGVjdGVkU2lkZSA9IHNpZGU7XG4gICAgY29uc29sZS5sb2coZmlsZXMpO1xuICAgIGNvbnN0IGZpbGUgPSBmaWxlcy5pdGVtKDApO1xuXG4gICAgdGhpcy5yZXNvbHV0aW9uTGltaXQoZmlsZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHZhbGlkOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gdmFsaWQgPyB0aGlzLmdldEJhc2U2NChmaWxlKSA6IG9mKGZhbHNlKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGltYWdlQXNEYXRhVXJsKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGltYWdlQXNEYXRhVXJsKTtcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbDtcbiAgICAgICAgaWYgKCFpbWFnZUFzRGF0YVVybCkge1xuICAgICAgICAgIHRoaXMuZGlhbG9ncy5hbGVydChcbiAgICAgICAgICAgICdjb3JlLnBhZ2UuZXJyb3InLFxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgJ3Btcy5kaWFsb2dzLmNvbXBvbmVudHMuc2NhblByb2ZpbGUubWluUmVzb2x1dGlvbidcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNpZGUuaW1hZ2UgPSB7XG4gICAgICAgICAgICBpbWFnZUFzRGF0YVVybCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU2lkZS5zaWRlID09PSAnRlJPTlQnKSB7XG4gICAgICAgICAgICB0aGlzLnNjYW5CbGFzdERhdGFbMV0uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgfVxuICByb3RhdGVCYXNlNjRJbWFnZShiYXNlNjRkYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICBpbWFnZS5zcmMgPSBiYXNlNjRkYXRhO1xuICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhjYW52YXMpO1xuICAgICAgICBjYW52YXMud2lkdGggPSBpbWFnZS5oZWlnaHQ7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWFnZS53aWR0aDtcbiAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgIGN0eC5yb3RhdGUoKDkwICogTWF0aC5QSSkgLyAxODApO1xuICAgICAgICAgIGN0eC50cmFuc2xhdGUoMCwgLWNhbnZhcy53aWR0aCk7XG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChjYW52YXMudG9EYXRhVVJMKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKHsgdHlwZTogJ2dlbmVyaWMgZXJyb3InIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaW1hZ2Uub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbmRNb2JpbGUoKSB7XG4gICAgdGhpcy5kaWFsb2dzLnNjYW5Nb2JpbGUoeyBpZDogMSB9KTtcbiAgfVxuICBzaW5nbGVTY2FuUm90YXRlKHNpZGU6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKHNpZGUpO1xuICAgIHRoaXMucm90YXRlQmFzZTY0SW1hZ2Uoc2lkZS5pbWFnZS5pbWFnZUFzRGF0YVVybCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBzaWRlLmltYWdlID0geyBpbWFnZUFzRGF0YVVybDogZGF0YSB9O1xuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBzaW5nbGVTY2FuUmVtb3ZlKHNpZGU6IGFueSkge1xuICAgIHNpZGUuaW1hZ2UgPSBudWxsO1xuICAgIGlmIChzaWRlLnNpZGUgPT09ICdGUk9OVCcpIHtcbiAgICAgIHRoaXMuc2NhbkJsYXN0RGF0YVsxXS5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICByZXNvbHV0aW9uTGltaXQoZmlsZTogYW55KSB7XG4gICAgY29uc3QgbWluV2lkdGggPSAxMjgwO1xuICAgIGNvbnN0IG1pbkhlaWdodCA9IDcyMDtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltZy5zcmMgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gaW1nLm5hdHVyYWxXaWR0aDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG5cbiAgICAgICAgbGV0IHZhbGlkID0gZmFsc2U7XG4gICAgICAgIGlmICh3aWR0aCA+IGhlaWdodCkge1xuICAgICAgICAgIHZhbGlkID0gd2lkdGggPj0gbWluV2lkdGggJiYgaGVpZ2h0ID49IG1pbkhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZCA9IHdpZHRoID49IG1pbkhlaWdodCAmJiBoZWlnaHQgPj0gbWluV2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KHZhbGlkKTtcbiAgICAgIH07XG4gICAgICBpbWcub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgZ2V0SW1nQmFzZTY0KG51bTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuc2NhbkJsYXN0RGF0YVtudW1dLmltYWdlLmRhdGFVcmwuc3BsaXQoJywnKVsxXTtcbiAgfVxuICBzY2FuQmxhc3RGaW5pc2goKSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ21vYmlsZScpIHtcbiAgICAgIHRoaXMuYWN0aW9ucy5lbWl0KHsgZGF0YTogdGhpcy5zY2FuQmxhc3REYXRhIH0pO1xuICAgICAgdGhpcy5yZXRha2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkaW5nID0gdGhpcy5kaWFsb2dzLmxvYWRpbmcoKTtcbiAgICB0aGlzLnNjYW5pbmcgPSB0cnVlO1xuXG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgQWNjZXB0VGVybXNBbmRDb25kaXRpb25zOiB0cnVlLFxuICAgICAgRGF0YUZpZWxkczoge1xuICAgICAgICBGcm9udEltYWdlVHlwZTogJ2Jhc2U2NCcsXG4gICAgICAgIEZyb250SW1hZ2VDcm9wcGVkOiBmYWxzZSxcbiAgICAgICAgQmFja0ltYWdlVHlwZTogJ2Jhc2U2NCcsXG4gICAgICAgIEJhY2tJbWFnZUNyb3BwZWQ6IGZhbHNlLFxuICAgICAgICBGcm9udEltYWdlOiB0aGlzLmdldEltZ0Jhc2U2NCgwKSxcbiAgICAgICAgQmFja0ltYWdlOiB0aGlzLnNjYW5CbGFzdERhdGFbMV0uaW1hZ2UgPyB0aGlzLmdldEltZ0Jhc2U2NCgxKSA6IG51bGwsXG4gICAgICB9LFxuICAgICAgU2V0dGluZ3M6IHtcbiAgICAgICAgU2hvdWxkVmFsaWRhdGU6IHRydWUsXG4gICAgICAgIFNob3VsZFJldHVybkRvY3VtZW50SW1hZ2U6IHRydWUsXG4gICAgICAgIFNob3VsZFJldHVybkZhY2VJZkRldGVjdGVkOiB0cnVlLFxuICAgICAgICBTa2lwSW1hZ2VTaXplQ2hlY2s6IHRydWUsXG4gICAgICAgIENhblN0b3JlSW1hZ2VzOiB0aGlzLnNjYW5Qcm92aWRlci5jYW5TdG9yZUltYWdlcyxcbiAgICAgIH0sXG4gICAgICAvLyBDYWxsQmFja1VybDogJ2h0dHA6Ly9kZW1vOjUwMDAvcmVwb3J0L2V4dHJhY3RlZC8nLFxuICAgIH07XG4gICAgaWYgKCF0aGlzLnNjYW5CbGFzdERhdGFbMV0uaW1hZ2UpIHtcbiAgICAgIHBheWxvYWQuU2V0dGluZ3MuSWdub3JlQmFja0ltYWdlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnNjYW5Qcm92aWRlci5ibGFzdFBvc3QocGF5bG9hZCkuc3Vic2NyaWJlKFxuICAgICAgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gZGF0YS5EYXRhO1xuICAgICAgICBsb2FkaW5nLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNjYW5pbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJlc3VsdHMgJiYgZGF0YS5NZXRhZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKGRhdGEuSW1hZ2VEYXRhPy5Eb2N1bWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgRG9jdW1lbnRzIH0gPSBkYXRhLkltYWdlRGF0YTtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VzID0gRG9jdW1lbnRzLm1hcCgoaW1hZ2U6IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6ICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyBEb2N1bWVudHNbaV0gfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5zY2FuUHJvdmlkZXIucGFyc2VCbGFzdChyZXN1bHRzKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnUkVTJywgdGhpcy5yZXN1bHQpO1xuXG4gICAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMucmVzdWx0Lm1vZGVsO1xuICAgICAgICAgIGlmIChkYXRhLkltYWdlRGF0YT8uRmFjZUltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLl9hdmF0YXIgPVxuICAgICAgICAgICAgICAnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnICsgZGF0YS5JbWFnZURhdGE/LkZhY2VJbWFnZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5sb2coJ01PREVMJywgdGhpcy5tb2RlbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyk7XG4gICAgICAgICAgLy8gdGhpcy5zY2FuU2lkZSA9IDA7XG4gICAgICAgICAgdGhpcy5lcnJvciA9IHRydWU7XG4gICAgICAgICAgdGhpcy5wcmV2aWV3ID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIHRoaXMuZG9jdW1lbnRUeXBlU2VsZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIHRoaXMucmV0cnkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgbG9hZGluZy5jbG9zZSgpO1xuICAgICAgICAvLyB0aGlzLnNjYW5TaWRlID0gMDtcbiAgICAgICAgdGhpcy5lcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMucHJldmlldyA9IHRydWU7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNjYW5pbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIGNhbWVyYU9mZihldjogYW55KSB7XG4gICAgdGhpcy5jYW1lcmFSZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIGNvbnRpbnVlKCkge1xuICAgIGlmICh0aGlzLnNjYW5Qcm92aWRlci5lbmFibGVWZXJpZmljYXRpb24pIHtcbiAgICAgIGNvbnN0IGxvYWRpbmcgPSB0aGlzLmRpYWxvZ3MubG9hZGluZygpO1xuICAgICAgY29uc29sZS5sb2codGhpcy5kYXRhLmF2YXRhcik7XG5cbiAgICAgIHRoaXMuc2NhblByb3ZpZGVyXG4gICAgICAgIC5zdGF0ZWxlc3MoXG4gICAgICAgICAgdGhpcy5kYXRhLmF2YXRhci5zcGxpdCgnLCcpWzFdLFxuICAgICAgICAgIHRoaXMud2ViY2FtSW1hZ2U/LmltYWdlQXNEYXRhVXJsLnNwbGl0KCcsJylbMV1cbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXNwOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTtcbiAgICAgICAgICAgIGlmIChyZXNwLkRhdGE/LlZlcmlmaWVkKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZSh0aGlzLndlYmNhbUltYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlhbG9ncy5hbGVydChcbiAgICAgICAgICAgICAgICAnVmVyaWZpY2F0aW9uIGZhaWxlZCEnLFxuICAgICAgICAgICAgICAgIFwiV2UgY2FuJ3QgdmVyaWZ5IHRoYXQgeW91ciBzZWxmaWUgaXMgc2FtZSBhcyBpbWFnZSBvbiBkb2N1bWVudC5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UodGhpcy53ZWJjYW1JbWFnZSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UodGhpcy53ZWJjYW1JbWFnZSk7XG4gICAgfVxuICAgIC8vIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRoaXMud2ViY2FtSW1hZ2UpXG4gIH1cbiAgcmV0cnkoKSB7XG4gICAgdGhpcy5wcmV2aWV3ID0gZmFsc2U7XG5cbiAgICB0aGlzLnJlc3VsdCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICB0aGlzLmRvY3VtZW50VHlwZVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNjYW5CbGFzdERhdGEuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgIGVsZW1lbnQuaW1hZ2UgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZXJyb3IgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgdHJpZ2dlclNuYXBzaG90KCk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlci5uZXh0KDApO1xuICB9XG4gIHNjYW4oKSB7XG4gICAgY29uc29sZS5sb2coJ1NDQU4nKTtcbiAgICB0aGlzLnRyaWdnZXJTbmFwc2hvdCgpO1xuICAgIHRoaXMuc2NhbkRhdGFzWzBdID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgcmV0YWtlKCkge1xuICAgIHRoaXMucHJldmlldyA9IGZhbHNlO1xuICAgIHRoaXMuZXJyb3IgPSBmYWxzZTtcbiAgICB0aGlzLnJlc3VsdCA9IGZhbHNlO1xuICAgIHRoaXMuc2NhblNpZGUgPSAwO1xuXG4gICAgdGhpcy5zY2FuRGF0YXMgPSBbXTtcbiAgICB0aGlzLnNjYW5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLmltYWdlcyA9IFtdO1xuXG4gICAgdGhpcy5kb2N1bWVudFR5cGVTZWxlY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2NhbkJsYXN0RGF0YS5mb3JFYWNoKChtOiBhbnkpID0+IHtcbiAgICAgIG0uaW1hZ2UgPSBudWxsO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgdXNlKCkge31cbiAgc2VsZmllKCkge31cbn1cbiIsIjxoZWFkZXIgY2xhc3M9XCJwYWdlLWhlYWRlclwiIGZ4TGF5b3V0PVwicm93XCI+XG4gIDxkaXYgY2xhc3M9XCJ0aXRsZVwiIG5nQ2xhc3MubHQtc209XCJ0aXRsZS1zbWFsbFwiPlNlbGZpZTwvZGl2PlxuXG4gIDxzcGFuIGZ4RmxleD48L3NwYW4+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cIlxuICAgICAgZG9jdW1lbnRUeXBlU2VsZWN0ZWQgJiZcbiAgICAgICFyZXN1bHQgJiZcbiAgICAgICFlcnJvciAmJlxuICAgICAgbXVsdGlwbGVXZWJjYW1zQXZhaWxhYmxlICYmXG4gICAgICAhcHJldmlld1xuICAgIFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yXCI+PC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDBweCAxNnB4XCI+XG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDE0cHg7IHdpZHRoOiAyMDBweDsgbWFyZ2luLXRvcDogOHB4XCJcbiAgICAgICAgICBjbGFzcz1cInctMjAwIG1yLTE2IG10LThcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1sYWJlbD4gQ2FtZXJhIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInNlbGVjdENhbWVyYSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGV2aWNlSWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkZXZpY2Ugb2YgbWVkaWFEZXZpY2VzXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImRldmljZS5kZXZpY2VJZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGRldmljZS5sYWJlbCB9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJzZXBhcmF0b3JcIj48L2Rpdj5cblxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT09ICdkZXNrdG9wJ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJzZXBhcmF0b3JcIj48L2Rpdj5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInNlbmRNb2JpbGUoKVwiPlxuICAgICAgPG1hdC1pY29uPnRhYmxldF9tYWM8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvclwiPjwvZGl2PlxuXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L25nLWNvbnRhaW5lcj4gLS0+XG48L2hlYWRlcj5cblxuPGRpdiAqbmdJZj1cIiFyZXN1bHRcIiBmeEZsZXggZnhMYXlvdXQ9XCJjb2x1bW5cIj5cbiAgPGRpdiBmeEZsZXggI3dyYXBlciBjbGFzcz1cIndyYXBlclwiIGZ4TGF5b3V0PVwicm93XCI+XG4gICAgPGRpdlxuICAgICAgc3R5bGU9XCJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgbGVmdDogMHB4O1xuICAgICAgICByaWdodDogMHB4O1xuICAgICAgICBib3R0b206IDBweDtcbiAgICAgICAgei1pbmRleDogMjA7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlc21va2U7XG4gICAgICBcIlxuICAgICAgKm5nSWY9XCIhY2FtZXJhUmVhZHkgJiYgIXByZXZpZXdcIlxuICAgID5cbiAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlcnJvclwiPlxuICAgICAgPCEtLSA8ZGl2XG4gICAgICBjbGFzcz1cInJlY3RhbmdsZVwiXG4gICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICd3aWR0aC5weCc6IHZpZGVvSGVpZ2h0ICogMC43NSAqIDEuNTg4LFxuICAgICAgICAnaGVpZ2h0LnB4JzogdmlkZW9IZWlnaHQgKiAwLjc1XG4gICAgICB9XCJcbiAgICA+PC9kaXY+XG4gICAgPHN2Z1xuICAgICAgKm5nSWY9XCJ2aWRlb1dpZHRoXCJcbiAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwcHg7IHRvcDogMHB4XCJcbiAgICAgIHdpZHRoPVwiMFwiXG4gICAgICBoZWlnaHQ9XCIwXCJcbiAgICA+XG4gICAgICA8ZGVmcz5cbiAgICAgICAgPGNsaXBQYXRoIGlkPVwibXlDbGlwXCI+XG4gICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjZcIlxuICAgICAgICAgICAgc3Ryb2tlLWNvbG9yPVwicmVkXCJcbiAgICAgICAgICAgIFthdHRyLnhdPVwiKHZpZGVvV2lkdGggLSB2aWRlb0hlaWdodCAqIDAuNzUgKiAxLjU4OCkgLyAyXCJcbiAgICAgICAgICAgIFthdHRyLnldPVwiKHZpZGVvSGVpZ2h0ICogMC4yNSkgLyAyXCJcbiAgICAgICAgICAgIFthdHRyLndpZHRoXT1cInZpZGVvSGVpZ2h0ICogMC43NSAqIDEuNTg4XCJcbiAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCJ2aWRlb0hlaWdodCAqIDAuNzVcIlxuICAgICAgICAgICAgcng9XCIyNVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgIDwvZGVmcz5cbiAgICA8L3N2Zz4gLS0+XG5cbiAgICAgIDxhcHAtd2ViY2FtXG4gICAgICAgICpuZ0lmPVwiIXByZXZpZXcgJiYgIXNjYW5pbmdcIlxuICAgICAgICBjbGFzcz1cIm1haW5cIlxuICAgICAgICBbaW1hZ2VRdWFsaXR5XT1cIjFcIlxuICAgICAgICAjd2ViY2FtXG4gICAgICAgIGZ4RmxleFxuICAgICAgICBbdHJpZ2dlcl09XCJ0cmlnZ2VyXCJcbiAgICAgICAgKGltYWdlQ2FwdHVyZSk9XCJoYW5kbGVJbWFnZSgkZXZlbnQpXCJcbiAgICAgICAgW2FsbG93Q2FtZXJhU3dpdGNoXT1cImFsbG93Q2FtZXJhU3dpdGNoXCJcbiAgICAgICAgW3ZpZGVvT3B0aW9uc109XCJ2aWRlb09wdGlvbnNcIlxuICAgICAgICBbc3dpdGNoQ2FtZXJhXT1cIm5leHRXZWJjYW1PYnNlcnZhYmxlXCJcbiAgICAgICAgKGNhbWVyYVN3aXRjaGVkKT1cImNhbWVyYVdhc1N3aXRjaGVkKCRldmVudClcIlxuICAgICAgICAoaW5pdEVycm9yKT1cImhhbmRsZUluaXRFcnJvcigkZXZlbnQpXCJcbiAgICAgICAgdHlwZT1cInNlbGZpZVwiXG4gICAgICAgIFt3aWR0aF09XCJ3aWR0aFwiXG4gICAgICAgIFtoZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgICAgKGRlc3Ryb3llZCk9XCJjYW1lcmFPZmYoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICA8L2FwcC13ZWJjYW0+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdlxuICAgICAgZnhMYXlvdXQ9XCJyb3dcIlxuICAgICAgZnhGbGV4XG4gICAgICBjbGFzcz1cInByZXZpZXdEYXRhXCJcbiAgICAgICpuZ0lmPVwicHJldmlld1wiXG4gICAgICBzdHlsZT1cInotaW5kZXg6IDIwOyBwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCVcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzY2FuUHJldmlld1wiXG4gICAgICAgIGZ4RmxleFxuICAgICAgICBmeExheW91dD1cImNvbHVtblwiXG4gICAgICAgICpuZ0lmPVwiIWVycm9yICYmICFzY2FuaW5nXCJcbiAgICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGZ4RmxleFxuICAgICAgICAgIGNsYXNzPVwiaW1hZ2VcIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cIid1cmwoJyArIHByZXZpZXcgKyAnKSdcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGZvb3RlciBmeExheW91dD1cInJvd1wiIGNsYXNzPVwicC04XCI+XG4gICAgPGJ1dHRvblxuICAgICAgW2Rpc2FibGVkXT1cIiFjYW1lcmFSZWFkeVwiXG4gICAgICBjbGFzcz1cInctMTAwLXBcIlxuICAgICAgKm5nSWY9XCIhcHJldmlld1wiXG4gICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgKGNsaWNrKT1cInNjYW4oKVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgVEFLRSBTRUxGSUVcbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJ3LTEwMC1wXCJcbiAgICAgICpuZ0lmPVwicHJldmlld1wiXG4gICAgICBmeExheW91dD1cInJvd1wiXG4gICAgICBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCJcbiAgICAgIGZ4RmxleFxuICAgID5cbiAgICAgIDxidXR0b24gZnhGbGV4IGNsYXNzPVwibXItNFwiIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJyZXRyeSgpXCI+XG4gICAgICAgIFJFVFJZXG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICBbZGlzYWJsZWRdPVwiZXJyb3JcIlxuICAgICAgICBmeEZsZXhcbiAgICAgICAgY2xhc3M9XCJtbC00XCJcbiAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgKGNsaWNrKT1cImNvbnRpbnVlKClcIlxuICAgICAgPlxuICAgICAgQ09OVElOVUVcblxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9vdGVyPlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,100 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BlankComponent } from './components/blank/blank.component';
3
+ import { ScanProfileComponent } from './components/scan-profile/scan-profile.component';
4
+ import { LoadingComponent } from './components/loading/loading.component';
5
+ import { ConfirmComponent } from './components/confirm/confirm.component';
6
+ import { ScanMobileComponent } from './components/scan-mobile/scan-mobile.component';
7
+ import { ScanSelfieComponent } from './components/scan-selfie/scan-selfie.component';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/material/dialog";
10
+ export class DialogsCoreProvider {
11
+ constructor(matDialog) {
12
+ this.matDialog = matDialog;
13
+ this.components = {
14
+ ScanProfile: { component: ScanProfileComponent },
15
+ Loading: { component: LoadingComponent },
16
+ ConfirmComponent: { component: ConfirmComponent },
17
+ ScanMobileComponent: { component: ScanMobileComponent },
18
+ ScanSelfie: { component: ScanSelfieComponent },
19
+ };
20
+ this.blank = BlankComponent;
21
+ }
22
+ getComponent(name) {
23
+ if (!this.components[name]) {
24
+ console.warn('Component missing', name, this.components);
25
+ }
26
+ return this.components[name].component;
27
+ }
28
+ open(config, withComponent = true) {
29
+ // console.log(config);
30
+ const panelClass = config.panelClass ? config.panelClass : config.name;
31
+ const component = this.getComponent(config.name);
32
+ const dialogRef = this.matDialog.open(this.blank, {
33
+ panelClass,
34
+ data: {
35
+ data: config.data,
36
+ withComponent,
37
+ component,
38
+ },
39
+ autoFocus: false,
40
+ width: config.width || '',
41
+ height: config.height || '',
42
+ maxWidth: config.maxWidth || '',
43
+ minWidth: config.minWidth || '',
44
+ maxHeight: config.maxHeight || '',
45
+ minHeight: config.minHeight || '',
46
+ position: config.position || {},
47
+ hasBackdrop: config.hasBackdrop === undefined ? true : config.hasBackdrop,
48
+ disableClose: config.disableClose === undefined ? true : config.disableClose,
49
+ });
50
+ return dialogRef;
51
+ }
52
+ scanProfile(data) {
53
+ return this.open({
54
+ name: 'ScanProfile',
55
+ panelClass: 'ScanProfileComponent',
56
+ data,
57
+ });
58
+ }
59
+ // Generic loading dialog
60
+ loading(title = '') {
61
+ return this.open({
62
+ name: 'Loading',
63
+ data: { title },
64
+ });
65
+ }
66
+ alert(title, text) {
67
+ return this.open({
68
+ name: 'ConfirmComponent',
69
+ maxWidth: '600px',
70
+ panelClass: 'DialogNoPadding',
71
+ minWidth: '440px',
72
+ data: { title, text, alert: true },
73
+ });
74
+ }
75
+ scanMobile(data) {
76
+ return this.open({
77
+ name: 'ScanMobileComponent',
78
+ maxWidth: '600px',
79
+ panelClass: 'DialogNoPadding',
80
+ minWidth: '440px',
81
+ data,
82
+ });
83
+ }
84
+ scanSelfie(data) {
85
+ return this.open({
86
+ name: 'ScanSelfie',
87
+ panelClass: 'ScanProfileComponent',
88
+ data,
89
+ });
90
+ }
91
+ }
92
+ DialogsCoreProvider.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DialogsCoreProvider, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Injectable });
93
+ DialogsCoreProvider.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DialogsCoreProvider, providedIn: 'root' });
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DialogsCoreProvider, decorators: [{
95
+ type: Injectable,
96
+ args: [{
97
+ providedIn: 'root',
98
+ }]
99
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }]; } });
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9ncy5jb3JlLnByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2RpYWxvZ3MvZGlhbG9ncy5jb3JlLnByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7O0FBS3JGLE1BQU0sT0FBTyxtQkFBbUI7SUFVOUIsWUFBb0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQVR4QyxlQUFVLEdBQVE7WUFDaEIsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFO1lBQ2hELE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtZQUN4QyxnQkFBZ0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtZQUNqRCxtQkFBbUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRTtZQUN2RCxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUU7U0FDL0MsQ0FBQztRQUNNLFVBQUssR0FBRyxjQUFjLENBQUM7SUFFWSxDQUFDO0lBQ3BDLFlBQVksQ0FBQyxJQUFTO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFF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QUFJLEVBQUUsWUFBWTtZQUNsQixVQUFVLEVBQUUsc0JBQXNCO1lBQ2xDLElBQUk7U0FDTCxDQUFDLENBQUM7SUFDTCxDQUFDOztnSEF2RlUsbUJBQW1CO29IQUFuQixtQkFBbUIsY0FGbEIsTUFBTTsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlhbG9nUG9zaXRpb24sXG4gIE1hdERpYWxvZyxcbiAgTWF0RGlhbG9nUmVmLFxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJsYW5rQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2JsYW5rL2JsYW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTY2FuUHJvZmlsZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zY2FuLXByb2ZpbGUvc2Nhbi1wcm9maWxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2FkaW5nQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2xvYWRpbmcvbG9hZGluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29uZmlybUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jb25maXJtL2NvbmZpcm0uY29tcG9uZW50JztcbmltcG9ydCB7IFNjYW5Nb2JpbGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc2Nhbi1tb2JpbGUvc2Nhbi1tb2JpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IFNjYW5TZWxmaWVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc2Nhbi1zZWxmaWUvc2Nhbi1zZWxmaWUuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIERpYWxvZ3NDb3JlUHJvdmlkZXIge1xuICBjb21wb25lbnRzOiBhbnkgPSB7XG4gICAgU2NhblByb2ZpbGU6IHsgY29tcG9uZW50OiBTY2FuUHJvZmlsZUNvbXBvbmVudCB9LFxuICAgIExvYWRpbmc6IHsgY29tcG9uZW50OiBMb2FkaW5nQ29tcG9uZW50IH0sXG4gICAgQ29uZmlybUNvbXBvbmVudDogeyBjb21wb25lbnQ6IENvbmZpcm1Db21wb25lbnQgfSxcbiAgICBTY2FuTW9iaWxlQ29tcG9uZW50OiB7IGNvbXBvbmVudDogU2Nhbk1vYmlsZUNvbXBvbmVudCB9LFxuICAgIFNjYW5TZWxmaWU6IHsgY29tcG9uZW50OiBTY2FuU2VsZmllQ29tcG9uZW50IH0sXG4gIH07XG4gIHByaXZhdGUgYmxhbmsgPSBCbGFua0NvbXBvbmVudDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nKSB7fVxuICBwcml2YXRlIGdldENvbXBvbmVudChuYW1lOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY29tcG9uZW50c1tuYW1lXSkge1xuICAgICAgY29uc29sZS53YXJuKCdDb21wb25lbnQgbWlzc2luZycsIG5hbWUsIHRoaXMuY29tcG9uZW50cyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHNbbmFtZV0uY29tcG9uZW50O1xuICB9XG4gIHB1YmxpYyBvcGVuKGNvbmZpZzogYW55LCB3aXRoQ29tcG9uZW50ID0gdHJ1ZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKGNvbmZpZyk7XG4gICAgY29uc3QgcGFuZWxDbGFzcyA9IGNvbmZpZy5wYW5lbENsYXNzID8gY29uZmlnLnBhbmVsQ2xhc3MgOiBjb25maWcubmFtZTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZ2V0Q29tcG9uZW50KGNvbmZpZy5uYW1lKTtcblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4odGhpcy5ibGFuaywge1xuICAgICAgcGFuZWxDbGFzcyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZGF0YTogY29uZmlnLmRhdGEsXG4gICAgICAgIHdpdGhDb21wb25lbnQsXG4gICAgICAgIGNvbXBvbmVudCxcbiAgICAgIH0sXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgd2lkdGg6IGNvbmZpZy53aWR0aCB8fCAnJyxcbiAgICAgIGhlaWdodDogY29uZmlnLmhlaWdodCB8fCAnJyxcbiAgICAgIG1heFdpZHRoOiBjb25maWcubWF4V2lkdGggfHwgJycsXG4gICAgICBtaW5XaWR0aDogY29uZmlnLm1pbldpZHRoIHx8ICcnLFxuICAgICAgbWF4SGVpZ2h0OiBjb25maWcubWF4SGVpZ2h0IHx8ICcnLFxuICAgICAgbWluSGVpZ2h0OiBjb25maWcubWluSGVpZ2h0IHx8ICcnLFxuICAgICAgcG9zaXRpb246IGNvbmZpZy5wb3NpdGlvbiB8fCB7fSxcbiAgICAgIGhhc0JhY2tkcm9wOiBjb25maWcuaGFzQmFja2Ryb3AgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBjb25maWcuaGFzQmFja2Ryb3AsXG4gICAgICBkaXNhYmxlQ2xvc2U6XG4gICAgICAgIGNvbmZpZy5kaXNhYmxlQ2xvc2UgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBjb25maWcuZGlzYWJsZUNsb3NlLFxuICAgIH0pO1xuXG5cbiAgICByZXR1cm4gZGlhbG9nUmVmO1xuICB9XG4gIHB1YmxpYyBzY2FuUHJvZmlsZShkYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuKHtcbiAgICAgIG5hbWU6ICdTY2FuUHJvZmlsZScsXG4gICAgICBwYW5lbENsYXNzOiAnU2NhblByb2ZpbGVDb21wb25lbnQnLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdlbmVyaWMgbG9hZGluZyBkaWFsb2dcbiAgcHVibGljIGxvYWRpbmcodGl0bGU6IHN0cmluZyA9ICcnKSB7XG4gICAgcmV0dXJuIHRoaXMub3Blbih7XG4gICAgICBuYW1lOiAnTG9hZGluZycsXG4gICAgICBkYXRhOiB7IHRpdGxlIH0sXG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGFsZXJ0KHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9wZW4oe1xuICAgICAgbmFtZTogJ0NvbmZpcm1Db21wb25lbnQnLFxuICAgICAgbWF4V2lkdGg6ICc2MDBweCcsXG4gICAgICBwYW5lbENsYXNzOiAnRGlhbG9nTm9QYWRkaW5nJyxcblxuICAgICAgbWluV2lkdGg6ICc0NDBweCcsXG4gICAgICBkYXRhOiB7IHRpdGxlLCB0ZXh0LCBhbGVydDogdHJ1ZSB9LFxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBzY2FuTW9iaWxlKGRhdGE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLm9wZW4oe1xuICAgICAgbmFtZTogJ1NjYW5Nb2JpbGVDb21wb25lbnQnLFxuICAgICAgbWF4V2lkdGg6ICc2MDBweCcsXG4gICAgICBwYW5lbENsYXNzOiAnRGlhbG9nTm9QYWRkaW5nJyxcblxuICAgICAgbWluV2lkdGg6ICc0NDBweCcsXG4gICAgICBkYXRhLFxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBzY2FuU2VsZmllKGRhdGE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLm9wZW4oe1xuICAgICAgbmFtZTogJ1NjYW5TZWxmaWUnLFxuICAgICAgcGFuZWxDbGFzczogJ1NjYW5Qcm9maWxlQ29tcG9uZW50JyxcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==