@huntsman-cancer-institute/authentication 17.2.2 → 17.2.4

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.
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary
3
3
  */
4
- import { Component, ElementRef, ViewChild, Inject, Renderer2 } from "@angular/core";
4
+ import { Component, ElementRef, ViewChild, Inject, Renderer2, isDevMode } from "@angular/core";
5
5
  import { Location } from "@angular/common";
6
6
  import { Router } from "@angular/router";
7
7
  import { DomSanitizer } from "@angular/platform-browser";
@@ -23,6 +23,9 @@ export class AuthenticationComponent {
23
23
  this.authenticationRoute = authenticationRoute;
24
24
  }
25
25
  ngOnInit() {
26
+ if (isDevMode()) {
27
+ console.debug("Authentication Component: Init");
28
+ }
26
29
  /*
27
30
  * Fix back bug
28
31
  * Issue is that the browser will go back to the previous route. If it's guarded, the route guard will just load the login again
@@ -80,6 +83,9 @@ export class AuthenticationComponent {
80
83
  }
81
84
  beginAuthenticationProcess() {
82
85
  var tokenEndpoint = this.authenticationService.tokenLocation();
86
+ if (isDevMode()) {
87
+ console.debug("Authentication Component: Begin Authentication");
88
+ }
83
89
  if (tokenEndpoint !== "") {
84
90
  this.url = this.domSanitizer.bypassSecurityTrustResourceUrl(tokenEndpoint);
85
91
  }
@@ -128,4 +134,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
128
134
  type: ViewChild,
129
135
  args: ["iframe", { static: true }]
130
136
  }] } });
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvYXV0aGVudGljYXRpb24vc3JjL2F1dGhlbnRpY2F0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxRQUFRLEVBQWdCLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQUMsUUFBUSxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUMscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7O0FBbUNyRixNQUFNLE9BQU8sdUJBQXVCO0lBVWxDLFlBQW9CLHFCQUE0QyxFQUM1QyxZQUEyQixFQUMzQixNQUFjLEVBQ2QsUUFBa0IsRUFDbEIsUUFBbUIsRUFDVyxtQkFBMkI7UUFMekQsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQUMzQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ1csd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFRO0lBQzdFLENBQUM7SUFFRCxRQUFRO1FBQ047Ozs7O1dBS0c7UUFDSCxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FB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SixDQUFDO0lBRU8sMEJBQTBCO1FBQ2hDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUUvRCxJQUFJLGFBQWEsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsOEJBQThCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUVEOzs7OztZQUtJO1FBQ0osSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO2FBQ2pHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNiLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0F6R1UsdUJBQXVCLDBKQWVkLG9CQUFvQjtrR0FmN0IsdUJBQXVCLHFOQS9CeEI7Ozs7Ozs7Ozs7S0FVUDs7MkZBcUJRLHVCQUF1QjtrQkFqQ25DLFNBQVM7K0JBQ0UsdUJBQXVCLFlBQ3ZCOzs7Ozs7Ozs7O0tBVVAsUUFtQkcsRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFDOzswQkFpQmQsTUFBTTsyQkFBQyxvQkFBb0I7eUNBVkgsTUFBTTtzQkFBMUMsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSAyMDE2IEh1bnRzbWFuIENhbmNlciBJbnN0aXR1dGUgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCwgQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeVxyXG4gKi9cclxuaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgSW5qZWN0LCBSZW5kZXJlcjJ9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7TG9jYXRpb24sIFBvcFN0YXRlRXZlbnR9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHtEb21TYW5pdGl6ZXJ9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcblxyXG5pbXBvcnQge2ludGVydmFsLCBTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Zmlyc3R9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuaW1wb3J0IHtBdXRoZW50aWNhdGlvblNlcnZpY2UsIEFVVEhFTlRJQ0FUSU9OX1JPVVRFfSBmcm9tIFwiLi9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhdXRoZW50aWNhdGlvbi1pZnJhbWVcIixcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxyXG4gICAgICA8aWZyYW1lICNpZnJhbWUgY2xhc3M9XCJmcmFtZVwiIFtzcmNdPVwidXJsXCIgKGxvYWQpPVwiaGFuZGxlQ2hhbmdlcygpXCI+PC9pZnJhbWU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJfZXJyb3JNc2dcIiBjbGFzcz1cImFsZXJ0LWJveFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5cclxuICAgICAgICAgIDxoNSBjbGFzcz1cImFsZXJ0LWhlYWRpbmdcIj5BdXRoZW50aWNhdGlvbiBGYWlsZWQ8L2g1PlxyXG4gICAgICAgICAgPHNwYW4gaWQ9XCJoY2ktbG9naW4tZXJyb3JcIiBjbGFzcz1cImFsZXJ0LXRleHRcIj57e19lcnJvck1zZ319PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgICBcclxuICAgIDpob3N0IHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5jb250YWluZXIge1xyXG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICAgIG1hcmdpbi10b3A6IDYwcHg7XHJcbiAgICAgIHBhZGRpbmctdG9wOiAxNXB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5mcmFtZSB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgIGJvcmRlcjogMHB4O1xyXG4gICAgfVxyXG4gIGBdLFxyXG4gIGhvc3Q6IHtjbGFzczogXCJvdXRsZXQtcm93XCJ9XHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGlvbkNvbXBvbmVudCB7XHJcblxyXG4gIHB1YmxpYyB1cmw7XHJcbiAgcHVibGljIF9lcnJvck1zZzogc3RyaW5nO1xyXG5cclxuICBAVmlld0NoaWxkKFwiaWZyYW1lXCIsIHtzdGF0aWM6IHRydWV9KSBpZnJhbWUgOiBFbGVtZW50UmVmO1xyXG5cclxuICBwcml2YXRlIHJlc2V0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBwb3BzdGF0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGhlbnRpY2F0aW9uU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgZG9tU2FuaXRpemVyIDogRG9tU2FuaXRpemVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoQVVUSEVOVElDQVRJT05fUk9VVEUpIHByaXZhdGUgYXV0aGVudGljYXRpb25Sb3V0ZTogc3RyaW5nKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8qXHJcbiAgICAgKiBGaXggYmFjayBidWdcclxuICAgICAqIElzc3VlIGlzIHRoYXQgdGhlIGJyb3dzZXIgd2lsbCBnbyBiYWNrIHRvIHRoZSBwcmV2aW91cyByb3V0ZS4gSWYgaXQncyBndWFyZGVkLCB0aGUgcm91dGUgZ3VhcmQgd2lsbCBqdXN0IGxvYWQgdGhlIGxvZ2luIGFnYWluXHJcbiAgICAgKiBFdmVudHVhbGx5IHRoZSBicm93c2VyIGdldHMgdG8gdGhlIC9hdXRoZW50aWNhdGUgcm91dGUgYW5kIGdvaW5nIGJhY2sgZnJvbSB0aGVyZSBsb2FkcyB0aGUgaWZyYW1lIGhpc3RvcnkgYW5kIFNoaWJib2xldGggZGlzcGxheXNcclxuICAgICAqIGFuIGVycm9yIHJlbGF0aW5nIHRvIG5hdmlnYXRpbmcgYmFjay5cclxuICAgICAqL1xyXG4gICAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgdGhpcy5sb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwodGhpcy5hdXRoZW50aWNhdGlvblJvdXRlKSk7XHJcblxyXG4gICAgdGhpcy5wb3BzdGF0ZVN1YnNjcmlwdGlvbiA9IDxTdWJzY3JpcHRpb24+IHRoaXMubG9jYXRpb24uc3Vic2NyaWJlKCh2YWx1ZTogUG9wU3RhdGVFdmVudCkgPT4ge1xyXG4gICAgICAvL1RoaXMgaXMgZ29pbmcgdG8gcHJldmVudCBiYWNrIGZyb20gd29ya2luZyBmcm9tIHRoZSBsb2dpbiBjb21wb25lbnRcclxuICAgICAgaGlzdG9yeS5nbygxKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYmVnaW5BdXRoZW50aWNhdGlvblByb2Nlc3MoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaWZyYW1lLm5hdGl2ZUVsZW1lbnQuY29udGVudERvY3VtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLmlmcmFtZS5uYXRpdmVFbGVtZW50LmNvbnRlbnREb2N1bWVudC5ib2R5O1xyXG4gICAgICBpZiAoZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwicHJlXCIpKSB7XHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihcInByZVwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fZXJyb3JNc2cgPSBudWxsO1xyXG4gICAgICB2YXIganNvblRleHQgPSBlbGVtZW50LmlubmVyVGV4dDtcclxuXHJcbiAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XHJcbiAgICAgIHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLnN0b3JlVG9rZW4oanNvbi5hdXRoX3Rva2VuKTtcclxuICAgICAgdmFyIGF1dGhlbnRpY2F0ZWQgPSB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZWVkSWZBdXRoZW50aWNhdGVkKCk7XHJcblxyXG4gICAgICBpZiAoIWF1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgICB0aGlzLnJlc2V0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5iZWdpbkF1dGhlbnRpY2F0aW9uUHJvY2VzcygpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBpZiAodGhpcy5pZnJhbWUubmF0aXZlRWxlbWVudC5jb250ZW50RG9jdW1lbnQudGl0bGUudG9VcHBlckNhc2UoKSA9PT0gXCJFUlJPUlwiKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaWZyYW1lLm5hdGl2ZUVsZW1lbnQuY29udGVudERvY3VtZW50LmJvZHkuaW5uZXJIVE1MLnRvVXBwZXJDYXNlKCkgPT09IFwiRk9SQklEREVOXCIpIHtcclxuICAgICAgICAgIHRoaXMuX2Vycm9yTXNnID0gXCJZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBsb2cgaW50byB0aGlzIGFwcGxpY2F0aW9uXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2Vycm9yTXNnID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vQSBiaXQgb2YgYSB3b3JrYXJvdW5kIGZvciBhIFdpbGRGbHkgaXNzdWUuIFN1Y2Nlc3Mgb24gUGFjNGogYXV0aGVudGljYXRpb24sIGJ1dCBmYWlsdXJlIG9uIERCIGxvYWQgb2YgdXNlciBwdXQgdGhpbmdzIGluIGEgd2VpcmQgc3RhdGUuIEp1c3QgbG9nb3V0LCBhbmQgcmVkbyB0aGUgbG9naW4uXHJcbiAgICAgICAgdGhpcy5jbGVhckxvZ2luQW5kUmV0cnkoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEFmdGVyIHRoZSBpZnJhbWUgbG9hZHMsIG1ha2UgdGhlIGJhY2tncm91bmQgdHJhbnNwYXJlbnQgc28gd2UgdXNlIHRoZSBpbXBsZW1lbnRhdGlvbidzIGJhY2tncm91bmQgYW5kIG5vdCB0aGUgc3NvIGJhY2tncm91bmQuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaWZyYW1lLm5hdGl2ZUVsZW1lbnQuY29udGVudERvY3VtZW50LmJvZHksIFwiYmFja2dyb3VuZC1jb2xvclwiLCBcInRyYW5zcGFyZW50XCIpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnJlc2V0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnBvcHN0YXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyTG9naW5BbmRSZXRyeSgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzZXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLmNsZWFyTG9naW4oKS5zdWJzY3JpYmUoXHJcbiAgICAgICgpID0+IHsgdGhpcy5iZWdpbkF1dGhlbnRpY2F0aW9uUHJvY2VzcygpOyB9LFxyXG4gICAgICAoZXJyb3IpID0+IHsgdGhpcy5iZWdpbkF1dGhlbnRpY2F0aW9uUHJvY2VzcygpOyB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWdpbkF1dGhlbnRpY2F0aW9uUHJvY2VzcygpOiB2b2lkIHtcclxuICAgIHZhciB0b2tlbkVuZHBvaW50ID0gdGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UudG9rZW5Mb2NhdGlvbigpO1xyXG5cclxuICAgIGlmICh0b2tlbkVuZHBvaW50ICE9PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMudXJsID0gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHRva2VuRW5kcG9pbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWYgdGhlIHVzZXIgZG9lc24ndCBjb21wbGV0ZSBhdXRoZW50aWNhdGlvbiBiZWZvcmUgdGhlIElkUCBzZXNzaW9uIHRpbWVzIG91dCwgdGhhdCB3aWxsIGJlIGEgcHJvYmxlbSB3aGVuIHRoZXkgZXZlbnR1YWxseVxyXG4gICAgICogYXR0YW1wdCB0byBsb2cgaW4uIEl0IGlzIGxpa2VseSB0aGF0IHVzZXJzIHdpbGwgZG8gdGhpcyBvZnRlbiB3aGVuIHRoZXkgbG9nIG91dCBvciBhcmUgdGltZWQgb3V0IGluIHRoZSBldmVuaW5nLCBsZWF2ZVxyXG4gICAgICogdGhlaXIgYnJvd3NlciBvcGVuLCB0aGVuIGF0dGVtcHQgdG8gbG9nIGJhY2sgaW4gaW4gdGhlIG1vcm5pbmcuIEluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHRoaXMsIHRoaXMgY29tcG9uZW50IHdpbGwgcmUtcmVxdWVzdFxyXG4gICAgICogdGhlIHRva2VuIHByaW9yIHRvIElkUCB0aW1lb3V0LCB3aGljaCB3aWxsIHJlc2V0IHRoZSAgcHJvY2Vzcy4gVGhpcyB3aWxsIGhhcHBlbiAxIG1pbnV0ZSBiZWZvcmUgaWRwSW5hY3Rpdml0eU1pbnV0ZXNcclxuICAgICAqKi9cclxuICAgIHRoaXMucmVzZXRTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgodGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UuaWRwSW5hY3Rpdml0eU1pbnV0ZXMgLSAxKSAqIDYwICogMTAwMClcclxuICAgICAgLnBpcGUoZmlyc3QoKSlcclxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmJlZ2luQXV0aGVudGljYXRpb25Qcm9jZXNzKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvYXV0aGVudGljYXRpb24vc3JjL2F1dGhlbnRpY2F0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUMsUUFBUSxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFDLFFBQVEsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUFDLHFCQUFxQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7Ozs7OztBQW1DckYsTUFBTSxPQUFPLHVCQUF1QjtJQVVsQyxZQUFvQixxQkFBNEMsRUFDNUMsWUFBMkIsRUFDM0IsTUFBYyxFQUNkLFFBQWtCLEVBQ2xCLFFBQW1CLEVBQ1csbUJBQTJCO1FBTHpELDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsaUJBQVksR0FBWixZQUFZLENBQWU7UUFDM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNXLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBUTtJQUM3RSxDQUFDO0lBRUQsUUFBUTtRQUVOLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxDQUFD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biAqIENvcHlyaWdodCAoYykgMjAxNiBIdW50c21hbiBDYW5jZXIgSW5zdGl0dXRlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgsIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnlcclxuICovXHJcbmltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIEluamVjdCwgUmVuZGVyZXIyLCBpc0Rldk1vZGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7TG9jYXRpb24sIFBvcFN0YXRlRXZlbnR9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHtEb21TYW5pdGl6ZXJ9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcblxyXG5pbXBvcnQge2ludGVydmFsLCBTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Zmlyc3R9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuaW1wb3J0IHtBdXRoZW50aWNhdGlvblNlcnZpY2UsIEFVVEhFTlRJQ0FUSU9OX1JPVVRFfSBmcm9tIFwiLi9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhdXRoZW50aWNhdGlvbi1pZnJhbWVcIixcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxyXG4gICAgICA8aWZyYW1lICNpZnJhbWUgY2xhc3M9XCJmcmFtZVwiIFtzcmNdPVwidXJsXCIgKGxvYWQpPVwiaGFuZGxlQ2hhbmdlcygpXCI+PC9pZnJhbWU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJfZXJyb3JNc2dcIiBjbGFzcz1cImFsZXJ0LWJveFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5cclxuICAgICAgICAgIDxoNSBjbGFzcz1cImFsZXJ0LWhlYWRpbmdcIj5BdXRoZW50aWNhdGlvbiBGYWlsZWQ8L2g1PlxyXG4gICAgICAgICAgPHNwYW4gaWQ9XCJoY2ktbG9naW4tZXJyb3JcIiBjbGFzcz1cImFsZXJ0LXRleHRcIj57e19lcnJvck1zZ319PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgICBcclxuICAgIDpob3N0IHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5jb250YWluZXIge1xyXG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICAgIG1hcmdpbi10b3A6IDYwcHg7XHJcbiAgICAgIHBhZGRpbmctdG9wOiAxNXB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5mcmFtZSB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgIGJvcmRlcjogMHB4O1xyXG4gICAgfVxyXG4gIGBdLFxyXG4gIGhvc3Q6IHtjbGFzczogXCJvdXRsZXQtcm93XCJ9XHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGlvbkNvbXBvbmVudCB7XHJcblxyXG4gIHB1YmxpYyB1cmw7XHJcbiAgcHVibGljIF9lcnJvck1zZzogc3RyaW5nO1xyXG5cclxuICBAVmlld0NoaWxkKFwiaWZyYW1lXCIsIHtzdGF0aWM6IHRydWV9KSBpZnJhbWUgOiBFbGVtZW50UmVmO1xyXG5cclxuICBwcml2YXRlIHJlc2V0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBwb3BzdGF0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGhlbnRpY2F0aW9uU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgZG9tU2FuaXRpemVyIDogRG9tU2FuaXRpemVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoQVVUSEVOVElDQVRJT05fUk9VVEUpIHByaXZhdGUgYXV0aGVudGljYXRpb25Sb3V0ZTogc3RyaW5nKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICBcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiQXV0aGVudGljYXRpb24gQ29tcG9uZW50OiBJbml0XCIpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKlxyXG4gICAgICogRml4IGJhY2sgYnVnXHJcbiAgICAgKiBJc3N1ZSBpcyB0aGF0IHRoZSBicm93c2VyIHdpbGwgZ28gYmFjayB0byB0aGUgcHJldmlvdXMgcm91dGUuIElmIGl0J3MgZ3VhcmRlZCwgdGhlIHJvdXRlIGd1YXJkIHdpbGwganVzdCBsb2FkIHRoZSBsb2dpbiBhZ2FpblxyXG4gICAgICogRXZlbnR1YWxseSB0aGUgYnJvd3NlciBnZXRzIHRvIHRoZSAvYXV0aGVudGljYXRlIHJvdXRlIGFuZCBnb2luZyBiYWNrIGZyb20gdGhlcmUgbG9hZHMgdGhlIGlmcmFtZSBoaXN0b3J5IGFuZCBTaGliYm9sZXRoIGRpc3BsYXlzXHJcbiAgICAgKiBhbiBlcnJvciByZWxhdGluZyB0byBuYXZpZ2F0aW5nIGJhY2suXHJcbiAgICAgKi9cclxuICAgIGhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIHRoaXMubG9jYXRpb24ucHJlcGFyZUV4dGVybmFsVXJsKHRoaXMuYXV0aGVudGljYXRpb25Sb3V0ZSkpO1xyXG5cclxuICAgIHRoaXMucG9wc3RhdGVTdWJzY3JpcHRpb24gPSA8U3Vic2NyaXB0aW9uPiB0aGlzLmxvY2F0aW9uLnN1YnNjcmliZSgodmFsdWU6IFBvcFN0YXRlRXZlbnQpID0+IHtcclxuICAgICAgLy9UaGlzIGlzIGdvaW5nIHRvIHByZXZlbnQgYmFjayBmcm9tIHdvcmtpbmcgZnJvbSB0aGUgbG9naW4gY29tcG9uZW50XHJcbiAgICAgIGhpc3RvcnkuZ28oMSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmJlZ2luQXV0aGVudGljYXRpb25Qcm9jZXNzKCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlmcmFtZS5uYXRpdmVFbGVtZW50LmNvbnRlbnREb2N1bWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5pZnJhbWUubmF0aXZlRWxlbWVudC5jb250ZW50RG9jdW1lbnQuYm9keTtcclxuICAgICAgaWYgKGVsZW1lbnQucXVlcnlTZWxlY3RvcihcInByZVwiKSkge1xyXG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJwcmVcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2Vycm9yTXNnID0gbnVsbDtcclxuICAgICAgdmFyIGpzb25UZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XHJcblxyXG4gICAgICB2YXIganNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpO1xyXG4gICAgICB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5zdG9yZVRva2VuKGpzb24uYXV0aF90b2tlbik7XHJcbiAgICAgIHZhciBhdXRoZW50aWNhdGVkID0gdGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UucHJvY2VlZElmQXV0aGVudGljYXRlZCgpO1xyXG5cclxuICAgICAgaWYgKCFhdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgdGhpcy5yZXNldFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMuYmVnaW5BdXRoZW50aWNhdGlvblByb2Nlc3MoKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgaWYgKHRoaXMuaWZyYW1lLm5hdGl2ZUVsZW1lbnQuY29udGVudERvY3VtZW50LnRpdGxlLnRvVXBwZXJDYXNlKCkgPT09IFwiRVJST1JcIikge1xyXG4gICAgICAgIGlmICh0aGlzLmlmcmFtZS5uYXRpdmVFbGVtZW50LmNvbnRlbnREb2N1bWVudC5ib2R5LmlubmVySFRNTC50b1VwcGVyQ2FzZSgpID09PSBcIkZPUkJJRERFTlwiKSB7XHJcbiAgICAgICAgICB0aGlzLl9lcnJvck1zZyA9IFwiWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gbG9nIGludG8gdGhpcyBhcHBsaWNhdGlvblwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9lcnJvck1zZyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL0EgYml0IG9mIGEgd29ya2Fyb3VuZCBmb3IgYSBXaWxkRmx5IGlzc3VlLiBTdWNjZXNzIG9uIFBhYzRqIGF1dGhlbnRpY2F0aW9uLCBidXQgZmFpbHVyZSBvbiBEQiBsb2FkIG9mIHVzZXIgcHV0IHRoaW5ncyBpbiBhIHdlaXJkIHN0YXRlLiBKdXN0IGxvZ291dCwgYW5kIHJlZG8gdGhlIGxvZ2luLlxyXG4gICAgICAgIHRoaXMuY2xlYXJMb2dpbkFuZFJldHJ5KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBBZnRlciB0aGUgaWZyYW1lIGxvYWRzLCBtYWtlIHRoZSBiYWNrZ3JvdW5kIHRyYW5zcGFyZW50IHNvIHdlIHVzZSB0aGUgaW1wbGVtZW50YXRpb24ncyBiYWNrZ3JvdW5kIGFuZCBub3QgdGhlIHNzbyBiYWNrZ3JvdW5kLlxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmlmcmFtZS5uYXRpdmVFbGVtZW50LmNvbnRlbnREb2N1bWVudC5ib2R5LCBcImJhY2tncm91bmQtY29sb3JcIiwgXCJ0cmFuc3BhcmVudFwiKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5yZXNldFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5wb3BzdGF0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckxvZ2luQW5kUmV0cnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc2V0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5jbGVhckxvZ2luKCkuc3Vic2NyaWJlKFxyXG4gICAgICAoKSA9PiB7IHRoaXMuYmVnaW5BdXRoZW50aWNhdGlvblByb2Nlc3MoKTsgfSxcclxuICAgICAgKGVycm9yKSA9PiB7IHRoaXMuYmVnaW5BdXRoZW50aWNhdGlvblByb2Nlc3MoKTsgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVnaW5BdXRoZW50aWNhdGlvblByb2Nlc3MoKTogdm9pZCB7XHJcbiAgICB2YXIgdG9rZW5FbmRwb2ludCA9IHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLnRva2VuTG9jYXRpb24oKTtcclxuICAgIFxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdXRoZW50aWNhdGlvbiBDb21wb25lbnQ6IEJlZ2luIEF1dGhlbnRpY2F0aW9uXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0b2tlbkVuZHBvaW50ICE9PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMudXJsID0gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHRva2VuRW5kcG9pbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWYgdGhlIHVzZXIgZG9lc24ndCBjb21wbGV0ZSBhdXRoZW50aWNhdGlvbiBiZWZvcmUgdGhlIElkUCBzZXNzaW9uIHRpbWVzIG91dCwgdGhhdCB3aWxsIGJlIGEgcHJvYmxlbSB3aGVuIHRoZXkgZXZlbnR1YWxseVxyXG4gICAgICogYXR0YW1wdCB0byBsb2cgaW4uIEl0IGlzIGxpa2VseSB0aGF0IHVzZXJzIHdpbGwgZG8gdGhpcyBvZnRlbiB3aGVuIHRoZXkgbG9nIG91dCBvciBhcmUgdGltZWQgb3V0IGluIHRoZSBldmVuaW5nLCBsZWF2ZVxyXG4gICAgICogdGhlaXIgYnJvd3NlciBvcGVuLCB0aGVuIGF0dGVtcHQgdG8gbG9nIGJhY2sgaW4gaW4gdGhlIG1vcm5pbmcuIEluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHRoaXMsIHRoaXMgY29tcG9uZW50IHdpbGwgcmUtcmVxdWVzdFxyXG4gICAgICogdGhlIHRva2VuIHByaW9yIHRvIElkUCB0aW1lb3V0LCB3aGljaCB3aWxsIHJlc2V0IHRoZSAgcHJvY2Vzcy4gVGhpcyB3aWxsIGhhcHBlbiAxIG1pbnV0ZSBiZWZvcmUgaWRwSW5hY3Rpdml0eU1pbnV0ZXNcclxuICAgICAqKi9cclxuICAgIHRoaXMucmVzZXRTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgodGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UuaWRwSW5hY3Rpdml0eU1pbnV0ZXMgLSAxKSAqIDYwICogMTAwMClcclxuICAgICAgLnBpcGUoZmlyc3QoKSlcclxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmJlZ2luQXV0aGVudGljYXRpb25Qcm9jZXNzKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -151,7 +151,7 @@ export class AuthenticationService {
151
151
  }
152
152
  initiateLogin() {
153
153
  if (isDevMode()) {
154
- console.error("Authentication Service: Initiate Login");
154
+ console.debug("Authentication Service: Initiate Login: " + (this.tokenLocation) ? "Redirect" : "Login Component");
155
155
  }
156
156
  //Redirect based authentication
157
157
  if (this._loginPath) {
@@ -165,7 +165,7 @@ export class AuthenticationService {
165
165
  }
166
166
  requestAccessToken(fromRouteGuard, redirectOnSuccess) {
167
167
  if (isDevMode()) {
168
- console.error("Authentication Service: Request Acces Token");
168
+ console.debug("Authentication Service: Request Acces Token");
169
169
  }
170
170
  this._http.get(this.tokenLocation(), { withCredentials: true, responseType: "json" })
171
171
  .subscribe((response) => {
@@ -423,4 +423,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
423
423
  type: Inject,
424
424
  args: [LocationStrategy]
425
425
  }] }] });
426
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2F1dGhlbnRpY2F0aW9uL3NyYy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzNELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBNEIsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RixPQUFPLEVBQUMsUUFBUSxFQUFjLGVBQWUsRUFBZ0IsVUFBVSxFQUFLLE1BQU0sTUFBTSxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxVQUFVLEVBQVMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7O0FBRXpEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsSUFBSSx5QkFBeUIsR0FBRyxJQUFJLGNBQWMsQ0FBUyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ3BHLE1BQU0sQ0FBQyxJQUFJLHlCQUF5QixHQUFHLElBQUksY0FBYyxDQUFTLDJCQUEyQixDQUFDLENBQUM7QUFDL0YsTUFBTSxDQUFDLElBQUksMEJBQTBCLEdBQUcsSUFBSSxjQUFjLENBQVMsNEJBQTRCLENBQUMsQ0FBQztBQUNqRyxNQUFNLENBQUMsSUFBSSw4QkFBOEIs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QUNqRCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFDQUFxQzs7MEJBQ3hELFFBQVE7OzBCQUFJLE1BQU07MkJBQUMscUNBQXFDOzswQkFDeEQsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxxQ0FBcUM7OzBCQUN4RCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoYykgMjAxNiBIdW50c21hbiBDYW5jZXIgSW5zdGl0dXRlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgsIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnlcclxuICovXHJcbmltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIEluamVjdCwgT3B0aW9uYWwsIGlzRGV2TW9kZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtMb2NhdGlvbiwgTG9jYXRpb25TdHJhdGVneX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuXHJcbmltcG9ydCB7aW50ZXJ2YWwsIE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yLCBvZn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtjYXRjaEVycm9yLCBmaXJzdCwgbWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtKd3RIZWxwZXJTZXJ2aWNlfSBmcm9tIFwiQGF1dGgwL2FuZ3VsYXItand0XCI7XHJcblxyXG5pbXBvcnQge0F1dGhlbnRpY2F0aW9uUHJvdmlkZXJ9IGZyb20gXCIuL2F1dGhlbnRpY2F0aW9uLnByb3ZpZGVyXCI7XHJcbmltcG9ydCB7IENvb2xMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiQGFuZ3VsYXItY29vbC9zdG9yYWdlXCI7XHJcblxyXG4vKipcclxuICogVGhlIHRva2VuIHVzZWQgZm9yIGluamVjdGlvbiBvZiB0aGUgc2VydmVyIHNpZGUgZW5kcG9pbnQgZm9yIHRoZSBjdXJyZW50bHkgYXV0aGVudGljYXRlZCBzdWJqZWN0LlxyXG4gKlxyXG4gKiBAdHlwZSB7SW5qZWN0aW9uVG9rZW59XHJcbiAqL1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1NFUlZFUl9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX3NlcnZlcl9yZXN0X2FwaVwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9MT0dJTl9QQVRIID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdXRoZW50aWNhdGlvbl9sb2dpbl9wYXRoXCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX0xPR09VVF9QQVRIID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdXRoZW50aWNhdGlvbl9sb2dvdXRfcGF0aFwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9ESVJFQ1RfRU5EUE9JTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX2RpcmVjdF9lbmRwb2ludFwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9UT0tFTl9FTkRQT0lOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFwiYXV0aGVudGljYXRpb25fdG9rZW5fZW5kcG9pbnRcIik7XHJcbmV4cG9ydCBsZXQgQVVUSEVOVElDQVRJT05fUk9VVEUgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX3JvdXRlXCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX01BWF9JTkFDVElWSVRZX01JTlVURVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImF1dGhlbnRpY2F0aW9uX21heF9pbmFjdGl2aXR5XCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1VTRVJfQ09VTlRET1dOX1NFQ09ORFMgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImF1dGhlbnRpY2F0aW9uX3VzZXJfY291bnRkb3duX3NlY29uZHNcIik7XHJcbmV4cG9ydCBsZXQgQVVUSEVOVElDQVRJT05fSURQX0lOQUNUSVZJVFlfTUlOVVRFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KFwiYXV0aGVudGljYXRpb25faWRwX2luYWN0aXZpdHlfbWludXRlc1wiKTtcclxuXHJcbi8qKlxyXG4gKiBAc2luY2UgMS4wLjBcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uU2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBnZW5lcmljIGVycm9yIG1lc3NhZ2UgdXNlZCB3aGVuIGEgc2VydmVyIGVycm9yIGlzIHRocm93biB3aXRob3V0IGEgc3RhdHVzLlxyXG4gICAqXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIEdFTkVSSUNfRVJSX01TRzogc3RyaW5nID0gXCJTZXJ2ZXIgZXJyb3JcIjtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgQ09OVEVOVF9UWVBFOiBzdHJpbmcgPSBcIkNvbnRlbnQtVHlwZVwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNFQ19HT1ZfQ0xBU1NfSEVBREVSOiBzdHJpbmcgPSBcIlNlY3VyaXR5R292ZXJub3JDbGFzc1wiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNFQ19HT1ZfSURfSEVBREVSOiBzdHJpbmcgPSBcIlNlY3VyaXR5R292ZXJub3JJZFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIERFSURFTlRfSEVBREVSOiBzdHJpbmcgPSBcIkRlaWRlbnRpZmllZENvbnRleHRcIjtcclxuICBwcml2YXRlIHN0YXRpYyBMSU1JVEVEX0hFQURFUjogc3RyaW5nID0gXCJMaW1pdGVkQ29udGV4dFwiO1xyXG5cclxuICBwdWJsaWMgdXNlckNvdW50ZG93blNlY29uZHM6IG51bWJlciA9IDYwO1xyXG4gIHB1YmxpYyBpZHBJbmFjdGl2aXR5TWludXRlczogbnVtYmVyID0gNTtcclxuXHJcbiAgcHVibGljIGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcclxuICBwdWJsaWMgc2VjdXJpdHlHb3Zlcm5vckNsYXNzOiBzdHJpbmc7XHJcbiAgcHVibGljIHNlY3VyaXR5R292ZXJub3JJZDogbnVtYmVyO1xyXG4gIHB1YmxpYyBsaW1pdGVkQ29udGV4dDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkZWlkZW50aWZpZWRDb250ZXh0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgbWF4Vmlld1Blcm1pc3Npb246IEJlaGF2aW9yU3ViamVjdDxcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCI+KFwidmlld2lkZW50XCIpO1xyXG4gIHByaXZhdGUgX2lzQXV0aGVudGljYXRlZFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHByaXZhdGUgX3VzZXJJc0Fib3V0VG9UaW1lT3V0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcml2YXRlIF9yZWRpcmVjdFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3JlZnJlc2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9sYXN0VXNlckludGVyYWN0aW9uOiBEYXRlO1xyXG4gIHByaXZhdGUgX21heEluYWN0aXZpdHlNaW51dGVzOiBudW1iZXIgPSAxMjA7XHJcblxyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgY29udGV4dFJvb3Q6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9jYWxTdG9yYWdlU2VydmljZTogQ29vbExvY2FsU3RvcmFnZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIF9qd3RIZWxwZXI6IEp3dEhlbHBlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhdXRoZW50aWNhdGlvblByb3ZpZGVyOiBBdXRoZW50aWNhdGlvblByb3ZpZGVyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoQVVUSEVOVElDQVRJT05fTE9HT1VUX1BBVEgpIHByaXZhdGUgX2xvZ291dFBhdGg6IHN0cmluZyxcclxuICAgICAgICAgICAgICBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1RPS0VOX0VORFBPSU5UKSBwcml2YXRlIF90b2tlbkVuZHBvaW50OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9MT0dJTl9QQVRIKSBwcml2YXRlIF9sb2dpblBhdGg6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1JPVVRFKSBwcml2YXRlIF9hdXRoZW50aWNhdGlvblJvdXRlOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9TRVJWRVJfVVJMKSBwcml2YXRlIF9zZXJ2ZXJVcmw6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX0RJUkVDVF9FTkRQT0lOVCkgcHJpdmF0ZSBfZGlyZWN0RW5kcG9pbnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX01BWF9JTkFDVElWSVRZX01JTlVURVMpIHByaXZhdGUgX21heEluYWN0aXZpdHk6IG51bWJlcixcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1VTRVJfQ09VTlRET1dOX1NFQ09ORFMpIHByaXZhdGUgX3VzZXJDb3VudGRvd25TZWNvbmRzOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9JRFBfSU5BQ1RJVklUWV9NSU5VVEVTKSBwcml2YXRlIF9pZHBJbmFjdGl2aXR5TWludXRlczogbnVtYmVyLFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTG9jYXRpb25TdHJhdGVneSkgcHJpdmF0ZSBsb2NhdGlvblN0cmF0ZWd5OiBMb2NhdGlvblN0cmF0ZWd5KSB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIndpbmRvdy5sb2NhdGlvbi5ocmVmOiBcIiArIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LmxvY2F0aW9uKSB7XHJcbiAgICAgIGxldCBwYXJ0czogc3RyaW5nW10gPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdChcIi9cIik7XHJcbiAgICAgIHRoaXMuYmFzZVVybCA9IHBhcnRzWzBdICsgXCIvL1wiICsgcGFydHNbMl07XHJcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAzKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0Um9vdCA9IHBhcnRzWzNdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShcIm1heFZpZXdQZXJtaXNzaW9uXCIpKSB7XHJcbiAgICAgIHRoaXMubWF4Vmlld1Blcm1pc3Npb24ubmV4dCg8XCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiPnRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShcIm1heFZpZXdQZXJtaXNzaW9uXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoX21heEluYWN0aXZpdHkpIHtcclxuICAgICAgdGhpcy5fbWF4SW5hY3Rpdml0eU1pbnV0ZXMgPSBfbWF4SW5hY3Rpdml0eTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoX3VzZXJDb3VudGRvd25TZWNvbmRzKSB7XHJcbiAgICAgIHRoaXMudXNlckNvdW50ZG93blNlY29uZHMgPSBfdXNlckNvdW50ZG93blNlY29uZHM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKF9pZHBJbmFjdGl2aXR5TWludXRlcykge1xyXG4gICAgICB0aGlzLmlkcEluYWN0aXZpdHlNaW51dGVzID0gX2lkcEluYWN0aXZpdHlNaW51dGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFzVmFsaWRDb25maWcoKTtcclxuICB9XHJcblxyXG4gIGdldEJhc2VVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGhpcy5iYXNlVXJsKSA/IHRoaXMuYmFzZVVybCA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZXh0Um9vdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFJvb3Q7XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJzKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IEh0dHBIZWFkZXJzIHtcclxuICAgIGxldCBoZWFkZXJzOiBIdHRwSGVhZGVycyA9IHJlcS5oZWFkZXJzO1xyXG5cclxuICAgIC8vRG9uJ3Qgc2V0IGNvbnRlbnQgdHlwZSBpZiBhbHJlYWR5IHNldFxyXG4gICAgaWYgKCFyZXEuaGVhZGVycy5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLkNPTlRFTlRfVFlQRSkpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5DT05URU5UX1RZUEUsIHRoaXMuY29udGVudFR5cGUudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhlYWRlcnMuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0NMQVNTX0hFQURFUikgPT09IFwiXCIpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuZGVsZXRlKEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0NMQVNTX0hFQURFUik7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VjdXJpdHlHb3Zlcm5vckNsYXNzICYmICFoZWFkZXJzLmdldChBdXRoZW50aWNhdGlvblNlcnZpY2UuU0VDX0dPVl9DTEFTU19IRUFERVIpKSB7XHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChBdXRoZW50aWNhdGlvblNlcnZpY2UuU0VDX0dPVl9DTEFTU19IRUFERVIsIHRoaXMuc2VjdXJpdHlHb3Zlcm5vckNsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGVhZGVycy5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLlNFQ19HT1ZfSURfSEVBREVSKSA9PT0gXCJcIikge1xyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5kZWxldGUoQXV0aGVudGljYXRpb25TZXJ2aWNlLlNFQ19HT1ZfSURfSEVBREVSKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWN1cml0eUdvdmVybm9ySWQgJiYgIWhlYWRlcnMuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0lEX0hFQURFUikpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0lEX0hFQURFUiwgdGhpcy5zZWN1cml0eUdvdmVybm9ySWQudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5ERUlERU5UX0hFQURFUiwgdGhpcy5kZWlkZW50aWZpZWRDb250ZXh0LnRvU3RyaW5nKCkpO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5MSU1JVEVEX0hFQURFUiwgdGhpcy5saW1pdGVkQ29udGV4dC50b1N0cmluZygpKTtcclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIGdldCBhdXRoZW50aWNhdGlvblRva2VuS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhlbnRpY2F0aW9uVG9rZW5LZXk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXV0aFRva2VuKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhUb2tlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVVc2VyQWN0aXZpdHkoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9sYXN0VXNlckludGVyYWN0aW9uID0gbmV3IERhdGUoKTtcclxuICAgICAgdGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIG11dGF0b3IgZm9yIGlkZW50aWZ5aW5nIHRoZSBjbGllbnRzIG9yaWdpbmFsIHJlcXVlc3QgbG9jYXRpb24uIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIGluZmx1ZW5jZSB0aGUgZW5kIGxvY2F0aW9uXHJcbiAgICogbmF2aWdhdGVkIHRvIGJ5IHtAbGluayAjbmF2aWdhdGVUb1BhdGh9LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJlZGlyZWN0VXJsIGxvY2F0aW9uIG9mIHRoZSB1c2VycyByZXF1ZXN0IGJlZm9yZSBhdXRoZW50aWNhdGlvblxyXG4gICAqL1xyXG4gIHNldCByZWRpcmVjdFVybChyZWRpcmVjdFVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9yZWRpcmVjdFVybCA9IHJlZGlyZWN0VXJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlZGlyZWN0VXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0VXJsO1xyXG4gIH1cclxuICBcclxuICBcclxuICBpbml0aWF0ZUxvZ2luKCkge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdXRoZW50aWNhdGlvbiBTZXJ2aWNlOiBJbml0aWF0ZSBMb2dpblwiKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy9SZWRpcmVjdCBiYXNlZCBhdXRoZW50aWNhdGlvblxyXG4gICAgaWYgKHRoaXMuX2xvZ2luUGF0aCkge1xyXG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMuZ2V0QmFzZVVybCgpICsgKHRoaXMuX2xvZ2luUGF0aC5zdGFydHNXaXRoKFwiL1wiKT9cIlwiOlwiL1wiKSArIHRoaXMuX2xvZ2luUGF0aDtcclxuICAgIH1cclxuICAgIC8vQXV0aGVudGljYXRpb24gY29tcG9uZW50ICg8SUZyYW1lPiBpbXBsZW1lbnRhdGlvbilcclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgbG9naW4gcGFnZVxyXG4gICAgICByZXR1cm4gdGhpcy5fcm91dGVyLmNyZWF0ZVVybFRyZWUoW3RoaXMuX2F1dGhlbnRpY2F0aW9uUm91dGVdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlcXVlc3RBY2Nlc3NUb2tlbihmcm9tUm91dGVHdWFyZDogYm9vbGVhbiwgcmVkaXJlY3RPblN1Y2Nlc3M6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIFxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdXRoZW50aWNhdGlvbiBTZXJ2aWNlOiBSZXF1ZXN0IEFjY2VzIFRva2VuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2h0dHAuZ2V0KHRoaXMudG9rZW5Mb2NhdGlvbigpLCB7d2l0aENyZWRlbnRpYWxzOiB0cnVlLCByZXNwb25zZVR5cGU6IFwianNvblwifSlcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZVRva2VuKHJlc3BvbnNlLmF1dGhfdG9rZW4pO1xyXG4gICAgICAgICAgaWYgKHJlZGlyZWN0T25TdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2VlZElmQXV0aGVudGljYXRlZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAvL05vdCBsb2dnZWQgaW4gLSBzdGFydCBhdXRoZW50aWNhdGlvblxyXG4gICAgICAgICAgaWYgKGZyb21Sb3V0ZUd1YXJkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhdGVMb2dpbigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy9CYWNrZ3JvdW5kIHRva2VuIHJlcXVlc3QgZmFpbGVkIC0gbG9nb3V0IGFuZCBjbGVhclxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdXRoZW50aWNhdGlvbiBTZXJ2aWNlOiBSZXF1ZXN0IEFjY2VzIFRva2VuIC0gTG9nb3V0XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmxvZ291dCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmllcyB3aGV0aGVyIG9yIG5vdCBhIGN1cnJlbnQgdXNlciBzZXNzaW9uIGV4aXN0cy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGJvb2xlYW4+fSBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgaXNBdXRoZW50aWNhdGVkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBpc0Fib3V0VG9UaW1lT3V0KCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VzZXJJc0Fib3V0VG9UaW1lT3V0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGltZW91dFN0YXJ0KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fbGFzdFVzZXJJbnRlcmFjdGlvbikge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbGFzdFVzZXJJbnRlcmFjdGlvbi52YWx1ZU9mKCkgKyAoKCh0aGlzLl9tYXhJbmFjdGl2aXR5TWludXRlcyAqIDYwKSAtIHRoaXMudXNlckNvdW50ZG93blNlY29uZHMpICogMTAwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2tlbkxvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyVXJsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJVcmwgKyB0aGlzLl90b2tlbkVuZHBvaW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuRW5kcG9pbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXJlY3RMb2dpbkxvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyVXJsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJVcmwgKyB0aGlzLl9kaXJlY3RFbmRwb2ludDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9kaXJlY3RFbmRwb2ludDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvZ291dExvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyVXJsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJVcmwgKyB0aGlzLl9sb2dvdXRQYXRoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2xvZ291dFBhdGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIGZ1bmN0aW9uIHRvIGF1dGhlbnRpY2F0ZWQgdGhlIHVzZXIgd2l0aCB0aGUgcHJvdmlkZWQgY3JlZGVudGlhbHMuIEZhaWx1cmUgcmVzdWx0cyBpbiBhbiBlcnJvciB0aGF0IGRlc2NyaWJlcyB0aGVcclxuICAgKiBzZXJ2ZXIgcmVzcG9uc2UgKHN0YXR1cyBhbmQgc3RhdHVzIG1lc3NhZ2UpIGFuZCBzaG91bGQgYmUgYWN0aW9uYWJsZSBieSB0aGUgY2xpZW50IGFwcGxpY2F0aW9uLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHVzZXJuYW1lIG9mIHRoZSBhdXRoZW50aWNhdGluZyB1c2VyIHRvIHZlcmlmeVxyXG4gICAqIEBwYXJhbSBwYXNzd29yZCBvZiB0aGUgYXV0aGVudGljYXRpbmcgdXNlciB0byB2ZXJpZnlcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxSPn0gZGVzY3JpYmluZyB0aGUgcmVzdWx0IG9mIHRoZSBsb2dpbiBhY3Rpb24sIHRydWUgb3IgYW4gZXJyb3JcclxuICAgKi9cclxuICBsb2dpbihfdXNlcm5hbWU6IHN0cmluZywgX3Bhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLl9odHRwLnBvc3QoXHJcbiAgICAgIHRoaXMuZGlyZWN0TG9naW5Mb2NhdGlvbigpLFxyXG4gICAgICB7dXNlcm5hbWU6IF91c2VybmFtZSwgcGFzc3dvcmQ6IF9wYXNzd29yZH0sXHJcbiAgICAgIHtvYnNlcnZlOiBcInJlc3BvbnNlXCJ9XHJcbiAgICApLnBpcGUobWFwKChyZXNwOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkF1dGhlbnRpY2F0aW9uIGZhaWxlZC4gXCIgKyByZXNwLnN0YXR1cyArIFwiOiBcIiArIHJlc3Auc3RhdHVzVGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpKSBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIH1cclxuXHJcblxyXG4gIGNsZWFyTG9naW4oKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIC8vRnJvbnQtZW5kIGxvZ291dFxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlci5hdXRoZW50aWNhdGlvblRva2VuS2V5KTtcclxuICAgICAgdGhpcy51bnN1YnNjcmliZUZyb21Ub2tlblJlZnJlc2goKTtcclxuICAgICAgdGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQubmV4dChmYWxzZSk7XHJcbiAgICB9IGNhdGNoIChFcnJvcikge1xyXG4gICAgfVxyXG5cclxuICAgIC8vQmFjay1lbmQgbG9nb3V0XHJcbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpLnNldChBdXRoZW50aWNhdGlvblNlcnZpY2UuQ09OVEVOVF9UWVBFLCBcInRleHQvcGxhaW5cIik7XHJcbiAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj50aGlzLl9odHRwLmdldCh0aGlzLmxvZ291dExvY2F0aW9uKCksIHtoZWFkZXJzOiBoZWFkZXJzLCByZXNwb25zZVR5cGU6IFwidGV4dFwifSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIGZ1bmN0aW9uIHRvIHNpZ25hbCB0aGUgdGVybWluYXRpb24gb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbi4gSW52b2tpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGNsZWFuIHVwIGFueSByZWxldmFudCBzdGF0ZVxyXG4gICAqIHJlbGF0ZWQgdG8gdGhlIGxhc3QgYWN0aXZlIHNlc3Npb24uXHJcbiAgICovXHJcbiAgbG9nb3V0KGtlZXBDdXJyZW50Um91dGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgLy9QcmV2ZW50IGxvZ291dCBpZiBhbHJlYWR5IG9uIGF1dGhlbnRpY2F0aW9uIHJvdXRlLiBEb2luZyBvdGhlcndpc2Ugc2NyZXdzIHVwIFNBTUxcclxuICAgIGlmICghIHRoaXMuX3JvdXRlci5yb3V0ZXJTdGF0ZSB8fCB0aGlzLl9yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsICE9PSB0aGlzLl9hdXRoZW50aWNhdGlvblJvdXRlKSB7XHJcbiAgICAgIHRoaXMuX3JlZGlyZWN0VXJsID0gKGtlZXBDdXJyZW50Um91dGUgJiYgdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlICYmIHRoaXMuX3JvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdCkgPyB0aGlzLl9yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsIDogXCJcIjtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9yZWRpcmVjdFVybC5zdGFydHNXaXRoKFwiL1wiKSkge1xyXG4gICAgICAgIHRoaXMuX3JlZGlyZWN0VXJsID0gdGhpcy5fcmVkaXJlY3RVcmwuc3Vic3RyaW5nKDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNsZWFyTG9naW4oKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh0aGlzLl9yZWRpcmVjdFVybCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UodGhpcy5fcmVkaXJlY3RVcmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0b3JlVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHZhbGlkID0gdGhpcy52YWxpZGF0ZVRva2VuKHRva2VuKTtcclxuXHJcbiAgICAvLyB1bnN1YnNjcmliZSBmcm9tIHJlZmVzaCBiZWZvcmUgd2UgZGVjaWRlIHdldGhlciB0byByZXN1YnNjcmliZVxyXG4gICAgdGhpcy51bnN1YnNjcmliZUZyb21Ub2tlblJlZnJlc2goKTtcclxuXHJcbiAgICBpZiAodmFsaWQpIHtcclxuICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlci5hdXRoZW50aWNhdGlvblRva2VuS2V5LCB0b2tlbik7XHJcbiAgICAgIHRoaXMuc3Vic2NyaWJlVG9Ub2tlblJlZnJlc2godG9rZW4pO1xyXG5cclxuICAgICAgLy9DaGFuZ2UgdGhlIEJlaGF2aW9yU3ViamVjdCBpZiB0aGUgdXNlciB3YXMgbm90IHByZXZpb3VzbHkgYXV0aGVudGljYXRlZC5cclxuICAgICAgLy9TaW5jZSBvdGhlciBjb2RlIG1heSBiZSBzdWJzY3JpYmluZyB0byB0aGlzIG9ic2VydmFibGUsIHdlIGRvbid0IHdhbnQgdG8gY2F1c2UgbmV3IGV2ZW50cyB0byBmaXJlIGlmIGp1c3QgcmVmcmVzaGluZyB0aGUgSldULlxyXG4gICAgICBpZiAoISB0aGlzLl9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LnZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0odGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhlbnRpY2F0aW9uVG9rZW5LZXkpO1xyXG4gICAgICB0aGlzLl9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvY2VlZElmQXV0aGVudGljYXRlZCgpOiBib29sZWFuIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiQXV0aGVudGljYXRpb25TZXJ2aWNlLnByb2NlZWRJZkF1dGhlbnRpY2F0ZWQ6IFwiICsgdGhpcy5fcmVkaXJlY3RVcmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LnZhbHVlKSB7XHJcbiAgICAgIC8vTG9naW4gY291bnRzIGFzIHVzZXIgYWN0aXZpdHksIHRvb1xyXG4gICAgICB0aGlzLnVwZGF0ZVVzZXJBY3Rpdml0eSgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3JlZGlyZWN0VXJsICYmIHRoaXMuX3JlZGlyZWN0VXJsICYmIHRoaXMuX3JlZGlyZWN0VXJsICE9PSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5fcmVkaXJlY3RVcmwpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXCJcIl0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlVG9rZW4odG9rZW46IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0b2tlbiAmJiAhdGhpcy5fand0SGVscGVyLmlzVG9rZW5FeHBpcmVkKHRva2VuKSk7XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmVUb1Rva2VuUmVmcmVzaCh0b2tlbjogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgZXhwID0gdGhpcy5fand0SGVscGVyLmdldFRva2VuRXhwaXJhdGlvbkRhdGUodG9rZW4pO1xyXG5cclxuICAgIC8vIFVzZSBhIHRpbWVyIHRvIHBlcmlvZGljYWxseSBjaGVjayB0aW1lb3V0c1xyXG4gICAgdGhpcy5fcmVmcmVzaFN1YnNjcmlwdGlvbiA9IGludGVydmFsKDEwMDApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgICAvLyBJZiBhIHRhYiBpcyBpbmFjdGl2ZSB3ZSBjYW4ndCBrbm93IGlmIG91ciB0aW1lciBpcyBhY2N1cmF0ZVxyXG4gICAgICAgIC8vIHNvIHdoZW4gdGhlIGludGVydmFsIGhpdHMgY2hlY2sgYWdhaW5zdCB0aW1lc3RhbXBzXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QudmFsdWUgJiYgRGF0ZS5ub3coKSA+IHRoaXMuZ2V0VGltZW91dFN0YXJ0KCkpIHtcclxuICAgICAgICAgIC8vRG9uJ3QgdXBkYXRlIHRoZSBzdWJqZWN0IG1vcmUgdGhhbiBvbmNlISBEb2luZyBzbyBpbml0aWFsaXplcyBtb3JlIHRoYW4gb25lIGNvdW50ZG93biB0aW1lciFcclxuICAgICAgICAgIGlmICh0aGlzLl91c2VySXNBYm91dFRvVGltZU91dC5nZXRWYWx1ZSgpICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJJc0Fib3V0VG9UaW1lT3V0Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjaGVjayBmb3IgcmVmcmVzaCB0b2tlblxyXG4gICAgICAgIGxldCBtc1RvRXhwaXJ5ID0gKGV4cC52YWx1ZU9mKCkgLSBuZXcgRGF0ZSgpLnZhbHVlT2YoKSk7XHJcblxyXG4gICAgICAgIC8vIFJlZnJlc2ggNjAgc2Vjb25kcyBiZWZvcmUgZXhwaXJ5XHJcbiAgICAgICAgaWYgKG1zVG9FeHBpcnkgPD0gNjAwMDApIHtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuSWZVc2VySXNBY3RpdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdW5zdWJzY3JpYmVGcm9tVG9rZW5SZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3JlZnJlc2hTdWJzY3JpcHRpb24gJiYgISB0aGlzLl9yZWZyZXNoU3Vic2NyaXB0aW9uLmNsb3NlZCkge1xyXG4gICAgICB0aGlzLl9yZWZyZXNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRNYXhWaWV3UGVybWlzc2lvbigpOiBcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCIge1xyXG4gICAgcmV0dXJuIHRoaXMubWF4Vmlld1Blcm1pc3Npb24uZ2V0VmFsdWUoKTtcclxuICB9XHJcblxyXG4gIGdldE1heFZpZXdQZXJtaXNzaW9uU3ViamVjdCgpOiBCZWhhdmlvclN1YmplY3Q8XCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiPiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXhWaWV3UGVybWlzc2lvbjtcclxuICB9XHJcblxyXG4gIHNldE1heFZpZXdQZXJtaXNzaW9uKG1heFZpZXdQZXJtaXNzaW9uOiBcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShcIm1heFZpZXdQZXJtaXNzaW9uXCIsIG1heFZpZXdQZXJtaXNzaW9uKTtcclxuICAgIHRoaXMubWF4Vmlld1Blcm1pc3Npb24ubmV4dChtYXhWaWV3UGVybWlzc2lvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hUb2tlbklmVXNlcklzQWN0aXZlKCk6IHZvaWQge1xyXG4gICAgLy9Pbmx5IHJlZnJlc2ggaWYgdGhlIHVzZXIgaGFzIGJlZW4gYWN0aXZlXHJcbiAgICBpZiAodGhpcy5fbGFzdFVzZXJJbnRlcmFjdGlvbiAmJiAoKG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGhpcy5fbGFzdFVzZXJJbnRlcmFjdGlvbi52YWx1ZU9mKCkpIDw9ICh0aGlzLl9tYXhJbmFjdGl2aXR5TWludXRlcyAqIDYwICogMTAwMCkpKSB7XHJcbiAgICAgIHRoaXMucmVxdWVzdEFjY2Vzc1Rva2VuKGZhbHNlLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc1ZhbGlkQ29uZmlnKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3Rva2VuRW5kcG9pbnQgPT0gbnVsbCAmJiAodGhpcy5fc2VydmVyVXJsID09PSBudWxsIHx8IHRoaXMuX2xvZ291dFBhdGggPT09IG51bGwpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJVRyBBTEVSVCEgSW52YWxpZCBBdXRoZW50aWNhdGlvblNlcnZpY2UgY29uZmlndXJhdGlvbi4gTm8gdmFsaWQgY29uZmlndXJhdGlvbiBmb3IgYXV0aGVudGljYXRpb24gZW5kcG9pbnQocykuXCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UgPT09IG51bGwgfHwgdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhlbnRpY2F0aW9uVG9rZW5LZXkgPT09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQlVHIEFMRVJUISBJbnZhbGlkIEF1dGhlbnRpY2F0aW9uU2VydmljZSBjb25maWd1cmF0aW9uLiBObyB2YWxpZCBjb25maWd1cmF0aW9uIGZvciBsb2NhbCBzdG9yYWdlXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnJvcjogYW55KSA6IE9ic2VydmFibGU8bmV2ZXI+IHtcclxuICAgIGxldCBlcnJNc2cgPSAoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogQXV0aGVudGljYXRpb25TZXJ2aWNlLkdFTkVSSUNfRVJSX01TRztcclxuICAgIHJldHVybiB0aHJvd0Vycm9yKGVyck1zZyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
426
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2F1dGhlbnRpY2F0aW9uL3NyYy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzNELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBNEIsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RixPQUFPLEVBQUMsUUFBUSxFQUFjLGVBQWUsRUFBZ0IsVUFBVSxFQUFLLE1BQU0sTUFBTSxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxVQUFVLEVBQVMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7O0FBRXpEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsSUFBSSx5QkFBeUIsR0FBRyxJQUFJLGNBQWMsQ0FBUyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ3BHLE1BQU0sQ0FBQyxJQUFJLHlCQUF5QixHQUFHLElBQUksY0FBYyxDQUFTLDJCQUEyQixDQUFDLENBQUM7QUFDL0YsTUFBTSxDQUFDLElBQUksMEJBQTBCLEdBQUcsSUFBSSxjQUFjLENBQVMsNEJBQTRCLENBQUMsQ0FBQztBQUNqRyxNQUFNLENBQUMsSUFBSSw4QkFBOEIs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LFFBQVE7OzBCQUFJLE1BQU07MkJBQUMseUJBQXlCOzswQkFDNUMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyw4QkFBOEI7OzBCQUNqRCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFDQUFxQzs7MEJBQ3hELFFBQVE7OzBCQUFJLE1BQU07MkJBQUMscUNBQXFDOzswQkFDeEQsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxxQ0FBcUM7OzBCQUN4RCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoYykgMjAxNiBIdW50c21hbiBDYW5jZXIgSW5zdGl0dXRlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgsIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnlcclxuICovXHJcbmltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIEluamVjdCwgT3B0aW9uYWwsIGlzRGV2TW9kZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtMb2NhdGlvbiwgTG9jYXRpb25TdHJhdGVneX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuXHJcbmltcG9ydCB7aW50ZXJ2YWwsIE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yLCBvZn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtjYXRjaEVycm9yLCBmaXJzdCwgbWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtKd3RIZWxwZXJTZXJ2aWNlfSBmcm9tIFwiQGF1dGgwL2FuZ3VsYXItand0XCI7XHJcblxyXG5pbXBvcnQge0F1dGhlbnRpY2F0aW9uUHJvdmlkZXJ9IGZyb20gXCIuL2F1dGhlbnRpY2F0aW9uLnByb3ZpZGVyXCI7XHJcbmltcG9ydCB7IENvb2xMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiQGFuZ3VsYXItY29vbC9zdG9yYWdlXCI7XHJcblxyXG4vKipcclxuICogVGhlIHRva2VuIHVzZWQgZm9yIGluamVjdGlvbiBvZiB0aGUgc2VydmVyIHNpZGUgZW5kcG9pbnQgZm9yIHRoZSBjdXJyZW50bHkgYXV0aGVudGljYXRlZCBzdWJqZWN0LlxyXG4gKlxyXG4gKiBAdHlwZSB7SW5qZWN0aW9uVG9rZW59XHJcbiAqL1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1NFUlZFUl9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX3NlcnZlcl9yZXN0X2FwaVwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9MT0dJTl9QQVRIID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdXRoZW50aWNhdGlvbl9sb2dpbl9wYXRoXCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX0xPR09VVF9QQVRIID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdXRoZW50aWNhdGlvbl9sb2dvdXRfcGF0aFwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9ESVJFQ1RfRU5EUE9JTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX2RpcmVjdF9lbmRwb2ludFwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9UT0tFTl9FTkRQT0lOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFwiYXV0aGVudGljYXRpb25fdG9rZW5fZW5kcG9pbnRcIik7XHJcbmV4cG9ydCBsZXQgQVVUSEVOVElDQVRJT05fUk9VVEUgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX3JvdXRlXCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX01BWF9JTkFDVElWSVRZX01JTlVURVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImF1dGhlbnRpY2F0aW9uX21heF9pbmFjdGl2aXR5XCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1VTRVJfQ09VTlRET1dOX1NFQ09ORFMgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImF1dGhlbnRpY2F0aW9uX3VzZXJfY291bnRkb3duX3NlY29uZHNcIik7XHJcbmV4cG9ydCBsZXQgQVVUSEVOVElDQVRJT05fSURQX0lOQUNUSVZJVFlfTUlOVVRFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KFwiYXV0aGVudGljYXRpb25faWRwX2luYWN0aXZpdHlfbWludXRlc1wiKTtcclxuXHJcbi8qKlxyXG4gKiBAc2luY2UgMS4wLjBcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uU2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBnZW5lcmljIGVycm9yIG1lc3NhZ2UgdXNlZCB3aGVuIGEgc2VydmVyIGVycm9yIGlzIHRocm93biB3aXRob3V0IGEgc3RhdHVzLlxyXG4gICAqXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIEdFTkVSSUNfRVJSX01TRzogc3RyaW5nID0gXCJTZXJ2ZXIgZXJyb3JcIjtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgQ09OVEVOVF9UWVBFOiBzdHJpbmcgPSBcIkNvbnRlbnQtVHlwZVwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNFQ19HT1ZfQ0xBU1NfSEVBREVSOiBzdHJpbmcgPSBcIlNlY3VyaXR5R292ZXJub3JDbGFzc1wiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNFQ19HT1ZfSURfSEVBREVSOiBzdHJpbmcgPSBcIlNlY3VyaXR5R292ZXJub3JJZFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIERFSURFTlRfSEVBREVSOiBzdHJpbmcgPSBcIkRlaWRlbnRpZmllZENvbnRleHRcIjtcclxuICBwcml2YXRlIHN0YXRpYyBMSU1JVEVEX0hFQURFUjogc3RyaW5nID0gXCJMaW1pdGVkQ29udGV4dFwiO1xyXG5cclxuICBwdWJsaWMgdXNlckNvdW50ZG93blNlY29uZHM6IG51bWJlciA9IDYwO1xyXG4gIHB1YmxpYyBpZHBJbmFjdGl2aXR5TWludXRlczogbnVtYmVyID0gNTtcclxuXHJcbiAgcHVibGljIGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcclxuICBwdWJsaWMgc2VjdXJpdHlHb3Zlcm5vckNsYXNzOiBzdHJpbmc7XHJcbiAgcHVibGljIHNlY3VyaXR5R292ZXJub3JJZDogbnVtYmVyO1xyXG4gIHB1YmxpYyBsaW1pdGVkQ29udGV4dDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkZWlkZW50aWZpZWRDb250ZXh0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgbWF4Vmlld1Blcm1pc3Npb246IEJlaGF2aW9yU3ViamVjdDxcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCI+KFwidmlld2lkZW50XCIpO1xyXG4gIHByaXZhdGUgX2lzQXV0aGVudGljYXRlZFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHByaXZhdGUgX3VzZXJJc0Fib3V0VG9UaW1lT3V0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcml2YXRlIF9yZWRpcmVjdFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3JlZnJlc2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9sYXN0VXNlckludGVyYWN0aW9uOiBEYXRlO1xyXG4gIHByaXZhdGUgX21heEluYWN0aXZpdHlNaW51dGVzOiBudW1iZXIgPSAxMjA7XHJcblxyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgY29udGV4dFJvb3Q6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9jYWxTdG9yYWdlU2VydmljZTogQ29vbExvY2FsU3RvcmFnZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIF9qd3RIZWxwZXI6IEp3dEhlbHBlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhdXRoZW50aWNhdGlvblByb3ZpZGVyOiBBdXRoZW50aWNhdGlvblByb3ZpZGVyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoQVVUSEVOVElDQVRJT05fTE9HT1VUX1BBVEgpIHByaXZhdGUgX2xvZ291dFBhdGg6IHN0cmluZyxcclxuICAgICAgICAgICAgICBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1RPS0VOX0VORFBPSU5UKSBwcml2YXRlIF90b2tlbkVuZHBvaW50OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9MT0dJTl9QQVRIKSBwcml2YXRlIF9sb2dpblBhdGg6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1JPVVRFKSBwcml2YXRlIF9hdXRoZW50aWNhdGlvblJvdXRlOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9TRVJWRVJfVVJMKSBwcml2YXRlIF9zZXJ2ZXJVcmw6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX0RJUkVDVF9FTkRQT0lOVCkgcHJpdmF0ZSBfZGlyZWN0RW5kcG9pbnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX01BWF9JTkFDVElWSVRZX01JTlVURVMpIHByaXZhdGUgX21heEluYWN0aXZpdHk6IG51bWJlcixcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1VTRVJfQ09VTlRET1dOX1NFQ09ORFMpIHByaXZhdGUgX3VzZXJDb3VudGRvd25TZWNvbmRzOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9JRFBfSU5BQ1RJVklUWV9NSU5VVEVTKSBwcml2YXRlIF9pZHBJbmFjdGl2aXR5TWludXRlczogbnVtYmVyLFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTG9jYXRpb25TdHJhdGVneSkgcHJpdmF0ZSBsb2NhdGlvblN0cmF0ZWd5OiBMb2NhdGlvblN0cmF0ZWd5KSB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIndpbmRvdy5sb2NhdGlvbi5ocmVmOiBcIiArIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LmxvY2F0aW9uKSB7XHJcbiAgICAgIGxldCBwYXJ0czogc3RyaW5nW10gPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdChcIi9cIik7XHJcbiAgICAgIHRoaXMuYmFzZVVybCA9IHBhcnRzWzBdICsgXCIvL1wiICsgcGFydHNbMl07XHJcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAzKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0Um9vdCA9IHBhcnRzWzNdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShcIm1heFZpZXdQZXJtaXNzaW9uXCIpKSB7XHJcbiAgICAgIHRoaXMubWF4Vmlld1Blcm1pc3Npb24ubmV4dCg8XCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiPnRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShcIm1heFZpZXdQZXJtaXNzaW9uXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoX21heEluYWN0aXZpdHkpIHtcclxuICAgICAgdGhpcy5fbWF4SW5hY3Rpdml0eU1pbnV0ZXMgPSBfbWF4SW5hY3Rpdml0eTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoX3VzZXJDb3VudGRvd25TZWNvbmRzKSB7XHJcbiAgICAgIHRoaXMudXNlckNvdW50ZG93blNlY29uZHMgPSBfdXNlckNvdW50ZG93blNlY29uZHM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKF9pZHBJbmFjdGl2aXR5TWludXRlcykge1xyXG4gICAgICB0aGlzLmlkcEluYWN0aXZpdHlNaW51dGVzID0gX2lkcEluYWN0aXZpdHlNaW51dGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFzVmFsaWRDb25maWcoKTtcclxuICB9XHJcblxyXG4gIGdldEJhc2VVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGhpcy5iYXNlVXJsKSA/IHRoaXMuYmFzZVVybCA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZXh0Um9vdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFJvb3Q7XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJzKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IEh0dHBIZWFkZXJzIHtcclxuICAgIGxldCBoZWFkZXJzOiBIdHRwSGVhZGVycyA9IHJlcS5oZWFkZXJzO1xyXG5cclxuICAgIC8vRG9uJ3Qgc2V0IGNvbnRlbnQgdHlwZSBpZiBhbHJlYWR5IHNldFxyXG4gICAgaWYgKCFyZXEuaGVhZGVycy5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLkNPTlRFTlRfVFlQRSkpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5DT05URU5UX1RZUEUsIHRoaXMuY29udGVudFR5cGUudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhlYWRlcnMuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0NMQVNTX0hFQURFUikgPT09IFwiXCIpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuZGVsZXRlKEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0NMQVNTX0hFQURFUik7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VjdXJpdHlHb3Zlcm5vckNsYXNzICYmICFoZWFkZXJzLmdldChBdXRoZW50aWNhdGlvblNlcnZpY2UuU0VDX0dPVl9DTEFTU19IRUFERVIpKSB7XHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChBdXRoZW50aWNhdGlvblNlcnZpY2UuU0VDX0dPVl9DTEFTU19IRUFERVIsIHRoaXMuc2VjdXJpdHlHb3Zlcm5vckNsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGVhZGVycy5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLlNFQ19HT1ZfSURfSEVBREVSKSA9PT0gXCJcIikge1xyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5kZWxldGUoQXV0aGVudGljYXRpb25TZXJ2aWNlLlNFQ19HT1ZfSURfSEVBREVSKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWN1cml0eUdvdmVybm9ySWQgJiYgIWhlYWRlcnMuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0lEX0hFQURFUikpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0lEX0hFQURFUiwgdGhpcy5zZWN1cml0eUdvdmVybm9ySWQudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5ERUlERU5UX0hFQURFUiwgdGhpcy5kZWlkZW50aWZpZWRDb250ZXh0LnRvU3RyaW5nKCkpO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5MSU1JVEVEX0hFQURFUiwgdGhpcy5saW1pdGVkQ29udGV4dC50b1N0cmluZygpKTtcclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIGdldCBhdXRoZW50aWNhdGlvblRva2VuS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhlbnRpY2F0aW9uVG9rZW5LZXk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXV0aFRva2VuKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhUb2tlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVVc2VyQWN0aXZpdHkoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9sYXN0VXNlckludGVyYWN0aW9uID0gbmV3IERhdGUoKTtcclxuICAgICAgdGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIG11dGF0b3IgZm9yIGlkZW50aWZ5aW5nIHRoZSBjbGllbnRzIG9yaWdpbmFsIHJlcXVlc3QgbG9jYXRpb24uIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIGluZmx1ZW5jZSB0aGUgZW5kIGxvY2F0aW9uXHJcbiAgICogbmF2aWdhdGVkIHRvIGJ5IHtAbGluayAjbmF2aWdhdGVUb1BhdGh9LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJlZGlyZWN0VXJsIGxvY2F0aW9uIG9mIHRoZSB1c2VycyByZXF1ZXN0IGJlZm9yZSBhdXRoZW50aWNhdGlvblxyXG4gICAqL1xyXG4gIHNldCByZWRpcmVjdFVybChyZWRpcmVjdFVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9yZWRpcmVjdFVybCA9IHJlZGlyZWN0VXJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlZGlyZWN0VXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0VXJsO1xyXG4gIH1cclxuICBcclxuICBcclxuICBpbml0aWF0ZUxvZ2luKCkge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdXRoZW50aWNhdGlvbiBTZXJ2aWNlOiBJbml0aWF0ZSBMb2dpbjogXCIgKyAodGhpcy50b2tlbkxvY2F0aW9uKT9cIlJlZGlyZWN0XCI6XCJMb2dpbiBDb21wb25lbnRcIik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vUmVkaXJlY3QgYmFzZWQgYXV0aGVudGljYXRpb25cclxuICAgIGlmICh0aGlzLl9sb2dpblBhdGgpIHtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmdldEJhc2VVcmwoKSArICh0aGlzLl9sb2dpblBhdGguc3RhcnRzV2l0aChcIi9cIik/XCJcIjpcIi9cIikgKyB0aGlzLl9sb2dpblBhdGg7XHJcbiAgICB9XHJcbiAgICAvL0F1dGhlbnRpY2F0aW9uIGNvbXBvbmVudCAoPElGcmFtZT4gaW1wbGVtZW50YXRpb24pXHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGxvZ2luIHBhZ2VcclxuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5jcmVhdGVVcmxUcmVlKFt0aGlzLl9hdXRoZW50aWNhdGlvblJvdXRlXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXF1ZXN0QWNjZXNzVG9rZW4oZnJvbVJvdXRlR3VhcmQ6IGJvb2xlYW4sIHJlZGlyZWN0T25TdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiQXV0aGVudGljYXRpb24gU2VydmljZTogUmVxdWVzdCBBY2NlcyBUb2tlblwiKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9odHRwLmdldCh0aGlzLnRva2VuTG9jYXRpb24oKSwge3dpdGhDcmVkZW50aWFsczogdHJ1ZSwgcmVzcG9uc2VUeXBlOiBcImpzb25cIn0pXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RvcmVUb2tlbihyZXNwb25zZS5hdXRoX3Rva2VuKTtcclxuICAgICAgICAgIGlmIChyZWRpcmVjdE9uU3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnByb2NlZWRJZkF1dGhlbnRpY2F0ZWQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgLy9Ob3QgbG9nZ2VkIGluIC0gc3RhcnQgYXV0aGVudGljYXRpb25cclxuICAgICAgICAgIGlmIChmcm9tUm91dGVHdWFyZCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlTG9naW4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vQmFja2dyb3VuZCB0b2tlbiByZXF1ZXN0IGZhaWxlZCAtIGxvZ291dCBhbmQgY2xlYXJcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0aGVudGljYXRpb24gU2VydmljZTogUmVxdWVzdCBBY2NlcyBUb2tlbiAtIExvZ291dFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5sb2dvdXQodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmVyaWZpZXMgd2hldGhlciBvciBub3QgYSBjdXJyZW50IHVzZXIgc2Vzc2lvbiBleGlzdHMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxib29sZWFuPn0gZXZhbHVhdGVzIHRvIHRydWUgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGlzQXV0aGVudGljYXRlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLl9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgaXNBYm91dFRvVGltZU91dCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLl91c2VySXNBYm91dFRvVGltZU91dC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldFRpbWVvdXRTdGFydCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24udmFsdWVPZigpICsgKCgodGhpcy5fbWF4SW5hY3Rpdml0eU1pbnV0ZXMgKiA2MCkgLSB0aGlzLnVzZXJDb3VudGRvd25TZWNvbmRzKSAqIDEwMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9rZW5Mb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlclVybCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyVXJsICsgdGhpcy5fdG9rZW5FbmRwb2ludDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl90b2tlbkVuZHBvaW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlyZWN0TG9naW5Mb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlclVybCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyVXJsICsgdGhpcy5fZGlyZWN0RW5kcG9pbnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fZGlyZWN0RW5kcG9pbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2dvdXRMb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlclVybCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyVXJsICsgdGhpcy5fbG9nb3V0UGF0aDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9sb2dvdXRQYXRoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBmdW5jdGlvbiB0byBhdXRoZW50aWNhdGVkIHRoZSB1c2VyIHdpdGggdGhlIHByb3ZpZGVkIGNyZWRlbnRpYWxzLiBGYWlsdXJlIHJlc3VsdHMgaW4gYW4gZXJyb3IgdGhhdCBkZXNjcmliZXMgdGhlXHJcbiAgICogc2VydmVyIHJlc3BvbnNlIChzdGF0dXMgYW5kIHN0YXR1cyBtZXNzYWdlKSBhbmQgc2hvdWxkIGJlIGFjdGlvbmFibGUgYnkgdGhlIGNsaWVudCBhcHBsaWNhdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB1c2VybmFtZSBvZiB0aGUgYXV0aGVudGljYXRpbmcgdXNlciB0byB2ZXJpZnlcclxuICAgKiBAcGFyYW0gcGFzc3dvcmQgb2YgdGhlIGF1dGhlbnRpY2F0aW5nIHVzZXIgdG8gdmVyaWZ5XHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Uj59IGRlc2NyaWJpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbG9naW4gYWN0aW9uLCB0cnVlIG9yIGFuIGVycm9yXHJcbiAgICovXHJcbiAgbG9naW4oX3VzZXJuYW1lOiBzdHJpbmcsIF9wYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0KFxyXG4gICAgICB0aGlzLmRpcmVjdExvZ2luTG9jYXRpb24oKSxcclxuICAgICAge3VzZXJuYW1lOiBfdXNlcm5hbWUsIHBhc3N3b3JkOiBfcGFzc3dvcmR9LFxyXG4gICAgICB7b2JzZXJ2ZTogXCJyZXNwb25zZVwifVxyXG4gICAgKS5waXBlKG1hcCgocmVzcDogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoZW50aWNhdGlvbiBmYWlsZWQuIFwiICsgcmVzcC5zdGF0dXMgKyBcIjogXCIgKyByZXNwLnN0YXR1c1RleHQpO1xyXG4gICAgICB9XHJcbiAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKSkgYXMgT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICB9XHJcblxyXG5cclxuICBjbGVhckxvZ2luKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAvL0Zyb250LWVuZCBsb2dvdXRcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbSh0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuYXV0aGVudGljYXRpb25Ub2tlbktleSk7XHJcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tVG9rZW5SZWZyZXNoKCk7XHJcbiAgICAgIHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuX3VzZXJJc0Fib3V0VG9UaW1lT3V0Lm5leHQoZmFsc2UpO1xyXG4gICAgfSBjYXRjaCAoRXJyb3IpIHtcclxuICAgIH1cclxuXHJcbiAgICAvL0JhY2stZW5kIGxvZ291dFxyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLkNPTlRFTlRfVFlQRSwgXCJ0ZXh0L3BsYWluXCIpO1xyXG4gICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+dGhpcy5faHR0cC5nZXQodGhpcy5sb2dvdXRMb2NhdGlvbigpLCB7aGVhZGVyczogaGVhZGVycywgcmVzcG9uc2VUeXBlOiBcInRleHRcIn0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBmdW5jdGlvbiB0byBzaWduYWwgdGhlIHRlcm1pbmF0aW9uIG9mIHRoZSBjdXJyZW50IHNlc3Npb24uIEludm9raW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBjbGVhbiB1cCBhbnkgcmVsZXZhbnQgc3RhdGVcclxuICAgKiByZWxhdGVkIHRvIHRoZSBsYXN0IGFjdGl2ZSBzZXNzaW9uLlxyXG4gICAqL1xyXG4gIGxvZ291dChrZWVwQ3VycmVudFJvdXRlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIC8vUHJldmVudCBsb2dvdXQgaWYgYWxyZWFkeSBvbiBhdXRoZW50aWNhdGlvbiByb3V0ZS4gRG9pbmcgb3RoZXJ3aXNlIHNjcmV3cyB1cCBTQU1MXHJcbiAgICBpZiAoISB0aGlzLl9yb3V0ZXIucm91dGVyU3RhdGUgfHwgdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCAhPT0gdGhpcy5fYXV0aGVudGljYXRpb25Sb3V0ZSkge1xyXG4gICAgICB0aGlzLl9yZWRpcmVjdFVybCA9IChrZWVwQ3VycmVudFJvdXRlICYmIHRoaXMuX3JvdXRlci5yb3V0ZXJTdGF0ZSAmJiB0aGlzLl9yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpID8gdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCA6IFwiXCI7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcmVkaXJlY3RVcmwuc3RhcnRzV2l0aChcIi9cIikpIHtcclxuICAgICAgICB0aGlzLl9yZWRpcmVjdFVybCA9IHRoaXMuX3JlZGlyZWN0VXJsLnN1YnN0cmluZygxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jbGVhckxvZ2luKCkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UodGhpcy5fcmVkaXJlY3RVcmwpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHRoaXMuX3JlZGlyZWN0VXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdG9yZVRva2VuKHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCB2YWxpZCA9IHRoaXMudmFsaWRhdGVUb2tlbih0b2tlbik7XHJcblxyXG4gICAgLy8gdW5zdWJzY3JpYmUgZnJvbSByZWZlc2ggYmVmb3JlIHdlIGRlY2lkZSB3ZXRoZXIgdG8gcmVzdWJzY3JpYmVcclxuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tVG9rZW5SZWZyZXNoKCk7XHJcblxyXG4gICAgaWYgKHZhbGlkKSB7XHJcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSh0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuYXV0aGVudGljYXRpb25Ub2tlbktleSwgdG9rZW4pO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZVRvVG9rZW5SZWZyZXNoKHRva2VuKTtcclxuXHJcbiAgICAgIC8vQ2hhbmdlIHRoZSBCZWhhdmlvclN1YmplY3QgaWYgdGhlIHVzZXIgd2FzIG5vdCBwcmV2aW91c2x5IGF1dGhlbnRpY2F0ZWQuXHJcbiAgICAgIC8vU2luY2Ugb3RoZXIgY29kZSBtYXkgYmUgc3Vic2NyaWJpbmcgdG8gdGhpcyBvYnNlcnZhYmxlLCB3ZSBkb24ndCB3YW50IHRvIGNhdXNlIG5ldyBldmVudHMgdG8gZmlyZSBpZiBqdXN0IHJlZnJlc2hpbmcgdGhlIEpXVC5cclxuICAgICAgaWYgKCEgdGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlci5hdXRoZW50aWNhdGlvblRva2VuS2V5KTtcclxuICAgICAgdGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2NlZWRJZkF1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZWVkSWZBdXRoZW50aWNhdGVkOiBcIiArIHRoaXMuX3JlZGlyZWN0VXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICAvL0xvZ2luIGNvdW50cyBhcyB1c2VyIGFjdGl2aXR5LCB0b29cclxuICAgICAgdGhpcy51cGRhdGVVc2VyQWN0aXZpdHkoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9yZWRpcmVjdFVybCAmJiB0aGlzLl9yZWRpcmVjdFVybCAmJiB0aGlzLl9yZWRpcmVjdFVybCAhPT0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuX3JlZGlyZWN0VXJsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW1wiXCJdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZVRva2VuKHRva2VuOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodG9rZW4gJiYgIXRoaXMuX2p3dEhlbHBlci5pc1Rva2VuRXhwaXJlZCh0b2tlbikpO1xyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlVG9Ub2tlblJlZnJlc2godG9rZW46IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGV4cCA9IHRoaXMuX2p3dEhlbHBlci5nZXRUb2tlbkV4cGlyYXRpb25EYXRlKHRva2VuKTtcclxuXHJcbiAgICAvLyBVc2UgYSB0aW1lciB0byBwZXJpb2RpY2FsbHkgY2hlY2sgdGltZW91dHNcclxuICAgIHRoaXMuX3JlZnJlc2hTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgxMDAwKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuXHJcbiAgICAgICAgLy8gSWYgYSB0YWIgaXMgaW5hY3RpdmUgd2UgY2FuJ3Qga25vdyBpZiBvdXIgdGltZXIgaXMgYWNjdXJhdGVcclxuICAgICAgICAvLyBzbyB3aGVuIHRoZSBpbnRlcnZhbCBoaXRzIGNoZWNrIGFnYWluc3QgdGltZXN0YW1wc1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LnZhbHVlICYmIERhdGUubm93KCkgPiB0aGlzLmdldFRpbWVvdXRTdGFydCgpKSB7XHJcbiAgICAgICAgICAvL0Rvbid0IHVwZGF0ZSB0aGUgc3ViamVjdCBtb3JlIHRoYW4gb25jZSEgRG9pbmcgc28gaW5pdGlhbGl6ZXMgbW9yZSB0aGFuIG9uZSBjb3VudGRvd24gdGltZXIhXHJcbiAgICAgICAgICBpZiAodGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQuZ2V0VmFsdWUoKSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl91c2VySXNBYm91dFRvVGltZU91dC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIHJlZnJlc2ggdG9rZW5cclxuICAgICAgICBsZXQgbXNUb0V4cGlyeSA9IChleHAudmFsdWVPZigpIC0gbmV3IERhdGUoKS52YWx1ZU9mKCkpO1xyXG5cclxuICAgICAgICAvLyBSZWZyZXNoIDYwIHNlY29uZHMgYmVmb3JlIGV4cGlyeVxyXG4gICAgICAgIGlmIChtc1RvRXhwaXJ5IDw9IDYwMDAwKSB7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbklmVXNlcklzQWN0aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlRnJvbVRva2VuUmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9yZWZyZXNoU3Vic2NyaXB0aW9uICYmICEgdGhpcy5fcmVmcmVzaFN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcclxuICAgICAgdGhpcy5fcmVmcmVzaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TWF4Vmlld1Blcm1pc3Npb24oKTogXCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiIHtcclxuICAgIHJldHVybiB0aGlzLm1heFZpZXdQZXJtaXNzaW9uLmdldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRNYXhWaWV3UGVybWlzc2lvblN1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PFwidmlld1wiIHwgXCJ2aWV3aWRlbnRcIiB8IFwidmlld2xpbWl0ZWRcIj4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF4Vmlld1Blcm1pc3Npb247XHJcbiAgfVxyXG5cclxuICBzZXRNYXhWaWV3UGVybWlzc2lvbihtYXhWaWV3UGVybWlzc2lvbjogXCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oXCJtYXhWaWV3UGVybWlzc2lvblwiLCBtYXhWaWV3UGVybWlzc2lvbik7XHJcbiAgICB0aGlzLm1heFZpZXdQZXJtaXNzaW9uLm5leHQobWF4Vmlld1Blcm1pc3Npb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW5JZlVzZXJJc0FjdGl2ZSgpOiB2b2lkIHtcclxuICAgIC8vT25seSByZWZyZXNoIGlmIHRoZSB1c2VyIGhhcyBiZWVuIGFjdGl2ZVxyXG4gICAgaWYgKHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24gJiYgKChuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24udmFsdWVPZigpKSA8PSAodGhpcy5fbWF4SW5hY3Rpdml0eU1pbnV0ZXMgKiA2MCAqIDEwMDApKSkge1xyXG4gICAgICB0aGlzLnJlcXVlc3RBY2Nlc3NUb2tlbihmYWxzZSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNWYWxpZENvbmZpZygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90b2tlbkVuZHBvaW50ID09IG51bGwgJiYgKHRoaXMuX3NlcnZlclVybCA9PT0gbnVsbCB8fCB0aGlzLl9sb2dvdXRQYXRoID09PSBudWxsKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCVUcgQUxFUlQhIEludmFsaWQgQXV0aGVudGljYXRpb25TZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIGF1dGhlbnRpY2F0aW9uIGVuZHBvaW50KHMpLlwiKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlID09PSBudWxsIHx8IHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlci5hdXRoZW50aWNhdGlvblRva2VuS2V5ID09PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJVRyBBTEVSVCEgSW52YWxpZCBBdXRoZW50aWNhdGlvblNlcnZpY2UgY29uZmlndXJhdGlvbi4gTm8gdmFsaWQgY29uZmlndXJhdGlvbiBmb3IgbG9jYWwgc3RvcmFnZVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSkgOiBPYnNlcnZhYmxlPG5ldmVyPiB7XHJcbiAgICBsZXQgZXJyTXNnID0gKGVycm9yLm1lc3NhZ2UpID8gZXJyb3IubWVzc2FnZSA6IEF1dGhlbnRpY2F0aW9uU2VydmljZS5HRU5FUklDX0VSUl9NU0c7XHJcbiAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJNc2cpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,6 +1,6 @@
1
1
  import { Injectable, Injector, isDevMode } from "@angular/core";
2
2
  import { throwError } from "rxjs";
3
- import { catchError } from "rxjs/operators";
3
+ import { catchError, map } from "rxjs/operators";
4
4
  import { AuthenticationService } from "./authentication.service";
5
5
  import * as i0 from "@angular/core";
6
6
  export class AuthorizationInterceptor {
@@ -43,13 +43,7 @@ export class AuthorizationInterceptor {
43
43
  return next.handle(reqClone)
44
44
  .pipe(catchError((error) => {
45
45
  if (isDevMode()) {
46
- console.error("AuthorizationInterceptor.error");
47
- console.log("Error status: " + error.status);
48
- console.log("Error message: " + error.message);
49
- console.log("Error error: " + error.error);
50
- console.log("Error URL: " + error.url);
51
- console.log(error.headers);
52
- console.error(error);
46
+ console.debug("AuthorizationInterceptor.error");
53
47
  }
54
48
  /**
55
49
  * If the token is not authenticated which angular does not know about, then a REST request to the backend will
@@ -57,17 +51,17 @@ export class AuthorizationInterceptor {
57
51
  * that hits a protected resource.
58
52
  */
59
53
  if (error && error.status === 401) {
60
- authService.isAuthenticated().subscribe((authenticated) => {
54
+ authService.isAuthenticated().pipe(map((authenticated) => {
61
55
  if (authenticated) {
62
- // If authenticated, then logout which will redirect.
56
+ // If the user was previously authenticated, then logout which will redirect.
63
57
  authService.logout(true);
64
58
  return throwError(error.message);
65
59
  }
66
60
  else {
67
- // Otherwise, for example, when the user first opens Core, 401s are expected.
61
+ //This happens for legitimate reasons. Attempting to get the JWT when not authenticated returns the login form, for example, which NG will see as an error
68
62
  return throwError(error);
69
63
  }
70
- });
64
+ }));
71
65
  }
72
66
  else if (error && error.status === 403) {
73
67
  // TODO: Trigger notification for unauthorized.
@@ -83,4 +77,4 @@ export class AuthorizationInterceptor {
83
77
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AuthorizationInterceptor, decorators: [{
84
78
  type: Injectable
85
79
  }], ctorParameters: () => [{ type: i0.Injector }] });
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2F1dGhlbnRpY2F0aW9uL3NyYy9hdXRob3JpemF0aW9uLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUc5RCxPQUFPLEVBQWEsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQzs7QUFHL0QsTUFBTSxPQUFPLHdCQUF3QjtJQUVuQyxZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO0lBQUcsQ0FBQztJQUUxQyxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUNoRCxJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxJQUFJLFdBQVcsR0FBMEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUVsRixtRkFBbUY7UUFDbkYsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLFdBQVcsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO1lBQzVDLDRIQUE0SDtZQUM1SCxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBRUQsSUFBSSxPQUFPLEdBQWdCLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkQsSUFBSSxHQUFHLEdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUMxQixJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FB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eEIsd0JBQXdCOzsyRkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3RvciwgaXNEZXZNb2RlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0h0dHBSZXF1ZXN0LCBIdHRwSGFuZGxlciwgSHR0cEV2ZW50LCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwRXJyb3JSZXNwb25zZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcblxyXG5pbXBvcnQge09ic2VydmFibGUsIHRocm93RXJyb3J9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Y2F0Y2hFcnJvcn0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG5pbXBvcnQge0F1dGhlbnRpY2F0aW9uU2VydmljZX0gZnJvbSBcIi4vYXV0aGVudGljYXRpb24uc2VydmljZVwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XHJcblxyXG4gIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdXRob3JpemF0aW9uSW50ZXJjZXB0b3IuaW50ZXJjZXB0XCIpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBsZXQgYXV0aFNlcnZpY2U6IEF1dGhlbnRpY2F0aW9uU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZSk7XHJcbiAgICBcclxuICAgIC8vRG9uJ3Qgd2FudCB0byBpbmNsdWRlIGJhY2tncm91bmQgdG9rZW4gcmVmcmVzaGVzIGluIGNvbnNpZGVyaW5nIHRoZSB1c2VyICdhY3RpdmUnXHJcbiAgICBpZiAocmVxLnVybCAhPT0gYXV0aFNlcnZpY2UudG9rZW5Mb2NhdGlvbigpKSB7XHJcbiAgICAgIC8vVXBkYXRlIHVzZXIgYWN0aXZpdHkuIERvbmUgaGVyZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBtZXRob2QgdXNpbmcgYSBzdWJzY3JpcHRpb24gdG8gYSBzdWJqZWN0IGluIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXJcclxuICAgICAgYXV0aFNlcnZpY2UudXBkYXRlVXNlckFjdGl2aXR5KCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGxldCBoZWFkZXJzOiBIdHRwSGVhZGVycyA9IGF1dGhTZXJ2aWNlLmdldEhlYWRlcnMocmVxKTtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHJlcS51cmw7XHJcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgIHVybCA9IGF1dGhTZXJ2aWNlLmdldEJhc2VVcmwoKSArIHVybDtcclxuICAgIH0gZWxzZSBpZiAoIXVybC5zdGFydHNXaXRoKFwiaHR0cFwiKSkge1xyXG4gICAgICBpZiAoYXV0aFNlcnZpY2UuZ2V0Q29udGV4dFJvb3QoKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdXJsID0gYXV0aFNlcnZpY2UuZ2V0QmFzZVVybCgpICsgXCIvXCIgKyBhdXRoU2VydmljZS5nZXRDb250ZXh0Um9vdCgpICsgXCIvXCIgKyB1cmw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXJsID0gYXV0aFNlcnZpY2UuZ2V0QmFzZVVybCgpICsgXCIvXCIgKyB1cmw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcGFyYW1zOiBIdHRwUGFyYW1zID0gcmVxLnBhcmFtcztcclxuICAgIGlmICh1cmwuaW5kZXhPZihcIi9jcnVkL1wiKSA+IDApIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChcIm1heFZpZXdQZXJtaXNzaW9uXCIsIGF1dGhTZXJ2aWNlLmdldE1heFZpZXdQZXJtaXNzaW9uKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXFDbG9uZSA9IHJlcS5jbG9uZSh7XHJcbiAgICAgIHVybDogdXJsLFxyXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXHJcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgIHBhcmFtczogcGFyYW1zXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxQ2xvbmUpXHJcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkF1dGhvcml6YXRpb25JbnRlcmNlcHRvci5lcnJvclwiKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igc3RhdHVzOiBcIiArIGVycm9yLnN0YXR1cyk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG1lc3NhZ2U6IFwiICtlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgZXJyb3I6IFwiICtlcnJvci5lcnJvcik7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIFVSTDogXCIgK2Vycm9yLnVybCk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5oZWFkZXJzKTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIHRva2VuIGlzIG5vdCBhdXRoZW50aWNhdGVkIHdoaWNoIGFuZ3VsYXIgZG9lcyBub3Qga25vdyBhYm91dCwgdGhlbiBhIFJFU1QgcmVxdWVzdCB0byB0aGUgYmFja2VuZCB3aWxsXHJcbiAgICAgICAgICogcmV0dXJuIGEgNDAxLiAgVG8gZHVwbGljYXRlIHRoaXMsIG9wZW4gQ29yZSBpbiB0d28gdGFicy4gIEluIG9uZSB0YWIsIGxvZ291dCwgaW4gdGhlIG90aGVyLCBwZXJmb3JtIGEgcmVxdWVzdFxyXG4gICAgICAgICAqIHRoYXQgaGl0cyBhIHByb3RlY3RlZCByZXNvdXJjZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgIGF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpLnN1YnNjcmliZSgoYXV0aGVudGljYXRlZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZCkge1xyXG4gICAgICAgICAgICAgIC8vIElmIGF1dGhlbnRpY2F0ZWQsIHRoZW4gbG9nb3V0IHdoaWNoIHdpbGwgcmVkaXJlY3QuXHJcbiAgICAgICAgICAgICAgYXV0aFNlcnZpY2UubG9nb3V0KHRydWUpO1xyXG4gICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIHVzZXIgZmlyc3Qgb3BlbnMgQ29yZSwgNDAxcyBhcmUgZXhwZWN0ZWQuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDMpIHtcclxuICAgICAgICAgIC8vIFRPRE86IFRyaWdnZXIgbm90aWZpY2F0aW9uIGZvciB1bmF1dGhvcml6ZWQuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpIGFzIE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+O1xyXG4gIH1cclxufVxyXG4iXX0=
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2F1dGhlbnRpY2F0aW9uL3NyYy9hdXRob3JpemF0aW9uLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUc5RCxPQUFPLEVBQWEsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxVQUFVLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0MsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7O0FBRy9ELE1BQU0sT0FBTyx3QkFBd0I7SUFFbkMsWUFBb0IsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUFHLENBQUM7SUFFMUMsU0FBUyxDQUFDLEdBQXFCLEVBQUUsSUFBaUI7UUFDaEQsSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQTBCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFbEYsbUZBQW1GO1FBQ25GLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUM1Qyw0SEFBNEg7WUFDNUgsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUVELElBQUksT0FBTyxHQUFnQixXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELElBQUksR0FBRyxHQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDMUIsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsR0FBRyxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDdkMsQ0FBQzthQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkMsSUFBSSxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxHQUFHLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsY0FBYyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUNsRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRyxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxNQUFNLEdBQWUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBRUQsSUFBSSxRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUN2QixHQUFHLEVBQUUsR0FBRztZQUNSLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQzthQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBd0IsRUFBRSxFQUFFO1lBQzVDLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFFRDs7OztlQUlHO1lBQ0gsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDbEMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtvQkFDdkQsSUFBSSxhQUFhLEVBQUUsQ0FBQzt3QkFDbEIsNkVBQTZFO3dCQUM3RSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN6QixPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ25DLENBQUM7eUJBQU0sQ0FBQzt3QkFDTiwwSkFBMEo7d0JBQzFKLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMzQixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDO2lCQUNJLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3ZDLCtDQUErQztZQUNqRCxDQUFDO2lCQUNJLENBQUM7Z0JBQ0osT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUErQixDQUFDO0lBQ3RDLENBQUM7OEdBdkVVLHdCQUF3QjtrSEFBeEIsd0JBQXdCOzsyRkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3RvciwgaXNEZXZNb2RlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0h0dHBSZXF1ZXN0LCBIdHRwSGFuZGxlciwgSHR0cEV2ZW50LCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwRXJyb3JSZXNwb25zZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcblxyXG5pbXBvcnQge09ic2VydmFibGUsIHRocm93RXJyb3J9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Y2F0Y2hFcnJvciwgbWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbmltcG9ydCB7QXV0aGVudGljYXRpb25TZXJ2aWNlfSBmcm9tIFwiLi9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBdXRob3JpemF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge31cclxuXHJcbiAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF1dGhvcml6YXRpb25JbnRlcmNlcHRvci5pbnRlcmNlcHRcIik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGxldCBhdXRoU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlKTtcclxuICAgIFxyXG4gICAgLy9Eb24ndCB3YW50IHRvIGluY2x1ZGUgYmFja2dyb3VuZCB0b2tlbiByZWZyZXNoZXMgaW4gY29uc2lkZXJpbmcgdGhlIHVzZXIgJ2FjdGl2ZSdcclxuICAgIGlmIChyZXEudXJsICE9PSBhdXRoU2VydmljZS50b2tlbkxvY2F0aW9uKCkpIHtcclxuICAgICAgLy9VcGRhdGUgdXNlciBhY3Rpdml0eS4gRG9uZSBoZXJlIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIG1ldGhvZCB1c2luZyBhIHN1YnNjcmlwdGlvbiB0byBhIHN1YmplY3QgaW4gQXV0aGVudGljYXRpb25Qcm92aWRlclxyXG4gICAgICBhdXRoU2VydmljZS51cGRhdGVVc2VyQWN0aXZpdHkoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgbGV0IGhlYWRlcnM6IEh0dHBIZWFkZXJzID0gYXV0aFNlcnZpY2UuZ2V0SGVhZGVycyhyZXEpO1xyXG4gICAgbGV0IHVybDogc3RyaW5nID0gcmVxLnVybDtcclxuICAgIGlmICh1cmwuc3RhcnRzV2l0aChcIi9cIikpIHtcclxuICAgICAgdXJsID0gYXV0aFNlcnZpY2UuZ2V0QmFzZVVybCgpICsgdXJsO1xyXG4gICAgfSBlbHNlIGlmICghdXJsLnN0YXJ0c1dpdGgoXCJodHRwXCIpKSB7XHJcbiAgICAgIGlmIChhdXRoU2VydmljZS5nZXRDb250ZXh0Um9vdCgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1cmwgPSBhdXRoU2VydmljZS5nZXRCYXNlVXJsKCkgKyBcIi9cIiArIGF1dGhTZXJ2aWNlLmdldENvbnRleHRSb290KCkgKyBcIi9cIiArIHVybDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1cmwgPSBhdXRoU2VydmljZS5nZXRCYXNlVXJsKCkgKyBcIi9cIiArIHVybDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSByZXEucGFyYW1zO1xyXG4gICAgaWYgKHVybC5pbmRleE9mKFwiL2NydWQvXCIpID4gMCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KFwibWF4Vmlld1Blcm1pc3Npb25cIiwgYXV0aFNlcnZpY2UuZ2V0TWF4Vmlld1Blcm1pc3Npb24oKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlcUNsb25lID0gcmVxLmNsb25lKHtcclxuICAgICAgdXJsOiB1cmwsXHJcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcclxuICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgcGFyYW1zOiBwYXJhbXNcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXFDbG9uZSlcclxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiQXV0aG9yaXphdGlvbkludGVyY2VwdG9yLmVycm9yXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIHRva2VuIGlzIG5vdCBhdXRoZW50aWNhdGVkIHdoaWNoIGFuZ3VsYXIgZG9lcyBub3Qga25vdyBhYm91dCwgdGhlbiBhIFJFU1QgcmVxdWVzdCB0byB0aGUgYmFja2VuZCB3aWxsXHJcbiAgICAgICAgICogcmV0dXJuIGEgNDAxLiAgVG8gZHVwbGljYXRlIHRoaXMsIG9wZW4gQ29yZSBpbiB0d28gdGFicy4gIEluIG9uZSB0YWIsIGxvZ291dCwgaW4gdGhlIG90aGVyLCBwZXJmb3JtIGEgcmVxdWVzdFxyXG4gICAgICAgICAqIHRoYXQgaGl0cyBhIHByb3RlY3RlZCByZXNvdXJjZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgIGF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpLnBpcGUobWFwKChhdXRoZW50aWNhdGVkKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FzIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCwgdGhlbiBsb2dvdXQgd2hpY2ggd2lsbCByZWRpcmVjdC5cclxuICAgICAgICAgICAgICBhdXRoU2VydmljZS5sb2dvdXQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy9UaGlzIGhhcHBlbnMgZm9yIGxlZ2l0aW1hdGUgcmVhc29ucy4gQXR0ZW1wdGluZyB0byBnZXQgdGhlIEpXVCB3aGVuIG5vdCBhdXRoZW50aWNhdGVkIHJldHVybnMgdGhlIGxvZ2luIGZvcm0sIGZvciBleGFtcGxlLCB3aGljaCBORyB3aWxsIHNlZSBhcyBhbiBlcnJvclxyXG4gICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwMykge1xyXG4gICAgICAgICAgLy8gVE9ETzogVHJpZ2dlciBub3RpZmljYXRpb24gZm9yIHVuYXV0aG9yaXplZC5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSkgYXMgT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj47XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -14,7 +14,7 @@ export const RouteGuardService = (route, state) => {
14
14
  }
15
15
  else {
16
16
  if (isDevMode()) {
17
- console.error("Route Guard: Not Authenticated");
17
+ console.debug("Route Guard: Not Authenticated");
18
18
  }
19
19
  // Store the attempted URL for redirecting
20
20
  authenticationService.redirectUrl = state.url;
@@ -23,4 +23,4 @@ export const RouteGuardService = (route, state) => {
23
23
  }
24
24
  }));
