@idea-ionic/auth 6.11.1 → 6.12.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.
Files changed (35) hide show
  1. package/environment.d.ts +1 -0
  2. package/esm2020/environment.mjs +3 -2
  3. package/esm2020/public-api.mjs +4 -1
  4. package/esm2020/src/auth.module.mjs +19 -6
  5. package/esm2020/src/auth.service.mjs +167 -42
  6. package/esm2020/src/confirmPassword.page.mjs +16 -22
  7. package/esm2020/src/forgotPassword.page.mjs +17 -24
  8. package/esm2020/src/mfaChallenge.page.mjs +45 -0
  9. package/esm2020/src/newPassword.page.mjs +18 -25
  10. package/esm2020/src/resendLink.page.mjs +12 -17
  11. package/esm2020/src/setupMFA/setupMFA.module.mjs +22 -0
  12. package/esm2020/src/setupMFA/setupMFAButton.component.mjs +43 -0
  13. package/esm2020/src/setupMFA/setupMFAModal.component.mjs +77 -0
  14. package/esm2020/src/setupMFA.page.mjs +24 -0
  15. package/esm2020/src/signIn.page.mjs +36 -47
  16. package/esm2020/src/signUp.page.mjs +18 -32
  17. package/fesm2015/idea-ionic-auth.mjs +485 -211
  18. package/fesm2015/idea-ionic-auth.mjs.map +1 -1
  19. package/fesm2020/idea-ionic-auth.mjs +470 -211
  20. package/fesm2020/idea-ionic-auth.mjs.map +1 -1
  21. package/package.json +2 -1
  22. package/public-api.d.ts +3 -0
  23. package/src/auth.module.d.ts +9 -6
  24. package/src/auth.service.d.ts +54 -13
  25. package/src/confirmPassword.page.d.ts +11 -30
  26. package/src/forgotPassword.page.d.ts +6 -19
  27. package/src/mfaChallenge.page.d.ts +20 -0
  28. package/src/newPassword.page.d.ts +7 -28
  29. package/src/resendLink.page.d.ts +5 -17
  30. package/src/setupMFA/setupMFA.module.d.ts +12 -0
  31. package/src/setupMFA/setupMFAButton.component.d.ts +26 -0
  32. package/src/setupMFA/setupMFAModal.component.d.ts +20 -0
  33. package/src/setupMFA.page.d.ts +10 -0
  34. package/src/signIn.page.d.ts +9 -51
  35. package/src/signUp.page.d.ts +8 -29
package/environment.d.ts CHANGED
@@ -13,6 +13,7 @@ export declare const environment: {
13
13
  auth: {
14
14
  registrationIsPossible: boolean;
15
15
  singleSimultaneousSession: boolean;
16
+ forceLoginWithMFA: boolean;
16
17
  };
17
18
  };
18
19
  aws: {
@@ -12,7 +12,8 @@ export const environment = {
12
12
  },
13
13
  auth: {
14
14
  registrationIsPossible: false,
15
- singleSimultaneousSession: false
15
+ singleSimultaneousSession: false,
16
+ forceLoginWithMFA: false
16
17
  }
17
18
  },
18
19
  aws: {
@@ -22,4 +23,4 @@ export const environment = {
22
23
  }
23
24
  }
24
25
  };
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9tb2R1bGVzL2F1dGgvZW52aXJvbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDekIsSUFBSSxFQUFFO1FBQ0osT0FBTyxFQUFFLEVBQUU7UUFDWCxPQUFPLEVBQUUsRUFBRTtRQUNYLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQzNCLEdBQUcsRUFBRTtZQUNILEtBQUssRUFBRSxFQUFFO1lBQ1QsWUFBWSxFQUFFLEtBQUs7U0FDcEI7UUFDRCxJQUFJLEVBQUU7WUFDSixzQkFBc0IsRUFBRSxLQUFLO1lBQzdCLHlCQUF5QixFQUFFLEtBQUs7U0FDakM7S0FDRjtJQUNELEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRTtZQUNQLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZ0JBQWdCLEVBQUUsRUFBRTtTQUNyQjtLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2VkIGJ5IHRoaXMgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgZW52aXJvbm1lbnQgPSB7XG4gIGlkZWE6IHtcbiAgICBwcm9qZWN0OiAnJyxcbiAgICB3ZWJzaXRlOiAnJyxcbiAgICBpb25pY0V4dHJhTW9kdWxlczogWydhdXRoJ10sXG4gICAgYXBwOiB7XG4gICAgICB0aXRsZTogJycsXG4gICAgICBoYXNJbnRyb1BhZ2U6IGZhbHNlXG4gICAgfSxcbiAgICBhdXRoOiB7XG4gICAgICByZWdpc3RyYXRpb25Jc1Bvc3NpYmxlOiBmYWxzZSxcbiAgICAgIHNpbmdsZVNpbXVsdGFuZW91c1Nlc3Npb246IGZhbHNlXG4gICAgfVxuICB9LFxuICBhd3M6IHtcbiAgICBjb2duaXRvOiB7XG4gICAgICB1c2VyUG9vbElkOiAnJyxcbiAgICAgIHVzZXJQb29sQ2xpZW50SWQ6ICcnXG4gICAgfVxuICB9XG59O1xuIl19
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9tb2R1bGVzL2F1dGgvZW52aXJvbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDekIsSUFBSSxFQUFFO1FBQ0osT0FBTyxFQUFFLEVBQUU7UUFDWCxPQUFPLEVBQUUsRUFBRTtRQUNYLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQzNCLEdBQUcsRUFBRTtZQUNILEtBQUssRUFBRSxFQUFFO1lBQ1QsWUFBWSxFQUFFLEtBQUs7U0FDcEI7UUFDRCxJQUFJLEVBQUU7WUFDSixzQkFBc0IsRUFBRSxLQUFLO1lBQzdCLHlCQUF5QixFQUFFLEtBQUs7WUFDaEMsaUJBQWlCLEVBQUUsS0FBSztTQUN6QjtLQUNGO0lBQ0QsR0FBRyxFQUFFO1FBQ0gsT0FBTyxFQUFFO1lBQ1AsVUFBVSxFQUFFLEVBQUU7WUFDZCxnQkFBZ0IsRUFBRSxFQUFFO1NBQ3JCO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgYnkgdGhpcyBtb2R1bGUuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnZpcm9ubWVudCA9IHtcbiAgaWRlYToge1xuICAgIHByb2plY3Q6ICcnLFxuICAgIHdlYnNpdGU6ICcnLFxuICAgIGlvbmljRXh0cmFNb2R1bGVzOiBbJ2F1dGgnXSxcbiAgICBhcHA6IHtcbiAgICAgIHRpdGxlOiAnJyxcbiAgICAgIGhhc0ludHJvUGFnZTogZmFsc2VcbiAgICB9LFxuICAgIGF1dGg6IHtcbiAgICAgIHJlZ2lzdHJhdGlvbklzUG9zc2libGU6IGZhbHNlLFxuICAgICAgc2luZ2xlU2ltdWx0YW5lb3VzU2Vzc2lvbjogZmFsc2UsXG4gICAgICBmb3JjZUxvZ2luV2l0aE1GQTogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGF3czoge1xuICAgIGNvZ25pdG86IHtcbiAgICAgIHVzZXJQb29sSWQ6ICcnLFxuICAgICAgdXNlclBvb2xDbGllbnRJZDogJydcbiAgICB9XG4gIH1cbn07XG4iXX0=
@@ -1,3 +1,6 @@
1
1
  export * from './src/auth.module';
2
2
  export * from './src/auth.service';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL21vZHVsZXMvYXV0aC9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc3JjL2F1dGgubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL2F1dGguc2VydmljZSc7XG4iXX0=
3
+ export * from './src/setupMFA/setupMFA.module';
4
+ export * from './src/setupMFA/setupMFAButton.component';
5
+ export * from './src/setupMFA/setupMFAModal.component';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL21vZHVsZXMvYXV0aC9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxvQkFBb0IsQ0FBQztBQUVuQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYyx3Q0FBd0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc3JjL2F1dGgubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL2F1dGguc2VydmljZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vc3JjL3NldHVwTUZBL3NldHVwTUZBLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9zZXR1cE1GQS9zZXR1cE1GQUJ1dHRvbi5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvc2V0dXBNRkEvc2V0dXBNRkFNb2RhbC5jb21wb25lbnQnO1xuIl19
@@ -10,6 +10,9 @@ import { IDEANewPasswordPage } from './newPassword.page';
10
10
  import { IDEAResendLinkPage } from './resendLink.page';
11
11
  import { IDEAForgotPasswordPage } from './forgotPassword.page';
12
12
  import { IDEAConfirmPasswordPage } from './confirmPassword.page';
13
+ import { IDEAMFAChallengePage } from './mfaChallenge.page';
14
+ import { IDEASetupMFAPage } from './setupMFA.page';
15
+ import { IDEASetupMFAModule } from './setupMFA/setupMFA.module';
13
16
  import * as i0 from "@angular/core";
14
17
  import * as i1 from "@angular/router";
15
18
  export class IDEAAuthModule {
@@ -20,10 +23,12 @@ IDEAAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version:
20
23
  IDEANewPasswordPage,
21
24
  IDEAResendLinkPage,
22
25
  IDEAForgotPasswordPage,
23
- IDEAConfirmPasswordPage], imports: [CommonModule,
26
+ IDEAConfirmPasswordPage,
27
+ IDEAMFAChallengePage,
28
+ IDEASetupMFAPage], imports: [CommonModule,
24
29
  FormsModule,
25
30
  IonicModule,
26
- IDEATranslationsModule, i1.RouterModule] });
31
+ IDEATranslationsModule, i1.RouterModule, IDEASetupMFAModule] });
27
32
  IDEAAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: IDEAAuthModule, imports: [CommonModule,
28
33
  FormsModule,
29
34
  IonicModule,
@@ -33,10 +38,13 @@ IDEAAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
33
38
  { path: 'sign-in', component: IDEASignInPage },
34
39
  { path: 'sign-up', component: IDEASignUpPage },
35
40
  { path: 'new-password', component: IDEANewPasswordPage },
41
+ { path: 'mfa-challenge', component: IDEAMFAChallengePage },
42
+ { path: 'setup-mfa', component: IDEASetupMFAPage },
36
43
  { path: 'resend-link', component: IDEAResendLinkPage },
37
44
  { path: 'forgot-password', component: IDEAForgotPasswordPage },
38
45
  { path: 'confirm-password', component: IDEAConfirmPasswordPage }
39
- ])] });
46
+ ]),
47
+ IDEASetupMFAModule] });
40
48
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: IDEAAuthModule, decorators: [{
41
49
  type: NgModule,
42
50
  args: [{
@@ -50,10 +58,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
50
58
  { path: 'sign-in', component: IDEASignInPage },
51
59
  { path: 'sign-up', component: IDEASignUpPage },
52
60
  { path: 'new-password', component: IDEANewPasswordPage },
61
+ { path: 'mfa-challenge', component: IDEAMFAChallengePage },
62
+ { path: 'setup-mfa', component: IDEASetupMFAPage },
53
63
  { path: 'resend-link', component: IDEAResendLinkPage },
54
64
  { path: 'forgot-password', component: IDEAForgotPasswordPage },
55
65
  { path: 'confirm-password', component: IDEAConfirmPasswordPage }
56
- ])
66
+ ]),
67
+ IDEASetupMFAModule
57
68
  ],
58
69
  declarations: [
59
70
  IDEASignInPage,
@@ -61,8 +72,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
61
72
  IDEANewPasswordPage,
62
73
  IDEAResendLinkPage,
63
74
  IDEAForgotPasswordPage,
64
- IDEAConfirmPasswordPage
75
+ IDEAConfirmPasswordPage,
76
+ IDEAMFAChallengePage,
77
+ IDEASetupMFAPage
65
78
  ]
66
79
  }]
