@huntsman-cancer-institute/authentication 12.5.0 → 14.1.0
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/authentication.component.d.ts +1 -1
- package/directlogin.component.d.ts +4 -4
- package/esm2020/authentication.component.mjs +131 -0
- package/esm2020/authentication.module.mjs +105 -0
- package/esm2020/authentication.provider.mjs +36 -0
- package/esm2020/authentication.service.mjs +393 -0
- package/esm2020/authorization.interceptor.mjs +79 -0
- package/esm2020/directlogin.component.mjs +96 -0
- package/esm2020/huntsman-cancer-institute-authentication.mjs +5 -0
- package/esm2020/index.mjs +13 -0
- package/esm2020/route-guard.service.mjs +52 -0
- package/esm2020/timeout-notification.component.mjs +148 -0
- package/fesm2015/huntsman-cancer-institute-authentication.mjs +1000 -0
- package/fesm2015/huntsman-cancer-institute-authentication.mjs.map +1 -0
- package/{fesm2015/huntsman-cancer-institute-authentication.js → fesm2020/huntsman-cancer-institute-authentication.mjs} +64 -189
- package/fesm2020/huntsman-cancer-institute-authentication.mjs.map +1 -0
- package/package.json +26 -18
- package/timeout-notification.component.d.ts +1 -1
- package/CHANGELOG.md +0 -4
- package/bundles/huntsman-cancer-institute-authentication.umd.js +0 -945
- package/bundles/huntsman-cancer-institute-authentication.umd.js.map +0 -1
- package/bundles/huntsman-cancer-institute-authentication.umd.min.js +0 -2
- package/bundles/huntsman-cancer-institute-authentication.umd.min.js.map +0 -1
- package/esm2015/authentication.component.js +0 -153
- package/esm2015/authentication.module.js +0 -107
- package/esm2015/authentication.provider.js +0 -36
- package/esm2015/authentication.service.js +0 -393
- package/esm2015/authorization.interceptor.js +0 -79
- package/esm2015/directlogin.component.js +0 -146
- package/esm2015/huntsman-cancer-institute-authentication.js +0 -5
- package/esm2015/index.js +0 -13
- package/esm2015/route-guard.service.js +0 -52
- package/esm2015/timeout-notification.component.js +0 -205
- package/esm5/authentication.component.js +0 -120
- package/esm5/authentication.module.js +0 -109
- package/esm5/authentication.provider.js +0 -47
- package/esm5/authentication.service.js +0 -411
- package/esm5/authorization.interceptor.js +0 -81
- package/esm5/directlogin.component.js +0 -53
- package/esm5/huntsman-cancer-institute-authentication.js +0 -5
- package/esm5/index.js +0 -13
- package/esm5/route-guard.service.js +0 -55
- package/esm5/timeout-notification.component.js +0 -125
- package/fesm2015/huntsman-cancer-institute-authentication.js.map +0 -1
- package/fesm5/huntsman-cancer-institute-authentication.js +0 -937
- package/fesm5/huntsman-cancer-institute-authentication.js.map +0 -1
- package/huntsman-cancer-institute-authentication.d.ts +0 -5
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary
|
|
3
|
-
*/
|
|
4
|
-
import { NgModule, Optional, SkipSelf } from "@angular/core";
|
|
5
|
-
import { CommonModule } from "@angular/common";
|
|
6
|
-
import { ReactiveFormsModule, FormsModule } from "@angular/forms";
|
|
7
|
-
import { HTTP_INTERCEPTORS, HttpClientModule } from "@angular/common/http";
|
|
8
|
-
import { RouterModule } from "@angular/router";
|
|
9
|
-
import { CoolStorageModule } from "@angular-cool/storage";
|
|
10
|
-
import { JWT_OPTIONS, JwtHelperService, JwtInterceptor, JwtModule } from "@auth0/angular-jwt";
|
|
11
|
-
import { AuthenticationService } from "./authentication.service";
|
|
12
|
-
import { RouteGuardService } from "./route-guard.service";
|
|
13
|
-
import { AuthenticationComponent } from "./authentication.component";
|
|
14
|
-
import { DirectLoginComponent } from "./directlogin.component";
|
|
15
|
-
import { TimeoutNotificationComponent } from "./timeout-notification.component";
|
|
16
|
-
import { AuthorizationInterceptor } from "./authorization.interceptor";
|
|
17
|
-
import { AuthenticationProvider } from "./authentication.provider";
|
|
18
|
-
import * as i0 from "@angular/core";
|
|
19
|
-
import * as i1 from "@auth0/angular-jwt";
|
|
20
|
-
/**
|
|
21
|
-
* Provide a single auth service and interceptor for the implementing application. Also provide everything
|
|
22
|
-
* from the angular-jwt library.
|
|
23
|
-
*
|
|
24
|
-
* @since 1.0.0
|
|
25
|
-
*/
|
|
26
|
-
export class AuthenticationModule {
|
|
27
|
-
constructor(parentModule) {
|
|
28
|
-
if (parentModule) {
|
|
29
|
-
throw new Error("AuthenticationModule is already loaded.");
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
static forRoot() {
|
|
33
|
-
return {
|
|
34
|
-
providers: [
|
|
35
|
-
AuthenticationProvider,
|
|
36
|
-
JwtHelperService,
|
|
37
|
-
AuthenticationService,
|
|
38
|
-
RouteGuardService,
|
|
39
|
-
{
|
|
40
|
-
provide: HTTP_INTERCEPTORS,
|
|
41
|
-
useClass: AuthorizationInterceptor,
|
|
42
|
-
multi: true
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
provide: HTTP_INTERCEPTORS,
|
|
46
|
-
useClass: JwtInterceptor,
|
|
47
|
-
multi: true
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
provide: JWT_OPTIONS,
|
|
51
|
-
useClass: AuthenticationProvider
|
|
52
|
-
}
|
|
53
|
-
],
|
|
54
|
-
ngModule: AuthenticationModule
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
AuthenticationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AuthenticationModule, deps: [{ token: i1.JwtModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule });
|
|
59
|
-
AuthenticationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AuthenticationModule, declarations: [AuthenticationComponent,
|
|
60
|
-
DirectLoginComponent,
|
|
61
|
-
TimeoutNotificationComponent], imports: [CommonModule,
|
|
62
|
-
HttpClientModule,
|
|
63
|
-
//JwtModule,
|
|
64
|
-
RouterModule,
|
|
65
|
-
FormsModule,
|
|
66
|
-
ReactiveFormsModule,
|
|
67
|
-
CoolStorageModule], exports: [AuthenticationComponent,
|
|
68
|
-
DirectLoginComponent,
|
|
69
|
-
TimeoutNotificationComponent] });
|
|
70
|
-
AuthenticationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AuthenticationModule, imports: [[
|
|
71
|
-
CommonModule,
|
|
72
|
-
HttpClientModule,
|
|
73
|
-
//JwtModule,
|
|
74
|
-
RouterModule,
|
|
75
|
-
FormsModule,
|
|
76
|
-
ReactiveFormsModule,
|
|
77
|
-
CoolStorageModule
|
|
78
|
-
]] });
|
|
79
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AuthenticationModule, decorators: [{
|
|
80
|
-
type: NgModule,
|
|
81
|
-
args: [{
|
|
82
|
-
imports: [
|
|
83
|
-
CommonModule,
|
|
84
|
-
HttpClientModule,
|
|
85
|
-
//JwtModule,
|
|
86
|
-
RouterModule,
|
|
87
|
-
FormsModule,
|
|
88
|
-
ReactiveFormsModule,
|
|
89
|
-
CoolStorageModule
|
|
90
|
-
],
|
|
91
|
-
declarations: [
|
|
92
|
-
AuthenticationComponent,
|
|
93
|
-
DirectLoginComponent,
|
|
94
|
-
TimeoutNotificationComponent
|
|
95
|
-
],
|
|
96
|
-
exports: [
|
|
97
|
-
AuthenticationComponent,
|
|
98
|
-
DirectLoginComponent,
|
|
99
|
-
TimeoutNotificationComponent
|
|
100
|
-
]
|
|
101
|
-
}]
|
|
102
|
-
}], ctorParameters: function () { return [{ type: i1.JwtModule, decorators: [{
|
|
103
|
-
type: Optional
|
|
104
|
-
}, {
|
|
105
|
-
type: SkipSelf
|
|
106
|
-
}] }]; } });
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGh1bnRzbWFuLWNhbmNlci1pbnN0aXR1dGUvYXV0aGVudGljYXRpb24vIiwic291cmNlcyI6WyJhdXRoZW50aWNhdGlvbi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxPQUFPLEVBQXNCLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGlCQUFpQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRTVGLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzlFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDOzs7QUFFakU7Ozs7O0dBS0c7QUFzQkgsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixZQUFvQyxZQUF1QjtRQUN6RCxJQUFJLFlBQVksRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBQ0QsTUFBTSxDQUFDLE9BQU87UUFDWixPQUFPO1lBQ0wsU0FBUyxFQUFFO2dCQUNULHNCQUFzQjtnQkFDdEIsZ0JBQWdCO2dCQUNoQixxQkFBcUI7Z0JBQ3JCLGlCQUFpQjtnQkFDakI7b0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsS0FBSyxFQUFFLElBQUk7aUJBQ1o7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLEtBQUssRUFBRSxJQUFJO2lCQUNaO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxXQUFXO29CQUNwQixRQUFRLEVBQUUsc0JBQXNCO2lCQUNqQzthQUNGO1lBQ0QsUUFBUSxFQUFFLG9CQUFvQjtTQUMvQixDQUFBO0lBQ0gsQ0FBQzs7a0hBOUJVLG9CQUFvQjttSEFBcEIsb0JBQW9CLGlCQVY3Qix1QkFBdUI7UUFDdkIsb0JBQW9CO1FBQ3BCLDRCQUE0QixhQVg1QixZQUFZO1FBQ1osZ0JBQWdCO1FBQ2hCLFlBQVk7UUFDWixZQUFZO1FBQ1osV0FBVztRQUNYLG1CQUFtQjtRQUNuQixpQkFBaUIsYUFRakIsdUJBQXVCO1FBQ3ZCLG9CQUFvQjtRQUNwQiw0QkFBNEI7bUhBR25CLG9CQUFvQixZQXBCdEI7WUFDUCxZQUFZO1lBQ1osZ0JBQWdCO1lBQ2hCLFlBQVk7WUFDWixZQUFZO1lBQ1osV0FBVztZQUNYLG1CQUFtQjtZQUNuQixpQkFBaUI7U0FDbEI7NEZBWVUsb0JBQW9CO2tCQXJCaEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsaUJBQWlCO3FCQUNsQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osdUJBQXVCO3dCQUN2QixvQkFBb0I7d0JBQ3BCLDRCQUE0QjtxQkFDN0I7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHVCQUF1Qjt3QkFDdkIsb0JBQW9CO3dCQUNwQiw0QkFBNEI7cUJBQzdCO2lCQUNGOzswQkFFYyxRQUFROzswQkFBSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSAyMDE2IEh1bnRzbWFuIENhbmNlciBJbnN0aXR1dGUgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCwgQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeVxyXG4gKi9cclxuaW1wb3J0IHtNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSwgT3B0aW9uYWwsIFNraXBTZWxmfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge1JlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtIVFRQX0lOVEVSQ0VQVE9SUywgSHR0cENsaWVudE1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7Um91dGVyTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5pbXBvcnQge0Nvb2xTdG9yYWdlTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXItY29vbC9zdG9yYWdlXCI7XHJcbmltcG9ydCB7SldUX09QVElPTlMsIEp3dEhlbHBlclNlcnZpY2UsIEp3dEludGVyY2VwdG9yLCBKd3RNb2R1bGV9IGZyb20gXCJAYXV0aDAvYW5ndWxhci1qd3RcIjtcclxuXHJcbmltcG9ydCB7QXV0aGVudGljYXRpb25TZXJ2aWNlfSBmcm9tIFwiLi9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7Um91dGVHdWFyZFNlcnZpY2V9IGZyb20gXCIuL3JvdXRlLWd1YXJkLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtBdXRoZW50aWNhdGlvbkNvbXBvbmVudH0gZnJvbSBcIi4vYXV0aGVudGljYXRpb24uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7RGlyZWN0TG9naW5Db21wb25lbnR9IGZyb20gXCIuL2RpcmVjdGxvZ2luLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1RpbWVvdXROb3RpZmljYXRpb25Db21wb25lbnR9IGZyb20gXCIuL3RpbWVvdXQtbm90aWZpY2F0aW9uLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0F1dGhvcml6YXRpb25JbnRlcmNlcHRvcn0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi5pbnRlcmNlcHRvclwiO1xyXG5pbXBvcnQge0F1dGhlbnRpY2F0aW9uUHJvdmlkZXJ9IGZyb20gXCIuL2F1dGhlbnRpY2F0aW9uLnByb3ZpZGVyXCI7XHJcblxyXG4vKipcclxuICogUHJvdmlkZSBhIHNpbmdsZSBhdXRoIHNlcnZpY2UgYW5kIGludGVyY2VwdG9yIGZvciB0aGUgaW1wbGVtZW50aW5nIGFwcGxpY2F0aW9uLiAgQWxzbyBwcm92aWRlIGV2ZXJ5dGhpbmdcclxuICogZnJvbSB0aGUgYW5ndWxhci1qd3QgbGlicmFyeS5cclxuICpcclxuICogQHNpbmNlIDEuMC4wXHJcbiAqL1xyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEh0dHBDbGllbnRNb2R1bGUsXHJcbiAgICAvL0p3dE1vZHVsZSxcclxuICAgIFJvdXRlck1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIENvb2xTdG9yYWdlTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIEF1dGhlbnRpY2F0aW9uQ29tcG9uZW50LFxyXG4gICAgRGlyZWN0TG9naW5Db21wb25lbnQsXHJcbiAgICBUaW1lb3V0Tm90aWZpY2F0aW9uQ29tcG9uZW50XHJcbiAgXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICBBdXRoZW50aWNhdGlvbkNvbXBvbmVudCxcclxuICAgIERpcmVjdExvZ2luQ29tcG9uZW50LFxyXG4gICAgVGltZW91dE5vdGlmaWNhdGlvbkNvbXBvbmVudFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uTW9kdWxlIHtcclxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwYXJlbnRNb2R1bGU6IEp3dE1vZHVsZSkge1xyXG4gICAgaWYgKHBhcmVudE1vZHVsZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoZW50aWNhdGlvbk1vZHVsZSBpcyBhbHJlYWR5IGxvYWRlZC5cIik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnM8QXV0aGVudGljYXRpb25Nb2R1bGU+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIsXHJcbiAgICAgICAgSnd0SGVscGVyU2VydmljZSxcclxuICAgICAgICBBdXRoZW50aWNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgUm91dGVHdWFyZFNlcnZpY2UsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsXHJcbiAgICAgICAgICB1c2VDbGFzczogQXV0aG9yaXphdGlvbkludGVyY2VwdG9yLFxyXG4gICAgICAgICAgbXVsdGk6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLFxyXG4gICAgICAgICAgdXNlQ2xhc3M6IEp3dEludGVyY2VwdG9yLFxyXG4gICAgICAgICAgbXVsdGk6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IEpXVF9PUFRJT05TLFxyXG4gICAgICAgICAgdXNlQ2xhc3M6IEF1dGhlbnRpY2F0aW9uUHJvdmlkZXJcclxuICAgICAgICB9XHJcbiAgICAgIF0sXHJcbiAgICAgIG5nTW9kdWxlOiBBdXRoZW50aWNhdGlvbk1vZHVsZVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, InjectionToken } from "@angular/core";
|
|
2
|
-
import { CoolLocalStorage } from '@angular-cool/storage';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular-cool/storage";
|
|
5
|
-
export let AUTHENTICATION_TOKEN_KEY = new InjectionToken("authentication_token_key");
|
|
6
|
-
export class AuthenticationProvider {
|
|
7
|
-
constructor(_localStorageService, _authenticationTokenKey) {
|
|
8
|
-
this._localStorageService = _localStorageService;
|
|
9
|
-
this._authenticationTokenKey = _authenticationTokenKey;
|
|
10
|
-
this.whitelistedDomains = [
|
|
11
|
-
"localhost",
|
|
12
|
-
new RegExp(".*[.]utah[.]edu")
|
|
13
|
-
];
|
|
14
|
-
this.tokenGetter = () => {
|
|
15
|
-
return this.authToken;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
get authenticationTokenKey() {
|
|
19
|
-
return this._authenticationTokenKey;
|
|
20
|
-
}
|
|
21
|
-
set authenticationTokenKey(_authenticationTokenKey) {
|
|
22
|
-
this._authenticationTokenKey = _authenticationTokenKey;
|
|
23
|
-
}
|
|
24
|
-
get authToken() {
|
|
25
|
-
return this._localStorageService.getItem(this._authenticationTokenKey);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
AuthenticationProvider.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AuthenticationProvider, deps: [{ token: i1.CoolLocalStorage }, { token: AUTHENTICATION_TOKEN_KEY }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
29
|
-
AuthenticationProvider.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AuthenticationProvider });
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AuthenticationProvider, decorators: [{
|
|
31
|
-
type: Injectable
|
|
32
|
-
}], ctorParameters: function () { return [{ type: i1.CoolLocalStorage }, { type: undefined, decorators: [{
|
|
33
|
-
type: Inject,
|
|
34
|
-
args: [AUTHENTICATION_TOKEN_KEY]
|
|
35
|
-
}] }]; } });
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24ucHJvdmlkZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHVudHNtYW4tY2FuY2VyLWluc3RpdHV0ZS9hdXRoZW50aWNhdGlvbi8iLCJzb3VyY2VzIjpbImF1dGhlbnRpY2F0aW9uLnByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBVyxNQUFNLGVBQWUsQ0FBQztBQUkzRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBRXZELE1BQU0sQ0FBQyxJQUFJLHdCQUF3QixHQUFHLElBQUksY0FBYyxDQUFTLDBCQUEwQixDQUFDLENBQUM7QUFHN0YsTUFBTSxPQUFPLHNCQUFzQjtJQU9qQyxZQUFvQixvQkFBc0MsRUFDSix1QkFBK0I7UUFEakUseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFrQjtRQUNKLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBUTtRQU45RSx1QkFBa0IsR0FBRztZQUMxQixXQUFXO1lBQ1gsSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUM7U0FDOUIsQ0FBQztRQUtLLGdCQUFXLEdBQUcsR0FBRyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDLENBQUE7SUFKdUYsQ0FBQztJQU16RixJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxzQkFBc0IsQ0FBQyx1QkFBK0I7UUFDeEQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLHVCQUF1QixDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFlLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDakYsQ0FBQzs7b0hBeEJVLHNCQUFzQixrREFRYix3QkFBd0I7d0hBUmpDLHNCQUFzQjs0RkFBdEIsc0JBQXNCO2tCQURsQyxVQUFVOzswQkFTSSxNQUFNOzJCQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0b3J9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5pbXBvcnQge0Nvb2xMb2NhbFN0b3JhZ2V9IGZyb20gJ0Bhbmd1bGFyLWNvb2wvc3RvcmFnZSc7XHJcblxyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1RPS0VOX0tFWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFwiYXV0aGVudGljYXRpb25fdG9rZW5fa2V5XCIpO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRpb25Qcm92aWRlciB7XHJcblxyXG4gIHB1YmxpYyB3aGl0ZWxpc3RlZERvbWFpbnMgPSBbXHJcbiAgICBcImxvY2FsaG9zdFwiLFxyXG4gICAgbmV3IFJlZ0V4cChcIi4qWy5ddXRhaFsuXWVkdVwiKVxyXG4gIF07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvY2FsU3RvcmFnZVNlcnZpY2U6IENvb2xMb2NhbFN0b3JhZ2UsXHJcbiAgICAgICAgICAgICAgQEluamVjdChBVVRIRU5USUNBVElPTl9UT0tFTl9LRVkpIHByaXZhdGUgX2F1dGhlbnRpY2F0aW9uVG9rZW5LZXk6IHN0cmluZykge31cclxuXHJcbiAgcHVibGljIHRva2VuR2V0dGVyID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0aFRva2VuO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF1dGhlbnRpY2F0aW9uVG9rZW5LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvblRva2VuS2V5O1xyXG4gIH1cclxuXHJcbiAgc2V0IGF1dGhlbnRpY2F0aW9uVG9rZW5LZXkoX2F1dGhlbnRpY2F0aW9uVG9rZW5LZXk6IHN0cmluZykge1xyXG4gICAgdGhpcy5fYXV0aGVudGljYXRpb25Ub2tlbktleSA9IF9hdXRoZW50aWNhdGlvblRva2VuS2V5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF1dGhUb2tlbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIDxzdHJpbmc+dGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtKHRoaXMuX2F1dGhlbnRpY2F0aW9uVG9rZW5LZXkpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
@@ -1,393 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary
|
|
3
|
-
*/
|
|
4
|
-
import { Injectable, InjectionToken, Inject, Optional, isDevMode } from "@angular/core";
|
|
5
|
-
import { LocationStrategy } from "@angular/common";
|
|
6
|
-
import { Router } from "@angular/router";
|
|
7
|
-
import { HttpClient, HttpHeaders } from "@angular/common/http";
|
|
8
|
-
import { interval, BehaviorSubject, throwError } from "rxjs";
|
|
9
|
-
import { catchError, map } from "rxjs/operators";
|
|
10
|
-
import { JwtHelperService } from "@auth0/angular-jwt";
|
|
11
|
-
import { AuthenticationProvider } from "./authentication.provider";
|
|
12
|
-
import { CoolLocalStorage } from "@angular-cool/storage";
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@angular/common/http";
|
|
15
|
-
import * as i2 from "@angular/router";
|
|
16
|
-
import * as i3 from "@angular-cool/storage";
|
|
17
|
-
import * as i4 from "@auth0/angular-jwt";
|
|
18
|
-
import * as i5 from "./authentication.provider";
|
|
19
|
-
import * as i6 from "@angular/common";
|
|
20
|
-
/**
|
|
21
|
-
* The token used for injection of the server side endpoint for the currently authenticated subject.
|
|
22
|
-
*
|
|
23
|
-
* @type {InjectionToken}
|
|
24
|
-
*/
|
|
25
|
-
export let AUTHENTICATION_SERVER_URL = new InjectionToken("authentication_server_rest_api");
|
|
26
|
-
export let AUTHENTICATION_LOGOUT_PATH = new InjectionToken("authentication_logout_path");
|
|
27
|
-
export let AUTHENTICATION_DIRECT_ENDPOINT = new InjectionToken("authentication_direct_endpoint");
|
|
28
|
-
export let AUTHENTICATION_TOKEN_ENDPOINT = new InjectionToken("authentication_token_endpoint");
|
|
29
|
-
export let AUTHENTICATION_ROUTE = new InjectionToken("authentication_route");
|
|
30
|
-
export let AUTHENTICATION_MAX_INACTIVITY_MINUTES = new InjectionToken("authentication_max_inactivity");
|
|
31
|
-
export let AUTHENTICATION_USER_COUNTDOWN_SECONDS = new InjectionToken("authentication_user_countdown_seconds");
|
|
32
|
-
export let AUTHENTICATION_IDP_INACTIVITY_MINUTES = new InjectionToken("authentication_idp_inactivity_minutes");
|
|
33
|
-
/**
|
|
34
|
-
* @since 1.0.0
|
|
35
|
-
*/
|
|
36
|
-
export class AuthenticationService {
|
|
37
|
-
constructor(_http, _router, _localStorageService, _jwtHelper, authenticationProvider, _authenticationRoute, _logoutPath, _tokenEndpoint, _serverUrl, _directEndpoint, _maxInactivity, _userCountdownSeconds, _idpInactivityMinutes, locationStrategy) {
|
|
38
|
-
this._http = _http;
|
|
39
|
-
this._router = _router;
|
|
40
|
-
this._localStorageService = _localStorageService;
|
|
41
|
-
this._jwtHelper = _jwtHelper;
|
|
42
|
-
this.authenticationProvider = authenticationProvider;
|
|
43
|
-
this._authenticationRoute = _authenticationRoute;
|
|
44
|
-
this._logoutPath = _logoutPath;
|
|
45
|
-
this._tokenEndpoint = _tokenEndpoint;
|
|
46
|
-
this._serverUrl = _serverUrl;
|
|
47
|
-
this._directEndpoint = _directEndpoint;
|
|
48
|
-
this._maxInactivity = _maxInactivity;
|
|
49
|
-
this._userCountdownSeconds = _userCountdownSeconds;
|
|
50
|
-
this._idpInactivityMinutes = _idpInactivityMinutes;
|
|
51
|
-
this.locationStrategy = locationStrategy;
|
|
52
|
-
this.userCountdownSeconds = 60;
|
|
53
|
-
this.idpInactivityMinutes = 5;
|
|
54
|
-
this.contentType = "application/json";
|
|
55
|
-
this.limitedContext = false;
|
|
56
|
-
this.deidentifiedContext = false;
|
|
57
|
-
this.maxViewPermission = new BehaviorSubject("viewident");
|
|
58
|
-
this._isAuthenticatedSubject = new BehaviorSubject(false);
|
|
59
|
-
this._userIsAboutToTimeOut = new BehaviorSubject(false);
|
|
60
|
-
this._maxInactivityMinutes = 120;
|
|
61
|
-
this.contextRoot = "";
|
|
62
|
-
if (isDevMode()) {
|
|
63
|
-
console.debug("window.location.href: " + window.location.href);
|
|
64
|
-
}
|
|
65
|
-
if (window.location) {
|
|
66
|
-
let parts = window.location.href.split("/");
|
|
67
|
-
this.baseUrl = parts[0] + "//" + parts[2];
|
|
68
|
-
if (parts.length > 3) {
|
|
69
|
-
this.contextRoot = parts[3];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
if (this._localStorageService.getItem("maxViewPermission")) {
|
|
73
|
-
this.maxViewPermission.next(this._localStorageService.getItem("maxViewPermission"));
|
|
74
|
-
}
|
|
75
|
-
if (_maxInactivity) {
|
|
76
|
-
this._maxInactivityMinutes = _maxInactivity;
|
|
77
|
-
}
|
|
78
|
-
if (_userCountdownSeconds) {
|
|
79
|
-
this.userCountdownSeconds = _userCountdownSeconds;
|
|
80
|
-
}
|
|
81
|
-
if (_idpInactivityMinutes) {
|
|
82
|
-
this.idpInactivityMinutes = _idpInactivityMinutes;
|
|
83
|
-
}
|
|
84
|
-
this.hasValidConfig();
|
|
85
|
-
//There could be a non-expired token in local storage.
|
|
86
|
-
let token = this.authenticationProvider.authToken;
|
|
87
|
-
this.storeToken(token);
|
|
88
|
-
}
|
|
89
|
-
getBaseUrl() {
|
|
90
|
-
return (this.baseUrl) ? this.baseUrl : "";
|
|
91
|
-
}
|
|
92
|
-
getContextRoot() {
|
|
93
|
-
return this.contextRoot;
|
|
94
|
-
}
|
|
95
|
-
getHeaders(req) {
|
|
96
|
-
let headers = req.headers;
|
|
97
|
-
//Don't set content type if already set
|
|
98
|
-
if (!req.headers.get(AuthenticationService.CONTENT_TYPE)) {
|
|
99
|
-
headers = headers.set(AuthenticationService.CONTENT_TYPE, this.contentType.toString());
|
|
100
|
-
}
|
|
101
|
-
if (headers.get(AuthenticationService.SEC_GOV_CLASS_HEADER) === "") {
|
|
102
|
-
headers = headers.delete(AuthenticationService.SEC_GOV_CLASS_HEADER);
|
|
103
|
-
}
|
|
104
|
-
else if (this.securityGovernorClass && !headers.get(AuthenticationService.SEC_GOV_CLASS_HEADER)) {
|
|
105
|
-
headers = headers.set(AuthenticationService.SEC_GOV_CLASS_HEADER, this.securityGovernorClass);
|
|
106
|
-
}
|
|
107
|
-
if (headers.get(AuthenticationService.SEC_GOV_ID_HEADER) === "") {
|
|
108
|
-
headers = headers.delete(AuthenticationService.SEC_GOV_ID_HEADER);
|
|
109
|
-
}
|
|
110
|
-
else if (this.securityGovernorId && !headers.get(AuthenticationService.SEC_GOV_ID_HEADER)) {
|
|
111
|
-
headers = headers.set(AuthenticationService.SEC_GOV_ID_HEADER, this.securityGovernorId.toString());
|
|
112
|
-
}
|
|
113
|
-
headers = headers.set(AuthenticationService.DEIDENT_HEADER, this.deidentifiedContext.toString());
|
|
114
|
-
headers = headers.set(AuthenticationService.LIMITED_HEADER, this.limitedContext.toString());
|
|
115
|
-
return headers;
|
|
116
|
-
}
|
|
117
|
-
get authenticationTokenKey() {
|
|
118
|
-
return this.authenticationProvider.authenticationTokenKey;
|
|
119
|
-
}
|
|
120
|
-
get authToken() {
|
|
121
|
-
return this.authenticationProvider.authToken;
|
|
122
|
-
}
|
|
123
|
-
updateUserActivity() {
|
|
124
|
-
if (this._isAuthenticatedSubject.value) {
|
|
125
|
-
this._lastUserInteraction = new Date();
|
|
126
|
-
this._userIsAboutToTimeOut.next(false);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* A mutator for identifying the clients original request location. Setting this value will influence the end location
|
|
131
|
-
* navigated to by {@link #navigateToPath}.
|
|
132
|
-
*
|
|
133
|
-
* @param redirectUrl location of the users request before authentication
|
|
134
|
-
*/
|
|
135
|
-
set redirectUrl(redirectUrl) {
|
|
136
|
-
this._redirectUrl = redirectUrl;
|
|
137
|
-
}
|
|
138
|
-
get redirectUrl() {
|
|
139
|
-
return this._redirectUrl;
|
|
140
|
-
}
|
|
141
|
-
requestAccessToken(redirectOnSuccess) {
|
|
142
|
-
this._http.get(this.tokenLocation(), { withCredentials: true })
|
|
143
|
-
.subscribe((response) => {
|
|
144
|
-
this.storeToken(response.auth_token);
|
|
145
|
-
if (redirectOnSuccess) {
|
|
146
|
-
this.proceedIfAuthenticated();
|
|
147
|
-
}
|
|
148
|
-
}, (error) => {
|
|
149
|
-
//Token refresh failed.
|
|
150
|
-
this.logout(true);
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Verifies whether or not a current user session exists.
|
|
155
|
-
*
|
|
156
|
-
* @returns {Observable<boolean>} evaluates to true if the user is authenticated, false otherwise.
|
|
157
|
-
*/
|
|
158
|
-
isAuthenticated() {
|
|
159
|
-
return this._isAuthenticatedSubject.asObservable();
|
|
160
|
-
}
|
|
161
|
-
isAboutToTimeOut() {
|
|
162
|
-
return this._userIsAboutToTimeOut.asObservable();
|
|
163
|
-
}
|
|
164
|
-
getTimeoutStart() {
|
|
165
|
-
if (this._lastUserInteraction) {
|
|
166
|
-
return this._lastUserInteraction.valueOf() + (((this._maxInactivityMinutes * 60) - this.userCountdownSeconds) * 1000);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
tokenLocation() {
|
|
170
|
-
if (this._serverUrl) {
|
|
171
|
-
return this._serverUrl + this._tokenEndpoint;
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
return this._tokenEndpoint;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
directLoginLocation() {
|
|
178
|
-
if (this._serverUrl) {
|
|
179
|
-
return this._serverUrl + this._directEndpoint;
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
return this._directEndpoint;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
logoutLocation() {
|
|
186
|
-
if (this._serverUrl) {
|
|
187
|
-
return this._serverUrl + this._logoutPath;
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
return this._logoutPath;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* A function to authenticated the user with the provided credentials. Failure results in an error that describes the
|
|
195
|
-
* server response (status and status message) and should be actionable by the client application.
|
|
196
|
-
*
|
|
197
|
-
* @param username of the authenticating user to verify
|
|
198
|
-
* @param password of the authenticating user to verify
|
|
199
|
-
* @returns {Observable<R>} describing the result of the login action, true or an error
|
|
200
|
-
*/
|
|
201
|
-
login(_username, _password) {
|
|
202
|
-
return this._http.post(this.directLoginLocation(), { username: _username, password: _password }, { observe: "response" }).pipe(map((resp) => {
|
|
203
|
-
if (resp.status === 201) {
|
|
204
|
-
return true;
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
throw new Error("Authentication failed. " + resp.status + ": " + resp.statusText);
|
|
208
|
-
}
|
|
209
|
-
}), catchError(this.handleError));
|
|
210
|
-
}
|
|
211
|
-
clearLogin() {
|
|
212
|
-
//Front-end logout
|
|
213
|
-
try {
|
|
214
|
-
this._localStorageService.removeItem(this.authenticationProvider.authenticationTokenKey);
|
|
215
|
-
this.unsubscribeFromTokenRefresh();
|
|
216
|
-
this._isAuthenticatedSubject.next(false);
|
|
217
|
-
this._userIsAboutToTimeOut.next(false);
|
|
218
|
-
}
|
|
219
|
-
catch (Error) {
|
|
220
|
-
}
|
|
221
|
-
//Back-end logout
|
|
222
|
-
let headers = new HttpHeaders().set(AuthenticationService.CONTENT_TYPE, "text/plain");
|
|
223
|
-
return this._http.get(this.logoutLocation(), { headers: headers });
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* A function to signal the termination of the current session. Invoking this function will clean up any relevant state
|
|
227
|
-
* related to the last active session.
|
|
228
|
-
*/
|
|
229
|
-
logout(keepCurrentRoute = false) {
|
|
230
|
-
//Prevent logout if already on authentication route. Doing otherwise screws up SAML
|
|
231
|
-
if (!this._router.routerState || this._router.routerState.snapshot.url !== this._authenticationRoute) {
|
|
232
|
-
this._redirectUrl = (keepCurrentRoute && this._router.routerState && this._router.routerState.snapshot) ? this._router.routerState.snapshot.url : "";
|
|
233
|
-
if (this._redirectUrl.startsWith("/")) {
|
|
234
|
-
this._redirectUrl = this._redirectUrl.substring(1);
|
|
235
|
-
}
|
|
236
|
-
this.clearLogin().subscribe((response) => {
|
|
237
|
-
window.location.replace(this._redirectUrl);
|
|
238
|
-
}, (error) => {
|
|
239
|
-
window.location.replace(this._redirectUrl);
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
storeToken(token) {
|
|
244
|
-
let valid = this.validateToken(token);
|
|
245
|
-
// unsubscribe from refesh before we decide wether to resubscribe
|
|
246
|
-
this.unsubscribeFromTokenRefresh();
|
|
247
|
-
if (valid) {
|
|
248
|
-
this._localStorageService.setItem(this.authenticationProvider.authenticationTokenKey, token);
|
|
249
|
-
this.subscribeToTokenRefresh(token);
|
|
250
|
-
//Change the BehaviorSubject if the user was not previously authenticated.
|
|
251
|
-
//Since other code may be subscribing to this observable, we don't want to cause new events to fire if just refreshing the JWT.
|
|
252
|
-
if (!this._isAuthenticatedSubject.value) {
|
|
253
|
-
this._isAuthenticatedSubject.next(true);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
this._localStorageService.removeItem(this.authenticationProvider.authenticationTokenKey);
|
|
258
|
-
this._isAuthenticatedSubject.next(false);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
proceedIfAuthenticated() {
|
|
262
|
-
if (isDevMode()) {
|
|
263
|
-
console.debug("AuthenticationService.proceedIfAuthenticated: " + this._redirectUrl);
|
|
264
|
-
}
|
|
265
|
-
if (this._isAuthenticatedSubject.value) {
|
|
266
|
-
//Login counts as user activity, too
|
|
267
|
-
this.updateUserActivity();
|
|
268
|
-
if (this._redirectUrl && this._redirectUrl && this._redirectUrl !== "") {
|
|
269
|
-
this._router.navigateByUrl(this._redirectUrl);
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
this._router.navigate([""]);
|
|
273
|
-
}
|
|
274
|
-
return true;
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
return false;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
validateToken(token) {
|
|
281
|
-
return (token && !this._jwtHelper.isTokenExpired(token));
|
|
282
|
-
}
|
|
283
|
-
subscribeToTokenRefresh(token) {
|
|
284
|
-
let exp = this._jwtHelper.getTokenExpirationDate(token);
|
|
285
|
-
// Use a timer to periodically check timeouts
|
|
286
|
-
this._refreshSubscription = interval(1000)
|
|
287
|
-
.subscribe(() => {
|
|
288
|
-
// If a tab is inactive we can't know if our timer is accurate
|
|
289
|
-
// so when the interval hits check against timestamps
|
|
290
|
-
if (this._isAuthenticatedSubject.value && Date.now() > this.getTimeoutStart()) {
|
|
291
|
-
//Don't update the subject more than once! Doing so initializes more than one countdown timer!
|
|
292
|
-
if (this._userIsAboutToTimeOut.getValue() !== true) {
|
|
293
|
-
this._userIsAboutToTimeOut.next(true);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
// check for refresh token
|
|
297
|
-
let msToExpiry = (exp.valueOf() - new Date().valueOf());
|
|
298
|
-
// Refresh 60 seconds before expiry
|
|
299
|
-
if (msToExpiry <= 60000) {
|
|
300
|
-
this.refreshTokenIfUserIsActive();
|
|
301
|
-
}
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
unsubscribeFromTokenRefresh() {
|
|
305
|
-
if (this._refreshSubscription && !this._refreshSubscription.closed) {
|
|
306
|
-
this._refreshSubscription.unsubscribe();
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
getMaxViewPermission() {
|
|
310
|
-
return this.maxViewPermission.getValue();
|
|
311
|
-
}
|
|
312
|
-
getMaxViewPermissionSubject() {
|
|
313
|
-
return this.maxViewPermission;
|
|
314
|
-
}
|
|
315
|
-
setMaxViewPermission(maxViewPermission) {
|
|
316
|
-
this._localStorageService.setItem("maxViewPermission", maxViewPermission);
|
|
317
|
-
this.maxViewPermission.next(maxViewPermission);
|
|
318
|
-
}
|
|
319
|
-
refreshTokenIfUserIsActive() {
|
|
320
|
-
//Only refresh if the user has been active
|
|
321
|
-
if (this._lastUserInteraction && ((new Date().valueOf() - this._lastUserInteraction.valueOf()) <= (this._maxInactivityMinutes * 60 * 1000))) {
|
|
322
|
-
this.requestAccessToken(false);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
hasValidConfig() {
|
|
326
|
-
if (this._tokenEndpoint == null && (this._serverUrl === null || this._logoutPath === null)) {
|
|
327
|
-
throw new Error("BUG ALERT! Invalid AuthenticationService configuration. No valid configuration for authentication endpoint(s).");
|
|
328
|
-
}
|
|
329
|
-
if (this._localStorageService === null || this.authenticationProvider.authenticationTokenKey === null) {
|
|
330
|
-
throw new Error("BUG ALERT! Invalid AuthenticationService configuration. No valid configuration for local storage");
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
handleError(error) {
|
|
334
|
-
let errMsg = (error.message) ? error.message : AuthenticationService.GENERIC_ERR_MSG;
|
|
335
|
-
return throwError(errMsg);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* The generic error message used when a server error is thrown without a status.
|
|
340
|
-
*
|
|
341
|
-
* @type {string}
|
|
342
|
-
*/
|
|
343
|
-
AuthenticationService.GENERIC_ERR_MSG = "Server error";
|
|
344
|
-
AuthenticationService.CONTENT_TYPE = "Content-Type";
|
|
345
|
-
AuthenticationService.SEC_GOV_CLASS_HEADER = "SecurityGovernorClass";
|
|
346
|
-
AuthenticationService.SEC_GOV_ID_HEADER = "SecurityGovernorId";
|
|
347
|
-
AuthenticationService.DEIDENT_HEADER = "DeidentifiedContext";
|
|
348
|
-
AuthenticationService.LIMITED_HEADER = "LimitedContext";
|
|
349
|
-
AuthenticationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AuthenticationService, deps: [{ token: i1.HttpClient }, { token: i2.Router }, { token: i3.CoolLocalStorage }, { token: i4.JwtHelperService }, { token: i5.AuthenticationProvider }, { token: AUTHENTICATION_ROUTE }, { token: AUTHENTICATION_LOGOUT_PATH }, { token: AUTHENTICATION_TOKEN_ENDPOINT }, { token: AUTHENTICATION_SERVER_URL, optional: true }, { token: AUTHENTICATION_DIRECT_ENDPOINT, optional: true }, { token: AUTHENTICATION_MAX_INACTIVITY_MINUTES, optional: true }, { token: AUTHENTICATION_USER_COUNTDOWN_SECONDS, optional: true }, { token: AUTHENTICATION_IDP_INACTIVITY_MINUTES, optional: true }, { token: LocationStrategy, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
350
|
-
AuthenticationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AuthenticationService });
|
|
351
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AuthenticationService, decorators: [{
|
|
352
|
-
type: Injectable
|
|
353
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.Router }, { type: i3.CoolLocalStorage }, { type: i4.JwtHelperService }, { type: i5.AuthenticationProvider }, { type: undefined, decorators: [{
|
|
354
|
-
type: Inject,
|
|
355
|
-
args: [AUTHENTICATION_ROUTE]
|
|
356
|
-
}] }, { type: undefined, decorators: [{
|
|
357
|
-
type: Inject,
|
|
358
|
-
args: [AUTHENTICATION_LOGOUT_PATH]
|
|
359
|
-
}] }, { type: undefined, decorators: [{
|
|
360
|
-
type: Inject,
|
|
361
|
-
args: [AUTHENTICATION_TOKEN_ENDPOINT]
|
|
362
|
-
}] }, { type: undefined, decorators: [{
|
|
363
|
-
type: Optional
|
|
364
|
-
}, {
|
|
365
|
-
type: Inject,
|
|
366
|
-
args: [AUTHENTICATION_SERVER_URL]
|
|
367
|
-
}] }, { type: undefined, decorators: [{
|
|
368
|
-
type: Optional
|
|
369
|
-
}, {
|
|
370
|
-
type: Inject,
|
|
371
|
-
args: [AUTHENTICATION_DIRECT_ENDPOINT]
|
|
372
|
-
}] }, { type: undefined, decorators: [{
|
|
373
|
-
type: Optional
|
|
374
|
-
}, {
|
|
375
|
-
type: Inject,
|
|
376
|
-
args: [AUTHENTICATION_MAX_INACTIVITY_MINUTES]
|
|
377
|
-
}] }, { type: undefined, decorators: [{
|
|
378
|
-
type: Optional
|
|
379
|
-
}, {
|
|
380
|
-
type: Inject,
|
|
381
|
-
args: [AUTHENTICATION_USER_COUNTDOWN_SECONDS]
|
|
382
|
-
}] }, { type: undefined, decorators: [{
|
|
383
|
-
type: Optional
|
|
384
|
-
}, {
|
|
385
|
-
type: Inject,
|
|
386
|
-
args: [AUTHENTICATION_IDP_INACTIVITY_MINUTES]
|
|
387
|
-
}] }, { type: i6.LocationStrategy, decorators: [{
|
|
388
|
-
type: Optional
|
|
389
|
-
}, {
|
|
390
|
-
type: Inject,
|
|
391
|
-
args: [LocationStrategy]
|
|
392
|
-
}] }]; } });
|
|
393
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BodW50c21hbi1jYW5jZXItaW5zdGl0dXRlL2F1dGhlbnRpY2F0aW9uLyIsInNvdXJjZXMiOlsiYXV0aGVudGljYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBNEIsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RixPQUFPLEVBQUMsUUFBUSxFQUFjLGVBQWUsRUFBZ0IsVUFBVSxFQUFLLE1BQU0sTUFBTSxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxVQUFVLEVBQVMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7O0FBRXpEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsSUFBSSx5QkFBeUIsR0FBRyxJQUFJLGNBQWMsQ0FBUyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ3BHLE1BQU0sQ0FBQyxJQUFJLDBCQUEwQixHQUFHLElBQUksY0FBYyxDQUFTLDRCQUE0QixDQUFDLENBQUM7QUFDakcsTUFBTSxDQUFDLElBQUksOEJBQThCLEdBQUcsSUFBSSxjQUFjLENBQVMsZ0NBQWdDLENBQUMsQ0FBQztBQUN6RyxNQUFNLENBQUMsSUFBSSw2QkFBNkIs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QUFXLHVCQUF1QixDQUFDO0FBQ3ZELHVDQUFpQixHQUFXLG9CQUFvQixDQUFDO0FBQ2pELG9DQUFjLEdBQVcscUJBQXFCLENBQUM7QUFDL0Msb0NBQWMsR0FBVyxnQkFBZ0IsQ0FBQzttSEFiOUMscUJBQXFCLHdLQXdDWixvQkFBb0IsYUFDcEIsMEJBQTBCLGFBQzFCLDZCQUE2QixhQUNqQix5QkFBeUIsNkJBQ3pCLDhCQUE4Qiw2QkFDOUIscUNBQXFDLDZCQUNyQyxxQ0FBcUMsNkJBQ3JDLHFDQUFxQyw2QkFDckMsZ0JBQWdCO3VIQWhEckMscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVU7OzBCQXlDSSxNQUFNOzJCQUFDLG9CQUFvQjs7MEJBQzNCLE1BQU07MkJBQUMsMEJBQTBCOzswQkFDakMsTUFBTTsyQkFBQyw2QkFBNkI7OzBCQUNwQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBQzVDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsOEJBQThCOzswQkFDakQsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxxQ0FBcUM7OzBCQUN4RCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFDQUFxQzs7MEJBQ3hELFFBQVE7OzBCQUFJLE1BQU07MkJBQUMscUNBQXFDOzswQkFDeEQsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSHVudHNtYW4gQ2FuY2VyIEluc3RpdHV0ZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLCBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5XHJcbiAqL1xyXG5pbXBvcnQge0luamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3QsIE9wdGlvbmFsLCBpc0Rldk1vZGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7TG9jYXRpb25TdHJhdGVneX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuXHJcbmltcG9ydCB7aW50ZXJ2YWwsIE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yLCBvZn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtjYXRjaEVycm9yLCBmaXJzdCwgbWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtKd3RIZWxwZXJTZXJ2aWNlfSBmcm9tIFwiQGF1dGgwL2FuZ3VsYXItand0XCI7XHJcblxyXG5pbXBvcnQge0F1dGhlbnRpY2F0aW9uUHJvdmlkZXJ9IGZyb20gXCIuL2F1dGhlbnRpY2F0aW9uLnByb3ZpZGVyXCI7XHJcbmltcG9ydCB7IENvb2xMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiQGFuZ3VsYXItY29vbC9zdG9yYWdlXCI7XHJcblxyXG4vKipcclxuICogVGhlIHRva2VuIHVzZWQgZm9yIGluamVjdGlvbiBvZiB0aGUgc2VydmVyIHNpZGUgZW5kcG9pbnQgZm9yIHRoZSBjdXJyZW50bHkgYXV0aGVudGljYXRlZCBzdWJqZWN0LlxyXG4gKlxyXG4gKiBAdHlwZSB7SW5qZWN0aW9uVG9rZW59XHJcbiAqL1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1NFUlZFUl9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX3NlcnZlcl9yZXN0X2FwaVwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9MT0dPVVRfUEFUSCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFwiYXV0aGVudGljYXRpb25fbG9nb3V0X3BhdGhcIik7XHJcbmV4cG9ydCBsZXQgQVVUSEVOVElDQVRJT05fRElSRUNUX0VORFBPSU5UID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdXRoZW50aWNhdGlvbl9kaXJlY3RfZW5kcG9pbnRcIik7XHJcbmV4cG9ydCBsZXQgQVVUSEVOVElDQVRJT05fVE9LRU5fRU5EUE9JTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX3Rva2VuX2VuZHBvaW50XCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1JPVVRFID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdXRoZW50aWNhdGlvbl9yb3V0ZVwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9NQVhfSU5BQ1RJVklUWV9NSU5VVEVTID0gbmV3IEluamVjdGlvblRva2VuPG51bWJlcj4oXCJhdXRoZW50aWNhdGlvbl9tYXhfaW5hY3Rpdml0eVwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9VU0VSX0NPVU5URE9XTl9TRUNPTkRTID0gbmV3IEluamVjdGlvblRva2VuPG51bWJlcj4oXCJhdXRoZW50aWNhdGlvbl91c2VyX2NvdW50ZG93bl9zZWNvbmRzXCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX0lEUF9JTkFDVElWSVRZX01JTlVURVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImF1dGhlbnRpY2F0aW9uX2lkcF9pbmFjdGl2aXR5X21pbnV0ZXNcIik7XHJcblxyXG4vKipcclxuICogQHNpbmNlIDEuMC4wXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGlvblNlcnZpY2Uge1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZ2VuZXJpYyBlcnJvciBtZXNzYWdlIHVzZWQgd2hlbiBhIHNlcnZlciBlcnJvciBpcyB0aHJvd24gd2l0aG91dCBhIHN0YXR1cy5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBHRU5FUklDX0VSUl9NU0c6IHN0cmluZyA9IFwiU2VydmVyIGVycm9yXCI7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIENPTlRFTlRfVFlQRTogc3RyaW5nID0gXCJDb250ZW50LVR5cGVcIjtcclxuICBwcml2YXRlIHN0YXRpYyBTRUNfR09WX0NMQVNTX0hFQURFUjogc3RyaW5nID0gXCJTZWN1cml0eUdvdmVybm9yQ2xhc3NcIjtcclxuICBwcml2YXRlIHN0YXRpYyBTRUNfR09WX0lEX0hFQURFUjogc3RyaW5nID0gXCJTZWN1cml0eUdvdmVybm9ySWRcIjtcclxuICBwcml2YXRlIHN0YXRpYyBERUlERU5UX0hFQURFUjogc3RyaW5nID0gXCJEZWlkZW50aWZpZWRDb250ZXh0XCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTElNSVRFRF9IRUFERVI6IHN0cmluZyA9IFwiTGltaXRlZENvbnRleHRcIjtcclxuXHJcbiAgcHVibGljIHVzZXJDb3VudGRvd25TZWNvbmRzOiBudW1iZXIgPSA2MDtcclxuICBwdWJsaWMgaWRwSW5hY3Rpdml0eU1pbnV0ZXM6IG51bWJlciA9IDU7XHJcblxyXG4gIHB1YmxpYyBjb250ZW50VHlwZTogc3RyaW5nID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XHJcbiAgcHVibGljIHNlY3VyaXR5R292ZXJub3JDbGFzczogc3RyaW5nO1xyXG4gIHB1YmxpYyBzZWN1cml0eUdvdmVybm9ySWQ6IG51bWJlcjtcclxuICBwdWJsaWMgbGltaXRlZENvbnRleHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZGVpZGVudGlmaWVkQ29udGV4dDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIG1heFZpZXdQZXJtaXNzaW9uOiBCZWhhdmlvclN1YmplY3Q8XCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiPihcInZpZXdpZGVudFwiKTtcclxuICBwcml2YXRlIF9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcml2YXRlIF91c2VySXNBYm91dFRvVGltZU91dDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgcHJpdmF0ZSBfcmVkaXJlY3RVcmw6IHN0cmluZztcclxuICBwcml2YXRlIF9yZWZyZXNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBfbGFzdFVzZXJJbnRlcmFjdGlvbjogRGF0ZTtcclxuICBwcml2YXRlIF9tYXhJbmFjdGl2aXR5TWludXRlczogbnVtYmVyID0gMTIwO1xyXG5cclxuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcclxuICBwcml2YXRlIGNvbnRleHRSb290OiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9odHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2xvY2FsU3RvcmFnZVNlcnZpY2U6IENvb2xMb2NhbFN0b3JhZ2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfand0SGVscGVyOiBKd3RIZWxwZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgYXV0aGVudGljYXRpb25Qcm92aWRlcjogQXV0aGVudGljYXRpb25Qcm92aWRlcixcclxuICAgICAgICAgICAgICBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1JPVVRFKSBwcml2YXRlIF9hdXRoZW50aWNhdGlvblJvdXRlOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQEluamVjdChBVVRIRU5USUNBVElPTl9MT0dPVVRfUEFUSCkgcHJpdmF0ZSBfbG9nb3V0UGF0aDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoQVVUSEVOVElDQVRJT05fVE9LRU5fRU5EUE9JTlQpIHByaXZhdGUgX3Rva2VuRW5kcG9pbnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1NFUlZFUl9VUkwpIHByaXZhdGUgX3NlcnZlclVybDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVVUSEVOVElDQVRJT05fRElSRUNUX0VORFBPSU5UKSBwcml2YXRlIF9kaXJlY3RFbmRwb2ludDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVVUSEVOVElDQVRJT05fTUFYX0lOQUNUSVZJVFlfTUlOVVRFUykgcHJpdmF0ZSBfbWF4SW5hY3Rpdml0eTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVVUSEVOVElDQVRJT05fVVNFUl9DT1VOVERPV05fU0VDT05EUykgcHJpdmF0ZSBfdXNlckNvdW50ZG93blNlY29uZHM6IG51bWJlcixcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX0lEUF9JTkFDVElWSVRZX01JTlVURVMpIHByaXZhdGUgX2lkcEluYWN0aXZpdHlNaW51dGVzOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChMb2NhdGlvblN0cmF0ZWd5KSBwcml2YXRlIGxvY2F0aW9uU3RyYXRlZ3k6IExvY2F0aW9uU3RyYXRlZ3kpIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwid2luZG93LmxvY2F0aW9uLmhyZWY6IFwiICsgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3cubG9jYXRpb24pIHtcclxuICAgICAgbGV0IHBhcnRzOiBzdHJpbmdbXSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KFwiL1wiKTtcclxuICAgICAgdGhpcy5iYXNlVXJsID0gcGFydHNbMF0gKyBcIi8vXCIgKyBwYXJ0c1syXTtcclxuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDMpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHRSb290ID0gcGFydHNbM107XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtKFwibWF4Vmlld1Blcm1pc3Npb25cIikpIHtcclxuICAgICAgdGhpcy5tYXhWaWV3UGVybWlzc2lvbi5uZXh0KDxcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCI+dGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtKFwibWF4Vmlld1Blcm1pc3Npb25cIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChfbWF4SW5hY3Rpdml0eSkge1xyXG4gICAgICB0aGlzLl9tYXhJbmFjdGl2aXR5TWludXRlcyA9IF9tYXhJbmFjdGl2aXR5O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChfdXNlckNvdW50ZG93blNlY29uZHMpIHtcclxuICAgICAgdGhpcy51c2VyQ291bnRkb3duU2Vjb25kcyA9IF91c2VyQ291bnRkb3duU2Vjb25kcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoX2lkcEluYWN0aXZpdHlNaW51dGVzKSB7XHJcbiAgICAgIHRoaXMuaWRwSW5hY3Rpdml0eU1pbnV0ZXMgPSBfaWRwSW5hY3Rpdml0eU1pbnV0ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oYXNWYWxpZENvbmZpZygpO1xyXG5cclxuICAgIC8vVGhlcmUgY291bGQgYmUgYSBub24tZXhwaXJlZCB0b2tlbiBpbiBsb2NhbCBzdG9yYWdlLlxyXG4gICAgbGV0IHRva2VuOiBzdHJpbmcgPSB0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuYXV0aFRva2VuO1xyXG4gICAgdGhpcy5zdG9yZVRva2VuKHRva2VuKTtcclxuICB9XHJcblxyXG4gIGdldEJhc2VVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGhpcy5iYXNlVXJsKSA/IHRoaXMuYmFzZVVybCA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZXh0Um9vdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFJvb3Q7XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJzKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IEh0dHBIZWFkZXJzIHtcclxuICAgIGxldCBoZWFkZXJzOiBIdHRwSGVhZGVycyA9IHJlcS5oZWFkZXJzO1xyXG5cclxuICAgIC8vRG9uJ3Qgc2V0IGNvbnRlbnQgdHlwZSBpZiBhbHJlYWR5IHNldFxyXG4gICAgaWYgKCFyZXEuaGVhZGVycy5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLkNPTlRFTlRfVFlQRSkpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5DT05URU5UX1RZUEUsIHRoaXMuY29udGVudFR5cGUudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhlYWRlcnMuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0NMQVNTX0hFQURFUikgPT09IFwiXCIpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuZGVsZXRlKEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0NMQVNTX0hFQURFUik7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VjdXJpdHlHb3Zlcm5vckNsYXNzICYmICFoZWFkZXJzLmdldChBdXRoZW50aWNhdGlvblNlcnZpY2UuU0VDX0dPVl9DTEFTU19IRUFERVIpKSB7XHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChBdXRoZW50aWNhdGlvblNlcnZpY2UuU0VDX0dPVl9DTEFTU19IRUFERVIsIHRoaXMuc2VjdXJpdHlHb3Zlcm5vckNsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGVhZGVycy5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLlNFQ19HT1ZfSURfSEVBREVSKSA9PT0gXCJcIikge1xyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5kZWxldGUoQXV0aGVudGljYXRpb25TZXJ2aWNlLlNFQ19HT1ZfSURfSEVBREVSKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWN1cml0eUdvdmVybm9ySWQgJiYgIWhlYWRlcnMuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0lEX0hFQURFUikpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0lEX0hFQURFUiwgdGhpcy5zZWN1cml0eUdvdmVybm9ySWQudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5ERUlERU5UX0hFQURFUiwgdGhpcy5kZWlkZW50aWZpZWRDb250ZXh0LnRvU3RyaW5nKCkpO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5MSU1JVEVEX0hFQURFUiwgdGhpcy5saW1pdGVkQ29udGV4dC50b1N0cmluZygpKTtcclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIGdldCBhdXRoZW50aWNhdGlvblRva2VuS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhlbnRpY2F0aW9uVG9rZW5LZXk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXV0aFRva2VuKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhUb2tlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVVc2VyQWN0aXZpdHkoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9sYXN0VXNlckludGVyYWN0aW9uID0gbmV3IERhdGUoKTtcclxuICAgICAgdGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIG11dGF0b3IgZm9yIGlkZW50aWZ5aW5nIHRoZSBjbGllbnRzIG9yaWdpbmFsIHJlcXVlc3QgbG9jYXRpb24uIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIGluZmx1ZW5jZSB0aGUgZW5kIGxvY2F0aW9uXHJcbiAgICogbmF2aWdhdGVkIHRvIGJ5IHtAbGluayAjbmF2aWdhdGVUb1BhdGh9LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJlZGlyZWN0VXJsIGxvY2F0aW9uIG9mIHRoZSB1c2VycyByZXF1ZXN0IGJlZm9yZSBhdXRoZW50aWNhdGlvblxyXG4gICAqL1xyXG4gIHNldCByZWRpcmVjdFVybChyZWRpcmVjdFVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9yZWRpcmVjdFVybCA9IHJlZGlyZWN0VXJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlZGlyZWN0VXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0VXJsO1xyXG4gIH1cclxuXHJcbiAgcmVxdWVzdEFjY2Vzc1Rva2VuKHJlZGlyZWN0T25TdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5faHR0cC5nZXQodGhpcy50b2tlbkxvY2F0aW9uKCksIHt3aXRoQ3JlZGVudGlhbHM6IHRydWV9KVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlVG9rZW4ocmVzcG9uc2UuYXV0aF90b2tlbik7XHJcbiAgICAgICAgICBpZiAocmVkaXJlY3RPblN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZWVkSWZBdXRoZW50aWNhdGVkKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIC8vVG9rZW4gcmVmcmVzaCBmYWlsZWQuXHJcbiAgICAgICAgICB0aGlzLmxvZ291dCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmllcyB3aGV0aGVyIG9yIG5vdCBhIGN1cnJlbnQgdXNlciBzZXNzaW9uIGV4aXN0cy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGJvb2xlYW4+fSBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgaXNBdXRoZW50aWNhdGVkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBpc0Fib3V0VG9UaW1lT3V0KCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VzZXJJc0Fib3V0VG9UaW1lT3V0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGltZW91dFN0YXJ0KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fbGFzdFVzZXJJbnRlcmFjdGlvbikge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbGFzdFVzZXJJbnRlcmFjdGlvbi52YWx1ZU9mKCkgKyAoKCh0aGlzLl9tYXhJbmFjdGl2aXR5TWludXRlcyAqIDYwKSAtIHRoaXMudXNlckNvdW50ZG93blNlY29uZHMpICogMTAwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2tlbkxvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyVXJsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJVcmwgKyB0aGlzLl90b2tlbkVuZHBvaW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuRW5kcG9pbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXJlY3RMb2dpbkxvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyVXJsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJVcmwgKyB0aGlzLl9kaXJlY3RFbmRwb2ludDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9kaXJlY3RFbmRwb2ludDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvZ291dExvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyVXJsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJVcmwgKyB0aGlzLl9sb2dvdXRQYXRoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2xvZ291dFBhdGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIGZ1bmN0aW9uIHRvIGF1dGhlbnRpY2F0ZWQgdGhlIHVzZXIgd2l0aCB0aGUgcHJvdmlkZWQgY3JlZGVudGlhbHMuIEZhaWx1cmUgcmVzdWx0cyBpbiBhbiBlcnJvciB0aGF0IGRlc2NyaWJlcyB0aGVcclxuICAgKiBzZXJ2ZXIgcmVzcG9uc2UgKHN0YXR1cyBhbmQgc3RhdHVzIG1lc3NhZ2UpIGFuZCBzaG91bGQgYmUgYWN0aW9uYWJsZSBieSB0aGUgY2xpZW50IGFwcGxpY2F0aW9uLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHVzZXJuYW1lIG9mIHRoZSBhdXRoZW50aWNhdGluZyB1c2VyIHRvIHZlcmlmeVxyXG4gICAqIEBwYXJhbSBwYXNzd29yZCBvZiB0aGUgYXV0aGVudGljYXRpbmcgdXNlciB0byB2ZXJpZnlcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxSPn0gZGVzY3JpYmluZyB0aGUgcmVzdWx0IG9mIHRoZSBsb2dpbiBhY3Rpb24sIHRydWUgb3IgYW4gZXJyb3JcclxuICAgKi9cclxuICBsb2dpbihfdXNlcm5hbWU6IHN0cmluZywgX3Bhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLl9odHRwLnBvc3QoXHJcbiAgICAgIHRoaXMuZGlyZWN0TG9naW5Mb2NhdGlvbigpLFxyXG4gICAgICB7dXNlcm5hbWU6IF91c2VybmFtZSwgcGFzc3dvcmQ6IF9wYXNzd29yZH0sXHJcbiAgICAgIHtvYnNlcnZlOiBcInJlc3BvbnNlXCJ9XHJcbiAgICApLnBpcGUobWFwKChyZXNwOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkF1dGhlbnRpY2F0aW9uIGZhaWxlZC4gXCIgKyByZXNwLnN0YXR1cyArIFwiOiBcIiArIHJlc3Auc3RhdHVzVGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpKTtcclxuICB9XHJcblxyXG5cclxuICBjbGVhckxvZ2luKCk6IE9ic2VydmFibGU8UmVzcG9uc2U+IHtcclxuICAgIC8vRnJvbnQtZW5kIGxvZ291dFxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlci5hdXRoZW50aWNhdGlvblRva2VuS2V5KTtcclxuICAgICAgdGhpcy51bnN1YnNjcmliZUZyb21Ub2tlblJlZnJlc2goKTtcclxuICAgICAgdGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQubmV4dChmYWxzZSk7XHJcbiAgICB9IGNhdGNoIChFcnJvcikge1xyXG4gICAgfVxyXG5cclxuICAgIC8vQmFjay1lbmQgbG9nb3V0XHJcbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpLnNldChBdXRoZW50aWNhdGlvblNlcnZpY2UuQ09OVEVOVF9UWVBFLCBcInRleHQvcGxhaW5cIik7XHJcbiAgICByZXR1cm4gPE9ic2VydmFibGU8UmVzcG9uc2U+PnRoaXMuX2h0dHAuZ2V0KHRoaXMubG9nb3V0TG9jYXRpb24oKSwge2hlYWRlcnM6IGhlYWRlcnN9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgZnVuY3Rpb24gdG8gc2lnbmFsIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGUgY3VycmVudCBzZXNzaW9uLiBJbnZva2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgY2xlYW4gdXAgYW55IHJlbGV2YW50IHN0YXRlXHJcbiAgICogcmVsYXRlZCB0byB0aGUgbGFzdCBhY3RpdmUgc2Vzc2lvbi5cclxuICAgKi9cclxuICBsb2dvdXQoa2VlcEN1cnJlbnRSb3V0ZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAvL1ByZXZlbnQgbG9nb3V0IGlmIGFscmVhZHkgb24gYXV0aGVudGljYXRpb24gcm91dGUuIERvaW5nIG90aGVyd2lzZSBzY3Jld3MgdXAgU0FNTFxyXG4gICAgaWYgKCEgdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlIHx8IHRoaXMuX3JvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwgIT09IHRoaXMuX2F1dGhlbnRpY2F0aW9uUm91dGUpIHtcclxuICAgICAgdGhpcy5fcmVkaXJlY3RVcmwgPSAoa2VlcEN1cnJlbnRSb3V0ZSAmJiB0aGlzLl9yb3V0ZXIucm91dGVyU3RhdGUgJiYgdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KSA/IHRoaXMuX3JvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwgOiBcIlwiO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3JlZGlyZWN0VXJsLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RVcmwgPSB0aGlzLl9yZWRpcmVjdFVybC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2xlYXJMb2dpbigpLnN1YnNjcmliZShcclxuICAgICAgICAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHRoaXMuX3JlZGlyZWN0VXJsKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh0aGlzLl9yZWRpcmVjdFVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RvcmVUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgdmFsaWQgPSB0aGlzLnZhbGlkYXRlVG9rZW4odG9rZW4pO1xyXG5cclxuICAgIC8vIHVuc3Vic2NyaWJlIGZyb20gcmVmZXNoIGJlZm9yZSB3ZSBkZWNpZGUgd2V0aGVyIHRvIHJlc3Vic2NyaWJlXHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbVRva2VuUmVmcmVzaCgpO1xyXG5cclxuICAgIGlmICh2YWxpZCkge1xyXG4gICAgICB0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0odGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhlbnRpY2F0aW9uVG9rZW5LZXksIHRva2VuKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVUb1Rva2VuUmVmcmVzaCh0b2tlbik7XHJcblxyXG4gICAgICAvL0NoYW5nZSB0aGUgQmVoYXZpb3JTdWJqZWN0IGlmIHRoZSB1c2VyIHdhcyBub3QgcHJldmlvdXNseSBhdXRoZW50aWNhdGVkLlxyXG4gICAgICAvL1NpbmNlIG90aGVyIGNvZGUgbWF5IGJlIHN1YnNjcmliaW5nIHRvIHRoaXMgb2JzZXJ2YWJsZSwgd2UgZG9uJ3Qgd2FudCB0byBjYXVzZSBuZXcgZXZlbnRzIHRvIGZpcmUgaWYganVzdCByZWZyZXNoaW5nIHRoZSBKV1QuXHJcbiAgICAgIGlmICghIHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QudmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbSh0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuYXV0aGVudGljYXRpb25Ub2tlbktleSk7XHJcbiAgICAgIHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9jZWVkSWZBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdXRoZW50aWNhdGlvblNlcnZpY2UucHJvY2VlZElmQXV0aGVudGljYXRlZDogXCIgKyB0aGlzLl9yZWRpcmVjdFVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QudmFsdWUpIHtcclxuICAgICAgLy9Mb2dpbiBjb3VudHMgYXMgdXNlciBhY3Rpdml0eSwgdG9vXHJcbiAgICAgIHRoaXMudXBkYXRlVXNlckFjdGl2aXR5KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcmVkaXJlY3RVcmwgJiYgdGhpcy5fcmVkaXJlY3RVcmwgJiYgdGhpcy5fcmVkaXJlY3RVcmwgIT09IFwiXCIpIHtcclxuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLl9yZWRpcmVjdFVybCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtcIlwiXSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVUb2tlbih0b2tlbjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRva2VuICYmICF0aGlzLl9qd3RIZWxwZXIuaXNUb2tlbkV4cGlyZWQodG9rZW4pKTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZVRvVG9rZW5SZWZyZXNoKHRva2VuOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBleHAgPSB0aGlzLl9qd3RIZWxwZXIuZ2V0VG9rZW5FeHBpcmF0aW9uRGF0ZSh0b2tlbik7XHJcblxyXG4gICAgLy8gVXNlIGEgdGltZXIgdG8gcGVyaW9kaWNhbGx5IGNoZWNrIHRpbWVvdXRzXHJcbiAgICB0aGlzLl9yZWZyZXNoU3Vic2NyaXB0aW9uID0gaW50ZXJ2YWwoMTAwMClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcblxyXG4gICAgICAgIC8vIElmIGEgdGFiIGlzIGluYWN0aXZlIHdlIGNhbid0IGtub3cgaWYgb3VyIHRpbWVyIGlzIGFjY3VyYXRlXHJcbiAgICAgICAgLy8gc28gd2hlbiB0aGUgaW50ZXJ2YWwgaGl0cyBjaGVjayBhZ2FpbnN0IHRpbWVzdGFtcHNcclxuICAgICAgICBpZiAodGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSAmJiBEYXRlLm5vdygpID4gdGhpcy5nZXRUaW1lb3V0U3RhcnQoKSkge1xyXG4gICAgICAgICAgLy9Eb24ndCB1cGRhdGUgdGhlIHN1YmplY3QgbW9yZSB0aGFuIG9uY2UhIERvaW5nIHNvIGluaXRpYWxpemVzIG1vcmUgdGhhbiBvbmUgY291bnRkb3duIHRpbWVyIVxyXG4gICAgICAgICAgaWYgKHRoaXMuX3VzZXJJc0Fib3V0VG9UaW1lT3V0LmdldFZhbHVlKCkgIT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQubmV4dCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciByZWZyZXNoIHRva2VuXHJcbiAgICAgICAgbGV0IG1zVG9FeHBpcnkgPSAoZXhwLnZhbHVlT2YoKSAtIG5ldyBEYXRlKCkudmFsdWVPZigpKTtcclxuXHJcbiAgICAgICAgLy8gUmVmcmVzaCA2MCBzZWNvbmRzIGJlZm9yZSBleHBpcnlcclxuICAgICAgICBpZiAobXNUb0V4cGlyeSA8PSA2MDAwMCkge1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5JZlVzZXJJc0FjdGl2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB1bnN1YnNjcmliZUZyb21Ub2tlblJlZnJlc2goKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcmVmcmVzaFN1YnNjcmlwdGlvbiAmJiAhIHRoaXMuX3JlZnJlc2hTdWJzY3JpcHRpb24uY2xvc2VkKSB7XHJcbiAgICAgIHRoaXMuX3JlZnJlc2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE1heFZpZXdQZXJtaXNzaW9uKCk6IFwidmlld1wiIHwgXCJ2aWV3aWRlbnRcIiB8IFwidmlld2xpbWl0ZWRcIiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXhWaWV3UGVybWlzc2lvbi5nZXRWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4Vmlld1Blcm1pc3Npb25TdWJqZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCI+IHtcclxuICAgIHJldHVybiB0aGlzLm1heFZpZXdQZXJtaXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0TWF4Vmlld1Blcm1pc3Npb24obWF4Vmlld1Blcm1pc3Npb246IFwidmlld1wiIHwgXCJ2aWV3aWRlbnRcIiB8IFwidmlld2xpbWl0ZWRcIik6IHZvaWQge1xyXG4gICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFwibWF4Vmlld1Blcm1pc3Npb25cIiwgbWF4Vmlld1Blcm1pc3Npb24pO1xyXG4gICAgdGhpcy5tYXhWaWV3UGVybWlzc2lvbi5uZXh0KG1heFZpZXdQZXJtaXNzaW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaFRva2VuSWZVc2VySXNBY3RpdmUoKTogdm9pZCB7XHJcbiAgICAvL09ubHkgcmVmcmVzaCBpZiB0aGUgdXNlciBoYXMgYmVlbiBhY3RpdmVcclxuICAgIGlmICh0aGlzLl9sYXN0VXNlckludGVyYWN0aW9uICYmICgobmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aGlzLl9sYXN0VXNlckludGVyYWN0aW9uLnZhbHVlT2YoKSkgPD0gKHRoaXMuX21heEluYWN0aXZpdHlNaW51dGVzICogNjAgKiAxMDAwKSkpIHtcclxuICAgICAgdGhpcy5yZXF1ZXN0QWNjZXNzVG9rZW4oZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNWYWxpZENvbmZpZygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90b2tlbkVuZHBvaW50ID09IG51bGwgJiYgKHRoaXMuX3NlcnZlclVybCA9PT0gbnVsbCB8fCB0aGlzLl9sb2dvdXRQYXRoID09PSBudWxsKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCVUcgQUxFUlQhIEludmFsaWQgQXV0aGVudGljYXRpb25TZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIGF1dGhlbnRpY2F0aW9uIGVuZHBvaW50KHMpLlwiKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlID09PSBudWxsIHx8IHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlci5hdXRoZW50aWNhdGlvblRva2VuS2V5ID09PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJVRyBBTEVSVCEgSW52YWxpZCBBdXRoZW50aWNhdGlvblNlcnZpY2UgY29uZmlndXJhdGlvbi4gTm8gdmFsaWQgY29uZmlndXJhdGlvbiBmb3IgbG9jYWwgc3RvcmFnZVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSkgOiBPYnNlcnZhYmxlPG5ldmVyPiB7XHJcbiAgICBsZXQgZXJyTXNnID0gKGVycm9yLm1lc3NhZ2UpID8gZXJyb3IubWVzc2FnZSA6IEF1dGhlbnRpY2F0aW9uU2VydmljZS5HRU5FUklDX0VSUl9NU0c7XHJcbiAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJNc2cpO1xyXG4gIH1cclxufVxyXG4iXX0=
|