keycloak-angular 7.3.0 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +136 -155
  2. package/bundles/keycloak-angular.umd.js +401 -327
  3. package/bundles/keycloak-angular.umd.js.map +1 -1
  4. package/bundles/keycloak-angular.umd.min.js +1 -15
  5. package/bundles/keycloak-angular.umd.min.js.map +1 -1
  6. package/esm2015/keycloak-angular.js +1 -1
  7. package/esm2015/lib/core/core.module.js +16 -18
  8. package/esm2015/lib/core/interceptors/keycloak-bearer.interceptor.js +6 -9
  9. package/esm2015/lib/core/interfaces/keycloak-event.js +1 -1
  10. package/esm2015/lib/core/interfaces/keycloak-options.js +2 -1
  11. package/esm2015/lib/core/services/keycloak-auth-guard.js +1 -1
  12. package/esm2015/lib/core/services/keycloak.service.js +28 -42
  13. package/esm2015/lib/keycloak-angular.module.js +8 -10
  14. package/esm2015/public_api.js +1 -1
  15. package/fesm2015/keycloak-angular.js +54 -78
  16. package/fesm2015/keycloak-angular.js.map +1 -1
  17. package/keycloak-angular.d.ts +0 -0
  18. package/keycloak-angular.metadata.json +1 -1
  19. package/lib/core/core.module.d.ts +0 -0
  20. package/lib/core/interceptors/keycloak-bearer.interceptor.d.ts +0 -0
  21. package/lib/core/interfaces/keycloak-event.d.ts +0 -0
  22. package/lib/core/interfaces/keycloak-options.d.ts +1 -2
  23. package/lib/core/services/keycloak-auth-guard.d.ts +0 -0
  24. package/lib/core/services/keycloak.service.d.ts +2 -2
  25. package/lib/keycloak-angular.module.d.ts +0 -0
  26. package/package.json +9 -14
  27. package/public_api.d.ts +0 -2
  28. package/esm2015/lib/core/interfaces/keycloak-config.js +0 -1
  29. package/esm2015/lib/core/utils/to-promise.js +0 -10
  30. package/esm5/keycloak-angular.js +0 -2
  31. package/esm5/lib/core/core.module.js +0 -26
  32. package/esm5/lib/core/interceptors/keycloak-bearer.interceptor.js +0 -48
  33. package/esm5/lib/core/interfaces/keycloak-config.js +0 -1
  34. package/esm5/lib/core/interfaces/keycloak-event.js +0 -11
  35. package/esm5/lib/core/interfaces/keycloak-options.js +0 -1
  36. package/esm5/lib/core/services/keycloak-auth-guard.js +0 -40
  37. package/esm5/lib/core/services/keycloak.service.js +0 -328
  38. package/esm5/lib/core/utils/to-promise.js +0 -10
  39. package/esm5/lib/keycloak-angular.module.js +0 -15
  40. package/esm5/public_api.js +0 -7
  41. package/fesm5/keycloak-angular.js +0 -461
  42. package/fesm5/keycloak-angular.js.map +0 -1
  43. package/lib/core/interfaces/keycloak-config.d.ts +0 -9
  44. package/lib/core/utils/to-promise.d.ts +0 -7
