ngx-scandoc 1.0.1 → 1.0.2

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 (45) hide show
  1. package/core/components/base.component.d.ts +6 -0
  2. package/core/components/camera-switch/camera-switch.component.d.ts +11 -0
  3. package/core/components/components.module.d.ts +10 -3
  4. package/core/components/scan/scan.component.d.ts +120 -0
  5. package/core/components/scan-results/scan-results.component.d.ts +20 -0
  6. package/core/components/webcam/webcam/webcam.component.d.ts +5 -2
  7. package/core/interfaces/config.d.ts +16 -0
  8. package/dialogs/components/blank/blank.component.d.ts +2 -3
  9. package/dialogs/components/scan-profile/scan-profile.component.d.ts +10 -116
  10. package/dialogs/components/turn-document/turn-document.component.d.ts +12 -0
  11. package/dialogs/dialogs.core.provider.d.ts +1 -1
  12. package/dialogs/dialogs.module.d.ts +2 -2
  13. package/esm2020/core/components/base.component.mjs +15 -0
  14. package/esm2020/core/components/camera-switch/camera-switch.component.mjs +22 -0
  15. package/esm2020/core/components/components.module.mjs +34 -6
  16. package/esm2020/core/components/scan/scan.component.mjs +587 -0
  17. package/esm2020/core/components/scan-results/scan-results.component.mjs +38 -0
  18. package/esm2020/core/components/webcam/webcam/webcam.component.mjs +17 -11
  19. package/esm2020/core/interfaces/config.mjs +2 -0
  20. package/esm2020/dialogs/components/blank/blank.component.mjs +6 -7
  21. package/esm2020/dialogs/components/scan-profile/scan-profile.component.mjs +33 -741
  22. package/esm2020/dialogs/components/scan-selfie/scan-selfie.component.mjs +2 -2
  23. package/esm2020/dialogs/components/turn-document/turn-document.component.mjs +32 -0
  24. package/esm2020/dialogs/dialogs.core.provider.mjs +18 -9
  25. package/esm2020/dialogs/dialogs.module.mjs +7 -7
  26. package/esm2020/lib/ngx-scandoc.module.mjs +1 -1
  27. package/esm2020/providers/auth.provider.mjs +3 -2
  28. package/esm2020/providers/camera.provider.mjs +40 -0
  29. package/esm2020/providers/interceptor.provider.mjs +2 -2
  30. package/esm2020/providers/layout.provider.mjs +28 -0
  31. package/esm2020/providers/scan.provider.mjs +4 -6
  32. package/esm2020/public-api.mjs +4 -2
  33. package/fesm2015/ngx-scandoc.mjs +1689 -1676
  34. package/fesm2015/ngx-scandoc.mjs.map +1 -1
  35. package/fesm2020/ngx-scandoc.mjs +1960 -1947
  36. package/fesm2020/ngx-scandoc.mjs.map +1 -1
  37. package/lib/ngx-scandoc.module.d.ts +1 -15
  38. package/package.json +1 -1
  39. package/providers/auth.provider.d.ts +1 -1
  40. package/providers/camera.provider.d.ts +17 -0
  41. package/providers/layout.provider.d.ts +11 -0
  42. package/providers/scan.provider.d.ts +3 -5
  43. package/public-api.d.ts +3 -1
  44. package/dialogs/components/scan-mobile/scan-mobile.component.d.ts +0 -16
  45. package/esm2020/dialogs/components/scan-mobile/scan-mobile.component.mjs +0 -43
@@ -1,22 +1,8 @@
1
1
  import { ModuleWithProviders } from '@angular/core';
2
+ import { ScanDataConfig } from '../core/interfaces/config';
2
3
  import * as i0 from "@angular/core";
3
4
  import * as i1 from "../core/components/components.module";
4
5
  import * as i2 from "../dialogs/dialogs.module";