25
25
  };
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtZ3VhcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2F1dGhlbnRpY2F0aW9uL3NyYy9yb3V0ZS1ndWFyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFDLE1BQU0sRUFBOEMsTUFBTSxpQkFBaUIsQ0FBQztBQUdwRixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHL0QsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUE2QixFQUFFLEtBQTBCLEVBQUUsRUFBRTtJQUM3RixNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5QixPQUFPLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtRQUN4RSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBRUQsMENBQTBDO1lBQzFDLHFCQUFxQixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBRTlDLDRCQUE0QjtZQUM1QixxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSHVudHNtYW4gQ2FuY2VyIEluc3RpdHV0ZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLCBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5XHJcbiAqL1xyXG5pbXBvcnQge2luamVjdCwgaXNEZXZNb2RlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1JvdXRlciwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUm91dGVyU3RhdGVTbmFwc2hvdH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge21hcH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG5pbXBvcnQge0F1dGhlbnRpY2F0aW9uU2VydmljZX0gZnJvbSBcIi4vYXV0aGVudGljYXRpb24uc2VydmljZVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBSb3V0ZUd1YXJkU2VydmljZSA9IChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpID0+IHtcclxuICBjb25zdCBhdXRoZW50aWNhdGlvblNlcnZpY2UgPSBpbmplY3QoQXV0aGVudGljYXRpb25TZXJ2aWNlKTtcclxuICBjb25zdCByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuXHJcbiAgcmV0dXJuIGF1dGhlbnRpY2F0aW9uU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKS5waXBlKG1hcCgoYXV0aGVudGljYXRlZCkgPT4ge1xyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlJvdXRlIEd1YXJkOiBOb3QgQXV0aGVudGljYXRlZFwiKTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gU3RvcmUgdGhlIGF0dGVtcHRlZCBVUkwgZm9yIHJlZGlyZWN0aW5nXHJcbiAgICAgIGF1dGhlbnRpY2F0aW9uU2VydmljZS5yZWRpcmVjdFVybCA9IHN0YXRlLnVybDtcclxuICAgICAgXHJcbiAgICAgIC8vVHJ5IHRvIGdldCBhbiBhY2Nlc3MgdG9rZW5cclxuICAgICAgYXV0aGVudGljYXRpb25TZXJ2aWNlLnJlcXVlc3RBY2Nlc3NUb2tlbih0cnVlLCB0cnVlKTtcclxuICAgIH1cclxuICB9KSk7XHJcbn07XHJcblxyXG5cclxuIl19
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtZ3VhcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2F1dGhlbnRpY2F0aW9uL3NyYy9yb3V0ZS1ndWFyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFDLE1BQU0sRUFBOEMsTUFBTSxpQkFBaUIsQ0FBQztBQUdwRixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHL0QsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUE2QixFQUFFLEtBQTBCLEVBQUUsRUFBRTtJQUM3RixNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5QixPQUFPLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtRQUN4RSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBRUQsMENBQTBDO1lBQzFDLHFCQUFxQixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBRTlDLDRCQUE0QjtZQUM1QixxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSHVudHNtYW4gQ2FuY2VyIEluc3RpdHV0ZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLCBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5XHJcbiAqL1xyXG5pbXBvcnQge2luamVjdCwgaXNEZXZNb2RlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1JvdXRlciwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUm91dGVyU3RhdGVTbmFwc2hvdH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge21hcH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG5pbXBvcnQge0F1dGhlbnRpY2F0aW9uU2VydmljZX0gZnJvbSBcIi4vYXV0aGVudGljYXRpb24uc2VydmljZVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBSb3V0ZUd1YXJkU2VydmljZSA9IChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpID0+IHtcclxuICBjb25zdCBhdXRoZW50aWNhdGlvblNlcnZpY2UgPSBpbmplY3QoQXV0aGVudGljYXRpb25TZXJ2aWNlKTtcclxuICBjb25zdCByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuXHJcbiAgcmV0dXJuIGF1dGhlbnRpY2F0aW9uU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKS5waXBlKG1hcCgoYXV0aGVudGljYXRlZCkgPT4ge1xyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIlJvdXRlIEd1YXJkOiBOb3QgQXV0aGVudGljYXRlZFwiKTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gU3RvcmUgdGhlIGF0dGVtcHRlZCBVUkwgZm9yIHJlZGlyZWN0aW5nXHJcbiAgICAgIGF1dGhlbnRpY2F0aW9uU2VydmljZS5yZWRpcmVjdFVybCA9IHN0YXRlLnVybDtcclxuICAgICAgXHJcbiAgICAgIC8vVHJ5IHRvIGdldCBhbiBhY2Nlc3MgdG9rZW5cclxuICAgICAgYXV0aGVudGljYXRpb25TZXJ2aWNlLnJlcXVlc3RBY2Nlc3NUb2tlbih0cnVlLCB0cnVlKTtcclxuICAgIH1cclxuICB9KSk7XHJcbn07XHJcblxyXG5cclxuIl19
@@ -186,7 +186,7 @@ class AuthenticationService {
186
186
  }
