keycloak-angular 7.0.1 → 7.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -21
- package/bundles/keycloak-angular.umd.js +309 -216
- package/bundles/keycloak-angular.umd.js.map +1 -1
- package/bundles/keycloak-angular.umd.min.js +15 -1
- package/bundles/keycloak-angular.umd.min.js.map +1 -1
- package/esm2015/keycloak-angular.js +2 -2
- package/esm2015/lib/core/core.module.js +18 -16
- package/esm2015/lib/core/interceptors/keycloak-bearer.interceptor.js +20 -14
- package/esm2015/lib/core/interfaces/keycloak-config.js +1 -8
- package/esm2015/lib/core/interfaces/keycloak-event.js +11 -23
- package/esm2015/lib/core/interfaces/keycloak-options.js +1 -21
- package/esm2015/lib/core/services/keycloak-auth-guard.js +4 -11
- package/esm2015/lib/core/services/keycloak.service.js +78 -134
- package/esm2015/lib/core/utils/to-promise.js +10 -0
- package/esm2015/lib/keycloak-angular.module.js +10 -8
- package/esm2015/public_api.js +1 -1
- package/esm5/keycloak-angular.js +2 -2
- package/esm5/lib/core/core.module.js +15 -14
- package/esm5/lib/core/interceptors/keycloak-bearer.interceptor.js +15 -10
- package/esm5/lib/core/interfaces/keycloak-config.js +1 -8
- package/esm5/lib/core/interfaces/keycloak-event.js +11 -23
- package/esm5/lib/core/interfaces/keycloak-options.js +1 -21
- package/esm5/lib/core/services/keycloak-auth-guard.js +5 -12
- package/esm5/lib/core/services/keycloak.service.js +131 -183
- package/esm5/lib/core/utils/to-promise.js +10 -0
- package/esm5/lib/keycloak-angular.module.js +7 -6
- package/esm5/public_api.js +1 -1
- package/fesm2015/keycloak-angular.js +134 -172
- package/fesm2015/keycloak-angular.js.map +1 -1
- package/fesm5/keycloak-angular.js +175 -208
- package/fesm5/keycloak-angular.js.map +1 -1
- package/keycloak-angular.metadata.json +1 -1
- package/lib/core/interceptors/keycloak-bearer.interceptor.d.ts +1 -0
- package/lib/core/interfaces/keycloak-config.d.ts +2 -2
- package/lib/core/interfaces/keycloak-options.d.ts +1 -2
- package/lib/core/services/keycloak-auth-guard.d.ts +3 -3
- package/lib/core/services/keycloak.service.d.ts +7 -7
- package/lib/core/utils/to-promise.d.ts +7 -0
- package/package.json +8 -9
- package/public_api.d.ts +1 -1
- package/esm2015/lib/core/interfaces/keycloak-init-options.js +0 -13
- package/esm5/lib/core/interfaces/keycloak-init-options.js +0 -13
- package/lib/core/interfaces/keycloak-init-options.d.ts +0 -15
|
@@ -1,55 +1,57 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { __awaiter, __decorate, __generator, __read, __spread, __values } from "tslib";
|
|
2
2
|
import { Injectable } from '@angular/core';
|
|
3
3
|
import { HttpHeaders } from '@angular/common/http';
|
|
4
|
-
import {
|
|
4
|
+
import { Subject, from } from 'rxjs';
|
|
5
|
+
import { map } from 'rxjs/operators';
|
|
5
6
|
import * as Keycloak_ from 'keycloak-js';
|
|
6
7
|
export var Keycloak = Keycloak_;
|
|
7
8
|
import { KeycloakEventType } from '../interfaces/keycloak-event';
|
|
9
|
+
import { toPromise } from '../utils/to-promise';
|
|
8
10
|
var KeycloakService = (function () {
|
|
9
11
|
function KeycloakService() {
|
|
10
12
|
this._keycloakEvents$ = new Subject();
|
|
11
13
|
}
|
|
12
14
|
KeycloakService.prototype.bindsKeycloakEvents = function () {
|
|
13
15
|
var _this = this;
|
|
14
|
-
this._instance.onAuthError =
|
|
16
|
+
this._instance.onAuthError = function (errorData) {
|
|
15
17
|
_this._keycloakEvents$.next({
|
|
16
18
|
args: errorData,
|
|
17
|
-
type: KeycloakEventType.OnAuthError
|
|
19
|
+
type: KeycloakEventType.OnAuthError,
|
|
18
20
|
});
|
|
19
|
-
}
|
|
20
|
-
this._instance.onAuthLogout =
|
|
21
|
+
};
|
|
22
|
+
this._instance.onAuthLogout = function () {
|
|
21
23
|
_this._keycloakEvents$.next({ type: KeycloakEventType.OnAuthLogout });
|
|
22
|
-
}
|
|
23
|
-
this._instance.onAuthRefreshSuccess =
|
|
24
|
+
};
|
|
25
|
+
this._instance.onAuthRefreshSuccess = function () {
|
|
24
26
|
_this._keycloakEvents$.next({
|
|
25
|
-
type: KeycloakEventType.OnAuthRefreshSuccess
|
|
27
|
+
type: KeycloakEventType.OnAuthRefreshSuccess,
|
|
26
28
|
});
|
|
27
|
-
}
|
|
28
|
-
this._instance.onAuthRefreshError =
|
|
29
|
+
};
|
|
30
|
+
this._instance.onAuthRefreshError = function () {
|
|
29
31
|
_this._keycloakEvents$.next({
|
|
30
|
-
type: KeycloakEventType.OnAuthRefreshError
|
|
32
|
+
type: KeycloakEventType.OnAuthRefreshError,
|
|
31
33
|
});
|
|
32
|
-
}
|
|
33
|
-
this._instance.onAuthSuccess =
|
|
34
|
+
};
|
|
35
|
+
this._instance.onAuthSuccess = function () {
|
|
34
36
|
_this._keycloakEvents$.next({ type: KeycloakEventType.OnAuthSuccess });
|
|
35
|
-
}
|
|
36
|
-
this._instance.onTokenExpired =
|
|
37
|
+
};
|
|
38
|
+
this._instance.onTokenExpired = function () {
|
|
37
39
|
_this._keycloakEvents$.next({
|
|
38
|
-
type: KeycloakEventType.OnTokenExpired
|
|
40
|
+
type: KeycloakEventType.OnTokenExpired,
|
|
39
41
|
});
|
|
40
|
-
}
|
|
41
|
-
this._instance.onReady =
|
|
42
|
+
};
|
|
43
|
+
this._instance.onReady = function (authenticated) {
|
|
42
44
|
_this._keycloakEvents$.next({
|
|
43
45
|
args: authenticated,
|
|
44
|
-
type: KeycloakEventType.OnReady
|
|
46
|
+
type: KeycloakEventType.OnReady,
|
|
45
47
|
});
|
|
46
|
-
}
|
|
48
|
+
};
|
|
47
49
|
};
|
|
48
50
|
KeycloakService.prototype.loadExcludedUrls = function (bearerExcludedUrls) {
|
|
49
51
|
var e_1, _a;
|
|
50
52
|
var excludedUrls = [];
|
|
51
53
|
try {
|
|
52
|
-
for (var bearerExcludedUrls_1 =
|
|
54
|
+
for (var bearerExcludedUrls_1 = __values(bearerExcludedUrls), bearerExcludedUrls_1_1 = bearerExcludedUrls_1.next(); !bearerExcludedUrls_1_1.done; bearerExcludedUrls_1_1 = bearerExcludedUrls_1.next()) {
|
|
53
55
|
var item = bearerExcludedUrls_1_1.value;
|
|
54
56
|
var excludedUrl = void 0;
|
|
55
57
|
if (typeof item === 'string') {
|
|
@@ -58,7 +60,7 @@ var KeycloakService = (function () {
|
|
|
58
60
|
else {
|
|
59
61
|
excludedUrl = {
|
|
60
62
|
urlPattern: new RegExp(item.url, 'i'),
|
|
61
|
-
httpMethods: item.httpMethods
|
|
63
|
+
httpMethods: item.httpMethods,
|
|
62
64
|
};
|
|
63
65
|
}
|
|
64
66
|
excludedUrls.push(excludedUrl);
|
|
@@ -83,90 +85,77 @@ var KeycloakService = (function () {
|
|
|
83
85
|
this._silentRefresh = initOptions ? initOptions.flow === 'implicit' : false;
|
|
84
86
|
};
|
|
85
87
|
KeycloakService.prototype.init = function (options) {
|
|
86
|
-
var _this = this;
|
|
87
88
|
if (options === void 0) { options = {}; }
|
|
88
|
-
return
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
return [2];
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
}); }))
|
|
110
|
-
.error((function (kcError) {
|
|
111
|
-
var msg = 'An error happened during Keycloak initialization.';
|
|
112
|
-
if (kcError) {
|
|
113
|
-
var error = kcError.error, error_description = kcError.error_description;
|
|
114
|
-
msg = msg.concat("\nAdapter error details:\nError: " + error + "\nDescription: " + error_description);
|
|
89
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
90
|
+
var config, initOptions, authenticated;
|
|
91
|
+
return __generator(this, function (_a) {
|
|
92
|
+
switch (_a.label) {
|
|
93
|
+
case 0:
|
|
94
|
+
this.initServiceValues(options);
|
|
95
|
+
config = options.config, initOptions = options.initOptions;
|
|
96
|
+
this._instance = Keycloak(config);
|
|
97
|
+
this.bindsKeycloakEvents();
|
|
98
|
+
return [4, toPromise(this._instance.init(initOptions))];
|
|
99
|
+
case 1:
|
|
100
|
+
authenticated = _a.sent();
|
|
101
|
+
if (!(authenticated && this._loadUserProfileAtStartUp)) return [3, 3];
|
|
102
|
+
return [4, this.loadUserProfile()];
|
|
103
|
+
case 2:
|
|
104
|
+
_a.sent();
|
|
105
|
+
_a.label = 3;
|
|
106
|
+
case 3: return [2, authenticated];
|
|
115
107
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}));
|
|
108
|
+
});
|
|
109
|
+
});
|
|
119
110
|
};
|
|
120
111
|
KeycloakService.prototype.login = function (options) {
|
|
121
|
-
var _this = this;
|
|
122
112
|
if (options === void 0) { options = {}; }
|
|
123
|
-
return
|
|
124
|
-
|
|
125
|
-
.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
}); }))
|
|
141
|
-
.error((function () { return reject("An error happened during the login."); }));
|
|
142
|
-
}));
|
|
113
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
114
|
+
return __generator(this, function (_a) {
|
|
115
|
+
switch (_a.label) {
|
|
116
|
+
case 0: return [4, toPromise(this._instance.login(options))];
|
|
117
|
+
case 1:
|
|
118
|
+
_a.sent();
|
|
119
|
+
if (!this._loadUserProfileAtStartUp) return [3, 3];
|
|
120
|
+
return [4, this.loadUserProfile()];
|
|
121
|
+
case 2:
|
|
122
|
+
_a.sent();
|
|
123
|
+
_a.label = 3;
|
|
124
|
+
case 3: return [2];
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
});
|
|
143
128
|
};
|
|
144
129
|
KeycloakService.prototype.logout = function (redirectUri) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
130
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
131
|
+
var options;
|
|
132
|
+
return __generator(this, function (_a) {
|
|
133
|
+
switch (_a.label) {
|
|
134
|
+
case 0:
|
|
135
|
+
options = {
|
|
136
|
+
redirectUri: redirectUri,
|
|
137
|
+
};
|
|
138
|
+
return [4, toPromise(this._instance.logout(options))];
|
|
139
|
+
case 1:
|
|
140
|
+
_a.sent();
|
|
141
|
+
this._userProfile = undefined;
|
|
142
|
+
return [2];
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
158
146
|
};
|
|
159
147
|
KeycloakService.prototype.register = function (options) {
|
|
160
|
-
var _this = this;
|
|
161
148
|
if (options === void 0) { options = { action: 'register' }; }
|
|
162
|
-
return
|
|
163
|
-
|
|
164
|
-
.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
149
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
150
|
+
return __generator(this, function (_a) {
|
|
151
|
+
switch (_a.label) {
|
|
152
|
+
case 0: return [4, toPromise(this._instance.register(options))];
|
|
153
|
+
case 1:
|
|
154
|
+
_a.sent();
|
|
155
|
+
return [2];
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
170
159
|
};
|
|
171
160
|
KeycloakService.prototype.isUserInRole = function (role, resource) {
|
|
172
161
|
var hasRole;
|
|
@@ -190,14 +179,14 @@ var KeycloakService = (function () {
|
|
|
190
179
|
}
|
|
191
180
|
if (allRoles && this._instance.realmAccess) {
|
|
192
181
|
var realmRoles = this._instance.realmAccess['roles'] || [];
|
|
193
|
-
roles.push.apply(roles,
|
|
182
|
+
roles.push.apply(roles, __spread(realmRoles));
|
|
194
183
|
}
|
|
195
184
|
return roles;
|
|
196
185
|
};
|
|
197
186
|
KeycloakService.prototype.isLoggedIn = function () {
|
|
198
|
-
return
|
|
187
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
199
188
|
var error_1;
|
|
200
|
-
return
|
|
189
|
+
return __generator(this, function (_a) {
|
|
201
190
|
switch (_a.label) {
|
|
202
191
|
case 0:
|
|
203
192
|
_a.trys.push([0, 2, , 3]);
|
|
@@ -221,85 +210,73 @@ var KeycloakService = (function () {
|
|
|
221
210
|
return this._instance.isTokenExpired(minValidity);
|
|
222
211
|
};
|
|
223
212
|
KeycloakService.prototype.updateToken = function (minValidity) {
|
|
224
|
-
var _this = this;
|
|
225
213
|
if (minValidity === void 0) { minValidity = 5; }
|
|
226
|
-
return
|
|
227
|
-
return
|
|
214
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
215
|
+
return __generator(this, function (_a) {
|
|
228
216
|
if (this._silentRefresh) {
|
|
229
217
|
if (this.isTokenExpired()) {
|
|
230
|
-
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
resolve(true);
|
|
218
|
+
throw new Error('Failed to refresh the token, or the session is expired');
|
|
234
219
|
}
|
|
235
|
-
return [2];
|
|
220
|
+
return [2, true];
|
|
236
221
|
}
|
|
237
222
|
if (!this._instance) {
|
|
238
|
-
|
|
239
|
-
return [2];
|
|
223
|
+
throw new Error('Keycloak Angular library is not initialized.');
|
|
240
224
|
}
|
|
241
|
-
this._instance
|
|
242
|
-
.updateToken(minValidity)
|
|
243
|
-
.success((function (refreshed) {
|
|
244
|
-
resolve(refreshed);
|
|
245
|
-
}))
|
|
246
|
-
.error((function () { return reject('Failed to refresh the token, or the session is expired'); }));
|
|
247
|
-
return [2];
|
|
225
|
+
return [2, toPromise(this._instance.updateToken(minValidity))];
|
|
248
226
|
});
|
|
249
|
-
});
|
|
227
|
+
});
|
|
250
228
|
};
|
|
251
229
|
KeycloakService.prototype.loadUserProfile = function (forceReload) {
|
|
252
|
-
var _this = this;
|
|
253
230
|
if (forceReload === void 0) { forceReload = false; }
|
|
254
|
-
return
|
|
255
|
-
var
|
|
256
|
-
return
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
231
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
232
|
+
var _a;
|
|
233
|
+
return __generator(this, function (_b) {
|
|
234
|
+
switch (_b.label) {
|
|
235
|
+
case 0:
|
|
236
|
+
if (this._userProfile && !forceReload) {
|
|
237
|
+
return [2, this._userProfile];
|
|
238
|
+
}
|
|
239
|
+
if (!this._instance.authenticated) {
|
|
240
|
+
throw new Error('The user profile was not loaded as the user is not logged in.');
|
|
241
|
+
}
|
|
242
|
+
_a = this;
|
|
243
|
+
return [4, toPromise(this._instance.loadUserProfile())];
|
|
244
|
+
case 1: return [2, (_a._userProfile = _b.sent())];
|
|
264
245
|
}
|
|
265
|
-
this._instance
|
|
266
|
-
.loadUserProfile()
|
|
267
|
-
.success((function (result) {
|
|
268
|
-
_this._userProfile = ((result));
|
|
269
|
-
resolve(_this._userProfile);
|
|
270
|
-
}))
|
|
271
|
-
.error((function () { return reject('The user profile could not be loaded.'); }));
|
|
272
|
-
return [2];
|
|
273
246
|
});
|
|
274
|
-
});
|
|
247
|
+
});
|
|
275
248
|
};
|
|
276
|
-
KeycloakService.prototype.getToken = function () {
|
|
277
|
-
|
|
278
|
-
return
|
|
249
|
+
KeycloakService.prototype.getToken = function (forceLogin) {
|
|
250
|
+
if (forceLogin === void 0) { forceLogin = true; }
|
|
251
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
279
252
|
var error_2;
|
|
280
|
-
return
|
|
253
|
+
return __generator(this, function (_a) {
|
|
281
254
|
switch (_a.label) {
|
|
282
255
|
case 0:
|
|
283
256
|
_a.trys.push([0, 2, , 3]);
|
|
284
257
|
return [4, this.updateToken(10)];
|
|
285
258
|
case 1:
|
|
286
259
|
_a.sent();
|
|
287
|
-
|
|
288
|
-
return [3, 3];
|
|
260
|
+
return [2, this._instance.token];
|
|
289
261
|
case 2:
|
|
290
262
|
error_2 = _a.sent();
|
|
291
|
-
|
|
263
|
+
if (forceLogin) {
|
|
264
|
+
this.login();
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
throw error_2;
|
|
268
|
+
}
|
|
292
269
|
return [3, 3];
|
|
293
270
|
case 3: return [2];
|
|
294
271
|
}
|
|
295
272
|
});
|
|
296
|
-
});
|
|
273
|
+
});
|
|
297
274
|
};
|
|
298
275
|
KeycloakService.prototype.getUsername = function () {
|
|
299
276
|
if (!this._userProfile) {
|
|
300
277
|
throw new Error('User not logged in or user profile was not loaded.');
|
|
301
278
|
}
|
|
302
|
-
return
|
|
279
|
+
return this._userProfile.username;
|
|
303
280
|
};
|
|
304
281
|
KeycloakService.prototype.clearToken = function () {
|
|
305
282
|
this._instance.clearToken();
|
|
@@ -307,27 +284,9 @@ var KeycloakService = (function () {
|
|
|
307
284
|
KeycloakService.prototype.addTokenToHeader = function (headers) {
|
|
308
285
|
var _this = this;
|
|
309
286
|
if (headers === void 0) { headers = new HttpHeaders(); }
|
|
310
|
-
return
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
switch (_a.label) {
|
|
314
|
-
case 0:
|
|
315
|
-
_a.trys.push([0, 2, , 3]);
|
|
316
|
-
return [4, this.getToken()];
|
|
317
|
-
case 1:
|
|
318
|
-
token = _a.sent();
|
|
319
|
-
headers = headers.set(this._authorizationHeaderName, this._bearerPrefix + token);
|
|
320
|
-
observer.next(headers);
|
|
321
|
-
observer.complete();
|
|
322
|
-
return [3, 3];
|
|
323
|
-
case 2:
|
|
324
|
-
error_3 = _a.sent();
|
|
325
|
-
observer.error(error_3);
|
|
326
|
-
return [3, 3];
|
|
327
|
-
case 3: return [2];
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
}); }));
|
|
287
|
+
return from(this.getToken()).pipe(map(function (token) {
|
|
288
|
+
return headers.set(_this._authorizationHeaderName, _this._bearerPrefix + token);
|
|
289
|
+
}));
|
|
331
290
|
};
|
|
332
291
|
KeycloakService.prototype.getKeycloakInstance = function () {
|
|
333
292
|
return this._instance;
|
|
@@ -353,21 +312,10 @@ var KeycloakService = (function () {
|
|
|
353
312
|
enumerable: true,
|
|
354
313
|
configurable: true
|
|
355
314
|
});
|
|
356
|
-
KeycloakService
|
|
357
|
-
|
|
358
|
-
];
|
|
315
|
+
KeycloakService = __decorate([
|
|
316
|
+
Injectable()
|
|
317
|
+
], KeycloakService);
|
|
359
318
|
return KeycloakService;
|
|
360
319
|
}());
|
|
361
320
|
export { KeycloakService };
|
|
362
|
-
if (false) {
|
|
363
|
-
KeycloakService.prototype._instance;
|
|
364
|
-
KeycloakService.prototype._userProfile;
|
|
365
|
-
KeycloakService.prototype._enableBearerInterceptor;
|
|
366
|
-
KeycloakService.prototype._silentRefresh;
|
|
367
|
-
KeycloakService.prototype._loadUserProfileAtStartUp;
|
|
368
|
-
KeycloakService.prototype._bearerPrefix;
|
|
369
|
-
KeycloakService.prototype._authorizationHeaderName;
|
|
370
|
-
KeycloakService.prototype._excludedUrls;
|
|
371
|
-
KeycloakService.prototype._keycloakEvents$;
|
|
372
|
-
}
|
|
373
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2xvYWsuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2tleWNsb2FrLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY29yZS9zZXJ2aWNlcy9rZXljbG9hay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFRQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsVUFBVSxFQUFZLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdyRCxPQUFPLEtBQUssU0FBUyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxNQUFNLEtBQU8sUUFBUSxHQUFHLFNBQVM7QUFHakMsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBU2hGO0lBQUE7UUF1Q1UscUJBQWdCLEdBQTJCLElBQUksT0FBTyxFQUFpQixDQUFDO0lBeWdCbEYsQ0FBQztJQWhnQlMsNkNBQW1CLEdBQTNCO1FBQUEsaUJBd0NDO1FBdkNDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxJQUFHLFVBQUEsU0FBUztZQUNwQyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2dCQUN6QixJQUFJLEVBQUUsU0FBUztnQkFDZixJQUFJLEVBQUUsaUJBQWlCLENBQUMsV0FBVzthQUNwQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUEsQ0FBQztRQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxJQUFHO1lBQzVCLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUEsQ0FBQztRQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLElBQUc7WUFDcEMsS0FBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztnQkFDekIsSUFB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QTZDO0lBSTdDLHVDQUErQztJQUkvQyxtREFBMEM7SUFLMUMseUNBQWdDO0lBS2hDLG9EQUEyQztJQUkzQyx3Q0FBOEI7SUFJOUIsbURBQXlDO0lBSXpDLHdDQUEwQztJQUkxQywyQ0FBZ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgTWF1cmljaW8gR2VtZWxsaSBWaWdvbG8gYW5kIGNvbnRyaWJ1dG9ycy5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXVyaWNpb3ZpZ29sby9rZXljbG9hay1hbmd1bGFyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLy8gV29ya2Fyb3VuZCBmb3Igcm9sbHVwIGxpYnJhcnkgYmVoYXZpb3VyLCBhcyBwb2ludGVkIG91dCBvbiBpc3N1ZSAjMTI2NyAoaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9yb2xsdXAvaXNzdWVzLzEyNjcpLlxuaW1wb3J0ICogYXMgS2V5Y2xvYWtfIGZyb20gJ2tleWNsb2FrLWpzJztcbmV4cG9ydCBjb25zdCBLZXljbG9hayA9IEtleWNsb2FrXztcblxuaW1wb3J0IHsgRXhjbHVkZWRVcmwsIEV4Y2x1ZGVkVXJsUmVnZXgsIEtleWNsb2FrT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMva2V5Y2xvYWstb3B0aW9ucyc7XG5pbXBvcnQgeyBLZXljbG9ha0V2ZW50LCBLZXljbG9ha0V2ZW50VHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMva2V5Y2xvYWstZXZlbnQnO1xuXG4vKipcbiAqIFNlcnZpY2UgdG8gZXhwb3NlIGV4aXN0ZW50IG1ldGhvZHMgZnJvbSB0aGUgS2V5Y2xvYWsgSlMgYWRhcHRlciwgYWRkaW5nIG5ld1xuICogZnVuY3Rpb25hbGl0aWVzIHRvIGltcHJvdmUgdGhlIHVzZSBvZiBrZXljbG9hayBpbiBBbmd1bGFyIHYgPiA0LjMgYXBwbGljYXRpb25zLlxuICpcbiAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIGluamVjdGVkIGluIHRoZSBhcHBsaWNhdGlvbiBib290c3RyYXAsIHNvIHRoZSBzYW1lIGluc3RhbmNlIHdpbGwgYmUgdXNlZFxuICogYWxvbmcgdGhlIHdlYiBhcHBsaWNhdGlvbi5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEtleWNsb2FrU2VydmljZSB7XG4gIC8qKlxuICAgKiBLZXljbG9hay1qcyBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgX2luc3RhbmNlOiBLZXljbG9hay5LZXljbG9ha0luc3RhbmNlO1xuICAvKipcbiAgICogVXNlciBwcm9maWxlIGFzIEtleWNsb2FrUHJvZmlsZSBpbnRlcmZhY2UuXG4gICAqL1xuICBwcml2YXRlIF91c2VyUHJvZmlsZTogS2V5Y2xvYWsuS2V5Y2xvYWtQcm9maWxlO1xuICAvKipcbiAgICogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgYmVhcmVyIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBhdXRob3JpemF0aW9uIGhlYWRlci5cbiAgICovXG4gIHByaXZhdGUgX2VuYWJsZUJlYXJlckludGVyY2VwdG9yOiBib29sZWFuO1xuICAvKipcbiAgICogV2hlbiB0aGUgaW1wbGljaXQgZmxvdyBpcyBjaG9vc2VuIHRoZXJlIG11c3QgZXhpc3QgYSBzaWxlbnRSZWZyZXNoLCBhcyB0aGVyZSBpc1xuICAgKiBubyByZWZyZXNoIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2lsZW50UmVmcmVzaDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHByb2ZpbGUgc2hvdWxkIGJlIGxvYWRlZCBhdCB0aGUga2V5Y2xvYWsgaW5pdGlhbGl6YXRpb24sXG4gICAqIGp1c3QgYWZ0ZXIgdGhlIGxvZ2luLlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9hZFVzZXJQcm9maWxlQXRTdGFydFVwOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGJlYXJlciBwcmVmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBBdXRob3JpemF0aW9uIEhlYWRlci5cbiAgICovXG4gIHByaXZhdGUgX2JlYXJlclByZWZpeDogc3RyaW5nO1xuICAvKipcbiAgICogVmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIEF1dGhvcml6YXRpb24gSHR0cCBIZWFkZXIgbmFtZS5cbiAgICovXG4gIHByaXZhdGUgX2F1dGhvcml6YXRpb25IZWFkZXJOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZXhjbHVkZWQgdXJscyBwYXR0ZXJucyB0aGF0IG11c3Qgc2tpcCB0aGUgS2V5Y2xvYWtCZWFyZXJJbnRlcmNlcHRvci5cbiAgICovXG4gIHByaXZhdGUgX2V4Y2x1ZGVkVXJsczogRXhjbHVkZWRVcmxSZWdleFtdO1xuICAvKipcbiAgICogT2JzZXJ2ZXIgZm9yIHRoZSBrZXljbG9hayBldmVudHNcbiAgICovXG4gIHByaXZhdGUgX2tleWNsb2FrRXZlbnRzJDogU3ViamVjdDxLZXljbG9ha0V2ZW50PiA9IG5ldyBTdWJqZWN0PEtleWNsb2FrRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBrZXljbG9hay1qcyBldmVudHMgdG8gdGhlIGtleWNsb2FrRXZlbnRzIFN1YmplY3RcbiAgICogd2hpY2ggaXMgYSBnb29kIHdheSB0byBtb25pdG9yIGZvciBjaGFuZ2VzLCBpZiBuZWVkZWQuXG4gICAqXG4gICAqIFRoZSBrZXljbG9ha0V2ZW50cyByZXR1cm5zIHRoZSBrZXljbG9hay1qcyBldmVudCB0eXBlIGFuZCBhbnlcbiAgICogYXJndW1lbnQgaWYgdGhlIHNvdXJjZSBmdW5jdGlvbiBwcm92aWRlcyBhbnkuXG4gICAqL1xuICBwcml2YXRlIGJpbmRzS2V5Y2xvYWtFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5faW5zdGFuY2Uub25BdXRoRXJyb3IgPSBlcnJvckRhdGEgPT4ge1xuICAgICAgdGhpcy5fa2V5Y2xvYWtFdmVudHMkLm5leHQoe1xuICAgICAgICBhcmdzOiBlcnJvckRhdGEsXG4gICAgICAgIHR5cGU6IEtleWNsb2FrRXZlbnRUeXBlLk9uQXV0aEVycm9yXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5faW5zdGFuY2Uub25BdXRoTG9nb3V0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5fa2V5Y2xvYWtFdmVudHMkLm5leHQoeyB0eXBlOiBLZXljbG9ha0V2ZW50VHlwZS5PbkF1dGhMb2dvdXQgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuX2luc3RhbmNlLm9uQXV0aFJlZnJlc2hTdWNjZXNzID0gKCkgPT4ge1xuICAgICAgdGhpcy5fa2V5Y2xvYWtFdmVudHMkLm5leHQoe1xuICAgICAgICB0eXBlOiBLZXljbG9ha0V2ZW50VHlwZS5PbkF1dGhSZWZyZXNoU3VjY2Vzc1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuX2luc3RhbmNlLm9uQXV0aFJlZnJlc2hFcnJvciA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2tleWNsb2FrRXZlbnRzJC5uZXh0KHtcbiAgICAgICAgdHlwZTogS2V5Y2xvYWtFdmVudFR5cGUuT25BdXRoUmVmcmVzaEVycm9yXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5faW5zdGFuY2Uub25BdXRoU3VjY2VzcyA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2tleWNsb2FrRXZlbnRzJC5uZXh0KHsgdHlwZTogS2V5Y2xvYWtFdmVudFR5cGUuT25BdXRoU3VjY2VzcyB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5faW5zdGFuY2Uub25Ub2tlbkV4cGlyZWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9rZXljbG9ha0V2ZW50cyQubmV4dCh7XG4gICAgICAgIHR5cGU6IEtleWNsb2FrRXZlbnRUeXBlLk9uVG9rZW5FeHBpcmVkXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5faW5zdGFuY2Uub25SZWFkeSA9IGF1dGhlbnRpY2F0ZWQgPT4ge1xuICAgICAgdGhpcy5fa2V5Y2xvYWtFdmVudHMkLm5leHQoe1xuICAgICAgICBhcmdzOiBhdXRoZW50aWNhdGVkLFxuICAgICAgICB0eXBlOiBLZXljbG9ha0V2ZW50VHlwZS5PblJlYWR5XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFsbCBiZWFyZXJFeGNsdWRlZFVybCBjb250ZW50IGluIGEgdW5pZm9ybSB0eXBlOiBFeGNsdWRlZFVybCxcbiAgICogc28gaXQgYmVjb21lcyBlYXNpZXIgdG8gaGFuZGxlLlxuICAgKlxuICAgKiBAcGFyYW0gYmVhcmVyRXhjbHVkZWRVcmxzIGFycmF5IG9mIHN0cmluZ3Mgb3IgRXhjbHVkZWRVcmwgdGhhdCBpbmNsdWRlc1xuICAgKiB0aGUgdXJsIGFuZCBIdHRwTWV0aG9kLlxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkRXhjbHVkZWRVcmxzKGJlYXJlckV4Y2x1ZGVkVXJsczogKHN0cmluZyB8IEV4Y2x1ZGVkVXJsKVtdKTogRXhjbHVkZWRVcmxSZWdleFtdIHtcbiAgICBjb25zdCBleGNsdWRlZFVybHM6IEV4Y2x1ZGVkVXJsUmVnZXhbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBiZWFyZXJFeGNsdWRlZFVybHMpIHtcbiAgICAgIGxldCBleGNsdWRlZFVybDogRXhjbHVkZWRVcmxSZWdleDtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZXhjbHVkZWRVcmwgPSB7IHVybFBhdHRlcm46IG5ldyBSZWdFeHAoaXRlbSwgJ2knKSwgaHR0cE1ldGhvZHM6IFtdIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGNsdWRlZFVybCA9IHtcbiAgICAgICAgICB1cmxQYXR0ZXJuOiBuZXcgUmVnRXhwKGl0ZW0udXJsLCAnaScpLFxuICAgICAgICAgIGh0dHBNZXRob2RzOiBpdGVtLmh0dHBNZXRob2RzXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBleGNsdWRlZFVybHMucHVzaChleGNsdWRlZFVybCk7XG4gICAgfVxuICAgIHJldHVybiBleGNsdWRlZFVybHM7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY2xhc3MgdmFsdWVzIGluaXRpYWxpemF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0U2VydmljZVZhbHVlcyh7XG4gICAgZW5hYmxlQmVhcmVySW50ZXJjZXB0b3IgPSB0cnVlLFxuICAgIGxvYWRVc2VyUHJvZmlsZUF0U3RhcnRVcCA9IHRydWUsXG4gICAgYmVhcmVyRXhjbHVkZWRVcmxzID0gW10sXG4gICAgYXV0aG9yaXphdGlvbkhlYWRlck5hbWUgPSAnQXV0aG9yaXphdGlvbicsXG4gICAgYmVhcmVyUHJlZml4ID0gJ2JlYXJlcicsXG4gICAgaW5pdE9wdGlvbnNcbiAgfTogS2V5Y2xvYWtPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5fZW5hYmxlQmVhcmVySW50ZXJjZXB0b3IgPSBlbmFibGVCZWFyZXJJbnRlcmNlcHRvcjtcbiAgICB0aGlzLl9sb2FkVXNlclByb2ZpbGVBdFN0YXJ0VXAgPSBsb2FkVXNlclByb2ZpbGVBdFN0YXJ0VXA7XG4gICAgdGhpcy5fYXV0aG9yaXphdGlvbkhlYWRlck5hbWUgPSBhdXRob3JpemF0aW9uSGVhZGVyTmFtZTtcbiAgICB0aGlzLl9iZWFyZXJQcmVmaXggPSBiZWFyZXJQcmVmaXgudHJpbSgpLmNvbmNhdCgnICcpO1xuICAgIHRoaXMuX2V4Y2x1ZGVkVXJscyA9IHRoaXMubG9hZEV4Y2x1ZGVkVXJscyhiZWFyZXJFeGNsdWRlZFVybHMpO1xuICAgIHRoaXMuX3NpbGVudFJlZnJlc2ggPSBpbml0T3B0aW9ucyA/IGluaXRPcHRpb25zLmZsb3cgPT09ICdpbXBsaWNpdCcgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLZXljbG9hayBpbml0aWFsaXphdGlvbi4gSXQgc2hvdWxkIGJlIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBhZGFwdGVyLlxuICAgKiBPcHRpb25zIGlzIGEgb2JqZWN0IHdpdGggMiBtYWluIHBhcmFtZXRlcnM6IGNvbmZpZyBhbmQgaW5pdE9wdGlvbnMuIFRoZSBmaXJzdCBvbmVcbiAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgS2V5Y2xvYWsgaW5zdGFuY2UuIFRoZSBzZWNvbmQgb25lIGFyZSBvcHRpb25zIHRvIGluaXRpYWxpemUgdGhlXG4gICAqIGtleWNsb2FrIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBDb25maWc6IG1heSBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGtleWNsb2FrIFVSSSBvciBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICogZm9sbG93aW5nIGNvbnRlbnQ6XG4gICAqIC0gdXJsOiBLZXljbG9hayBqc29uIFVSTFxuICAgKiAtIHJlYWxtOiByZWFsbSBuYW1lXG4gICAqIC0gY2xpZW50SWQ6IGNsaWVudCBpZFxuICAgKlxuICAgKiBpbml0T3B0aW9uczpcbiAgICogLSBvbkxvYWQ6IFNwZWNpZmllcyBhbiBhY3Rpb24gdG8gZG8gb24gbG9hZC4gU3VwcG9ydGVkIHZhbHVlcyBhcmUgJ2xvZ2luLXJlcXVpcmVkJyBvclxuICAgKiAnY2hlY2stc3NvJy5cbiAgICogLSB0b2tlbjogU2V0IGFuIGluaXRpYWwgdmFsdWUgZm9yIHRoZSB0b2tlbi5cbiAgICogLSByZWZyZXNoVG9rZW46IFNldCBhbiBpbml0aWFsIHZhbHVlIGZvciB0aGUgcmVmcmVzaCB0b2tlbi5cbiAgICogLSBpZFRva2VuOiBTZXQgYW4gaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGlkIHRva2VuIChvbmx5IHRvZ2V0aGVyIHdpdGggdG9rZW4gb3IgcmVmcmVzaFRva2VuKS5cbiAgICogLSB0aW1lU2tldzogU2V0IGFuIGluaXRpYWwgdmFsdWUgZm9yIHNrZXcgYmV0d2VlbiBsb2NhbCB0aW1lIGFuZCBLZXljbG9hayBzZXJ2ZXIgaW4gc2Vjb25kc1xuICAgKiAob25seSB0b2dldGhlciB3aXRoIHRva2VuIG9yIHJlZnJlc2hUb2tlbikuXG4gICAqIC0gY2hlY2tMb2dpbklmcmFtZTogU2V0IHRvIGVuYWJsZS9kaXNhYmxlIG1vbml0b3JpbmcgbG9naW4gc3RhdGUgKGRlZmF1bHQgaXMgdHJ1ZSkuXG4gICAqIC0gY2hlY2tMb2dpbklmcmFtZUludGVydmFsOiBTZXQgdGhlIGludGVydmFsIHRvIGNoZWNrIGxvZ2luIHN0YXRlIChkZWZhdWx0IGlzIDUgc2Vjb25kcykuXG4gICAqIC0gcmVzcG9uc2VNb2RlOiBTZXQgdGhlIE9wZW5JRCBDb25uZWN0IHJlc3BvbnNlIG1vZGUgc2VuZCB0byBLZXljbG9hayBzZXJ2ZXIgYXQgbG9naW5cbiAgICogcmVxdWVzdC4gVmFsaWQgdmFsdWVzIGFyZSBxdWVyeSBvciBmcmFnbWVudCAuIERlZmF1bHQgdmFsdWUgaXMgZnJhZ21lbnQsIHdoaWNoIG1lYW5zXG4gICAqIHRoYXQgYWZ0ZXIgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiB3aWxsIEtleWNsb2FrIHJlZGlyZWN0IHRvIGphdmFzY3JpcHQgYXBwbGljYXRpb25cbiAgICogd2l0aCBPcGVuSUQgQ29ubmVjdCBwYXJhbWV0ZXJzIGFkZGVkIGluIFVSTCBmcmFnbWVudC4gVGhpcyBpcyBnZW5lcmFsbHkgc2FmZXIgYW5kXG4gICAqIHJlY29tbWVuZGVkIG92ZXIgcXVlcnkuXG4gICAqIC0gZmxvdzogU2V0IHRoZSBPcGVuSUQgQ29ubmVjdCBmbG93LiBWYWxpZCB2YWx1ZXMgYXJlIHN0YW5kYXJkLCBpbXBsaWNpdCBvciBoeWJyaWQuXG4gICAqXG4gICAqIGVuYWJsZUJlYXJlckludGVyY2VwdG9yOlxuICAgKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBiZWFyZXIgd2lsbCBhZGRlZCB0byB0aGUgYXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gICAqXG4gICAqIGxvYWRVc2VyUHJvZmlsZUluU3RhcnRVcDpcbiAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgcHJvZmlsZSBzaG91bGQgYmUgbG9hZGVkIGF0IHRoZSBrZXljbG9hayBpbml0aWFsaXphdGlvbixcbiAgICoganVzdCBhZnRlciB0aGUgbG9naW4uXG4gICAqXG4gICAqIGJlYXJlckV4Y2x1ZGVkVXJsczpcbiAgICogU3RyaW5nIEFycmF5IHRvIGV4Y2x1ZGUgdGhlIHVybHMgdGhhdCBzaG91bGQgbm90IGhhdmUgdGhlIEF1dGhvcml6YXRpb24gSGVhZGVyIGF1dG9tYXRpY2FsbHlcbiAgICogYWRkZWQuXG4gICAqXG4gICAqIGF1dGhvcml6YXRpb25IZWFkZXJOYW1lOlxuICAgKiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgQXV0aG9yaXphdGlvbiBIdHRwIEhlYWRlciBuYW1lLlxuICAgKlxuICAgKiBiZWFyZXJQcmVmaXg6XG4gICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgQXV0aG9yaXphdGlvbiBIdHRwIEhlYWRlciBwYXJhbS5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQSBQcm9taXNlIHdpdGggYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgaW5pdChvcHRpb25zOiBLZXljbG9ha09wdGlvbnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmluaXRTZXJ2aWNlVmFsdWVzKG9wdGlvbnMpO1xuICAgICAgY29uc3QgeyBjb25maWcsIGluaXRPcHRpb25zIH0gPSBvcHRpb25zO1xuXG4gICAgICB0aGlzLl9pbnN0YW5jZSA9IEtleWNsb2FrKGNvbmZpZyk7XG4gICAgICB0aGlzLmJpbmRzS2V5Y2xvYWtFdmVudHMoKTtcbiAgICAgIHRoaXMuX2luc3RhbmNlXG4gICAgICAgIC5pbml0KGluaXRPcHRpb25zKVxuICAgICAgICAuc3VjY2Vzcyhhc3luYyBhdXRoZW50aWNhdGVkID0+IHtcbiAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZCAmJiB0aGlzLl9sb2FkVXNlclByb2ZpbGVBdFN0YXJ0VXApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFVzZXJQcm9maWxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoYXV0aGVudGljYXRlZCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5lcnJvcihrY0Vycm9yID0+IHtcbiAgICAgICAgICBsZXQgbXNnID0gJ0FuIGVycm9yIGhhcHBlbmVkIGR1cmluZyBLZXljbG9hayBpbml0aWFsaXphdGlvbi4nO1xuICAgICAgICAgIGlmIChrY0Vycm9yKSB7XG4gICAgICAgICAgICBsZXQgeyBlcnJvciwgZXJyb3JfZGVzY3JpcHRpb24gfSA9IGtjRXJyb3I7XG4gICAgICAgICAgICBtc2cgPSBtc2cuY29uY2F0KFxuICAgICAgICAgICAgICBgXFxuQWRhcHRlciBlcnJvciBkZXRhaWxzOlxcbkVycm9yOiAke2Vycm9yfVxcbkRlc2NyaXB0aW9uOiAke2Vycm9yX2Rlc2NyaXB0aW9ufWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRpcmVjdHMgdG8gbG9naW4gZm9ybSBvbiAob3B0aW9ucyBpcyBhbiBvcHRpb25hbCBvYmplY3Qgd2l0aCByZWRpcmVjdFVyaSBhbmQvb3JcbiAgICogcHJvbXB0IGZpZWxkcykuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIE9iamVjdCwgd2hlcmU6XG4gICAqICAtIHJlZGlyZWN0VXJpOiBTcGVjaWZpZXMgdGhlIHVyaSB0byByZWRpcmVjdCB0byBhZnRlciBsb2dpbi5cbiAgICogIC0gcHJvbXB0OkJ5IGRlZmF1bHQgdGhlIGxvZ2luIHNjcmVlbiBpcyBkaXNwbGF5ZWQgaWYgdGhlIHVzZXIgaXMgbm90IGxvZ2dlZC1pbiB0byBLZXljbG9hay5cbiAgICogVG8gb25seSBhdXRoZW50aWNhdGUgdG8gdGhlIGFwcGxpY2F0aW9uIGlmIHRoZSB1c2VyIGlzIGFscmVhZHkgbG9nZ2VkLWluIGFuZCBub3QgZGlzcGxheSB0aGVcbiAgICogbG9naW4gcGFnZSBpZiB0aGUgdXNlciBpcyBub3QgbG9nZ2VkLWluLCBzZXQgdGhpcyBvcHRpb24gdG8gbm9uZS4gVG8gYWx3YXlzIHJlcXVpcmVcbiAgICogcmUtYXV0aGVudGljYXRpb24gYW5kIGlnbm9yZSBTU08sIHNldCB0aGlzIG9wdGlvbiB0byBsb2dpbiAuXG4gICAqICAtIG1heEFnZTogVXNlZCBqdXN0IGlmIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkLiBTcGVjaWZpZXMgbWF4aW11bSB0aW1lIHNpbmNlIHRoZVxuICAgKiBhdXRoZW50aWNhdGlvbiBvZiB1c2VyIGhhcHBlbmVkLiBJZiB1c2VyIGlzIGFscmVhZHkgYXV0aGVudGljYXRlZCBmb3IgbG9uZ2VyIHRpbWUgdGhhblxuICAgKiBtYXhBZ2UsIHRoZSBTU08gaXMgaWdub3JlZCBhbmQgaGUgd2lsbCBuZWVkIHRvIHJlLWF1dGhlbnRpY2F0ZSBhZ2Fpbi5cbiAgICogIC0gbG9naW5IaW50OiBVc2VkIHRvIHByZS1maWxsIHRoZSB1c2VybmFtZS9lbWFpbCBmaWVsZCBvbiB0aGUgbG9naW4gZm9ybS5cbiAgICogIC0gYWN0aW9uOiBJZiB2YWx1ZSBpcyAncmVnaXN0ZXInIHRoZW4gdXNlciBpcyByZWRpcmVjdGVkIHRvIHJlZ2lzdHJhdGlvbiBwYWdlLCBvdGhlcndpc2UgdG9cbiAgICogbG9naW4gcGFnZS5cbiAgICogIC0gbG9jYWxlOiBTcGVjaWZpZXMgdGhlIGRlc2lyZWQgbG9jYWxlIGZvciB0aGUgVUkuXG4gICAqIEByZXR1cm5zXG4gICAqIEEgdm9pZCBQcm9taXNlIGlmIHRoZSBsb2dpbiBpcyBzdWNjZXNzZnVsIGFuZCBhZnRlciB0aGUgdXNlciBwcm9maWxlIGxvYWRpbmcuXG4gICAqL1xuICBsb2dpbihvcHRpb25zOiBLZXljbG9hay5LZXljbG9ha0xvZ2luT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX2luc3RhbmNlXG4gICAgICAgIC5sb2dpbihvcHRpb25zKVxuICAgICAgICAuc3VjY2Vzcyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2xvYWRVc2VyUHJvZmlsZUF0U3RhcnRVcCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkVXNlclByb2ZpbGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuZXJyb3IoKCkgPT4gcmVqZWN0KGBBbiBlcnJvciBoYXBwZW5lZCBkdXJpbmcgdGhlIGxvZ2luLmApKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRpcmVjdHMgdG8gbG9nb3V0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVkaXJlY3RVcmlcbiAgICogU3BlY2lmaWVzIHRoZSB1cmkgdG8gcmVkaXJlY3QgdG8gYWZ0ZXIgbG9nb3V0LlxuICAgKiBAcmV0dXJuc1xuICAgKiBBIHZvaWQgUHJvbWlzZSBpZiB0aGUgbG9nb3V0IHdhcyBzdWNjZXNzZnVsLCBjbGVhbmluZyBhbHNvIHRoZSB1c2VyUHJvZmlsZS5cbiAgICovXG4gIGxvZ291dChyZWRpcmVjdFVyaT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XG4gICAgICAgIHJlZGlyZWN0VXJpXG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9pbnN0YW5jZVxuICAgICAgICAubG9nb3V0KG9wdGlvbnMpXG4gICAgICAgIC5zdWNjZXNzKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl91c2VyUHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5lcnJvcigoKSA9PiByZWplY3QoJ0FuIGVycm9yIGhhcHBlbmVkIGR1cmluZyBsb2dvdXQuJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZGlyZWN0cyB0byByZWdpc3RyYXRpb24gZm9ybS4gU2hvcnRjdXQgZm9yIGxvZ2luIHdpdGggb3B0aW9uXG4gICAqIGFjdGlvbiA9ICdyZWdpc3RlcicuIE9wdGlvbnMgYXJlIHNhbWUgYXMgZm9yIHRoZSBsb2dpbiBtZXRob2QgYnV0ICdhY3Rpb24nIGlzIHNldCB0b1xuICAgKiAncmVnaXN0ZXInLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBsb2dpbiBvcHRpb25zXG4gICAqIEByZXR1cm5zXG4gICAqIEEgdm9pZCBQcm9taXNlIGlmIHRoZSByZWdpc3RlciBmbG93IHdhcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgcmVnaXN0ZXIob3B0aW9uczogS2V5Y2xvYWsuS2V5Y2xvYWtMb2dpbk9wdGlvbnMgPSB7IGFjdGlvbjogJ3JlZ2lzdGVyJyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX2luc3RhbmNlXG4gICAgICAgIC5yZWdpc3RlcihvcHRpb25zKVxuICAgICAgICAuc3VjY2VzcygoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuZXJyb3IoKCkgPT4gcmVqZWN0KCdBbiBlcnJvciBoYXBwZW5lZCBkdXJpbmcgdGhlIHJlZ2lzdGVyIGV4ZWN1dGlvbi4nKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIHJvbGUuIEl0IHdpbGwgbG9vayBmb3Igcm9sZXMgaW5cbiAgICogcmVhbG0gYW5kIGNsaWVudElkLCBidXQgd2lsbCBub3QgY2hlY2sgaWYgdGhlIHVzZXIgaXMgbG9nZ2VkIGluIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlXG4gICAqIHJvbGUgbmFtZVxuICAgKiBAcGFyYW0gcmVzb3VyY2VcbiAgICogcmVzb3VyY2UgbmFtZSBJZiBub3Qgc3BlY2lmaWVkLCBgY2xpZW50SWRgIGlzIHVzZWRcbiAgICogQHJldHVybnNcbiAgICogQSBib29sZWFuIG1lYW5pbmcgaWYgdGhlIHVzZXIgaGFzIHRoZSBzcGVjaWZpZWQgUm9sZS5cbiAgICovXG4gIGlzVXNlckluUm9sZShyb2xlOiBzdHJpbmcsIHJlc291cmNlPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc1JvbGU6IGJvb2xlYW47XG4gICAgaGFzUm9sZSA9IHRoaXMuX2luc3RhbmNlLmhhc1Jlc291cmNlUm9sZShyb2xlLCByZXNvdXJjZSk7XG4gICAgaWYgKCFoYXNSb2xlKSB7XG4gICAgICBoYXNSb2xlID0gdGhpcy5faW5zdGFuY2UuaGFzUmVhbG1Sb2xlKHJvbGUpO1xuICAgIH1cbiAgICByZXR1cm4gaGFzUm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJvbGVzIG9mIHRoZSBsb2dnZWQgdXNlci4gVGhlIGFsbFJvbGVzIHBhcmFtZXRlciwgd2l0aCBkZWZhdWx0IHZhbHVlXG4gICAqIHRydWUsIHdpbGwgcmV0dXJuIHRoZSBjbGllbnRJZCBhbmQgcmVhbG0gcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2dnZWQgdXNlci4gSWYgc2V0IHRvIGZhbHNlXG4gICAqIGl0IHdpbGwgb25seSByZXR1cm4gdGhlIHVzZXIgcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnRJZC5cbiAgICpcbiAgICogQHBhcmFtIGFsbFJvbGVzXG4gICAqIEZsYWcgdG8gc2V0IGlmIGFsbCByb2xlcyBzaG91bGQgYmUgcmV0dXJuZWQuKE9wdGlvbmFsOiBkZWZhdWx0IHZhbHVlIGlzIHRydWUpXG4gICAqIEByZXR1cm5zXG4gICAqIEFycmF5IG9mIFJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9nZ2VkIHVzZXIuXG4gICAqL1xuICBnZXRVc2VyUm9sZXMoYWxsUm9sZXM6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nW10ge1xuICAgIGxldCByb2xlczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5faW5zdGFuY2UucmVzb3VyY2VBY2Nlc3MpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX2luc3RhbmNlLnJlc291cmNlQWNjZXNzKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbnN0YW5jZS5yZXNvdXJjZUFjY2Vzcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgY29uc3QgcmVzb3VyY2VBY2Nlc3M6IGFueSA9IHRoaXMuX2luc3RhbmNlLnJlc291cmNlQWNjZXNzW2tleV07XG4gICAgICAgICAgY29uc3QgY2xpZW50Um9sZXMgPSByZXNvdXJjZUFjY2Vzc1sncm9sZXMnXSB8fCBbXTtcbiAgICAgICAgICByb2xlcyA9IHJvbGVzLmNvbmNhdChjbGllbnRSb2xlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbFJvbGVzICYmIHRoaXMuX2luc3RhbmNlLnJlYWxtQWNjZXNzKSB7XG4gICAgICBsZXQgcmVhbG1Sb2xlcyA9IHRoaXMuX2luc3RhbmNlLnJlYWxtQWNjZXNzWydyb2xlcyddIHx8IFtdO1xuICAgICAgcm9sZXMucHVzaCguLi5yZWFsbVJvbGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHVzZXIgaXMgbG9nZ2VkIGluLlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIHVzZXIgaXMgbG9nZ2VkIGluLlxuICAgKi9cbiAgYXN5bmMgaXNMb2dnZWRJbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZS5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVG9rZW4oMjApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0b2tlbiBoYXMgbGVzcyB0aGFuIG1pblZhbGlkaXR5IHNlY29uZHMgbGVmdCBiZWZvcmVcbiAgICogaXQgZXhwaXJlcy5cbiAgICpcbiAgICogQHBhcmFtIG1pblZhbGlkaXR5XG4gICAqIFNlY29uZHMgbGVmdC4gKG1pblZhbGlkaXR5KSBpcyBvcHRpb25hbC4gRGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgKiBAcmV0dXJuc1xuICAgKiBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHRva2VuIGlzIGV4cGlyZWQuXG4gICAqL1xuICBpc1Rva2VuRXhwaXJlZChtaW5WYWxpZGl0eTogbnVtYmVyID0gMCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZS5pc1Rva2VuRXhwaXJlZChtaW5WYWxpZGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHRva2VuIGV4cGlyZXMgd2l0aGluIG1pblZhbGlkaXR5IHNlY29uZHMgdGhlIHRva2VuIGlzIHJlZnJlc2hlZC4gSWYgdGhlXG4gICAqIHNlc3Npb24gc3RhdHVzIGlmcmFtZSBpcyBlbmFibGVkLCB0aGUgc2Vzc2lvbiBzdGF0dXMgaXMgYWxzbyBjaGVja2VkLlxuICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0ZWxsaW5nIGlmIHRoZSB0b2tlbiB3YXMgcmVmcmVzaGVkIG9yIG5vdC4gSWYgdGhlIHNlc3Npb24gaXMgbm90IGFjdGl2ZVxuICAgKiBhbnltb3JlLCB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICpcbiAgICogQHBhcmFtIG1pblZhbGlkaXR5XG4gICAqIFNlY29uZHMgbGVmdC4gKG1pblZhbGlkaXR5IGlzIG9wdGlvbmFsLCBpZiBub3Qgc3BlY2lmaWVkIDUgaXMgdXNlZClcbiAgICogQHJldHVybnNcbiAgICogUHJvbWlzZSB3aXRoIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSB0b2tlbiB3YXMgc3VjY2VzZnVsbHkgdXBkYXRlZC5cbiAgICovXG4gIHVwZGF0ZVRva2VuKG1pblZhbGlkaXR5OiBudW1iZXIgPSA1KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSB3b3JrYXJvdW5kIHVudGlsIHRoZSBzaWxlbnQgcmVmcmVzaCAoaXNzdWUgIzQzKVxuICAgICAgLy8gaXMgbm90IGltcGxlbWVudGVkLCBhdm9pZGluZyB0aGUgcmVkaXJlY3QgbG9vcC5cbiAgICAgIGlmICh0aGlzLl9zaWxlbnRSZWZyZXNoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkKCkpIHtcbiAgICAgICAgICByZWplY3QoJ0ZhaWxlZCB0byByZWZyZXNoIHRoZSB0b2tlbiwgb3IgdGhlIHNlc3Npb24gaXMgZXhwaXJlZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgIHJlamVjdCgnS2V5Y2xvYWsgQW5ndWxhciBsaWJyYXJ5IGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbnN0YW5jZVxuICAgICAgICAudXBkYXRlVG9rZW4obWluVmFsaWRpdHkpXG4gICAgICAgIC5zdWNjZXNzKHJlZnJlc2hlZCA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShyZWZyZXNoZWQpO1xuICAgICAgICB9KVxuICAgICAgICAuZXJyb3IoKCkgPT4gcmVqZWN0KCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgdG9rZW4sIG9yIHRoZSBzZXNzaW9uIGlzIGV4cGlyZWQnKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIHVzZXIgcHJvZmlsZS5cbiAgICogUmV0dXJucyBwcm9taXNlIHRvIHNldCBmdW5jdGlvbnMgdG8gYmUgaW52b2tlZCBpZiB0aGUgcHJvZmlsZSB3YXMgbG9hZGVkXG4gICAqIHN1Y2Nlc3NmdWxseSwgb3IgaWYgdGhlIHByb2ZpbGUgY291bGQgbm90IGJlIGxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlUmVsb2FkXG4gICAqIElmIHRydWUgd2lsbCBmb3JjZSB0aGUgbG9hZFVzZXJQcm9maWxlIGV2ZW4gaWYgaXRzIGFscmVhZHkgbG9hZGVkLlxuICAgKiBAcmV0dXJuc1xuICAgKiBBIHByb21pc2Ugd2l0aCB0aGUgS2V5Y2xvYWtQcm9maWxlIGRhdGEgbG9hZGVkLlxuICAgKi9cbiAgbG9hZFVzZXJQcm9maWxlKGZvcmNlUmVsb2FkOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEtleWNsb2FrLktleWNsb2FrUHJvZmlsZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5fdXNlclByb2ZpbGUgJiYgIWZvcmNlUmVsb2FkKSB7XG4gICAgICAgIHJlc29sdmUodGhpcy5fdXNlclByb2ZpbGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faW5zdGFuY2UuYXV0aGVudGljYXRlZCkge1xuICAgICAgICByZWplY3QoJ1RoZSB1c2VyIHByb2ZpbGUgd2FzIG5vdCBsb2FkZWQgYXMgdGhlIHVzZXIgaXMgbm90IGxvZ2dlZCBpbi4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbnN0YW5jZVxuICAgICAgICAubG9hZFVzZXJQcm9maWxlKClcbiAgICAgICAgLnN1Y2Nlc3MocmVzdWx0ID0+IHtcbiAgICAgICAgICB0aGlzLl91c2VyUHJvZmlsZSA9IHJlc3VsdCBhcyBLZXljbG9hay5LZXljbG9ha1Byb2ZpbGU7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl91c2VyUHJvZmlsZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5lcnJvcigoKSA9PiByZWplY3QoJ1RoZSB1c2VyIHByb2ZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4nKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXV0aGVudGljYXRlZCB0b2tlbiwgY2FsbGluZyB1cGRhdGVUb2tlbiB0byBnZXQgYSByZWZyZXNoZWQgb25lIGlmXG4gICAqIG5lY2Vzc2FyeS4gSWYgdGhlIHNlc3Npb24gaXMgZXhwaXJlZCB0aGlzIG1ldGhvZCBjYWxscyB0aGUgbG9naW4gbWV0aG9kIGZvciBhIG5ldyBsb2dpbi5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogUHJvbWlzZSB3aXRoIHRoZSBnZW5lcmF0ZWQgdG9rZW4uXG4gICAqL1xuICBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVRva2VuKDEwKTtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLl9pbnN0YW5jZS50b2tlbik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2luKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbG9nZ2VkIHVzZXJuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgbG9nZ2VkIHVzZXJuYW1lLlxuICAgKi9cbiAgZ2V0VXNlcm5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3VzZXJQcm9maWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGxvZ2dlZCBpbiBvciB1c2VyIHByb2ZpbGUgd2FzIG5vdCBsb2FkZWQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3VzZXJQcm9maWxlLnVzZXJuYW1lITtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhdXRoZW50aWNhdGlvbiBzdGF0ZSwgaW5jbHVkaW5nIHRva2Vucy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIGFwcGxpY2F0aW9uXG4gICAqIGhhcyBkZXRlY3RlZCB0aGUgc2Vzc2lvbiB3YXMgZXhwaXJlZCwgZm9yIGV4YW1wbGUgaWYgdXBkYXRpbmcgdG9rZW4gZmFpbHMuXG4gICAqIEludm9raW5nIHRoaXMgcmVzdWx0cyBpbiBvbkF1dGhMb2dvdXQgY2FsbGJhY2sgbGlzdGVuZXIgYmVpbmcgaW52b2tlZC5cbiAgICovXG4gIGNsZWFyVG9rZW4oKTogdm9pZCB7XG4gICAgdGhpcy5faW5zdGFuY2UuY2xlYXJUb2tlbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB2YWxpZCB0b2tlbiBpbiBoZWFkZXIuIFRoZSBrZXkgJiB2YWx1ZSBmb3JtYXQgaXM6XG4gICAqIEF1dGhvcml6YXRpb24gQmVhcmVyIDx0b2tlbj4uXG4gICAqIElmIHRoZSBoZWFkZXJzIHBhcmFtIGlzIHVuZGVmaW5lZCBpdCB3aWxsIGNyZWF0ZSB0aGUgQW5ndWxhciBoZWFkZXJzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIGhlYWRlcnNcbiAgICogVXBkYXRlZCBoZWFkZXIgd2l0aCBBdXRob3JpemF0aW9uIGFuZCBLZXljbG9hayB0b2tlbi5cbiAgICogQHJldHVybnNcbiAgICogQW4gb2JzZXJ2YWJsZSB3aXRoIHdpdGggdGhlIEhUVFAgQXV0aG9yaXphdGlvbiBoZWFkZXIgYW5kIHRoZSBjdXJyZW50IHRva2VuLlxuICAgKi9cbiAgYWRkVG9rZW5Ub0hlYWRlcihoZWFkZXJzOiBIdHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpKTogT2JzZXJ2YWJsZTxIdHRwSGVhZGVycz4ge1xuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyAob2JzZXJ2ZXI6IE9ic2VydmVyPGFueT4pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2VuOiBzdHJpbmcgPSBhd2FpdCB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCh0aGlzLl9hdXRob3JpemF0aW9uSGVhZGVyTmFtZSwgdGhpcy5fYmVhcmVyUHJlZml4ICsgdG9rZW4pO1xuICAgICAgICBvYnNlcnZlci5uZXh0KGhlYWRlcnMpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIEtleWNsb2FrIGluc3RhbmNlLCBpZiB5b3UgbmVlZCBhbnkgY3VzdG9taXphdGlvbiB0aGF0XG4gICAqIHRoaXMgQW5ndWxhciBzZXJ2aWNlIGRvZXMgbm90IHN1cHBvcnQgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgS2V5Y2xvYWtJbnN0YW5jZSBmcm9tIGtleWNsb2FrLWpzLlxuICAgKi9cbiAgZ2V0S2V5Y2xvYWtJbnN0YW5jZSgpOiBLZXljbG9hay5LZXljbG9ha0luc3RhbmNlIHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXhjbHVkZWQgVVJMcyB0aGF0IHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBieVxuICAgKiB0aGUgaHR0cCBpbnRlcmNlcHRvciB3aGljaCBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIGF1dGhvcml6YXRpb24gaGVhZGVyIGluIHRoZSBIdHRwIFJlcXVlc3QuXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBleGNsdWRlZCB1cmxzIHRoYXQgbXVzdCBub3QgYmUgaW50ZXJjZXB0ZWQgYnkgdGhlIEtleWNsb2FrQmVhcmVySW50ZXJjZXB0b3IuXG4gICAqL1xuICBnZXQgZXhjbHVkZWRVcmxzKCk6IEV4Y2x1ZGVkVXJsUmVnZXhbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVkVXJscztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBiZWFyZXIgd2lsbCBiZSBhZGRlZCB0byB0aGUgYXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIFJldHVybnMgaWYgdGhlIGJlYXJlciBpbnRlcmNlcHRvciB3YXMgc2V0IHRvIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZ2V0IGVuYWJsZUJlYXJlckludGVyY2VwdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVCZWFyZXJJbnRlcmNlcHRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBLZXljbG9hayBzdWJqZWN0IHRvIG1vbml0b3IgdGhlIGV2ZW50cyB0cmlnZ2VyZWQgYnkga2V5Y2xvYWstanMuXG4gICAqIFRoZSBmb2xsb3dpbmcgZXZlbnRzIGFzIGF2YWlsYWJsZSAoYXMgZGVzY3JpYmVkIGF0IGtleWNsb2FrIGRvY3MgLVxuICAgKiBodHRwczovL3d3dy5rZXljbG9hay5vcmcvZG9jcy9sYXRlc3Qvc2VjdXJpbmdfYXBwcy9pbmRleC5odG1sI2NhbGxiYWNrLWV2ZW50cyk6XG4gICAqIC0gT25BdXRoRXJyb3JcbiAgICogLSBPbkF1dGhMb2dvdXRcbiAgICogLSBPbkF1dGhSZWZyZXNoRXJyb3JcbiAgICogLSBPbkF1dGhSZWZyZXNoU3VjY2Vzc1xuICAgKiAtIE9uQXV0aFN1Y2Nlc3NcbiAgICogLSBPblJlYWR5XG4gICAqIC0gT25Ub2tlbkV4cGlyZVxuICAgKiBJbiBlYWNoIG9jY3VycmVuY2Ugb2YgYW55IG9mIHRoZXNlLCB0aGlzIHN1YmplY3Qgd2lsbCByZXR1cm4gdGhlIGV2ZW50IHR5cGUsXG4gICAqIGRlc2NyaWJlZCBhdCB7QGxpbmsgS2V5Y2xvYWtFdmVudFR5cGV9IGVudW0gYW5kIHRoZSBmdW5jdGlvbiBhcmdzIGZyb20gdGhlIGtleWNsb2FrLWpzXG4gICAqIGlmIHByb3ZpZGVkIGFueS5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQSBzdWJqZWN0IHdpdGggdGhlIHtAbGluayBLZXljbG9ha0V2ZW50fSB3aGljaCBkZXNjcmliZXMgdGhlIGV2ZW50IHR5cGUgYW5kIGF0dGFjaGVzIHRoZVxuICAgKiBmdW5jdGlvbiBhcmdzLlxuICAgKi9cbiAgZ2V0IGtleWNsb2FrRXZlbnRzJCgpOiBTdWJqZWN0PEtleWNsb2FrRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5fa2V5Y2xvYWtFdmVudHMkO1xuICB9XG59XG4iXX0=
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2xvYWsuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2tleWNsb2FrLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY29yZS9zZXJ2aWNlcy9rZXljbG9hay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFRQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckMsT0FBTyxLQUFLLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDekMsTUFBTSxDQUFDLElBQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQztBQU9sQyxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBVWhEO0lBQUE7UUFzQ1UscUJBQWdCLEdBQTJCLElBQUksT0FBTyxFQUUzRCxDQUFDO0lBa2ROLENBQUM7SUF6Y1MsNkNBQW1CLEdBQTNCO1FBQUEsaUJBd0NDO1FBdkNDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQUMsU0FBUztZQUNyQyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2dCQUN6QixJQUFJLEVBQUUsU0FBUztnQkFDZixJQUFJLEVBQUUsaUJBQWlCLENBQUMsV0FBVzthQUNwQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFFRixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRztZQUM1QixLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDO1FB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QWdCLEdBQXZCLFVBQXdCLE9BQXdDO1FBQWhFLGlCQU1DO1FBTnVCLHdCQUFBLEVBQUEsY0FBMkIsV0FBVyxFQUFFO1FBQzlELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDL0IsR0FBRyxDQUFDLFVBQUMsS0FBSztZQUNSLE9BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFJLENBQUMsd0JBQXdCLEVBQUUsS0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFBdEUsQ0FBc0UsQ0FDdkUsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQVNELDZDQUFtQixHQUFuQjtRQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBU0Qsc0JBQUkseUNBQVk7YUFBaEI7WUFDRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDNUIsQ0FBQzs7O09BQUE7SUFRRCxzQkFBSSxvREFBdUI7YUFBM0I7WUFDRSxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztRQUN2QyxDQUFDOzs7T0FBQTtJQXFCRCxzQkFBSSw0Q0FBZTthQUFuQjtZQUNFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBemZVLGVBQWU7UUFEM0IsVUFBVSxFQUFFO09BQ0EsZUFBZSxDQTBmM0I7SUFBRCxzQkFBQztDQUFBLEFBMWZELElBMGZDO1NBMWZZLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgTWF1cmljaW8gR2VtZWxsaSBWaWdvbG8gYW5kIGNvbnRyaWJ1dG9ycy5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXVyaWNpb3ZpZ29sby9rZXljbG9hay1hbmd1bGFyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuaW1wb3J0IHsgU3ViamVjdCwgZnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBXb3JrYXJvdW5kIGZvciByb2xsdXAgbGlicmFyeSBiZWhhdmlvdXIsIGFzIHBvaW50ZWQgb3V0IG9uIGlzc3VlICMxMjY3IChodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3JvbGx1cC9pc3N1ZXMvMTI2NykuXG5pbXBvcnQgKiBhcyBLZXljbG9ha18gZnJvbSAna2V5Y2xvYWstanMnO1xuZXhwb3J0IGNvbnN0IEtleWNsb2FrID0gS2V5Y2xvYWtfO1xuXG5pbXBvcnQge1xuICBFeGNsdWRlZFVybCxcbiAgRXhjbHVkZWRVcmxSZWdleCxcbiAgS2V5Y2xvYWtPcHRpb25zLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2tleWNsb2FrLW9wdGlvbnMnO1xuaW1wb3J0IHsgS2V5Y2xvYWtFdmVudCwgS2V5Y2xvYWtFdmVudFR5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2tleWNsb2FrLWV2ZW50JztcbmltcG9ydCB7IHRvUHJvbWlzZSB9IGZyb20gJy4uL3V0aWxzL3RvLXByb21pc2UnO1xuXG4vKipcbiAqIFNlcnZpY2UgdG8gZXhwb3NlIGV4aXN0ZW50IG1ldGhvZHMgZnJvbSB0aGUgS2V5Y2xvYWsgSlMgYWRhcHRlciwgYWRkaW5nIG5ld1xuICogZnVuY3Rpb25hbGl0aWVzIHRvIGltcHJvdmUgdGhlIHVzZSBvZiBrZXljbG9hayBpbiBBbmd1bGFyIHYgPiA0LjMgYXBwbGljYXRpb25zLlxuICpcbiAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIGluamVjdGVkIGluIHRoZSBhcHBsaWNhdGlvbiBib290c3RyYXAsIHNvIHRoZSBzYW1lIGluc3RhbmNlIHdpbGwgYmUgdXNlZFxuICogYWxvbmcgdGhlIHdlYiBhcHBsaWNhdGlvbi5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEtleWNsb2FrU2VydmljZSB7XG4gIC8qKlxuICAgKiBLZXljbG9hay1qcyBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgX2luc3RhbmNlOiBLZXljbG9hay5LZXljbG9ha0luc3RhbmNlO1xuICAvKipcbiAgICogVXNlciBwcm9maWxlIGFzIEtleWNsb2FrUHJvZmlsZSBpbnRlcmZhY2UuXG4gICAqL1xuICBwcml2YXRlIF91c2VyUHJvZmlsZTogS2V5Y2xvYWsuS2V5Y2xvYWtQcm9maWxlO1xuICAvKipcbiAgICogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgYmVhcmVyIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBhdXRob3JpemF0aW9uIGhlYWRlci5cbiAgICovXG4gIHByaXZhdGUgX2VuYWJsZUJlYXJlckludGVyY2VwdG9yOiBib29sZWFuO1xuICAvKipcbiAgICogV2hlbiB0aGUgaW1wbGljaXQgZmxvdyBpcyBjaG9vc2VuIHRoZXJlIG11c3QgZXhpc3QgYSBzaWxlbnRSZWZyZXNoLCBhcyB0aGVyZSBpc1xuICAgKiBubyByZWZyZXNoIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2lsZW50UmVmcmVzaDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHByb2ZpbGUgc2hvdWxkIGJlIGxvYWRlZCBhdCB0aGUga2V5Y2xvYWsgaW5pdGlhbGl6YXRpb24sXG4gICAqIGp1c3QgYWZ0ZXIgdGhlIGxvZ2luLlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9hZFVzZXJQcm9maWxlQXRTdGFydFVwOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGJlYXJlciBwcmVmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBBdXRob3JpemF0aW9uIEhlYWRlci5cbiAgICovXG4gIHByaXZhdGUgX2JlYXJlclByZWZpeDogc3RyaW5nO1xuICAvKipcbiAgICogVmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIEF1dGhvcml6YXRpb24gSHR0cCBIZWFkZXIgbmFtZS5cbiAgICovXG4gIHByaXZhdGUgX2F1dGhvcml6YXRpb25IZWFkZXJOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZXhjbHVkZWQgdXJscyBwYXR0ZXJucyB0aGF0IG11c3Qgc2tpcCB0aGUgS2V5Y2xvYWtCZWFyZXJJbnRlcmNlcHRvci5cbiAgICovXG4gIHByaXZhdGUgX2V4Y2x1ZGVkVXJsczogRXhjbHVkZWRVcmxSZWdleFtdO1xuICAvKipcbiAgICogT2JzZXJ2ZXIgZm9yIHRoZSBrZXljbG9hayBldmVudHNcbiAgICovXG4gIHByaXZhdGUgX2tleWNsb2FrRXZlbnRzJDogU3ViamVjdDxLZXljbG9ha0V2ZW50PiA9IG5ldyBTdWJqZWN0PFxuICAgIEtleWNsb2FrRXZlbnRcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGUga2V5Y2xvYWstanMgZXZlbnRzIHRvIHRoZSBrZXljbG9ha0V2ZW50cyBTdWJqZWN0XG4gICAqIHdoaWNoIGlzIGEgZ29vZCB3YXkgdG8gbW9uaXRvciBmb3IgY2hhbmdlcywgaWYgbmVlZGVkLlxuICAgKlxuICAgKiBUaGUga2V5Y2xvYWtFdmVudHMgcmV0dXJucyB0aGUga2V5Y2xvYWstanMgZXZlbnQgdHlwZSBhbmQgYW55XG4gICAqIGFyZ3VtZW50IGlmIHRoZSBzb3VyY2UgZnVuY3Rpb24gcHJvdmlkZXMgYW55LlxuICAgKi9cbiAgcHJpdmF0ZSBiaW5kc0tleWNsb2FrRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX2luc3RhbmNlLm9uQXV0aEVycm9yID0gKGVycm9yRGF0YSkgPT4ge1xuICAgICAgdGhpcy5fa2V5Y2xvYWtFdmVudHMkLm5leHQoe1xuICAgICAgICBhcmdzOiBlcnJvckRhdGEsXG4gICAgICAgIHR5cGU6IEtleWNsb2FrRXZlbnRUeXBlLk9uQXV0aEVycm9yLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuX2luc3RhbmNlLm9uQXV0aExvZ291dCA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2tleWNsb2FrRXZlbnRzJC5uZXh0KHsgdHlwZTogS2V5Y2xvYWtFdmVudFR5cGUuT25BdXRoTG9nb3V0IH0pO1xuICAgIH07XG5cbiAgICB0aGlzLl9pbnN0YW5jZS5vbkF1dGhSZWZyZXNoU3VjY2VzcyA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2tleWNsb2FrRXZlbnRzJC5uZXh0KHtcbiAgICAgICAgdHlwZTogS2V5Y2xvYWtFdmVudFR5cGUuT25BdXRoUmVmcmVzaFN1Y2Nlc3MsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5faW5zdGFuY2Uub25BdXRoUmVmcmVzaEVycm9yID0gKCkgPT4ge1xuICAgICAgdGhpcy5fa2V5Y2xvYWtFdmVudHMkLm5leHQoe1xuICAgICAgICB0eXBlOiBLZXljbG9ha0V2ZW50VHlwZS5PbkF1dGhSZWZyZXNoRXJyb3IsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5faW5zdGFuY2Uub25BdXRoU3VjY2VzcyA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2tleWNsb2FrRXZlbnRzJC5uZXh0KHsgdHlwZTogS2V5Y2xvYWtFdmVudFR5cGUuT25BdXRoU3VjY2VzcyB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5faW5zdGFuY2Uub25Ub2tlbkV4cGlyZWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9rZXljbG9ha0V2ZW50cyQubmV4dCh7XG4gICAgICAgIHR5cGU6IEtleWNsb2FrRXZlbnRUeXBlLk9uVG9rZW5FeHBpcmVkLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuX2luc3RhbmNlLm9uUmVhZHkgPSAoYXV0aGVudGljYXRlZCkgPT4ge1xuICAgICAgdGhpcy5fa2V5Y2xvYWtFdmVudHMkLm5leHQoe1xuICAgICAgICBhcmdzOiBhdXRoZW50aWNhdGVkLFxuICAgICAgICB0eXBlOiBLZXljbG9ha0V2ZW50VHlwZS5PblJlYWR5LFxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbGwgYmVhcmVyRXhjbHVkZWRVcmwgY29udGVudCBpbiBhIHVuaWZvcm0gdHlwZTogRXhjbHVkZWRVcmwsXG4gICAqIHNvIGl0IGJlY29tZXMgZWFzaWVyIHRvIGhhbmRsZS5cbiAgICpcbiAgICogQHBhcmFtIGJlYXJlckV4Y2x1ZGVkVXJscyBhcnJheSBvZiBzdHJpbmdzIG9yIEV4Y2x1ZGVkVXJsIHRoYXQgaW5jbHVkZXNcbiAgICogdGhlIHVybCBhbmQgSHR0cE1ldGhvZC5cbiAgICovXG4gIHByaXZhdGUgbG9hZEV4Y2x1ZGVkVXJscyhcbiAgICBiZWFyZXJFeGNsdWRlZFVybHM6IChzdHJpbmcgfCBFeGNsdWRlZFVybClbXVxuICApOiBFeGNsdWRlZFVybFJlZ2V4W10ge1xuICAgIGNvbnN0IGV4Y2x1ZGVkVXJsczogRXhjbHVkZWRVcmxSZWdleFtdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGJlYXJlckV4Y2x1ZGVkVXJscykge1xuICAgICAgbGV0IGV4Y2x1ZGVkVXJsOiBFeGNsdWRlZFVybFJlZ2V4O1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICBleGNsdWRlZFVybCA9IHsgdXJsUGF0dGVybjogbmV3IFJlZ0V4cChpdGVtLCAnaScpLCBodHRwTWV0aG9kczogW10gfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4Y2x1ZGVkVXJsID0ge1xuICAgICAgICAgIHVybFBhdHRlcm46IG5ldyBSZWdFeHAoaXRlbS51cmwsICdpJyksXG4gICAgICAgICAgaHR0cE1ldGhvZHM6IGl0ZW0uaHR0cE1ldGhvZHMsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBleGNsdWRlZFVybHMucHVzaChleGNsdWRlZFVybCk7XG4gICAgfVxuICAgIHJldHVybiBleGNsdWRlZFVybHM7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY2xhc3MgdmFsdWVzIGluaXRpYWxpemF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0U2VydmljZVZhbHVlcyh7XG4gICAgZW5hYmxlQmVhcmVySW50ZXJjZXB0b3IgPSB0cnVlLFxuICAgIGxvYWRVc2VyUHJvZmlsZUF0U3RhcnRVcCA9IHRydWUsXG4gICAgYmVhcmVyRXhjbHVkZWRVcmxzID0gW10sXG4gICAgYXV0aG9yaXphdGlvbkhlYWRlck5hbWUgPSAnQXV0aG9yaXphdGlvbicsXG4gICAgYmVhcmVyUHJlZml4ID0gJ2JlYXJlcicsXG4gICAgaW5pdE9wdGlvbnMsXG4gIH06IEtleWNsb2FrT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuX2VuYWJsZUJlYXJlckludGVyY2VwdG9yID0gZW5hYmxlQmVhcmVySW50ZXJjZXB0b3I7XG4gICAgdGhpcy5fbG9hZFVzZXJQcm9maWxlQXRTdGFydFVwID0gbG9hZFVzZXJQcm9maWxlQXRTdGFydFVwO1xuICAgIHRoaXMuX2F1dGhvcml6YXRpb25IZWFkZXJOYW1lID0gYXV0aG9yaXphdGlvbkhlYWRlck5hbWU7XG4gICAgdGhpcy5fYmVhcmVyUHJlZml4ID0gYmVhcmVyUHJlZml4LnRyaW0oKS5jb25jYXQoJyAnKTtcbiAgICB0aGlzLl9leGNsdWRlZFVybHMgPSB0aGlzLmxvYWRFeGNsdWRlZFVybHMoYmVhcmVyRXhjbHVkZWRVcmxzKTtcbiAgICB0aGlzLl9zaWxlbnRSZWZyZXNoID0gaW5pdE9wdGlvbnMgPyBpbml0T3B0aW9ucy5mbG93ID09PSAnaW1wbGljaXQnIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogS2V5Y2xvYWsgaW5pdGlhbGl6YXRpb24uIEl0IHNob3VsZCBiZSBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgYWRhcHRlci5cbiAgICogT3B0aW9ucyBpcyBhIG9iamVjdCB3aXRoIDIgbWFpbiBwYXJhbWV0ZXJzOiBjb25maWcgYW5kIGluaXRPcHRpb25zLiBUaGUgZmlyc3Qgb25lXG4gICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIEtleWNsb2FrIGluc3RhbmNlLiBUaGUgc2Vjb25kIG9uZSBhcmUgb3B0aW9ucyB0byBpbml0aWFsaXplIHRoZVxuICAgKiBrZXljbG9hayBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQ29uZmlnOiBtYXkgYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBrZXljbG9hayBVUkkgb3IgYW4gb2JqZWN0IHdpdGggdGhlXG4gICAqIGZvbGxvd2luZyBjb250ZW50OlxuICAgKiAtIHVybDogS2V5Y2xvYWsganNvbiBVUkxcbiAgICogLSByZWFsbTogcmVhbG0gbmFtZVxuICAgKiAtIGNsaWVudElkOiBjbGllbnQgaWRcbiAgICpcbiAgICogaW5pdE9wdGlvbnM6XG4gICAqIE9wdGlvbnMgdG8gaW5pdGlhbGl6ZSB0aGUgS2V5Y2xvYWsgYWRhcHRlciwgbWF0Y2hlcyB0aGUgb3B0aW9ucyBhcyBwcm92aWRlZCBieSBLZXljbG9hayBpdHNlbGYuXG4gICAqXG4gICAqIGVuYWJsZUJlYXJlckludGVyY2VwdG9yOlxuICAgKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBiZWFyZXIgd2lsbCBhZGRlZCB0byB0aGUgYXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gICAqXG4gICAqIGxvYWRVc2VyUHJvZmlsZUluU3RhcnRVcDpcbiAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgcHJvZmlsZSBzaG91bGQgYmUgbG9hZGVkIGF0IHRoZSBrZXljbG9hayBpbml0aWFsaXphdGlvbixcbiAgICoganVzdCBhZnRlciB0aGUgbG9naW4uXG4gICAqXG4gICAqIGJlYXJlckV4Y2x1ZGVkVXJsczpcbiAgICogU3RyaW5nIEFycmF5IHRvIGV4Y2x1ZGUgdGhlIHVybHMgdGhhdCBzaG91bGQgbm90IGhhdmUgdGhlIEF1dGhvcml6YXRpb24gSGVhZGVyIGF1dG9tYXRpY2FsbHlcbiAgICogYWRkZWQuXG4gICAqXG4gICAqIGF1dGhvcml6YXRpb25IZWFkZXJOYW1lOlxuICAgKiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgQXV0aG9yaXphdGlvbiBIdHRwIEhlYWRlciBuYW1lLlxuICAgKlxuICAgKiBiZWFyZXJQcmVmaXg6XG4gICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgQXV0aG9yaXphdGlvbiBIdHRwIEhlYWRlciBwYXJhbS5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQSBQcm9taXNlIHdpdGggYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluaXQob3B0aW9uczogS2V5Y2xvYWtPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmluaXRTZXJ2aWNlVmFsdWVzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgY29uZmlnLCBpbml0T3B0aW9ucyB9ID0gb3B0aW9ucztcblxuICAgIHRoaXMuX2luc3RhbmNlID0gS2V5Y2xvYWsoY29uZmlnKTtcbiAgICB0aGlzLmJpbmRzS2V5Y2xvYWtFdmVudHMoKTtcblxuICAgIGNvbnN0IGF1dGhlbnRpY2F0ZWQgPSBhd2FpdCB0b1Byb21pc2UodGhpcy5faW5zdGFuY2UuaW5pdChpbml0T3B0aW9ucykpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWQgJiYgdGhpcy5fbG9hZFVzZXJQcm9maWxlQXRTdGFydFVwKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRVc2VyUHJvZmlsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBhdXRoZW50aWNhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZGlyZWN0cyB0byBsb2dpbiBmb3JtIG9uIChvcHRpb25zIGlzIGFuIG9wdGlvbmFsIG9iamVjdCB3aXRoIHJlZGlyZWN0VXJpIGFuZC9vclxuICAgKiBwcm9tcHQgZmllbGRzKS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogT2JqZWN0LCB3aGVyZTpcbiAgICogIC0gcmVkaXJlY3RVcmk6IFNwZWNpZmllcyB0aGUgdXJpIHRvIHJlZGlyZWN0IHRvIGFmdGVyIGxvZ2luLlxuICAgKiAgLSBwcm9tcHQ6QnkgZGVmYXVsdCB0aGUgbG9naW4gc2NyZWVuIGlzIGRpc3BsYXllZCBpZiB0aGUgdXNlciBpcyBub3QgbG9nZ2VkLWluIHRvIEtleWNsb2FrLlxuICAgKiBUbyBvbmx5IGF1dGhlbnRpY2F0ZSB0byB0aGUgYXBwbGljYXRpb24gaWYgdGhlIHVzZXIgaXMgYWxyZWFkeSBsb2dnZWQtaW4gYW5kIG5vdCBkaXNwbGF5IHRoZVxuICAgKiBsb2dpbiBwYWdlIGlmIHRoZSB1c2VyIGlzIG5vdCBsb2dnZWQtaW4sIHNldCB0aGlzIG9wdGlvbiB0byBub25lLiBUbyBhbHdheXMgcmVxdWlyZVxuICAgKiByZS1hdXRoZW50aWNhdGlvbiBhbmQgaWdub3JlIFNTTywgc2V0IHRoaXMgb3B0aW9uIHRvIGxvZ2luIC5cbiAgICogIC0gbWF4QWdlOiBVc2VkIGp1c3QgaWYgdXNlciBpcyBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQuIFNwZWNpZmllcyBtYXhpbXVtIHRpbWUgc2luY2UgdGhlXG4gICAqIGF1dGhlbnRpY2F0aW9uIG9mIHVzZXIgaGFwcGVuZWQuIElmIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkIGZvciBsb25nZXIgdGltZSB0aGFuXG4gICAqIG1heEFnZSwgdGhlIFNTTyBpcyBpZ25vcmVkIGFuZCBoZSB3aWxsIG5lZWQgdG8gcmUtYXV0aGVudGljYXRlIGFnYWluLlxuICAgKiAgLSBsb2dpbkhpbnQ6IFVzZWQgdG8gcHJlLWZpbGwgdGhlIHVzZXJuYW1lL2VtYWlsIGZpZWxkIG9uIHRoZSBsb2dpbiBmb3JtLlxuICAgKiAgLSBhY3Rpb246IElmIHZhbHVlIGlzICdyZWdpc3RlcicgdGhlbiB1c2VyIGlzIHJlZGlyZWN0ZWQgdG8gcmVnaXN0cmF0aW9uIHBhZ2UsIG90aGVyd2lzZSB0b1xuICAgKiBsb2dpbiBwYWdlLlxuICAgKiAgLSBsb2NhbGU6IFNwZWNpZmllcyB0aGUgZGVzaXJlZCBsb2NhbGUgZm9yIHRoZSBVSS5cbiAgICogQHJldHVybnNcbiAgICogQSB2b2lkIFByb21pc2UgaWYgdGhlIGxvZ2luIGlzIHN1Y2Nlc3NmdWwgYW5kIGFmdGVyIHRoZSB1c2VyIHByb2ZpbGUgbG9hZGluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2dpbihvcHRpb25zOiBLZXljbG9hay5LZXljbG9ha0xvZ2luT3B0aW9ucyA9IHt9KSB7XG4gICAgYXdhaXQgdG9Qcm9taXNlKHRoaXMuX2luc3RhbmNlLmxvZ2luKG9wdGlvbnMpKTtcblxuICAgIGlmICh0aGlzLl9sb2FkVXNlclByb2ZpbGVBdFN0YXJ0VXApIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZFVzZXJQcm9maWxlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZGlyZWN0cyB0byBsb2dvdXQuXG4gICAqXG4gICAqIEBwYXJhbSByZWRpcmVjdFVyaVxuICAgKiBTcGVjaWZpZXMgdGhlIHVyaSB0byByZWRpcmVjdCB0byBhZnRlciBsb2dvdXQuXG4gICAqIEByZXR1cm5zXG4gICAqIEEgdm9pZCBQcm9taXNlIGlmIHRoZSBsb2dvdXQgd2FzIHN1Y2Nlc3NmdWwsIGNsZWFuaW5nIGFsc28gdGhlIHVzZXJQcm9maWxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvZ291dChyZWRpcmVjdFVyaT86IHN0cmluZykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByZWRpcmVjdFVyaSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdG9Qcm9taXNlKHRoaXMuX2luc3RhbmNlLmxvZ291dChvcHRpb25zKSk7XG4gICAgdGhpcy5fdXNlclByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVkaXJlY3RzIHRvIHJlZ2lzdHJhdGlvbiBmb3JtLiBTaG9ydGN1dCBmb3IgbG9naW4gd2l0aCBvcHRpb25cbiAgICogYWN0aW9uID0gJ3JlZ2lzdGVyJy4gT3B0aW9ucyBhcmUgc2FtZSBhcyBmb3IgdGhlIGxvZ2luIG1ldGhvZCBidXQgJ2FjdGlvbicgaXMgc2V0IHRvXG4gICAqICdyZWdpc3RlcicuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIGxvZ2luIG9wdGlvbnNcbiAgICogQHJldHVybnNcbiAgICogQSB2b2lkIFByb21pc2UgaWYgdGhlIHJlZ2lzdGVyIGZsb3cgd2FzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIoXG4gICAgb3B0aW9uczogS2V5Y2xvYWsuS2V5Y2xvYWtMb2dpbk9wdGlvbnMgPSB7IGFjdGlvbjogJ3JlZ2lzdGVyJyB9XG4gICkge1xuICAgIGF3YWl0IHRvUHJvbWlzZSh0aGlzLl9pbnN0YW5jZS5yZWdpc3RlcihvcHRpb25zKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIHJvbGUuIEl0IHdpbGwgbG9vayBmb3Igcm9sZXMgaW5cbiAgICogcmVhbG0gYW5kIGNsaWVudElkLCBidXQgd2lsbCBub3QgY2hlY2sgaWYgdGhlIHVzZXIgaXMgbG9nZ2VkIGluIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlXG4gICAqIHJvbGUgbmFtZVxuICAgKiBAcGFyYW0gcmVzb3VyY2VcbiAgICogcmVzb3VyY2UgbmFtZSBJZiBub3Qgc3BlY2lmaWVkLCBgY2xpZW50SWRgIGlzIHVzZWRcbiAgICogQHJldHVybnNcbiAgICogQSBib29sZWFuIG1lYW5pbmcgaWYgdGhlIHVzZXIgaGFzIHRoZSBzcGVjaWZpZWQgUm9sZS5cbiAgICovXG4gIGlzVXNlckluUm9sZShyb2xlOiBzdHJpbmcsIHJlc291cmNlPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc1JvbGU6IGJvb2xlYW47XG4gICAgaGFzUm9sZSA9IHRoaXMuX2luc3RhbmNlLmhhc1Jlc291cmNlUm9sZShyb2xlLCByZXNvdXJjZSk7XG4gICAgaWYgKCFoYXNSb2xlKSB7XG4gICAgICBoYXNSb2xlID0gdGhpcy5faW5zdGFuY2UuaGFzUmVhbG1Sb2xlKHJvbGUpO1xuICAgIH1cbiAgICByZXR1cm4gaGFzUm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJvbGVzIG9mIHRoZSBsb2dnZWQgdXNlci4gVGhlIGFsbFJvbGVzIHBhcmFtZXRlciwgd2l0aCBkZWZhdWx0IHZhbHVlXG4gICAqIHRydWUsIHdpbGwgcmV0dXJuIHRoZSBjbGllbnRJZCBhbmQgcmVhbG0gcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2dnZWQgdXNlci4gSWYgc2V0IHRvIGZhbHNlXG4gICAqIGl0IHdpbGwgb25seSByZXR1cm4gdGhlIHVzZXIgcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnRJZC5cbiAgICpcbiAgICogQHBhcmFtIGFsbFJvbGVzXG4gICAqIEZsYWcgdG8gc2V0IGlmIGFsbCByb2xlcyBzaG91bGQgYmUgcmV0dXJuZWQuKE9wdGlvbmFsOiBkZWZhdWx0IHZhbHVlIGlzIHRydWUpXG4gICAqIEByZXR1cm5zXG4gICAqIEFycmF5IG9mIFJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9nZ2VkIHVzZXIuXG4gICAqL1xuICBnZXRVc2VyUm9sZXMoYWxsUm9sZXM6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nW10ge1xuICAgIGxldCByb2xlczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5faW5zdGFuY2UucmVzb3VyY2VBY2Nlc3MpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX2luc3RhbmNlLnJlc291cmNlQWNjZXNzKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbnN0YW5jZS5yZXNvdXJjZUFjY2Vzcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgY29uc3QgcmVzb3VyY2VBY2Nlc3M6IGFueSA9IHRoaXMuX2luc3RhbmNlLnJlc291cmNlQWNjZXNzW2tleV07XG4gICAgICAgICAgY29uc3QgY2xpZW50Um9sZXMgPSByZXNvdXJjZUFjY2Vzc1sncm9sZXMnXSB8fCBbXTtcbiAgICAgICAgICByb2xlcyA9IHJvbGVzLmNvbmNhdChjbGllbnRSb2xlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbFJvbGVzICYmIHRoaXMuX2luc3RhbmNlLnJlYWxtQWNjZXNzKSB7XG4gICAgICBjb25zdCByZWFsbVJvbGVzID0gdGhpcy5faW5zdGFuY2UucmVhbG1BY2Nlc3NbJ3JvbGVzJ10gfHwgW107XG4gICAgICByb2xlcy5wdXNoKC4uLnJlYWxtUm9sZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcm9sZXM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBpcyBsb2dnZWQgaW4uXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiB0aGUgdXNlciBpcyBsb2dnZWQgaW4uXG4gICAqL1xuICBhc3luYyBpc0xvZ2dlZEluKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuX2luc3RhbmNlLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy51cGRhdGVUb2tlbigyMCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRva2VuIGhhcyBsZXNzIHRoYW4gbWluVmFsaWRpdHkgc2Vjb25kcyBsZWZ0IGJlZm9yZVxuICAgKiBpdCBleHBpcmVzLlxuICAgKlxuICAgKiBAcGFyYW0gbWluVmFsaWRpdHlcbiAgICogU2Vjb25kcyBsZWZ0LiAobWluVmFsaWRpdHkpIGlzIG9wdGlvbmFsLiBEZWZhdWx0IHZhbHVlIGlzIDAuXG4gICAqIEByZXR1cm5zXG4gICAqIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgdG9rZW4gaXMgZXhwaXJlZC5cbiAgICovXG4gIGlzVG9rZW5FeHBpcmVkKG1pblZhbGlkaXR5OiBudW1iZXIgPSAwKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlLmlzVG9rZW5FeHBpcmVkKG1pblZhbGlkaXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgdG9rZW4gZXhwaXJlcyB3aXRoaW4gbWluVmFsaWRpdHkgc2Vjb25kcyB0aGUgdG9rZW4gaXMgcmVmcmVzaGVkLiBJZiB0aGVcbiAgICogc2Vzc2lvbiBzdGF0dXMgaWZyYW1lIGlzIGVuYWJsZWQsIHRoZSBzZXNzaW9uIHN0YXR1cyBpcyBhbHNvIGNoZWNrZWQuXG4gICAqIFJldHVybnMgYSBwcm9taXNlIHRlbGxpbmcgaWYgdGhlIHRva2VuIHdhcyByZWZyZXNoZWQgb3Igbm90LiBJZiB0aGUgc2Vzc2lvbiBpcyBub3QgYWN0aXZlXG4gICAqIGFueW1vcmUsIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gbWluVmFsaWRpdHlcbiAgICogU2Vjb25kcyBsZWZ0LiAobWluVmFsaWRpdHkgaXMgb3B0aW9uYWwsIGlmIG5vdCBzcGVjaWZpZWQgNSBpcyB1c2VkKVxuICAgKiBAcmV0dXJuc1xuICAgKiBQcm9taXNlIHdpdGggYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHRva2VuIHdhcyBzdWNjZXNmdWxseSB1cGRhdGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVRva2VuKG1pblZhbGlkaXR5ID0gNSkge1xuICAgIC8vIFRPRE86IHRoaXMgaXMgYSB3b3JrYXJvdW5kIHVudGlsIHRoZSBzaWxlbnQgcmVmcmVzaCAoaXNzdWUgIzQzKVxuICAgIC8vIGlzIG5vdCBpbXBsZW1lbnRlZCwgYXZvaWRpbmcgdGhlIHJlZGlyZWN0IGxvb3AuXG4gICAgaWYgKHRoaXMuX3NpbGVudFJlZnJlc2gpIHtcbiAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgdG9rZW4sIG9yIHRoZSBzZXNzaW9uIGlzIGV4cGlyZWQnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2V5Y2xvYWsgQW5ndWxhciBsaWJyYXJ5IGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9Qcm9taXNlKHRoaXMuX2luc3RhbmNlLnVwZGF0ZVRva2VuKG1pblZhbGlkaXR5KSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIHVzZXIgcHJvZmlsZS5cbiAgICogUmV0dXJucyBwcm9taXNlIHRvIHNldCBmdW5jdGlvbnMgdG8gYmUgaW52b2tlZCBpZiB0aGUgcHJvZmlsZSB3YXMgbG9hZGVkXG4gICAqIHN1Y2Nlc3NmdWxseSwgb3IgaWYgdGhlIHByb2ZpbGUgY291bGQgbm90IGJlIGxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlUmVsb2FkXG4gICAqIElmIHRydWUgd2lsbCBmb3JjZSB0aGUgbG9hZFVzZXJQcm9maWxlIGV2ZW4gaWYgaXRzIGFscmVhZHkgbG9hZGVkLlxuICAgKiBAcmV0dXJuc1xuICAgKiBBIHByb21pc2Ugd2l0aCB0aGUgS2V5Y2xvYWtQcm9maWxlIGRhdGEgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRVc2VyUHJvZmlsZShmb3JjZVJlbG9hZCA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX3VzZXJQcm9maWxlICYmICFmb3JjZVJlbG9hZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3VzZXJQcm9maWxlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faW5zdGFuY2UuYXV0aGVudGljYXRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHVzZXIgcHJvZmlsZSB3YXMgbm90IGxvYWRlZCBhcyB0aGUgdXNlciBpcyBub3QgbG9nZ2VkIGluLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuICh0aGlzLl91c2VyUHJvZmlsZSA9IGF3YWl0IHRvUHJvbWlzZShcbiAgICAgIHRoaXMuX2luc3RhbmNlLmxvYWRVc2VyUHJvZmlsZSgpXG4gICAgKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXV0aGVudGljYXRlZCB0b2tlbiwgY2FsbGluZyB1cGRhdGVUb2tlbiB0byBnZXQgYSByZWZyZXNoZWQgb25lIGlmXG4gICAqIG5lY2Vzc2FyeS4gSWYgdGhlIHNlc3Npb24gaXMgZXhwaXJlZCBhbmQgdGhlIGZvcmNlTG9naW4gZmxhZyBpcyBzZXQgdG8gdHJ1ZSxcbiAgICogdGhpcyBtZXRob2QgY2FsbHMgdGhlIGxvZ2luIG1ldGhvZCBmb3IgYSBuZXcgbG9naW4sIG90aGVyd2lzZSByZWplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yY2VMb2dpblxuICAgKiBGbGFnIHdoZXRoZXIgYSBsb2dpbiBzaG91bGQgYmUgZW5mb3JjZWQgaWYgdGhlIHNlc3Npb24gaXMgZXhwaXJlZC5cbiAgICogQHJldHVybnNcbiAgICogUHJvbWlzZSB3aXRoIHRoZSBnZW5lcmF0ZWQgdG9rZW4uXG4gICAqL1xuICBhc3luYyBnZXRUb2tlbihmb3JjZUxvZ2luID0gdHJ1ZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVG9rZW4oMTApO1xuICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlLnRva2VuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZm9yY2VMb2dpbikge1xuICAgICAgICB0aGlzLmxvZ2luKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbG9nZ2VkIHVzZXJuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgbG9nZ2VkIHVzZXJuYW1lLlxuICAgKi9cbiAgcHVibGljIGdldFVzZXJuYW1lKCkge1xuICAgIGlmICghdGhpcy5fdXNlclByb2ZpbGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkIGluIG9yIHVzZXIgcHJvZmlsZSB3YXMgbm90IGxvYWRlZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdXNlclByb2ZpbGUudXNlcm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYXV0aGVudGljYXRpb24gc3RhdGUsIGluY2x1ZGluZyB0b2tlbnMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiBhcHBsaWNhdGlvblxuICAgKiBoYXMgZGV0ZWN0ZWQgdGhlIHNlc3Npb24gd2FzIGV4cGlyZWQsIGZvciBleGFtcGxlIGlmIHVwZGF0aW5nIHRva2VuIGZhaWxzLlxuICAgKiBJbnZva2luZyB0aGlzIHJlc3VsdHMgaW4gb25BdXRoTG9nb3V0IGNhbGxiYWNrIGxpc3RlbmVyIGJlaW5nIGludm9rZWQuXG4gICAqL1xuICBjbGVhclRva2VuKCk6IHZvaWQge1xuICAgIHRoaXMuX2luc3RhbmNlLmNsZWFyVG9rZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdmFsaWQgdG9rZW4gaW4gaGVhZGVyLiBUaGUga2V5ICYgdmFsdWUgZm9ybWF0IGlzOlxuICAgKiBBdXRob3JpemF0aW9uIEJlYXJlciA8dG9rZW4+LlxuICAgKiBJZiB0aGUgaGVhZGVycyBwYXJhbSBpcyB1bmRlZmluZWQgaXQgd2lsbCBjcmVhdGUgdGhlIEFuZ3VsYXIgaGVhZGVycyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSBoZWFkZXJzXG4gICAqIFVwZGF0ZWQgaGVhZGVyIHdpdGggQXV0aG9yaXphdGlvbiBhbmQgS2V5Y2xvYWsgdG9rZW4uXG4gICAqIEByZXR1cm5zXG4gICAqIEFuIG9ic2VydmFibGUgd2l0aCB3aXRoIHRoZSBIVFRQIEF1dGhvcml6YXRpb24gaGVhZGVyIGFuZCB0aGUgY3VycmVudCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhZGRUb2tlblRvSGVhZGVyKGhlYWRlcnM6IEh0dHBIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCkpIHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmdldFRva2VuKCkpLnBpcGUoXG4gICAgICBtYXAoKHRva2VuKSA9PlxuICAgICAgICBoZWFkZXJzLnNldCh0aGlzLl9hdXRob3JpemF0aW9uSGVhZGVyTmFtZSwgdGhpcy5fYmVhcmVyUHJlZml4ICsgdG9rZW4pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBLZXljbG9hayBpbnN0YW5jZSwgaWYgeW91IG5lZWQgYW55IGN1c3RvbWl6YXRpb24gdGhhdFxuICAgKiB0aGlzIEFuZ3VsYXIgc2VydmljZSBkb2VzIG5vdCBzdXBwb3J0IHlldC4gVXNlIHdpdGggY2F1dGlvbi5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogVGhlIEtleWNsb2FrSW5zdGFuY2UgZnJvbSBrZXljbG9hay1qcy5cbiAgICovXG4gIGdldEtleWNsb2FrSW5zdGFuY2UoKTogS2V5Y2xvYWsuS2V5Y2xvYWtJbnN0YW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4Y2x1ZGVkIFVSTHMgdGhhdCBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgYnlcbiAgICogdGhlIGh0dHAgaW50ZXJjZXB0b3Igd2hpY2ggYXV0b21hdGljYWxseSBhZGRzIHRoZSBhdXRob3JpemF0aW9uIGhlYWRlciBpbiB0aGUgSHR0cCBSZXF1ZXN0LlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgZXhjbHVkZWQgdXJscyB0aGF0IG11c3Qgbm90IGJlIGludGVyY2VwdGVkIGJ5IHRoZSBLZXljbG9ha0JlYXJlckludGVyY2VwdG9yLlxuICAgKi9cbiAgZ2V0IGV4Y2x1ZGVkVXJscygpOiBFeGNsdWRlZFVybFJlZ2V4W10ge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZFVybHM7XG4gIH1cblxuICAvKipcbiAgICogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgYmVhcmVyIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGF1dGhvcml6YXRpb24gaGVhZGVyLlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBSZXR1cm5zIGlmIHRoZSBiZWFyZXIgaW50ZXJjZXB0b3Igd2FzIHNldCB0byBiZSBkaXNhYmxlZC5cbiAgICovXG4gIGdldCBlbmFibGVCZWFyZXJJbnRlcmNlcHRvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlQmVhcmVySW50ZXJjZXB0b3I7XG4gIH1cblxuICAvKipcbiAgICogS2V5Y2xvYWsgc3ViamVjdCB0byBtb25pdG9yIHRoZSBldmVudHMgdHJpZ2dlcmVkIGJ5IGtleWNsb2FrLWpzLlxuICAgKiBUaGUgZm9sbG93aW5nIGV2ZW50cyBhcyBhdmFpbGFibGUgKGFzIGRlc2NyaWJlZCBhdCBrZXljbG9hayBkb2NzIC1cbiAgICogaHR0cHM6Ly93d3cua2V5Y2xvYWsub3JnL2RvY3MvbGF0ZXN0L3NlY3VyaW5nX2FwcHMvaW5kZXguaHRtbCNjYWxsYmFjay1ldmVudHMpOlxuICAgKiAtIE9uQXV0aEVycm9yXG4gICAqIC0gT25BdXRoTG9nb3V0XG4gICAqIC0gT25BdXRoUmVmcmVzaEVycm9yXG4gICAqIC0gT25BdXRoUmVmcmVzaFN1Y2Nlc3NcbiAgICogLSBPbkF1dGhTdWNjZXNzXG4gICAqIC0gT25SZWFkeVxuICAgKiAtIE9uVG9rZW5FeHBpcmVcbiAgICogSW4gZWFjaCBvY2N1cnJlbmNlIG9mIGFueSBvZiB0aGVzZSwgdGhpcyBzdWJqZWN0IHdpbGwgcmV0dXJuIHRoZSBldmVudCB0eXBlLFxuICAgKiBkZXNjcmliZWQgYXQge0BsaW5rIEtleWNsb2FrRXZlbnRUeXBlfSBlbnVtIGFuZCB0aGUgZnVuY3Rpb24gYXJncyBmcm9tIHRoZSBrZXljbG9hay1qc1xuICAgKiBpZiBwcm92aWRlZCBhbnkuXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEEgc3ViamVjdCB3aXRoIHRoZSB7QGxpbmsgS2V5Y2xvYWtFdmVudH0gd2hpY2ggZGVzY3JpYmVzIHRoZSBldmVudCB0eXBlIGFuZCBhdHRhY2hlcyB0aGVcbiAgICogZnVuY3Rpb24gYXJncy5cbiAgICovXG4gIGdldCBrZXljbG9ha0V2ZW50cyQoKTogU3ViamVjdDxLZXljbG9ha0V2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuX2tleWNsb2FrRXZlbnRzJDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
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,14 +1,15 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
1
2
|
import { NgModule } from '@angular/core';
|
|
2
3
|
import { CoreModule } from './core/core.module';
|
|
3
4
|
var KeycloakAngularModule = (function () {
|
|
4
5
|
function KeycloakAngularModule() {
|
|
5
6
|
}
|
|
6
|
-
KeycloakAngularModule
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
];
|
|
7
|
+
KeycloakAngularModule = __decorate([
|
|
8
|
+
NgModule({
|
|
9
|
+
imports: [CoreModule]
|
|
10
|
+
})
|
|
11
|
+
], KeycloakAngularModule);
|
|
11
12
|
return KeycloakAngularModule;
|
|
12
13
|
}());
|
|
13
14
|
export { KeycloakAngularModule };
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2xvYWstYW5ndWxhci5tb2R1bGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9rZXljbG9hay1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2tleWNsb2FrLWFuZ3VsYXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFRQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUtoRDtJQUFBO0lBQW9DLENBQUM7SUFBeEIscUJBQXFCO1FBSGpDLFFBQVEsQ0FBQztZQUNSLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQztTQUN0QixDQUFDO09BQ1cscUJBQXFCLENBQUc7SUFBRCw0QkFBQztDQUFBLEFBQXJDLElBQXFDO1NBQXhCLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBNYXVyaWNpbyBHZW1lbGxpIFZpZ29sbyBhbmQgY29udHJpYnV0b3JzLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL21hdXJpY2lvdmlnb2xvL2tleWNsb2FrLWFuZ3VsYXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENvcmVNb2R1bGUgfSBmcm9tICcuL2NvcmUvY29yZS5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29yZU1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgS2V5Y2xvYWtBbmd1bGFyTW9kdWxlIHt9XG4iXX0=
|