5
- export interface AuthConfig {
6
- path: string;
7
- tokenName: string;
8
- clientId: string;
9
- }
10
- export interface ScanConfig {
11
- extractionPath: string;
12
- validationPath: string;
13
- errorLoggingPath: string;
14
- stateLessPath: string;
15
- }
16
- export interface ScanDataConfig {
17
- auth: AuthConfig;
18
- scan: ScanConfig;
19
- }
20
6
  export declare class NgxScandocModule {
21
7
  static forRoot(config: ScanDataConfig): ModuleWithProviders<NgxScandocModule>;
22
8
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxScandocModule, never>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-scandoc",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^14.2.0",
6
6
  "@angular/core": "^14.2.0",
@@ -1,6 +1,6 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { HttpClient } from '@angular/common/http';
3
- import { AuthConfig } from '../lib/ngx-scandoc.module';
3
+ import { AuthConfig } from '../core/interfaces/config';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class AuthProvider {
6
6
  private http;
@@ -0,0 +1,17 @@
1
+ import { Subject } from 'rxjs';
2
+ import * as i0 from "@angular/core";
3
+ export declare class NgxScandocCameraProvider {
4
+ mediaDevices: any;
5
+ deviceId: any;
6
+ switchCamera: Subject<unknown>;
7
+ cameraReady: boolean;
8
+ cameraSwitched: Subject<unknown>;
9
+ multipleWebcamsAvailable: boolean;
10
+ constructor();
11
+ setup(): void;
12
+ selectCamera(event: any): void;
13
+ cameraWasSwitched(deviceId: string): void;
14
+ get nextWebcamObservable(): import("rxjs").Observable<unknown>;
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxScandocCameraProvider, never>;
16
+ static ɵprov: i0.ɵɵInjectableDeclaration<NgxScandocCameraProvider>;
17
+ }
@@ -0,0 +1,11 @@
1
+ import { BreakpointObserver } from '@angular/cdk/layout';
2
+ import * as i0 from "@angular/core";
3
+ export declare class LayoutProvider {
4
+ private breakpointObserver;
5
+ isMobile: boolean;
6
+ readonly breakpoint$: import("rxjs").Observable<import("@angular/cdk/layout").BreakpointState>;
7
+ constructor(breakpointObserver: BreakpointObserver);
8
+ init(): void;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<LayoutProvider, never>;
10
+ static ɵprov: i0.ɵɵInjectableDeclaration<LayoutProvider>;
11
+ }
@@ -1,15 +1,13 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { HttpClient } from '@angular/common/http';
3
- import { AuthProvider } from './auth.provider';
4
- import { ScanConfig } from '../lib/ngx-scandoc.module';
3
+ import { ScanConfig } from '../core/interfaces/config';
5
4
  import * as i0 from "@angular/core";
6
5
  export declare class ScanProvider {
7
6
  private http;
8
- private auth;
9
- private config;
7
+ config: ScanConfig;
10
8
  enableVerification: boolean;
11
9
  canStoreImages: boolean;
12
- constructor(http: HttpClient, auth: AuthProvider, config: ScanConfig);
10
+ constructor(http: HttpClient, config: ScanConfig);
13
11
  genderList(): {
14
12
  M: string;
15
13
  'M/M': string;
package/public-api.d.ts CHANGED
@@ -16,6 +16,8 @@ export { BlankComponent } from './dialogs/components/blank/blank.component';
16
16
  export { LoadingComponent } from './dialogs/components/loading/loading.component';
17
17
  export { ScanProfileComponent } from './dialogs/components/scan-profile/scan-profile.component';
18
18
  export { ScanSelfieComponent } from './dialogs/components/scan-selfie/scan-selfie.component';
19
- export { ScanMobileComponent } from './dialogs/components/scan-mobile/scan-mobile.component';
19
+ export { TurnDocumentComponent } from './dialogs/components/turn-document/turn-document.component';
20
20
  export { WebcamModule } from './core/components/webcam/webcam.module';
21
21
  export { NgxScandocModule } from './lib/ngx-scandoc.module';
22
+ export { ScanComponent } from './core/components/scan/scan.component';
23
+ export { CameraSwitchComponent } from './core/components/camera-switch/camera-switch.component';
@@ -1,16 +0,0 @@
1
- import { OnInit } from '@angular/core';
2
- import { MatDialogRef } from '@angular/material/dialog';
3
- import { webRtcProvider } from '../../../providers/webrtc.provider';
4
- import * as i0 from "@angular/core";
5
- export declare class ScanMobileComponent implements OnInit {
6
- dialogRef: MatDialogRef<ScanMobileComponent>;
7
- data: any;
8
- private rtcProvider;
9
- code: any;
10
- constructor(dialogRef: MatDialogRef<ScanMobileComponent>, data: any, rtcProvider: webRtcProvider);
11
- ngOnInit(): void;
12
- close(): void;
13
- action(): void;
14
- static ɵfac: i0.ɵɵFactoryDeclaration<ScanMobileComponent, never>;
15
- static ɵcmp: i0.ɵɵComponentDeclaration<ScanMobileComponent, "app-scan-mobile", never, {}, {}, never, never, false>;
16
- }
@@ -1,43 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/material/dialog";
5
- import * as i2 from "../../../providers/webrtc.provider";
6
- import * as i3 from "angularx-qrcode";
7
- import * as i4 from "@angular/material/button";
8
- import * as i5 from "@angular/flex-layout";
9
- import * as i6 from "@angular/flex-layout/extended";
10
- import * as i7 from "@ngx-translate/core";
11
- export class ScanMobileComponent {
12
- constructor(dialogRef, data, rtcProvider) {
13
- this.dialogRef = dialogRef;
14
- this.data = data;
15
- this.rtcProvider = rtcProvider;
16
- }
17
- ngOnInit() {
18
- this.rtcProvider.setup();
19
- this.rtcProvider.subject.subscribe((msg) => {
20
- console.log('[MSG]' + msg);
21
- }, // Called whenever there is a message from the server.
22
- (err) => console.log(err), // Called if at any point WebSocket API signals some kind of error.
23
- () => console.log('complete') // Called when connection is closed (for whatever reason).
24
- );
25
- console.log(this.data);
26
- const path = 'https://192.168.1.104:4200/';
27
- this.code = path + 'mobile?id=1';
28
- }
29
- close() {
30
- this.dialogRef.close();
31
- }
32
- action() { }
33
- }
34
- ScanMobileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScanMobileComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.webRtcProvider }], target: i0.ɵɵFactoryTarget.Component });
35
- ScanMobileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ScanMobileComponent, selector: "app-scan-mobile", ngImport: i0, template: "<header class=\"page-header\" fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <div class=\"title\" ngClass.lt-sm=\"title-small\">\n Send to mobile\n\n <!-- {{ data.text.statusText }} {{ data.text.status }} -->\n </div>\n\n <span fxFlex></span>\n\n <!-- <div class=\"separator\"></div>\n\n <button mat-button (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button> -->\n <!-- <mat-icon class=\"mr-16\" style=\"color:#888;\">info_outline</mat-icon> -->\n</header>\n\n<div fxLayout=\"column\" fxLayoutAlign=\"center center\">\n <!-- <img\n style=\"height: 240px; margin: 34px 0px;display: none;\"\n [src]=\"'/assets/images/illustrations/' + images[type]\"\n /> -->\n <!-- <img style=\"width:60px;\" src=\"/assets/images/illustrations/door-lock.png\"> -->\n\n<qrcode [qrdata]=\"code\" [width]=\"256\" [errorCorrectionLevel]=\"'M'\"></qrcode>\n\n\n</div>\n\n<!-- -->\n\n<footer>\n <div class=\"actions\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button (click)=\"close()\" mat-raised-button>\n {{ \"core.page.cancel\" | translate }}\n </button>\n\n <button (click)=\"action()\" color=\"accent\" mat-raised-button>\n <ng-container>\n {{ \"core.page.ok\" | translate }}\n </ng-container>\n </button>\n </div>\n</footer>\n", styles: [":host{display:flex;flex-direction:column;flex:1;height:100%;width:100%}.title{font-size:18px}.text{padding:0 30px;text-align:center;font-size:16px;margin:40px 0}.actions{min-height:60px}.actions button{min-width:120px;margin-right:16px;box-shadow:none;text-transform:uppercase}footer{background-color:#fff}footer button{box-shadow:none!important;border:1px solid rgba(0,0,0,.12);font-size:13px}\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: "component", type: i3.QRCodeComponent, selector: "qrcode", inputs: ["allowEmptyString", "colorDark", "colorLight", "cssClass", "elementType", "errorCorrectionLevel", "imageSrc", "imageHeight", "imageWidth", "margin", "qrdata", "scale", "version", "width", "alt", "ariaLabel", "title"], outputs: ["qrCodeURL"] }, { kind: "component", type: i4.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: "directive", type: i5.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: i5.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: i5.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: i6.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"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
36
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScanMobileComponent, decorators: [{
37
- type: Component,
38
- args: [{ selector: 'app-scan-mobile', template: "<header class=\"page-header\" fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <div class=\"title\" ngClass.lt-sm=\"title-small\">\n Send to mobile\n\n <!-- {{ data.text.statusText }} {{ data.text.status }} -->\n </div>\n\n <span fxFlex></span>\n\n <!-- <div class=\"separator\"></div>\n\n <button mat-button (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button> -->\n <!-- <mat-icon class=\"mr-16\" style=\"color:#888;\">info_outline</mat-icon> -->\n</header>\n\n<div fxLayout=\"column\" fxLayoutAlign=\"center center\">\n <!-- <img\n style=\"height: 240px; margin: 34px 0px;display: none;\"\n [src]=\"'/assets/images/illustrations/' + images[type]\"\n /> -->\n <!-- <img style=\"width:60px;\" src=\"/assets/images/illustrations/door-lock.png\"> -->\n\n<qrcode [qrdata]=\"code\" [width]=\"256\" [errorCorrectionLevel]=\"'M'\"></qrcode>\n\n\n</div>\n\n<!-- -->\n\n<footer>\n <div class=\"actions\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button (click)=\"close()\" mat-raised-button>\n {{ \"core.page.cancel\" | translate }}\n </button>\n\n <button (click)=\"action()\" color=\"accent\" mat-raised-button>\n <ng-container>\n {{ \"core.page.ok\" | translate }}\n </ng-container>\n </button>\n </div>\n</footer>\n", styles: [":host{display:flex;flex-direction:column;flex:1;height:100%;width:100%}.title{font-size:18px}.text{padding:0 30px;text-align:center;font-size:16px;margin:40px 0}.actions{min-height:60px}.actions button{min-width:120px;margin-right:16px;box-shadow:none;text-transform:uppercase}footer{background-color:#fff}footer button{box-shadow:none!important;border:1px solid rgba(0,0,0,.12);font-size:13px}\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"] }]
39
- }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
40
- type: Inject,
41
- args: [MAT_DIALOG_DATA]
42
- }] }, { type: i2.webRtcProvider }]; } });
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi1tb2JpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2RpYWxvZ3MvY29tcG9uZW50cy9zY2FuLW1vYmlsZS9zY2FuLW1vYmlsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvZGlhbG9ncy9jb21wb25lbnRzL3NjYW4tbW9iaWxlL3NjYW4tbW9iaWxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWlCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7QUFTekUsTUFBTSxPQUFPLG1CQUFtQjtJQUc5QixZQUNTLFNBQTRDLEVBQ25CLElBQVMsRUFDakMsV0FBMkI7UUFGNUIsY0FBUyxHQUFULFNBQVMsQ0FBbUM7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7SUFDbEMsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDaEMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBTTdCLENBQUMsRUFBRSxzREFBc0Q7UUFDekQsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsbUVBQW1FO1FBQ25HLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsMERBQTBEO1NBQ3pGLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyw2QkFBNkIsQ0FBQztRQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxhQUFhLENBQUM7SUFDbkMsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxNQUFNLEtBQUksQ0FBQzs7Z0hBaENBLG1CQUFtQiw4Q0FLcEIsZUFBZTtvR0FMZCxtQkFBbUIsdURDVmhDLCt3Q0E0Q0E7MkZEbENhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7OzBCQVN4QixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyB3ZWJSdGNQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL3Byb3ZpZGVycy93ZWJydGMucHJvdmlkZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2Nhbi1tb2JpbGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2Nhbi1tb2JpbGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY2FuLW1vYmlsZS5jb21wb25lbnQuc2NzcycsICcuLy4uLy4uL3Njc3MvZGlhbG9nLnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU2Nhbk1vYmlsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvZGU6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8U2Nhbk1vYmlsZUNvbXBvbmVudD4sXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXG4gICAgcHJpdmF0ZSBydGNQcm92aWRlcjogd2ViUnRjUHJvdmlkZXJcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucnRjUHJvdmlkZXIuc2V0dXAoKTtcblxuICAgIHRoaXMucnRjUHJvdmlkZXIuc3ViamVjdC5zdWJzY3JpYmUoXG4gICAgICAobXNnOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tNU0ddJyArIG1zZyk7XG5cblxuXG5cblxuICAgICAgfSwgLy8gQ2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGEgbWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICAoZXJyOiBhbnkpID0+IGNvbnNvbGUubG9nKGVyciksIC8vIENhbGxlZCBpZiBhdCBhbnkgcG9pbnQgV2ViU29ja2V0IEFQSSBzaWduYWxzIHNvbWUga2luZCBvZiBlcnJvci5cbiAgICAgICgpID0+IGNvbnNvbGUubG9nKCdjb21wbGV0ZScpIC8vIENhbGxlZCB3aGVuIGNvbm5lY3Rpb24gaXMgY2xvc2VkIChmb3Igd2hhdGV2ZXIgcmVhc29uKS5cbiAgICApO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuZGF0YSk7XG4gICAgY29uc3QgcGF0aCA9ICdodHRwczovLzE5Mi4xNjguMS4xMDQ6NDIwMC8nO1xuICAgIHRoaXMuY29kZSA9IHBhdGggKyAnbW9iaWxlP2lkPTEnO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxuICBhY3Rpb24oKSB7fVxufVxuIiwiPGhlYWRlciBjbGFzcz1cInBhZ2UtaGVhZGVyXCIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ0aXRsZVwiIG5nQ2xhc3MubHQtc209XCJ0aXRsZS1zbWFsbFwiPlxuICAgIFNlbmQgdG8gbW9iaWxlXG5cbiAgICA8IS0tIHt7IGRhdGEudGV4dC5zdGF0dXNUZXh0IH19IHt7IGRhdGEudGV4dC5zdGF0dXMgfX0gLS0+XG4gIDwvZGl2PlxuXG4gIDxzcGFuIGZ4RmxleD48L3NwYW4+XG5cbiAgPCEtLSA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yXCI+PC9kaXY+XG5cbiAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+IC0tPlxuICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTE2XCIgc3R5bGU9XCJjb2xvcjojODg4O1wiPmluZm9fb3V0bGluZTwvbWF0LWljb24+IC0tPlxuPC9oZWFkZXI+XG5cbjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiPlxuICA8IS0tIDxpbWdcbiAgICBzdHlsZT1cImhlaWdodDogMjQwcHg7IG1hcmdpbjogMzRweCAwcHg7ZGlzcGxheTogbm9uZTtcIlxuICAgIFtzcmNdPVwiJy9hc3NldHMvaW1hZ2VzL2lsbHVzdHJhdGlvbnMvJyArIGltYWdlc1t0eXBlXVwiXG4gIC8+IC0tPlxuICA8IS0tIDxpbWcgc3R5bGU9XCJ3aWR0aDo2MHB4O1wiIHNyYz1cIi9hc3NldHMvaW1hZ2VzL2lsbHVzdHJhdGlvbnMvZG9vci1sb2NrLnBuZ1wiPiAtLT5cblxuPHFyY29kZSBbcXJkYXRhXT1cImNvZGVcIiBbd2lkdGhdPVwiMjU2XCIgW2Vycm9yQ29ycmVjdGlvbkxldmVsXT1cIidNJ1wiPjwvcXJjb2RlPlxuXG5cbjwvZGl2PlxuXG48IS0tICAtLT5cblxuPGZvb3Rlcj5cbiAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCI+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xvc2UoKVwiIG1hdC1yYWlzZWQtYnV0dG9uPlxuICAgICAge3sgXCJjb3JlLnBhZ2UuY2FuY2VsXCIgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cblxuICAgIDxidXR0b24gKGNsaWNrKT1cImFjdGlvbigpXCIgY29sb3I9XCJhY2NlbnRcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cbiAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgIHt7IFwiY29yZS5wYWdlLm9rXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9vdGVyPlxuIl19