@cleavelandprice/ngx-lib 3.11.0 → 3.11.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.
- package/active-directory/gui/components/user-chooser/user-chooser.component.d.ts +4 -6
- package/active-directory/gui/components/user-form-field/user-form-field.component.d.ts +2 -4
- package/active-directory/services/active-directory.service.d.ts +1 -4
- package/authentication/object/services/authentication.service.d.ts +2 -4
- package/authentication/token/gui/components/login/login.component.d.ts +0 -2
- package/authentication/token/gui/components/login-form/login-form.component.d.ts +4 -4
- package/authentication/token/gui/services/authentication.service.d.ts +2 -3
- package/authentication/token/services/authentication.service.d.ts +1 -1
- package/dialog/components/choice/choice.component.d.ts +1 -2
- package/dialog/components/confirmation/confirmation.component.d.ts +1 -2
- package/dialog/components/input/input.component.d.ts +1 -2
- package/dialog/components/message/message.component.d.ts +1 -2
- package/esm2022/active-directory/gui/components/user-chooser/user-chooser.component.mjs +30 -28
- package/esm2022/active-directory/gui/components/user-form-field/user-form-field.component.mjs +28 -26
- package/esm2022/active-directory/services/active-directory.service.mjs +29 -34
- package/esm2022/authentication/object/services/authentication.service.mjs +20 -18
- package/esm2022/authentication/token/gui/components/login/login.component.mjs +13 -12
- package/esm2022/authentication/token/gui/components/login-form/login-form.component.mjs +21 -20
- package/esm2022/authentication/token/gui/services/authentication.service.mjs +9 -7
- package/esm2022/authentication/token/services/authentication.service.mjs +12 -8
- package/esm2022/dialog/components/choice/choice.component.mjs +12 -14
- package/esm2022/dialog/components/confirmation/confirmation.component.mjs +12 -14
- package/esm2022/dialog/components/input/input.component.mjs +12 -14
- package/esm2022/dialog/components/message/message.component.mjs +12 -14
- package/esm2022/lib/services/app-path-config.service.mjs +9 -12
- package/esm2022/quill/components/editor/editor.component.mjs +2 -2
- package/esm2022/quill/components/raw/raw.component.mjs +6 -9
- package/esm2022/sharepoint/components/employee-photo/employee-photo.component.mjs +10 -10
- package/esm2022/sharepoint/pipes/employee-photo-url.pipe.mjs +8 -8
- package/esm2022/sharepoint/services/sharepoint.service.mjs +41 -40
- package/esm2022/upload/components/upload/upload.component.mjs +13 -11
- package/esm2022/upload/components/upload-dialog/upload-dialog.component.mjs +16 -14
- package/esm2022/upload/services/upload.service.mjs +10 -13
- package/esm2022/url-utilities/pipes/safe-resource-url.pipe.mjs +7 -7
- package/esm2022/url-utilities/pipes/safe-url.pipe.mjs +7 -7
- package/fesm2022/cleavelandprice-ngx-lib-active-directory-gui.mjs +44 -41
- package/fesm2022/cleavelandprice-ngx-lib-active-directory-gui.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs +28 -32
- package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs +19 -16
- package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-token-gui.mjs +33 -29
- package/fesm2022/cleavelandprice-ngx-lib-authentication-token-gui.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs +11 -7
- package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs +32 -36
- package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-quill.mjs +5 -8
- package/fesm2022/cleavelandprice-ngx-lib-quill.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs +50 -48
- package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-upload.mjs +30 -29
- package/fesm2022/cleavelandprice-ngx-lib-upload.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs +10 -10
- package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib.mjs +8 -10
- package/fesm2022/cleavelandprice-ngx-lib.mjs.map +1 -1
- package/lib/services/app-path-config.service.d.ts +2 -4
- package/package.json +7 -7
- package/quill/components/editor/editor.component.d.ts +1 -1
- package/quill/components/raw/raw.component.d.ts +0 -1
- package/sharepoint/components/employee-photo/employee-photo.component.d.ts +1 -2
- package/sharepoint/pipes/employee-photo-url.pipe.d.ts +0 -2
- package/sharepoint/services/sharepoint.service.d.ts +3 -5
- package/upload/components/upload/upload.component.d.ts +1 -2
- package/upload/components/upload-dialog/upload-dialog.component.d.ts +1 -2
- package/upload/services/upload.service.d.ts +2 -4
- package/url-utilities/pipes/safe-resource-url.pipe.d.ts +1 -2
- package/url-utilities/pipes/safe-url.pipe.d.ts +1 -2
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AfterViewChecked, ElementRef, OnInit } from '@angular/core';
|
|
2
2
|
import { FormControl, FormGroup } from '@angular/forms';
|
|
3
|
-
import { MatDialogRef } from '@angular/material/dialog';
|
|
4
3
|
import { MatListOption, MatSelectionList } from '@angular/material/list';
|
|
5
4
|
import { MatTableDataSource } from '@angular/material/table';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { Group } from '@cleavelandprice/ngx-lib/active-directory';
|
|
6
|
+
import { PhotoItem } from '@cleavelandprice/ngx-lib/sharepoint';
|
|
8
7
|
import { SelectableGroup } from '../../model/selectable-group';
|
|
9
8
|
import { SelectableUser } from '../../model/selectable-user';
|
|
10
9
|
import { UserChooserData } from '../../model/user-chooser-data';
|
|
@@ -16,7 +15,6 @@ export declare class UserChooserComponent implements OnInit, AfterViewChecked {
|
|
|
16
15
|
private sharePointService;
|
|
17
16
|
selectionList: MatSelectionList | undefined;
|
|
18
17
|
filterInput: ElementRef | undefined;
|
|
19
|
-
filterInputFocused: boolean;
|
|
20
18
|
filterForm: FormGroup<{
|
|
21
19
|
filter: FormControl<any>;
|
|
22
20
|
}>;
|
|
@@ -28,7 +26,7 @@ export declare class UserChooserComponent implements OnInit, AfterViewChecked {
|
|
|
28
26
|
get selectedUsers(): (SelectableUser | SelectableGroup)[];
|
|
29
27
|
get filterValue(): string;
|
|
30
28
|
get adGroupsNeeded(): boolean;
|
|
31
|
-
constructor(data: UserChooserData
|
|
29
|
+
constructor(data: UserChooserData);
|
|
32
30
|
ngOnInit(): void;
|
|
33
31
|
ngAfterViewChecked(): void;
|
|
34
32
|
listSelectionChanged(options: MatListOption[]): void;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';
|
|
2
|
+
import { User, UserOrGroup } from '@cleavelandprice/ngx-lib/active-directory';
|
|
3
|
+
import { PhotoItem } from '@cleavelandprice/ngx-lib/sharepoint';
|
|
5
4
|
import { UserChooserData } from '../../model/user-chooser-data';
|
|
6
5
|
import * as i0 from "@angular/core";
|
|
7
6
|
export declare class UserFormFieldComponent implements OnInit {
|
|
@@ -17,7 +16,6 @@ export declare class UserFormFieldComponent implements OnInit {
|
|
|
17
16
|
users: User[] | undefined;
|
|
18
17
|
groups: UserOrGroup[] | undefined;
|
|
19
18
|
photos: PhotoItem[] | undefined;
|
|
20
|
-
constructor(dialog: MatDialog, activeDirectoryService: ActiveDirectoryService, sharePointService: SharePointService);
|
|
21
19
|
ngOnInit(): void;
|
|
22
20
|
selectUser(): void;
|
|
23
21
|
unSelectUser(accountName: string): void;
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
3
2
|
import { ADObject } from '../model/ad-object';
|
|
4
3
|
import { ADObjectWithChildren } from '../model/ad-object-with-children';
|
|
5
4
|
import { CleavelandPriceUser } from '../model/cleaveland-price-user';
|
|
6
5
|
import { Group } from '../model/group';
|
|
7
|
-
import { ServiceConfig } from '../model/service-config';
|
|
8
6
|
import { User } from '../model/user';
|
|
9
7
|
import * as i0 from "@angular/core";
|
|
10
8
|
export declare class ActiveDirectoryService {
|
|
@@ -13,7 +11,6 @@ export declare class ActiveDirectoryService {
|
|
|
13
11
|
private cache;
|
|
14
12
|
private defaultCacheLifeMinutes;
|
|
15
13
|
private get cacheExpired();
|
|
16
|
-
constructor(config: ServiceConfig, http: HttpClient);
|
|
17
14
|
getUsers(includePhoto?: boolean, includeDisabled?: boolean, parentOU?: string): Observable<CleavelandPriceUser[]>;
|
|
18
15
|
getUser(accountName: string, includePhoto?: boolean): Observable<CleavelandPriceUser>;
|
|
19
16
|
clearCache(): void;
|
|
@@ -27,6 +24,6 @@ export declare class ActiveDirectoryService {
|
|
|
27
24
|
getComputers(includeDisabled?: boolean, parentOU?: string): Observable<User[]>;
|
|
28
25
|
getServers(includeDisabled?: boolean, parentOU?: string): Observable<User[]>;
|
|
29
26
|
getWorkstations(includeDisabled?: boolean, parentOU?: string): Observable<User[]>;
|
|
30
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ActiveDirectoryService,
|
|
27
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ActiveDirectoryService, never>;
|
|
31
28
|
static ɵprov: i0.ɵɵInjectableDeclaration<ActiveDirectoryService>;
|
|
32
29
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from '@angular/core';
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
2
|
import { User } from '@cleavelandprice/ngx-lib/active-directory';
|
|
4
3
|
import { AbstractAuthenticationService, AuthenticatedUser } from '@cleavelandprice/ngx-lib/authentication';
|
|
5
|
-
import { ServiceConfig } from '../model/service-config';
|
|
6
4
|
import * as i0 from "@angular/core";
|
|
7
5
|
export declare class AuthenticationService implements AbstractAuthenticationService {
|
|
8
6
|
private config;
|
|
@@ -15,11 +13,11 @@ export declare class AuthenticationService implements AbstractAuthenticationServ
|
|
|
15
13
|
authenticatedUser: AuthenticatedUser | undefined;
|
|
16
14
|
get useSessionStorage(): boolean;
|
|
17
15
|
get storage(): Storage;
|
|
18
|
-
constructor(
|
|
16
|
+
constructor();
|
|
19
17
|
login(username: string, password: string, adminGroup?: string, additionalInfo?: string): void;
|
|
20
18
|
logout(): void;
|
|
21
19
|
validateUser(token: User): void;
|
|
22
20
|
checkForExistingToken(): void;
|
|
23
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AuthenticationService,
|
|
21
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AuthenticationService, never>;
|
|
24
22
|
static ɵprov: i0.ɵɵInjectableDeclaration<AuthenticationService>;
|
|
25
23
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
2
1
|
import { AuthenticationService } from '../../services/authentication.service';
|
|
3
2
|
import * as i0 from "@angular/core";
|
|
4
3
|
export declare class LoginComponent {
|
|
@@ -6,7 +5,6 @@ export declare class LoginComponent {
|
|
|
6
5
|
authenticationService: AuthenticationService;
|
|
7
6
|
adminGroup: string;
|
|
8
7
|
additionalInfo: string;
|
|
9
|
-
constructor(dialog: MatDialog, authenticationService: AuthenticationService);
|
|
10
8
|
login(): void;
|
|
11
9
|
confirmLogout(): void;
|
|
12
10
|
static ɵfac: i0.ɵɵFactoryDeclaration<LoginComponent, never>;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { OnDestroy, OnInit } from '@angular/core';
|
|
2
|
+
import { FormControl, FormGroup } from '@angular/forms';
|
|
3
3
|
import { MatDialogRef } from '@angular/material/dialog';
|
|
4
4
|
import { Subscription } from 'rxjs';
|
|
5
5
|
import { LoginFormData } from '../../model/login-form-data';
|
|
6
6
|
import { AuthenticationService } from '../../services/authentication.service';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
export declare class LoginFormComponent implements OnInit, OnDestroy {
|
|
9
|
-
dialogRef: MatDialogRef<
|
|
9
|
+
dialogRef: MatDialogRef<any, any>;
|
|
10
10
|
authenticationService: AuthenticationService;
|
|
11
11
|
errorMessage: string | undefined;
|
|
12
12
|
authenticatedChangedSubscription: Subscription;
|
|
@@ -17,7 +17,7 @@ export declare class LoginFormComponent implements OnInit, OnDestroy {
|
|
|
17
17
|
adminGroup: FormControl<any>;
|
|
18
18
|
additionalInfo: FormControl<any>;
|
|
19
19
|
}>;
|
|
20
|
-
constructor(data: LoginFormData
|
|
20
|
+
constructor(data: LoginFormData);
|
|
21
21
|
ngOnInit(): void;
|
|
22
22
|
ngOnDestroy(): void;
|
|
23
23
|
authenticate(): void;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';
|
|
3
2
|
import { AuthenticationService as TokenAuthenticationService } from '@cleavelandprice/ngx-lib/authentication/token';
|
|
4
3
|
import { ServiceConfig } from '../model/service-config';
|
|
5
4
|
import * as i0 from "@angular/core";
|
|
@@ -7,9 +6,9 @@ export declare class AuthenticationService extends TokenAuthenticationService {
|
|
|
7
6
|
config: ServiceConfig;
|
|
8
7
|
http: HttpClient;
|
|
9
8
|
private sharePointService;
|
|
10
|
-
constructor(config: ServiceConfig, http: HttpClient
|
|
9
|
+
constructor(config: ServiceConfig, http: HttpClient);
|
|
11
10
|
validateUser(token: string): void;
|
|
12
11
|
private getPhoto;
|
|
13
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AuthenticationService, [{ optional: true; }, null
|
|
12
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AuthenticationService, [{ optional: true; }, null]>;
|
|
14
13
|
static ɵprov: i0.ɵɵInjectableDeclaration<AuthenticationService>;
|
|
15
14
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { EventEmitter } from '@angular/core';
|
|
2
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { EventEmitter } from '@angular/core';
|
|
3
3
|
import { AbstractAuthenticationService, AuthenticatedUser } from '@cleavelandprice/ngx-lib/authentication';
|
|
4
4
|
import { ServiceConfig } from '../model/service-config';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
@@ -4,9 +4,8 @@ import { DialogType } from '../../model/dialog-type';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class ChoiceComponent {
|
|
6
6
|
data: DialogChoiceData;
|
|
7
|
-
dialogRef: MatDialogRef<
|
|
7
|
+
dialogRef: MatDialogRef<any, any>;
|
|
8
8
|
dialogType: DialogType;
|
|
9
|
-
constructor(data: DialogChoiceData, dialogRef: MatDialogRef<ChoiceComponent>);
|
|
10
9
|
static ɵfac: i0.ɵɵFactoryDeclaration<ChoiceComponent, never>;
|
|
11
10
|
static ɵcmp: i0.ɵɵComponentDeclaration<ChoiceComponent, "cp-dialog-choice", never, {}, {}, never, never, false, never>;
|
|
12
11
|
}
|
|
@@ -4,9 +4,8 @@ import { DialogType } from '../../model/dialog-type';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class ConfirmationComponent {
|
|
6
6
|
data: DialogBaseData;
|
|
7
|
-
dialogRef: MatDialogRef<
|
|
7
|
+
dialogRef: MatDialogRef<any, any>;
|
|
8
8
|
dialogType: DialogType;
|
|
9
|
-
constructor(data: DialogBaseData, dialogRef: MatDialogRef<ConfirmationComponent>);
|
|
10
9
|
static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmationComponent, never>;
|
|
11
10
|
static ɵcmp: i0.ɵɵComponentDeclaration<ConfirmationComponent, "cp-dialog-confirmation", never, {}, {}, never, never, false, never>;
|
|
12
11
|
}
|
|
@@ -4,9 +4,8 @@ import { DialogType } from '../../model/dialog-type';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class InputComponent {
|
|
6
6
|
data: DialogBaseData;
|
|
7
|
-
dialogRef: MatDialogRef<
|
|
7
|
+
dialogRef: MatDialogRef<any, any>;
|
|
8
8
|
dialogType: DialogType;
|
|
9
|
-
constructor(data: DialogBaseData, dialogRef: MatDialogRef<InputComponent>);
|
|
10
9
|
static ɵfac: i0.ɵɵFactoryDeclaration<InputComponent, never>;
|
|
11
10
|
static ɵcmp: i0.ɵɵComponentDeclaration<InputComponent, "cp-dialog-input", never, {}, {}, never, never, false, never>;
|
|
12
11
|
}
|
|
@@ -4,9 +4,8 @@ import { DialogType } from '../../model/dialog-type';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class MessageComponent {
|
|
6
6
|
data: DialogBaseData;
|
|
7
|
-
dialogRef: MatDialogRef<
|
|
7
|
+
dialogRef: MatDialogRef<any, any>;
|
|
8
8
|
dialogType: DialogType;
|
|
9
|
-
constructor(data: DialogBaseData, dialogRef: MatDialogRef<MessageComponent>);
|
|
10
9
|
static ɵfac: i0.ɵɵFactoryDeclaration<MessageComponent, never>;
|
|
11
10
|
static ɵcmp: i0.ɵɵComponentDeclaration<MessageComponent, "cp-dialog-message", never, {}, {}, never, never, false, never>;
|
|
12
11
|
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { Component, Inject, ViewChild } from '@angular/core';
|
|
1
|
+
import { Component, Inject, inject, ViewChild } from '@angular/core';
|
|
2
2
|
import { FormControl, FormGroup } from '@angular/forms';
|
|
3
|
-
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
+
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
4
4
|
import { MatSelectionList } from '@angular/material/list';
|
|
5
5
|
import { MatTableDataSource } from '@angular/material/table';
|
|
6
6
|
import { debounceTime, forkJoin, of } from 'rxjs';
|
|
7
|
+
import { ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';
|
|
8
|
+
import { SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';
|
|
7
9
|
import { UserChooserData } from '../../model/user-chooser-data';
|
|
8
10
|
import { UserChooserMode } from '../../public_api';
|
|
9
11
|
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/
|
|
11
|
-
import * as i2 from "@
|
|
12
|
-
import * as i3 from "@
|
|
13
|
-
import * as i4 from "@angular/
|
|
14
|
-
import * as i5 from "@angular/material/
|
|
15
|
-
import * as i6 from "@angular/material/
|
|
16
|
-
import * as i7 from "@angular/material/
|
|
17
|
-
import * as i8 from "@angular/material/
|
|
18
|
-
import * as i9 from "@angular/material/
|
|
19
|
-
import * as i10 from "@angular/material/
|
|
20
|
-
import * as i11 from "
|
|
21
|
-
import * as i12 from "@angular/material/tooltip";
|
|
22
|
-
import * as i13 from "../../model/user-chooser-data";
|
|
12
|
+
import * as i1 from "@angular/forms";
|
|
13
|
+
import * as i2 from "@angular/material/button";
|
|
14
|
+
import * as i3 from "@angular/material/dialog";
|
|
15
|
+
import * as i4 from "@angular/material/form-field";
|
|
16
|
+
import * as i5 from "@angular/material/icon";
|
|
17
|
+
import * as i6 from "@angular/material/input";
|
|
18
|
+
import * as i7 from "@angular/material/list";
|
|
19
|
+
import * as i8 from "@angular/material/progress-spinner";
|
|
20
|
+
import * as i9 from "@angular/material/slide-toggle";
|
|
21
|
+
import * as i10 from "@angular/material/tooltip";
|
|
22
|
+
import * as i11 from "../../model/user-chooser-data";
|
|
23
23
|
export class UserChooserComponent {
|
|
24
24
|
//#endregion
|
|
25
25
|
//#region Properties
|
|
@@ -46,12 +46,14 @@ export class UserChooserComponent {
|
|
|
46
46
|
}
|
|
47
47
|
//#endregion
|
|
48
48
|
//#region Lifecycle
|
|
49
|
-
constructor(data
|
|
49
|
+
constructor(data) {
|
|
50
50
|
this.data = data;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
this.
|
|
54
|
-
this.
|
|
51
|
+
//#region Fields
|
|
52
|
+
//#region Services
|
|
53
|
+
this.dialogRef = inject((MatDialogRef));
|
|
54
|
+
this.activeDirectoryService = inject(ActiveDirectoryService);
|
|
55
|
+
this.sharePointService = inject(SharePointService);
|
|
56
|
+
////filterInputFocused = false;
|
|
55
57
|
this.filterForm = new FormGroup({
|
|
56
58
|
filter: new FormControl()
|
|
57
59
|
});
|
|
@@ -65,11 +67,11 @@ export class UserChooserComponent {
|
|
|
65
67
|
this.listenForFilterChanges();
|
|
66
68
|
}
|
|
67
69
|
ngAfterViewChecked() {
|
|
68
|
-
if (this.filterInputFocused ||
|
|
70
|
+
if ( /*this.filterInputFocused || */!this.filterInput) {
|
|
69
71
|
// Control not ready yet, or it has already been given focus
|
|
70
72
|
return;
|
|
71
73
|
}
|
|
72
|
-
this.filterInputFocused = true;
|
|
74
|
+
////this.filterInputFocused = true;
|
|
73
75
|
this.filterInput?.nativeElement.focus();
|
|
74
76
|
}
|
|
75
77
|
//#endregion
|
|
@@ -380,20 +382,20 @@ export class UserChooserComponent {
|
|
|
380
382
|
.join('\n') :
|
|
381
383
|
'';
|
|
382
384
|
}
|
|
383
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: UserChooserComponent, deps: [{ token: MAT_DIALOG_DATA }
|
|
384
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: UserChooserComponent, selector: "ng-component", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }], ngImport: i0, template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div id=\"num-selected\">\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n @if (
|
|
385
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: UserChooserComponent, deps: [{ token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
386
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: UserChooserComponent, selector: "ng-component", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }], ngImport: i0, template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div id=\"num-selected\">\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n @if (dataSource && photos) {\n <form [formGroup]=\"filterForm\">\n @if (dataSource) {\n <mat-form-field>\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n @if (filterForm.value.filter) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n }\n </mat-form-field>\n }\n </form>\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n @for (user of dataSource?.filteredData; track user) {\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n @if (getPhoto(user)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\n } @else {\n <mat-icon matListItemAvatar class=\"no-photo\"\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\">\n </mat-icon>\n }\n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n @if (isUser(user) && data.showPhone && castUser(user).telephoneNumber) {\n <div>{{ castUser(user).telephoneNumber }}</div>\n }\n </div>\n @if (isUser(user)) {\n <div>{{ castUser(user).department }}</div>\n <div class=\"title\">{{ castUser(user).title }}</div>\n }\n </div>\n </mat-list-option>\n }\n </mat-selection-list>\n } @else {\n <div>\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (dataSource && photos) {\n @if (selectedOptions.length) {\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n }\n @if (isMultiMode) {\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n >\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n }\n @if (isMultiMode && selectedOptions.length) {\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n >\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n }\n @if (isMultiMode || !data.closeWhenSelectionMade) {\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n }\n }\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}#num-selected{margin:1em 1em 0 0}mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i3.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i7.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: i7.MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i9.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
|
|
385
387
|
}
|
|
386
388
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: UserChooserComponent, decorators: [{
|
|
387
389
|
type: Component,
|
|
388
|
-
args: [{ template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div id=\"num-selected\">\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n @if (
|
|
389
|
-
}], ctorParameters: () => [{ type:
|
|
390
|
+
args: [{ template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div id=\"num-selected\">\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n @if (dataSource && photos) {\n <form [formGroup]=\"filterForm\">\n @if (dataSource) {\n <mat-form-field>\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n @if (filterForm.value.filter) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n }\n </mat-form-field>\n }\n </form>\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n @for (user of dataSource?.filteredData; track user) {\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n @if (getPhoto(user)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\n } @else {\n <mat-icon matListItemAvatar class=\"no-photo\"\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\">\n </mat-icon>\n }\n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n @if (isUser(user) && data.showPhone && castUser(user).telephoneNumber) {\n <div>{{ castUser(user).telephoneNumber }}</div>\n }\n </div>\n @if (isUser(user)) {\n <div>{{ castUser(user).department }}</div>\n <div class=\"title\">{{ castUser(user).title }}</div>\n }\n </div>\n </mat-list-option>\n }\n </mat-selection-list>\n } @else {\n <div>\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (dataSource && photos) {\n @if (selectedOptions.length) {\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n }\n @if (isMultiMode) {\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n >\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n }\n @if (isMultiMode && selectedOptions.length) {\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n >\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n }\n @if (isMultiMode || !data.closeWhenSelectionMade) {\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n }\n }\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}#num-selected{margin:1em 1em 0 0}mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"] }]
|
|
391
|
+
}], ctorParameters: () => [{ type: i11.UserChooserData, decorators: [{
|
|
390
392
|
type: Inject,
|
|
391
393
|
args: [MAT_DIALOG_DATA]
|
|
392
|
-
}] }
|
|
394
|
+
}] }], propDecorators: { selectionList: [{
|
|
393
395
|
type: ViewChild,
|
|
394
396
|
args: [MatSelectionList]
|
|
395
397
|
}], filterInput: [{
|
|
396
398
|
type: ViewChild,
|
|
397
399
|
args: ['filterInput']
|
|
398
400
|
}] } });
|
|
399
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvZ3VpL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeS9ndWkvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFnQixlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQWlCLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVNuRCxNQUFNLE9BQU8sb0JBQW9CO0lBYS9CLFlBQVk7SUFFWixvQkFBb0I7SUFDcEIsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsUUFBUSxDQUFD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QUFDLElBQUksQ0FBQyxVQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBc0M7UUFDNUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFFBQVE7aUJBQ1YsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQ2IsSUFBSSxDQUFDLE1BQU07Z0JBQ1QsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDYixLQUFLLENBQUMsaUJBQWlCLEtBQUssT0FBTyxDQUNwQyxFQUFFLElBQUksQ0FDUjtpQkFDQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFFLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQixFQUFFLENBQUM7SUFDUCxDQUFDOzhHQXJjVSxvQkFBb0Isa0JBNENYLGVBQWU7a0dBNUN4QixvQkFBb0IsbUdBRXBCLGdCQUFnQiw2SUN4QjdCLDA0R0E4RnFCOzsyRkR4RVIsb0JBQW9CO2tCQVBoQyxTQUFTOzs7MEJBbURLLE1BQU07MkJBQUMsZUFBZTt5SUExQ04sYUFBYTtzQkFBekMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0QsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkLCBBZnRlclZpZXdDaGVja2VkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0TGlzdE9wdGlvbiwgTWF0U2VsZWN0aW9uTGlzdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xpc3QnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQWN0aXZlRGlyZWN0b3J5U2VydmljZSwgR3JvdXAgfSBmcm9tICdAY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeSc7XG5pbXBvcnQgeyBTaGFyZVBvaW50U2VydmljZSwgUGhvdG9JdGVtIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL3NoYXJlcG9pbnQnO1xuXG5pbXBvcnQgeyBTZWxlY3RhYmxlR3JvdXAgfSBmcm9tICcuLi8uLi9tb2RlbC9zZWxlY3RhYmxlLWdyb3VwJztcbmltcG9ydCB7IFNlbGVjdGFibGVVc2VyIH0gZnJvbSAnLi4vLi4vbW9kZWwvc2VsZWN0YWJsZS11c2VyJztcbmltcG9ydCB7IFVzZXJDaG9vc2VyRGF0YSB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXItY2hvb3Nlci1kYXRhJztcbmltcG9ydCB7IFVzZXJDaG9vc2VyTW9kZSB9IGZyb20gJy4uLy4uL3B1YmxpY19hcGknO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItY2hvb3Nlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW1xuICAgICcuL3VzZXItY2hvb3Nlci5jb21wb25lbnQuY3NzJyxcbiAgICAnLi4vLi4vLi4vLi4vLi4vc3R5bGVzL21hdC1pY29uLmNzcydcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBVc2VyQ2hvb3NlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG4gIC8vI3JlZ2lvbiBGaWVsZHNcbiAgQFZpZXdDaGlsZChNYXRTZWxlY3Rpb25MaXN0KSBzZWxlY3Rpb25MaXN0OiBNYXRTZWxlY3Rpb25MaXN0IHwgdW5kZWZpbmVkO1xuICBAVmlld0NoaWxkKCdmaWx0ZXJJbnB1dCcpIGZpbHRlcklucHV0OiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuICBmaWx0ZXJJbnB1dEZvY3VzZWQgPSBmYWxzZTtcblxuICBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgZmlsdGVyOiBuZXcgRm9ybUNvbnRyb2woKVxuICB9KTtcblxuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8U2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXA+IHwgdW5kZWZpbmVkO1xuICBwaG90b3M6IFBob3RvSXRlbVtdIHwgdW5kZWZpbmVkO1xuICBncm91cHM6IEdyb3VwW10gfCB1bmRlZmluZWQ7IC8vIE1heSBvciBtYXkgbm90IGdldCBwb3B1bGF0ZWQsIGRlcGVuZGluZyBvbiBjb25maWcgZGF0YSBzZW50IGluXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBQcm9wZXJ0aWVzXG4gIGdldCBpc011bHRpTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5NdWx0aXBsZTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZE9wdGlvbnMoKTogTWF0TGlzdE9wdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25MaXN0Py5vcHRpb25zLmZpbHRlcihvID0+IG8uc2VsZWN0ZWQpID8/IFtdO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkVXNlcnMoKTogKFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5kYXRhPy5maWx0ZXIoZCA9PiBkLnNlbGVjdGVkKSA/PyBbXTtcbiAgfVxuXG4gIGdldCBmaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckZvcm0udmFsdWUuZmlsdGVyO1xuICB9XG5cbiAgZ2V0IGFkR3JvdXBzTmVlZGVkKCk6IGJvb2xlYW4ge1xuICAgIC8vIElmIGFueSBhcmUgdGhlc2UgYXJlIHRydWUsIHRoZW4gd2UgbmVlZCB0byBwdWxsIEFEIGdyb3VwcyBmb3IgdXNlIGxhdGVyXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgfHxcbiAgICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLmdyb3Vwcy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy5ncm91cHMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy5kYXRhLnByZVNlbGVjdGlvbnMuZ3JvdXBzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJPcHRpb25zLmdyb3VwTWVtYmVyc2hpcCB8fFxuICAgICAgKHRoaXMuZGF0YS5zZWxlY3RhYmxlR3JvdXBOYW1lcz8ubGVuZ3RoID8/IDApID4gMDsgLy8gZGVidWdcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gTGlmZWN5Y2xlXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogVXNlckNob29zZXJEYXRhLFxuICAgICAgICAgICAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFVzZXJDaG9vc2VyQ29tcG9uZW50PixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhY3RpdmVEaXJlY3RvcnlTZXJ2aWNlOiBBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHNoYXJlUG9pbnRTZXJ2aWNlOiBTaGFyZVBvaW50U2VydmljZSkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0ge1xuICAgICAgICAgICAgICAgICAgLi4ubmV3IFVzZXJDaG9vc2VyRGF0YSgpLFxuICAgICAgICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0RGF0YSgpO1xuICAgIHRoaXMubGlzdGVuRm9yRmlsdGVyQ2hhbmdlcygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbHRlcklucHV0Rm9jdXNlZCB8fCAhdGhpcy5maWx0ZXJJbnB1dCkge1xuICAgICAgLy8gQ29udHJvbCBub3QgcmVhZHkgeWV0LCBvciBpdCBoYXMgYWxyZWFkeSBiZWVuIGdpdmVuIGZvY3VzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJJbnB1dEZvY3VzZWQgPSB0cnVlO1xuICAgIHRoaXMuZmlsdGVySW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gRXZlbnRzXG4gICBsaXN0U2VsZWN0aW9uQ2hhbmdlZChvcHRpb25zOiBNYXRMaXN0T3B0aW9uW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5TaW5nbGUgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCAmJlxuICAgICAgdGhpcy5kYXRhLmNsb3NlV2hlblNlbGVjdGlvbk1hZGVcbiAgICAgICkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9wdGlvblNlbGVjdGlvbkNoYW5nZWQob3B0aW9uOiBNYXRMaXN0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZGF0YVNvdXJjZT8uZGF0YVxuICAgICAgLmZpbmQodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IChvcHRpb24udmFsdWUgYXMgU2VsZWN0YWJsZVVzZXIpLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHVzZXIuc2VsZWN0ZWQgPSBvcHRpb24uc2VsZWN0ZWQ7XG4gICAgfVxuICB9XG5cbiAgaGlkZVVuc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnNldFZhbHVlKHNlbGVjdGVkID8gJ3tzZWxlY3RlZDp0cnVlfScgOiBudWxsKTtcbiAgfVxuXG4gIHNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkxpc3Q/LnNlbGVjdEFsbCgpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTGlzdD8ub3B0aW9ucykge1xuICAgICAgdGhpcy5saXN0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzLnNlbGVjdGlvbkxpc3Q/Lm9wdGlvbnMudG9BcnJheSgpKTtcbiAgICB9XG4gIH1cblxuICBkZXNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkxpc3Q/LmRlc2VsZWN0QWxsKCk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFV0aWxpdGllc1xuICBpc1VzZXIodXNlck9yR3JvdXA6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICd0aXRsZScgaW4gdXNlck9yR3JvdXA7XG4gIH1cbiAgY2FzdFVzZXIodXNlck9yR3JvdXA6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogU2VsZWN0YWJsZVVzZXIge1xuICAgIHJldHVybiB1c2VyT3JHcm91cCBhcyBTZWxlY3RhYmxlVXNlcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhT2JzZXJ2YWJsZXM6IE9ic2VydmFibGU8YW55PltdID0gW1xuICAgICAgdGhpcy5kYXRhLnVzZXJzID9cbiAgICAgICAgLy8gVXNlcnMgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy5kYXRhLnVzZXJzKSA6XG4gICAgICAgIC8vIFVzZXJzIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIHRoaXMuYWN0aXZlRGlyZWN0b3J5U2VydmljZS5nZXRVc2VycyhmYWxzZSwgdGhpcy5kYXRhLmluY2x1ZGVEaXNhYmxlZFVzZXJzLCB0aGlzLmRhdGEucGFyZW50T3UpLFxuXG4gICAgICB0aGlzLmRhdGEucGhvdG9zID9cbiAgICAgICAgLy8gUGhvdG9zIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuZGF0YS5waG90b3MpIDpcbiAgICAgICAgLy8gUGhvdG9zIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIHRoaXMuc2hhcmVQb2ludFNlcnZpY2UuZ2V0UGhvdG9zKClcbiAgICBdO1xuXG4gICAgLy8gRG8gd2UgbmVlZCBBRCBncm91cHM/XG4gICAgaWYgKHRoaXMuYWRHcm91cHNOZWVkZWQpIHtcbiAgICAgIHRoaXMuZGF0YS5ncm91cHMgP1xuICAgICAgICAvLyBHcm91cHMgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy5kYXRhLmdyb3VwcykgOlxuICAgICAgICAvLyBHcm91cHMgbmVlZCB0byBiZSByZXRyaWV2ZWRcbiAgICAgICAgZGF0YU9ic2VydmFibGVzLnB1c2godGhpcy5hY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLmdldEdyb3VwcygpKTtcbiAgICB9XG5cblxuICAgIGZvcmtKb2luKGRhdGFPYnNlcnZhYmxlcylcbiAgICAgIC8vLnN1YnNjcmliZSgoW3VzZXJzLCBwaG90b3NdKSA9PiB7XG4gICAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAvLyBOZWVkIGdyb3VwcyBpbiBwbGFjZSBiZWZvcmUgd2UgaGFuZGxlIGV4Y2x1c2lvbnMvaW5jbHVzaW9ucy9wcmUtc2VsZWN0aW9uc1xuICAgICAgICB0aGlzLmdyb3VwcyA9IHRoaXMuYWRHcm91cHNOZWVkZWQgPyBkYXRhWzJdIDogbnVsbDtcblxuICAgICAgICBsZXQgdXNlcnMgPSBkYXRhWzBdIGFzIFNlbGVjdGFibGVVc2VyW107XG4gICAgICAgIHVzZXJzLmZvckVhY2godSA9PiB1LnNlbGVjdGVkID0gZmFsc2UpOyAvLyBJbiBjYXNlIGV4aXN0aW5nIGRhdGEgd2FzIHJlLXVzZWRcbiAgICAgICAgdXNlcnMgPSB0aGlzLmluY2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuaW5jbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuaW5jbHVkZVVzZXJzQnlEZXBhcnRtZW50KHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmluY2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIHVzZXJzID0gdGhpcy5leGNsdWRlVXNlcnNCeUFjY291bnROYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmV4Y2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmV4Y2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5leGNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzKTtcblxuICAgICAgICB1c2VycyA9IHRoaXMucHJlU2VsZWN0VXNlcnNCeUFjY291bnROYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLnByZVNlbGVjdFVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMucHJlU2VsZWN0VXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMucHJlU2VsZWN0VXNlcnNCeVRpdGxlKHVzZXJzKTtcblxuICAgICAgICAvLyBkZWJ1Z1xuICAgICAgICBjb25zdCB1c2Vyc0FuZEdyb3VwczogKFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKVtdID0gW1xuICAgICAgICAgIC4uLnVzZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5zZWxlY3RhYmxlR3JvdXBOYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLnNlbGVjdGFibGVHcm91cE5hbWVzXG4gICAgICAgICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzIS5maW5kKGcgPT4gZy5kaXNwbGF5TmFtZSA9PT0gZ3JvdXBOYW1lKTtcblxuICAgICAgICAgICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgICAgICAgICB1c2Vyc0FuZEdyb3Vwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh1c2Vyc0FuZEdyb3Vwcyk7XG4gICAgICBcbiAgICAgICAgdGhpcy5waG90b3MgPSBkYXRhWzFdO1xuXG4gICAgICAgIHRoaXMuc2V0RmlsdGVyUHJlZGljYXRlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFVzZXJzKSB7XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRVc2Vyc1xuICAgICAgLm1hcCh1ID0+IHRoaXMuZGF0YS5yZXR1cm5Vc2VyT2JqZWN0cyA/IHUgOiB1LnNBTUFjY291bnROYW1lKTtcblxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRoaXMuZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuTXVsdGlwbGUgP1xuICAgICAgdmFsdWUgOlxuICAgICAgdmFsdWVbMF1cbiAgICApO1xuICB9XG5cbiAgZ2V0UGhvdG8odXNlcjogU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5pc1VzZXIodXNlcikpIHsgcmV0dXJuOyB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMucGhvdG9zPy5maW5kKHAgPT5cbiAgICAgIChwLmVtcGxveWVlTnVtYmVyICYmIHAuZW1wbG95ZWVOdW1iZXIudG9TdHJpbmcoKSA9PT0gKHVzZXIgYXMgU2VsZWN0YWJsZVVzZXIpLmVtcGxveWVlTnVtYmVyKSB8fFxuICAgICAgcC5hY2NvdW50TmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBwLmRpc3BsYXlOYW1lPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIHAudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk/LmVuY29kZWRBYnNVcmw7XG4gIH1cblxuICAvLyNyZWdpb24gRXhjbHVzaW9ucyAtIHdvbid0IGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhU291cmNlIGF0IGFsbFxuICBwcml2YXRlIGV4Y2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEuZXhjbHVzaW9ucy5hY2NvdW50TmFtZXNcbiAgICAgIC5mb3JFYWNoKGFjY291bnROYW1lID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB1c2Vycy5maW5kSW5kZXgodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gIHByaXZhdGUgZXhjbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEuZXhjbHVzaW9ucy5ncm91cHNcbiAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxuICAgICAgICBcbiAgICAgICAgZ3JvdXAubWVtYmVyLmZvckVhY2goZ3JvdXBNZW1iZXJEbiA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB1c2Vycy5maW5kSW5kZXgodSA9PiB1LmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cE1lbWJlckRuKTtcbiAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gIHByaXZhdGUgZXhjbHVkZVVzZXJzQnlEZXBhcnRtZW50KHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLmV4Y2x1c2lvbnMuZGVwYXJ0bWVudHNcbiAgICAgIC5mb3JFYWNoKGRlcGFydG1lbnQgPT4ge1xuICAgICAgICBjb25zdCBleGNsdWRlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHUgPT4gdS5kZXBhcnRtZW50Py50b0xvd2VyQ2FzZSgpID09PSBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgIGV4Y2x1ZGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmluZGV4T2YodXNlcik7XG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gIHByaXZhdGUgZXhjbHVkZVVzZXJzQnlUaXRsZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLnRpdGxlc1xuICAgICAgLmZvckVhY2godGl0bGUgPT4ge1xuICAgICAgICBjb25zdCBleGNsdWRlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHUgPT4gdS50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gdGl0bGUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIFxuICAgICAgICBleGNsdWRlZFVzZXJzLmZvckVhY2godXNlciA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB1c2Vycy5pbmRleE9mKHVzZXIpO1xuICAgICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEluY2x1c2lvbnMgLSBvbmx5IHRoZXNlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGFTb3VyY2VcbiAgcHJpdmF0ZSBpbmNsdWRlVXNlcnNCeUFjY291bnROYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgcmV0dXJuIHVzZXJzLmZpbHRlcih1c2VyID0+XG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy5hY2NvdW50TmFtZXMubGVuZ3RoID09PSAwIHx8IC8vIE5vIGFjY291bnQgaW5jbHVzaW9ucyBzcGVjaWZpZWRcblxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuYWNjb3VudE5hbWVzLmZpbmQoYWNjb3VudE5hbWUgPT5cbiAgICAgICAgYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdXNlci5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5jbHVkZVVzZXJzQnlEZXBhcnRtZW50KHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgcmV0dXJuIHVzZXJzLmZpbHRlcih1c2VyID0+XG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy5kZXBhcnRtZW50cy5sZW5ndGggPT09IDAgfHwgLy8gTm8gZGVwYXJ0bWVudCBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy5kZXBhcnRtZW50cy5maW5kKGRlcGFydG1lbnQgPT5cbiAgICAgICAgZGVwYXJ0bWVudC50b0xvd2VyQ2FzZSgpID09PSB1c2VyLmRlcGFydG1lbnQ/LnRvTG93ZXJDYXNlKClcbiAgICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgcmV0dXJuIHVzZXJzLmZpbHRlcih1c2VyID0+XG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy50aXRsZXMubGVuZ3RoID09PSAwIHx8IC8vIE5vIHRpdGxlIGluY2x1c2lvbnMgc3BlY2lmaWVkXG5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLnRpdGxlcy5maW5kKHRpdGxlID0+XG4gICAgICAgIHRpdGxlLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIudGl0bGU/LnRvTG93ZXJDYXNlKClcbiAgICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIGlmICghdGhpcy5kYXRhLmluY2x1c2lvbnMuZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVzZXJzOyAvLyBObyBncm91cCBpbmNsdXNpb25zIHNwZWNpZmllZFxuICAgIH1cblxuICAgIC8vIENoZWF0aW5nIGEgYml0IGFuZCBsZXZlcmFnaW5nIHRoZSAnc2VsZWN0ZWQnIHByb3BlcnR5IHRvIGtlZXAgdHJhY2sgb2Ygd2hvIHNob3VsZCBiZSBpbmNsdWRlZFxuICAgIC8vIFNpbmNlIGluY2x1c2lvbnMgaGFwcGVuIGJlZm9yIHByZS1zZWxlY3Rpb25zLCB3ZSBjYW4gZG8gdGhhdCwgYXMgbG9uZyBhcyB3ZSBzZXQgJ3NlbGVjdGVkJyBiYWNrIHRvIGZhbHNlIHdoZW4gd2UncmUgZG9uZVxuICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmdyb3Vwc1xuICAgICAgLmZvckVhY2goZ3JvdXBOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwcz8uZmluZChnID0+IGcubmFtZS50b0xvd2VyQ2FzZSgpID09PSBncm91cE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmICghZ3JvdXApIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdXNlcnNcbiAgICAgICAgICAuZmlsdGVyKHVzZXIgPT5cbiAgICAgICAgICAgICAgZ3JvdXAubWVtYmVyLmZpbmQoZ3JvdXBNZW1iZXJEbiA9PiBncm91cE1lbWJlckRuID09PSB1c2VyLmRpc3Rpbmd1aXNoZWROYW1lKVxuICAgICAgICAgIClcbiAgICAgICAgICAuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSB0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgYWxsIG9mIHRoZSBhcHByb3ByaWF0ZSB1c2VycyBzaG91bGQgaGF2ZSAnc2VsZWN0ZWQnIHNldCB0byB0cnVlXG4gICAgY29uc3Qgc2VsZWN0ZWRVc2VycyA9IHVzZXJzLmZpbHRlcih1c2VyID0+IHVzZXIuc2VsZWN0ZWQpOyAvLyBTdWJzZXQgb2YgdGhlIG9yaWdpbmFsIGxpc3RcbiAgICAvLyBSZXNldCAnc2VsZWN0ZWQnIHRvIGZhbHNlLCBhbmQgcmV0dXJuXG4gICAgc2VsZWN0ZWRVc2Vycy5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IGZhbHNlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRVc2VycztcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gIFByZS1TZWxlY3Rpb25zXG4gIHByaXZhdGUgcHJlU2VsZWN0VXNlcnNCeUFjY291bnROYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLnByZVNlbGVjdGlvbnMuYWNjb3VudE5hbWVzXG4gICAgICAuZm9yRWFjaChhY2NvdW50TmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHUgPT4gdS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSBhY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCF1c2VyKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHVzZXIuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICBwcml2YXRlIHByZVNlbGVjdFVzZXJzQnlEZXBhcnRtZW50KHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLnByZVNlbGVjdGlvbnMuZGVwYXJ0bWVudHNcbiAgICAgIC5mb3JFYWNoKGRlcGFydG1lbnQgPT5cbiAgICAgICAgdXNlcnNcbiAgICAgICAgICAuZmlsdGVyKHUgPT4gdS5kZXBhcnRtZW50Py50b0xvd2VyQ2FzZSgpID09PSBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICBwcml2YXRlIHByZVNlbGVjdFVzZXJzQnlUaXRsZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5wcmVTZWxlY3Rpb25zLnRpdGxlc1xuICAgICAgLmZvckVhY2godGl0bGUgPT5cbiAgICAgICAgdXNlcnNcbiAgICAgICAgICAuZmlsdGVyKHUgPT4gdS50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gdGl0bGUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSB0cnVlKVxuICAgICAgKTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gIHByaXZhdGUgcHJlU2VsZWN0VXNlcnNCeUdyb3VwTmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5wcmVTZWxlY3Rpb25zLmdyb3Vwc1xuICAgICAgLmZvckVhY2goZ3JvdXBOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwcz8uZmluZChnID0+IGcubmFtZS50b0xvd2VyQ2FzZSgpID09PSBncm91cE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmICghZ3JvdXApIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgZ3JvdXAubWVtYmVyLmZvckVhY2goZ3JvdXBNZW1iZXJEbiA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHVzZXJzLmZpbmQodSA9PiB1LmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cE1lbWJlckRuKTtcbiAgICAgICAgICBpZiAoIXVzZXIpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICB1c2VyLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuICAvLyNlbmRyZWdpb25cbiAgXG4gIHByaXZhdGUgc2V0RmlsdGVyUHJlZGljYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9ICh1c2VyOiAoU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApLCBmaWx0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGZpbHRlciA9PT0gJ3tzZWxlY3RlZDp0cnVlfScpIHtcbiAgICAgICAgcmV0dXJuIHVzZXIuc2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoZmlsdGVyLCAnaScpOyAvLyBDYXNlLWluc2Vuc2l0aXZlXG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlOyAvLyBUaGUgZW5kIHJlc3VsdCAtIHdoZXRoZXIgb3Igbm90IGEgZW1wbG95ZWUgbWF0Y2hlcyB0aGUgZmlsdGVyXG5cbiAgICAgICAgY29uc3QgZmlsdGVyUHJvcGVydGllcyA9IFsgJ2Rpc3BsYXlOYW1lJyBdO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMuYWNjb3VudE5hbWUpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3NBTUFjY291bnROYW1lJylcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMudGl0bGUpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3RpdGxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5maWx0ZXJPcHRpb25zLmRlcGFydG1lbnQpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ2RlcGFydG1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMucGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3RlbGVwaG9uZU51bWJlcicpO1xuICAgICAgICB9XG4gIFxuICAgICAgICAvLyBNYXRjaCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIGFib3ZlXG4gICAgICAgIGZpbHRlclByb3BlcnRpZXNcbiAgICAgICAgICAuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodXNlcltmaWVsZF0gJiYgdXNlcltmaWVsZF0ubWF0Y2gocmVnZXgpKSB7XG4gICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgXG4gICAgICAgIC8vIE1hdGNoIG9uIGdyb3VwIG1lbWJlcnNoaXAgKGdyb3VwIG5hbWUpXG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5ncm91cE1lbWJlcnNoaXApIHtcbiAgICAgICAgICB1c2VyLm1lbWJlck9mLmZvckVhY2goZ3JvdXBEbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGdyb3VwID0+IGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuICYmIGdyb3VwLm5hbWUubWF0Y2gocmVnZXgpKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Gb3JGaWx0ZXJDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmRhdGFTb3VyY2UhLmZpbHRlciA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5maWx0ZXI/LnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIHRvb2x0aXAodXNlcjogU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc2hvd0dyb3VwTWVtYmVyc2hpcFRvb2x0aXBzID9cbiAgICAgIHVzZXIubWVtYmVyT2ZcbiAgICAgICAgLm1hcChncm91cERuID0+XG4gICAgICAgICAgdGhpcy5ncm91cHNcbiAgICAgICAgICAgID8uZmluZChncm91cCA9PlxuICAgICAgICAgICAgICBncm91cC5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBEblxuICAgICAgICAgICAgKT8ubmFtZVxuICAgICAgICAgIClcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSEgPiBiISA/IDEgOiAtMSlcbiAgICAgICAgICAuam9pbignXFxuJykgOlxuICAgICAgJyc7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG4iLCI8ZGl2IGlkPVwiZGlhbG9nLXRpdGxlXCI+XG4gIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7IGRhdGEudGl0bGUgfX08L2gyPlxuXG4gIDxkaXYgaWQ9XCJudW0tc2VsZWN0ZWRcIj5cbiAgICB7eyBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoIH19IHNlbGVjdGVkXG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gIEBpZiAoIShkYXRhU291cmNlICYmIHBob3RvcykpIHtcbiAgICA8ZGl2PlxuICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICA8aDIgaWQ9XCJzcGlubmVyLW1lc3NhZ2VcIj5HZXR0aW5nIHVzZXJzIGFuZCBwaG90b3MuLi48L2gyPlxuICAgIDwvZGl2PlxuICB9XG5cbiAgQGlmIChkYXRhU291cmNlICYmIHBob3Rvcykge1xuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiPlxuICAgICAgQGlmIChkYXRhU291cmNlKSB7XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJcIiAjZmlsdGVySW5wdXQ+XG4gICAgICAgICAgQGlmIChmaWx0ZXJGb3JtLnZhbHVlLmZpbHRlcikge1xuICAgICAgICAgICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJDbGVhclwiIChjbGljayk9XCJmaWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnNldFZhbHVlKCcnKVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjbG9zZVwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICB9XG4gICAgPC9mb3JtPlxuICAgIDxtYXQtc2VsZWN0aW9uLWxpc3QgW211bHRpcGxlXT1cImlzTXVsdGlNb2RlXCJcbiAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwibGlzdFNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50Lm9wdGlvbnMpXCI+XG4gICAgICBAZm9yICh1c2VyIG9mIGRhdGFTb3VyY2U/LmZpbHRlcmVkRGF0YTsgdHJhY2sgdXNlcikge1xuICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIFt2YWx1ZV09XCJ1c2VyXCIgW3NlbGVjdGVkXT1cInVzZXIuc2VsZWN0ZWRcIlxuICAgICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvcHRpb25TZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbilcIiAjb3B0aW9uPlxuICAgICAgICAgIEBpZiAoZ2V0UGhvdG8odXNlcikpIHtcbiAgICAgICAgICAgIDxpbWcgbWF0TGlzdEl0ZW1BdmF0YXIgYWx0PVwiXCIgW3NyY109XCJnZXRQaG90byh1c2VyKVwiPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKCFnZXRQaG90byh1c2VyKSkge1xuICAgICAgICAgICAgPG1hdC1pY29uIG1hdExpc3RJdGVtQXZhdGFyIGNsYXNzPVwibm8tcGhvdG9cIlxuICAgICAgICAgICAgICBbZm9udEljb25dPVwiaXNVc2VyKHVzZXIpID8gJ2FjY291bnRfY2lyY2xlJyA6ICdncm91cCdcIj5cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyXCI+XG4gICAgICAgICAgICA8ZGl2IFttYXRUb29sdGlwXT1cInRvb2x0aXAodXNlcilcIiBjbGFzcz1cInVzZXItbmFtZVwiPlxuICAgICAgICAgICAgICB7eyB1c2VyLmRpc3BsYXlOYW1lIH19XG4gICAgICAgICAgICAgIEBpZiAoaXNVc2VyKHVzZXIpICYmIGRhdGEuc2hvd1Bob25lICYmIGNhc3RVc2VyKHVzZXIpLnRlbGVwaG9uZU51bWJlcikge1xuICAgICAgICAgICAgICAgIDxkaXY+e3sgY2FzdFVzZXIodXNlcikudGVsZXBob25lTnVtYmVyIH19PC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmIChpc1VzZXIodXNlcikpIHtcbiAgICAgICAgICAgICAgPGRpdj57eyBjYXN0VXNlcih1c2VyKS5kZXBhcnRtZW50IH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7IGNhc3RVc2VyKHVzZXIpLnRpdGxlIH19PC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWxpc3Qtb3B0aW9uPlxuICAgICAgfVxuICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxuICB9XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgQGlmIChkYXRhU291cmNlICYmIHBob3Rvcykge1xuICAgIEBpZiAoc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgPG1hdC1zbGlkZS10b2dnbGUgKGNoYW5nZSk9XCJoaWRlVW5zZWxlY3RlZENoYW5nZWQoJGV2ZW50LmNoZWNrZWQpXCI+XG4gICAgICAgIEhpZGUgVW5zZWxlY3RlZFxuICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIH1cbiAgICBAaWYgKGlzTXVsdGlNb2RlKSB7XG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWxlY3RBbGwoKVwiXG4gICAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwic2VsZWN0X2FsbFwiPjwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5TZWxlY3QgQWxsPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICAgIEBpZiAoaXNNdWx0aU1vZGUgJiYgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZGVzZWxlY3RBbGwoKVwiXG4gICAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2xlYXJfYWxsXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPkNsZWFyIEFsbDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgICBAaWYgKGlzTXVsdGlNb2RlIHx8ICFkYXRhLmNsb3NlV2hlblNlbGVjdGlvbk1hZGUpIHtcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNsb3NlKClcIiBtYXRUb29sdGlwPVwiQWNjZXB0IHlvdXIgc2VsZWN0aW9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNoZWNrXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPk9rPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICB9XG5cbiAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiBtYXQtZGlhbG9nLWNsb3NlIG1hdFRvb2x0aXA9XCJDbG9zZSB0aGlzIHdpbmRvd1wiPlxuICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsb3NlXCI+PC9tYXQtaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+Q2FuY2VsPC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==
|
|
401
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvZ3VpL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeS9ndWkvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLFNBQVMsRUFBYyxNQUFNLEVBQUUsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFpQixnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5RCxPQUFPLEVBQUUsc0JBQXNCLEVBQVMsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRixPQUFPLEVBQWEsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUluRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBU25ELE1BQU0sT0FB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QUFDLFFBQVEsQ0FBQyxFQUFFLFlBQVk7YUFDeEMsSUFBSSxDQUNILFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FDbEI7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFzQztRQUM1QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUTtpQkFDVixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FDYixJQUFJLENBQUMsTUFBTTtnQkFDVCxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNiLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxPQUFPLENBQ3BDLEVBQUUsSUFBSSxDQUNSO2lCQUNBLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUUsR0FBRyxDQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLEVBQUUsQ0FBQztJQUNQLENBQUM7OEdBdmNVLG9CQUFvQixrQkFpRFgsZUFBZTtrR0FqRHhCLG9CQUFvQixtR0FPcEIsZ0JBQWdCLDZJQzdCN0IsazFHQTJGcUI7OzJGRHJFUixvQkFBb0I7a0JBUGhDLFNBQVM7OzswQkF3REssTUFBTTsyQkFBQyxlQUFlO3lDQTFDTixhQUFhO3NCQUF6QyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDRCxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdDaGVja2VkLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgaW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdExpc3RPcHRpb24sIE1hdFNlbGVjdGlvbkxpc3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9saXN0JztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UsIEdyb3VwIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnknO1xuaW1wb3J0IHsgUGhvdG9JdGVtLCBTaGFyZVBvaW50U2VydmljZSB9IGZyb20gJ0BjbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9zaGFyZXBvaW50JztcblxuaW1wb3J0IHsgU2VsZWN0YWJsZUdyb3VwIH0gZnJvbSAnLi4vLi4vbW9kZWwvc2VsZWN0YWJsZS1ncm91cCc7XG5pbXBvcnQgeyBTZWxlY3RhYmxlVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3NlbGVjdGFibGUtdXNlcic7XG5pbXBvcnQgeyBVc2VyQ2hvb3NlckRhdGEgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyLWNob29zZXItZGF0YSc7XG5pbXBvcnQgeyBVc2VyQ2hvb3Nlck1vZGUgfSBmcm9tICcuLi8uLi9wdWJsaWNfYXBpJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWNob29zZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi91c2VyLWNob29zZXIuY29tcG9uZW50LmNzcycsXG4gICAgJy4uLy4uLy4uLy4uLy4uL3N0eWxlcy9tYXQtaWNvbi5jc3MnXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVXNlckNob29zZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQge1xuICAvLyNyZWdpb24gRmllbGRzXG4gIC8vI3JlZ2lvbiBTZXJ2aWNlc1xuICAgIHByaXZhdGUgZGlhbG9nUmVmID0gaW5qZWN0KE1hdERpYWxvZ1JlZjxVc2VyQ2hvb3NlckNvbXBvbmVudD4pO1xuICBwcml2YXRlIGFjdGl2ZURpcmVjdG9yeVNlcnZpY2UgPSBpbmplY3QoQWN0aXZlRGlyZWN0b3J5U2VydmljZSk7XG4gIHByaXZhdGUgc2hhcmVQb2ludFNlcnZpY2UgPSBpbmplY3QoU2hhcmVQb2ludFNlcnZpY2UpO1xuICAvLyNlbmRyZWdpb25cbiAgQFZpZXdDaGlsZChNYXRTZWxlY3Rpb25MaXN0KSBzZWxlY3Rpb25MaXN0OiBNYXRTZWxlY3Rpb25MaXN0IHwgdW5kZWZpbmVkO1xuICBAVmlld0NoaWxkKCdmaWx0ZXJJbnB1dCcpIGZpbHRlcklucHV0OiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuICAvLy8vZmlsdGVySW5wdXRGb2N1c2VkID0gZmFsc2U7XG5cbiAgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIGZpbHRlcjogbmV3IEZvcm1Db250cm9sKClcbiAgfSk7XG5cbiAgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwPiB8IHVuZGVmaW5lZDtcbiAgcGhvdG9zOiBQaG90b0l0ZW1bXSB8IHVuZGVmaW5lZDtcbiAgZ3JvdXBzOiBHcm91cFtdIHwgdW5kZWZpbmVkOyAvLyBNYXkgb3IgbWF5IG5vdCBnZXQgcG9wdWxhdGVkLCBkZXBlbmRpbmcgb24gY29uZmlnIGRhdGEgc2VudCBpblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHJvcGVydGllc1xuICBnZXQgaXNNdWx0aU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuTXVsdGlwbGU7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRPcHRpb25zKCk6IE1hdExpc3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTGlzdD8ub3B0aW9ucy5maWx0ZXIobyA9PiBvLnNlbGVjdGVkKSA/PyBbXTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZFVzZXJzKCk6IChTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cClbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8uZGF0YT8uZmlsdGVyKGQgPT4gZC5zZWxlY3RlZCkgPz8gW107XG4gIH1cblxuICBnZXQgZmlsdGVyVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLmZpbHRlcjtcbiAgfVxuXG4gIGdldCBhZEdyb3Vwc05lZWRlZCgpOiBib29sZWFuIHtcbiAgICAvLyBJZiBhbnkgYXJlIHRoZXNlIGFyZSB0cnVlLCB0aGVuIHdlIG5lZWQgdG8gcHVsbCBBRCBncm91cHMgZm9yIHVzZSBsYXRlclxuICAgIHJldHVybiB0aGlzLmRhdGEuc2hvd0dyb3VwTWVtYmVyc2hpcFRvb2x0aXBzIHx8XG4gICAgICB0aGlzLmRhdGEuZXhjbHVzaW9ucy5ncm91cHMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuZ3JvdXBzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRoaXMuZGF0YS5wcmVTZWxlY3Rpb25zLmdyb3Vwcy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5ncm91cE1lbWJlcnNoaXAgfHxcbiAgICAgICh0aGlzLmRhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXM/Lmxlbmd0aCA/PyAwKSA+IDA7IC8vIGRlYnVnXG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIExpZmVjeWNsZVxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IFVzZXJDaG9vc2VyRGF0YSkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0ge1xuICAgICAgICAgICAgICAgICAgLi4ubmV3IFVzZXJDaG9vc2VyRGF0YSgpLFxuICAgICAgICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0RGF0YSgpO1xuICAgIHRoaXMubGlzdGVuRm9yRmlsdGVyQ2hhbmdlcygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIGlmICgvKnRoaXMuZmlsdGVySW5wdXRGb2N1c2VkIHx8ICovIXRoaXMuZmlsdGVySW5wdXQpIHtcbiAgICAgIC8vIENvbnRyb2wgbm90IHJlYWR5IHlldCwgb3IgaXQgaGFzIGFscmVhZHkgYmVlbiBnaXZlbiBmb2N1c1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vLy90aGlzLmZpbHRlcklucHV0Rm9jdXNlZCA9IHRydWU7XG4gICAgdGhpcy5maWx0ZXJJbnB1dD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBFdmVudHNcbiAgIGxpc3RTZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbnM6IE1hdExpc3RPcHRpb25bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gVXNlckNob29zZXJNb2RlLlNpbmdsZSAmJlxuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoICYmXG4gICAgICB0aGlzLmRhdGEuY2xvc2VXaGVuU2VsZWN0aW9uTWFkZVxuICAgICAgKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcHRpb246IE1hdExpc3RPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5kYXRhU291cmNlPy5kYXRhXG4gICAgICAuZmluZCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gKG9wdGlvbi52YWx1ZSBhcyBTZWxlY3RhYmxlVXNlcikuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICBpZiAodXNlcikge1xuICAgICAgdXNlci5zZWxlY3RlZCA9IG9wdGlvbi5zZWxlY3RlZDtcbiAgICB9XG4gIH1cblxuICBoaWRlVW5zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8uc2V0VmFsdWUoc2VsZWN0ZWQgPyAne3NlbGVjdGVkOnRydWV9JyA6IG51bGwpO1xuICB9XG5cbiAgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTGlzdD8uc2VsZWN0QWxsKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25MaXN0Py5vcHRpb25zKSB7XG4gICAgICB0aGlzLmxpc3RTZWxlY3Rpb25DaGFuZ2VkKHRoaXMuc2VsZWN0aW9uTGlzdD8ub3B0aW9ucy50b0FycmF5KCkpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTGlzdD8uZGVzZWxlY3RBbGwoKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gVXRpbGl0aWVzXG4gIGlzVXNlcih1c2VyT3JHcm91cDogU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApOiBib29sZWFuIHtcbiAgICByZXR1cm4gJ3RpdGxlJyBpbiB1c2VyT3JHcm91cDtcbiAgfVxuICBjYXN0VXNlcih1c2VyT3JHcm91cDogU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApOiBTZWxlY3RhYmxlVXNlciB7XG4gICAgcmV0dXJuIHVzZXJPckdyb3VwIGFzIFNlbGVjdGFibGVVc2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFPYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxhbnk+W10gPSBbXG4gICAgICB0aGlzLmRhdGEudXNlcnMgP1xuICAgICAgICAvLyBVc2VycyB3ZXJlIHBhc3NlZCBpblxuICAgICAgICBvZih0aGlzLmRhdGEudXNlcnMpIDpcbiAgICAgICAgLy8gVXNlcnMgbmVlZCB0byBiZSByZXRyaWV2ZWRcbiAgICAgICAgdGhpcy5hY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLmdldFVzZXJzKGZhbHNlLCB0aGlzLmRhdGEuaW5jbHVkZURpc2FibGVkVXNlcnMsIHRoaXMuZGF0YS5wYXJlbnRPdSksXG5cbiAgICAgIHRoaXMuZGF0YS5waG90b3MgP1xuICAgICAgICAvLyBQaG90b3Mgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy5kYXRhLnBob3RvcykgOlxuICAgICAgICAvLyBQaG90b3MgbmVlZCB0byBiZSByZXRyaWV2ZWRcbiAgICAgICAgdGhpcy5zaGFyZVBvaW50U2VydmljZS5nZXRQaG90b3MoKVxuICAgIF07XG5cbiAgICAvLyBEbyB3ZSBuZWVkIEFEIGdyb3Vwcz9cbiAgICBpZiAodGhpcy5hZEdyb3Vwc05lZWRlZCkge1xuICAgICAgdGhpcy5kYXRhLmdyb3VwcyA/XG4gICAgICAgIC8vIEdyb3VwcyB3ZXJlIHBhc3NlZCBpblxuICAgICAgICBvZih0aGlzLmRhdGEuZ3JvdXBzKSA6XG4gICAgICAgIC8vIEdyb3VwcyBuZWVkIHRvIGJlIHJldHJpZXZlZFxuICAgICAgICBkYXRhT2JzZXJ2YWJsZXMucHVzaCh0aGlzLmFjdGl2ZURpcmVjdG9yeVNlcnZpY2UuZ2V0R3JvdXBzKCkpO1xuICAgIH1cblxuXG4gICAgZm9ya0pvaW4oZGF0YU9ic2VydmFibGVzKVxuICAgICAgLy8uc3Vic2NyaWJlKChbdXNlcnMsIHBob3Rvc10pID0+IHtcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIC8vIE5lZWQgZ3JvdXBzIGluIHBsYWNlIGJlZm9yZSB3ZSBoYW5kbGUgZXhjbHVzaW9ucy9pbmNsdXNpb25zL3ByZS1zZWxlY3Rpb25zXG4gICAgICAgIHRoaXMuZ3JvdXBzID0gdGhpcy5hZEdyb3Vwc05lZWRlZCA/IGRhdGFbMl0gOiBudWxsO1xuXG4gICAgICAgIGxldCB1c2VycyA9IGRhdGFbMF0gYXMgU2VsZWN0YWJsZVVzZXJbXTtcbiAgICAgICAgdXNlcnMuZm9yRWFjaCh1ID0+IHUuc2VsZWN0ZWQgPSBmYWxzZSk7IC8vIEluIGNhc2UgZXhpc3RpbmcgZGF0YSB3YXMgcmUtdXNlZFxuICAgICAgICB1c2VycyA9IHRoaXMuaW5jbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5pbmNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5pbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuaW5jbHVkZVVzZXJzQnlUaXRsZSh1c2Vycyk7XG5cbiAgICAgICAgdXNlcnMgPSB0aGlzLmV4Y2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuZXhjbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuZXhjbHVkZVVzZXJzQnlEZXBhcnRtZW50KHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmV4Y2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIHVzZXJzID0gdGhpcy5wcmVTZWxlY3RVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMucHJlU2VsZWN0VXNlcnNCeUdyb3VwTmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5wcmVTZWxlY3RVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5wcmVTZWxlY3RVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIC8vIGRlYnVnXG4gICAgICAgIGNvbnN0IHVzZXJzQW5kR3JvdXBzOiAoU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApW10gPSBbXG4gICAgICAgICAgLi4udXNlcnNcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGFibGVHcm91cE5hbWVzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmRhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXNcbiAgICAgICAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHMhLmZpbmQoZyA9PiBnLmRpc3BsYXlOYW1lID09PSBncm91cE5hbWUpO1xuXG4gICAgICAgICAgICAgIGlmIChncm91cCkge1xuICAgICAgICAgICAgICAgIHVzZXJzQW5kR3JvdXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHVzZXJzQW5kR3JvdXBzKTtcbiAgICAgIFxuICAgICAgICB0aGlzLnBob3RvcyA9IGRhdGFbMV07XG5cbiAgICAgICAgdGhpcy5zZXRGaWx0ZXJQcmVkaWNhdGUoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVXNlcnMpIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3RlZFVzZXJzXG4gICAgICAubWFwKHUgPT4gdGhpcy5kYXRhLnJldHVyblVzZXJPYmplY3RzID8gdSA6IHUuc0FNQWNjb3VudE5hbWUpO1xuXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5NdWx0aXBsZSA/XG4gICAgICB2YWx1ZSA6XG4gICAgICB2YWx1ZVswXVxuICAgICk7XG4gIH1cblxuICBnZXRQaG90byh1c2VyOiBTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmlzVXNlcih1c2VyKSkgeyByZXR1cm47IH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5waG90b3M/LmZpbmQocCA9PlxuICAgICAgKHAuZW1wbG95ZWVOdW1iZXIgJiYgcC5lbXBsb3llZU51bWJlci50b1N0cmluZygpID09PSAodXNlciBhcyBTZWxlY3RhYmxlVXNlcikuZW1wbG95ZWVOdW1iZXIpIHx8XG4gICAgICBwLmFjY291bnROYW1lPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIHAuZGlzcGxheU5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgcC50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgKT8uZW5jb2RlZEFic1VybDtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBFeGNsdXNpb25zIC0gd29uJ3QgYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGFTb3VyY2UgYXQgYWxsXG4gIHByaXZhdGUgZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLmFjY291bnROYW1lc1xuICAgICAgLmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmZpbmRJbmRleCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLmdyb3Vwc1xuICAgICAgLmZvckVhY2goZ3JvdXBOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwcz8uZmluZChnID0+IGcubmFtZS50b0xvd2VyQ2FzZSgpID09PSBncm91cE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmICghZ3JvdXApIHsgcmV0dXJuOyB9XG4gICAgICAgIFxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmZpbmRJbmRleCh1ID0+IHUuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwTWVtYmVyRG4pO1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEuZXhjbHVzaW9ucy5kZXBhcnRtZW50c1xuICAgICAgLmZvckVhY2goZGVwYXJ0bWVudCA9PiB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodSA9PiB1LmRlcGFydG1lbnQ/LnRvTG93ZXJDYXNlKCkgPT09IGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgZXhjbHVkZWRVc2Vycy5mb3JFYWNoKHVzZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuaW5kZXhPZih1c2VyKTtcbiAgICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLmV4Y2x1c2lvbnMudGl0bGVzXG4gICAgICAuZm9yRWFjaCh0aXRsZSA9PiB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodSA9PiB1LnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB0aXRsZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgXG4gICAgICAgIGV4Y2x1ZGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmluZGV4T2YodXNlcik7XG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW5jbHVzaW9ucyAtIG9ubHkgdGhlc2Ugd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YVNvdXJjZVxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmFjY291bnROYW1lcy5sZW5ndGggPT09IDAgfHwgLy8gTm8gYWNjb3VudCBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy5hY2NvdW50TmFtZXMuZmluZChhY2NvdW50TmFtZSA9PlxuICAgICAgICBhY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSB1c2VyLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmRlcGFydG1lbnRzLmxlbmd0aCA9PT0gMCB8fCAvLyBObyBkZXBhcnRtZW50IGluY2x1c2lvbnMgc3BlY2lmaWVkXG5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmRlcGFydG1lbnRzLmZpbmQoZGVwYXJ0bWVudCA9PlxuICAgICAgICBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLnRpdGxlcy5sZW5ndGggPT09IDAgfHwgLy8gTm8gdGl0bGUgaW5jbHVzaW9ucyBzcGVjaWZpZWRcblxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMudGl0bGVzLmZpbmQodGl0bGUgPT5cbiAgICAgICAgdGl0bGUudG9Mb3dlckNhc2UoKSA9PT0gdXNlci50aXRsZT8udG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgaWYgKCF0aGlzLmRhdGEuaW5jbHVzaW9ucy5ncm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdXNlcnM7IC8vIE5vIGdyb3VwIGluY2x1c2lvbnMgc3BlY2lmaWVkXG4gICAgfVxuXG4gICAgLy8gQ2hlYXRpbmcgYSBiaXQgYW5kIGxldmVyYWdpbmcgdGhlICdzZWxlY3RlZCcgcHJvcGVydHkgdG8ga2VlcCB0cmFjayBvZiB3aG8gc2hvdWxkIGJlIGluY2x1ZGVkXG4gICAgLy8gU2luY2UgaW5jbHVzaW9ucyBoYXBwZW4gYmVmb3IgcHJlLXNlbGVjdGlvbnMsIHdlIGNhbiBkbyB0aGF0LCBhcyBsb25nIGFzIHdlIHNldCAnc2VsZWN0ZWQnIGJhY2sgdG8gZmFsc2Ugd2hlbiB3ZSdyZSBkb25lXG4gICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cblxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodXNlciA9PlxuICAgICAgICAgICAgICBncm91cC5tZW1iZXIuZmluZChncm91cE1lbWJlckRuID0+IGdyb3VwTWVtYmVyRG4gPT09IHVzZXIuZGlzdGluZ3Vpc2hlZE5hbWUpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAvLyBBdCB0aGlzIHBvaW50LCBhbGwgb2YgdGhlIGFwcHJvcHJpYXRlIHVzZXJzIHNob3VsZCBoYXZlICdzZWxlY3RlZCcgc2V0IHRvIHRydWVcbiAgICBjb25zdCBzZWxlY3RlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHVzZXIgPT4gdXNlci5zZWxlY3RlZCk7IC8vIFN1YnNldCBvZiB0aGUgb3JpZ2luYWwgbGlzdFxuICAgIC8vIFJlc2V0ICdzZWxlY3RlZCcgdG8gZmFsc2UsIGFuZCByZXR1cm5cbiAgICBzZWxlY3RlZFVzZXJzLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gZmFsc2UpO1xuICAgIHJldHVybiBzZWxlY3RlZFVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiAgUHJlLVNlbGVjdGlvbnNcbiAgcHJpdmF0ZSBwcmVTZWxlY3RVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy5hY2NvdW50TmFtZXNcbiAgICAgIC5mb3JFYWNoKGFjY291bnROYW1lID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJzLmZpbmQodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIXVzZXIpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdXNlci5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gIHByaXZhdGUgcHJlU2VsZWN0VXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy5kZXBhcnRtZW50c1xuICAgICAgLmZvckVhY2goZGVwYXJ0bWVudCA9PlxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodSA9PiB1LmRlcGFydG1lbnQ/LnRvTG93ZXJDYXNlKCkgPT09IGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSB0cnVlKVxuICAgICAgKTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gIHByaXZhdGUgcHJlU2VsZWN0VXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLnByZVNlbGVjdGlvbnMudGl0bGVzXG4gICAgICAuZm9yRWFjaCh0aXRsZSA9PlxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodSA9PiB1LnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB0aXRsZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVTZWxlY3RVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLnByZVNlbGVjdGlvbnMuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cblxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1ID0+IHUuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwTWVtYmVyRG4pO1xuICAgICAgICAgIGlmICghdXNlcikgeyByZXR1cm47IH1cblxuICAgICAgICAgIHVzZXIuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICBcbiAgcHJpdmF0ZSBzZXRGaWx0ZXJQcmVkaWNhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlID0gKHVzZXI6IChTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cCksIGZpbHRlcjogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZmlsdGVyID09PSAne3NlbGVjdGVkOnRydWV9Jykge1xuICAgICAgICByZXR1cm4gdXNlci5zZWxlY3RlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChmaWx0ZXIsICdpJyk7IC8vIENhc2UtaW5zZW5zaXRpdmVcbiAgICAgICAgbGV0IG1hdGNoID0gZmFsc2U7IC8vIFRoZSBlbmQgcmVzdWx0IC0gd2hldGhlciBvciBub3QgYSBlbXBsb3llZSBtYXRjaGVzIHRoZSBmaWx0ZXJcblxuICAgICAgICBjb25zdCBmaWx0ZXJQcm9wZXJ0aWVzID0gWyAnZGlzcGxheU5hbWUnIF07XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5hY2NvdW50TmFtZSkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgnc0FNQWNjb3VudE5hbWUnKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy50aXRsZSkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgndGl0bGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMuZGVwYXJ0bWVudCkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgnZGVwYXJ0bWVudCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5waG9uZU51bWJlcikge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgndGVsZXBob25lTnVtYmVyJyk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIC8vIE1hdGNoIG9uIHRoZSBwcm9wZXJ0aWVzIGNvbmZpZ3VyZWQgYWJvdmVcbiAgICAgICAgZmlsdGVyUHJvcGVydGllc1xuICAgICAgICAgIC5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh1c2VyW2ZpZWxkXSAmJiB1c2VyW2ZpZWxkXS5tYXRjaChyZWdleCkpIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICBcbiAgICAgICAgLy8gTWF0Y2ggb24gZ3JvdXAgbWVtYmVyc2hpcCAoZ3JvdXAgbmFtZSlcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5maWx0ZXJPcHRpb25zLmdyb3VwTWVtYmVyc2hpcCkge1xuICAgICAgICAgIHVzZXIubWVtYmVyT2YuZm9yRWFjaChncm91cERuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZ3JvdXAgPT4gZ3JvdXAuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwRG4gJiYgZ3JvdXAubmFtZS5tYXRjaChyZWdleCkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxpc3RlbkZvckZpbHRlckNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgyNTApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGF0YVNvdXJjZSEuZmlsdGVyID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLmZpbHRlcj8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgdG9vbHRpcCh1c2VyOiBTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgP1xuICAgICAgdXNlci5tZW1iZXJPZlxuICAgICAgICAubWFwKGdyb3VwRG4gPT5cbiAgICAgICAgICB0aGlzLmdyb3Vwc1xuICAgICAgICAgICAgPy5maW5kKGdyb3VwID0+XG4gICAgICAgICAgICAgIGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuXG4gICAgICAgICAgICApPy5uYW1lXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhISA+IGIhID8gMSA6IC0xKVxuICAgICAgICAgIC5qb2luKCdcXG4nKSA6XG4gICAgICAnJztcbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiIsIjxkaXYgaWQ9XCJkaWFsb2ctdGl0bGVcIj5cbiAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3sgZGF0YS50aXRsZSB9fTwvaDI+XG5cbiAgPGRpdiBpZD1cIm51bS1zZWxlY3RlZFwiPlxuICAgIHt7IHNlbGVjdGVkT3B0aW9ucy5sZW5ndGggfX0gc2VsZWN0ZWRcbiAgPC9kaXY+XG48L2Rpdj5cblxuPG1hdC1kaWFsb2ctY29udGVudD5cbiAgQGlmIChkYXRhU291cmNlICYmIHBob3Rvcykge1xuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiPlxuICAgICAgQGlmIChkYXRhU291cmNlKSB7XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJcIiAjZmlsdGVySW5wdXQ+XG4gICAgICAgICAgQGlmIChmaWx0ZXJGb3JtLnZhbHVlLmZpbHRlcikge1xuICAgICAgICAgICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJDbGVhclwiIChjbGljayk9XCJmaWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnNldFZhbHVlKCcnKVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjbG9zZVwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICB9XG4gICAgPC9mb3JtPlxuICAgIDxtYXQtc2VsZWN0aW9uLWxpc3QgW211bHRpcGxlXT1cImlzTXVsdGlNb2RlXCJcbiAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwibGlzdFNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50Lm9wdGlvbnMpXCI+XG4gICAgICBAZm9yICh1c2VyIG9mIGRhdGFTb3VyY2U/LmZpbHRlcmVkRGF0YTsgdHJhY2sgdXNlcikge1xuICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIFt2YWx1ZV09XCJ1c2VyXCIgW3NlbGVjdGVkXT1cInVzZXIuc2VsZWN0ZWRcIlxuICAgICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvcHRpb25TZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbilcIiAjb3B0aW9uPlxuICAgICAgICAgIEBpZiAoZ2V0UGhvdG8odXNlcikpIHtcbiAgICAgICAgICAgIDxpbWcgbWF0TGlzdEl0ZW1BdmF0YXIgYWx0PVwiXCIgW3NyY109XCJnZXRQaG90byh1c2VyKVwiPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPG1hdC1pY29uIG1hdExpc3RJdGVtQXZhdGFyIGNsYXNzPVwibm8tcGhvdG9cIlxuICAgICAgICAgICAgICBbZm9udEljb25dPVwiaXNVc2VyKHVzZXIpID8gJ2FjY291bnRfY2lyY2xlJyA6ICdncm91cCdcIj5cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyXCI+XG4gICAgICAgICAgICA8ZGl2IFttYXRUb29sdGlwXT1cInRvb2x0aXAodXNlcilcIiBjbGFzcz1cInVzZXItbmFtZVwiPlxuICAgICAgICAgICAgICB7eyB1c2VyLmRpc3BsYXlOYW1lIH19XG4gICAgICAgICAgICAgIEBpZiAoaXNVc2VyKHVzZXIpICYmIGRhdGEuc2hvd1Bob25lICYmIGNhc3RVc2VyKHVzZXIpLnRlbGVwaG9uZU51bWJlcikge1xuICAgICAgICAgICAgICAgIDxkaXY+e3sgY2FzdFVzZXIodXNlcikudGVsZXBob25lTnVtYmVyIH19PC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmIChpc1VzZXIodXNlcikpIHtcbiAgICAgICAgICAgICAgPGRpdj57eyBjYXN0VXNlcih1c2VyKS5kZXBhcnRtZW50IH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7IGNhc3RVc2VyKHVzZXIpLnRpdGxlIH19PC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWxpc3Qtb3B0aW9uPlxuICAgICAgfVxuICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxuICB9IEBlbHNlIHtcbiAgICA8ZGl2PlxuICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICA8aDIgaWQ9XCJzcGlubmVyLW1lc3NhZ2VcIj5HZXR0aW5nIHVzZXJzIGFuZCBwaG90b3MuLi48L2gyPlxuICAgIDwvZGl2PlxuICB9XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgQGlmIChkYXRhU291cmNlICYmIHBob3Rvcykge1xuICAgIEBpZiAoc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgPG1hdC1zbGlkZS10b2dnbGUgKGNoYW5nZSk9XCJoaWRlVW5zZWxlY3RlZENoYW5nZWQoJGV2ZW50LmNoZWNrZWQpXCI+XG4gICAgICAgIEhpZGUgVW5zZWxlY3RlZFxuICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIH1cbiAgICBAaWYgKGlzTXVsdGlNb2RlKSB7XG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWxlY3RBbGwoKVwiXG4gICAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwic2VsZWN0X2FsbFwiPjwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5TZWxlY3QgQWxsPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICAgIEBpZiAoaXNNdWx0aU1vZGUgJiYgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZGVzZWxlY3RBbGwoKVwiXG4gICAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2xlYXJfYWxsXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPkNsZWFyIEFsbDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgICBAaWYgKGlzTXVsdGlNb2RlIHx8ICFkYXRhLmNsb3NlV2hlblNlbGVjdGlvbk1hZGUpIHtcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNsb3NlKClcIiBtYXRUb29sdGlwPVwiQWNjZXB0IHlvdXIgc2VsZWN0aW9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNoZWNrXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPk9rPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICB9XG5cbiAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiBtYXQtZGlhbG9nLWNsb3NlIG1hdFRvb2x0aXA9XCJDbG9zZSB0aGlzIHdpbmRvd1wiPlxuICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsb3NlXCI+PC9tYXQtaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+Q2FuY2VsPC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==
|