67
80
  }] });
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2F1dGgvc3JjL2F1dGgubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBMkJqRSxNQUFNLE9BQU8sY0FBYzs7MkdBQWQsY0FBYzs0R0FBZCxjQUFjLGlCQVJ2QixjQUFjO1FBQ2QsY0FBYztRQUNkLG1CQUFtQjtRQUNuQixrQkFBa0I7UUFDbEIsc0JBQXNCO1FBQ3RCLHVCQUF1QixhQXBCdkIsWUFBWTtRQUNaLFdBQVc7UUFDWCxXQUFXO1FBQ1gsc0JBQXNCOzRHQW9CYixjQUFjLFlBdkJ2QixZQUFZO1FBQ1osV0FBVztRQUNYLFdBQVc7UUFDWCxzQkFBc0I7UUFDdEIsWUFBWSxDQUFDLFFBQVEsQ0FBQztZQUNwQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFO1lBQ3RELEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO1lBQzlDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO1lBQzlDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUU7WUFDeEQsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRTtZQUN0RCxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUU7WUFDOUQsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFO1NBQ2pFLENBQUM7MkZBV08sY0FBYztrQkF6QjFCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxXQUFXO3dCQUNYLHNCQUFzQjt3QkFDdEIsWUFBWSxDQUFDLFFBQVEsQ0FBQzs0QkFDcEIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRTs0QkFDdEQsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUU7NEJBQzlDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFOzRCQUM5QyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFOzRCQUN4RCxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFOzRCQUN0RCxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUU7NEJBQzlELEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRTt5QkFDakUsQ0FBQztxQkFDSDtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osY0FBYzt3QkFDZCxjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixzQkFBc0I7d0JBQ3RCLHVCQUF1QjtxQkFDeEI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uaWNNb2R1bGUgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBJREVBVHJhbnNsYXRpb25zTW9kdWxlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQVNpZ25JblBhZ2UgfSBmcm9tICcuL3NpZ25Jbi5wYWdlJztcbmltcG9ydCB7IElERUFTaWduVXBQYWdlIH0gZnJvbSAnLi9zaWduVXAucGFnZSc7XG5pbXBvcnQgeyBJREVBTmV3UGFzc3dvcmRQYWdlIH0gZnJvbSAnLi9uZXdQYXNzd29yZC5wYWdlJztcbmltcG9ydCB7IElERUFSZXNlbmRMaW5rUGFnZSB9IGZyb20gJy4vcmVzZW5kTGluay5wYWdlJztcbmltcG9ydCB7IElERUFGb3Jnb3RQYXNzd29yZFBhZ2UgfSBmcm9tICcuL2ZvcmdvdFBhc3N3b3JkLnBhZ2UnO1xuaW1wb3J0IHsgSURFQUNvbmZpcm1QYXNzd29yZFBhZ2UgfSBmcm9tICcuL2NvbmZpcm1QYXNzd29yZC5wYWdlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBJb25pY01vZHVsZSxcbiAgICBJREVBVHJhbnNsYXRpb25zTW9kdWxlLFxuICAgIFJvdXRlck1vZHVsZS5mb3JDaGlsZChbXG4gICAgICB7IHBhdGg6ICcnLCByZWRpcmVjdFRvOiAnc2lnbi1pbicsIHBhdGhNYXRjaDogJ2Z1bGwnIH0sXG4gICAgICB7IHBhdGg6ICdzaWduLWluJywgY29tcG9uZW50OiBJREVBU2lnbkluUGFnZSB9LFxuICAgICAgeyBwYXRoOiAnc2lnbi11cCcsIGNvbXBvbmVudDogSURFQVNpZ25VcFBhZ2UgfSxcbiAgICAgIHsgcGF0aDogJ25ldy1wYXNzd29yZCcsIGNvbXBvbmVudDogSURFQU5ld1Bhc3N3b3JkUGFnZSB9LFxuICAgICAgeyBwYXRoOiAncmVzZW5kLWxpbmsnLCBjb21wb25lbnQ6IElERUFSZXNlbmRMaW5rUGFnZSB9LFxuICAgICAgeyBwYXRoOiAnZm9yZ290LXBhc3N3b3JkJywgY29tcG9uZW50OiBJREVBRm9yZ290UGFzc3dvcmRQYWdlIH0sXG4gICAgICB7IHBhdGg6ICdjb25maXJtLXBhc3N3b3JkJywgY29tcG9uZW50OiBJREVBQ29uZmlybVBhc3N3b3JkUGFnZSB9XG4gICAgXSlcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgSURFQVNpZ25JblBhZ2UsXG4gICAgSURFQVNpZ25VcFBhZ2UsXG4gICAgSURFQU5ld1Bhc3N3b3JkUGFnZSxcbiAgICBJREVBUmVzZW5kTGlua1BhZ2UsXG4gICAgSURFQUZvcmdvdFBhc3N3b3JkUGFnZSxcbiAgICBJREVBQ29uZmlybVBhc3N3b3JkUGFnZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIElERUFBdXRoTW9kdWxlIHt9XG4iXX0=
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2F1dGgvc3JjL2F1dGgubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBZ0NoRSxNQUFNLE9BQU8sY0FBYzs7MkdBQWQsY0FBYzs0R0FBZCxjQUFjLGlCQVZ2QixjQUFjO1FBQ2QsY0FBYztRQUNkLG1CQUFtQjtRQUNuQixrQkFBa0I7UUFDbEIsc0JBQXNCO1FBQ3RCLHVCQUF1QjtRQUN2QixvQkFBb0I7UUFDcEIsZ0JBQWdCLGFBekJoQixZQUFZO1FBQ1osV0FBVztRQUNYLFdBQVc7UUFDWCxzQkFBc0IsbUJBWXRCLGtCQUFrQjs0R0FhVCxjQUFjLFlBNUJ2QixZQUFZO1FBQ1osV0FBVztRQUNYLFdBQVc7UUFDWCxzQkFBc0I7UUFDdEIsWUFBWSxDQUFDLFFBQVEsQ0FBQztZQUNwQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFO1lBQ3RELEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO1lBQzlDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO1lBQzlDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUU7WUFDeEQsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRTtZQUMxRCxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO1lBQ2xELEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUU7WUFDdEQsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFO1lBQzlELEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRTtTQUNqRSxDQUFDO1FBQ0Ysa0JBQWtCOzJGQWFULGNBQWM7a0JBOUIxQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsV0FBVzt3QkFDWCxzQkFBc0I7d0JBQ3RCLFlBQVksQ0FBQyxRQUFRLENBQUM7NEJBQ3BCLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7NEJBQ3RELEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFOzRCQUM5QyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRTs0QkFDOUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRTs0QkFDeEQsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRTs0QkFDMUQsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTs0QkFDbEQsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRTs0QkFDdEQsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFOzRCQUM5RCxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUU7eUJBQ2pFLENBQUM7d0JBQ0Ysa0JBQWtCO3FCQUNuQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osY0FBYzt3QkFDZCxjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixzQkFBc0I7d0JBQ3RCLHVCQUF1Qjt3QkFDdkIsb0JBQW9CO3dCQUNwQixnQkFBZ0I7cUJBQ2pCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbmljTW9kdWxlIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgSURFQVRyYW5zbGF0aW9uc01vZHVsZSB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbmltcG9ydCB7IElERUFTaWduSW5QYWdlIH0gZnJvbSAnLi9zaWduSW4ucGFnZSc7XG5pbXBvcnQgeyBJREVBU2lnblVwUGFnZSB9IGZyb20gJy4vc2lnblVwLnBhZ2UnO1xuaW1wb3J0IHsgSURFQU5ld1Bhc3N3b3JkUGFnZSB9IGZyb20gJy4vbmV3UGFzc3dvcmQucGFnZSc7XG5pbXBvcnQgeyBJREVBUmVzZW5kTGlua1BhZ2UgfSBmcm9tICcuL3Jlc2VuZExpbmsucGFnZSc7XG5pbXBvcnQgeyBJREVBRm9yZ290UGFzc3dvcmRQYWdlIH0gZnJvbSAnLi9mb3Jnb3RQYXNzd29yZC5wYWdlJztcbmltcG9ydCB7IElERUFDb25maXJtUGFzc3dvcmRQYWdlIH0gZnJvbSAnLi9jb25maXJtUGFzc3dvcmQucGFnZSc7XG5pbXBvcnQgeyBJREVBTUZBQ2hhbGxlbmdlUGFnZSB9IGZyb20gJy4vbWZhQ2hhbGxlbmdlLnBhZ2UnO1xuaW1wb3J0IHsgSURFQVNldHVwTUZBUGFnZSB9IGZyb20gJy4vc2V0dXBNRkEucGFnZSc7XG5cbmltcG9ydCB7IElERUFTZXR1cE1GQU1vZHVsZSB9IGZyb20gJy4vc2V0dXBNRkEvc2V0dXBNRkEubW9kdWxlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBJb25pY01vZHVsZSxcbiAgICBJREVBVHJhbnNsYXRpb25zTW9kdWxlLFxuICAgIFJvdXRlck1vZHVsZS5mb3JDaGlsZChbXG4gICAgICB7IHBhdGg6ICcnLCByZWRpcmVjdFRvOiAnc2lnbi1pbicsIHBhdGhNYXRjaDogJ2Z1bGwnIH0sXG4gICAgICB7IHBhdGg6ICdzaWduLWluJywgY29tcG9uZW50OiBJREVBU2lnbkluUGFnZSB9LFxuICAgICAgeyBwYXRoOiAnc2lnbi11cCcsIGNvbXBvbmVudDogSURFQVNpZ25VcFBhZ2UgfSxcbiAgICAgIHsgcGF0aDogJ25ldy1wYXNzd29yZCcsIGNvbXBvbmVudDogSURFQU5ld1Bhc3N3b3JkUGFnZSB9LFxuICAgICAgeyBwYXRoOiAnbWZhLWNoYWxsZW5nZScsIGNvbXBvbmVudDogSURFQU1GQUNoYWxsZW5nZVBhZ2UgfSxcbiAgICAgIHsgcGF0aDogJ3NldHVwLW1mYScsIGNvbXBvbmVudDogSURFQVNldHVwTUZBUGFnZSB9LFxuICAgICAgeyBwYXRoOiAncmVzZW5kLWxpbmsnLCBjb21wb25lbnQ6IElERUFSZXNlbmRMaW5rUGFnZSB9LFxuICAgICAgeyBwYXRoOiAnZm9yZ290LXBhc3N3b3JkJywgY29tcG9uZW50OiBJREVBRm9yZ290UGFzc3dvcmRQYWdlIH0sXG4gICAgICB7IHBhdGg6ICdjb25maXJtLXBhc3N3b3JkJywgY29tcG9uZW50OiBJREVBQ29uZmlybVBhc3N3b3JkUGFnZSB9XG4gICAgXSksXG4gICAgSURFQVNldHVwTUZBTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIElERUFTaWduSW5QYWdlLFxuICAgIElERUFTaWduVXBQYWdlLFxuICAgIElERUFOZXdQYXNzd29yZFBhZ2UsXG4gICAgSURFQVJlc2VuZExpbmtQYWdlLFxuICAgIElERUFGb3Jnb3RQYXNzd29yZFBhZ2UsXG4gICAgSURFQUNvbmZpcm1QYXNzd29yZFBhZ2UsXG4gICAgSURFQU1GQUNoYWxsZW5nZVBhZ2UsXG4gICAgSURFQVNldHVwTUZBUGFnZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIElERUFBdXRoTW9kdWxlIHt9XG4iXX0=
@@ -15,6 +15,7 @@ const DEVICE_KEY_ATTRIBUTE = 'custom:'.concat(env.idea.project);
15
15
  export class IDEAAuthService {
16
16
  constructor(storage) {
17
17
  this.storage = storage;
18
+ this.mfaProjectName = env.idea.app.title ?? env.idea.project;
18
19
  this.userPool = new CognitoUserPool({
19
20
  UserPoolId: env.aws.cognito.userPoolId,
20
21
  ClientId: env.aws.cognito.userPoolClientId
@@ -43,33 +44,63 @@ export class IDEAAuthService {
43
44
  */
44
45
  login(username, password) {
45
46
  return new Promise((resolve, reject) => {
46
- // get a cognito user and try to authenticate
47
- this.prepareCognitoUser(username).authenticateUser(this.prepareAuthDetails(username, password), {
48
- onSuccess: () => resolve(false),
47
+ const user = this.prepareCognitoUser(username);
48
+ user.authenticateUser(this.prepareAuthDetails(username, password), {
49
+ onSuccess: () => resolve(env.idea.auth.forceLoginWithMFA ? LoginOutcomeActions.MFA_SETUP : LoginOutcomeActions.NONE),
49
50
  onFailure: (err) => reject(err),
50
- newPasswordRequired: () => resolve(true)
51
+ newPasswordRequired: () => {
52
+ this.challengeUsername = username;
53
+ this.challengePassword = password;
54
+ resolve(LoginOutcomeActions.NEW_PASSWORD);
55
+ },
56
+ totpRequired: () => {
57
+ this.challengeUsername = username;
58
+ this.challengePassword = password;
59
+ resolve(LoginOutcomeActions.MFA_CHALLENGE);
60
+ }
51
61
  });
52
62
  });
53
63
  }
54
64
  /**
55
- * Complete a complete new password flow in the authentication.
65
+ * Complete the new password flow in the authentication.
56
66
  */
57
- confirmNewPassword(username, tempPassword, newPassword) {
67
+ confirmNewPassword(newPassword) {
58
68
  return new Promise((resolve, reject) => {
59
- // login with the old password
60
- const user = this.prepareCognitoUser(username);
61
- user.authenticateUser(this.prepareAuthDetails(username, tempPassword), {
69
+ const user = this.prepareCognitoUser(this.challengeUsername);
70
+ user.authenticateUser(this.prepareAuthDetails(this.challengeUsername, this.challengePassword), {
62
71
  onSuccess: () => resolve(),
63
72
  onFailure: (err) => reject(err),
64
- newPasswordRequired: () =>
65
- // complete the new password challenge
66
- user.completeNewPasswordChallenge(newPassword, {}, {
67
- onSuccess: () => resolve(),
73
+ newPasswordRequired: () => user.completeNewPasswordChallenge(newPassword, {}, {
74
+ onSuccess: () => {
75
+ this.challengeUsername = null;
76
+ this.challengePassword = null;
77
+ resolve();
78
+ },
68
79
  onFailure: (err) => reject(err)
69
80
  })
70
81
  });
71
82
  });
72
83
  }
84
+ /**
85
+ * Complete the MFA challenge flow in the authentication.
86
+ */
87
+ completeMFAChallenge(otpCode) {
88
+ return new Promise((resolve, reject) => {
89
+ const user = this.prepareCognitoUser(this.challengeUsername);
90
+ user.authenticateUser(this.prepareAuthDetails(this.challengeUsername, this.challengePassword), {
91
+ onSuccess: () => resolve(),
92
+ onFailure: (err) => reject(err),
93
+ totpRequired: (challengeName) => user.sendMFACode(otpCode, {
94
+ onSuccess: () => {
95
+ this.challengeUsername = null;
96
+ this.challengePassword = null;
97
+ resolve();
98
+ },
99
+ onFailure: err => reject(err)
100
+ }, challengeName)
101
+ });
102
+ });
103
+ }
73
104
  /**
74
105
  * Register a new user a set its default attributes.
75
106
  */
@@ -85,9 +116,20 @@ export class IDEAAuthService {
85
116
  if (!attributes.email)
86
117
  attrs.push(this.prepareUserAttribute('email', username));
87
118
  // register the new user to the pool
88
- this.userPool.signUp(username, password, attrs, null, (err, res) => err ? reject(err) : resolve(res.user));
119
+ this.userPool.signUp(username, password, attrs, null, (err, res) => {
120
+ if (err)
121
+ return reject(err);
122
+ this.newAccountJustRegistered = username;
123
+ resolve(res.user);
124
+ });
89
125
  });
90
126
  }
127
+ /**
128
+ * In case new account has just been registered, return the username.
129
+ */
130
+ getNewAccountJustRegistered() {
131
+ return this.newAccountJustRegistered;
132
+ }
91
133
  /**
92
134
  * Confirm a new registration through the confirmation code sent by Cognito.
93
135
  */
@@ -150,13 +192,80 @@ export class IDEAAuthService {
150
192
  */
151
193
  confirmPassword(username, code, newPwd) {
152
194
  return new Promise((resolve, reject) => {
153
- // get the user and confirm a new password
154
195
  this.prepareCognitoUser(username).confirmPassword(code, newPwd, {
155
196
  onSuccess: () => resolve(),
156
197
  onFailure: (err) => reject(err)
157
198
  });
158
199
  });
159
200
  }
201
+ /**
202
+ * Gets the URL for enabling MFA. This URL can be used to generate a QR Code to read with an authenticator app.
203
+ */
204
+ getURLForEnablingMFA() {
205
+ return new Promise((resolve, reject) => {
206
+ const user = this.userPool.getCurrentUser();
207
+ if (!user)
208
+ return reject();
209
+ user.getSession((err) => {
210
+ if (err)
211
+ return reject(err);
212
+ user.associateSoftwareToken({
213
+ associateSecretCode: (secretCode) => resolve(`otpauth://totp/${encodeURI(this.mfaProjectName)}?secret=${secretCode}`),
214
+ onFailure: (err) => reject(err)
215
+ });
216
+ });
217
+ });
218
+ }
219
+ /**
220
+ * Check whether the user has MFA enabled.
221
+ */
222
+ checkIfUserHasMFAEnabled(bypassCache = false) {
223
+ return new Promise((resolve, reject) => {
224
+ const user = this.userPool.getCurrentUser();
225
+ if (!user)
226
+ return reject();
227
+ user.getSession((err) => {
228
+ if (err)
229
+ return reject(err);
230
+ user.getUserData((err, data) => {
231
+ if (err)
232
+ return reject(err);
233
+ const isMFAEnabled = !!(data.UserMFASettingList && data.UserMFASettingList.includes('SOFTWARE_TOKEN_MFA'));
234
+ resolve(isMFAEnabled);
235
+ }, { bypassCache });
236
+ });
237
+ });
238
+ }
239
+ /**
240
+ * Configure a MFA device for the user.
241
+ */
242
+ setMFADevice(otp, mfaDeviceName, enabled = true, preferred = true) {
243
+ return new Promise((resolve, reject) => {
244
+ const user = this.userPool.getCurrentUser();
245
+ if (!user)
246
+ return reject();
247
+ user.getSession((err) => {
248
+ if (err)
249
+ return reject(err);
250
+ user.verifySoftwareToken(otp, mfaDeviceName, {
251
+ onSuccess: () => user.setUserMfaPreference(null, { Enabled: enabled, PreferredMfa: preferred }, (err) => err ? reject(err) : resolve()),
252
+ onFailure: (err) => reject(err)
253
+ });
254
+ });
255
+ });
256
+ }
257
+ /**
258
+ * Enable a new MFA device for the user by inserting an OTP code generated by it.
259
+ */
260
+ enableMFA(otp, mfaDeviceName = 'default') {
261
+ return this.setMFADevice(otp, mfaDeviceName, true, true);
262
+ }
263
+ /**
264
+ * Disable MFA for a user by inserting an OTP code generated by it.
265
+ */
266
+ disableMFA(otp, mfaDeviceName = 'default') {
267
+ return this.setMFADevice(otp, mfaDeviceName, false, false);
268
+ }
160
269
  /**
161
270
  * Check if a user is currently authenticated.
162
271
  * @param offlineAllowed if set and if offline, skip authentication and retrieve data locally
@@ -178,33 +287,39 @@ export class IDEAAuthService {
178
287
  user.getSession((err, session) => {
179
288
  if (err)
180
289
  return reject(err);
181
- // get user attributes
182
- user.getUserAttributes((e, attributes) => {
183
- if (e)
184
- return reject(e);
185
- // remap user attributes
186
- const userDetails = {};
187
- attributes.forEach((a) => (userDetails[a.getName()] = a.getValue()));
188
- // add the user's groups to the attributes
189
- const sessionInfo = session.getAccessToken().decodePayload();
190
- const groups = sessionInfo['cognito:groups'] || [];
191
- userDetails['groups'] = groups;
192
- // run some checks considering the user's groups and devices (based on the project's configuration)
193
- this.runPostAuthChecks(userDetails, err => {
194
- // in case some check failed, reject the authorisation flow
195
- if (err)
196
- return reject(err);
197
- // (async) save the refresh token so it can be accessed by other procedures
198
- this.storage.set('AuthRefreshToken', session.getRefreshToken().getToken());
199
- // set a timer to manage the autorefresh of the idToken (through the refreshToken)
200
- setTimeout(() => this.refreshSession(user, session.getRefreshToken().getToken(), getFreshIdTokenOnExp), 15 * 60 * 1000); // every 15 minutes
201
- // (async) if offlineAllowed, save data locally, to use it next time we'll be offline
202
- if (offlineAllowed)
203
- this.storage.set('AuthUserDetails', userDetails);
204
- // return the idToken (to use with API)
205
- resolve({ idToken: session.getIdToken().getJwtToken(), userDetails });
290
+ user.getUserData((err, data) => {
291
+ if (err)
292
+ return reject(err);
293
+ const isMFAEnabled = !!(data.UserMFASettingList && data.UserMFASettingList.includes('SOFTWARE_TOKEN_MFA'));
294
+ if (!isMFAEnabled && env.idea.auth.forceLoginWithMFA)
295
+ return reject(new Error(LoginOutcomeActions.MFA_SETUP));
296
+ user.getUserAttributes((e, attributes) => {
297
+ if (e)
298
+ return reject(e);
299
+ // remap user attributes
300
+ const userDetails = {};
301
+ attributes.forEach((a) => (userDetails[a.getName()] = a.getValue()));
302
+ // add the user's groups to the attributes
303
+ const sessionInfo = session.getAccessToken().decodePayload();
304
+ const groups = sessionInfo['cognito:groups'] || [];
305
+ userDetails['groups'] = groups;
306
+ // run some checks considering the user's groups and devices (based on the project's configuration)
307
+ this.runPostAuthChecks(userDetails, err => {
308
+ // in case some check failed, reject the authorisation flow
309
+ if (err)
310
+ return reject(err);
311
+ // (async) save the refresh token so it can be accessed by other procedures
312
+ this.storage.set('AuthRefreshToken', session.getRefreshToken().getToken());
313
+ // set a timer to manage the autorefresh of the idToken (through the refreshToken)
314
+ setTimeout(() => this.refreshSession(user, session.getRefreshToken().getToken(), getFreshIdTokenOnExp), 15 * 60 * 1000); // every 15 minutes
315
+ // (async) if offlineAllowed, save data locally, to use it next time we'll be offline
316
+ if (offlineAllowed)
317
+ this.storage.set('AuthUserDetails', userDetails);
318
+ // return the idToken (to use with API)
319
+ resolve({ idToken: session.getIdToken().getJwtToken(), userDetails });
320
+ });
206
321
  });
207
- });
322
+ }, { bypassCache: true });
208
323
  });
209
324
  }
210
325
  });
@@ -315,4 +430,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
315
430
  type: Injectable,
316
431
  args: [{ providedIn: 'root' }]
317
432
  }], ctorParameters: function () { return [{ type: i1.IDEAStorageService }]; } });
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbW9kdWxlcy9hdXRoL3NyYy9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLG1CQUFtQixFQUdwQixNQUFNLDRCQUE0QixDQUFDO0FBSXBDLE9BQU8sRUFBRSxXQUFXLElBQUksR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFFMUM7O0dBRUc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVoRTs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFBc0IsT0FBMkI7UUFBM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBQztZQUNsQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUN0QyxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNPLGtCQUFrQixDQUFDLFFBQWdCLEVBQUUsR0FBVztRQUN4RCxPQUFPLElBQUkscUJBQXFCLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRDs7T0FFRztJQUNPLGtCQUFrQixDQUFDLFFBQWdCO1FBQzNDLE9BQU8sSUFBSSxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENB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QyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7NEdBcFNVLGVBQWU7Z0hBQWYsZUFBZSxjQURGLE1BQU07MkZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQXV0aGVudGljYXRpb25EZXRhaWxzLFxuICBDb2duaXRvVXNlcixcbiAgQ29nbml0b1VzZXJBdHRyaWJ1dGUsXG4gIENvZ25pdG9Vc2VyUG9vbCxcbiAgQ29nbml0b1JlZnJlc2hUb2tlbixcbiAgQ29nbml0b1VzZXJTZXNzaW9uLFxuICBJU2lnblVwUmVzdWx0XG59IGZyb20gJ2FtYXpvbi1jb2duaXRvLWlkZW50aXR5LWpzJztcblxuaW1wb3J0IHsgSURFQVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgZW52aXJvbm1lbnQgYXMgZW52IH0gZnJvbSAnQGVudic7XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIENvZ25pdG8ncyB1c2VyIGF0dHJpYnV0ZSB3aGljaCBjb250YWlucyB0aGUga2V5IG9mIHRoZSBsYXN0IGRldmljZSB0byBsb2dpbiBpbiB0aGlzIHByb2plY3QuXG4gKi9cbmNvbnN0IERFVklDRV9LRVlfQVRUUklCVVRFID0gJ2N1c3RvbTonLmNvbmNhdChlbnYuaWRlYS5wcm9qZWN0KTtcblxuLyoqXG4gKiBDb2duaXRvIHdyYXBwZXIgdG8gbWFuYWdlIHRoZSBhdXRoZW50aWNhdGlvbiBmbG93LlxuICpcbiAqIE5vdGU6IGluIElERUEncyBDb2duaXRvIHVzZXJzIHBvb2xzLCB0aGUgZW1haWwgaXMgYW4gYWxpYXMgb2YgdGhlIHVzZXJuYW1lLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIElERUFBdXRoU2VydmljZSB7XG4gIHByb3RlY3RlZCB1c2VyUG9vbDogQ29nbml0b1VzZXJQb29sO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdG9yYWdlOiBJREVBU3RvcmFnZVNlcnZpY2UpIHtcbiAgICB0aGlzLnVzZXJQb29sID0gbmV3IENvZ25pdG9Vc2VyUG9vbCh7XG4gICAgICBVc2VyUG9vbElkOiBlbnYuYXdzLmNvZ25pdG8udXNlclBvb2xJZCxcbiAgICAgIENsaWVudElkOiBlbnYuYXdzLmNvZ25pdG8udXNlclBvb2xDbGllbnRJZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgdGhlIG5lY2Vzc2FyeSBzdHJ1Y3R1cmUgdG8gZ2V0IGF1dGhvcml6ZWQgaW4gQ29nbml0by5cbiAgICovXG4gIHByb3RlY3RlZCBwcmVwYXJlQXV0aERldGFpbHModXNlcm5hbWU6IHN0cmluZywgcHdkOiBzdHJpbmcpOiBBdXRoZW50aWNhdGlvbkRldGFpbHMge1xuICAgIHJldHVybiBuZXcgQXV0aGVudGljYXRpb25EZXRhaWxzKHsgVXNlcm5hbWU6IHVzZXJuYW1lLCBQYXNzd29yZDogcHdkIH0pO1xuICB9XG4gIC8qKlxuICAgKiBQcmVwYXJlIHRoZSBuZWNlc3Nhcnkgc3RydWN0dXJlIHRvIGlkZW50aWZ5IGEgQ29nbml0byB1c2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmVDb2duaXRvVXNlcih1c2VybmFtZTogc3RyaW5nKTogQ29nbml0b1VzZXIge1xuICAgIHJldHVybiBuZXcgQ29nbml0b1VzZXIoeyBVc2VybmFtZTogdXNlcm5hbWUsIFBvb2w6IHRoaXMudXNlclBvb2wgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFByZXBhcmUgYSB1c2VyIGF0dHJpYnV0ZSAodGhleSBhcmUgYWxsIHN0cmluZ3MpIGluIENvZ25pdG8ncyBmb3JtYXQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlcGFyZVVzZXJBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29nbml0b1VzZXJBdHRyaWJ1dGUge1xuICAgIHJldHVybiBuZXcgQ29nbml0b1VzZXJBdHRyaWJ1dGUoeyBOYW1lOiBuYW1lLCBWYWx1ZTogdmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIGxvZ2luIHRocm91Z2ggdXNlcm5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKi9cbiAgcHVibGljIGxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gZ2V0IGEgY29nbml0byB1c2VyIGFuZCB0cnkgdG8gYXV0aGVudGljYXRlXG4gICAgICB0aGlzLnByZXBhcmVDb2duaXRvVXNlcih1c2VybmFtZSkuYXV0aGVudGljYXRlVXNlcih0aGlzLnByZXBhcmVBdXRoRGV0YWlscyh1c2VybmFtZSwgcGFzc3dvcmQpLCB7XG4gICAgICAgIG9uU3VjY2VzczogKCkgPT4gcmVzb2x2ZShmYWxzZSksXG4gICAgICAgIG9uRmFpbHVyZTogKGVycjogRXJyb3IpID0+IHJlamVjdChlcnIpLFxuICAgICAgICBuZXdQYXNzd29yZFJlcXVpcmVkOiAoKSA9PiByZXNvbHZlKHRydWUpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ29tcGxldGUgYSBjb21wbGV0ZSBuZXcgcGFzc3dvcmQgZmxvdyBpbiB0aGUgYXV0aGVudGljYXRpb24uXG4gICAqL1xuICBwdWJsaWMgY29uZmlybU5ld1Bhc3N3b3JkKHVzZXJuYW1lOiBzdHJpbmcsIHRlbXBQYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGxvZ2luIHdpdGggdGhlIG9sZCBwYXNzd29yZFxuICAgICAgY29uc3QgdXNlciA9IHRoaXMucHJlcGFyZUNvZ25pdG9Vc2VyKHVzZXJuYW1lKTtcbiAgICAgIHVzZXIuYXV0aGVudGljYXRlVXNlcih0aGlzLnByZXBhcmVBdXRoRGV0YWlscyh1c2VybmFtZSwgdGVtcFBhc3N3b3JkKSwge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHJlc29sdmUoKSxcbiAgICAgICAgb25GYWlsdXJlOiAoZXJyOiBFcnJvcikgPT4gcmVqZWN0KGVyciksXG4gICAgICAgIG5ld1Bhc3N3b3JkUmVxdWlyZWQ6ICgpID0+XG4gICAgICAgICAgLy8gY29tcGxldGUgdGhlIG5ldyBwYXNzd29yZCBjaGFsbGVuZ2VcbiAgICAgICAgICB1c2VyLmNvbXBsZXRlTmV3UGFzc3dvcmRDaGFsbGVuZ2UoXG4gICAgICAgICAgICBuZXdQYXNzd29yZCxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHJlc29sdmUoKSxcbiAgICAgICAgICAgICAgb25GYWlsdXJlOiAoZXJyOiBFcnJvcikgPT4gcmVqZWN0KGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBuZXcgdXNlciBhIHNldCBpdHMgZGVmYXVsdCBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGF0dHJpYnV0ZXM/OiBhbnkpOiBQcm9taXNlPENvZ25pdG9Vc2VyPiB7XG4gICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGFkZCBhdHRyaWJ1dGVzIGxpa2UgdGhlIGVtYWlsIGFkZHJlc3MgYW5kIHRoZSBmdWxsbmFtZVxuICAgICAgY29uc3QgYXR0cnMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBhdHRyaWJ1dGVzKVxuICAgICAgICBpZiAoYXR0cmlidXRlc1twcm9wXSkgYXR0cnMucHVzaCh0aGlzLnByZXBhcmVVc2VyQXR0cmlidXRlKHByb3AsIGF0dHJpYnV0ZXNbcHJvcF0pKTtcbiAgICAgIC8vIGFkZCB0aGUgZW1haWwsIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSB1c2VybmFtZSBmb3IgbW9zdCBvZiBvdXIgUG9vbHNcbiAgICAgIGlmICghYXR0cmlidXRlcy5lbWFpbCkgYXR0cnMucHVzaCh0aGlzLnByZXBhcmVVc2VyQXR0cmlidXRlKCdlbWFpbCcsIHVzZXJuYW1lKSk7XG4gICAgICAvLyByZWdpc3RlciB0aGUgbmV3IHVzZXIgdG8gdGhlIHBvb2xcbiAgICAgIHRoaXMudXNlclBvb2wuc2lnblVwKHVzZXJuYW1lLCBwYXNzd29yZCwgYXR0cnMsIG51bGwsIChlcnI6IEVycm9yLCByZXM6IElTaWduVXBSZXN1bHQpID0+XG4gICAgICAgIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXMudXNlcilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENvbmZpcm0gYSBuZXcgcmVnaXN0cmF0aW9uIHRocm91Z2ggdGhlIGNvbmZpcm1hdGlvbiBjb2RlIHNlbnQgYnkgQ29nbml0by5cbiAgICovXG4gIHB1YmxpYyBjb25maXJtUmVnaXN0cmF0aW9uKHVzZXJuYW1lOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnByZXBhcmVDb2duaXRvVXNlcih1c2VybmFtZSkuY29uZmlybVJlZ2lzdHJhdGlvbihjb2RlLCB0cnVlLCAoZXJyOiBFcnJvcikgPT5cbiAgICAgICAgZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFNlbmQgYWdhaW4gYSBjb25maXJtYXRpb24gY29kZSBmb3IgYSBuZXcgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlc2VuZENvbmZpcm1hdGlvbkNvZGUodXNlcm5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnByZXBhcmVDb2duaXRvVXNlcih1c2VybmFtZSkucmVzZW5kQ29uZmlybWF0aW9uQ29kZSgoZXJyOiBFcnJvcikgPT4gKGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZSgpKSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIExvZ291dCB0aGUgY3VycmVudGx5IHNpZ25lZC1pbiB1c2VyLlxuICAgKi9cbiAgcHVibGljIGxvZ291dChvcHRpb25zPzogeyBnbG9iYWw6IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgZ2xvYmFsOiBmYWxzZSB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gcmVtb3ZlIHRoZSByZWZyZXNoIHRva2VuIHByZXZpb3NseSBzYXZlZFxuICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZSgnQXV0aFJlZnJlc2hUb2tlbicpLnRoZW4oKCkgPT5cbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBvcHRpb25hbCBhdXRoIGRldGFpbHNcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZSgnQXV0aFVzZXJEZXRhaWxzJykudGhlbigoKSA9PiB7XG4gICAgICAgICAgLy8gZ2V0IHRoZSB1c2VyIGFuZCB0aGUgc2Vzc2lvblxuICAgICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXJQb29sLmdldEN1cnJlbnRVc2VyKCk7XG4gICAgICAgICAgdXNlci5nZXRTZXNzaW9uKGFzeW5jIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgc2Vzc2lvbiBpcyBhY3RpdmUsIHJ1biB0aGUgb25saW5lIHNpZ24tb3V0OyBvdGhlcndpc2UsIG9ubHkgdGhlIGxvY2FsIGRhdGEgaGFzIGJlZW4gZGVsZXRlZFxuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICAgIC8vIGlmIGEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2Ugd2FzIHNhdmVkLCBmb3JnZXQgaXRcbiAgICAgICAgICAgIGlmIChlbnYuaWRlYS5hdXRoLnNpbmdsZVNpbXVsdGFuZW91c1Nlc3Npb24pIGF3YWl0IHRoaXMuc2V0Q3VycmVudERldmljZUZvclByb2plY3QobnVsbCk7XG4gICAgICAgICAgICAvLyBzaWduLW91dCBmcm9tIHRoZSBwb29sICh0ZXJtaW5hdGUgdGhlIGN1cnJlbnQgc2Vzc2lvbiBvciBhbGwgdGhlIHNlc3Npb25zKVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2xvYmFsKSB1c2VyLmdsb2JhbFNpZ25PdXQoeyBvblN1Y2Nlc3M6ICgpID0+IHJlc29sdmUoKSwgb25GYWlsdXJlOiBlcnIgPT4gcmVqZWN0KGVycikgfSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdXNlci5zaWduT3V0KCk7XG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFNlbmQgYSBwYXNzd29yZCByZXNldCByZXF1ZXN0LlxuICAgKi9cbiAgcHVibGljIGZvcmdvdFBhc3N3b3JkKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wcmVwYXJlQ29nbml0b1VzZXIodXNlcm5hbWUpLmZvcmdvdFBhc3N3b3JkKHtcbiAgICAgICAgb25TdWNjZXNzOiAoKSA9PiByZXNvbHZlKCksXG4gICAgICAgIG9uRmFpbHVyZTogKGVycjogRXJyb3IpID0+IHJlamVjdChlcnIpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ29uZmlybSBhIG5ldyBwYXNzd29yZCBhZnRlciBhIHBhc3N3b3JkIHJlc2V0IHJlcXVlc3QuXG4gICAqL1xuICBwdWJsaWMgY29uZmlybVBhc3N3b3JkKHVzZXJuYW1lOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgbmV3UHdkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gZ2V0IHRoZSB1c2VyIGFuZCBjb25maXJtIGEgbmV3IHBhc3N3b3JkXG4gICAgICB0aGlzLnByZXBhcmVDb2duaXRvVXNlcih1c2VybmFtZSkuY29uZmlybVBhc3N3b3JkKGNvZGUsIG5ld1B3ZCwge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHJlc29sdmUoKSxcbiAgICAgICAgb25GYWlsdXJlOiAoZXJyOiBFcnJvcikgPT4gcmVqZWN0KGVycilcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHVzZXIgaXMgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWQuXG4gICAqIEBwYXJhbSBvZmZsaW5lQWxsb3dlZCBpZiBzZXQgYW5kIGlmIG9mZmxpbmUsIHNraXAgYXV0aGVudGljYXRpb24gYW5kIHJldHJpZXZlIGRhdGEgbG9jYWxseVxuICAgKiBAcGFyYW0gZ2V0RnJlc2hJZFRva2VuT25FeHAgY2IgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBpZFRva2VuIGlzIHJlZnJlc2hlZFxuICAgKi9cbiAgcHVibGljIGlzQXV0aGVudGljYXRlZChvZmZsaW5lQWxsb3dlZDogYm9vbGVhbiwgZ2V0RnJlc2hJZFRva2VuT25FeHA/OiAoZnJlc2hJZFRva2VuOiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAob2ZmbGluZUFsbG93ZWQgJiYgIW5hdmlnYXRvci5vbkxpbmUpIHtcbiAgICAgICAgdGhpcy5zdG9yYWdlLmdldCgnQXV0aFVzZXJEZXRhaWxzJykudGhlbih1c2VyRGV0YWlscyA9PiByZXNvbHZlKHsgaWRUb2tlbjogbnVsbCwgdXNlckRldGFpbHMgfSkpO1xuICAgICAgICAvLyByZS1leGVjdXRlIHRoZSBtZXRob2Qgd2hlbiBiYWNrIG9ubGluZSwgc28gdGhhdCB5b3UgY2FuIHJldHJpZXZlIGEgdG9rZW4gdG8gbWFrZSByZXF1ZXN0c1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgKCkgPT5cbiAgICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZCh0cnVlLCBnZXRGcmVzaElkVG9rZW5PbkV4cClcbiAgICAgICAgICAgIC8vIHNldCB0aGUgbmV3IHRva2VuIGFzIGlmIGl0IHdhcyByZWZyZXNoZWRcbiAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiBnZXRGcmVzaElkVG9rZW5PbkV4cChyZXN1bHQuaWRUb2tlbikpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyUG9vbC5nZXRDdXJyZW50VXNlcigpO1xuICAgICAgICBpZiAoIXVzZXIpIHJldHVybiByZWplY3QoKTtcbiAgICAgICAgdXNlci5nZXRTZXNzaW9uKChlcnI6IEVycm9yLCBzZXNzaW9uOiBDb2duaXRvVXNlclNlc3Npb24pID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgLy8gZ2V0IHVzZXIgYXR0cmlidXRlc1xuICAgICAgICAgIHVzZXIuZ2V0VXNlckF0dHJpYnV0ZXMoKGU6IEVycm9yLCBhdHRyaWJ1dGVzOiBDb2duaXRvVXNlckF0dHJpYnV0ZVtdKSA9PiB7XG4gICAgICAgICAgICBpZiAoZSkgcmV0dXJuIHJlamVjdChlKTtcbiAgICAgICAgICAgIC8vIHJlbWFwIHVzZXIgYXR0cmlidXRlc1xuICAgICAgICAgICAgY29uc3QgdXNlckRldGFpbHM6IGFueSA9IHt9O1xuICAgICAgICAgICAgYXR0cmlidXRlcy5mb3JFYWNoKChhOiBDb2duaXRvVXNlckF0dHJpYnV0ZSkgPT4gKHVzZXJEZXRhaWxzW2EuZ2V0TmFtZSgpXSA9IGEuZ2V0VmFsdWUoKSkpO1xuICAgICAgICAgICAgLy8gYWRkIHRoZSB1c2VyJ3MgZ3JvdXBzIHRvIHRoZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uSW5mbyA9IHNlc3Npb24uZ2V0QWNjZXNzVG9rZW4oKS5kZWNvZGVQYXlsb2FkKCk7XG4gICAgICAgICAgICBjb25zdCBncm91cHM6IHN0cmluZ1tdID0gc2Vzc2lvbkluZm9bJ2NvZ25pdG86Z3JvdXBzJ10gfHwgW107XG4gICAgICAgICAgICB1c2VyRGV0YWlsc1snZ3JvdXBzJ10gPSBncm91cHM7XG4gICAgICAgICAgICAvLyBydW4gc29tZSBjaGVja3MgY29uc2lkZXJpbmcgdGhlIHVzZXIncyBncm91cHMgYW5kIGRldmljZXMgKGJhc2VkIG9uIHRoZSBwcm9qZWN0J3MgY29uZmlndXJhdGlvbilcbiAgICAgICAgICAgIHRoaXMucnVuUG9zdEF1dGhDaGVja3ModXNlckRldGFpbHMsIGVyciA9PiB7XG4gICAgICAgICAgICAgIC8vIGluIGNhc2Ugc29tZSBjaGVjayBmYWlsZWQsIHJlamVjdCB0aGUgYXV0aG9yaXNhdGlvbiBmbG93XG4gICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgLy8gKGFzeW5jKSBzYXZlIHRoZSByZWZyZXNoIHRva2VuIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZCBieSBvdGhlciBwcm9jZWR1cmVzXG4gICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ0F1dGhSZWZyZXNoVG9rZW4nLCBzZXNzaW9uLmdldFJlZnJlc2hUb2tlbigpLmdldFRva2VuKCkpO1xuICAgICAgICAgICAgICAvLyBzZXQgYSB0aW1lciB0byBtYW5hZ2UgdGhlIGF1dG9yZWZyZXNoIG9mIHRoZSBpZFRva2VuICh0aHJvdWdoIHRoZSByZWZyZXNoVG9rZW4pXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5yZWZyZXNoU2Vzc2lvbih1c2VyLCBzZXNzaW9uLmdldFJlZnJlc2hUb2tlbigpLmdldFRva2VuKCksIGdldEZyZXNoSWRUb2tlbk9uRXhwKSxcbiAgICAgICAgICAgICAgICAxNSAqIDYwICogMTAwMFxuICAgICAgICAgICAgICApOyAvLyBldmVyeSAxNSBtaW51dGVzXG4gICAgICAgICAgICAgIC8vIChhc3luYykgaWYgb2ZmbGluZUFsbG93ZWQsIHNhdmUgZGF0YSBsb2NhbGx5LCB0byB1c2UgaXQgbmV4dCB0aW1lIHdlJ2xsIGJlIG9mZmxpbmVcbiAgICAgICAgICAgICAgaWYgKG9mZmxpbmVBbGxvd2VkKSB0aGlzLnN0b3JhZ2Uuc2V0KCdBdXRoVXNlckRldGFpbHMnLCB1c2VyRGV0YWlscyk7XG4gICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgaWRUb2tlbiAodG8gdXNlIHdpdGggQVBJKVxuICAgICAgICAgICAgICByZXNvbHZlKHsgaWRUb2tlbjogc2Vzc2lvbi5nZXRJZFRva2VuKCkuZ2V0Snd0VG9rZW4oKSwgdXNlckRldGFpbHMgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEhlbHBlciB0byByZWZyZXNoIHRoZSBzZXNzaW9uIGV2ZXJ5IE4gbWludXRlcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWZyZXNoU2Vzc2lvbih1c2VyOiBDb2duaXRvVXNlciwgcmVmcmVzaFRva2VuOiBzdHJpbmcsIGNhbGxiYWNrOiAoZnJlc2hJZFRva2VuOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICB1c2VyLnJlZnJlc2hTZXNzaW9uKFxuICAgICAgbmV3IENvZ25pdG9SZWZyZXNoVG9rZW4oeyBSZWZyZXNoVG9rZW46IHJlZnJlc2hUb2tlbiB9KSxcbiAgICAgIChlcnI6IEVycm9yLCBzZXNzaW9uOiBDb2duaXRvVXNlclNlc3Npb24pID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIC8vIHRyeSBhZ2FpbiBpbiAxIG1pbnV0ZVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWZyZXNoU2Vzc2lvbih1c2VyLCByZWZyZXNoVG9rZW4sIGNhbGxiYWNrKSwgMSAqIDYwICogMTAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gKGFzeW5jKSBzYXZlIHRoZSByZWZyZXNoIHRva2VuIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZCBieSBvdGhlciBwcm9jZWR1cmVzXG4gICAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgnQXV0aFJlZnJlc2hUb2tlbicsIHNlc3Npb24uZ2V0UmVmcmVzaFRva2VuKCkuZ2V0VG9rZW4oKSk7XG4gICAgICAgICAgLy8gcmVwZWF0IGV2ZXJ5IDE1IG1pbnV0ZXNcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVmcmVzaFNlc3Npb24odXNlciwgc2Vzc2lvbi5nZXRSZWZyZXNoVG9rZW4oKS5nZXRUb2tlbigpLCBjYWxsYmFjayksIDE1ICogNjAgKiAxMDAwKTtcbiAgICAgICAgICAvLyBydW4gdGhlIGNhbGxiYWNrIGFjdGlvbiwgaWYgc2V0XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhzZXNzaW9uLmdldElkVG9rZW4oKS5nZXRKd3RUb2tlbigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biBzb21lIHBvc3QtYXV0aCBjaGVja3MsIGJhc2VkIG9uIHRoZSB1c2VycyBncm91cHMgYW5kIG9uIHRoZSBhcHAncyBjb25maWd1cmF0aW9uOlxuICAgKiAgLSB1c2VycyBpbiB0aGUgQ29nbml0bydzIFwiYWRtaW5zXCIgZ3J1cCBza2lwIGFsbCB0aGUgZm9sbG93aW5nIHJ1bGVzLlxuICAgKiAgLSB1c2VycyBpbiB0aGUgQ29nbml0bydzIFwicm9ib3RzXCIgZ3JvdXAgY2FuJ3Qgc2lnbi1pbnRvIGZyb250LWVuZHMgKHRoZXkgc2VydmUgb25seSBiYWNrLWVuZCBwdXJwb3NlcykuXG4gICAqICAtIGlmIGBlbnYuaWRlYS5hdXRoLnNpbmdsZVNpbXVsdGFuZW91c1Nlc3Npb25gIGlzIG9uLCBtYWtlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUgYWN0aXZlIHNlc3Npb24gcGVyIHVzZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcnVuUG9zdEF1dGhDaGVja3ModXNlckRldGFpbHM6IGFueSwgY2FsbGJhY2s6IChlcnI/OiBFcnJvcikgPT4gdm9pZCkge1xuICAgIGNvbnN0IGdyb3Vwczogc3RyaW5nW10gPSB1c2VyRGV0YWlsc1snZ3JvdXBzJ107XG4gICAgLy8gc2tpcCBjaGVja3MgaWYgdGhlIHVzZXIgaXMgaW4gdGhlIFwiYWRtaW5zXCIgZ3JvdXBcbiAgICBjb25zdCBpc0FkbWluID0gZ3JvdXBzLnNvbWUoeCA9PiB4ID09PSAnYWRtaW5zJyk7XG4gICAgaWYgKGlzQWRtaW4pIHJldHVybiBjYWxsYmFjaygpO1xuICAgIC8vIHVzZXJzIGluIHRoZSBcInJvYm90c1wiIGdyb3VwIGNhbid0IHNpZ24taW50byBmcm9udC1lbmRzICh0aGV5IHNlcnZlIG9ubHkgYmFjay1lbmQgcHVycG9zZXMpXG4gICAgY29uc3QgaXNSb2JvdCA9IGdyb3Vwcy5zb21lKHggPT4geCA9PT0gJ3JvYm90cycpO1xuICAgIGlmIChpc1JvYm90KSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdST0JPVF9VU0VSJykpO1xuICAgIC8vIGluIGNhc2UgdGhlIHByb2plY3QgbGltaXRzIGVhY2ggYWNjb3VudCB0byBvbmx5IG9uZSBzaW11bHRhbmVvdXMgc2Vzc2lvbiwgcnVuIGEgY2hlY2tcbiAgICBpZiAoZW52LmlkZWEuYXV0aC5zaW5nbGVTaW11bHRhbmVvdXNTZXNzaW9uKSByZXR1cm4gdGhpcy5jaGVja0ZvclNpbXVsdGFuZW91c1Nlc3Npb25zKHVzZXJEZXRhaWxzLCBjYWxsYmFjayk7XG4gICAgLy8gb3RoZXJ3aXNlLCB3ZSdyZSBkb25lXG4gICAgY2FsbGJhY2soKTtcbiAgfVxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0aGUgdXNlciBzaWduZWQtaW50byBtdWx0aXBsZSBkZXZpY2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNoZWNrRm9yU2ltdWx0YW5lb3VzU2Vzc2lvbnModXNlckRldGFpbHM6IGFueSwgY2FsbGJhY2s6IChlcnI/OiBFcnJvcikgPT4gdm9pZCkge1xuICAgIC8vIGdldCBvciBjcmVhdGUgYSBrZXkgZm9yIHRoZSBjdXJyZW50IGRldmljZSAofnJhbmRvbSlcbiAgICBsZXQgY3VycmVudERldmljZUtleSA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoJ0F1dGhEZXZpY2VLZXknKTtcbiAgICBpZiAoIWN1cnJlbnREZXZpY2VLZXkpIHtcbiAgICAgIGNvbnN0IHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygxMCk7XG4gICAgICBjdXJyZW50RGV2aWNlS2V5ID0gcmFuZG9tS2V5LmNvbmNhdChTdHJpbmcoRGF0ZS5ub3coKSkpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnNldCgnQXV0aERldmljZUtleScsIGN1cnJlbnREZXZpY2VLZXkpO1xuICAgIH1cbiAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBsYXN0IGRldmljZSB0byBzaWduLWludG8gdGhpcyBwcm9qZWN0IChpZiBhbnkpIGlzIHRoZSBjdXJyZW50IG9uZVxuICAgIGNvbnN0IGxhc3REZXZpY2VUb1NpZ25JbnRvVGhpc1Byb2plY3QgPSB1c2VyRGV0YWlsc1tERVZJQ0VfS0VZX0FUVFJJQlVURV07XG4gICAgLy8gaWYgaXQncyB0aGUgZmlyc3QgdXNlcidzIGRldmljZSB0byBzaWduLWluLCBzYXZlIHRoZSByZWZlcmVuY2UgaW4gQ29nbml0byBhbmQgcmVzb2x2ZVxuICAgIGlmICghbGFzdERldmljZVRvU2lnbkludG9UaGlzUHJvamVjdCkge1xuICAgICAgdGhpcy5zZXRDdXJyZW50RGV2aWNlRm9yUHJvamVjdChjdXJyZW50RGV2aWNlS2V5KVxuICAgICAgICAudGhlbigoKSA9PiBjYWxsYmFjaygpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gY2FsbGJhY2sobmV3IEVycm9yKCdDQU5UX1NFVF9ERVZJQ0UnKSkpO1xuICAgICAgLy8gaWYgdGhlIGRldmljZSBkaWRuJ3QgY2hhbmdlLCByZXNvbHZlXG4gICAgfSBlbHNlIGlmIChsYXN0RGV2aWNlVG9TaWduSW50b1RoaXNQcm9qZWN0ID09PSBjdXJyZW50RGV2aWNlS2V5KSBjYWxsYmFjaygpO1xuICAgIC8vIG90aHdlcndpc2UsIHJlcG9ydCB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHNpbXVsdGFuZW91cyBzZXNzaW9uXG4gICAgZWxzZSBjYWxsYmFjayhuZXcgRXJyb3IoJ1NJTVVMVEFORU9VU19TRVNTSU9OJykpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgKG9yIHJlc2V0KSB0aGUgY3VycmVudCB1c2VyJ3MgZGV2aWNlIChieSBrZXkpIGluIHRoZSBjdXJyZW50IHByb2plY3QgKHN0b3JlZCBpbiBDb2duaXRvKS5cbiAgICovXG4gIHByb3RlY3RlZCBzZXRDdXJyZW50RGV2aWNlRm9yUHJvamVjdChkZXZpY2VLZXk/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzOiBhbnkgPSB7fTtcbiAgICAvLyBub3RlOiBhbiBlbXB0eSBzdHJpbmcgd2lsbCByZW1vdmUgdGhlIGF0dHJpYnV0ZSBmcm9tIENvZ25pdG9cbiAgICBhdHRyaWJ1dGVzW0RFVklDRV9LRVlfQVRUUklCVVRFXSA9IGRldmljZUtleSB8fCAnJztcbiAgICByZXR1cm4gdGhpcy51cGRhdGVVc2VyQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTtcbiAgfVxuICAvKipcbiAgICogVXBkYXRlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIncyBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJBdHRyaWJ1dGVzKGF0dHJpYnV0ZXM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBwcmVwYXJlIHRoZSBhdHRyaWJ1dGVzIHdlIHdhbnQgdG8gY2hhbmdlXG4gICAgICBjb25zdCBhdHRycyA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gYXR0cmlidXRlcylcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNbcHJvcF0gIT09IHVuZGVmaW5lZCkgYXR0cnMucHVzaCh0aGlzLnByZXBhcmVVc2VyQXR0cmlidXRlKHByb3AsIGF0dHJpYnV0ZXNbcHJvcF0pKTtcbiAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXJQb29sLmdldEN1cnJlbnRVc2VyKCk7XG4gICAgICBpZiAoIXVzZXIpIHJldHVybiByZWplY3QoKTtcbiAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IHRoZSBzZXNzaW9uIGJlZm9yZSB0byBtYWtlIGNoYW5nZXNcbiAgICAgIHVzZXIuZ2V0U2Vzc2lvbigoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyKSByZWplY3QoZXJyKTtcbiAgICAgICAgZWxzZSB1c2VyLnVwZGF0ZUF0dHJpYnV0ZXMoYXR0cnMsIChlOiBFcnJvcikgPT4gKGUgPyByZWplY3QoZSkgOiByZXNvbHZlKCkpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
433
+ /**
434
+ * The possible actions following a successful login.
435
+ */
436
+ export var LoginOutcomeActions;
437
+ (function (LoginOutcomeActions) {
438
+ LoginOutcomeActions["NONE"] = "none";
439
+ LoginOutcomeActions["NEW_PASSWORD"] = "newPassword";
440
+ LoginOutcomeActions["MFA_CHALLENGE"] = "mfaChallenge";
441
+ LoginOutcomeActions["MFA_SETUP"] = "mfaSetup";
442
+ })(LoginOutcomeActions || (LoginOutcomeActions = {}));
443
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbW9kdWxlcy9hdXRoL3NyYy9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLG1CQUFtQixFQUlwQixNQUFNLDRCQUE0QixDQUFDO0FBR3BDLE9BQU8sRUFBRSxXQUFXLElBQUksR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFFMUM7O0dBRUc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVoRTs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFVMUIsWUFBb0IsT0FBMkI7UUFBM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFGdkMsbUJBQWMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFHOUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBQztZQUNsQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUN0QyxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLFFBQWdCLEVBQUUsR0FBVztRQUN0RCxPQUFPLElBQUkscUJBQXFCLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRDs7T0FFRztJQUNI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QUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLE1BQU0sRUFBRSxDQUFDO1lBQzNCLG9EQUFvRDtZQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBVSxFQUFRLEVBQUU7Z0JBQ25DLElBQUksR0FBRztvQkFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7O29CQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBUSxFQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckYsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OzRHQTVhVSxlQUFlO2dIQUFmLGVBQWUsY0FERixNQUFNOzJGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7QUFnYmxDOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksbUJBS1g7QUFMRCxXQUFZLG1CQUFtQjtJQUM3QixvQ0FBYSxDQUFBO0lBQ2IsbURBQTRCLENBQUE7SUFDNUIscURBQThCLENBQUE7SUFDOUIsNkNBQXNCLENBQUE7QUFDeEIsQ0FBQyxFQUxXLG1CQUFtQixLQUFuQixtQkFBbUIsUUFLOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBdXRoZW50aWNhdGlvbkRldGFpbHMsXG4gIENvZ25pdG9Vc2VyLFxuICBDb2duaXRvVXNlckF0dHJpYnV0ZSxcbiAgQ29nbml0b1VzZXJQb29sLFxuICBDb2duaXRvUmVmcmVzaFRva2VuLFxuICBDb2duaXRvVXNlclNlc3Npb24sXG4gIElTaWduVXBSZXN1bHQsXG4gIENoYWxsZW5nZU5hbWVcbn0gZnJvbSAnYW1hem9uLWNvZ25pdG8taWRlbnRpdHktanMnO1xuaW1wb3J0IHsgSURFQVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgZW52aXJvbm1lbnQgYXMgZW52IH0gZnJvbSAnQGVudic7XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIENvZ25pdG8ncyB1c2VyIGF0dHJpYnV0ZSB3aGljaCBjb250YWlucyB0aGUga2V5IG9mIHRoZSBsYXN0IGRldmljZSB0byBsb2dpbiBpbiB0aGlzIHByb2plY3QuXG4gKi9cbmNvbnN0IERFVklDRV9LRVlfQVRUUklCVVRFID0gJ2N1c3RvbTonLmNvbmNhdChlbnYuaWRlYS5wcm9qZWN0KTtcblxuLyoqXG4gKiBDb2duaXRvIHdyYXBwZXIgdG8gbWFuYWdlIHRoZSBhdXRoZW50aWNhdGlvbiBmbG93LlxuICpcbiAqIE5vdGU6IGluIElERUEncyBDb2duaXRvIHVzZXJzIHBvb2xzLCB0aGUgZW1haWwgaXMgYW4gYWxpYXMgb2YgdGhlIHVzZXJuYW1lLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIElERUFBdXRoU2VydmljZSB7XG4gIHByaXZhdGUgdXNlclBvb2w6IENvZ25pdG9Vc2VyUG9vbDtcblxuICBjaGFsbGVuZ2VVc2VybmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGNoYWxsZW5nZVBhc3N3b3JkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBuZXdBY2NvdW50SnVzdFJlZ2lzdGVyZWQ6IHN0cmluZztcblxuICBwcml2YXRlIG1mYVByb2plY3ROYW1lID0gZW52LmlkZWEuYXBwLnRpdGxlID8/IGVudi5pZGVhLnByb2plY3Q7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yYWdlOiBJREVBU3RvcmFnZVNlcnZpY2UpIHtcbiAgICB0aGlzLnVzZXJQb29sID0gbmV3IENvZ25pdG9Vc2VyUG9vbCh7XG4gICAgICBVc2VyUG9vbElkOiBlbnYuYXdzLmNvZ25pdG8udXNlclBvb2xJZCxcbiAgICAgIENsaWVudElkOiBlbnYuYXdzLmNvZ25pdG8udXNlclBvb2xDbGllbnRJZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgdGhlIG5lY2Vzc2FyeSBzdHJ1Y3R1cmUgdG8gZ2V0IGF1dGhvcml6ZWQgaW4gQ29nbml0by5cbiAgICovXG4gIHByaXZhdGUgcHJlcGFyZUF1dGhEZXRhaWxzKHVzZXJuYW1lOiBzdHJpbmcsIHB3ZDogc3RyaW5nKTogQXV0aGVudGljYXRpb25EZXRhaWxzIHtcbiAgICByZXR1cm4gbmV3IEF1dGhlbnRpY2F0aW9uRGV0YWlscyh7IFVzZXJuYW1lOiB1c2VybmFtZSwgUGFzc3dvcmQ6IHB3ZCB9KTtcbiAgfVxuICAvKipcbiAgICogUHJlcGFyZSB0aGUgbmVjZXNzYXJ5IHN0cnVjdHVyZSB0byBpZGVudGlmeSBhIENvZ25pdG8gdXNlci5cbiAgICovXG4gIHByZXBhcmVDb2duaXRvVXNlcih1c2VybmFtZTogc3RyaW5nKTogQ29nbml0b1VzZXIge1xuICAgIHJldHVybiBuZXcgQ29nbml0b1VzZXIoeyBVc2VybmFtZTogdXNlcm5hbWUsIFBvb2w6IHRoaXMudXNlclBvb2wgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFByZXBhcmUgYSB1c2VyIGF0dHJpYnV0ZSAodGhleSBhcmUgYWxsIHN0cmluZ3MpIGluIENvZ25pdG8ncyBmb3JtYXQuXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVVc2VyQXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvZ25pdG9Vc2VyQXR0cmlidXRlIHtcbiAgICByZXR1cm4gbmV3IENvZ25pdG9Vc2VyQXR0cmlidXRlKHsgTmFtZTogbmFtZSwgVmFsdWU6IHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBsb2dpbiB0aHJvdWdoIHVzZXJuYW1lIGFuZCBwYXNzd29yZC5cbiAgICovXG4gIGxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPExvZ2luT3V0Y29tZUFjdGlvbnM+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHRoaXMucHJlcGFyZUNvZ25pdG9Vc2VyKHVzZXJuYW1lKTtcbiAgICAgIHVzZXIuYXV0aGVudGljYXRlVXNlcih0aGlzLnByZXBhcmVBdXRoRGV0YWlscyh1c2VybmFtZSwgcGFzc3dvcmQpLCB7XG4gICAgICAgIG9uU3VjY2VzczogKCk6IHZvaWQgPT5cbiAgICAgICAgICByZXNvbHZlKGVudi5pZGVhLmF1dGguZm9yY2VMb2dpbldpdGhNRkEgPyBMb2dpbk91dGNvbWVBY3Rpb25zLk1GQV9TRVRVUCA6IExvZ2luT3V0Y29tZUFjdGlvbnMuTk9ORSksXG4gICAgICAgIG9uRmFpbHVyZTogKGVycjogRXJyb3IpOiB2b2lkID0+IHJlamVjdChlcnIpLFxuICAgICAgICBuZXdQYXNzd29yZFJlcXVpcmVkOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5jaGFsbGVuZ2VVc2VybmFtZSA9IHVzZXJuYW1lO1xuICAgICAgICAgIHRoaXMuY2hhbGxlbmdlUGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICAgICAgICByZXNvbHZlKExvZ2luT3V0Y29tZUFjdGlvbnMuTkVXX1BBU1NXT1JEKTtcbiAgICAgICAgfSxcbiAgICAgICAgdG90cFJlcXVpcmVkOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5jaGFsbGVuZ2VVc2VybmFtZSA9IHVzZXJuYW1lO1xuICAgICAgICAgIHRoaXMuY2hhbGxlbmdlUGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICAgICAgICByZXNvbHZlKExvZ2luT3V0Y29tZUFjdGlvbnMuTUZBX0NIQUxMRU5HRSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDb21wbGV0ZSB0aGUgbmV3IHBhc3N3b3JkIGZsb3cgaW4gdGhlIGF1dGhlbnRpY2F0aW9uLlxuICAgKi9cbiAgY29uZmlybU5ld1Bhc3N3b3JkKG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHRoaXMucHJlcGFyZUNvZ25pdG9Vc2VyKHRoaXMuY2hhbGxlbmdlVXNlcm5hbWUpO1xuICAgICAgdXNlci5hdXRoZW50aWNhdGVVc2VyKHRoaXMucHJlcGFyZUF1dGhEZXRhaWxzKHRoaXMuY2hhbGxlbmdlVXNlcm5hbWUsIHRoaXMuY2hhbGxlbmdlUGFzc3dvcmQpLCB7XG4gICAgICAgIG9uU3VjY2VzczogKCk6IHZvaWQgPT4gcmVzb2x2ZSgpLFxuICAgICAgICBvbkZhaWx1cmU6IChlcnI6IEVycm9yKTogdm9pZCA9PiByZWplY3QoZXJyKSxcbiAgICAgICAgbmV3UGFzc3dvcmRSZXF1aXJlZDogKCk6IHZvaWQgPT5cbiAgICAgICAgICB1c2VyLmNvbXBsZXRlTmV3UGFzc3dvcmRDaGFsbGVuZ2UoXG4gICAgICAgICAgICBuZXdQYXNzd29yZCxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvblN1Y2Nlc3M6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYWxsZW5nZVVzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYWxsZW5nZVBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9uRmFpbHVyZTogKGVycjogRXJyb3IpOiB2b2lkID0+IHJlamVjdChlcnIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqICBDb21wbGV0ZSB0aGUgTUZBIGNoYWxsZW5nZSBmbG93IGluIHRoZSBhdXRoZW50aWNhdGlvbi5cbiAgICovXG4gIGNvbXBsZXRlTUZBQ2hhbGxlbmdlKG90cENvZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdGhpcy5wcmVwYXJlQ29nbml0b1VzZXIodGhpcy5jaGFsbGVuZ2VVc2VybmFtZSk7XG4gICAgICB1c2VyLmF1dGhlbnRpY2F0ZVVzZXIodGhpcy5wcmVwYXJlQXV0aERldGFpbHModGhpcy5jaGFsbGVuZ2VVc2VybmFtZSwgdGhpcy5jaGFsbGVuZ2VQYXNzd29yZCksIHtcbiAgICAgICAgb25TdWNjZXNzOiAoKTogdm9pZCA9PiByZXNvbHZlKCksXG4gICAgICAgIG9uRmFpbHVyZTogKGVycjogRXJyb3IpOiB2b2lkID0+IHJlamVjdChlcnIpLFxuICAgICAgICB0b3RwUmVxdWlyZWQ6IChjaGFsbGVuZ2VOYW1lOiBDaGFsbGVuZ2VOYW1lKTogdm9pZCA9PlxuICAgICAgICAgIHVzZXIuc2VuZE1GQUNvZGUoXG4gICAgICAgICAgICBvdHBDb2RlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvblN1Y2Nlc3M6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYWxsZW5nZVVzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYWxsZW5nZVBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9uRmFpbHVyZTogZXJyID0+IHJlamVjdChlcnIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hhbGxlbmdlTmFtZVxuICAgICAgICAgIClcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIG5ldyB1c2VyIGEgc2V0IGl0cyBkZWZhdWx0IGF0dHJpYnV0ZXMuXG4gICAqL1xuICByZWdpc3Rlcih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBhdHRyaWJ1dGVzPzogYW55KTogUHJvbWlzZTxDb2duaXRvVXNlcj4ge1xuICAgIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzIHx8IHt9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICAvLyBhZGQgYXR0cmlidXRlcyBsaWtlIHRoZSBlbWFpbCBhZGRyZXNzIGFuZCB0aGUgZnVsbG5hbWVcbiAgICAgIGNvbnN0IGF0dHJzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gYXR0cmlidXRlcylcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNbcHJvcF0pIGF0dHJzLnB1c2godGhpcy5wcmVwYXJlVXNlckF0dHJpYnV0ZShwcm9wLCBhdHRyaWJ1dGVzW3Byb3BdKSk7XG4gICAgICAvLyBhZGQgdGhlIGVtYWlsLCB3aGljaCBpcyBlcXVhbCB0byB0aGUgdXNlcm5hbWUgZm9yIG1vc3Qgb2Ygb3VyIFBvb2xzXG4gICAgICBpZiAoIWF0dHJpYnV0ZXMuZW1haWwpIGF0dHJzLnB1c2godGhpcy5wcmVwYXJlVXNlckF0dHJpYnV0ZSgnZW1haWwnLCB1c2VybmFtZSkpO1xuICAgICAgLy8gcmVnaXN0ZXIgdGhlIG5ldyB1c2VyIHRvIHRoZSBwb29sXG4gICAgICB0aGlzLnVzZXJQb29sLnNpZ25VcCh1c2VybmFtZSwgcGFzc3dvcmQsIGF0dHJzLCBudWxsLCAoZXJyOiBFcnJvciwgcmVzOiBJU2lnblVwUmVzdWx0KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgdGhpcy5uZXdBY2NvdW50SnVzdFJlZ2lzdGVyZWQgPSB1c2VybmFtZTtcbiAgICAgICAgcmVzb2x2ZShyZXMudXNlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSW4gY2FzZSAgbmV3IGFjY291bnQgaGFzIGp1c3QgYmVlbiByZWdpc3RlcmVkLCByZXR1cm4gdGhlIHVzZXJuYW1lLlxuICAgKi9cbiAgZ2V0TmV3QWNjb3VudEp1c3RSZWdpc3RlcmVkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmV3QWNjb3VudEp1c3RSZWdpc3RlcmVkO1xuICB9XG4gIC8qKlxuICAgKiBDb25maXJtIGEgbmV3IHJlZ2lzdHJhdGlvbiB0aHJvdWdoIHRoZSBjb25maXJtYXRpb24gY29kZSBzZW50IGJ5IENvZ25pdG8uXG4gICAqL1xuICBjb25maXJtUmVnaXN0cmF0aW9uKHVzZXJuYW1lOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICB0aGlzLnByZXBhcmVDb2duaXRvVXNlcih1c2VybmFtZSkuY29uZmlybVJlZ2lzdHJhdGlvbihjb2RlLCB0cnVlLCAoZXJyOiBFcnJvcik6IHZvaWQgPT5cbiAgICAgICAgZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFNlbmQgYWdhaW4gYSBjb25maXJtYXRpb24gY29kZSBmb3IgYSBuZXcgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgcmVzZW5kQ29uZmlybWF0aW9uQ29kZSh1c2VybmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMucHJlcGFyZUNvZ25pdG9Vc2VyKHVzZXJuYW1lKS5yZXNlbmRDb25maXJtYXRpb25Db2RlKChlcnI6IEVycm9yKTogdm9pZCA9PiAoZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKCkpKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogTG9nb3V0IHRoZSBjdXJyZW50bHkgc2lnbmVkLWluIHVzZXIuXG4gICAqL1xuICBsb2dvdXQob3B0aW9ucz86IHsgZ2xvYmFsOiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGdsb2JhbDogZmFsc2UgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVmcmVzaCB0b2tlbiBwcmV2aW9zbHkgc2F2ZWRcbiAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoJ0F1dGhSZWZyZXNoVG9rZW4nKS50aGVuKFxuICAgICAgICAoKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgb3B0aW9uYWwgYXV0aCBkZXRhaWxzXG4gICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZSgnQXV0aFVzZXJEZXRhaWxzJykudGhlbigoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAvLyBnZXQgdGhlIHVzZXIgYW5kIHRoZSBzZXNzaW9uXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyUG9vbC5nZXRDdXJyZW50VXNlcigpO1xuICAgICAgICAgICAgdXNlci5nZXRTZXNzaW9uKGFzeW5jIChlcnI6IEVycm9yKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgIC8vIGlmIHRoZSBzZXNzaW9uIGlzIGFjdGl2ZSwgcnVuIHRoZSBvbmxpbmUgc2lnbi1vdXQ7IG90aGVyd2lzZSwgb25seSB0aGUgbG9jYWwgZGF0YSBoYXMgYmVlbiBkZWxldGVkXG4gICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgICAgICAgIC8vIGlmIGEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2Ugd2FzIHNhdmVkLCBmb3JnZXQgaXRcbiAgICAgICAgICAgICAgaWYgKGVudi5pZGVhLmF1dGguc2luZ2xlU2ltdWx0YW5lb3VzU2Vzc2lvbikgYXdhaXQgdGhpcy5zZXRDdXJyZW50RGV2aWNlRm9yUHJvamVjdChudWxsKTtcbiAgICAgICAgICAgICAgLy8gc2lnbi1vdXQgZnJvbSB0aGUgcG9vbCAodGVybWluYXRlIHRoZSBjdXJyZW50IHNlc3Npb24gb3IgYWxsIHRoZSBzZXNzaW9ucylcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2xvYmFsKVxuICAgICAgICAgICAgICAgIHVzZXIuZ2xvYmFsU2lnbk91dCh7IG9uU3VjY2VzczogKCk6IHZvaWQgPT4gcmVzb2x2ZSgpLCBvbkZhaWx1cmU6IGVyciA9PiByZWplY3QoZXJyKSB9KTtcbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXNlci5zaWduT3V0KCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogU2VuZCBhIHBhc3N3b3JkIHJlc2V0IHJlcXVlc3QuXG4gICAqL1xuICBmb3Jnb3RQYXNzd29yZCh1c2VybmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMucHJlcGFyZUNvZ25pdG9Vc2VyKHVzZXJuYW1lKS5mb3Jnb3RQYXNzd29yZCh7XG4gICAgICAgIG9uU3VjY2VzczogKCk6IHZvaWQgPT4gcmVzb2x2ZSgpLFxuICAgICAgICBvbkZhaWx1cmU6IChlcnI6IEVycm9yKTogdm9pZCA9PiByZWplY3QoZXJyKVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENvbmZpcm0gYSBuZXcgcGFzc3dvcmQgYWZ0ZXIgYSBwYXNzd29yZCByZXNldCByZXF1ZXN0LlxuICAgKi9cbiAgY29uZmlybVBhc3N3b3JkKHVzZXJuYW1lOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgbmV3UHdkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5wcmVwYXJlQ29nbml0b1VzZXIodXNlcm5hbWUpLmNvbmZpcm1QYXNzd29yZChjb2RlLCBuZXdQd2QsIHtcbiAgICAgICAgb25TdWNjZXNzOiAoKTogdm9pZCA9PiByZXNvbHZlKCksXG4gICAgICAgIG9uRmFpbHVyZTogKGVycjogRXJyb3IpOiB2b2lkID0+IHJlamVjdChlcnIpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgVVJMIGZvciBlbmFibGluZyBNRkEuIFRoaXMgVVJMIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgUVIgQ29kZSB0byByZWFkIHdpdGggYW4gYXV0aGVudGljYXRvciBhcHAuXG4gICAqL1xuICBnZXRVUkxGb3JFbmFibGluZ01GQSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyUG9vbC5nZXRDdXJyZW50VXNlcigpO1xuICAgICAgaWYgKCF1c2VyKSByZXR1cm4gcmVqZWN0KCk7XG4gICAgICB1c2VyLmdldFNlc3Npb24oKGVycjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB1c2VyLmFzc29jaWF0ZVNvZnR3YXJlVG9rZW4oe1xuICAgICAgICAgIGFzc29jaWF0ZVNlY3JldENvZGU6IChzZWNyZXRDb2RlOiBzdHJpbmcpOiB2b2lkID0+XG4gICAgICAgICAgICByZXNvbHZlKGBvdHBhdXRoOi8vdG90cC8ke2VuY29kZVVSSSh0aGlzLm1mYVByb2plY3ROYW1lKX0/c2VjcmV0PSR7c2VjcmV0Q29kZX1gKSxcbiAgICAgICAgICBvbkZhaWx1cmU6IChlcnI6IGFueSk6IHZvaWQgPT4gcmVqZWN0KGVycilcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0aGUgdXNlciBoYXMgTUZBIGVuYWJsZWQuXG4gICAqL1xuICBjaGVja0lmVXNlckhhc01GQUVuYWJsZWQoYnlwYXNzQ2FjaGUgPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyUG9vbC5nZXRDdXJyZW50VXNlcigpO1xuICAgICAgaWYgKCF1c2VyKSByZXR1cm4gcmVqZWN0KCk7XG4gICAgICB1c2VyLmdldFNlc3Npb24oKGVycjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB1c2VyLmdldFVzZXJEYXRhKFxuICAgICAgICAgIChlcnIsIGRhdGEpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIGNvbnN0IGlzTUZBRW5hYmxlZCA9ICEhKGRhdGEuVXNlck1GQVNldHRpbmdMaXN0ICYmIGRhdGEuVXNlck1GQVNldHRpbmdMaXN0LmluY2x1ZGVzKCdTT0ZUV0FSRV9UT0tFTl9NRkEnKSk7XG4gICAgICAgICAgICByZXNvbHZlKGlzTUZBRW5hYmxlZCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGJ5cGFzc0NhY2hlIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDb25maWd1cmUgYSBNRkEgZGV2aWNlIGZvciB0aGUgdXNlci5cbiAgICovXG4gIHByaXZhdGUgc2V0TUZBRGV2aWNlKG90cDogc3RyaW5nLCBtZmFEZXZpY2VOYW1lOiBzdHJpbmcsIGVuYWJsZWQgPSB0cnVlLCBwcmVmZXJyZWQgPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXJQb29sLmdldEN1cnJlbnRVc2VyKCk7XG4gICAgICBpZiAoIXVzZXIpIHJldHVybiByZWplY3QoKTtcbiAgICAgIHVzZXIuZ2V0U2Vzc2lvbigoZXJyOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIHVzZXIudmVyaWZ5U29mdHdhcmVUb2tlbihvdHAsIG1mYURldmljZU5hbWUsIHtcbiAgICAgICAgICBvblN1Y2Nlc3M6ICgpOiB2b2lkID0+XG4gICAgICAgICAgICB1c2VyLnNldFVzZXJNZmFQcmVmZXJlbmNlKG51bGwsIHsgRW5hYmxlZDogZW5hYmxlZCwgUHJlZmVycmVkTWZhOiBwcmVmZXJyZWQgfSwgKGVycjogRXJyb3IpOiB2b2lkID0+XG4gICAgICAgICAgICAgIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZSgpXG4gICAgICAgICAgICApLFxuICAgICAgICAgIG9uRmFpbHVyZTogKGVycik6IHZvaWQgPT4gcmVqZWN0KGVycilcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRW5hYmxlIGEgbmV3IE1GQSBkZXZpY2UgZm9yIHRoZSB1c2VyIGJ5IGluc2VydGluZyBhbiBPVFAgY29kZSBnZW5lcmF0ZWQgYnkgaXQuXG4gICAqL1xuICBlbmFibGVNRkEob3RwOiBzdHJpbmcsIG1mYURldmljZU5hbWUgPSAnZGVmYXVsdCcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZXRNRkFEZXZpY2Uob3RwLCBtZmFEZXZpY2VOYW1lLCB0cnVlLCB0cnVlKTtcbiAgfVxuICAvKipcbiAgICogRGlzYWJsZSBNRkEgZm9yIGEgdXNlciBieSBpbnNlcnRpbmcgYW4gT1RQIGNvZGUgZ2VuZXJhdGVkIGJ5IGl0LlxuICAgKi9cbiAgZGlzYWJsZU1GQShvdHA6IHN0cmluZywgbWZhRGV2aWNlTmFtZSA9ICdkZWZhdWx0Jyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNldE1GQURldmljZShvdHAsIG1mYURldmljZU5hbWUsIGZhbHNlLCBmYWxzZSk7XG4gIH1cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdXNlciBpcyBjdXJyZW50bHkgYXV0aGVudGljYXRlZC5cbiAgICogQHBhcmFtIG9mZmxpbmVBbGxvd2VkIGlmIHNldCBhbmQgaWYgb2ZmbGluZSwgc2tpcCBhdXRoZW50aWNhdGlvbiBhbmQgcmV0cmlldmUgZGF0YSBsb2NhbGx5XG4gICAqIEBwYXJhbSBnZXRGcmVzaElkVG9rZW5PbkV4cCBjYiBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGlkVG9rZW4gaXMgcmVmcmVzaGVkXG4gICAqL1xuICBpc0F1dGhlbnRpY2F0ZWQob2ZmbGluZUFsbG93ZWQ6IGJvb2xlYW4sIGdldEZyZXNoSWRUb2tlbk9uRXhwPzogKGZyZXNoSWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKG9mZmxpbmVBbGxvd2VkICYmICFuYXZpZ2F0b3Iub25MaW5lKSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5nZXQoJ0F1dGhVc2VyRGV0YWlscycpLnRoZW4odXNlckRldGFpbHMgPT4gcmVzb2x2ZSh7IGlkVG9rZW46IG51bGwsIHVzZXJEZXRhaWxzIH0pKTtcbiAgICAgICAgLy8gcmUtZXhlY3V0ZSB0aGUgbWV0aG9kIHdoZW4gYmFjayBvbmxpbmUsIHNvIHRoYXQgeW91IGNhbiByZXRyaWV2ZSBhIHRva2VuIHRvIG1ha2UgcmVxdWVzdHNcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ29ubGluZScsXG4gICAgICAgICAgKCk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkKHRydWUsIGdldEZyZXNoSWRUb2tlbk9uRXhwKVxuICAgICAgICAgICAgICAvLyBzZXQgdGhlIG5ldyB0b2tlbiBhcyBpZiBpdCB3YXMgcmVmcmVzaGVkXG4gICAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiBnZXRGcmVzaElkVG9rZW5PbkV4cChyZXN1bHQuaWRUb2tlbikpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyUG9vbC5nZXRDdXJyZW50VXNlcigpO1xuICAgICAgICBpZiAoIXVzZXIpIHJldHVybiByZWplY3QoKTtcbiAgICAgICAgdXNlci5nZXRTZXNzaW9uKChlcnI6IEVycm9yLCBzZXNzaW9uOiBDb2duaXRvVXNlclNlc3Npb24pOiB2b2lkID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgdXNlci5nZXRVc2VyRGF0YShcbiAgICAgICAgICAgIChlcnIsIGRhdGEpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICBjb25zdCBpc01GQUVuYWJsZWQgPSAhIShcbiAgICAgICAgICAgICAgICBkYXRhLlVzZXJNRkFTZXR0aW5nTGlzdCAmJiBkYXRhLlVzZXJNRkFTZXR0aW5nTGlzdC5pbmNsdWRlcygnU09GVFdBUkVfVE9LRU5fTUZBJylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKCFpc01GQUVuYWJsZWQgJiYgZW52LmlkZWEuYXV0aC5mb3JjZUxvZ2luV2l0aE1GQSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihMb2dpbk91dGNvbWVBY3Rpb25zLk1GQV9TRVRVUCkpO1xuICAgICAgICAgICAgICB1c2VyLmdldFVzZXJBdHRyaWJ1dGVzKChlOiBFcnJvciwgYXR0cmlidXRlczogQ29nbml0b1VzZXJBdHRyaWJ1dGVbXSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlKSByZXR1cm4gcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIC8vIHJlbWFwIHVzZXIgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJEZXRhaWxzOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmZvckVhY2goKGE6IENvZ25pdG9Vc2VyQXR0cmlidXRlKTogc3RyaW5nID0+ICh1c2VyRGV0YWlsc1thLmdldE5hbWUoKV0gPSBhLmdldFZhbHVlKCkpKTtcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHVzZXIncyBncm91cHMgdG8gdGhlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uSW5mbyA9IHNlc3Npb24uZ2V0QWNjZXNzVG9rZW4oKS5kZWNvZGVQYXlsb2FkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBzOiBzdHJpbmdbXSA9IHNlc3Npb25JbmZvWydjb2duaXRvOmdyb3VwcyddIHx8IFtdO1xuICAgICAgICAgICAgICAgIHVzZXJEZXRhaWxzWydncm91cHMnXSA9IGdyb3VwcztcbiAgICAgICAgICAgICAgICAvLyBydW4gc29tZSBjaGVja3MgY29uc2lkZXJpbmcgdGhlIHVzZXIncyBncm91cHMgYW5kIGRldmljZXMgKGJhc2VkIG9uIHRoZSBwcm9qZWN0J3MgY29uZmlndXJhdGlvbilcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blBvc3RBdXRoQ2hlY2tzKHVzZXJEZXRhaWxzLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBzb21lIGNoZWNrIGZhaWxlZCwgcmVqZWN0IHRoZSBhdXRob3Jpc2F0aW9uIGZsb3dcbiAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgIC8vIChhc3luYykgc2F2ZSB0aGUgcmVmcmVzaCB0b2tlbiBzbyBpdCBjYW4gYmUgYWNjZXNzZWQgYnkgb3RoZXIgcHJvY2VkdXJlc1xuICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgnQXV0aFJlZnJlc2hUb2tlbicsIHNlc3Npb24uZ2V0UmVmcmVzaFRva2VuKCkuZ2V0VG9rZW4oKSk7XG4gICAgICAgICAgICAgICAgICAvLyBzZXQgYSB0aW1lciB0byBtYW5hZ2UgdGhlIGF1dG9yZWZyZXNoIG9mIHRoZSBpZFRva2VuICh0aHJvdWdoIHRoZSByZWZyZXNoVG9rZW4pXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAoKTogdm9pZCA9PiB0aGlzLnJlZnJlc2hTZXNzaW9uKHVzZXIsIHNlc3Npb24uZ2V0UmVmcmVzaFRva2VuKCkuZ2V0VG9rZW4oKSwgZ2V0RnJlc2hJZFRva2VuT25FeHApLFxuICAgICAgICAgICAgICAgICAgICAxNSAqIDYwICogMTAwMFxuICAgICAgICAgICAgICAgICAgKTsgLy8gZXZlcnkgMTUgbWludXRlc1xuICAgICAgICAgICAgICAgICAgLy8gKGFzeW5jKSBpZiBvZmZsaW5lQWxsb3dlZCwgc2F2ZSBkYXRhIGxvY2FsbHksIHRvIHVzZSBpdCBuZXh0IHRpbWUgd2UnbGwgYmUgb2ZmbGluZVxuICAgICAgICAgICAgICAgICAgaWYgKG9mZmxpbmVBbGxvd2VkKSB0aGlzLnN0b3JhZ2Uuc2V0KCdBdXRoVXNlckRldGFpbHMnLCB1c2VyRGV0YWlscyk7XG4gICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGlkVG9rZW4gKHRvIHVzZSB3aXRoIEFQSSlcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBpZFRva2VuOiBzZXNzaW9uLmdldElkVG9rZW4oKS5nZXRKd3RUb2tlbigpLCB1c2VyRGV0YWlscyB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBieXBhc3NDYWNoZTogdHJ1ZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEhlbHBlciB0byByZWZyZXNoIHRoZSBzZXNzaW9uIGV2ZXJ5IE4gbWludXRlcy5cbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaFNlc3Npb24odXNlcjogQ29nbml0b1VzZXIsIHJlZnJlc2hUb2tlbjogc3RyaW5nLCBjYWxsYmFjazogKGZyZXNoSWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdXNlci5yZWZyZXNoU2Vzc2lvbihcbiAgICAgIG5ldyBDb2duaXRvUmVmcmVzaFRva2VuKHsgUmVmcmVzaFRva2VuOiByZWZyZXNoVG9rZW4gfSksXG4gICAgICAoZXJyOiBFcnJvciwgc2Vzc2lvbjogQ29nbml0b1VzZXJTZXNzaW9uKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAvLyB0cnkgYWdhaW4gaW4gMSBtaW51dGVcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpOiB2b2lkID0+IHRoaXMucmVmcmVzaFNlc3Npb24odXNlciwgcmVmcmVzaFRva2VuLCBjYWxsYmFjayksIDEgKiA2MCAqIDEwMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIChhc3luYykgc2F2ZSB0aGUgcmVmcmVzaCB0b2tlbiBzbyBpdCBjYW4gYmUgYWNjZXNzZWQgYnkgb3RoZXIgcHJvY2VkdXJlc1xuICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ0F1dGhSZWZyZXNoVG9rZW4nLCBzZXNzaW9uLmdldFJlZnJlc2hUb2tlbigpLmdldFRva2VuKCkpO1xuICAgICAgICAgIC8vIHJlcGVhdCBldmVyeSAxNSBtaW51dGVzXG4gICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICgpOiB2b2lkID0+IHRoaXMucmVmcmVzaFNlc3Npb24odXNlciwgc2Vzc2lvbi5nZXRSZWZyZXNoVG9rZW4oKS5nZXRUb2tlbigpLCBjYWxsYmFjayksXG4gICAgICAgICAgICAxNSAqIDYwICogMTAwMFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gcnVuIHRoZSBjYWxsYmFjayBhY3Rpb24sIGlmIHNldFxuICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soc2Vzc2lvbi5nZXRJZFRva2VuKCkuZ2V0Snd0VG9rZW4oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSdW4gc29tZSBwb3N0LWF1dGggY2hlY2tzLCBiYXNlZCBvbiB0aGUgdXNlcnMgZ3JvdXBzIGFuZCBvbiB0aGUgYXBwJ3MgY29uZmlndXJhdGlvbjpcbiAgICogIC0gdXNlcnMgaW4gdGhlIENvZ25pdG8ncyBcImFkbWluc1wiIGdydXAgc2tpcCBhbGwgdGhlIGZvbGxvd2luZyBydWxlcy5cbiAgICogIC0gdXNlcnMgaW4gdGhlIENvZ25pdG8ncyBcInJvYm90c1wiIGdyb3VwIGNhbid0IHNpZ24taW50byBmcm9udC1lbmRzICh0aGV5IHNlcnZlIG9ubHkgYmFjay1lbmQgcHVycG9zZXMpLlxuICAgKiAgLSBpZiBgZW52LmlkZWEuYXV0aC5zaW5nbGVTaW11bHRhbmVvdXNTZXNzaW9uYCBpcyBvbiwgbWFrZSBzdXJlIHRoZXJlIGlzIG9ubHkgb25lIGFjdGl2ZSBzZXNzaW9uIHBlciB1c2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBydW5Qb3N0QXV0aENoZWNrcyh1c2VyRGV0YWlsczogYW55LCBjYWxsYmFjazogKGVycj86IEVycm9yKSA9PiB2b2lkKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdyb3Vwczogc3RyaW5nW10gPSB1c2VyRGV0YWlsc1snZ3JvdXBzJ107XG4gICAgLy8gc2tpcCBjaGVja3MgaWYgdGhlIHVzZXIgaXMgaW4gdGhlIFwiYWRtaW5zXCIgZ3JvdXBcbiAgICBjb25zdCBpc0FkbWluID0gZ3JvdXBzLnNvbWUoeCA9PiB4ID09PSAnYWRtaW5zJyk7XG4gICAgaWYgKGlzQWRtaW4pIHJldHVybiBjYWxsYmFjaygpO1xuICAgIC8vIHVzZXJzIGluIHRoZSBcInJvYm90c1wiIGdyb3VwIGNhbid0IHNpZ24taW50byBmcm9udC1lbmRzICh0aGV5IHNlcnZlIG9ubHkgYmFjay1lbmQgcHVycG9zZXMpXG4gICAgY29uc3QgaXNSb2JvdCA9IGdyb3Vwcy5zb21lKHggPT4geCA9PT0gJ3JvYm90cycpO1xuICAgIGlmIChpc1JvYm90KSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdST0JPVF9VU0VSJykpO1xuICAgIC8vIGluIGNhc2UgdGhlIHByb2plY3QgbGltaXRzIGVhY2ggYWNjb3VudCB0byBvbmx5IG9uZSBzaW11bHRhbmVvdXMgc2Vzc2lvbiwgcnVuIGEgY2hlY2tcbiAgICBpZiAoZW52LmlkZWEuYXV0aC5zaW5nbGVTaW11bHRhbmVvdXNTZXNzaW9uKSByZXR1cm4gdGhpcy5jaGVja0ZvclNpbXVsdGFuZW91c1Nlc3Npb25zKHVzZXJEZXRhaWxzLCBjYWxsYmFjayk7XG4gICAgLy8gb3RoZXJ3aXNlLCB3ZSdyZSBkb25lXG4gICAgY2FsbGJhY2soKTtcbiAgfVxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0aGUgdXNlciBzaWduZWQtaW50byBtdWx0aXBsZSBkZXZpY2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0ZvclNpbXVsdGFuZW91c1Nlc3Npb25zKHVzZXJEZXRhaWxzOiBhbnksIGNhbGxiYWNrOiAoZXJyPzogRXJyb3IpID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBnZXQgb3IgY3JlYXRlIGEga2V5IGZvciB0aGUgY3VycmVudCBkZXZpY2UgKH5yYW5kb20pXG4gICAgbGV0IGN1cnJlbnREZXZpY2VLZXkgPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KCdBdXRoRGV2aWNlS2V5Jyk7XG4gICAgaWYgKCFjdXJyZW50RGV2aWNlS2V5KSB7XG4gICAgICBjb25zdCByYW5kb21LZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMTApO1xuICAgICAgY3VycmVudERldmljZUtleSA9IHJhbmRvbUtleS5jb25jYXQoU3RyaW5nKERhdGUubm93KCkpKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5zZXQoJ0F1dGhEZXZpY2VLZXknLCBjdXJyZW50RGV2aWNlS2V5KTtcbiAgICB9XG4gICAgLy8gY2hlY2sgd2hldGhlciB0aGUgbGFzdCBkZXZpY2UgdG8gc2lnbi1pbnRvIHRoaXMgcHJvamVjdCAoaWYgYW55KSBpcyB0aGUgY3VycmVudCBvbmVcbiAgICBjb25zdCBsYXN0RGV2aWNlVG9TaWduSW50b1RoaXNQcm9qZWN0ID0gdXNlckRldGFpbHNbREVWSUNFX0tFWV9BVFRSSUJVVEVdO1xuICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0IHVzZXIncyBkZXZpY2UgdG8gc2lnbi1pbiwgc2F2ZSB0aGUgcmVmZXJlbmNlIGluIENvZ25pdG8gYW5kIHJlc29sdmVcbiAgICBpZiAoIWxhc3REZXZpY2VUb1NpZ25JbnRvVGhpc1Byb2plY3QpIHtcbiAgICAgIHRoaXMuc2V0Q3VycmVudERldmljZUZvclByb2plY3QoY3VycmVudERldmljZUtleSlcbiAgICAgICAgLnRoZW4oKCk6IHZvaWQgPT4gY2FsbGJhY2soKSlcbiAgICAgICAgLmNhdGNoKCgpOiB2b2lkID0+IGNhbGxiYWNrKG5ldyBFcnJvcignQ0FOVF9TRVRfREVWSUNFJykpKTtcbiAgICAgIC8vIGlmIHRoZSBkZXZpY2UgZGlkbid0IGNoYW5nZSwgcmVzb2x2ZVxuICAgIH0gZWxzZSBpZiAobGFzdERldmljZVRvU2lnbkludG9UaGlzUHJvamVjdCA9PT0gY3VycmVudERldmljZUtleSkgY2FsbGJhY2soKTtcbiAgICAvLyBvdGh3ZXJ3aXNlLCByZXBvcnQgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzaW11bHRhbmVvdXMgc2Vzc2lvblxuICAgIGVsc2UgY2FsbGJhY2sobmV3IEVycm9yKCdTSU1VTFRBTkVPVVNfU0VTU0lPTicpKTtcbiAgfVxuICAvKipcbiAgICogU2V0IChvciByZXNldCkgdGhlIGN1cnJlbnQgdXNlcidzIGRldmljZSAoYnkga2V5KSBpbiB0aGUgY3VycmVudCBwcm9qZWN0IChzdG9yZWQgaW4gQ29nbml0bykuXG4gICAqL1xuICBwcml2YXRlIHNldEN1cnJlbnREZXZpY2VGb3JQcm9qZWN0KGRldmljZUtleT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXM6IGFueSA9IHt9O1xuICAgIC8vIG5vdGU6IGFuIGVtcHR5IHN0cmluZyB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGZyb20gQ29nbml0b1xuICAgIGF0dHJpYnV0ZXNbREVWSUNFX0tFWV9BVFRSSUJVVEVdID0gZGV2aWNlS2V5IHx8ICcnO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZVVzZXJBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpO1xuICB9XG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlcidzIGF0dHJpYnV0ZXMuXG4gICAqL1xuICB1cGRhdGVVc2VyQXR0cmlidXRlcyhhdHRyaWJ1dGVzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgLy8gcHJlcGFyZSB0aGUgYXR0cmlidXRlcyB3ZSB3YW50IHRvIGNoYW5nZVxuICAgICAgY29uc3QgYXR0cnMgPSBuZXcgQXJyYXk8YW55PigpO1xuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGF0dHJpYnV0ZXMpXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW3Byb3BdICE9PSB1bmRlZmluZWQpIGF0dHJzLnB1c2godGhpcy5wcmVwYXJlVXNlckF0dHJpYnV0ZShwcm9wLCBhdHRyaWJ1dGVzW3Byb3BdKSk7XG4gICAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyUG9vbC5nZXRDdXJyZW50VXNlcigpO1xuICAgICAgaWYgKCF1c2VyKSByZXR1cm4gcmVqZWN0KCk7XG4gICAgICAvLyB3ZSBuZWVkIHRvIGdldCB0aGUgc2Vzc2lvbiBiZWZvcmUgdG8gbWFrZSBjaGFuZ2VzXG4gICAgICB1c2VyLmdldFNlc3Npb24oKGVycjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGVycikgcmVqZWN0KGVycik7XG4gICAgICAgIGVsc2UgdXNlci51cGRhdGVBdHRyaWJ1dGVzKGF0dHJzLCAoZTogRXJyb3IpOiB2b2lkID0+IChlID8gcmVqZWN0KGUpIDogcmVzb2x2ZSgpKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBwb3NzaWJsZSBhY3Rpb25zIGZvbGxvd2luZyBhIHN1Y2Nlc3NmdWwgbG9naW4uXG4gKi9cbmV4cG9ydCBlbnVtIExvZ2luT3V0Y29tZUFjdGlvbnMge1xuICBOT05FID0gJ25vbmUnLFxuICBORVdfUEFTU1dPUkQgPSAnbmV3UGFzc3dvcmQnLFxuICBNRkFfQ0hBTExFTkdFID0gJ21mYUNoYWxsZW5nZScsXG4gIE1GQV9TRVRVUCA9ICdtZmFTZXR1cCdcbn1cbiJdfQ==