@kolektor/nucleus-identity 0.0.12-pre.7931 → 0.1.0-pre.128

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +4 -0
  2. package/esm2022/index.mjs +7 -0
  3. package/esm2022/kolektor-nucleus-identity.mjs +5 -0
  4. package/esm2022/lib/models/client-registration.mjs +8 -0
  5. package/esm2022/lib/models/device-code.mjs +19 -0
  6. package/esm2022/lib/models/identity.mjs +52 -0
  7. package/esm2022/lib/models/otp.mjs +11 -0
  8. package/esm2022/lib/models/service-principal.mjs +16 -0
  9. package/esm2022/lib/nucleus-identity-config.mjs +7 -0
  10. package/esm2022/lib/nucleus-identity.module.mjs +32 -0
  11. package/esm2022/lib/nucleus-identity.service.mjs +350 -0
  12. package/esm2022/lib/nucleus-token-interceptor.service.mjs +69 -0
  13. package/esm2022/lib/utils/angular-requestor.mjs +44 -0
  14. package/esm2022/lib/utils/authorization-service-configuration.mjs +28 -0
  15. package/esm2022/lib/utils/location.service.mjs +72 -0
  16. package/esm2022/lib/utils/nucleus-authorization-notifier.mjs +15 -0
  17. package/esm2022/lib/utils/oidc-configuration.service.mjs +95 -0
  18. package/esm2022/lib/utils/secrets-store.mjs +120 -0
  19. package/esm2022/lib/utils/token-client.mjs +140 -0
  20. package/{fesm2020 → fesm2022}/kolektor-nucleus-identity.mjs +980 -1012
  21. package/fesm2022/kolektor-nucleus-identity.mjs.map +1 -0
  22. package/index.d.ts +6 -5
  23. package/lib/models/client-registration.d.ts +11 -11
  24. package/lib/models/device-code.d.ts +19 -19
  25. package/lib/models/identity.d.ts +14 -14
  26. package/lib/models/otp.d.ts +14 -14
  27. package/lib/models/service-principal.d.ts +12 -12
  28. package/lib/nucleus-identity-config.d.ts +12 -12
  29. package/lib/nucleus-identity.module.d.ts +9 -9
  30. package/lib/nucleus-identity.service.d.ts +63 -63
  31. package/lib/nucleus-token-interceptor.service.d.ts +19 -19
  32. package/lib/utils/angular-requestor.d.ts +11 -11
  33. package/lib/utils/authorization-service-configuration.d.ts +12 -12
  34. package/lib/utils/location.service.d.ts +25 -25
  35. package/lib/utils/nucleus-authorization-notifier.d.ts +9 -9
  36. package/lib/utils/oidc-configuration.service.d.ts +23 -23
  37. package/lib/utils/secrets-store.d.ts +33 -33
  38. package/lib/utils/token-client.d.ts +23 -23
  39. package/package.json +29 -33
  40. package/esm2020/kolektor-nucleus-identity.mjs +0 -5
  41. package/esm2020/lib/models/client-registration.mjs +0 -8
  42. package/esm2020/lib/models/device-code.mjs +0 -19
  43. package/esm2020/lib/models/identity.mjs +0 -49
  44. package/esm2020/lib/models/otp.mjs +0 -11
  45. package/esm2020/lib/models/service-principal.mjs +0 -16
  46. package/esm2020/lib/nucleus-identity-config.mjs +0 -8
  47. package/esm2020/lib/nucleus-identity.module.mjs +0 -28
  48. package/esm2020/lib/nucleus-identity.service.mjs +0 -341
  49. package/esm2020/lib/nucleus-token-interceptor.service.mjs +0 -64
  50. package/esm2020/lib/utils/angular-requestor.mjs +0 -38
  51. package/esm2020/lib/utils/authorization-service-configuration.mjs +0 -23
  52. package/esm2020/lib/utils/location.service.mjs +0 -72
  53. package/esm2020/lib/utils/nucleus-authorization-notifier.mjs +0 -13
  54. package/esm2020/lib/utils/nucleus-crypto.mjs +0 -68
  55. package/esm2020/lib/utils/oidc-configuration.service.mjs +0 -90
  56. package/esm2020/lib/utils/secrets-store.mjs +0 -120
  57. package/esm2020/lib/utils/token-client.mjs +0 -140
  58. package/esm2020/public-api.mjs +0 -11
  59. package/fesm2015/kolektor-nucleus-identity.mjs +0 -1139
  60. package/fesm2015/kolektor-nucleus-identity.mjs.map +0 -1
  61. package/fesm2020/kolektor-nucleus-identity.mjs.map +0 -1
  62. package/lib/utils/nucleus-crypto.d.ts +0 -9
  63. package/public-api.d.ts +0 -7