187
187
  initiateLogin() {
188
188
  if (isDevMode()) {
189
- console.error("Authentication Service: Initiate Login");
189
+ console.debug("Authentication Service: Initiate Login: " + (this.tokenLocation) ? "Redirect" : "Login Component");
190
190
  }
191
191
  //Redirect based authentication
192
192
  if (this._loginPath) {
@@ -200,7 +200,7 @@ class AuthenticationService {
200
200
  }
201
201
  requestAccessToken(fromRouteGuard, redirectOnSuccess) {
202
202
  if (isDevMode()) {
203
- console.error("Authentication Service: Request Acces Token");
203
+ console.debug("Authentication Service: Request Acces Token");
204
204
  }
205
205
  this._http.get(this.tokenLocation(), { withCredentials: true, responseType: "json" })
206
206
  .subscribe((response) => {
@@ -472,6 +472,9 @@ class AuthenticationComponent {
472
472
  this.authenticationRoute = authenticationRoute;
473
473
  }
474
474
  ngOnInit() {
475
+ if (isDevMode()) {
476
+ console.debug("Authentication Component: Init");
477
+ }
475
478
  /*
476
479
  * Fix back bug
477
480
  * Issue is that the browser will go back to the previous route. If it's guarded, the route guard will just load the login again
@@ -529,6 +532,9 @@ class AuthenticationComponent {
529
532
  }
530
533
  beginAuthenticationProcess() {
531
534
  var tokenEndpoint = this.authenticationService.tokenLocation();
535
+ if (isDevMode()) {
536
+ console.debug("Authentication Component: Begin Authentication");
537
+ }
532
538
  if (tokenEndpoint !== "") {
533
539
  this.url = this.domSanitizer.bypassSecurityTrustResourceUrl(tokenEndpoint);
534
540
  }
@@ -847,13 +853,7 @@ class AuthorizationInterceptor {
847
853
  return next.handle(reqClone)
848
854
  .pipe(catchError((error) => {
849
855
  if (isDevMode()) {
850
- console.error("AuthorizationInterceptor.error");
851
- console.log("Error status: " + error.status);
852
- console.log("Error message: " + error.message);
853
- console.log("Error error: " + error.error);
854
- console.log("Error URL: " + error.url);
855
- console.log(error.headers);
856
- console.error(error);
856
+ console.debug("AuthorizationInterceptor.error");
857
857
  }
858
858
  /**
859
859
  * If the token is not authenticated which angular does not know about, then a REST request to the backend will
@@ -861,17 +861,17 @@ class AuthorizationInterceptor {
861
861
  * that hits a protected resource.
862
862
  */
863
863
  if (error && error.status === 401) {
864
- authService.isAuthenticated().subscribe((authenticated) => {
864
+ authService.isAuthenticated().pipe(map((authenticated) => {
865
865
  if (authenticated) {
866
- // If authenticated, then logout which will redirect.
866
+ // If the user was previously authenticated, then logout which will redirect.
867
867
  authService.logout(true);
868
868
  return throwError(error.message);
869
869
  }
870
870
  else {
871
- // Otherwise, for example, when the user first opens Core, 401s are expected.
871
+ //This happens for legitimate reasons. Attempting to get the JWT when not authenticated returns the login form, for example, which NG will see as an error
872
872
  return throwError(error);
873
873
  }
874
- });
874
+ }));
875
875
  }
876
876
  else if (error && error.status === 403) {
877
877
  // TODO: Trigger notification for unauthorized.
@@ -988,7 +988,7 @@ const RouteGuardService = (route, state) => {
988
988
  }
989
989
  else {
990
990
  if (isDevMode()) {
991
- console.error("Route Guard: Not Authenticated");
991
+ console.debug("Route Guard: Not Authenticated");
992
992
  }
993
993
  // Store the attempted URL for redirecting
994
994
  authenticationService.redirectUrl = state.url;
@@ -1 +1 @@
1
- {"version":3,"file":"huntsman-cancer-institute-authentication.mjs","sources":["../../../projects/authentication/src/authentication.provider.ts","../../../projects/authentication/src/authentication.service.ts","../../../projects/authentication/src/authentication.component.ts","../../../projects/authentication/src/directlogin.component.ts","../../../projects/authentication/src/timeout-notification.component.ts","../../../projects/authentication/src/authorization.interceptor.ts","../../../projects/authentication/src/authentication.module.ts","../../../projects/authentication/src/route-guard.service.ts","../../../projects/authentication/src/huntsman-cancer-institute-authentication.ts"],"sourcesContent":["import {Inject, Injectable, InjectionToken, Injector} from \"@angular/core\";\r\n\r\nimport {Subject} from \"rxjs\";\r\n\r\nimport {CoolLocalStorage} from '@angular-cool/storage';\r\n\r\nexport let AUTHENTICATION_TOKEN_KEY = new InjectionToken<string>(\"authentication_token_key\");\r\n\r\n@Injectable()\r\nexport class AuthenticationProvider {\r\n\r\n public whitelistedDomains = [\r\n \"localhost\",\r\n new RegExp(\".*[.]utah[.]edu\")\r\n ];\r\n\r\n constructor(private _localStorageService: CoolLocalStorage,\r\n @Inject(AUTHENTICATION_TOKEN_KEY) private _authenticationTokenKey: string) {}\r\n\r\n public tokenGetter = () => {\r\n return this.authToken;\r\n }\r\n\r\n get authenticationTokenKey(): string {\r\n return this._authenticationTokenKey;\r\n }\r\n\r\n set authenticationTokenKey(_authenticationTokenKey: string) {\r\n this._authenticationTokenKey = _authenticationTokenKey;\r\n }\r\n\r\n get authToken(): string {\r\n return <string>this._localStorageService.getItem(this._authenticationTokenKey);\r\n }\r\n\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Injectable, InjectionToken, Inject, Optional, isDevMode} from \"@angular/core\";\r\nimport {Location, LocationStrategy} from \"@angular/common\";\r\nimport {Router} from \"@angular/router\";\r\nimport {HttpClient, HttpHeaders, HttpRequest, HttpResponse} from \"@angular/common/http\";\r\n\r\nimport {interval, Observable, BehaviorSubject, Subscription, throwError, of} from \"rxjs\";\r\nimport {catchError, first, map} from \"rxjs/operators\";\r\nimport {JwtHelperService} from \"@auth0/angular-jwt\";\r\n\r\nimport {AuthenticationProvider} from \"./authentication.provider\";\r\nimport { CoolLocalStorage } from \"@angular-cool/storage\";\r\n\r\n/**\r\n * The token used for injection of the server side endpoint for the currently authenticated subject.\r\n *\r\n * @type {InjectionToken}\r\n */\r\nexport let AUTHENTICATION_SERVER_URL = new InjectionToken<string>(\"authentication_server_rest_api\");\r\nexport let AUTHENTICATION_LOGIN_PATH = new InjectionToken<string>(\"authentication_login_path\");\r\nexport let AUTHENTICATION_LOGOUT_PATH = new InjectionToken<string>(\"authentication_logout_path\");\r\nexport let AUTHENTICATION_DIRECT_ENDPOINT = new InjectionToken<string>(\"authentication_direct_endpoint\");\r\nexport let AUTHENTICATION_TOKEN_ENDPOINT = new InjectionToken<string>(\"authentication_token_endpoint\");\r\nexport let AUTHENTICATION_ROUTE = new InjectionToken<string>(\"authentication_route\");\r\nexport let AUTHENTICATION_MAX_INACTIVITY_MINUTES = new InjectionToken<number>(\"authentication_max_inactivity\");\r\nexport let AUTHENTICATION_USER_COUNTDOWN_SECONDS = new InjectionToken<number>(\"authentication_user_countdown_seconds\");\r\nexport let AUTHENTICATION_IDP_INACTIVITY_MINUTES = new InjectionToken<number>(\"authentication_idp_inactivity_minutes\");\r\n\r\n/**\r\n * @since 1.0.0\r\n */\r\n@Injectable()\r\nexport class AuthenticationService {\r\n\r\n /**\r\n * The generic error message used when a server error is thrown without a status.\r\n *\r\n * @type {string}\r\n */\r\n public static GENERIC_ERR_MSG: string = \"Server error\";\r\n\r\n private static CONTENT_TYPE: string = \"Content-Type\";\r\n private static SEC_GOV_CLASS_HEADER: string = \"SecurityGovernorClass\";\r\n private static SEC_GOV_ID_HEADER: string = \"SecurityGovernorId\";\r\n private static DEIDENT_HEADER: string = \"DeidentifiedContext\";\r\n private static LIMITED_HEADER: string = \"LimitedContext\";\r\n\r\n public userCountdownSeconds: number = 60;\r\n public idpInactivityMinutes: number = 5;\r\n\r\n public contentType: string = \"application/json\";\r\n public securityGovernorClass: string;\r\n public securityGovernorId: number;\r\n public limitedContext: boolean = false;\r\n public deidentifiedContext: boolean = false;\r\n\r\n private maxViewPermission: BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\"> = new BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\">(\"viewident\");\r\n private _isAuthenticatedSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n private _userIsAboutToTimeOut: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n private _redirectUrl: string;\r\n private _refreshSubscription: Subscription;\r\n private _lastUserInteraction: Date;\r\n private _maxInactivityMinutes: number = 120;\r\n\r\n private baseUrl: string;\r\n private contextRoot: string = \"\";\r\n\r\n constructor(private _http: HttpClient,\r\n private _router: Router,\r\n private _localStorageService: CoolLocalStorage,\r\n private _jwtHelper: JwtHelperService,\r\n private location: Location,\r\n private authenticationProvider: AuthenticationProvider,\r\n @Inject(AUTHENTICATION_LOGOUT_PATH) private _logoutPath: string,\r\n @Inject(AUTHENTICATION_TOKEN_ENDPOINT) private _tokenEndpoint: string,\r\n @Optional() @Inject(AUTHENTICATION_LOGIN_PATH) private _loginPath: string,\r\n @Optional() @Inject(AUTHENTICATION_ROUTE) private _authenticationRoute: string,\r\n @Optional() @Inject(AUTHENTICATION_SERVER_URL) private _serverUrl: string,\r\n @Optional() @Inject(AUTHENTICATION_DIRECT_ENDPOINT) private _directEndpoint: string,\r\n @Optional() @Inject(AUTHENTICATION_MAX_INACTIVITY_MINUTES) private _maxInactivity: number,\r\n @Optional() @Inject(AUTHENTICATION_USER_COUNTDOWN_SECONDS) private _userCountdownSeconds: number,\r\n @Optional() @Inject(AUTHENTICATION_IDP_INACTIVITY_MINUTES) private _idpInactivityMinutes: number,\r\n @Optional() @Inject(LocationStrategy) private locationStrategy: LocationStrategy) {\r\n if (isDevMode()) {\r\n console.debug(\"window.location.href: \" + window.location.href);\r\n }\r\n\r\n if (window.location) {\r\n let parts: string[] = window.location.href.split(\"/\");\r\n this.baseUrl = parts[0] + \"//\" + parts[2];\r\n if (parts.length > 3) {\r\n this.contextRoot = parts[3];\r\n }\r\n }\r\n\r\n if (this._localStorageService.getItem(\"maxViewPermission\")) {\r\n this.maxViewPermission.next(<\"view\" | \"viewident\" | \"viewlimited\">this._localStorageService.getItem(\"maxViewPermission\"));\r\n }\r\n\r\n if (_maxInactivity) {\r\n this._maxInactivityMinutes = _maxInactivity;\r\n }\r\n\r\n if (_userCountdownSeconds) {\r\n this.userCountdownSeconds = _userCountdownSeconds;\r\n }\r\n\r\n if (_idpInactivityMinutes) {\r\n this.idpInactivityMinutes = _idpInactivityMinutes;\r\n }\r\n\r\n this.hasValidConfig();\r\n }\r\n\r\n getBaseUrl(): string {\r\n return (this.baseUrl) ? this.baseUrl : \"\";\r\n }\r\n\r\n getContextRoot(): string {\r\n return this.contextRoot;\r\n }\r\n\r\n getHeaders(req: HttpRequest<any>): HttpHeaders {\r\n let headers: HttpHeaders = req.headers;\r\n\r\n //Don't set content type if already set\r\n if (!req.headers.get(AuthenticationService.CONTENT_TYPE)) {\r\n headers = headers.set(AuthenticationService.CONTENT_TYPE, this.contentType.toString());\r\n }\r\n\r\n if (headers.get(AuthenticationService.SEC_GOV_CLASS_HEADER) === \"\") {\r\n headers = headers.delete(AuthenticationService.SEC_GOV_CLASS_HEADER);\r\n } else if (this.securityGovernorClass && !headers.get(AuthenticationService.SEC_GOV_CLASS_HEADER)) {\r\n headers = headers.set(AuthenticationService.SEC_GOV_CLASS_HEADER, this.securityGovernorClass);\r\n }\r\n\r\n if (headers.get(AuthenticationService.SEC_GOV_ID_HEADER) === \"\") {\r\n headers = headers.delete(AuthenticationService.SEC_GOV_ID_HEADER);\r\n } else if (this.securityGovernorId && !headers.get(AuthenticationService.SEC_GOV_ID_HEADER)) {\r\n headers = headers.set(AuthenticationService.SEC_GOV_ID_HEADER, this.securityGovernorId.toString());\r\n }\r\n\r\n headers = headers.set(AuthenticationService.DEIDENT_HEADER, this.deidentifiedContext.toString());\r\n headers = headers.set(AuthenticationService.LIMITED_HEADER, this.limitedContext.toString());\r\n\r\n return headers;\r\n }\r\n\r\n get authenticationTokenKey(): string {\r\n return this.authenticationProvider.authenticationTokenKey;\r\n }\r\n\r\n get authToken(): string {\r\n return this.authenticationProvider.authToken;\r\n }\r\n\r\n public updateUserActivity(): void {\r\n if (this._isAuthenticatedSubject.value) {\r\n this._lastUserInteraction = new Date();\r\n this._userIsAboutToTimeOut.next(false);\r\n }\r\n }\r\n\r\n /**\r\n * A mutator for identifying the clients original request location. Setting this value will influence the end location\r\n * navigated to by {@link #navigateToPath}.\r\n *\r\n * @param redirectUrl location of the users request before authentication\r\n */\r\n set redirectUrl(redirectUrl: string) {\r\n this._redirectUrl = redirectUrl;\r\n }\r\n\r\n get redirectUrl() {\r\n return this._redirectUrl;\r\n }\r\n \r\n \r\n initiateLogin() {\r\n if (isDevMode()) {\r\n console.error(\"Authentication Service: Initiate Login\");\r\n }\r\n \r\n //Redirect based authentication\r\n if (this._loginPath) {\r\n window.location.href = this.getBaseUrl() + (this._loginPath.startsWith(\"/\")?\"\":\"/\") + this._loginPath;\r\n }\r\n //Authentication component (<IFrame> implementation)\r\n else {\r\n // Navigate to the login page\r\n return this._router.createUrlTree([this._authenticationRoute]);\r\n }\r\n }\r\n\r\n requestAccessToken(fromRouteGuard: boolean, redirectOnSuccess: boolean): void {\r\n \r\n if (isDevMode()) {\r\n console.error(\"Authentication Service: Request Acces Token\");\r\n }\r\n\r\n this._http.get(this.tokenLocation(), {withCredentials: true, responseType: \"json\"})\r\n .subscribe(\r\n (response: any) => {\r\n this.storeToken(response.auth_token);\r\n if (redirectOnSuccess) {\r\n this.proceedIfAuthenticated();\r\n }\r\n },\r\n (error) => {\r\n //Not logged in - start authentication\r\n if (fromRouteGuard) {\r\n this.initiateLogin();\r\n }\r\n //Background token request failed - logout and clear\r\n else {\r\n if (isDevMode()) {\r\n console.error(\"Authentication Service: Request Acces Token - Logout\");\r\n }\r\n \r\n this.logout(true);\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Verifies whether or not a current user session exists.\r\n *\r\n * @returns {Observable<boolean>} evaluates to true if the user is authenticated, false otherwise.\r\n */\r\n isAuthenticated(): Observable<boolean> {\r\n return this._isAuthenticatedSubject.asObservable();\r\n }\r\n\r\n isAboutToTimeOut(): Observable<boolean> {\r\n return this._userIsAboutToTimeOut.asObservable();\r\n }\r\n\r\n getTimeoutStart(): number {\r\n if (this._lastUserInteraction) {\r\n return this._lastUserInteraction.valueOf() + (((this._maxInactivityMinutes * 60) - this.userCountdownSeconds) * 1000);\r\n }\r\n }\r\n\r\n tokenLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._tokenEndpoint;\r\n } else {\r\n return this._tokenEndpoint;\r\n }\r\n }\r\n\r\n directLoginLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._directEndpoint;\r\n } else {\r\n return this._directEndpoint;\r\n }\r\n }\r\n\r\n logoutLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._logoutPath;\r\n } else {\r\n return this._logoutPath;\r\n }\r\n }\r\n\r\n /**\r\n * A function to authenticated the user with the provided credentials. Failure results in an error that describes the\r\n * server response (status and status message) and should be actionable by the client application.\r\n *\r\n * @param username of the authenticating user to verify\r\n * @param password of the authenticating user to verify\r\n * @returns {Observable<R>} describing the result of the login action, true or an error\r\n */\r\n login(_username: string, _password: string): Observable<boolean> {\r\n return this._http.post(\r\n this.directLoginLocation(),\r\n {username: _username, password: _password},\r\n {observe: \"response\"}\r\n ).pipe(map((resp: HttpResponse<any>) => {\r\n if (resp.status === 201) {\r\n return true;\r\n } else {\r\n throw new Error(\"Authentication failed. \" + resp.status + \": \" + resp.statusText);\r\n }\r\n }),\r\n catchError(this.handleError)) as Observable<boolean>;\r\n }\r\n\r\n\r\n clearLogin(): Observable<string> {\r\n //Front-end logout\r\n try {\r\n this._localStorageService.removeItem(this.authenticationProvider.authenticationTokenKey);\r\n this.unsubscribeFromTokenRefresh();\r\n this._isAuthenticatedSubject.next(false);\r\n this._userIsAboutToTimeOut.next(false);\r\n } catch (Error) {\r\n }\r\n\r\n //Back-end logout\r\n let headers = new HttpHeaders().set(AuthenticationService.CONTENT_TYPE, \"text/plain\");\r\n return <Observable<string>>this._http.get(this.logoutLocation(), {headers: headers, responseType: \"text\"});\r\n }\r\n\r\n /**\r\n * A function to signal the termination of the current session. Invoking this function will clean up any relevant state\r\n * related to the last active session.\r\n */\r\n logout(keepCurrentRoute: boolean = false): void {\r\n //Prevent logout if already on authentication route. Doing otherwise screws up SAML\r\n if (! this._router.routerState || this._router.routerState.snapshot.url !== this._authenticationRoute) {\r\n this._redirectUrl = (keepCurrentRoute && this._router.routerState && this._router.routerState.snapshot) ? this._router.routerState.snapshot.url : \"\";\r\n\r\n if (this._redirectUrl.startsWith(\"/\")) {\r\n this._redirectUrl = this._redirectUrl.substring(1);\r\n }\r\n\r\n this.clearLogin().subscribe(\r\n (response) => {\r\n window.location.replace(this._redirectUrl);\r\n },\r\n (error) => {\r\n window.location.replace(this._redirectUrl);\r\n }\r\n );\r\n }\r\n }\r\n\r\n storeToken(token: string): void {\r\n let valid = this.validateToken(token);\r\n\r\n // unsubscribe from refesh before we decide wether to resubscribe\r\n this.unsubscribeFromTokenRefresh();\r\n\r\n if (valid) {\r\n this._localStorageService.setItem(this.authenticationProvider.authenticationTokenKey, token);\r\n this.subscribeToTokenRefresh(token);\r\n\r\n //Change the BehaviorSubject if the user was not previously authenticated.\r\n //Since other code may be subscribing to this observable, we don't want to cause new events to fire if just refreshing the JWT.\r\n if (! this._isAuthenticatedSubject.value) {\r\n this._isAuthenticatedSubject.next(true);\r\n }\r\n } else {\r\n this._localStorageService.removeItem(this.authenticationProvider.authenticationTokenKey);\r\n this._isAuthenticatedSubject.next(false);\r\n }\r\n }\r\n\r\n proceedIfAuthenticated(): boolean {\r\n if (isDevMode()) {\r\n console.debug(\"AuthenticationService.proceedIfAuthenticated: \" + this._redirectUrl);\r\n }\r\n\r\n if (this._isAuthenticatedSubject.value) {\r\n //Login counts as user activity, too\r\n this.updateUserActivity();\r\n\r\n if (this._redirectUrl && this._redirectUrl && this._redirectUrl !== \"\") {\r\n this._router.navigateByUrl(this._redirectUrl);\r\n } else {\r\n this._router.navigate([\"\"]);\r\n }\r\n\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n validateToken(token: string): boolean {\r\n return (token && !this._jwtHelper.isTokenExpired(token));\r\n }\r\n\r\n subscribeToTokenRefresh(token: any): void {\r\n let exp = this._jwtHelper.getTokenExpirationDate(token);\r\n\r\n // Use a timer to periodically check timeouts\r\n this._refreshSubscription = interval(1000)\r\n .subscribe(() => {\r\n\r\n // If a tab is inactive we can't know if our timer is accurate\r\n // so when the interval hits check against timestamps\r\n if (this._isAuthenticatedSubject.value && Date.now() > this.getTimeoutStart()) {\r\n //Don't update the subject more than once! Doing so initializes more than one countdown timer!\r\n if (this._userIsAboutToTimeOut.getValue() !== true) {\r\n this._userIsAboutToTimeOut.next(true);\r\n }\r\n }\r\n\r\n // check for refresh token\r\n let msToExpiry = (exp.valueOf() - new Date().valueOf());\r\n\r\n // Refresh 60 seconds before expiry\r\n if (msToExpiry <= 60000) {\r\n this.refreshTokenIfUserIsActive();\r\n }\r\n });\r\n }\r\n\r\n unsubscribeFromTokenRefresh(): void {\r\n if (this._refreshSubscription && ! this._refreshSubscription.closed) {\r\n this._refreshSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n getMaxViewPermission(): \"view\" | \"viewident\" | \"viewlimited\" {\r\n return this.maxViewPermission.getValue();\r\n }\r\n\r\n getMaxViewPermissionSubject(): BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\"> {\r\n return this.maxViewPermission;\r\n }\r\n\r\n setMaxViewPermission(maxViewPermission: \"view\" | \"viewident\" | \"viewlimited\"): void {\r\n this._localStorageService.setItem(\"maxViewPermission\", maxViewPermission);\r\n this.maxViewPermission.next(maxViewPermission);\r\n }\r\n\r\n private refreshTokenIfUserIsActive(): void {\r\n //Only refresh if the user has been active\r\n if (this._lastUserInteraction && ((new Date().valueOf() - this._lastUserInteraction.valueOf()) <= (this._maxInactivityMinutes * 60 * 1000))) {\r\n this.requestAccessToken(false, false);\r\n }\r\n }\r\n\r\n private hasValidConfig(): void {\r\n if (this._tokenEndpoint == null && (this._serverUrl === null || this._logoutPath === null)) {\r\n throw new Error(\"BUG ALERT! Invalid AuthenticationService configuration. No valid configuration for authentication endpoint(s).\");\r\n }\r\n if (this._localStorageService === null || this.authenticationProvider.authenticationTokenKey === null) {\r\n throw new Error(\"BUG ALERT! Invalid AuthenticationService configuration. No valid configuration for local storage\");\r\n }\r\n }\r\n\r\n private handleError(error: any) : Observable<never> {\r\n let errMsg = (error.message) ? error.message : AuthenticationService.GENERIC_ERR_MSG;\r\n return throwError(errMsg);\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component, ElementRef, ViewChild, Inject, Renderer2} from \"@angular/core\";\r\nimport {Location, PopStateEvent} from \"@angular/common\";\r\nimport {Router} from \"@angular/router\";\r\nimport {DomSanitizer} from \"@angular/platform-browser\";\r\n\r\nimport {interval, Subscription} from \"rxjs\";\r\nimport {first} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService, AUTHENTICATION_ROUTE} from \"./authentication.service\";\r\n\r\n@Component({\r\n selector: \"authentication-iframe\",\r\n template: `\r\n <div class=\"container\">\r\n <iframe #iframe class=\"frame\" [src]=\"url\" (load)=\"handleChanges()\"></iframe>\r\n <div *ngIf=\"_errorMsg\" class=\"alert-box\">\r\n <div class=\"alert alert-danger\">\r\n <h5 class=\"alert-heading\">Authentication Failed</h5>\r\n <span id=\"hci-login-error\" class=\"alert-text\">{{_errorMsg}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n \r\n :host {\r\n background-color: white;\r\n }\r\n \r\n .container {\r\n max-width: 100%;\r\n margin-top: 60px;\r\n padding-top: 15px;\r\n }\r\n\r\n .frame {\r\n width: 100%;\r\n height: 100%;\r\n border: 0px;\r\n }\r\n `],\r\n host: {class: \"outlet-row\"}\r\n})\r\nexport class AuthenticationComponent {\r\n\r\n public url;\r\n public _errorMsg: string;\r\n\r\n @ViewChild(\"iframe\", {static: true}) iframe : ElementRef;\r\n\r\n private resetSubscription: Subscription;\r\n private popstateSubscription: Subscription;\r\n\r\n constructor(private authenticationService: AuthenticationService,\r\n private domSanitizer : DomSanitizer,\r\n private router: Router,\r\n private location: Location,\r\n private renderer: Renderer2,\r\n @Inject(AUTHENTICATION_ROUTE) private authenticationRoute: string) {\r\n }\r\n\r\n ngOnInit() {\r\n /*\r\n * Fix back bug\r\n * Issue is that the browser will go back to the previous route. If it's guarded, the route guard will just load the login again\r\n * Eventually the browser gets to the /authenticate route and going back from there loads the iframe history and Shibboleth displays\r\n * an error relating to navigating back.\r\n */\r\n history.pushState(null, null, this.location.prepareExternalUrl(this.authenticationRoute));\r\n\r\n this.popstateSubscription = <Subscription> this.location.subscribe((value: PopStateEvent) => {\r\n //This is going to prevent back from working from the login component\r\n history.go(1);\r\n });\r\n\r\n this.beginAuthenticationProcess();\r\n }\r\n\r\n handleChanges(): void {\r\n if (!this.iframe.nativeElement.contentDocument) {\r\n return;\r\n }\r\n\r\n try {\r\n let element: HTMLElement = this.iframe.nativeElement.contentDocument.body;\r\n if (element.querySelector(\"pre\")) {\r\n element = element.querySelector(\"pre\");\r\n }\r\n\r\n this._errorMsg = null;\r\n var jsonText = element.innerText;\r\n\r\n var json = JSON.parse(jsonText);\r\n this.authenticationService.storeToken(json.auth_token);\r\n var authenticated = this.authenticationService.proceedIfAuthenticated();\r\n\r\n if (!authenticated) {\r\n this.resetSubscription.unsubscribe();\r\n this.beginAuthenticationProcess();\r\n }\r\n } catch (error) {\r\n if (this.iframe.nativeElement.contentDocument.title.toUpperCase() === \"ERROR\") {\r\n if (this.iframe.nativeElement.contentDocument.body.innerHTML.toUpperCase() === \"FORBIDDEN\") {\r\n this._errorMsg = \"You do not have permission to log into this application\";\r\n } else {\r\n this._errorMsg = null;\r\n }\r\n\r\n //A bit of a workaround for a WildFly issue. Success on Pac4j authentication, but failure on DB load of user put things in a weird state. Just logout, and redo the login.\r\n this.clearLoginAndRetry();\r\n }\r\n }\r\n\r\n // After the iframe loads, make the background transparent so we use the implementation's background and not the sso background.\r\n this.renderer.setStyle(this.iframe.nativeElement.contentDocument.body, \"background-color\", \"transparent\");\r\n }\r\n\r\n ngOnDestroy() {\r\n this.resetSubscription.unsubscribe();\r\n this.popstateSubscription.unsubscribe();\r\n }\r\n\r\n private clearLoginAndRetry(): void {\r\n this.resetSubscription.unsubscribe();\r\n this.authenticationService.clearLogin().subscribe(\r\n () => { this.beginAuthenticationProcess(); },\r\n (error) => { this.beginAuthenticationProcess(); }\r\n );\r\n }\r\n\r\n private beginAuthenticationProcess(): void {\r\n var tokenEndpoint = this.authenticationService.tokenLocation();\r\n\r\n if (tokenEndpoint !== \"\") {\r\n this.url = this.domSanitizer.bypassSecurityTrustResourceUrl(tokenEndpoint);\r\n }\r\n\r\n /**\r\n * If the user doesn't complete authentication before the IdP session times out, that will be a problem when they eventually\r\n * attampt to log in. It is likely that users will do this often when they log out or are timed out in the evening, leave\r\n * their browser open, then attempt to log back in in the morning. In order to work around this, this component will re-request\r\n * the token prior to IdP timeout, which will reset the process. This will happen 1 minute before idpInactivityMinutes\r\n **/\r\n this.resetSubscription = interval((this.authenticationService.idpInactivityMinutes - 1) * 60 * 1000)\r\n .pipe(first())\r\n .subscribe((value) => {\r\n this.beginAuthenticationProcess();\r\n });\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component, OnInit} from \"@angular/core\";\r\nimport {AuthenticationService} from \"./authentication.service\";\r\nimport {UntypedFormBuilder, UntypedFormGroup, Validators} from \"@angular/forms\";\r\n\r\n@Component({\r\n selector: \"hci-login-form\",\r\n template: `\r\n <div class=\"container\">\r\n <div class=\"login-box\" id=\"hci-login-form-box\">\r\n <div class=\"login-heading\" id=\"hci-login-form-heading\">\r\n <h3>Sign in</h3>\r\n </div>\r\n <div class=\"panel-body\">\r\n <form [formGroup]=\"_loginForm\" (ngSubmit)=\"login()\">\r\n <input formControlName=\"username\" class=\"form-control\" id=\"username\" name=\"username\" placeholder=\"Username\" type=\"text\">\r\n <input formControlName=\"password\" class=\"form-control\" id=\"password\" name=\"password\" type=\"password\" placeholder=\"Password\">\r\n \r\n <div *ngIf=\"_errorMsg\" class=\"alert-box\">\r\n <div class=\"alert alert-danger\">\r\n <h5 class=\"alert-heading\">Authentication Failed</h5>\r\n <span id=\"hci-login-error\" class=\"alert-text\">{{_errorMsg}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"btn-box\">\r\n <button class=\"btn btn-primary\" id=\"hci-login-form-submit-button\" type=\"submit\" [disabled]=\"!_loginForm.valid\">Login</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .container {\r\n max-width: 400px;\r\n margin-top: 20px;\r\n padding-top: 15px;\r\n }\r\n \r\n .login-box {\r\n border-radius: 10px;\r\n box-shadow: 0 0 2px #ccc;\r\n padding: 15px;\r\n }\r\n \r\n .login-box .login-heading h3 {\r\n line-height:1.5;\r\n margin: 0 0 10px\r\n }\r\n \r\n .login-box .form-control {\r\n padding: 10px;\r\n border: 1px solid #ccc;\r\n }\r\n \r\n .login-box input[type=\"password\"] {\r\n margin-bottom: 10px;\r\n border-top-left-radius: 0;\r\n border-top-right-radius: 0;\r\n }\r\n \r\n .login-box input[type=\"text\"] {\r\n margin-bottom: -1px;\r\n border-bottom-right-radius: 0;\r\n border-bottom-left-radius: 0;\r\n }\r\n \r\n .login-box .alert-box {\r\n margin: 10px 0 -5px 0\r\n }\r\n \r\n .login-box .alert-text {\r\n font-size: small;\r\n }\r\n \r\n .login-box .btn-box {\r\n margin: 10px 0 0px 0\r\n }\r\n `]\r\n})\r\nexport class DirectLoginComponent implements OnInit {\r\n public _loginForm: UntypedFormGroup;\r\n public _errorMsg: string;\r\n\r\n constructor(private _authenticationService: AuthenticationService, private _formBuilder: UntypedFormBuilder) {}\r\n\r\n /**\r\n * Initializes the authentication form.\r\n */\r\n ngOnInit(): void {\r\n this._loginForm = this._formBuilder.group({\r\n username: [\"\", Validators.required],\r\n password: [\"\", Validators.required]\r\n });\r\n }\r\n\r\n /**\r\n * A function to submit the login form the the {@link UserService}.\r\n */\r\n login() {\r\n this._authenticationService.login(this._loginForm.value.username, this._loginForm.value.password)\r\n .subscribe((res) => {\r\n if (res) {\r\n this._errorMsg = null;\r\n this._authenticationService.requestAccessToken(false, true);\r\n }\r\n }, (error: any) => {\r\n this._errorMsg = \"Please check your username and password.\";\r\n });\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component} from \"@angular/core\";\r\nimport {animate, state, style, transition, trigger} from \"@angular/animations\";\r\n\r\nimport {Observable, Subscription, timer} from \"rxjs\";\r\nimport {map, takeWhile} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\n\r\n@Component({\r\n selector: \"timeout-notification\",\r\n template: `\r\n <div class=\"flyout-max\" [@openBacksplash]=\"openState\">\r\n <div class=\"modal-dialog\" [@openModal]=\"openState\" role=\"document\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">Your Session Is About To Expire</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <p>For your security, your session is about to automatically time out in the next <b>{{seconds | async}}</b> seconds. Would you like to stay signed in?</p>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <ng-container>\r\n <button id=\"updateBtn\" type=\"button\" class=\"btn btn-secondary\" (click)=\"click()\">Yes, Keep me signed in</button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n animations: [\r\n trigger(\"openBacksplash\",\r\n [\r\n state(\"in\", style({\r\n \"display\": \"none\"\r\n })),\r\n state(\"hidden\", style({\r\n \"display\": \"none\"\r\n })),\r\n state(\"opened\", style({\r\n \"display\": \"inherit\"\r\n })),\r\n transition(\"hidden => opened\", animate(100)),\r\n transition(\"opened => hidden\", animate(200))\r\n ]\r\n ),\r\n trigger(\"openModal\",\r\n [\r\n state(\"in\", style({\r\n \"opacity\": \"0\",\r\n \"left\": \"-50vw\"\r\n })),\r\n state(\"hidden\", style({\r\n \"opacity\": \"0\",\r\n \"left\": \"-50vw\"\r\n })),\r\n state(\"opened\", style({\r\n \"opacity\": \"1\",\r\n \"left\": \"25vw\"\r\n })),\r\n transition(\"hidden => opened\", animate(500)),\r\n transition(\"opened => hidden\", animate(300))\r\n ]\r\n )\r\n ],\r\n styles: [`\r\n\r\n .flyout-max {\r\n position: fixed;\r\n z-index: 9999;\r\n top: 0;\r\n bottom: 0;\r\n background-color: rgba(0, 0, 0, 0.4);\r\n width: 100vw;\r\n }\r\n \r\n .modal-dialog {\r\n position: fixed;\r\n max-width: 50vw;\r\n min-width: 50vw;\r\n left: -50vw;\r\n top: 25vw;\r\n margin: 0;\r\n background-color: white;\r\n border: black 1px solid;\r\n border-left: none;\r\n border-top-right-radius: 20px;\r\n border-bottom-right-radius: 20px;\r\n border-top-left-radius: 20px;\r\n border-bottom-left-radius: 20px;\r\n pointer-events: all;\r\n }\r\n \r\n .modal-body {\r\n width: 100%;\r\n display: inline-block;\r\n }\r\n \r\n .modal-body-left {\r\n display: inline-block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n min-height: 300px;\r\n max-height: 300px;\r\n }\r\n \r\n .modal-body-right {\r\n width: 70%;\r\n vertical-align: top;\r\n padding-left: 15px;\r\n border-left: black 1px solid;\r\n margin-left: 15px;\r\n display: inline-block;\r\n overflow-y: auto;\r\n min-height: 300px;\r\n max-height: 300px;\r\n }\r\n `]\r\n})\r\nexport class TimeoutNotificationComponent {\r\n public seconds: Observable<number>;\r\n public openState: string = \"hidden\";\r\n\r\n private subscription: Subscription;\r\n\r\n constructor(private authenticationService: AuthenticationService) {\r\n authenticationService.isAboutToTimeOut().subscribe((isAboutToTimeOut) => {\r\n\r\n if (isAboutToTimeOut) {\r\n this.openState = \"opened\";\r\n this.startCountdown();\r\n } else {\r\n this.openState = \"hidden\";\r\n //If something changed mid-timeout, cancel the timeout/logout.\r\n if (this.subscription != null && !this.subscription.closed) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n });\r\n }\r\n\r\n startCountdown(): void {\r\n this.seconds = timer(0, 1000)\r\n .pipe(\r\n map(() => {\r\n const elapsed: number = Math.round((Date.now() - this.authenticationService.getTimeoutStart()) / 1000);\r\n return this.authenticationService.userCountdownSeconds - elapsed;\r\n }),\r\n // The true argument emits the final value that completed the observable\r\n takeWhile((value) => value > 0, true),\r\n );\r\n\r\n this.subscription = this.seconds.subscribe((value) => {\r\n if (value < 1) {\r\n this.subscription.unsubscribe();\r\n this.authenticationService.logout(true);\r\n }\r\n });\r\n }\r\n\r\n click(): void {\r\n this.subscription.unsubscribe();\r\n this.authenticationService.updateUserActivity();\r\n }\r\n}\r\n","import {Injectable, Injector, isDevMode} from \"@angular/core\";\r\nimport {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpHeaders, HttpParams, HttpErrorResponse} from \"@angular/common/http\";\r\n\r\nimport {Observable, throwError} from \"rxjs\";\r\nimport {catchError} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\n\r\n@Injectable()\r\nexport class AuthorizationInterceptor implements HttpInterceptor {\r\n\r\n constructor(private injector: Injector) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n if (isDevMode()) {\r\n console.debug(\"AuthorizationInterceptor.intercept\");\r\n }\r\n \r\n let authService: AuthenticationService = this.injector.get(AuthenticationService);\r\n \r\n //Don't want to include background token refreshes in considering the user 'active'\r\n if (req.url !== authService.tokenLocation()) {\r\n //Update user activity. Done here instead of the previous method using a subscription to a subject in AuthenticationProvider\r\n authService.updateUserActivity();\r\n }\r\n \r\n let headers: HttpHeaders = authService.getHeaders(req);\r\n let url: string = req.url;\r\n if (url.startsWith(\"/\")) {\r\n url = authService.getBaseUrl() + url;\r\n } else if (!url.startsWith(\"http\")) {\r\n if (authService.getContextRoot().length > 0) {\r\n url = authService.getBaseUrl() + \"/\" + authService.getContextRoot() + \"/\" + url;\r\n } else {\r\n url = authService.getBaseUrl() + \"/\" + url;\r\n }\r\n }\r\n\r\n let params: HttpParams = req.params;\r\n if (url.indexOf(\"/crud/\") > 0) {\r\n params = params.set(\"maxViewPermission\", authService.getMaxViewPermission());\r\n }\r\n\r\n let reqClone = req.clone({\r\n url: url,\r\n withCredentials: true,\r\n headers: headers,\r\n params: params\r\n });\r\n\r\n return next.handle(reqClone)\r\n .pipe(catchError((error: HttpErrorResponse) => {\r\n if (isDevMode()) {\r\n console.error(\"AuthorizationInterceptor.error\");\r\n console.log(\"Error status: \" + error.status);\r\n console.log(\"Error message: \" +error.message);\r\n console.log(\"Error error: \" +error.error);\r\n console.log(\"Error URL: \" +error.url);\r\n console.log(error.headers);\r\n console.error(error);\r\n }\r\n\r\n /**\r\n * If the token is not authenticated which angular does not know about, then a REST request to the backend will\r\n * return a 401. To duplicate this, open Core in two tabs. In one tab, logout, in the other, perform a request\r\n * that hits a protected resource.\r\n */\r\n if (error && error.status === 401) {\r\n authService.isAuthenticated().subscribe((authenticated) => {\r\n if (authenticated) {\r\n // If authenticated, then logout which will redirect.\r\n authService.logout(true);\r\n return throwError(error.message);\r\n } else {\r\n // Otherwise, for example, when the user first opens Core, 401s are expected.\r\n return throwError(error);\r\n }\r\n });\r\n }\r\n else if (error && error.status === 403) {\r\n // TODO: Trigger notification for unauthorized.\r\n }\r\n else {\r\n return throwError(error);\r\n }\r\n })) as Observable<HttpEvent<any>>;\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {ModuleWithProviders, NgModule, Optional, SkipSelf} from \"@angular/core\";\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {ReactiveFormsModule, FormsModule} from \"@angular/forms\";\r\nimport {HTTP_INTERCEPTORS, HttpClientModule} from \"@angular/common/http\";\r\nimport {RouterModule} from \"@angular/router\";\r\n\r\nimport {CoolStorageModule} from \"@angular-cool/storage\";\r\nimport {JWT_OPTIONS, JwtHelperService, JwtInterceptor, JwtModule} from \"@auth0/angular-jwt\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\nimport {AuthenticationComponent} from \"./authentication.component\";\r\nimport {DirectLoginComponent} from \"./directlogin.component\";\r\nimport {TimeoutNotificationComponent} from \"./timeout-notification.component\";\r\nimport {AuthorizationInterceptor} from \"./authorization.interceptor\";\r\nimport {AuthenticationProvider} from \"./authentication.provider\";\r\n\r\n/**\r\n * Provide a single auth service and interceptor for the implementing application. Also provide everything\r\n * from the angular-jwt library.\r\n *\r\n * @since 1.0.0\r\n */\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n //JwtModule,\r\n RouterModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n CoolStorageModule\r\n ],\r\n declarations: [\r\n AuthenticationComponent,\r\n DirectLoginComponent,\r\n TimeoutNotificationComponent\r\n ],\r\n exports: [\r\n AuthenticationComponent,\r\n DirectLoginComponent,\r\n TimeoutNotificationComponent\r\n ]\r\n})\r\nexport class AuthenticationModule {\r\n constructor(@Optional() @SkipSelf() parentModule: JwtModule) {\r\n if (parentModule) {\r\n throw new Error(\"AuthenticationModule is already loaded.\");\r\n }\r\n }\r\n static forRoot(): ModuleWithProviders<AuthenticationModule> {\r\n return {\r\n providers: [\r\n AuthenticationProvider,\r\n JwtHelperService,\r\n AuthenticationService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthorizationInterceptor,\r\n multi: true\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: JwtInterceptor,\r\n multi: true\r\n },\r\n {\r\n provide: JWT_OPTIONS,\r\n useClass: AuthenticationProvider\r\n }\r\n ],\r\n ngModule: AuthenticationModule\r\n }\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {inject, isDevMode} from \"@angular/core\";\r\nimport {Router, ActivatedRouteSnapshot, RouterStateSnapshot} from \"@angular/router\";\r\n\r\nimport {Observable} from \"rxjs\";\r\nimport {map} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\n\r\n\r\nexport const RouteGuardService = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\r\n const authenticationService = inject(AuthenticationService);\r\n const router = inject(Router);\r\n\r\n return authenticationService.isAuthenticated().pipe(map((authenticated) => {\r\n if (authenticated) {\r\n return true;\r\n }\r\n else {\r\n if (isDevMode()) {\r\n console.error(\"Route Guard: Not Authenticated\");\r\n }\r\n \r\n // Store the attempted URL for redirecting\r\n authenticationService.redirectUrl = state.url;\r\n \r\n //Try to get an access token\r\n authenticationService.requestAccessToken(true, true);\r\n }\r\n }));\r\n};\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4","i1.AuthenticationService","i2","i3","i1"],"mappings":"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"}
1
+ {"version":3,"file":"huntsman-cancer-institute-authentication.mjs","sources":["../../../projects/authentication/src/authentication.provider.ts","../../../projects/authentication/src/authentication.service.ts","../../../projects/authentication/src/authentication.component.ts","../../../projects/authentication/src/directlogin.component.ts","../../../projects/authentication/src/timeout-notification.component.ts","../../../projects/authentication/src/authorization.interceptor.ts","../../../projects/authentication/src/authentication.module.ts","../../../projects/authentication/src/route-guard.service.ts","../../../projects/authentication/src/huntsman-cancer-institute-authentication.ts"],"sourcesContent":["import {Inject, Injectable, InjectionToken, Injector} from \"@angular/core\";\r\n\r\nimport {Subject} from \"rxjs\";\r\n\r\nimport {CoolLocalStorage} from '@angular-cool/storage';\r\n\r\nexport let AUTHENTICATION_TOKEN_KEY = new InjectionToken<string>(\"authentication_token_key\");\r\n\r\n@Injectable()\r\nexport class AuthenticationProvider {\r\n\r\n public whitelistedDomains = [\r\n \"localhost\",\r\n new RegExp(\".*[.]utah[.]edu\")\r\n ];\r\n\r\n constructor(private _localStorageService: CoolLocalStorage,\r\n @Inject(AUTHENTICATION_TOKEN_KEY) private _authenticationTokenKey: string) {}\r\n\r\n public tokenGetter = () => {\r\n return this.authToken;\r\n }\r\n\r\n get authenticationTokenKey(): string {\r\n return this._authenticationTokenKey;\r\n }\r\n\r\n set authenticationTokenKey(_authenticationTokenKey: string) {\r\n this._authenticationTokenKey = _authenticationTokenKey;\r\n }\r\n\r\n get authToken(): string {\r\n return <string>this._localStorageService.getItem(this._authenticationTokenKey);\r\n }\r\n\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Injectable, InjectionToken, Inject, Optional, isDevMode} from \"@angular/core\";\r\nimport {Location, LocationStrategy} from \"@angular/common\";\r\nimport {Router} from \"@angular/router\";\r\nimport {HttpClient, HttpHeaders, HttpRequest, HttpResponse} from \"@angular/common/http\";\r\n\r\nimport {interval, Observable, BehaviorSubject, Subscription, throwError, of} from \"rxjs\";\r\nimport {catchError, first, map} from \"rxjs/operators\";\r\nimport {JwtHelperService} from \"@auth0/angular-jwt\";\r\n\r\nimport {AuthenticationProvider} from \"./authentication.provider\";\r\nimport { CoolLocalStorage } from \"@angular-cool/storage\";\r\n\r\n/**\r\n * The token used for injection of the server side endpoint for the currently authenticated subject.\r\n *\r\n * @type {InjectionToken}\r\n */\r\nexport let AUTHENTICATION_SERVER_URL = new InjectionToken<string>(\"authentication_server_rest_api\");\r\nexport let AUTHENTICATION_LOGIN_PATH = new InjectionToken<string>(\"authentication_login_path\");\r\nexport let AUTHENTICATION_LOGOUT_PATH = new InjectionToken<string>(\"authentication_logout_path\");\r\nexport let AUTHENTICATION_DIRECT_ENDPOINT = new InjectionToken<string>(\"authentication_direct_endpoint\");\r\nexport let AUTHENTICATION_TOKEN_ENDPOINT = new InjectionToken<string>(\"authentication_token_endpoint\");\r\nexport let AUTHENTICATION_ROUTE = new InjectionToken<string>(\"authentication_route\");\r\nexport let AUTHENTICATION_MAX_INACTIVITY_MINUTES = new InjectionToken<number>(\"authentication_max_inactivity\");\r\nexport let AUTHENTICATION_USER_COUNTDOWN_SECONDS = new InjectionToken<number>(\"authentication_user_countdown_seconds\");\r\nexport let AUTHENTICATION_IDP_INACTIVITY_MINUTES = new InjectionToken<number>(\"authentication_idp_inactivity_minutes\");\r\n\r\n/**\r\n * @since 1.0.0\r\n */\r\n@Injectable()\r\nexport class AuthenticationService {\r\n\r\n /**\r\n * The generic error message used when a server error is thrown without a status.\r\n *\r\n * @type {string}\r\n */\r\n public static GENERIC_ERR_MSG: string = \"Server error\";\r\n\r\n private static CONTENT_TYPE: string = \"Content-Type\";\r\n private static SEC_GOV_CLASS_HEADER: string = \"SecurityGovernorClass\";\r\n private static SEC_GOV_ID_HEADER: string = \"SecurityGovernorId\";\r\n private static DEIDENT_HEADER: string = \"DeidentifiedContext\";\r\n private static LIMITED_HEADER: string = \"LimitedContext\";\r\n\r\n public userCountdownSeconds: number = 60;\r\n public idpInactivityMinutes: number = 5;\r\n\r\n public contentType: string = \"application/json\";\r\n public securityGovernorClass: string;\r\n public securityGovernorId: number;\r\n public limitedContext: boolean = false;\r\n public deidentifiedContext: boolean = false;\r\n\r\n private maxViewPermission: BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\"> = new BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\">(\"viewident\");\r\n private _isAuthenticatedSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n private _userIsAboutToTimeOut: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n private _redirectUrl: string;\r\n private _refreshSubscription: Subscription;\r\n private _lastUserInteraction: Date;\r\n private _maxInactivityMinutes: number = 120;\r\n\r\n private baseUrl: string;\r\n private contextRoot: string = \"\";\r\n\r\n constructor(private _http: HttpClient,\r\n private _router: Router,\r\n private _localStorageService: CoolLocalStorage,\r\n private _jwtHelper: JwtHelperService,\r\n private location: Location,\r\n private authenticationProvider: AuthenticationProvider,\r\n @Inject(AUTHENTICATION_LOGOUT_PATH) private _logoutPath: string,\r\n @Inject(AUTHENTICATION_TOKEN_ENDPOINT) private _tokenEndpoint: string,\r\n @Optional() @Inject(AUTHENTICATION_LOGIN_PATH) private _loginPath: string,\r\n @Optional() @Inject(AUTHENTICATION_ROUTE) private _authenticationRoute: string,\r\n @Optional() @Inject(AUTHENTICATION_SERVER_URL) private _serverUrl: string,\r\n @Optional() @Inject(AUTHENTICATION_DIRECT_ENDPOINT) private _directEndpoint: string,\r\n @Optional() @Inject(AUTHENTICATION_MAX_INACTIVITY_MINUTES) private _maxInactivity: number,\r\n @Optional() @Inject(AUTHENTICATION_USER_COUNTDOWN_SECONDS) private _userCountdownSeconds: number,\r\n @Optional() @Inject(AUTHENTICATION_IDP_INACTIVITY_MINUTES) private _idpInactivityMinutes: number,\r\n @Optional() @Inject(LocationStrategy) private locationStrategy: LocationStrategy) {\r\n if (isDevMode()) {\r\n console.debug(\"window.location.href: \" + window.location.href);\r\n }\r\n\r\n if (window.location) {\r\n let parts: string[] = window.location.href.split(\"/\");\r\n this.baseUrl = parts[0] + \"//\" + parts[2];\r\n if (parts.length > 3) {\r\n this.contextRoot = parts[3];\r\n }\r\n }\r\n\r\n if (this._localStorageService.getItem(\"maxViewPermission\")) {\r\n this.maxViewPermission.next(<\"view\" | \"viewident\" | \"viewlimited\">this._localStorageService.getItem(\"maxViewPermission\"));\r\n }\r\n\r\n if (_maxInactivity) {\r\n this._maxInactivityMinutes = _maxInactivity;\r\n }\r\n\r\n if (_userCountdownSeconds) {\r\n this.userCountdownSeconds = _userCountdownSeconds;\r\n }\r\n\r\n if (_idpInactivityMinutes) {\r\n this.idpInactivityMinutes = _idpInactivityMinutes;\r\n }\r\n\r\n this.hasValidConfig();\r\n }\r\n\r\n getBaseUrl(): string {\r\n return (this.baseUrl) ? this.baseUrl : \"\";\r\n }\r\n\r\n getContextRoot(): string {\r\n return this.contextRoot;\r\n }\r\n\r\n getHeaders(req: HttpRequest<any>): HttpHeaders {\r\n let headers: HttpHeaders = req.headers;\r\n\r\n //Don't set content type if already set\r\n if (!req.headers.get(AuthenticationService.CONTENT_TYPE)) {\r\n headers = headers.set(AuthenticationService.CONTENT_TYPE, this.contentType.toString());\r\n }\r\n\r\n if (headers.get(AuthenticationService.SEC_GOV_CLASS_HEADER) === \"\") {\r\n headers = headers.delete(AuthenticationService.SEC_GOV_CLASS_HEADER);\r\n } else if (this.securityGovernorClass && !headers.get(AuthenticationService.SEC_GOV_CLASS_HEADER)) {\r\n headers = headers.set(AuthenticationService.SEC_GOV_CLASS_HEADER, this.securityGovernorClass);\r\n }\r\n\r\n if (headers.get(AuthenticationService.SEC_GOV_ID_HEADER) === \"\") {\r\n headers = headers.delete(AuthenticationService.SEC_GOV_ID_HEADER);\r\n } else if (this.securityGovernorId && !headers.get(AuthenticationService.SEC_GOV_ID_HEADER)) {\r\n headers = headers.set(AuthenticationService.SEC_GOV_ID_HEADER, this.securityGovernorId.toString());\r\n }\r\n\r\n headers = headers.set(AuthenticationService.DEIDENT_HEADER, this.deidentifiedContext.toString());\r\n headers = headers.set(AuthenticationService.LIMITED_HEADER, this.limitedContext.toString());\r\n\r\n return headers;\r\n }\r\n\r\n get authenticationTokenKey(): string {\r\n return this.authenticationProvider.authenticationTokenKey;\r\n }\r\n\r\n get authToken(): string {\r\n return this.authenticationProvider.authToken;\r\n }\r\n\r\n public updateUserActivity(): void {\r\n if (this._isAuthenticatedSubject.value) {\r\n this._lastUserInteraction = new Date();\r\n this._userIsAboutToTimeOut.next(false);\r\n }\r\n }\r\n\r\n /**\r\n * A mutator for identifying the clients original request location. Setting this value will influence the end location\r\n * navigated to by {@link #navigateToPath}.\r\n *\r\n * @param redirectUrl location of the users request before authentication\r\n */\r\n set redirectUrl(redirectUrl: string) {\r\n this._redirectUrl = redirectUrl;\r\n }\r\n\r\n get redirectUrl() {\r\n return this._redirectUrl;\r\n }\r\n \r\n \r\n initiateLogin() {\r\n if (isDevMode()) {\r\n console.debug(\"Authentication Service: Initiate Login: \" + (this.tokenLocation)?\"Redirect\":\"Login Component\");\r\n }\r\n \r\n //Redirect based authentication\r\n if (this._loginPath) {\r\n window.location.href = this.getBaseUrl() + (this._loginPath.startsWith(\"/\")?\"\":\"/\") + this._loginPath;\r\n }\r\n //Authentication component (<IFrame> implementation)\r\n else {\r\n // Navigate to the login page\r\n return this._router.createUrlTree([this._authenticationRoute]);\r\n }\r\n }\r\n\r\n requestAccessToken(fromRouteGuard: boolean, redirectOnSuccess: boolean): void {\r\n \r\n if (isDevMode()) {\r\n console.debug(\"Authentication Service: Request Acces Token\");\r\n }\r\n\r\n this._http.get(this.tokenLocation(), {withCredentials: true, responseType: \"json\"})\r\n .subscribe(\r\n (response: any) => {\r\n this.storeToken(response.auth_token);\r\n if (redirectOnSuccess) {\r\n this.proceedIfAuthenticated();\r\n }\r\n },\r\n (error) => {\r\n //Not logged in - start authentication\r\n if (fromRouteGuard) {\r\n this.initiateLogin();\r\n }\r\n //Background token request failed - logout and clear\r\n else {\r\n if (isDevMode()) {\r\n console.error(\"Authentication Service: Request Acces Token - Logout\");\r\n }\r\n \r\n this.logout(true);\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Verifies whether or not a current user session exists.\r\n *\r\n * @returns {Observable<boolean>} evaluates to true if the user is authenticated, false otherwise.\r\n */\r\n isAuthenticated(): Observable<boolean> {\r\n return this._isAuthenticatedSubject.asObservable();\r\n }\r\n\r\n isAboutToTimeOut(): Observable<boolean> {\r\n return this._userIsAboutToTimeOut.asObservable();\r\n }\r\n\r\n getTimeoutStart(): number {\r\n if (this._lastUserInteraction) {\r\n return this._lastUserInteraction.valueOf() + (((this._maxInactivityMinutes * 60) - this.userCountdownSeconds) * 1000);\r\n }\r\n }\r\n\r\n tokenLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._tokenEndpoint;\r\n } else {\r\n return this._tokenEndpoint;\r\n }\r\n }\r\n\r\n directLoginLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._directEndpoint;\r\n } else {\r\n return this._directEndpoint;\r\n }\r\n }\r\n\r\n logoutLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._logoutPath;\r\n } else {\r\n return this._logoutPath;\r\n }\r\n }\r\n\r\n /**\r\n * A function to authenticated the user with the provided credentials. Failure results in an error that describes the\r\n * server response (status and status message) and should be actionable by the client application.\r\n *\r\n * @param username of the authenticating user to verify\r\n * @param password of the authenticating user to verify\r\n * @returns {Observable<R>} describing the result of the login action, true or an error\r\n */\r\n login(_username: string, _password: string): Observable<boolean> {\r\n return this._http.post(\r\n this.directLoginLocation(),\r\n {username: _username, password: _password},\r\n {observe: \"response\"}\r\n ).pipe(map((resp: HttpResponse<any>) => {\r\n if (resp.status === 201) {\r\n return true;\r\n } else {\r\n throw new Error(\"Authentication failed. \" + resp.status + \": \" + resp.statusText);\r\n }\r\n }),\r\n catchError(this.handleError)) as Observable<boolean>;\r\n }\r\n\r\n\r\n clearLogin(): Observable<string> {\r\n //Front-end logout\r\n try {\r\n this._localStorageService.removeItem(this.authenticationProvider.authenticationTokenKey);\r\n this.unsubscribeFromTokenRefresh();\r\n this._isAuthenticatedSubject.next(false);\r\n this._userIsAboutToTimeOut.next(false);\r\n } catch (Error) {\r\n }\r\n\r\n //Back-end logout\r\n let headers = new HttpHeaders().set(AuthenticationService.CONTENT_TYPE, \"text/plain\");\r\n return <Observable<string>>this._http.get(this.logoutLocation(), {headers: headers, responseType: \"text\"});\r\n }\r\n\r\n /**\r\n * A function to signal the termination of the current session. Invoking this function will clean up any relevant state\r\n * related to the last active session.\r\n */\r\n logout(keepCurrentRoute: boolean = false): void {\r\n //Prevent logout if already on authentication route. Doing otherwise screws up SAML\r\n if (! this._router.routerState || this._router.routerState.snapshot.url !== this._authenticationRoute) {\r\n this._redirectUrl = (keepCurrentRoute && this._router.routerState && this._router.routerState.snapshot) ? this._router.routerState.snapshot.url : \"\";\r\n\r\n if (this._redirectUrl.startsWith(\"/\")) {\r\n this._redirectUrl = this._redirectUrl.substring(1);\r\n }\r\n\r\n this.clearLogin().subscribe(\r\n (response) => {\r\n window.location.replace(this._redirectUrl);\r\n },\r\n (error) => {\r\n window.location.replace(this._redirectUrl);\r\n }\r\n );\r\n }\r\n }\r\n\r\n storeToken(token: string): void {\r\n let valid = this.validateToken(token);\r\n\r\n // unsubscribe from refesh before we decide wether to resubscribe\r\n this.unsubscribeFromTokenRefresh();\r\n\r\n if (valid) {\r\n this._localStorageService.setItem(this.authenticationProvider.authenticationTokenKey, token);\r\n this.subscribeToTokenRefresh(token);\r\n\r\n //Change the BehaviorSubject if the user was not previously authenticated.\r\n //Since other code may be subscribing to this observable, we don't want to cause new events to fire if just refreshing the JWT.\r\n if (! this._isAuthenticatedSubject.value) {\r\n this._isAuthenticatedSubject.next(true);\r\n }\r\n } else {\r\n this._localStorageService.removeItem(this.authenticationProvider.authenticationTokenKey);\r\n this._isAuthenticatedSubject.next(false);\r\n }\r\n }\r\n\r\n proceedIfAuthenticated(): boolean {\r\n if (isDevMode()) {\r\n console.debug(\"AuthenticationService.proceedIfAuthenticated: \" + this._redirectUrl);\r\n }\r\n\r\n if (this._isAuthenticatedSubject.value) {\r\n //Login counts as user activity, too\r\n this.updateUserActivity();\r\n\r\n if (this._redirectUrl && this._redirectUrl && this._redirectUrl !== \"\") {\r\n this._router.navigateByUrl(this._redirectUrl);\r\n } else {\r\n this._router.navigate([\"\"]);\r\n }\r\n\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n validateToken(token: string): boolean {\r\n return (token && !this._jwtHelper.isTokenExpired(token));\r\n }\r\n\r\n subscribeToTokenRefresh(token: any): void {\r\n let exp = this._jwtHelper.getTokenExpirationDate(token);\r\n\r\n // Use a timer to periodically check timeouts\r\n this._refreshSubscription = interval(1000)\r\n .subscribe(() => {\r\n\r\n // If a tab is inactive we can't know if our timer is accurate\r\n // so when the interval hits check against timestamps\r\n if (this._isAuthenticatedSubject.value && Date.now() > this.getTimeoutStart()) {\r\n //Don't update the subject more than once! Doing so initializes more than one countdown timer!\r\n if (this._userIsAboutToTimeOut.getValue() !== true) {\r\n this._userIsAboutToTimeOut.next(true);\r\n }\r\n }\r\n\r\n // check for refresh token\r\n let msToExpiry = (exp.valueOf() - new Date().valueOf());\r\n\r\n // Refresh 60 seconds before expiry\r\n if (msToExpiry <= 60000) {\r\n this.refreshTokenIfUserIsActive();\r\n }\r\n });\r\n }\r\n\r\n unsubscribeFromTokenRefresh(): void {\r\n if (this._refreshSubscription && ! this._refreshSubscription.closed) {\r\n this._refreshSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n getMaxViewPermission(): \"view\" | \"viewident\" | \"viewlimited\" {\r\n return this.maxViewPermission.getValue();\r\n }\r\n\r\n getMaxViewPermissionSubject(): BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\"> {\r\n return this.maxViewPermission;\r\n }\r\n\r\n setMaxViewPermission(maxViewPermission: \"view\" | \"viewident\" | \"viewlimited\"): void {\r\n this._localStorageService.setItem(\"maxViewPermission\", maxViewPermission);\r\n this.maxViewPermission.next(maxViewPermission);\r\n }\r\n\r\n private refreshTokenIfUserIsActive(): void {\r\n //Only refresh if the user has been active\r\n if (this._lastUserInteraction && ((new Date().valueOf() - this._lastUserInteraction.valueOf()) <= (this._maxInactivityMinutes * 60 * 1000))) {\r\n this.requestAccessToken(false, false);\r\n }\r\n }\r\n\r\n private hasValidConfig(): void {\r\n if (this._tokenEndpoint == null && (this._serverUrl === null || this._logoutPath === null)) {\r\n throw new Error(\"BUG ALERT! Invalid AuthenticationService configuration. No valid configuration for authentication endpoint(s).\");\r\n }\r\n if (this._localStorageService === null || this.authenticationProvider.authenticationTokenKey === null) {\r\n throw new Error(\"BUG ALERT! Invalid AuthenticationService configuration. No valid configuration for local storage\");\r\n }\r\n }\r\n\r\n private handleError(error: any) : Observable<never> {\r\n let errMsg = (error.message) ? error.message : AuthenticationService.GENERIC_ERR_MSG;\r\n return throwError(errMsg);\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component, ElementRef, ViewChild, Inject, Renderer2, isDevMode} from \"@angular/core\";\r\nimport {Location, PopStateEvent} from \"@angular/common\";\r\nimport {Router} from \"@angular/router\";\r\nimport {DomSanitizer} from \"@angular/platform-browser\";\r\n\r\nimport {interval, Subscription} from \"rxjs\";\r\nimport {first} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService, AUTHENTICATION_ROUTE} from \"./authentication.service\";\r\n\r\n@Component({\r\n selector: \"authentication-iframe\",\r\n template: `\r\n <div class=\"container\">\r\n <iframe #iframe class=\"frame\" [src]=\"url\" (load)=\"handleChanges()\"></iframe>\r\n <div *ngIf=\"_errorMsg\" class=\"alert-box\">\r\n <div class=\"alert alert-danger\">\r\n <h5 class=\"alert-heading\">Authentication Failed</h5>\r\n <span id=\"hci-login-error\" class=\"alert-text\">{{_errorMsg}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n \r\n :host {\r\n background-color: white;\r\n }\r\n \r\n .container {\r\n max-width: 100%;\r\n margin-top: 60px;\r\n padding-top: 15px;\r\n }\r\n\r\n .frame {\r\n width: 100%;\r\n height: 100%;\r\n border: 0px;\r\n }\r\n `],\r\n host: {class: \"outlet-row\"}\r\n})\r\nexport class AuthenticationComponent {\r\n\r\n public url;\r\n public _errorMsg: string;\r\n\r\n @ViewChild(\"iframe\", {static: true}) iframe : ElementRef;\r\n\r\n private resetSubscription: Subscription;\r\n private popstateSubscription: Subscription;\r\n\r\n constructor(private authenticationService: AuthenticationService,\r\n private domSanitizer : DomSanitizer,\r\n private router: Router,\r\n private location: Location,\r\n private renderer: Renderer2,\r\n @Inject(AUTHENTICATION_ROUTE) private authenticationRoute: string) {\r\n }\r\n\r\n ngOnInit() {\r\n \r\n if (isDevMode()) {\r\n console.debug(\"Authentication Component: Init\");\r\n }\r\n \r\n /*\r\n * Fix back bug\r\n * Issue is that the browser will go back to the previous route. If it's guarded, the route guard will just load the login again\r\n * Eventually the browser gets to the /authenticate route and going back from there loads the iframe history and Shibboleth displays\r\n * an error relating to navigating back.\r\n */\r\n history.pushState(null, null, this.location.prepareExternalUrl(this.authenticationRoute));\r\n\r\n this.popstateSubscription = <Subscription> this.location.subscribe((value: PopStateEvent) => {\r\n //This is going to prevent back from working from the login component\r\n history.go(1);\r\n });\r\n\r\n this.beginAuthenticationProcess();\r\n }\r\n\r\n handleChanges(): void {\r\n if (!this.iframe.nativeElement.contentDocument) {\r\n return;\r\n }\r\n\r\n try {\r\n let element: HTMLElement = this.iframe.nativeElement.contentDocument.body;\r\n if (element.querySelector(\"pre\")) {\r\n element = element.querySelector(\"pre\");\r\n }\r\n\r\n this._errorMsg = null;\r\n var jsonText = element.innerText;\r\n\r\n var json = JSON.parse(jsonText);\r\n this.authenticationService.storeToken(json.auth_token);\r\n var authenticated = this.authenticationService.proceedIfAuthenticated();\r\n\r\n if (!authenticated) {\r\n this.resetSubscription.unsubscribe();\r\n this.beginAuthenticationProcess();\r\n }\r\n } catch (error) {\r\n if (this.iframe.nativeElement.contentDocument.title.toUpperCase() === \"ERROR\") {\r\n if (this.iframe.nativeElement.contentDocument.body.innerHTML.toUpperCase() === \"FORBIDDEN\") {\r\n this._errorMsg = \"You do not have permission to log into this application\";\r\n } else {\r\n this._errorMsg = null;\r\n }\r\n\r\n //A bit of a workaround for a WildFly issue. Success on Pac4j authentication, but failure on DB load of user put things in a weird state. Just logout, and redo the login.\r\n this.clearLoginAndRetry();\r\n }\r\n }\r\n\r\n // After the iframe loads, make the background transparent so we use the implementation's background and not the sso background.\r\n this.renderer.setStyle(this.iframe.nativeElement.contentDocument.body, \"background-color\", \"transparent\");\r\n }\r\n\r\n ngOnDestroy() {\r\n this.resetSubscription.unsubscribe();\r\n this.popstateSubscription.unsubscribe();\r\n }\r\n\r\n private clearLoginAndRetry(): void {\r\n this.resetSubscription.unsubscribe();\r\n this.authenticationService.clearLogin().subscribe(\r\n () => { this.beginAuthenticationProcess(); },\r\n (error) => { this.beginAuthenticationProcess(); }\r\n );\r\n }\r\n\r\n private beginAuthenticationProcess(): void {\r\n var tokenEndpoint = this.authenticationService.tokenLocation();\r\n \r\n if (isDevMode()) {\r\n console.debug(\"Authentication Component: Begin Authentication\");\r\n }\r\n\r\n if (tokenEndpoint !== \"\") {\r\n this.url = this.domSanitizer.bypassSecurityTrustResourceUrl(tokenEndpoint);\r\n }\r\n\r\n /**\r\n * If the user doesn't complete authentication before the IdP session times out, that will be a problem when they eventually\r\n * attampt to log in. It is likely that users will do this often when they log out or are timed out in the evening, leave\r\n * their browser open, then attempt to log back in in the morning. In order to work around this, this component will re-request\r\n * the token prior to IdP timeout, which will reset the process. This will happen 1 minute before idpInactivityMinutes\r\n **/\r\n this.resetSubscription = interval((this.authenticationService.idpInactivityMinutes - 1) * 60 * 1000)\r\n .pipe(first())\r\n .subscribe((value) => {\r\n this.beginAuthenticationProcess();\r\n });\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component, OnInit} from \"@angular/core\";\r\nimport {AuthenticationService} from \"./authentication.service\";\r\nimport {UntypedFormBuilder, UntypedFormGroup, Validators} from \"@angular/forms\";\r\n\r\n@Component({\r\n selector: \"hci-login-form\",\r\n template: `\r\n <div class=\"container\">\r\n <div class=\"login-box\" id=\"hci-login-form-box\">\r\n <div class=\"login-heading\" id=\"hci-login-form-heading\">\r\n <h3>Sign in</h3>\r\n </div>\r\n <div class=\"panel-body\">\r\n <form [formGroup]=\"_loginForm\" (ngSubmit)=\"login()\">\r\n <input formControlName=\"username\" class=\"form-control\" id=\"username\" name=\"username\" placeholder=\"Username\" type=\"text\">\r\n <input formControlName=\"password\" class=\"form-control\" id=\"password\" name=\"password\" type=\"password\" placeholder=\"Password\">\r\n \r\n <div *ngIf=\"_errorMsg\" class=\"alert-box\">\r\n <div class=\"alert alert-danger\">\r\n <h5 class=\"alert-heading\">Authentication Failed</h5>\r\n <span id=\"hci-login-error\" class=\"alert-text\">{{_errorMsg}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"btn-box\">\r\n <button class=\"btn btn-primary\" id=\"hci-login-form-submit-button\" type=\"submit\" [disabled]=\"!_loginForm.valid\">Login</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .container {\r\n max-width: 400px;\r\n margin-top: 20px;\r\n padding-top: 15px;\r\n }\r\n \r\n .login-box {\r\n border-radius: 10px;\r\n box-shadow: 0 0 2px #ccc;\r\n padding: 15px;\r\n }\r\n \r\n .login-box .login-heading h3 {\r\n line-height:1.5;\r\n margin: 0 0 10px\r\n }\r\n \r\n .login-box .form-control {\r\n padding: 10px;\r\n border: 1px solid #ccc;\r\n }\r\n \r\n .login-box input[type=\"password\"] {\r\n margin-bottom: 10px;\r\n border-top-left-radius: 0;\r\n border-top-right-radius: 0;\r\n }\r\n \r\n .login-box input[type=\"text\"] {\r\n margin-bottom: -1px;\r\n border-bottom-right-radius: 0;\r\n border-bottom-left-radius: 0;\r\n }\r\n \r\n .login-box .alert-box {\r\n margin: 10px 0 -5px 0\r\n }\r\n \r\n .login-box .alert-text {\r\n font-size: small;\r\n }\r\n \r\n .login-box .btn-box {\r\n margin: 10px 0 0px 0\r\n }\r\n `]\r\n})\r\nexport class DirectLoginComponent implements OnInit {\r\n public _loginForm: UntypedFormGroup;\r\n public _errorMsg: string;\r\n\r\n constructor(private _authenticationService: AuthenticationService, private _formBuilder: UntypedFormBuilder) {}\r\n\r\n /**\r\n * Initializes the authentication form.\r\n */\r\n ngOnInit(): void {\r\n this._loginForm = this._formBuilder.group({\r\n username: [\"\", Validators.required],\r\n password: [\"\", Validators.required]\r\n });\r\n }\r\n\r\n /**\r\n * A function to submit the login form the the {@link UserService}.\r\n */\r\n login() {\r\n this._authenticationService.login(this._loginForm.value.username, this._loginForm.value.password)\r\n .subscribe((res) => {\r\n if (res) {\r\n this._errorMsg = null;\r\n this._authenticationService.requestAccessToken(false, true);\r\n }\r\n }, (error: any) => {\r\n this._errorMsg = \"Please check your username and password.\";\r\n });\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component} from \"@angular/core\";\r\nimport {animate, state, style, transition, trigger} from \"@angular/animations\";\r\n\r\nimport {Observable, Subscription, timer} from \"rxjs\";\r\nimport {map, takeWhile} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\n\r\n@Component({\r\n selector: \"timeout-notification\",\r\n template: `\r\n <div class=\"flyout-max\" [@openBacksplash]=\"openState\">\r\n <div class=\"modal-dialog\" [@openModal]=\"openState\" role=\"document\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">Your Session Is About To Expire</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <p>For your security, your session is about to automatically time out in the next <b>{{seconds | async}}</b> seconds. Would you like to stay signed in?</p>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <ng-container>\r\n <button id=\"updateBtn\" type=\"button\" class=\"btn btn-secondary\" (click)=\"click()\">Yes, Keep me signed in</button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n animations: [\r\n trigger(\"openBacksplash\",\r\n [\r\n state(\"in\", style({\r\n \"display\": \"none\"\r\n })),\r\n state(\"hidden\", style({\r\n \"display\": \"none\"\r\n })),\r\n state(\"opened\", style({\r\n \"display\": \"inherit\"\r\n })),\r\n transition(\"hidden => opened\", animate(100)),\r\n transition(\"opened => hidden\", animate(200))\r\n ]\r\n ),\r\n trigger(\"openModal\",\r\n [\r\n state(\"in\", style({\r\n \"opacity\": \"0\",\r\n \"left\": \"-50vw\"\r\n })),\r\n state(\"hidden\", style({\r\n \"opacity\": \"0\",\r\n \"left\": \"-50vw\"\r\n })),\r\n state(\"opened\", style({\r\n \"opacity\": \"1\",\r\n \"left\": \"25vw\"\r\n })),\r\n transition(\"hidden => opened\", animate(500)),\r\n transition(\"opened => hidden\", animate(300))\r\n ]\r\n )\r\n ],\r\n styles: [`\r\n\r\n .flyout-max {\r\n position: fixed;\r\n z-index: 9999;\r\n top: 0;\r\n bottom: 0;\r\n background-color: rgba(0, 0, 0, 0.4);\r\n width: 100vw;\r\n }\r\n \r\n .modal-dialog {\r\n position: fixed;\r\n max-width: 50vw;\r\n min-width: 50vw;\r\n left: -50vw;\r\n top: 25vw;\r\n margin: 0;\r\n background-color: white;\r\n border: black 1px solid;\r\n border-left: none;\r\n border-top-right-radius: 20px;\r\n border-bottom-right-radius: 20px;\r\n border-top-left-radius: 20px;\r\n border-bottom-left-radius: 20px;\r\n pointer-events: all;\r\n }\r\n \r\n .modal-body {\r\n width: 100%;\r\n display: inline-block;\r\n }\r\n \r\n .modal-body-left {\r\n display: inline-block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n min-height: 300px;\r\n max-height: 300px;\r\n }\r\n \r\n .modal-body-right {\r\n width: 70%;\r\n vertical-align: top;\r\n padding-left: 15px;\r\n border-left: black 1px solid;\r\n margin-left: 15px;\r\n display: inline-block;\r\n overflow-y: auto;\r\n min-height: 300px;\r\n max-height: 300px;\r\n }\r\n `]\r\n})\r\nexport class TimeoutNotificationComponent {\r\n public seconds: Observable<number>;\r\n public openState: string = \"hidden\";\r\n\r\n private subscription: Subscription;\r\n\r\n constructor(private authenticationService: AuthenticationService) {\r\n authenticationService.isAboutToTimeOut().subscribe((isAboutToTimeOut) => {\r\n\r\n if (isAboutToTimeOut) {\r\n this.openState = \"opened\";\r\n this.startCountdown();\r\n } else {\r\n this.openState = \"hidden\";\r\n //If something changed mid-timeout, cancel the timeout/logout.\r\n if (this.subscription != null && !this.subscription.closed) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n });\r\n }\r\n\r\n startCountdown(): void {\r\n this.seconds = timer(0, 1000)\r\n .pipe(\r\n map(() => {\r\n const elapsed: number = Math.round((Date.now() - this.authenticationService.getTimeoutStart()) / 1000);\r\n return this.authenticationService.userCountdownSeconds - elapsed;\r\n }),\r\n // The true argument emits the final value that completed the observable\r\n takeWhile((value) => value > 0, true),\r\n );\r\n\r\n this.subscription = this.seconds.subscribe((value) => {\r\n if (value < 1) {\r\n this.subscription.unsubscribe();\r\n this.authenticationService.logout(true);\r\n }\r\n });\r\n }\r\n\r\n click(): void {\r\n this.subscription.unsubscribe();\r\n this.authenticationService.updateUserActivity();\r\n }\r\n}\r\n","import {Injectable, Injector, isDevMode} from \"@angular/core\";\r\nimport {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpHeaders, HttpParams, HttpErrorResponse} from \"@angular/common/http\";\r\n\r\nimport {Observable, throwError} from \"rxjs\";\r\nimport {catchError, map} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\n\r\n@Injectable()\r\nexport class AuthorizationInterceptor implements HttpInterceptor {\r\n\r\n constructor(private injector: Injector) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n if (isDevMode()) {\r\n console.debug(\"AuthorizationInterceptor.intercept\");\r\n }\r\n \r\n let authService: AuthenticationService = this.injector.get(AuthenticationService);\r\n \r\n //Don't want to include background token refreshes in considering the user 'active'\r\n if (req.url !== authService.tokenLocation()) {\r\n //Update user activity. Done here instead of the previous method using a subscription to a subject in AuthenticationProvider\r\n authService.updateUserActivity();\r\n }\r\n \r\n let headers: HttpHeaders = authService.getHeaders(req);\r\n let url: string = req.url;\r\n if (url.startsWith(\"/\")) {\r\n url = authService.getBaseUrl() + url;\r\n } else if (!url.startsWith(\"http\")) {\r\n if (authService.getContextRoot().length > 0) {\r\n url = authService.getBaseUrl() + \"/\" + authService.getContextRoot() + \"/\" + url;\r\n } else {\r\n url = authService.getBaseUrl() + \"/\" + url;\r\n }\r\n }\r\n\r\n let params: HttpParams = req.params;\r\n if (url.indexOf(\"/crud/\") > 0) {\r\n params = params.set(\"maxViewPermission\", authService.getMaxViewPermission());\r\n }\r\n\r\n let reqClone = req.clone({\r\n url: url,\r\n withCredentials: true,\r\n headers: headers,\r\n params: params\r\n });\r\n\r\n return next.handle(reqClone)\r\n .pipe(catchError((error: HttpErrorResponse) => {\r\n if (isDevMode()) {\r\n console.debug(\"AuthorizationInterceptor.error\");\r\n }\r\n\r\n /**\r\n * If the token is not authenticated which angular does not know about, then a REST request to the backend will\r\n * return a 401. To duplicate this, open Core in two tabs. In one tab, logout, in the other, perform a request\r\n * that hits a protected resource.\r\n */\r\n if (error && error.status === 401) {\r\n authService.isAuthenticated().pipe(map((authenticated) => {\r\n if (authenticated) {\r\n // If the user was previously authenticated, then logout which will redirect.\r\n authService.logout(true);\r\n return throwError(error.message);\r\n } else {\r\n //This happens for legitimate reasons. Attempting to get the JWT when not authenticated returns the login form, for example, which NG will see as an error\r\n return throwError(error);\r\n }\r\n }));\r\n }\r\n else if (error && error.status === 403) {\r\n // TODO: Trigger notification for unauthorized.\r\n }\r\n else {\r\n return throwError(error);\r\n }\r\n })) as Observable<HttpEvent<any>>;\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {ModuleWithProviders, NgModule, Optional, SkipSelf} from \"@angular/core\";\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {ReactiveFormsModule, FormsModule} from \"@angular/forms\";\r\nimport {HTTP_INTERCEPTORS, HttpClientModule} from \"@angular/common/http\";\r\nimport {RouterModule} from \"@angular/router\";\r\n\r\nimport {CoolStorageModule} from \"@angular-cool/storage\";\r\nimport {JWT_OPTIONS, JwtHelperService, JwtInterceptor, JwtModule} from \"@auth0/angular-jwt\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\nimport {AuthenticationComponent} from \"./authentication.component\";\r\nimport {DirectLoginComponent} from \"./directlogin.component\";\r\nimport {TimeoutNotificationComponent} from \"./timeout-notification.component\";\r\nimport {AuthorizationInterceptor} from \"./authorization.interceptor\";\r\nimport {AuthenticationProvider} from \"./authentication.provider\";\r\n\r\n/**\r\n * Provide a single auth service and interceptor for the implementing application. Also provide everything\r\n * from the angular-jwt library.\r\n *\r\n * @since 1.0.0\r\n */\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n //JwtModule,\r\n RouterModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n CoolStorageModule\r\n ],\r\n declarations: [\r\n AuthenticationComponent,\r\n DirectLoginComponent,\r\n TimeoutNotificationComponent\r\n ],\r\n exports: [\r\n AuthenticationComponent,\r\n DirectLoginComponent,\r\n TimeoutNotificationComponent\r\n ]\r\n})\r\nexport class AuthenticationModule {\r\n constructor(@Optional() @SkipSelf() parentModule: JwtModule) {\r\n if (parentModule) {\r\n throw new Error(\"AuthenticationModule is already loaded.\");\r\n }\r\n }\r\n static forRoot(): ModuleWithProviders<AuthenticationModule> {\r\n return {\r\n providers: [\r\n AuthenticationProvider,\r\n JwtHelperService,\r\n AuthenticationService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthorizationInterceptor,\r\n multi: true\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: JwtInterceptor,\r\n multi: true\r\n },\r\n {\r\n provide: JWT_OPTIONS,\r\n useClass: AuthenticationProvider\r\n }\r\n ],\r\n ngModule: AuthenticationModule\r\n }\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {inject, isDevMode} from \"@angular/core\";\r\nimport {Router, ActivatedRouteSnapshot, RouterStateSnapshot} from \"@angular/router\";\r\n\r\nimport {Observable} from \"rxjs\";\r\nimport {map} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\n\r\n\r\nexport const RouteGuardService = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\r\n const authenticationService = inject(AuthenticationService);\r\n const router = inject(Router);\r\n\r\n return authenticationService.isAuthenticated().pipe(map((authenticated) => {\r\n if (authenticated) {\r\n return true;\r\n }\r\n else {\r\n if (isDevMode()) {\r\n console.debug(\"Route Guard: Not Authenticated\");\r\n }\r\n \r\n // Store the attempted URL for redirecting\r\n authenticationService.redirectUrl = state.url;\r\n \r\n //Try to get an access token\r\n authenticationService.requestAccessToken(true, true);\r\n }\r\n }));\r\n};\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4","i1.AuthenticationService","i2","i3","i1"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huntsman-cancer-institute/authentication",
3
- "version": "17.2.2",
3
+ "version": "17.2.4",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git@gitlab.com:huntsman-cancer-institute/risr/ng/hci-ng-lib.git"