@@ -1,328 +0,0 @@
1
- import { __awaiter, __decorate, __generator, __read, __spread, __values } from "tslib";
2
- import { Injectable } from '@angular/core';
3
- import { HttpHeaders } from '@angular/common/http';
4
- import { Subject, from } from 'rxjs';
5
- import * as Keycloak_ from 'keycloak-js';
6
- export var Keycloak = Keycloak_;
7
- import { KeycloakEventType } from '../interfaces/keycloak-event';
8
- import { toPromise } from '../utils/to-promise';
9
- var KeycloakService = (function () {
10
- function KeycloakService() {
11
- this._keycloakEvents$ = new Subject();
12
- }
13
- KeycloakService.prototype.bindsKeycloakEvents = function () {
14
- var _this = this;
15
- this._instance.onAuthError = function (errorData) {
16
- _this._keycloakEvents$.next({
17
- args: errorData,
18
- type: KeycloakEventType.OnAuthError
19
- });
20
- };
21
- this._instance.onAuthLogout = function () {
22
- _this._keycloakEvents$.next({ type: KeycloakEventType.OnAuthLogout });
23
- };
24
- this._instance.onAuthRefreshSuccess = function () {
25
- _this._keycloakEvents$.next({
26
- type: KeycloakEventType.OnAuthRefreshSuccess
27
- });
28
- };
29
- this._instance.onAuthRefreshError = function () {
30
- _this._keycloakEvents$.next({
31
- type: KeycloakEventType.OnAuthRefreshError
32
- });
33
- };
34
- this._instance.onAuthSuccess = function () {
35
- _this._keycloakEvents$.next({ type: KeycloakEventType.OnAuthSuccess });
36
- };
37
- this._instance.onTokenExpired = function () {
38
- _this._keycloakEvents$.next({
39
- type: KeycloakEventType.OnTokenExpired
40
- });
41
- };
42
- this._instance.onReady = function (authenticated) {
43
- _this._keycloakEvents$.next({
44
- args: authenticated,
45
- type: KeycloakEventType.OnReady
46
- });
47
- };
48
- };
49
- KeycloakService.prototype.loadExcludedUrls = function (bearerExcludedUrls) {
50
- var e_1, _a;
51
- var excludedUrls = [];
52
- try {
53
- for (var bearerExcludedUrls_1 = __values(bearerExcludedUrls), bearerExcludedUrls_1_1 = bearerExcludedUrls_1.next(); !bearerExcludedUrls_1_1.done; bearerExcludedUrls_1_1 = bearerExcludedUrls_1.next()) {
54
- var item = bearerExcludedUrls_1_1.value;
55
- var excludedUrl = void 0;
56
- if (typeof item === 'string') {
57
- excludedUrl = { urlPattern: new RegExp(item, 'i'), httpMethods: [] };
58
- }
59
- else {
60
- excludedUrl = {
61
- urlPattern: new RegExp(item.url, 'i'),
62
- httpMethods: item.httpMethods
63
- };
64
- }
65
- excludedUrls.push(excludedUrl);
66
- }
67
- }
68
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
69
- finally {
70
- try {
71
- if (bearerExcludedUrls_1_1 && !bearerExcludedUrls_1_1.done && (_a = bearerExcludedUrls_1.return)) _a.call(bearerExcludedUrls_1);
72
- }
73
- finally { if (e_1) throw e_1.error; }
74
- }
75
- return excludedUrls;
76
- };
77
- KeycloakService.prototype.initServiceValues = function (_a) {
78
- var _b = _a.enableBearerInterceptor, enableBearerInterceptor = _b === void 0 ? true : _b, _c = _a.loadUserProfileAtStartUp, loadUserProfileAtStartUp = _c === void 0 ? true : _c, _d = _a.bearerExcludedUrls, bearerExcludedUrls = _d === void 0 ? [] : _d, _e = _a.authorizationHeaderName, authorizationHeaderName = _e === void 0 ? 'Authorization' : _e, _f = _a.bearerPrefix, bearerPrefix = _f === void 0 ? 'bearer' : _f, initOptions = _a.initOptions;
79
- this._enableBearerInterceptor = enableBearerInterceptor;
80
- this._loadUserProfileAtStartUp = loadUserProfileAtStartUp;
81
- this._authorizationHeaderName = authorizationHeaderName;
82
- this._bearerPrefix = bearerPrefix.trim().concat(' ');
83
- this._excludedUrls = this.loadExcludedUrls(bearerExcludedUrls);
84
- this._silentRefresh = initOptions ? initOptions.flow === 'implicit' : false;
85
- };
86
- KeycloakService.prototype.init = function (options) {
87
- if (options === void 0) { options = {}; }
88
- return __awaiter(this, void 0, void 0, function () {
89
- var config, initOptions, authenticated;
90
- return __generator(this, function (_a) {
91
- switch (_a.label) {
92
- case 0:
93
- this.initServiceValues(options);
94
- config = options.config, initOptions = options.initOptions;
95
- this._instance = Keycloak(config);
96
- this.bindsKeycloakEvents();
97
- return [4, toPromise(this._instance.init(initOptions))];
98
- case 1:
99
- authenticated = _a.sent();
100
- if (!(authenticated && this._loadUserProfileAtStartUp)) return [3, 3];
101
- return [4, this.loadUserProfile()];
102
- case 2:
103
- _a.sent();
104
- _a.label = 3;
105
- case 3: return [2, authenticated];
106
- }
107
- });
108
- });
109
- };
110
- KeycloakService.prototype.login = function (options) {
111
- if (options === void 0) { options = {}; }
112
- return __awaiter(this, void 0, void 0, function () {
113
- return __generator(this, function (_a) {
114
- switch (_a.label) {
115
- case 0: return [4, toPromise(this._instance.login(options))];
116
- case 1:
117
- _a.sent();
118
- if (!this._loadUserProfileAtStartUp) return [3, 3];
119
- return [4, this.loadUserProfile()];
120
- case 2:
121
- _a.sent();
122
- _a.label = 3;
123
- case 3: return [2];
124
- }
125
- });
126
- });
127
- };
128
- KeycloakService.prototype.logout = function (redirectUri) {
129
- return __awaiter(this, void 0, void 0, function () {
130
- var options;
131
- return __generator(this, function (_a) {
132
- switch (_a.label) {
133
- case 0:
134
- options = {
135
- redirectUri: redirectUri
136
- };
137
- return [4, toPromise(this._instance.logout(options))];
138
- case 1:
139
- _a.sent();
140
- this._userProfile = undefined;
141
- return [2];
142
- }
143
- });
144
- });
145
- };
146
- KeycloakService.prototype.register = function (options) {
147
- if (options === void 0) { options = { action: 'register' }; }
148
- return __awaiter(this, void 0, void 0, function () {
149
- return __generator(this, function (_a) {
150
- switch (_a.label) {
151
- case 0: return [4, toPromise(this._instance.register(options))];
152
- case 1:
153
- _a.sent();
154
- return [2];
155
- }
156
- });
157
- });
158
- };
159
- KeycloakService.prototype.isUserInRole = function (role, resource) {
160
- var hasRole;
161
- hasRole = this._instance.hasResourceRole(role, resource);
162
- if (!hasRole) {
163
- hasRole = this._instance.hasRealmRole(role);
164
- }
165
- return hasRole;
166
- };
167
- KeycloakService.prototype.getUserRoles = function (allRoles) {
168
- if (allRoles === void 0) { allRoles = true; }
169
- var roles = [];
170
- if (this._instance.resourceAccess) {
171
- for (var key in this._instance.resourceAccess) {
172
- if (this._instance.resourceAccess.hasOwnProperty(key)) {
173
- var resourceAccess = this._instance.resourceAccess[key];
174
- var clientRoles = resourceAccess['roles'] || [];
175
- roles = roles.concat(clientRoles);
176
- }
177
- }
178
- }
179
- if (allRoles && this._instance.realmAccess) {
180
- var realmRoles = this._instance.realmAccess['roles'] || [];
181
- roles.push.apply(roles, __spread(realmRoles));
182
- }
183
- return roles;
184
- };
185
- KeycloakService.prototype.isLoggedIn = function () {
186
- return __awaiter(this, void 0, void 0, function () {
187
- var error_1;
188
- return __generator(this, function (_a) {
189
- switch (_a.label) {
190
- case 0:
191
- _a.trys.push([0, 2, , 3]);
192
- if (!this._instance.authenticated) {
193
- return [2, false];
194
- }
195
- return [4, this.updateToken(20)];
196
- case 1:
197
- _a.sent();
198
- return [2, true];
199
- case 2:
200
- error_1 = _a.sent();
201
- return [2, false];
202
- case 3: return [2];
203
- }
204
- });
205
- });
206
- };
207
- KeycloakService.prototype.isTokenExpired = function (minValidity) {
208
- if (minValidity === void 0) { minValidity = 0; }
209
- return this._instance.isTokenExpired(minValidity);
210
- };
211
- KeycloakService.prototype.updateToken = function (minValidity) {
212
- if (minValidity === void 0) { minValidity = 5; }
213
- return __awaiter(this, void 0, void 0, function () {
214
- return __generator(this, function (_a) {
215
- if (this._silentRefresh) {
216
- if (this.isTokenExpired()) {
217
- throw new Error('Failed to refresh the token, or the session is expired');
218
- }
219
- return [2, true];
220
- }
221
- if (!this._instance) {
222
- throw new Error('Keycloak Angular library is not initialized.');
223
- }
224
- return [2, toPromise(this._instance.updateToken(minValidity))];
225
- });
226
- });
227
- };
228
- KeycloakService.prototype.loadUserProfile = function (forceReload) {
229
- if (forceReload === void 0) { forceReload = false; }
230
- return __awaiter(this, void 0, void 0, function () {
231
- var _a;
232
- return __generator(this, function (_b) {
233
- switch (_b.label) {
234
- case 0:
235
- if (this._userProfile && !forceReload) {
236
- return [2, this._userProfile];
237
- }
238
- if (!this._instance.authenticated) {
239
- throw new Error('The user profile was not loaded as the user is not logged in.');
240
- }
241
- _a = this;
242
- return [4, toPromise(this._instance.loadUserProfile())];
243
- case 1: return [2, _a._userProfile = _b.sent()];
244
- }
245
- });
246
- });
247
- };
248
- KeycloakService.prototype.getToken = function (forceLogin) {
249
- if (forceLogin === void 0) { forceLogin = true; }
250
- return __awaiter(this, void 0, void 0, function () {
251
- var error_2;
252
- return __generator(this, function (_a) {
253
- switch (_a.label) {
254
- case 0:
255
- _a.trys.push([0, 2, , 3]);
256
- return [4, this.updateToken(10)];
257
- case 1:
258
- _a.sent();
259
- return [2, this._instance.token];
260
- case 2:
261
- error_2 = _a.sent();
262
- if (forceLogin) {
263
- this.login();
264
- }
265
- else {
266
- throw error_2;
267
- }
268
- return [3, 3];
269
- case 3: return [2];
270
- }
271
- });
272
- });
273
- };
274
- KeycloakService.prototype.getUsername = function () {
275
- if (!this._userProfile) {
276
- throw new Error('User not logged in or user profile was not loaded.');
277
- }
278
- return this._userProfile.username;
279
- };
280
- KeycloakService.prototype.clearToken = function () {
281
- this._instance.clearToken();
282
- };
283
- KeycloakService.prototype.addTokenToHeader = function (headers) {
284
- var _this = this;
285
- if (headers === void 0) { headers = new HttpHeaders(); }
286
- return from(function () { return __awaiter(_this, void 0, void 0, function () {
287
- var token;
288
- return __generator(this, function (_a) {
289
- switch (_a.label) {
290
- case 0: return [4, this.getToken()];
291
- case 1:
292
- token = _a.sent();
293
- return [2, headers.set(this._authorizationHeaderName, this._bearerPrefix + token)];
294
- }
295
- });
296
- }); });
297
- };
298
- KeycloakService.prototype.getKeycloakInstance = function () {
299
- return this._instance;
300
- };
301
- Object.defineProperty(KeycloakService.prototype, "excludedUrls", {
302
- get: function () {
303
- return this._excludedUrls;
304
- },
305
- enumerable: true,
306
- configurable: true
307
- });
308
- Object.defineProperty(KeycloakService.prototype, "enableBearerInterceptor", {
309
- get: function () {
310
- return this._enableBearerInterceptor;
311
- },
312
- enumerable: true,
313
- configurable: true
314
- });
315
- Object.defineProperty(KeycloakService.prototype, "keycloakEvents$", {
316
- get: function () {
317
- return this._keycloakEvents$;
318
- },
319
- enumerable: true,
320
- configurable: true
321
- });
322
- KeycloakService = __decorate([
323
- Injectable()
324
- ], KeycloakService);
325
- return KeycloakService;
326
- }());
327
- export { KeycloakService };
328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2xvYWsuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2tleWNsb2FrLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY29yZS9zZXJ2aWNlcy9rZXljbG9hay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFRQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdyQyxPQUFPLEtBQUssU0FBUyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxNQUFNLENBQUMsSUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDO0FBR2xDLE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFVaEQ7SUFBQTtRQXNDVSxxQkFBZ0IsR0FBMkIsSUFBSSxPQUFPLEVBQWlCLENBQUM7SUF1Y2xGLENBQUM7SUE5YlMsNkNBQW1CLEdBQTNCO1FBQUEsaUJBd0NDO1FBdkNDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQUEsU0FBUztZQUNwQyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2dCQUN6QixJQUFJLEVBQUUsU0FBUztnQkFDZixJQUFJLEVBQUUsaUJBQWlCLENBQUMsV0FBVzthQUNwQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFFRixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRztZQUM1QixLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsR0FBRztZQUNwQyxL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LGNBQTJCLFdBQVcsRUFBRTtRQUM5RCxPQUFPLElBQUksQ0FBQzs7Ozs0QkFDSSxXQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBQTs7d0JBQTdCLEtBQUssR0FBRyxTQUFxQjt3QkFDbkMsV0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxFQUFDOzs7YUFDL0UsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQVNELDZDQUFtQixHQUFuQjtRQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBU0Qsc0JBQUkseUNBQVk7YUFBaEI7WUFDRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDNUIsQ0FBQzs7O09BQUE7SUFRRCxzQkFBSSxvREFBdUI7YUFBM0I7WUFDRSxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztRQUN2QyxDQUFDOzs7T0FBQTtJQXFCRCxzQkFBSSw0Q0FBZTthQUFuQjtZQUNFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBNWVVLGVBQWU7UUFEM0IsVUFBVSxFQUFFO09BQ0EsZUFBZSxDQTZlM0I7SUFBRCxzQkFBQztDQUFBLEFBN2VELElBNmVDO1NBN2VZLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgTWF1cmljaW8gR2VtZWxsaSBWaWdvbG8gYW5kIGNvbnRyaWJ1dG9ycy5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXVyaWNpb3ZpZ29sby9rZXljbG9hay1hbmd1bGFyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuaW1wb3J0IHsgU3ViamVjdCwgZnJvbSB9IGZyb20gJ3J4anMnO1xuXG4vLyBXb3JrYXJvdW5kIGZvciByb2xsdXAgbGlicmFyeSBiZWhhdmlvdXIsIGFzIHBvaW50ZWQgb3V0IG9uIGlzc3VlICMxMjY3IChodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3JvbGx1cC9pc3N1ZXMvMTI2NykuXG5pbXBvcnQgKiBhcyBLZXljbG9ha18gZnJvbSAna2V5Y2xvYWstanMnO1xuZXhwb3J0IGNvbnN0IEtleWNsb2FrID0gS2V5Y2xvYWtfO1xuXG5pbXBvcnQgeyBFeGNsdWRlZFVybCwgRXhjbHVkZWRVcmxSZWdleCwgS2V5Y2xvYWtPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9rZXljbG9hay1vcHRpb25zJztcbmltcG9ydCB7IEtleWNsb2FrRXZlbnQsIEtleWNsb2FrRXZlbnRUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9rZXljbG9hay1ldmVudCc7XG5pbXBvcnQgeyB0b1Byb21pc2UgfSBmcm9tICcuLi91dGlscy90by1wcm9taXNlJztcblxuLyoqXG4gKiBTZXJ2aWNlIHRvIGV4cG9zZSBleGlzdGVudCBtZXRob2RzIGZyb20gdGhlIEtleWNsb2FrIEpTIGFkYXB0ZXIsIGFkZGluZyBuZXdcbiAqIGZ1bmN0aW9uYWxpdGllcyB0byBpbXByb3ZlIHRoZSB1c2Ugb2Yga2V5Y2xvYWsgaW4gQW5ndWxhciB2ID4gNC4zIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSBpbmplY3RlZCBpbiB0aGUgYXBwbGljYXRpb24gYm9vdHN0cmFwLCBzbyB0aGUgc2FtZSBpbnN0YW5jZSB3aWxsIGJlIHVzZWRcbiAqIGFsb25nIHRoZSB3ZWIgYXBwbGljYXRpb24uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBLZXljbG9ha1NlcnZpY2Uge1xuICAvKipcbiAgICogS2V5Y2xvYWstanMgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIF9pbnN0YW5jZTogS2V5Y2xvYWsuS2V5Y2xvYWtJbnN0YW5jZTtcbiAgLyoqXG4gICAqIFVzZXIgcHJvZmlsZSBhcyBLZXljbG9ha1Byb2ZpbGUgaW50ZXJmYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBfdXNlclByb2ZpbGU6IEtleWNsb2FrLktleWNsb2FrUHJvZmlsZTtcbiAgLyoqXG4gICAqIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGJlYXJlciB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgYXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9lbmFibGVCZWFyZXJJbnRlcmNlcHRvcjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZW4gdGhlIGltcGxpY2l0IGZsb3cgaXMgY2hvb3NlbiB0aGVyZSBtdXN0IGV4aXN0IGEgc2lsZW50UmVmcmVzaCwgYXMgdGhlcmUgaXNcbiAgICogbm8gcmVmcmVzaCB0b2tlbi5cbiAgICovXG4gIHByaXZhdGUgX3NpbGVudFJlZnJlc2g6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBwcm9maWxlIHNob3VsZCBiZSBsb2FkZWQgYXQgdGhlIGtleWNsb2FrIGluaXRpYWxpemF0aW9uLFxuICAgKiBqdXN0IGFmdGVyIHRoZSBsb2dpbi5cbiAgICovXG4gIHByaXZhdGUgX2xvYWRVc2VyUHJvZmlsZUF0U3RhcnRVcDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBiZWFyZXIgcHJlZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgQXV0aG9yaXphdGlvbiBIZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9iZWFyZXJQcmVmaXg6IHN0cmluZztcbiAgLyoqXG4gICAqIFZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBBdXRob3JpemF0aW9uIEh0dHAgSGVhZGVyIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIF9hdXRob3JpemF0aW9uSGVhZGVyTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGV4Y2x1ZGVkIHVybHMgcGF0dGVybnMgdGhhdCBtdXN0IHNraXAgdGhlIEtleWNsb2FrQmVhcmVySW50ZXJjZXB0b3IuXG4gICAqL1xuICBwcml2YXRlIF9leGNsdWRlZFVybHM6IEV4Y2x1ZGVkVXJsUmVnZXhbXTtcbiAgLyoqXG4gICAqIE9ic2VydmVyIGZvciB0aGUga2V5Y2xvYWsgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIF9rZXljbG9ha0V2ZW50cyQ6IFN1YmplY3Q8S2V5Y2xvYWtFdmVudD4gPSBuZXcgU3ViamVjdDxLZXljbG9ha0V2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGUga2V5Y2xvYWstanMgZXZlbnRzIHRvIHRoZSBrZXljbG9ha0V2ZW50cyBTdWJqZWN0XG4gICAqIHdoaWNoIGlzIGEgZ29vZCB3YXkgdG8gbW9uaXRvciBmb3IgY2hhbmdlcywgaWYgbmVlZGVkLlxuICAgKlxuICAgKiBUaGUga2V5Y2xvYWtFdmVudHMgcmV0dXJucyB0aGUga2V5Y2xvYWstanMgZXZlbnQgdHlwZSBhbmQgYW55XG4gICAqIGFyZ3VtZW50IGlmIHRoZSBzb3VyY2UgZnVuY3Rpb24gcHJvdmlkZXMgYW55LlxuICAgKi9cbiAgcHJpdmF0ZSBiaW5kc0tleWNsb2FrRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX2luc3RhbmNlLm9uQXV0aEVycm9yID0gZXJyb3JEYXRhID0+IHtcbiAgICAgIHRoaXMuX2tleWNsb2FrRXZlbnRzJC5uZXh0KHtcbiAgICAgICAgYXJnczogZXJyb3JEYXRhLFxuICAgICAgICB0eXBlOiBLZXljbG9ha0V2ZW50VHlwZS5PbkF1dGhFcnJvclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuX2luc3RhbmNlLm9uQXV0aExvZ291dCA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2tleWNsb2FrRXZlbnRzJC5uZXh0KHsgdHlwZTogS2V5Y2xvYWtFdmVudFR5cGUuT25BdXRoTG9nb3V0IH0pO1xuICAgIH07XG5cbiAgICB0aGlzLl9pbnN0YW5jZS5vbkF1dGhSZWZyZXNoU3VjY2VzcyA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2tleWNsb2FrRXZlbnRzJC5uZXh0KHtcbiAgICAgICAgdHlwZTogS2V5Y2xvYWtFdmVudFR5cGUuT25BdXRoUmVmcmVzaFN1Y2Nlc3NcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLl9pbnN0YW5jZS5vbkF1dGhSZWZyZXNoRXJyb3IgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9rZXljbG9ha0V2ZW50cyQubmV4dCh7XG4gICAgICAgIHR5cGU6IEtleWNsb2FrRXZlbnRUeXBlLk9uQXV0aFJlZnJlc2hFcnJvclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuX2luc3RhbmNlLm9uQXV0aFN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9rZXljbG9ha0V2ZW50cyQubmV4dCh7IHR5cGU6IEtleWNsb2FrRXZlbnRUeXBlLk9uQXV0aFN1Y2Nlc3MgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuX2luc3RhbmNlLm9uVG9rZW5FeHBpcmVkID0gKCkgPT4ge1xuICAgICAgdGhpcy5fa2V5Y2xvYWtFdmVudHMkLm5leHQoe1xuICAgICAgICB0eXBlOiBLZXljbG9ha0V2ZW50VHlwZS5PblRva2VuRXhwaXJlZFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuX2luc3RhbmNlLm9uUmVhZHkgPSBhdXRoZW50aWNhdGVkID0+IHtcbiAgICAgIHRoaXMuX2tleWNsb2FrRXZlbnRzJC5uZXh0KHtcbiAgICAgICAgYXJnczogYXV0aGVudGljYXRlZCxcbiAgICAgICAgdHlwZTogS2V5Y2xvYWtFdmVudFR5cGUuT25SZWFkeVxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbGwgYmVhcmVyRXhjbHVkZWRVcmwgY29udGVudCBpbiBhIHVuaWZvcm0gdHlwZTogRXhjbHVkZWRVcmwsXG4gICAqIHNvIGl0IGJlY29tZXMgZWFzaWVyIHRvIGhhbmRsZS5cbiAgICpcbiAgICogQHBhcmFtIGJlYXJlckV4Y2x1ZGVkVXJscyBhcnJheSBvZiBzdHJpbmdzIG9yIEV4Y2x1ZGVkVXJsIHRoYXQgaW5jbHVkZXNcbiAgICogdGhlIHVybCBhbmQgSHR0cE1ldGhvZC5cbiAgICovXG4gIHByaXZhdGUgbG9hZEV4Y2x1ZGVkVXJscyhiZWFyZXJFeGNsdWRlZFVybHM6IChzdHJpbmcgfCBFeGNsdWRlZFVybClbXSk6IEV4Y2x1ZGVkVXJsUmVnZXhbXSB7XG4gICAgY29uc3QgZXhjbHVkZWRVcmxzOiBFeGNsdWRlZFVybFJlZ2V4W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYmVhcmVyRXhjbHVkZWRVcmxzKSB7XG4gICAgICBsZXQgZXhjbHVkZWRVcmw6IEV4Y2x1ZGVkVXJsUmVnZXg7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGV4Y2x1ZGVkVXJsID0geyB1cmxQYXR0ZXJuOiBuZXcgUmVnRXhwKGl0ZW0sICdpJyksIGh0dHBNZXRob2RzOiBbXSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhjbHVkZWRVcmwgPSB7XG4gICAgICAgICAgdXJsUGF0dGVybjogbmV3IFJlZ0V4cChpdGVtLnVybCwgJ2knKSxcbiAgICAgICAgICBodHRwTWV0aG9kczogaXRlbS5odHRwTWV0aG9kc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgZXhjbHVkZWRVcmxzLnB1c2goZXhjbHVkZWRVcmwpO1xuICAgIH1cbiAgICByZXR1cm4gZXhjbHVkZWRVcmxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNsYXNzIHZhbHVlcyBpbml0aWFsaXphdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgaW5pdFNlcnZpY2VWYWx1ZXMoe1xuICAgIGVuYWJsZUJlYXJlckludGVyY2VwdG9yID0gdHJ1ZSxcbiAgICBsb2FkVXNlclByb2ZpbGVBdFN0YXJ0VXAgPSB0cnVlLFxuICAgIGJlYXJlckV4Y2x1ZGVkVXJscyA9IFtdLFxuICAgIGF1dGhvcml6YXRpb25IZWFkZXJOYW1lID0gJ0F1dGhvcml6YXRpb24nLFxuICAgIGJlYXJlclByZWZpeCA9ICdiZWFyZXInLFxuICAgIGluaXRPcHRpb25zXG4gIH06IEtleWNsb2FrT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuX2VuYWJsZUJlYXJlckludGVyY2VwdG9yID0gZW5hYmxlQmVhcmVySW50ZXJjZXB0b3I7XG4gICAgdGhpcy5fbG9hZFVzZXJQcm9maWxlQXRTdGFydFVwID0gbG9hZFVzZXJQcm9maWxlQXRTdGFydFVwO1xuICAgIHRoaXMuX2F1dGhvcml6YXRpb25IZWFkZXJOYW1lID0gYXV0aG9yaXphdGlvbkhlYWRlck5hbWU7XG4gICAgdGhpcy5fYmVhcmVyUHJlZml4ID0gYmVhcmVyUHJlZml4LnRyaW0oKS5jb25jYXQoJyAnKTtcbiAgICB0aGlzLl9leGNsdWRlZFVybHMgPSB0aGlzLmxvYWRFeGNsdWRlZFVybHMoYmVhcmVyRXhjbHVkZWRVcmxzKTtcbiAgICB0aGlzLl9zaWxlbnRSZWZyZXNoID0gaW5pdE9wdGlvbnMgPyBpbml0T3B0aW9ucy5mbG93ID09PSAnaW1wbGljaXQnIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogS2V5Y2xvYWsgaW5pdGlhbGl6YXRpb24uIEl0IHNob3VsZCBiZSBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgYWRhcHRlci5cbiAgICogT3B0aW9ucyBpcyBhIG9iamVjdCB3aXRoIDIgbWFpbiBwYXJhbWV0ZXJzOiBjb25maWcgYW5kIGluaXRPcHRpb25zLiBUaGUgZmlyc3Qgb25lXG4gICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIEtleWNsb2FrIGluc3RhbmNlLiBUaGUgc2Vjb25kIG9uZSBhcmUgb3B0aW9ucyB0byBpbml0aWFsaXplIHRoZVxuICAgKiBrZXljbG9hayBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQ29uZmlnOiBtYXkgYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBrZXljbG9hayBVUkkgb3IgYW4gb2JqZWN0IHdpdGggdGhlXG4gICAqIGZvbGxvd2luZyBjb250ZW50OlxuICAgKiAtIHVybDogS2V5Y2xvYWsganNvbiBVUkxcbiAgICogLSByZWFsbTogcmVhbG0gbmFtZVxuICAgKiAtIGNsaWVudElkOiBjbGllbnQgaWRcbiAgICpcbiAgICogaW5pdE9wdGlvbnM6XG4gICAqIE9wdGlvbnMgdG8gaW5pdGlhbGl6ZSB0aGUgS2V5Y2xvYWsgYWRhcHRlciwgbWF0Y2hlcyB0aGUgb3B0aW9ucyBhcyBwcm92aWRlZCBieSBLZXljbG9hayBpdHNlbGYuXG4gICAqXG4gICAqIGVuYWJsZUJlYXJlckludGVyY2VwdG9yOlxuICAgKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBiZWFyZXIgd2lsbCBhZGRlZCB0byB0aGUgYXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gICAqXG4gICAqIGxvYWRVc2VyUHJvZmlsZUluU3RhcnRVcDpcbiAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgcHJvZmlsZSBzaG91bGQgYmUgbG9hZGVkIGF0IHRoZSBrZXljbG9hayBpbml0aWFsaXphdGlvbixcbiAgICoganVzdCBhZnRlciB0aGUgbG9naW4uXG4gICAqXG4gICAqIGJlYXJlckV4Y2x1ZGVkVXJsczpcbiAgICogU3RyaW5nIEFycmF5IHRvIGV4Y2x1ZGUgdGhlIHVybHMgdGhhdCBzaG91bGQgbm90IGhhdmUgdGhlIEF1dGhvcml6YXRpb24gSGVhZGVyIGF1dG9tYXRpY2FsbHlcbiAgICogYWRkZWQuXG4gICAqXG4gICAqIGF1dGhvcml6YXRpb25IZWFkZXJOYW1lOlxuICAgKiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgQXV0aG9yaXphdGlvbiBIdHRwIEhlYWRlciBuYW1lLlxuICAgKlxuICAgKiBiZWFyZXJQcmVmaXg6XG4gICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgQXV0aG9yaXphdGlvbiBIdHRwIEhlYWRlciBwYXJhbS5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQSBQcm9taXNlIHdpdGggYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluaXQob3B0aW9uczogS2V5Y2xvYWtPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmluaXRTZXJ2aWNlVmFsdWVzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgY29uZmlnLCBpbml0T3B0aW9ucyB9ID0gb3B0aW9ucztcblxuICAgIHRoaXMuX2luc3RhbmNlID0gS2V5Y2xvYWsoY29uZmlnKTtcbiAgICB0aGlzLmJpbmRzS2V5Y2xvYWtFdmVudHMoKTtcblxuICAgIGNvbnN0IGF1dGhlbnRpY2F0ZWQgPSBhd2FpdCB0b1Byb21pc2UodGhpcy5faW5zdGFuY2UuaW5pdChpbml0T3B0aW9ucykpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWQgJiYgdGhpcy5fbG9hZFVzZXJQcm9maWxlQXRTdGFydFVwKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRVc2VyUHJvZmlsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBhdXRoZW50aWNhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZGlyZWN0cyB0byBsb2dpbiBmb3JtIG9uIChvcHRpb25zIGlzIGFuIG9wdGlvbmFsIG9iamVjdCB3aXRoIHJlZGlyZWN0VXJpIGFuZC9vclxuICAgKiBwcm9tcHQgZmllbGRzKS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogT2JqZWN0LCB3aGVyZTpcbiAgICogIC0gcmVkaXJlY3RVcmk6IFNwZWNpZmllcyB0aGUgdXJpIHRvIHJlZGlyZWN0IHRvIGFmdGVyIGxvZ2luLlxuICAgKiAgLSBwcm9tcHQ6QnkgZGVmYXVsdCB0aGUgbG9naW4gc2NyZWVuIGlzIGRpc3BsYXllZCBpZiB0aGUgdXNlciBpcyBub3QgbG9nZ2VkLWluIHRvIEtleWNsb2FrLlxuICAgKiBUbyBvbmx5IGF1dGhlbnRpY2F0ZSB0byB0aGUgYXBwbGljYXRpb24gaWYgdGhlIHVzZXIgaXMgYWxyZWFkeSBsb2dnZWQtaW4gYW5kIG5vdCBkaXNwbGF5IHRoZVxuICAgKiBsb2dpbiBwYWdlIGlmIHRoZSB1c2VyIGlzIG5vdCBsb2dnZWQtaW4sIHNldCB0aGlzIG9wdGlvbiB0byBub25lLiBUbyBhbHdheXMgcmVxdWlyZVxuICAgKiByZS1hdXRoZW50aWNhdGlvbiBhbmQgaWdub3JlIFNTTywgc2V0IHRoaXMgb3B0aW9uIHRvIGxvZ2luIC5cbiAgICogIC0gbWF4QWdlOiBVc2VkIGp1c3QgaWYgdXNlciBpcyBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQuIFNwZWNpZmllcyBtYXhpbXVtIHRpbWUgc2luY2UgdGhlXG4gICAqIGF1dGhlbnRpY2F0aW9uIG9mIHVzZXIgaGFwcGVuZWQuIElmIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkIGZvciBsb25nZXIgdGltZSB0aGFuXG4gICAqIG1heEFnZSwgdGhlIFNTTyBpcyBpZ25vcmVkIGFuZCBoZSB3aWxsIG5lZWQgdG8gcmUtYXV0aGVudGljYXRlIGFnYWluLlxuICAgKiAgLSBsb2dpbkhpbnQ6IFVzZWQgdG8gcHJlLWZpbGwgdGhlIHVzZXJuYW1lL2VtYWlsIGZpZWxkIG9uIHRoZSBsb2dpbiBmb3JtLlxuICAgKiAgLSBhY3Rpb246IElmIHZhbHVlIGlzICdyZWdpc3RlcicgdGhlbiB1c2VyIGlzIHJlZGlyZWN0ZWQgdG8gcmVnaXN0cmF0aW9uIHBhZ2UsIG90aGVyd2lzZSB0b1xuICAgKiBsb2dpbiBwYWdlLlxuICAgKiAgLSBsb2NhbGU6IFNwZWNpZmllcyB0aGUgZGVzaXJlZCBsb2NhbGUgZm9yIHRoZSBVSS5cbiAgICogQHJldHVybnNcbiAgICogQSB2b2lkIFByb21pc2UgaWYgdGhlIGxvZ2luIGlzIHN1Y2Nlc3NmdWwgYW5kIGFmdGVyIHRoZSB1c2VyIHByb2ZpbGUgbG9hZGluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2dpbihvcHRpb25zOiBLZXljbG9hay5LZXljbG9ha0xvZ2luT3B0aW9ucyA9IHt9KSB7XG4gICAgYXdhaXQgdG9Qcm9taXNlKHRoaXMuX2luc3RhbmNlLmxvZ2luKG9wdGlvbnMpKTtcblxuICAgIGlmICh0aGlzLl9sb2FkVXNlclByb2ZpbGVBdFN0YXJ0VXApIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZFVzZXJQcm9maWxlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZGlyZWN0cyB0byBsb2dvdXQuXG4gICAqXG4gICAqIEBwYXJhbSByZWRpcmVjdFVyaVxuICAgKiBTcGVjaWZpZXMgdGhlIHVyaSB0byByZWRpcmVjdCB0byBhZnRlciBsb2dvdXQuXG4gICAqIEByZXR1cm5zXG4gICAqIEEgdm9pZCBQcm9taXNlIGlmIHRoZSBsb2dvdXQgd2FzIHN1Y2Nlc3NmdWwsIGNsZWFuaW5nIGFsc28gdGhlIHVzZXJQcm9maWxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvZ291dChyZWRpcmVjdFVyaT86IHN0cmluZykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByZWRpcmVjdFVyaVxuICAgIH07XG5cbiAgICBhd2FpdCB0b1Byb21pc2UodGhpcy5faW5zdGFuY2UubG9nb3V0KG9wdGlvbnMpKTtcbiAgICB0aGlzLl91c2VyUHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRpcmVjdHMgdG8gcmVnaXN0cmF0aW9uIGZvcm0uIFNob3J0Y3V0IGZvciBsb2dpbiB3aXRoIG9wdGlvblxuICAgKiBhY3Rpb24gPSAncmVnaXN0ZXInLiBPcHRpb25zIGFyZSBzYW1lIGFzIGZvciB0aGUgbG9naW4gbWV0aG9kIGJ1dCAnYWN0aW9uJyBpcyBzZXQgdG9cbiAgICogJ3JlZ2lzdGVyJy5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogbG9naW4gb3B0aW9uc1xuICAgKiBAcmV0dXJuc1xuICAgKiBBIHZvaWQgUHJvbWlzZSBpZiB0aGUgcmVnaXN0ZXIgZmxvdyB3YXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlcihvcHRpb25zOiBLZXljbG9hay5LZXljbG9ha0xvZ2luT3B0aW9ucyA9IHsgYWN0aW9uOiAncmVnaXN0ZXInIH0pIHtcbiAgICBhd2FpdCB0b1Byb21pc2UodGhpcy5faW5zdGFuY2UucmVnaXN0ZXIob3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCByb2xlLiBJdCB3aWxsIGxvb2sgZm9yIHJvbGVzIGluXG4gICAqIHJlYWxtIGFuZCBjbGllbnRJZCwgYnV0IHdpbGwgbm90IGNoZWNrIGlmIHRoZSB1c2VyIGlzIGxvZ2dlZCBpbiBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZVxuICAgKiByb2xlIG5hbWVcbiAgICogQHBhcmFtIHJlc291cmNlXG4gICAqIHJlc291cmNlIG5hbWUgSWYgbm90IHNwZWNpZmllZCwgYGNsaWVudElkYCBpcyB1c2VkXG4gICAqIEByZXR1cm5zXG4gICAqIEEgYm9vbGVhbiBtZWFuaW5nIGlmIHRoZSB1c2VyIGhhcyB0aGUgc3BlY2lmaWVkIFJvbGUuXG4gICAqL1xuICBpc1VzZXJJblJvbGUocm9sZTogc3RyaW5nLCByZXNvdXJjZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNSb2xlOiBib29sZWFuO1xuICAgIGhhc1JvbGUgPSB0aGlzLl9pbnN0YW5jZS5oYXNSZXNvdXJjZVJvbGUocm9sZSwgcmVzb3VyY2UpO1xuICAgIGlmICghaGFzUm9sZSkge1xuICAgICAgaGFzUm9sZSA9IHRoaXMuX2luc3RhbmNlLmhhc1JlYWxtUm9sZShyb2xlKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc1JvbGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSByb2xlcyBvZiB0aGUgbG9nZ2VkIHVzZXIuIFRoZSBhbGxSb2xlcyBwYXJhbWV0ZXIsIHdpdGggZGVmYXVsdCB2YWx1ZVxuICAgKiB0cnVlLCB3aWxsIHJldHVybiB0aGUgY2xpZW50SWQgYW5kIHJlYWxtIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9nZ2VkIHVzZXIuIElmIHNldCB0byBmYWxzZVxuICAgKiBpdCB3aWxsIG9ubHkgcmV0dXJuIHRoZSB1c2VyIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50SWQuXG4gICAqXG4gICAqIEBwYXJhbSBhbGxSb2xlc1xuICAgKiBGbGFnIHRvIHNldCBpZiBhbGwgcm9sZXMgc2hvdWxkIGJlIHJldHVybmVkLihPcHRpb25hbDogZGVmYXVsdCB2YWx1ZSBpcyB0cnVlKVxuICAgKiBAcmV0dXJuc1xuICAgKiBBcnJheSBvZiBSb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGxvZ2dlZCB1c2VyLlxuICAgKi9cbiAgZ2V0VXNlclJvbGVzKGFsbFJvbGVzOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZ1tdIHtcbiAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuX2luc3RhbmNlLnJlc291cmNlQWNjZXNzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9pbnN0YW5jZS5yZXNvdXJjZUFjY2Vzcykge1xuICAgICAgICBpZiAodGhpcy5faW5zdGFuY2UucmVzb3VyY2VBY2Nlc3MuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IHJlc291cmNlQWNjZXNzOiBhbnkgPSB0aGlzLl9pbnN0YW5jZS5yZXNvdXJjZUFjY2Vzc1trZXldO1xuICAgICAgICAgIGNvbnN0IGNsaWVudFJvbGVzID0gcmVzb3VyY2VBY2Nlc3NbJ3JvbGVzJ10gfHwgW107XG4gICAgICAgICAgcm9sZXMgPSByb2xlcy5jb25jYXQoY2xpZW50Um9sZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxSb2xlcyAmJiB0aGlzLl9pbnN0YW5jZS5yZWFsbUFjY2Vzcykge1xuICAgICAgY29uc3QgcmVhbG1Sb2xlcyA9IHRoaXMuX2luc3RhbmNlLnJlYWxtQWNjZXNzWydyb2xlcyddIHx8IFtdO1xuICAgICAgcm9sZXMucHVzaCguLi5yZWFsbVJvbGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHVzZXIgaXMgbG9nZ2VkIGluLlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIHVzZXIgaXMgbG9nZ2VkIGluLlxuICAgKi9cbiAgYXN5bmMgaXNMb2dnZWRJbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZS5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVG9rZW4oMjApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0b2tlbiBoYXMgbGVzcyB0aGFuIG1pblZhbGlkaXR5IHNlY29uZHMgbGVmdCBiZWZvcmVcbiAgICogaXQgZXhwaXJlcy5cbiAgICpcbiAgICogQHBhcmFtIG1pblZhbGlkaXR5XG4gICAqIFNlY29uZHMgbGVmdC4gKG1pblZhbGlkaXR5KSBpcyBvcHRpb25hbC4gRGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgKiBAcmV0dXJuc1xuICAgKiBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHRva2VuIGlzIGV4cGlyZWQuXG4gICAqL1xuICBpc1Rva2VuRXhwaXJlZChtaW5WYWxpZGl0eTogbnVtYmVyID0gMCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZS5pc1Rva2VuRXhwaXJlZChtaW5WYWxpZGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHRva2VuIGV4cGlyZXMgd2l0aGluIG1pblZhbGlkaXR5IHNlY29uZHMgdGhlIHRva2VuIGlzIHJlZnJlc2hlZC4gSWYgdGhlXG4gICAqIHNlc3Npb24gc3RhdHVzIGlmcmFtZSBpcyBlbmFibGVkLCB0aGUgc2Vzc2lvbiBzdGF0dXMgaXMgYWxzbyBjaGVja2VkLlxuICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0ZWxsaW5nIGlmIHRoZSB0b2tlbiB3YXMgcmVmcmVzaGVkIG9yIG5vdC4gSWYgdGhlIHNlc3Npb24gaXMgbm90IGFjdGl2ZVxuICAgKiBhbnltb3JlLCB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICpcbiAgICogQHBhcmFtIG1pblZhbGlkaXR5XG4gICAqIFNlY29uZHMgbGVmdC4gKG1pblZhbGlkaXR5IGlzIG9wdGlvbmFsLCBpZiBub3Qgc3BlY2lmaWVkIDUgaXMgdXNlZClcbiAgICogQHJldHVybnNcbiAgICogUHJvbWlzZSB3aXRoIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSB0b2tlbiB3YXMgc3VjY2VzZnVsbHkgdXBkYXRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVUb2tlbihtaW5WYWxpZGl0eSA9IDUpIHtcbiAgICAvLyBUT0RPOiB0aGlzIGlzIGEgd29ya2Fyb3VuZCB1bnRpbCB0aGUgc2lsZW50IHJlZnJlc2ggKGlzc3VlICM0MylcbiAgICAvLyBpcyBub3QgaW1wbGVtZW50ZWQsIGF2b2lkaW5nIHRoZSByZWRpcmVjdCBsb29wLlxuICAgIGlmICh0aGlzLl9zaWxlbnRSZWZyZXNoKSB7XG4gICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlZnJlc2ggdGhlIHRva2VuLCBvciB0aGUgc2Vzc2lvbiBpcyBleHBpcmVkJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2V5Y2xvYWsgQW5ndWxhciBsaWJyYXJ5IGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9Qcm9taXNlKHRoaXMuX2luc3RhbmNlLnVwZGF0ZVRva2VuKG1pblZhbGlkaXR5KSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIHVzZXIgcHJvZmlsZS5cbiAgICogUmV0dXJucyBwcm9taXNlIHRvIHNldCBmdW5jdGlvbnMgdG8gYmUgaW52b2tlZCBpZiB0aGUgcHJvZmlsZSB3YXMgbG9hZGVkXG4gICAqIHN1Y2Nlc3NmdWxseSwgb3IgaWYgdGhlIHByb2ZpbGUgY291bGQgbm90IGJlIGxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlUmVsb2FkXG4gICAqIElmIHRydWUgd2lsbCBmb3JjZSB0aGUgbG9hZFVzZXJQcm9maWxlIGV2ZW4gaWYgaXRzIGFscmVhZHkgbG9hZGVkLlxuICAgKiBAcmV0dXJuc1xuICAgKiBBIHByb21pc2Ugd2l0aCB0aGUgS2V5Y2xvYWtQcm9maWxlIGRhdGEgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRVc2VyUHJvZmlsZShmb3JjZVJlbG9hZCA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX3VzZXJQcm9maWxlICYmICFmb3JjZVJlbG9hZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3VzZXJQcm9maWxlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faW5zdGFuY2UuYXV0aGVudGljYXRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdXNlciBwcm9maWxlIHdhcyBub3QgbG9hZGVkIGFzIHRoZSB1c2VyIGlzIG5vdCBsb2dnZWQgaW4uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3VzZXJQcm9maWxlID0gYXdhaXQgdG9Qcm9taXNlKHRoaXMuX2luc3RhbmNlLmxvYWRVc2VyUHJvZmlsZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRoZW50aWNhdGVkIHRva2VuLCBjYWxsaW5nIHVwZGF0ZVRva2VuIHRvIGdldCBhIHJlZnJlc2hlZCBvbmUgaWZcbiAgICogbmVjZXNzYXJ5LiBJZiB0aGUgc2Vzc2lvbiBpcyBleHBpcmVkIGFuZCB0aGUgZm9yY2VMb2dpbiBmbGFnIGlzIHNldCB0byB0cnVlLFxuICAgKiB0aGlzIG1ldGhvZCBjYWxscyB0aGUgbG9naW4gbWV0aG9kIGZvciBhIG5ldyBsb2dpbiwgb3RoZXJ3aXNlIHJlamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JjZUxvZ2luXG4gICAqIEZsYWcgd2hldGhlciBhIGxvZ2luIHNob3VsZCBiZSBlbmZvcmNlZCBpZiB0aGUgc2Vzc2lvbiBpcyBleHBpcmVkLlxuICAgKiBAcmV0dXJuc1xuICAgKiBQcm9taXNlIHdpdGggdGhlIGdlbmVyYXRlZCB0b2tlbi5cbiAgICovXG4gIGFzeW5jIGdldFRva2VuKGZvcmNlTG9naW4gPSB0cnVlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVUb2tlbigxMCk7XG4gICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UudG9rZW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChmb3JjZUxvZ2luKSB7XG4gICAgICAgIHRoaXMubG9naW4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsb2dnZWQgdXNlcm5hbWUuXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBsb2dnZWQgdXNlcm5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlcm5hbWUoKSB7XG4gICAgaWYgKCF0aGlzLl91c2VyUHJvZmlsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBsb2dnZWQgaW4gb3IgdXNlciBwcm9maWxlIHdhcyBub3QgbG9hZGVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl91c2VyUHJvZmlsZS51c2VybmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhdXRoZW50aWNhdGlvbiBzdGF0ZSwgaW5jbHVkaW5nIHRva2Vucy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIGFwcGxpY2F0aW9uXG4gICAqIGhhcyBkZXRlY3RlZCB0aGUgc2Vzc2lvbiB3YXMgZXhwaXJlZCwgZm9yIGV4YW1wbGUgaWYgdXBkYXRpbmcgdG9rZW4gZmFpbHMuXG4gICAqIEludm9raW5nIHRoaXMgcmVzdWx0cyBpbiBvbkF1dGhMb2dvdXQgY2FsbGJhY2sgbGlzdGVuZXIgYmVpbmcgaW52b2tlZC5cbiAgICovXG4gIGNsZWFyVG9rZW4oKTogdm9pZCB7XG4gICAgdGhpcy5faW5zdGFuY2UuY2xlYXJUb2tlbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB2YWxpZCB0b2tlbiBpbiBoZWFkZXIuIFRoZSBrZXkgJiB2YWx1ZSBmb3JtYXQgaXM6XG4gICAqIEF1dGhvcml6YXRpb24gQmVhcmVyIDx0b2tlbj4uXG4gICAqIElmIHRoZSBoZWFkZXJzIHBhcmFtIGlzIHVuZGVmaW5lZCBpdCB3aWxsIGNyZWF0ZSB0aGUgQW5ndWxhciBoZWFkZXJzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIGhlYWRlcnNcbiAgICogVXBkYXRlZCBoZWFkZXIgd2l0aCBBdXRob3JpemF0aW9uIGFuZCBLZXljbG9hayB0b2tlbi5cbiAgICogQHJldHVybnNcbiAgICogQW4gb2JzZXJ2YWJsZSB3aXRoIHdpdGggdGhlIEhUVFAgQXV0aG9yaXphdGlvbiBoZWFkZXIgYW5kIHRoZSBjdXJyZW50IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFkZFRva2VuVG9IZWFkZXIoaGVhZGVyczogSHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKSkge1xuICAgIHJldHVybiBmcm9tKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbigpO1xuICAgICAgcmV0dXJuIGhlYWRlcnMuc2V0KHRoaXMuX2F1dGhvcml6YXRpb25IZWFkZXJOYW1lLCB0aGlzLl9iZWFyZXJQcmVmaXggKyB0b2tlbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgS2V5Y2xvYWsgaW5zdGFuY2UsIGlmIHlvdSBuZWVkIGFueSBjdXN0b21pemF0aW9uIHRoYXRcbiAgICogdGhpcyBBbmd1bGFyIHNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydCB5ZXQuIFVzZSB3aXRoIGNhdXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBLZXljbG9ha0luc3RhbmNlIGZyb20ga2V5Y2xvYWstanMuXG4gICAqL1xuICBnZXRLZXljbG9ha0luc3RhbmNlKCk6IEtleWNsb2FrLktleWNsb2FrSW5zdGFuY2Uge1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleGNsdWRlZCBVUkxzIHRoYXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGJ5XG4gICAqIHRoZSBodHRwIGludGVyY2VwdG9yIHdoaWNoIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgYXV0aG9yaXphdGlvbiBoZWFkZXIgaW4gdGhlIEh0dHAgUmVxdWVzdC5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogVGhlIGV4Y2x1ZGVkIHVybHMgdGhhdCBtdXN0IG5vdCBiZSBpbnRlcmNlcHRlZCBieSB0aGUgS2V5Y2xvYWtCZWFyZXJJbnRlcmNlcHRvci5cbiAgICovXG4gIGdldCBleGNsdWRlZFVybHMoKTogRXhjbHVkZWRVcmxSZWdleFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZXhjbHVkZWRVcmxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGJlYXJlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhdXRob3JpemF0aW9uIGhlYWRlci5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogUmV0dXJucyBpZiB0aGUgYmVhcmVyIGludGVyY2VwdG9yIHdhcyBzZXQgdG8gYmUgZGlzYWJsZWQuXG4gICAqL1xuICBnZXQgZW5hYmxlQmVhcmVySW50ZXJjZXB0b3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZUJlYXJlckludGVyY2VwdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEtleWNsb2FrIHN1YmplY3QgdG8gbW9uaXRvciB0aGUgZXZlbnRzIHRyaWdnZXJlZCBieSBrZXljbG9hay1qcy5cbiAgICogVGhlIGZvbGxvd2luZyBldmVudHMgYXMgYXZhaWxhYmxlIChhcyBkZXNjcmliZWQgYXQga2V5Y2xvYWsgZG9jcyAtXG4gICAqIGh0dHBzOi8vd3d3LmtleWNsb2FrLm9yZy9kb2NzL2xhdGVzdC9zZWN1cmluZ19hcHBzL2luZGV4Lmh0bWwjY2FsbGJhY2stZXZlbnRzKTpcbiAgICogLSBPbkF1dGhFcnJvclxuICAgKiAtIE9uQXV0aExvZ291dFxuICAgKiAtIE9uQXV0aFJlZnJlc2hFcnJvclxuICAgKiAtIE9uQXV0aFJlZnJlc2hTdWNjZXNzXG4gICAqIC0gT25BdXRoU3VjY2Vzc1xuICAgKiAtIE9uUmVhZHlcbiAgICogLSBPblRva2VuRXhwaXJlXG4gICAqIEluIGVhY2ggb2NjdXJyZW5jZSBvZiBhbnkgb2YgdGhlc2UsIHRoaXMgc3ViamVjdCB3aWxsIHJldHVybiB0aGUgZXZlbnQgdHlwZSxcbiAgICogZGVzY3JpYmVkIGF0IHtAbGluayBLZXljbG9ha0V2ZW50VHlwZX0gZW51bSBhbmQgdGhlIGZ1bmN0aW9uIGFyZ3MgZnJvbSB0aGUga2V5Y2xvYWstanNcbiAgICogaWYgcHJvdmlkZWQgYW55LlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBBIHN1YmplY3Qgd2l0aCB0aGUge0BsaW5rIEtleWNsb2FrRXZlbnR9IHdoaWNoIGRlc2NyaWJlcyB0aGUgZXZlbnQgdHlwZSBhbmQgYXR0YWNoZXMgdGhlXG4gICAqIGZ1bmN0aW9uIGFyZ3MuXG4gICAqL1xuICBnZXQga2V5Y2xvYWtFdmVudHMkKCk6IFN1YmplY3Q8S2V5Y2xvYWtFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLl9rZXljbG9ha0V2ZW50cyQ7XG4gIH1cbn1cbiJdfQ==
@@ -1,10 +0,0 @@
1
- export function toPromise(originalPromise) {
2
- if (originalPromise instanceof Promise) {
3
- return originalPromise;
4
- }
5
- return new Promise(function (resolve, reject) {
6
- originalPromise.success(resolve);
7
- originalPromise.error(reject);
8
- });
9
- }
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tcHJvbWlzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2tleWNsb2FrLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY29yZS91dGlscy90by1wcm9taXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE1BQU0sVUFBVSxTQUFTLENBQU8sZUFBb0U7SUFDbEcsSUFBSSxlQUFlLFlBQVksT0FBTyxFQUFFO1FBQ3RDLE9BQU8sZUFBZSxDQUFDO0tBQ3hCO0lBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBSSxVQUFDLE9BQU8sRUFBRSxNQUFNO1FBQ3BDLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBLZXljbG9ha1Byb21pc2UgfSBmcm9tICdrZXljbG9hay1qcyc7XG5cbmludGVyZmFjZSBMZWdhY3lLZXljbG9ha1Byb21pc2U8VCwgRT4ge1xuICBzdWNjZXNzKGNhbGxiYWNrOiAocmVzdWx0OiBUKSA9PiB2b2lkKTogTGVnYWN5S2V5Y2xvYWtQcm9taXNlPFQsIEU+O1xuICBlcnJvcihjYWxsYmFjazogKHJlc3VsdDogRSkgPT4gdm9pZCk6IExlZ2FjeUtleWNsb2FrUHJvbWlzZTxULCBFPjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhICdsZWdhY3knIEtleWNsb2FrIHByb21pc2UgdG8gYSBzdGFuZGFyZGl6ZWQgb25lLlxuICpcbiAqIEBwYXJhbSBvcmlnaW5hbFByb21pc2UgVGhlIEtleWNsb2FrIHByb21pc2UgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHJvbWlzZTxULCBFPihvcmlnaW5hbFByb21pc2U6IExlZ2FjeUtleWNsb2FrUHJvbWlzZTxULCBFPiB8IEtleWNsb2FrUHJvbWlzZTxULCBFPikge1xuICBpZiAob3JpZ2luYWxQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgIHJldHVybiBvcmlnaW5hbFByb21pc2U7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIG9yaWdpbmFsUHJvbWlzZS5zdWNjZXNzKHJlc29sdmUpO1xuICAgIG9yaWdpbmFsUHJvbWlzZS5lcnJvcihyZWplY3QpO1xuICB9KTtcbn1cbiJdfQ==
@@ -1,15 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { NgModule } from '@angular/core';
3
- import { CoreModule } from './core/core.module';
4
- var KeycloakAngularModule = (function () {
5
- function KeycloakAngularModule() {
6
- }
7
- KeycloakAngularModule = __decorate([
8
- NgModule({
9
- imports: [CoreModule]
10
- })
11
- ], KeycloakAngularModule);
12
- return KeycloakAngularModule;
13
- }());
14
- export { KeycloakAngularModule };
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2xvYWstYW5ndWxhci5tb2R1bGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9rZXljbG9hay1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2tleWNsb2FrLWFuZ3VsYXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFRQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUtoRDtJQUFBO0lBQW9DLENBQUM7SUFBeEIscUJBQXFCO1FBSGpDLFFBQVEsQ0FBQztZQUNSLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQztTQUN0QixDQUFDO09BQ1cscUJBQXFCLENBQUc7SUFBRCw0QkFBQztDQUFBLEFBQXJDLElBQXFDO1NBQXhCLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBNYXVyaWNpbyBHZW1lbGxpIFZpZ29sbyBhbmQgY29udHJpYnV0b3JzLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL21hdXJpY2lvdmlnb2xvL2tleWNsb2FrLWFuZ3VsYXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENvcmVNb2R1bGUgfSBmcm9tICcuL2NvcmUvY29yZS5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29yZU1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgS2V5Y2xvYWtBbmd1bGFyTW9kdWxlIHt9XG4iXX0=
@@ -1,7 +0,0 @@
1
- export { KeycloakEventType } from './lib/core/interfaces/keycloak-event';
2
- export { KeycloakAuthGuard } from './lib/core/services/keycloak-auth-guard';
3
- export { KeycloakService } from './lib/core/services/keycloak.service';
4
- export { KeycloakBearerInterceptor } from './lib/core/interceptors/keycloak-bearer.interceptor';
5
- export { CoreModule } from './lib/core/core.module';
6
- export { KeycloakAngularModule } from './lib/keycloak-angular.module';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2tleWNsb2FrLWFuZ3VsYXIvIiwic291cmNlcyI6WyJwdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE9BQU8sRUFFTCxpQkFBaUIsRUFDbEIsTUFBTSxzQ0FBc0MsQ0FBQztBQU05QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUNMLHlCQUF5QixFQUMxQixNQUFNLHFEQUFxRCxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBNYXVyaWNpbyBHZW1lbGxpIFZpZ29sbyBhbmQgY29udHJpYnV0b3JzLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL21hdXJpY2lvdmlnb2xvL2tleWNsb2FrLWFuZ3VsYXIvTElDRU5TRVxuICovXG5cbmV4cG9ydCB7IEtleWNsb2FrQ29uZmlnIH0gZnJvbSAnLi9saWIvY29yZS9pbnRlcmZhY2VzL2tleWNsb2FrLWNvbmZpZyc7XG5leHBvcnQge1xuICBLZXljbG9ha0V2ZW50LFxuICBLZXljbG9ha0V2ZW50VHlwZVxufSBmcm9tICcuL2xpYi9jb3JlL2ludGVyZmFjZXMva2V5Y2xvYWstZXZlbnQnO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgS2V5Y2xvYWsncyBpbnRlcm5hbCB0eXBlcyBpbnN0ZWFkLlxuICovXG5leHBvcnQgdHlwZSBLZXljbG9ha0luaXRPcHRpb25zID0gS2V5Y2xvYWsuS2V5Y2xvYWtJbml0T3B0aW9ucztcbmV4cG9ydCB7IEtleWNsb2FrT3B0aW9ucyB9IGZyb20gJy4vbGliL2NvcmUvaW50ZXJmYWNlcy9rZXljbG9hay1vcHRpb25zJztcbmV4cG9ydCB7IEtleWNsb2FrQXV0aEd1YXJkIH0gZnJvbSAnLi9saWIvY29yZS9zZXJ2aWNlcy9rZXljbG9hay1hdXRoLWd1YXJkJztcbmV4cG9ydCB7IEtleWNsb2FrU2VydmljZSB9IGZyb20gJy4vbGliL2NvcmUvc2VydmljZXMva2V5Y2xvYWsuc2VydmljZSc7XG5leHBvcnQge1xuICBLZXljbG9ha0JlYXJlckludGVyY2VwdG9yXG59IGZyb20gJy4vbGliL2NvcmUvaW50ZXJjZXB0b3JzL2tleWNsb2FrLWJlYXJlci5pbnRlcmNlcHRvcic7XG5leHBvcnQgeyBDb3JlTW9kdWxlIH0gZnJvbSAnLi9saWIvY29yZS9jb3JlLm1vZHVsZSc7XG5leHBvcnQgeyBLZXljbG9ha0FuZ3VsYXJNb2R1bGUgfSBmcm9tICcuL2xpYi9rZXljbG9hay1hbmd1bGFyLm1vZHVsZSc7XG4iXX0=