package/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # nucleus-identity
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
@@ -0,0 +1,7 @@
1
+ export * from './lib/nucleus-identity.module';
2
+ export * from './lib/nucleus-identity.service';
3
+ export * from './lib/nucleus-identity-config';
4
+ export { OtpResponse, OtpStatus, OtpType } from './lib/models/otp';
5
+ export { DeviceCode } from './lib/models/device-code';
6
+ export { ServicePrincipalRegistrationStatus } from './lib/models/service-principal';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL251Y2xldXMtaWRlbnRpdHkubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL251Y2xldXMtaWRlbnRpdHkuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9udWNsZXVzLWlkZW50aXR5LWNvbmZpZyc7XG5leHBvcnQgeyBPdHBSZXNwb25zZSwgT3RwU3RhdHVzLCBPdHBUeXBlIH0gZnJvbSAnLi9saWIvbW9kZWxzL290cCc7XG5leHBvcnQgeyBEZXZpY2VDb2RlIH0gZnJvbSAnLi9saWIvbW9kZWxzL2RldmljZS1jb2RlJztcbmV4cG9ydCB7IFNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb25TdGF0dXMgfSBmcm9tICcuL2xpYi9tb2RlbHMvc2VydmljZS1wcmluY2lwYWwnO1xuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia29sZWt0b3ItbnVjbGV1cy1pZGVudGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmcvbnVjbGV1cy1pZGVudGl0eS9zcmMva29sZWt0b3ItbnVjbGV1cy1pZGVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,8 @@
1
+ export class ClientRegistrationResponse {
2
+ constructor(response) {
3
+ this.clientId = response.client_id;
4
+ this.clientSecret = response.client_secret;
5
+ this.secretExpirationDate = new Date(response.client_secret_expires_at * 1000);
6
+ }
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXJlZ2lzdHJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmcvbnVjbGV1cy1pZGVudGl0eS9zcmMvbGliL21vZGVscy9jbGllbnQtcmVnaXN0cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE1BQU0sT0FBTywwQkFBMEI7SUFDckMsWUFBWSxRQUF3QztRQUNsRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQzNDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLElBQUksQ0FDbEMsUUFBUSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FDekMsQ0FBQztJQUNKLENBQUM7Q0FLRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UmVnaXN0cmF0aW9uUmVzcG9uc2VKc29uIHtcbiAgY2xpZW50X2lkOiBzdHJpbmc7XG4gIGNsaWVudF9zZWNyZXQ6IHN0cmluZztcbiAgY2xpZW50X3NlY3JldF9leHBpcmVzX2F0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBDbGllbnRSZWdpc3RyYXRpb25SZXNwb25zZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBDbGllbnRSZWdpc3RyYXRpb25SZXNwb25zZUpzb24pIHtcbiAgICB0aGlzLmNsaWVudElkID0gcmVzcG9uc2UuY2xpZW50X2lkO1xuICAgIHRoaXMuY2xpZW50U2VjcmV0ID0gcmVzcG9uc2UuY2xpZW50X3NlY3JldDtcbiAgICB0aGlzLnNlY3JldEV4cGlyYXRpb25EYXRlID0gbmV3IERhdGUoXG4gICAgICByZXNwb25zZS5jbGllbnRfc2VjcmV0X2V4cGlyZXNfYXQgKiAxMDAwXG4gICAgKTtcbiAgfVxuXG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIGNsaWVudFNlY3JldDogc3RyaW5nO1xuICBzZWNyZXRFeHBpcmF0aW9uRGF0ZTogRGF0ZTtcbn1cbiJdfQ==
@@ -0,0 +1,19 @@
1
+ import { nowInSeconds } from '@openid/appauth';
2
+ export class DeviceCode {
3
+ constructor(response) {
4
+ this.deviceCode = response.device_code;
5
+ this.userCode = response.user_code;
6
+ this.verificationUrl = response.verification_uri;
7
+ this.verificationUrlComplete = response.verification_uri_complete;
8
+ this.expiresIn = parseInt(response.expires_in, 10);
9
+ this.issuedAt = nowInSeconds();
10
+ }
11
+ isExpired(buffer = 60) {
12
+ return this.secondsLeft(buffer) <= 0;
13
+ }
14
+ secondsLeft(buffer = 60) {
15
+ const now = nowInSeconds();
16
+ return this.issuedAt + this.expiresIn - buffer - now;
17
+ }
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWNvZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi9tb2RlbHMvZGV2aWNlLWNvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBVy9DLE1BQU0sT0FBTyxVQUFVO0lBQ3JCLFlBQVksUUFBd0I7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsUUFBUSxDQUFDLHlCQUF5QixDQUFDO1FBQ2xFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBVUQsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFNLEdBQUcsRUFBRTtRQUNyQixNQUFNLEdBQUcsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ3ZELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vd0luU2Vjb25kcyB9IGZyb20gJ0BvcGVuaWQvYXBwYXV0aCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2aWNlQ29kZUpzb24ge1xuICBkZXZpY2VfY29kZTogc3RyaW5nO1xuICB1c2VyX2NvZGU6IHN0cmluZztcbiAgdmVyaWZpY2F0aW9uX3VyaTogc3RyaW5nO1xuICB2ZXJpZmljYXRpb25fdXJpX2NvbXBsZXRlOiBzdHJpbmc7XG4gIGV4cGlyZXNfaW46IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRGV2aWNlQ29kZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBEZXZpY2VDb2RlSnNvbikge1xuICAgIHRoaXMuZGV2aWNlQ29kZSA9IHJlc3BvbnNlLmRldmljZV9jb2RlO1xuICAgIHRoaXMudXNlckNvZGUgPSByZXNwb25zZS51c2VyX2NvZGU7XG4gICAgdGhpcy52ZXJpZmljYXRpb25VcmwgPSByZXNwb25zZS52ZXJpZmljYXRpb25fdXJpO1xuICAgIHRoaXMudmVyaWZpY2F0aW9uVXJsQ29tcGxldGUgPSByZXNwb25zZS52ZXJpZmljYXRpb25fdXJpX2NvbXBsZXRlO1xuICAgIHRoaXMuZXhwaXJlc0luID0gcGFyc2VJbnQocmVzcG9uc2UuZXhwaXJlc19pbiwgMTApO1xuICAgIHRoaXMuaXNzdWVkQXQgPSBub3dJblNlY29uZHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwaXJlc0luOiBudW1iZXI7XG4gIHByaXZhdGUgaXNzdWVkQXQ6IG51bWJlcjtcblxuICBwdWJsaWMgZGV2aWNlQ29kZTogc3RyaW5nO1xuICBwdWJsaWMgdXNlckNvZGU6IHN0cmluZztcbiAgcHVibGljIHZlcmlmaWNhdGlvblVybDogc3RyaW5nO1xuICBwdWJsaWMgdmVyaWZpY2F0aW9uVXJsQ29tcGxldGU6IHN0cmluZztcblxuICBpc0V4cGlyZWQoYnVmZmVyID0gNjApIHtcbiAgICByZXR1cm4gdGhpcy5zZWNvbmRzTGVmdChidWZmZXIpIDw9IDA7XG4gIH1cblxuICBzZWNvbmRzTGVmdChidWZmZXIgPSA2MCkge1xuICAgIGNvbnN0IG5vdyA9IG5vd0luU2Vjb25kcygpO1xuICAgIHJldHVybiB0aGlzLmlzc3VlZEF0ICsgdGhpcy5leHBpcmVzSW4gLSBidWZmZXIgLSBub3c7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,52 @@
1
+ export class Claim {
2
+ constructor(name, values) {
3
+ this.name = name;
4
+ this.values = values;
5
+ }
6
+ }
7
+ export class Identity {
8
+ constructor(res) {
9
+ this.claims = [];
10
+ if (!res.idToken) {
11
+ throw Error("There is no id token in the token response!");
12
+ }
13
+ const token = this.decodeToken(res.idToken);
14
+ this.name = token.name;
15
+ this.subject = token.sub;
16
+ for (const key in token) {
17
+ if ({}.hasOwnProperty.call(token, key)) {
18
+ let vals = token[key];
19
+ if (!Array.isArray(vals)) {
20
+ vals = [vals];
21
+ }
22
+ const claim = new Claim(key, vals);
23
+ this.claims.push(claim);
24
+ }
25
+ }
26
+ }
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ decodeToken(jwt) {
29
+ if (!jwt) {
30
+ throw new Error('NucleusIdentity: There was no identity token in the response!');
31
+ }
32
+ try {
33
+ const arr = jwt.split('.');
34
+ // var header = arr[0];
35
+ const payload = this.b64DecodeUnicode(arr[1]);
36
+ // var signature = arr[2];
37
+ return JSON.parse(payload);
38
+ }
39
+ catch (error) {
40
+ console.error('Error while decoding identity token', error);
41
+ console.error('Error while decoding identity token JWT', jwt);
42
+ }
43
+ }
44
+ b64DecodeUnicode(str) {
45
+ str = str.replace(/-/g, '+').replace(/_/g, '/'); // Qlector fix :)
46
+ return decodeURIComponent(atob(str)
47
+ .split('')
48
+ .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
49
+ .join(''));
50
+ }
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi9tb2RlbHMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLEtBQUs7SUFJaEIsWUFBWSxJQUFZLEVBQUUsTUFBZ0I7UUFDeEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFFBQVE7SUFNbkIsWUFBWSxHQUFrQjtRQUZ2QixXQUFNLEdBQVksRUFBRSxDQUFDO1FBRzFCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO1lBQ2hCLE1BQU0sS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7U0FDNUQ7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFO1lBQ3ZCLElBQUksRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUN0QyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRXRCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN4QixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDZjtnQkFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3pCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsOERBQThEO0lBQ3RELFdBQVcsQ0FBQyxHQUFXO1FBQzdCLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxDQUNoRSxDQUFDO1NBQ0g7UUFFRCxJQUFJO1lBQ0YsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQix1QkFBdUI7WUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLDBCQUEwQjtZQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQ2xDLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO1FBQ2xFLE9BQU8sa0JBQWtCLENBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUM7YUFDTixLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQ1osQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuUmVzcG9uc2UgfSBmcm9tICdAb3BlbmlkL2FwcGF1dGgnO1xuXG5leHBvcnQgY2xhc3MgQ2xhaW0ge1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgdmFsdWVzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eSB7XG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBzdWJqZWN0OiBzdHJpbmc7XG5cbiAgcHVibGljIGNsYWltczogQ2xhaW1bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHJlczogVG9rZW5SZXNwb25zZSkge1xuICAgIGlmICghcmVzLmlkVG9rZW4pIHtcbiAgICAgIHRocm93IEVycm9yKFwiVGhlcmUgaXMgbm8gaWQgdG9rZW4gaW4gdGhlIHRva2VuIHJlc3BvbnNlIVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZGVjb2RlVG9rZW4ocmVzLmlkVG9rZW4pO1xuXG4gICAgdGhpcy5uYW1lID0gdG9rZW4ubmFtZTtcbiAgICB0aGlzLnN1YmplY3QgPSB0b2tlbi5zdWI7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdG9rZW4pIHtcbiAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRva2VuLCBrZXkpKSB7XG4gICAgICAgIGxldCB2YWxzID0gdG9rZW5ba2V5XTtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFscykpIHtcbiAgICAgICAgICB2YWxzID0gW3ZhbHNdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhaW0gPSBuZXcgQ2xhaW0oa2V5LCB2YWxzKTtcbiAgICAgICAgdGhpcy5jbGFpbXMucHVzaChjbGFpbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBkZWNvZGVUb2tlbihqd3Q6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFqd3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ051Y2xldXNJZGVudGl0eTogVGhlcmUgd2FzIG5vIGlkZW50aXR5IHRva2VuIGluIHRoZSByZXNwb25zZSEnXG4gICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcnIgPSBqd3Quc3BsaXQoJy4nKTtcbiAgICAgIC8vIHZhciBoZWFkZXIgPSBhcnJbMF07XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5iNjREZWNvZGVVbmljb2RlKGFyclsxXSk7XG4gICAgICAvLyB2YXIgc2lnbmF0dXJlID0gYXJyWzJdO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UocGF5bG9hZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGRlY29kaW5nIGlkZW50aXR5IHRva2VuJywgZXJyb3IpO1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgZGVjb2RpbmcgaWRlbnRpdHkgdG9rZW4gSldUJywgand0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGI2NERlY29kZVVuaWNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTsgLy8gUWxlY3RvciBmaXggOilcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KFxuICAgICAgYXRvYihzdHIpXG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcCgoYykgPT4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMikpXG4gICAgICAgIC5qb2luKCcnKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ export class OtpResponse {
2
+ }
3
+ export class OtpStatus {
4
+ }
5
+ export var OtpType;
6
+ (function (OtpType) {
7
+ OtpType[OtpType["SimpleNumbers"] = 0] = "SimpleNumbers";
8
+ OtpType[OtpType["SimpleAlfanumeric"] = 1] = "SimpleAlfanumeric";
9
+ OtpType[OtpType["Complex"] = 2] = "Complex";
10
+ })(OtpType || (OtpType = {}));
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy9udWNsZXVzLWlkZW50aXR5L3NyYy9saWIvbW9kZWxzL290cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sV0FBVztDQUd2QjtBQUVELE1BQU0sT0FBTyxTQUFTO0NBSXJCO0FBRUQsTUFBTSxDQUFOLElBQVksT0FJWDtBQUpELFdBQVksT0FBTztJQUNqQix1REFBaUIsQ0FBQTtJQUNqQiwrREFBcUIsQ0FBQTtJQUNyQiwyQ0FBVyxDQUFBO0FBQ2IsQ0FBQyxFQUpXLE9BQU8sS0FBUCxPQUFPLFFBSWxCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIE90cFJlc3BvbnNlIHtcbiAgcHVibGljIHBhc3N3b3JkITogc3RyaW5nO1xuICBwdWJsaWMgcGFzc3dvcmRJZCE6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE90cFN0YXR1cyB7XG4gIHB1YmxpYyBpc0V4cGlyZWQhOiBib29sZWFuO1xuICBwdWJsaWMgaXNVc2VkITogYm9vbGVhbjtcbiAgcHVibGljIHNlY29uZHNUb0V4cGlyYXRpb24hOiBudW1iZXI7XG59XG5cbmV4cG9ydCBlbnVtIE90cFR5cGUge1xuICBTaW1wbGVOdW1iZXJzID0gMCxcbiAgU2ltcGxlQWxmYW51bWVyaWMgPSAxLFxuICBDb21wbGV4ID0gMixcbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ export class ServicePrincipal {
2
+ }
3
+ export class ServicePrincipalRegistrationStatus {
4
+ constructor(servicePrincipal) {
5
+ this.isRegistered = false;
6
+ if (servicePrincipal) {
7
+ this.isRegistered = true;
8
+ this.id = servicePrincipal.id;
9
+ this.expiresAt = servicePrincipal.expiresAt;
10
+ }
11
+ }
12
+ get isExpired() {
13
+ return false;
14
+ }
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1wcmluY2lwYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi9tb2RlbHMvc2VydmljZS1wcmluY2lwYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGdCQUFnQjtDQUk1QjtBQUVELE1BQU0sT0FBTyxrQ0FBa0M7SUFLN0MsWUFBWSxnQkFBeUM7UUFIOUMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFJMUIsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsRUFBRSxHQUFHLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgU2VydmljZVByaW5jaXBhbCB7XG4gIHB1YmxpYyBpZCE6IHN0cmluZztcbiAgcHVibGljIHNlY3JldCE6IHN0cmluZztcbiAgcHVibGljIGV4cGlyZXNBdCE6IERhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlUHJpbmNpcGFsUmVnaXN0cmF0aW9uU3RhdHVzIHtcbiAgcHVibGljIGlkITogc3RyaW5nO1xuICBwdWJsaWMgaXNSZWdpc3RlcmVkID0gZmFsc2U7XG4gIHB1YmxpYyBleHBpcmVzQXQhOiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNlcnZpY2VQcmluY2lwYWw6IFNlcnZpY2VQcmluY2lwYWwgfCBudWxsKSB7XG4gICAgaWYgKHNlcnZpY2VQcmluY2lwYWwpIHtcbiAgICAgIHRoaXMuaXNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaWQgPSBzZXJ2aWNlUHJpbmNpcGFsLmlkO1xuICAgICAgdGhpcy5leHBpcmVzQXQgPSBzZXJ2aWNlUHJpbmNpcGFsLmV4cGlyZXNBdDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhwaXJlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ export class NucleusIdentityConfig {
2
+ constructor() {
3
+ this.httpInterceptorUrls = [];
4
+ this.automaticLoginOnHttp401 = false;
5
+ }
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1pZGVudGl0eS1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi9udWNsZXVzLWlkZW50aXR5LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8scUJBQXFCO0lBQWxDO1FBV1Msd0JBQW1CLEdBQWMsRUFBRSxDQUFDO1FBRXBDLDRCQUF1QixHQUFHLEtBQUssQ0FBQztJQU96QyxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgTnVjbGV1c0lkZW50aXR5Q29uZmlnIHtcbiAgcHVibGljIGF1dGhvcml0eSE6IHN0cmluZztcblxuICBwdWJsaWMgY2xpZW50SWQhOiBzdHJpbmc7XG5cbiAgcHVibGljIHJlZGlyZWN0VXJpPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBhbmRyb2lkUmVkaXJlY3RVcmk/OiBzdHJpbmc7XG5cbiAgcHVibGljIGlPU1JlZGlyZWN0VXJpPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBodHRwSW50ZXJjZXB0b3JVcmxzPzogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgYXV0b21hdGljTG9naW5Pbkh0dHA0MDEgPSBmYWxzZTtcblxuICBwdWJsaWMgcmVxdWVzdGVkU2NvcGVzPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBzZXJ2aWNlUHJpbmNpcGFsUmVxdWVzdGVkU2NvcGVzPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBhdXRoUHJvdmlkZXJIaW50Pzogc3RyaW5nO1xufVxuIl19
@@ -0,0 +1,32 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { HTTP_INTERCEPTORS } from '@angular/common/http';
3
+ import { NucleusTokenInterceptor } from './nucleus-token-interceptor.service';
4
+ import { NucleusIdentityConfig } from './nucleus-identity-config';
5
+ import * as i0 from "@angular/core";
6
+ export class NucleusIdentityModule {
7
+ static forRoot(config) {
8
+ return {
9
+ ngModule: NucleusIdentityModule,
10
+ providers: [
11
+ { provide: NucleusIdentityConfig, useValue: config },
12
+ {
13
+ provide: HTTP_INTERCEPTORS,
14
+ useClass: NucleusTokenInterceptor,
15
+ multi: true,
16
+ },
17
+ ],
18
+ };
19
+ }
20
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
21
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityModule }); }
22
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityModule }); }
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityModule, decorators: [{
25
+ type: NgModule,
26
+ args: [{
27
+ imports: [],
28
+ declarations: [],
29
+ exports: [],
30
+ }]
31
+ }] });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1pZGVudGl0eS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi9udWNsZXVzLWlkZW50aXR5Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFPbEUsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxNQUFNLENBQUMsT0FBTyxDQUNaLE1BQTZCO1FBRTdCLE9BQU87WUFDTCxRQUFRLEVBQUUscUJBQXFCO1lBQy9CLFNBQVMsRUFBRTtnQkFDVCxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO2dCQUNwRDtvQkFDRSxPQUFPLEVBQUUsaUJBQWlCO29CQUMxQixRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyxLQUFLLEVBQUUsSUFBSTtpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7K0dBZlUscUJBQXFCO2dIQUFyQixxQkFBcUI7Z0hBQXJCLHFCQUFxQjs7NEZBQXJCLHFCQUFxQjtrQkFMakMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsRUFBRTtvQkFDWCxZQUFZLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFLEVBQUU7aUJBQ1oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSFRUUF9JTlRFUkNFUFRPUlMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBOdWNsZXVzVG9rZW5JbnRlcmNlcHRvciB9IGZyb20gJy4vbnVjbGV1cy10b2tlbi1pbnRlcmNlcHRvci5zZXJ2aWNlJztcbmltcG9ydCB7IE51Y2xldXNJZGVudGl0eUNvbmZpZyB9IGZyb20gJy4vbnVjbGV1cy1pZGVudGl0eS1jb25maWcnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXSxcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgZXhwb3J0czogW10sXG59KVxuZXhwb3J0IGNsYXNzIE51Y2xldXNJZGVudGl0eU1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIGNvbmZpZzogTnVjbGV1c0lkZW50aXR5Q29uZmlnXG4gICk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TnVjbGV1c0lkZW50aXR5TW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBOdWNsZXVzSWRlbnRpdHlNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBOdWNsZXVzSWRlbnRpdHlDb25maWcsIHVzZVZhbHVlOiBjb25maWcgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLFxuICAgICAgICAgIHVzZUNsYXNzOiBOdWNsZXVzVG9rZW5JbnRlcmNlcHRvcixcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,350 @@
1
+ import { AuthorizationRequest, RedirectRequestHandler, BasicQueryStringUtils, LocalStorageBackend, AppAuthError, DefaultCrypto, } from '@openid/appauth';
2
+ import { Injectable } from '@angular/core';
3
+ import { App } from '@capacitor/app';
4
+ import { Browser } from '@capacitor/browser';
5
+ import { Device } from '@capacitor/device';
6
+ import { NucleusAppService } from '@kolektor/nucleus-common';
7
+ import { LocationService } from './utils/location.service';
8
+ import { NucleusAuthorizationNotifier } from './utils/nucleus-authorization-notifier';
9
+ import { HttpClient } from '@angular/common/http';
10
+ import { SecretsStore } from './utils/secrets-store';
11
+ import { OidcConfigurationService } from './utils/oidc-configuration.service';
12
+ import { TokenClient } from './utils/token-client';
13
+ import { ServicePrincipalRegistrationStatus } from './models/service-principal';
14
+ import { lastValueFrom } from 'rxjs';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@kolektor/nucleus-common";
17
+ import * as i2 from "./utils/location.service";
18
+ import * as i3 from "@angular/common/http";
19
+ import * as i4 from "./utils/oidc-configuration.service";
20
+ import * as i5 from "./utils/token-client";
21
+ export class NucleusIdentityService {
22
+ constructor(appService, location, http, config, tokenClient) {
23
+ this.appService = appService;
24
+ this.http = http;
25
+ this.config = config;
26
+ this.tokenClient = tokenClient;
27
+ this._authorizationNotifier = new NucleusAuthorizationNotifier();
28
+ this._initStarted = false;
29
+ this._initialized = false;
30
+ this._refreshTokenPromise = null;
31
+ this._getTokenPromise = null;
32
+ this._getServicePrincipalTokenPromise = null;
33
+ this._servicePrincipalTokenId = '_svcp';
34
+ const storage = new LocalStorageBackend();
35
+ this._crypto = new DefaultCrypto();
36
+ this._authorizationHandler = new RedirectRequestHandler(storage, new BasicQueryStringUtils(), location, this._crypto);
37
+ this._authorizationHandler.setAuthorizationNotifier(this._authorizationNotifier);
38
+ this._store = new SecretsStore(config.clientId);
39
+ }
40
+ get identity() {
41
+ return this._store.getIdentity();
42
+ }
43
+ get isAuthenticated() {
44
+ return this.identity != null;
45
+ }
46
+ get servicePrincipalIdentity() {
47
+ return this._store.getIdentity(this._servicePrincipalTokenId);
48
+ }
49
+ get isServicePrincipalAuthenticated() {
50
+ return this.servicePrincipalIdentity != null;
51
+ }
52
+ get isIdentityServicePrincipal() {
53
+ return this._store.defaultIdentityId === this._servicePrincipalTokenId;
54
+ }
55
+ async init(startLogin = false) {
56
+ if (this._initStarted || this._initialized) {
57
+ console.warn("Nucleus.Identity: Auth initialization was already started. Don't call init() multiple times!");
58
+ return;
59
+ }
60
+ this._initStarted = true;
61
+ this.handleLaunchCodeHash();
62
+ await this._authorizationHandler.completeAuthorizationRequestIfPossible();
63
+ const authErr = this._authorizationNotifier.error;
64
+ if (authErr) {
65
+ throw new Error('Authorization err: ' + authErr.error + ': ' + authErr.errorDescription);
66
+ }
67
+ else if (this._authorizationNotifier.response) {
68
+ window.location.hash = '';
69
+ const request = this._authorizationNotifier.request;
70
+ const response = this._authorizationNotifier.response;
71
+ const codeVerifier = (request.internal) ? request.internal['code_verifier'] : undefined;
72
+ const res = await this.tokenClient.getByAuthorizationCode(request.redirectUri, response.code, codeVerifier);
73
+ this._store.setDefaultIdentityId(null);
74
+ await this._store.setToken(res);
75
+ }
76
+ else {
77
+ const res = await this._store.getToken();
78
+ if (!res && startLogin) {
79
+ await this.login();
80
+ }
81
+ }
82
+ this._initialized = true;
83
+ }
84
+ async loginWithSecret(provider, secret) {
85
+ this._store.removeToken();
86
+ const assertionToken = await this.getServicePrincipalAccessToken();
87
+ const scope = this.prepareScope(true, this.config?.requestedScopes);
88
+ const res = await this.tokenClient.getBySecret(provider, secret, assertionToken, scope);
89
+ this._store.setDefaultIdentityId(null);
90
+ await this._store.setToken(res);
91
+ }
92
+ async login() {
93
+ this._store.removeToken();
94
+ const config = await this.config.getConfiguration();
95
+ const request = this.prepareAuthorizationRequest();
96
+ if (this.appService.isNative) {
97
+ const listener = App.addListener('appUrlOpen', (data) => {
98
+ if (this.appService.platform === 'ios') {
99
+ Browser.close();
100
+ }
101
+ listener.remove();
102
+ const hash = this.getCodeHash(data.url);
103
+ if (hash) {
104
+ const targetUrl = window.location.origin + window.location.pathname + '#' + hash;
105
+ window.location.assign(targetUrl);
106
+ window.location.reload();
107
+ }
108
+ else {
109
+ console.warn('Nucleus.Identity: Redirect url did not contain authorization code!', data);
110
+ }
111
+ });
112
+ }
113
+ this._authorizationHandler.performAuthorizationRequest(config, request);
114
+ }
115
+ async logout() {
116
+ this._store.removeToken();
117
+ const config = await this.config.getConfiguration();
118
+ const redirectUrl = this.config.redirectUrl;
119
+ const logoutUrl = config.endSessionEndpoint +
120
+ '?post_logout_redirect_uri=' +
121
+ encodeURI(redirectUrl);
122
+ if (this.appService.isNative) {
123
+ const listener = App.addListener('appUrlOpen', () => {
124
+ Device.getInfo().then((info) => {
125
+ if (info.platform === 'ios') {
126
+ Browser.close();
127
+ }
128
+ });
129
+ listener.remove();
130
+ });
131
+ Browser.open({ url: logoutUrl });
132
+ }
133
+ else {
134
+ window.location.assign(logoutUrl);
135
+ }
136
+ }
137
+ async getAccessToken() {
138
+ if (!this._getTokenPromise) {
139
+ this._getTokenPromise = this.getAccessTokenInternal();
140
+ }
141
+ try {
142
+ return await this._getTokenPromise;
143
+ }
144
+ finally {
145
+ this._getTokenPromise = null;
146
+ }
147
+ }
148
+ async getServicePrincipalAccessToken() {
149
+ if (!this._getServicePrincipalTokenPromise) {
150
+ this._getServicePrincipalTokenPromise =
151
+ this.getServicePrincipalAccessTokenInternal();
152
+ }
153
+ try {
154
+ return await this._getServicePrincipalTokenPromise;
155
+ }
156
+ finally {
157
+ this._getServicePrincipalTokenPromise = null;
158
+ }
159
+ }
160
+ async loginServicePrincipal() {
161
+ const sp = await this._store.getServicePrincipal();
162
+ if (sp) {
163
+ const scope = this.prepareScope(false, this.config.servicePrincipalRequestedScopes);
164
+ const res = await this.tokenClient.getByClientCredentials(sp.id, sp.secret, scope);
165
+ await this._store.setToken(res, this._servicePrincipalTokenId);
166
+ return res;
167
+ }
168
+ else {
169
+ throw Error('Service principal is not registered!');
170
+ }
171
+ }
172
+ async loginAsServicePrincipal() {
173
+ const token = await this._store.getToken(this._servicePrincipalTokenId);
174
+ if (!token) {
175
+ await this.loginServicePrincipal();
176
+ }
177
+ this._store.setDefaultIdentityId(this._servicePrincipalTokenId);
178
+ }
179
+ async getOtp(type, expiresIn = -1) {
180
+ let url = this.config.getServerUrl(`/otp/create?type=${type}`);
181
+ if (expiresIn > 0) {
182
+ url += `&expiresIn=${expiresIn}`;
183
+ }
184
+ return lastValueFrom(this.http.get(url));
185
+ }
186
+ async getOtpStatus(id) {
187
+ const url = this.config.getServerUrl(`/otp/status/${id}`);
188
+ return lastValueFrom(this.http.get(url));
189
+ }
190
+ getOtpUrl(redirectUrl, password) {
191
+ const encoded = encodeURIComponent(redirectUrl);
192
+ const url = `/otp/auth?otpValue=${password}&returnUrl=${encoded}`;
193
+ return this.config.getServerUrl(url);
194
+ }
195
+ async startServicePrincipalRegistration() {
196
+ const sp = await this._store.getServicePrincipal();
197
+ return await this.tokenClient.getRegistrationCode(sp?.id);
198
+ }
199
+ async completeServicePrincipalRegistration(deviceCode) {
200
+ const tokenRes = await this.waitForDeviceToken(deviceCode);
201
+ const regRes = await this.tokenClient.registerServicePrincipal(tokenRes.accessToken);
202
+ await this._store.setServicePrincipal({
203
+ id: regRes.clientId,
204
+ secret: regRes.clientSecret,
205
+ expiresAt: regRes.secretExpirationDate,
206
+ });
207
+ }
208
+ removeServicePrincipalRegistration() {
209
+ return this._store.removeServicePrincipal();
210
+ }
211
+ async getServicePrincipalRegistrationStatus() {
212
+ const sp = await this._store.getServicePrincipal();
213
+ return new ServicePrincipalRegistrationStatus(sp);
214
+ }
215
+ async startDeviceCodeLogin() {
216
+ const scope = this.prepareScope(true, this.config.requestedScopes);
217
+ return await this.tokenClient.getDeviceCode(scope);
218
+ }
219
+ async completeDeviceCodeLogin(deviceCode) {
220
+ const res = await this.waitForDeviceToken(deviceCode);
221
+ await this._store.setToken(res);
222
+ }
223
+ async waitForDeviceToken(deviceCode) {
224
+ let res = null;
225
+ do {
226
+ if (deviceCode.isExpired()) {
227
+ throw Error('Device code is expired!');
228
+ }
229
+ try {
230
+ res = await this.tokenClient.getByDeviceCode(deviceCode.deviceCode);
231
+ }
232
+ catch (error) {
233
+ if (error instanceof AppAuthError &&
234
+ error.message === 'authorization_pending') {
235
+ await this.delay(2000);
236
+ }
237
+ else {
238
+ throw error;
239
+ }
240
+ }
241
+ } while (!res);
242
+ return res;
243
+ }
244
+ prepareAuthorizationRequest() {
245
+ const redirectUri = this.config.redirectUrl;
246
+ const params = {
247
+ response_mode: 'fragment',
248
+ prompt: 'consent',
249
+ access_type: 'offline',
250
+ auth_provider_hint: this.config.authProviderHint,
251
+ };
252
+ return new AuthorizationRequest({
253
+ client_id: this.config.clientId,
254
+ redirect_uri: redirectUri,
255
+ response_type: AuthorizationRequest.RESPONSE_TYPE_CODE,
256
+ scope: this.prepareScope(true, this.config.requestedScopes),
257
+ extras: params,
258
+ }, this._crypto, true);
259
+ }
260
+ async getServicePrincipalAccessTokenInternal() {
261
+ let token = await this._store.getToken(this._servicePrincipalTokenId);
262
+ if (!token?.isValid()) {
263
+ token = await this.loginServicePrincipal();
264
+ }
265
+ return token?.accessToken;
266
+ }
267
+ async getAccessTokenInternal() {
268
+ let token = await this._store.getToken();
269
+ if (token && !token.isValid()) {
270
+ token = await this.loginWithRefreshToken(token);
271
+ }
272
+ return token?.accessToken ?? null;
273
+ }
274
+ async loginWithRefreshToken(token) {
275
+ if (!this._refreshTokenPromise) {
276
+ this._refreshTokenPromise = this.loginWithRefreshTokenInternal(token);
277
+ }
278
+ try {
279
+ return await this._refreshTokenPromise;
280
+ }
281
+ finally {
282
+ this._refreshTokenPromise = null;
283
+ }
284
+ }
285
+ async loginWithRefreshTokenInternal(token) {
286
+ if (token?.refreshToken) {
287
+ try {
288
+ const res = await this.tokenClient.getByRefreshToken(token.refreshToken);
289
+ await this._store.setToken(res);
290
+ return res;
291
+ }
292
+ catch (err) {
293
+ console.warn('Nucleus.Identity: Failed to login with refresh token.', err);
294
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
295
+ if (err.message === 'invalid_grant') {
296
+ await this.logout();
297
+ }
298
+ }
299
+ }
300
+ else {
301
+ console.warn('Nucleus.Identity: There is no refresh token available.');
302
+ }
303
+ return null;
304
+ }
305
+ getCodeHash(url) {
306
+ const arr = url.split('#');
307
+ if (arr.length > 1) {
308
+ const hash = arr[1];
309
+ if (hash.startsWith('code=')) {
310
+ return hash;
311
+ }
312
+ }
313
+ return null;
314
+ }
315
+ handleLaunchCodeHash() {
316
+ if (this.appService.isNative && this.appService.launchUrl) {
317
+ const hash = this.getCodeHash(this.appService.launchUrl);
318
+ if (hash) {
319
+ console.log('Nucleus.Identity: Got authorization code from launchUrl, will assign it to hash.');
320
+ window.location.hash = '#' + hash;
321
+ }
322
+ }
323
+ }
324
+ prepareScope(offlineAccess, aditionalScope) {
325
+ let scope = 'openid';
326
+ if (offlineAccess) {
327
+ scope += ' offline_access';
328
+ }
329
+ if (aditionalScope) {
330
+ scope += ' ' + aditionalScope;
331
+ }
332
+ return scope;
333
+ }
334
+ delay(miliseconds) {
335
+ return new Promise((resolve) => {
336
+ setTimeout(() => {
337
+ resolve();
338
+ }, miliseconds);
339
+ });
340
+ }
341
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityService, deps: [{ token: i1.NucleusAppService }, { token: i2.LocationService }, { token: i3.HttpClient }, { token: i4.OidcConfigurationService }, { token: i5.TokenClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
342
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityService, providedIn: 'root' }); }
343
+ }
344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityService, decorators: [{
345
+ type: Injectable,
346
+ args: [{
347
+ providedIn: 'root',
348
+ }]
349
+ }], ctorParameters: function () { return [{ type: i1.NucleusAppService }, { type: i2.LocationService }, { type: i3.HttpClient }, { type: i4.OidcConfigurationService }, { type: i5.TokenClient }]; } });
350
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1pZGVudGl0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy9udWNsZXVzLWlkZW50aXR5L3NyYy9saWIvbnVjbGV1cy1pZGVudGl0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxvQkFBb0IsRUFHcEIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsWUFBWSxFQUNaLGFBQWEsR0FFZCxNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUFLckMsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxZQUNVLFVBQTZCLEVBQ3JD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QUFDLEdBQUcsQ0FDVCxrRkFBa0YsQ0FDbkYsQ0FBQztnQkFDRixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO2FBQ25DO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLGFBQXNCLEVBQUUsY0FBdUI7UUFDbEUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ3JCLElBQUksYUFBYSxFQUFFO1lBQ2pCLEtBQUssSUFBSSxpQkFBaUIsQ0FBQztTQUM1QjtRQUNELElBQUksY0FBYyxFQUFFO1lBQ2xCLEtBQUssSUFBSSxHQUFHLEdBQUcsY0FBYyxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQW1CO1FBQy9CLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0EzWVUsc0JBQXNCO21IQUF0QixzQkFBc0IsY0FGckIsTUFBTTs7NEZBRVAsc0JBQXNCO2tCQUhsQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25SZXF1ZXN0LFxuICBUb2tlblJlc3BvbnNlLFxuICBDcnlwdG8sXG4gIFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIsXG4gIEJhc2ljUXVlcnlTdHJpbmdVdGlscyxcbiAgTG9jYWxTdG9yYWdlQmFja2VuZCxcbiAgQXBwQXV0aEVycm9yLFxuICBEZWZhdWx0Q3J5cHRvLFxuICBTdHJpbmdNYXAsXG59IGZyb20gJ0BvcGVuaWQvYXBwYXV0aCc7XG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJ0BjYXBhY2l0b3IvYXBwJztcbmltcG9ydCB7IEJyb3dzZXIgfSBmcm9tICdAY2FwYWNpdG9yL2Jyb3dzZXInO1xuaW1wb3J0IHsgRGV2aWNlIH0gZnJvbSAnQGNhcGFjaXRvci9kZXZpY2UnO1xuaW1wb3J0IHsgTnVjbGV1c0FwcFNlcnZpY2UgfSBmcm9tICdAa29sZWt0b3IvbnVjbGV1cy1jb21tb24nO1xuaW1wb3J0IHsgTG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi91dGlscy9sb2NhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhvcml6YXRpb25SZXF1ZXN0SGFuZGxlciB9IGZyb20gJ0BvcGVuaWQvYXBwYXV0aCc7XG5pbXBvcnQgeyBOdWNsZXVzQXV0aG9yaXphdGlvbk5vdGlmaWVyIH0gZnJvbSAnLi91dGlscy9udWNsZXVzLWF1dGhvcml6YXRpb24tbm90aWZpZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE90cFJlc3BvbnNlLCBPdHBTdGF0dXMsIE90cFR5cGUgfSBmcm9tICcuL21vZGVscy9vdHAnO1xuaW1wb3J0IHsgU2VjcmV0c1N0b3JlIH0gZnJvbSAnLi91dGlscy9zZWNyZXRzLXN0b3JlJztcbmltcG9ydCB7IE9pZGNDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4vdXRpbHMvb2lkYy1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9rZW5DbGllbnQgfSBmcm9tICcuL3V0aWxzL3Rva2VuLWNsaWVudCc7XG5pbXBvcnQgeyBEZXZpY2VDb2RlIH0gZnJvbSAnLi9tb2RlbHMvZGV2aWNlLWNvZGUnO1xuaW1wb3J0IHsgU2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvblN0YXR1cyB9IGZyb20gJy4vbW9kZWxzL3NlcnZpY2UtcHJpbmNpcGFsJztcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE51Y2xldXNJZGVudGl0eVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFwcFNlcnZpY2U6IE51Y2xldXNBcHBTZXJ2aWNlLFxuICAgIGxvY2F0aW9uOiBMb2NhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgY29uZmlnOiBPaWRjQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2tlbkNsaWVudDogVG9rZW5DbGllbnRcbiAgKSB7XG4gICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBMb2NhbFN0b3JhZ2VCYWNrZW5kKCk7XG4gICAgdGhpcy5fY3J5cHRvID0gbmV3IERlZmF1bHRDcnlwdG8oKTtcbiAgICB0aGlzLl9hdXRob3JpemF0aW9uSGFuZGxlciA9IG5ldyBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyKFxuICAgICAgc3RvcmFnZSxcbiAgICAgIG5ldyBCYXNpY1F1ZXJ5U3RyaW5nVXRpbHMoKSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgdGhpcy5fY3J5cHRvXG4gICAgKTtcbiAgICB0aGlzLl9hdXRob3JpemF0aW9uSGFuZGxlci5zZXRBdXRob3JpemF0aW9uTm90aWZpZXIoXG4gICAgICB0aGlzLl9hdXRob3JpemF0aW9uTm90aWZpZXJcbiAgICApO1xuICAgIHRoaXMuX3N0b3JlID0gbmV3IFNlY3JldHNTdG9yZShjb25maWcuY2xpZW50SWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0aG9yaXphdGlvbkhhbmRsZXI6IEF1dGhvcml6YXRpb25SZXF1ZXN0SGFuZGxlcjtcbiAgcHJpdmF0ZSBfYXV0aG9yaXphdGlvbk5vdGlmaWVyID0gbmV3IE51Y2xldXNBdXRob3JpemF0aW9uTm90aWZpZXIoKTtcbiAgcHJpdmF0ZSBfY3J5cHRvOiBDcnlwdG87XG4gIHByaXZhdGUgX2luaXRTdGFydGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgX3JlZnJlc2hUb2tlblByb21pc2U6IFByb21pc2U8VG9rZW5SZXNwb25zZSB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2dldFRva2VuUHJvbWlzZTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9nZXRTZXJ2aWNlUHJpbmNpcGFsVG9rZW5Qcm9taXNlOiBQcm9taXNlPHN0cmluZz4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc2VydmljZVByaW5jaXBhbFRva2VuSWQgPSAnX3N2Y3AnO1xuICBwcml2YXRlIF9zdG9yZTogU2VjcmV0c1N0b3JlO1xuXG4gIHB1YmxpYyBnZXQgaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldElkZW50aXR5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQXV0aGVudGljYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eSAhPSBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCBzZXJ2aWNlUHJpbmNpcGFsSWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldElkZW50aXR5KHRoaXMuX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNTZXJ2aWNlUHJpbmNpcGFsQXV0aGVudGljYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlUHJpbmNpcGFsSWRlbnRpdHkgIT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNJZGVudGl0eVNlcnZpY2VQcmluY2lwYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmRlZmF1bHRJZGVudGl0eUlkID09PSB0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsVG9rZW5JZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbml0KHN0YXJ0TG9naW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9pbml0U3RhcnRlZCB8fCB0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIk51Y2xldXMuSWRlbnRpdHk6IEF1dGggaW5pdGlhbGl6YXRpb24gd2FzIGFscmVhZHkgc3RhcnRlZC4gRG9uJ3QgY2FsbCBpbml0KCkgbXVsdGlwbGUgdGltZXMhXCJcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2luaXRTdGFydGVkID0gdHJ1ZTtcblxuICAgIHRoaXMuaGFuZGxlTGF1bmNoQ29kZUhhc2goKTtcbiAgICBhd2FpdCB0aGlzLl9hdXRob3JpemF0aW9uSGFuZGxlci5jb21wbGV0ZUF1dGhvcml6YXRpb25SZXF1ZXN0SWZQb3NzaWJsZSgpO1xuXG4gICAgY29uc3QgYXV0aEVyciA9IHRoaXMuX2F1dGhvcml6YXRpb25Ob3RpZmllci5lcnJvcjtcbiAgICBpZiAoYXV0aEVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQXV0aG9yaXphdGlvbiBlcnI6ICcgKyBhdXRoRXJyLmVycm9yICsgJzogJyArIGF1dGhFcnIuZXJyb3JEZXNjcmlwdGlvblxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2F1dGhvcml6YXRpb25Ob3RpZmllci5yZXNwb25zZSkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnJztcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9hdXRob3JpemF0aW9uTm90aWZpZXIucmVxdWVzdDtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5fYXV0aG9yaXphdGlvbk5vdGlmaWVyLnJlc3BvbnNlO1xuXG4gICAgICBjb25zdCBjb2RlVmVyaWZpZXIgPSAocmVxdWVzdC5pbnRlcm5hbCkgPyByZXF1ZXN0LmludGVybmFsWydjb2RlX3ZlcmlmaWVyJ10gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5QXV0aG9yaXphdGlvbkNvZGUocmVxdWVzdC5yZWRpcmVjdFVyaSwgcmVzcG9uc2UuY29kZSwgY29kZVZlcmlmaWVyKTtcbiAgICAgIHRoaXMuX3N0b3JlLnNldERlZmF1bHRJZGVudGl0eUlkKG51bGwpO1xuICAgICAgYXdhaXQgdGhpcy5fc3RvcmUuc2V0VG9rZW4ocmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0VG9rZW4oKTtcbiAgICAgIGlmICghcmVzICYmIHN0YXJ0TG9naW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dpbigpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9naW5XaXRoU2VjcmV0KFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgc2VjcmV0OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fc3RvcmUucmVtb3ZlVG9rZW4oKTtcbiAgICBjb25zdCBhc3NlcnRpb25Ub2tlbiA9IGF3YWl0IHRoaXMuZ2V0U2VydmljZVByaW5jaXBhbEFjY2Vzc1Rva2VuKCk7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLnByZXBhcmVTY29wZSh0cnVlLCB0aGlzLmNvbmZpZz8ucmVxdWVzdGVkU2NvcGVzKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5U2VjcmV0KFxuICAgICAgcHJvdmlkZXIsXG4gICAgICBzZWNyZXQsXG4gICAgICBhc3NlcnRpb25Ub2tlbixcbiAgICAgIHNjb3BlXG4gICAgKTtcbiAgICB0aGlzLl9zdG9yZS5zZXREZWZhdWx0SWRlbnRpdHlJZChudWxsKTtcbiAgICBhd2FpdCB0aGlzLl9zdG9yZS5zZXRUb2tlbihyZXMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvZ2luKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX3N0b3JlLnJlbW92ZVRva2VuKCk7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5jb25maWcuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnByZXBhcmVBdXRob3JpemF0aW9uUmVxdWVzdCgpO1xuICAgIGlmICh0aGlzLmFwcFNlcnZpY2UuaXNOYXRpdmUpIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gQXBwLmFkZExpc3RlbmVyKCdhcHBVcmxPcGVuJywgKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYXBwU2VydmljZS5wbGF0Zm9ybSA9PT0gJ2lvcycpIHtcbiAgICAgICAgICBCcm93c2VyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAgIGNvbnN0IGhhc2ggPSB0aGlzLmdldENvZGVIYXNoKGRhdGEudXJsKTtcbiAgICAgICAgaWYgKGhhc2gpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRVcmwgPVxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArICcjJyArIGhhc2g7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih0YXJnZXRVcmwpO1xuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnTnVjbGV1cy5JZGVudGl0eTogUmVkaXJlY3QgdXJsIGRpZCBub3QgY29udGFpbiBhdXRob3JpemF0aW9uIGNvZGUhJyxcbiAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fYXV0aG9yaXphdGlvbkhhbmRsZXIucGVyZm9ybUF1dGhvcml6YXRpb25SZXF1ZXN0KGNvbmZpZywgcmVxdWVzdCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX3N0b3JlLnJlbW92ZVRva2VuKCk7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5jb25maWcuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gdGhpcy5jb25maWcucmVkaXJlY3RVcmw7XG4gICAgY29uc3QgbG9nb3V0VXJsID1cbiAgICAgIGNvbmZpZy5lbmRTZXNzaW9uRW5kcG9pbnQgK1xuICAgICAgJz9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk9JyArXG4gICAgICBlbmNvZGVVUkkocmVkaXJlY3RVcmwpO1xuICAgIGlmICh0aGlzLmFwcFNlcnZpY2UuaXNOYXRpdmUpIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gQXBwLmFkZExpc3RlbmVyKCdhcHBVcmxPcGVuJywgKCkgPT4ge1xuICAgICAgICBEZXZpY2UuZ2V0SW5mbygpLnRoZW4oKGluZm8pID0+IHtcbiAgICAgICAgICBpZiAoaW5mby5wbGF0Zm9ybSA9PT0gJ2lvcycpIHtcbiAgICAgICAgICAgIEJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgICAgQnJvd3Nlci5vcGVuKHsgdXJsOiBsb2dvdXRVcmwgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24obG9nb3V0VXJsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWNjZXNzVG9rZW4oKSB7XG4gICAgaWYgKCF0aGlzLl9nZXRUb2tlblByb21pc2UpIHtcbiAgICAgIHRoaXMuX2dldFRva2VuUHJvbWlzZSA9IHRoaXMuZ2V0QWNjZXNzVG9rZW5JbnRlcm5hbCgpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2dldFRva2VuUHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fZ2V0VG9rZW5Qcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U2VydmljZVByaW5jaXBhbEFjY2Vzc1Rva2VuKCkge1xuICAgIGlmICghdGhpcy5fZ2V0U2VydmljZVByaW5jaXBhbFRva2VuUHJvbWlzZSkge1xuICAgICAgdGhpcy5fZ2V0U2VydmljZVByaW5jaXBhbFRva2VuUHJvbWlzZSA9XG4gICAgICAgIHRoaXMuZ2V0U2VydmljZVByaW5jaXBhbEFjY2Vzc1Rva2VuSW50ZXJuYWwoKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZXRTZXJ2aWNlUHJpbmNpcGFsVG9rZW5Qcm9taXNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9nZXRTZXJ2aWNlUHJpbmNpcGFsVG9rZW5Qcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9naW5TZXJ2aWNlUHJpbmNpcGFsKCkge1xuICAgIGNvbnN0IHNwID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0U2VydmljZVByaW5jaXBhbCgpO1xuICAgIGlmIChzcCkge1xuICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLnByZXBhcmVTY29wZShmYWxzZSwgdGhpcy5jb25maWcuc2VydmljZVByaW5jaXBhbFJlcXVlc3RlZFNjb3Blcyk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5Q2xpZW50Q3JlZGVudGlhbHMoXG4gICAgICAgIHNwLmlkLFxuICAgICAgICBzcC5zZWNyZXQsXG4gICAgICAgIHNjb3BlXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5fc3RvcmUuc2V0VG9rZW4ocmVzLCB0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsVG9rZW5JZCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcignU2VydmljZSBwcmluY2lwYWwgaXMgbm90IHJlZ2lzdGVyZWQhJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvZ2luQXNTZXJ2aWNlUHJpbmNpcGFsKCkge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0VG9rZW4odGhpcy5fc2VydmljZVByaW5jaXBhbFRva2VuSWQpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIGF3YWl0IHRoaXMubG9naW5TZXJ2aWNlUHJpbmNpcGFsKCk7XG4gICAgfVxuICAgIHRoaXMuX3N0b3JlLnNldERlZmF1bHRJZGVudGl0eUlkKHRoaXMuX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRPdHAodHlwZTogT3RwVHlwZSwgZXhwaXJlc0luID0gLTEpIHtcbiAgICBsZXQgdXJsID0gdGhpcy5jb25maWcuZ2V0U2VydmVyVXJsKGAvb3RwL2NyZWF0ZT90eXBlPSR7dHlwZX1gKTtcbiAgICBpZiAoZXhwaXJlc0luID4gMCkge1xuICAgICAgdXJsICs9IGAmZXhwaXJlc0luPSR7ZXhwaXJlc0lufWA7XG4gICAgfVxuICAgIHJldHVybiBsYXN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8T3RwUmVzcG9uc2U+KHVybCkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldE90cFN0YXR1cyhpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jb25maWcuZ2V0U2VydmVyVXJsKGAvb3RwL3N0YXR1cy8ke2lkfWApO1xuICAgIHJldHVybiBsYXN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8T3RwU3RhdHVzPih1cmwpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdHBVcmwocmVkaXJlY3RVcmw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykge1xuICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQocmVkaXJlY3RVcmwpO1xuICAgIGNvbnN0IHVybCA9IGAvb3RwL2F1dGg/b3RwVmFsdWU9JHtwYXNzd29yZH0mcmV0dXJuVXJsPSR7ZW5jb2RlZH1gO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZXRTZXJ2ZXJVcmwodXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb24oKSB7XG4gICAgY29uc3Qgc3AgPSBhd2FpdCB0aGlzLl9zdG9yZS5nZXRTZXJ2aWNlUHJpbmNpcGFsKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudG9rZW5DbGllbnQuZ2V0UmVnaXN0cmF0aW9uQ29kZShzcD8uaWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbXBsZXRlU2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvbihkZXZpY2VDb2RlOiBEZXZpY2VDb2RlKSB7XG4gICAgY29uc3QgdG9rZW5SZXMgPSBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VUb2tlbihkZXZpY2VDb2RlKTtcbiAgICBjb25zdCByZWdSZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LnJlZ2lzdGVyU2VydmljZVByaW5jaXBhbChcbiAgICAgIHRva2VuUmVzLmFjY2Vzc1Rva2VuXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuX3N0b3JlLnNldFNlcnZpY2VQcmluY2lwYWwoe1xuICAgICAgaWQ6IHJlZ1Jlcy5jbGllbnRJZCxcbiAgICAgIHNlY3JldDogcmVnUmVzLmNsaWVudFNlY3JldCxcbiAgICAgIGV4cGlyZXNBdDogcmVnUmVzLnNlY3JldEV4cGlyYXRpb25EYXRlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZVNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLnJlbW92ZVNlcnZpY2VQcmluY2lwYWwoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTZXJ2aWNlUHJpbmNpcGFsUmVnaXN0cmF0aW9uU3RhdHVzKCkge1xuICAgIGNvbnN0IHNwID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0U2VydmljZVByaW5jaXBhbCgpO1xuICAgIHJldHVybiBuZXcgU2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvblN0YXR1cyhzcCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnREZXZpY2VDb2RlTG9naW4oKSB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLnByZXBhcmVTY29wZSh0cnVlLCB0aGlzLmNvbmZpZy5yZXF1ZXN0ZWRTY29wZXMpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldERldmljZUNvZGUoc2NvcGUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbXBsZXRlRGV2aWNlQ29kZUxvZ2luKGRldmljZUNvZGU6IERldmljZUNvZGUpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VUb2tlbihkZXZpY2VDb2RlKTtcbiAgICBhd2FpdCB0aGlzLl9zdG9yZS5zZXRUb2tlbihyZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yRGV2aWNlVG9rZW4oZGV2aWNlQ29kZTogRGV2aWNlQ29kZSkge1xuICAgIGxldCByZXM6IFRva2VuUmVzcG9uc2UgfCBudWxsID0gbnVsbDtcbiAgICBkbyB7XG4gICAgICBpZiAoZGV2aWNlQ29kZS5pc0V4cGlyZWQoKSkge1xuICAgICAgICB0aHJvdyBFcnJvcignRGV2aWNlIGNvZGUgaXMgZXhwaXJlZCEnKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy50b2tlbkNsaWVudC5nZXRCeURldmljZUNvZGUoZGV2aWNlQ29kZS5kZXZpY2VDb2RlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEFwcEF1dGhFcnJvciAmJlxuICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPT09ICdhdXRob3JpemF0aW9uX3BlbmRpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsYXkoMjAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlICghcmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlQXV0aG9yaXphdGlvblJlcXVlc3QoKTogQXV0aG9yaXphdGlvblJlcXVlc3Qge1xuICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gdGhpcy5jb25maWcucmVkaXJlY3RVcmw7XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICByZXNwb25zZV9tb2RlOiAnZnJhZ21lbnQnLFxuICAgICAgcHJvbXB0OiAnY29uc2VudCcsXG4gICAgICBhY2Nlc3NfdHlwZTogJ29mZmxpbmUnLFxuICAgICAgYXV0aF9wcm92aWRlcl9oaW50OiB0aGlzLmNvbmZpZy5hdXRoUHJvdmlkZXJIaW50LFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25SZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuY29uZmlnLmNsaWVudElkLFxuICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxuICAgICAgICByZXNwb25zZV90eXBlOiBBdXRob3JpemF0aW9uUmVxdWVzdC5SRVNQT05TRV9UWVBFX0NPREUsXG4gICAgICAgIHNjb3BlOiB0aGlzLnByZXBhcmVTY29wZSh0cnVlLCB0aGlzLmNvbmZpZy5yZXF1ZXN0ZWRTY29wZXMpLFxuICAgICAgICBleHRyYXM6IHBhcmFtcyBhcyBTdHJpbmdNYXAsXG4gICAgICB9LFxuICAgICAgdGhpcy5fY3J5cHRvLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFNlcnZpY2VQcmluY2lwYWxBY2Nlc3NUb2tlbkludGVybmFsKCkge1xuICAgIGxldCB0b2tlbiA9IGF3YWl0IHRoaXMuX3N0b3JlLmdldFRva2VuKHRoaXMuX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkKTtcbiAgICBpZiAoIXRva2VuPy5pc1ZhbGlkKCkpIHtcbiAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5sb2dpblNlcnZpY2VQcmluY2lwYWwoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuPy5hY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWNjZXNzVG9rZW5JbnRlcm5hbCgpIHtcbiAgICBsZXQgdG9rZW4gPSBhd2FpdCB0aGlzLl9zdG9yZS5nZXRUb2tlbigpO1xuICAgIGlmICh0b2tlbiAmJiAhdG9rZW4uaXNWYWxpZCgpKSB7XG4gICAgICB0b2tlbiA9IGF3YWl0IHRoaXMubG9naW5XaXRoUmVmcmVzaFRva2VuKHRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuPy5hY2Nlc3NUb2tlbiA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2dpbldpdGhSZWZyZXNoVG9rZW4odG9rZW46IFRva2VuUmVzcG9uc2UpIHtcbiAgICBpZiAoIXRoaXMuX3JlZnJlc2hUb2tlblByb21pc2UpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hUb2tlblByb21pc2UgPSB0aGlzLmxvZ2luV2l0aFJlZnJlc2hUb2tlbkludGVybmFsKHRva2VuKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZWZyZXNoVG9rZW5Qcm9taXNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9yZWZyZXNoVG9rZW5Qcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvZ2luV2l0aFJlZnJlc2hUb2tlbkludGVybmFsKHRva2VuOiBUb2tlblJlc3BvbnNlKSB7XG4gICAgaWYgKHRva2VuPy5yZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMudG9rZW5DbGllbnQuZ2V0QnlSZWZyZXNoVG9rZW4oXG4gICAgICAgICAgdG9rZW4ucmVmcmVzaFRva2VuXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3N0b3JlLnNldFRva2VuKHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdOdWNsZXVzLklkZW50aXR5OiBGYWlsZWQgdG8gbG9naW4gd2l0aCByZWZyZXNoIHRva2VuLicsXG4gICAgICAgICAgZXJyXG4gICAgICAgICk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGlmICgoZXJyIGFzIGFueSkubWVzc2FnZSA9PT0gJ2ludmFsaWRfZ3JhbnQnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2dvdXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ051Y2xldXMuSWRlbnRpdHk6IFRoZXJlIGlzIG5vIHJlZnJlc2ggdG9rZW4gYXZhaWxhYmxlLicpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29kZUhhc2godXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcnIgPSB1cmwuc3BsaXQoJyMnKTtcbiAgICBpZiAoYXJyLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGhhc2ggPSBhcnJbMV07XG4gICAgICBpZiAoaGFzaC5zdGFydHNXaXRoKCdjb2RlPScpKSB7XG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTGF1bmNoQ29kZUhhc2goKSB7XG4gICAgaWYgKHRoaXMuYXBwU2VydmljZS5pc05hdGl2ZSAmJiB0aGlzLmFwcFNlcnZpY2UubGF1bmNoVXJsKSB7XG4gICAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRDb2RlSGFzaCh0aGlzLmFwcFNlcnZpY2UubGF1bmNoVXJsKTtcbiAgICAgIGlmIChoYXNoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICdOdWNsZXVzLklkZW50aXR5OiBHb3QgYXV0aG9yaXphdGlvbiBjb2RlIGZyb20gbGF1bmNoVXJsLCB3aWxsIGFzc2lnbiBpdCB0byBoYXNoLidcbiAgICAgICAgKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnIycgKyBoYXNoO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVNjb3BlKG9mZmxpbmVBY2Nlc3M6IGJvb2xlYW4sIGFkaXRpb25hbFNjb3BlPzogc3RyaW5nKSB7XG4gICAgbGV0IHNjb3BlID0gJ29wZW5pZCc7XG4gICAgaWYgKG9mZmxpbmVBY2Nlc3MpIHtcbiAgICAgIHNjb3BlICs9ICcgb2ZmbGluZV9hY2Nlc3MnO1xuICAgIH1cbiAgICBpZiAoYWRpdGlvbmFsU2NvcGUpIHtcbiAgICAgIHNjb3BlICs9ICcgJyArIGFkaXRpb25hbFNjb3BlO1xuICAgIH1cbiAgICByZXR1cm4gc2NvcGU7XG4gIH1cblxuICBwcml2YXRlIGRlbGF5KG1pbGlzZWNvbmRzOiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCBtaWxpc2Vjb25kcyk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==