@posiwise/common-services 0.1.76 → 0.1.77
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/esm2022/index.mjs +2 -2
- package/esm2022/lib/auth.service.mjs +33 -22
- package/esm2022/lib/brain.service.mjs +1 -1
- package/esm2022/lib/permission.service.mjs +158 -3
- package/esm2022/lib/secure-token-storage.service.mjs +264 -0
- package/esm2022/lib/sentry.service.mjs +2 -2
- package/fesm2022/posiwise-common-services.mjs +472 -81
- package/fesm2022/posiwise-common-services.mjs.map +1 -1
- package/index.d.ts +1 -1
- package/lib/auth.service.d.ts +8 -2
- package/lib/brain.service.d.ts +1 -1
- package/lib/permission.service.d.ts +27 -0
- package/lib/secure-token-storage.service.d.ts +94 -0
- package/package.json +1 -1
- package/esm2022/lib/jquery.service.mjs +0 -35
- package/lib/jquery.service.d.ts +0 -14
|
@@ -132,8 +132,8 @@ export class PermissionService {
|
|
|
132
132
|
}
|
|
133
133
|
expr = this.handleNonBooleanPermissions(permission, expr, productKey, permission_key, productSlug);
|
|
134
134
|
// Now expr is made of true/false values with &&, ||, ()
|
|
135
|
-
//
|
|
136
|
-
return
|
|
135
|
+
// Safe evaluation of boolean expressions without using eval()
|
|
136
|
+
return this.evaluateBooleanExpression(expr);
|
|
137
137
|
}
|
|
138
138
|
handleNonBooleanPermissions(permission, expr, productKey, permission_key, productSlug) {
|
|
139
139
|
if (typeof permission !== 'boolean') {
|
|
@@ -240,6 +240,161 @@ export class PermissionService {
|
|
|
240
240
|
getCurrentProduct() {
|
|
241
241
|
return JSON.parse(localStorage.getItem('product'));
|
|
242
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* Safely evaluates boolean expressions without using eval()
|
|
245
|
+
* Supports: true, false, &&, ||, (, )
|
|
246
|
+
* @param expr - Boolean expression string like "true && false || (true && false)"
|
|
247
|
+
* @returns boolean result
|
|
248
|
+
*/
|
|
249
|
+
evaluateBooleanExpression(expr) {
|
|
250
|
+
if (!expr || typeof expr !== 'string') {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
try {
|
|
254
|
+
// Clean up the expression - remove extra spaces and normalize
|
|
255
|
+
const cleanExpr = expr.trim().replace(/\s+/g, ' ');
|
|
256
|
+
// Simple tokenizer for boolean expressions
|
|
257
|
+
const tokens = this.tokenizeBooleanExpression(cleanExpr);
|
|
258
|
+
// Parse and evaluate the expression
|
|
259
|
+
return this.parseBooleanExpression(tokens);
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
console.warn('Error evaluating boolean expression:', expr, error);
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Tokenizes a boolean expression string
|
|
268
|
+
*/
|
|
269
|
+
tokenizeBooleanExpression(expr) {
|
|
270
|
+
const tokens = [];
|
|
271
|
+
let i = 0;
|
|
272
|
+
while (i < expr.length) {
|
|
273
|
+
const char = expr[i];
|
|
274
|
+
if (this.isWhitespace(char)) {
|
|
275
|
+
i++;
|
|
276
|
+
}
|
|
277
|
+
else if (this.isParenthesis(char)) {
|
|
278
|
+
tokens.push(char);
|
|
279
|
+
i++;
|
|
280
|
+
}
|
|
281
|
+
else if (this.isDoubleOperator(expr, i, '&')) {
|
|
282
|
+
tokens.push('&&');
|
|
283
|
+
i += 2;
|
|
284
|
+
}
|
|
285
|
+
else if (this.isDoubleOperator(expr, i, '|')) {
|
|
286
|
+
tokens.push('||');
|
|
287
|
+
i += 2;
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
const token = this.collectToken(expr, i);
|
|
291
|
+
if (token.value) {
|
|
292
|
+
tokens.push(token.value);
|
|
293
|
+
}
|
|
294
|
+
i = token.nextIndex;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return tokens;
|
|
298
|
+
}
|
|
299
|
+
isWhitespace(char) {
|
|
300
|
+
return char === ' ';
|
|
301
|
+
}
|
|
302
|
+
isParenthesis(char) {
|
|
303
|
+
return char === '(' || char === ')';
|
|
304
|
+
}
|
|
305
|
+
isDoubleOperator(expr, index, operator) {
|
|
306
|
+
return expr[index] === operator && expr[index + 1] === operator;
|
|
307
|
+
}
|
|
308
|
+
collectToken(expr, startIndex) {
|
|
309
|
+
let current = '';
|
|
310
|
+
let i = startIndex;
|
|
311
|
+
while (i < expr.length && ![' ', '(', ')', '&', '|'].includes(expr[i])) {
|
|
312
|
+
current += expr[i];
|
|
313
|
+
i++;
|
|
314
|
+
}
|
|
315
|
+
return { value: current, nextIndex: i };
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Parses and evaluates boolean expression tokens
|
|
319
|
+
*/
|
|
320
|
+
parseBooleanExpression(tokens) {
|
|
321
|
+
// Handle simple cases first
|
|
322
|
+
if (tokens.length === 1) {
|
|
323
|
+
return tokens[0] === 'true';
|
|
324
|
+
}
|
|
325
|
+
// Convert to postfix notation and evaluate
|
|
326
|
+
const postfix = this.infixToPostfix(tokens);
|
|
327
|
+
return this.evaluatePostfix(postfix);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Converts infix notation to postfix (Reverse Polish Notation)
|
|
331
|
+
*/
|
|
332
|
+
infixToPostfix(tokens) {
|
|
333
|
+
const output = [];
|
|
334
|
+
const operators = [];
|
|
335
|
+
const precedence = { '||': 1, '&&': 2 };
|
|
336
|
+
for (const token of tokens) {
|
|
337
|
+
if (token === 'true' || token === 'false') {
|
|
338
|
+
output.push(token);
|
|
339
|
+
}
|
|
340
|
+
else if (token === '(') {
|
|
341
|
+
operators.push(token);
|
|
342
|
+
}
|
|
343
|
+
else if (token === ')') {
|
|
344
|
+
while (operators.length > 0 && operators[operators.length - 1] !== '(') {
|
|
345
|
+
const op = operators.pop();
|
|
346
|
+
if (op)
|
|
347
|
+
output.push(op);
|
|
348
|
+
}
|
|
349
|
+
operators.pop(); // Remove '('
|
|
350
|
+
}
|
|
351
|
+
else if (token === '&&' || token === '||') {
|
|
352
|
+
while (operators.length > 0 &&
|
|
353
|
+
operators[operators.length - 1] !== '(' &&
|
|
354
|
+
precedence[operators[operators.length - 1]] >= precedence[token]) {
|
|
355
|
+
const op = operators.pop();
|
|
356
|
+
if (op)
|
|
357
|
+
output.push(op);
|
|
358
|
+
}
|
|
359
|
+
operators.push(token);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
while (operators.length > 0) {
|
|
363
|
+
const op = operators.pop();
|
|
364
|
+
if (op)
|
|
365
|
+
output.push(op);
|
|
366
|
+
}
|
|
367
|
+
return output;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Evaluates postfix boolean expression
|
|
371
|
+
*/
|
|
372
|
+
evaluatePostfix(postfix) {
|
|
373
|
+
const stack = [];
|
|
374
|
+
for (const token of postfix) {
|
|
375
|
+
if (token === 'true') {
|
|
376
|
+
stack.push(true);
|
|
377
|
+
}
|
|
378
|
+
else if (token === 'false') {
|
|
379
|
+
stack.push(false);
|
|
380
|
+
}
|
|
381
|
+
else if (token === '&&') {
|
|
382
|
+
const b = stack.pop();
|
|
383
|
+
const a = stack.pop();
|
|
384
|
+
if (a !== undefined && b !== undefined) {
|
|
385
|
+
stack.push(a && b);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
else if (token === '||') {
|
|
389
|
+
const b = stack.pop();
|
|
390
|
+
const a = stack.pop();
|
|
391
|
+
if (a !== undefined && b !== undefined) {
|
|
392
|
+
stack.push(a || b);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return stack[0] || false;
|
|
397
|
+
}
|
|
243
398
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PermissionService, deps: [{ token: i1.MainApiHttpService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
244
399
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PermissionService, providedIn: 'root' }); }
|
|
245
400
|
}
|
|
@@ -249,4 +404,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
249
404
|
providedIn: 'root'
|
|
250
405
|
}]
|
|
251
406
|
}], ctorParameters: () => [{ type: i1.MainApiHttpService }] });
|
|
252
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24tc2VydmljZXMvc3JjL2xpYi9wZXJtaXNzaW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQVEsTUFBTSw0QkFBNEIsQ0FBQztBQUU5RixPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFFbkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQUs3RCxNQUFNLE9BQU8saUJBQWlCO0lBUzFCLFlBQTZCLEdBQXVCO1FBQXZCLFFBQUcsR0FBSCxHQUFHLENBQW9CO1FBRnBELFNBQUksR0FBUyxJQUFJLENBQUM7SUFFcUMsQ0FBQztJQUV4RCxzQkFBc0IsQ0FBQyxZQUFZO1FBQy9CLGlCQUFpQixDQUFDLG9CQUFvQixHQUFHLFlBQVksQ0FBQztJQUMxRCxDQUFDO0lBRUQsU0FBUyxDQUNMLGNBQXNCLEVBQ3RCLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLGNBQWMsR0FBRyxJQUFJLEVBQ3JCLFdBQVcsR0FBRyxJQUFJO1FBRWxCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztZQUV0QixzQ0FBc0M7WUFDdEMseUJBQXlCO1lBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNqQixjQUFjLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZ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QUFXO1lBQ2hDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztZQUN0QyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO1NBQy9DLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVNLGlCQUFpQjtRQUNwQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7K0dBM1RRLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmQsTUFBTTs7NEZBRVQsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQURNSU5fU1VCX01FTlVfV0hJVEVMSVNULCBQRVJNSVNTSU9OX05BTUVTLCBVc2VyIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuXG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9jbG9uZURlZXAnO1xuaW1wb3J0IHBpY2tCeSBmcm9tICdsb2Rhc2gvcGlja0J5JztcblxuaW1wb3J0IHsgTWFpbkFwaUh0dHBTZXJ2aWNlIH0gZnJvbSAnLi9tYWluLWFwaS1odHRwLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25TZXJ2aWNlIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0YXRpYyBzZWxlY3RlZFByb2R1Y3Q6IGFueTsgLy8gTk9TT05BUlxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgc2VsZWN0ZWRTdWJzY3JpcHRpb246IGFueTsgLy8gTk9TT05BUlxuXG4gICAgdXNlcjogVXNlciA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGFwaTogTWFpbkFwaUh0dHBTZXJ2aWNlKSB7fVxuXG4gICAgc2V0Q3VycmVudFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgUGVybWlzc2lvblNlcnZpY2Uuc2VsZWN0ZWRTdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb247XG4gICAgfVxuXG4gICAgaXNHcmFudGVkKFxuICAgICAgICBwZXJtaXNzaW9uTmFtZTogc3RyaW5nLFxuICAgICAgICBwcm9kdWN0S2V5ID0gbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbl9rZXkgPSBudWxsLFxuICAgICAgICBwcm9kdWN0U2x1ZyA9IG51bGxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudXNlcikge1xuICAgICAgICAgICAgY29uc3QgeyB1c2VyIH0gPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBBZG1pbiBoYXZlIGFjY2VzcyB0byBhbGwgdGhlIG1lbnVzLlxuICAgICAgICAgICAgLy8gRS5nLiwgUGFnZXMuU3VwZXJBZG1pblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdXBlckFkbWluKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbk5hbWUgPSB0aGlzLmdldEZvcm1hdHRlZFBlcm1pc3Npb25OYW1lKHBlcm1pc3Npb25OYW1lLCBwcm9kdWN0U2x1Zyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJldHVybmluZyB0cnVlIGlmIHVzZXIgaGFzIGEgZ2l2ZW4gcGVybWlzc2lvblxuICAgICAgICAgICAgLy8gRS5nLiwgUGFnZXMuUm9sZS5DbG91ZE9saXZlLlNhbGVzTWFuYWdlclxuICAgICAgICAgICAgLy8gb3IgUGFnZXMuQmV0YSBvciBQYWdlcy5BbHBoYVxuXG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbk5hbWU/LmluY2x1ZGVzKCd8fCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwZXJtaXNzaW9uTmFtZS5zcGxpdCgnfHwnKS5tYXAocCA9PiBwLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzQW55R3JhbnRlZFBlcm1pc3Npb24ocGFydHMsIHVzZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlclsnYXV0aCddPy5bJ2dyYW50ZWQnXVtwZXJtaXNzaW9uTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQZXJtaXNzaW9ucyA9IHRoaXMuaGFuZGxlUHJvZHVjdEtleShcbiAgICAgICAgICAgICAgICBwcm9kdWN0S2V5LFxuICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbl9rZXksXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbk5hbWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChmaWx0ZXJlZFBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUGVybWlzc2lvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vIHZhbGlkIHBlcm1pc3Npb24gd2FzIGRldGVjdGVkIGZvciB0aGlzIHVzZXJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VyIG5vdCBsb2dnZWQtaW5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzQW55R3JhbnRlZFBlcm1pc3Npb24ocGFydHM6IHN0cmluZ1tdLCB1c2VyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBwYXJ0cy5zb21lKHBhcnQgPT4gdXNlclsnYXV0aCddPy5bJ2dyYW50ZWQnXVtwYXJ0XSk7XG4gICAgfVxuXG4gICAgaGFuZGxlUHJvZHVjdEtleShwcm9kdWN0S2V5LCB1c2VyLCBwZXJtaXNzaW9uX2tleSwgcGVybWlzc2lvbk5hbWUpIHtcbiAgICAgICAgaWYgKHByb2R1Y3RLZXkpIHtcbiAgICAgICAgICAgIC8vIGZpbHRlcnMgdGhlIHBlcm1pc3Npb24gb25seSBmb3IgdGhlIHNlbGVjdGVkIHByb2R1Y3QuXG4gICAgICAgICAgICBsZXQgZmlsdGVyZWRQZXJtaXNzaW9ucyA9IHBpY2tCeShjbG9uZURlZXAodXNlclsnYXV0aCddWydncmFudGVkJ10pLCAoX3ZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmluY2x1ZGVzKHByb2R1Y3RLZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBhZGQgUGFnZXMuUHJvZHVjdC57cGVybWlzc2lvbl9rZXl9XG4gICAgICAgICAgICBmaWx0ZXJlZFBlcm1pc3Npb25zID0ge1xuICAgICAgICAgICAgICAgIC4uLnsgW2BQYWdlcy5Qcm9kdWN0LiR7cGVybWlzc2lvbl9rZXl9YF06IHRydWUgfSxcbiAgICAgICAgICAgICAgICAuLi5maWx0ZXJlZFBlcm1pc3Npb25zXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBFLmcuLCBQYWdlcy5Qcm9kdWN0LkNsb3VkT2xpdmUuQ2xvdWRPbGl2ZV9Nc3BLZXlcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFBlcm1pc3Npb25zW3Blcm1pc3Npb25OYW1lXSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Rm9ybWF0dGVkUGVybWlzc2lvbk5hbWUocGVybWlzc2lvbk5hbWU6IHN0cmluZywgcHJvZHVjdFNsdWc6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3QgPSBQZXJtaXNzaW9uU2VydmljZT8uc2VsZWN0ZWRQcm9kdWN0ID8/IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHNlbGVjdGVkUHJvZHVjdD8uc3Vic2NyaXB0aW9uX3NsdWc7XG5cbiAgICAgICAgbGV0IHNsdWdUb0NoZWNrOiBzdHJpbmc7XG4gICAgICAgIGlmICghcHJvZHVjdFNsdWcpIHtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUHJvZHVjdC4nKSkge1xuICAgICAgICAgICAgICAgIHNsdWdUb0NoZWNrID0gYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS5gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbk5hbWUuaW5jbHVkZXMoJ1BhZ2VzLlJvbGUuJykpIHtcbiAgICAgICAgICAgICAgICBzbHVnVG9DaGVjayA9IGBQYWdlcy5Sb2xlLiR7c3Vic2NyaXB0aW9uU2x1Z30uYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNsdWdUb0NoZWNrID0gcHJvZHVjdFNsdWc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBlcm1pc3Npb25OYW1lLmluY2x1ZGVzKHNsdWdUb0NoZWNrKSAmJiBwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUHJvZHVjdC4nKSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbk5hbWUgPSBwZXJtaXNzaW9uTmFtZS5yZXBsYWNlKCdQYWdlcy5Qcm9kdWN0LicsIHNsdWdUb0NoZWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUm9sZS4nKSAmJiAhcGVybWlzc2lvbk5hbWUuaW5jbHVkZXMoc2x1Z1RvQ2hlY2spKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9uTmFtZSA9IHBlcm1pc3Npb25OYW1lLnJlcGxhY2UoJ1BhZ2VzLlJvbGUuJywgc2x1Z1RvQ2hlY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25OYW1lO1xuICAgIH1cblxuICAgIGdldFBlcm1pc3Npb25UcmVlRGF0YUJ5Um9sZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gW107XG4gICAgICAgIGRhdGEuYWxsLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCwgLy8gcGVybWlzc2lvbklkOiBVc2VkIHRvIHVwZGF0ZSB0aGUgcGVybWlzc2lvbnMgb24gY2hhbmdlXG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZTogbmFtZS5pbmNsdWRlcygnLicpID8gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZignLicpKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogZWxlbWVudC5uYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgZ3JhbnRlZFBlcm1pc3Npb25OYW1lczogT2JqZWN0LmtleXMoZGF0YS5ncmFudGVkKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGV2YWx1YXRlUGVybWlzc2lvbnMoXG4gICAgICAgIHBlcm1pc3Npb246IHN0cmluZyxcbiAgICAgICAgcHJvZHVjdEtleTogc3RyaW5nID0gbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbl9rZXk6IHN0cmluZyA9IG51bGwsXG4gICAgICAgIHByb2R1Y3RTbHVnOiBzdHJpbmcgPSBudWxsXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghcGVybWlzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4cHIgPSAnJztcblxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdXBlckFkbWluKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1N1cGVyQWRtaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdWJzY3JpcHRpb25BZG1pbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb24gPT09IFBFUk1JU1NJT05fTkFNRVMuU3Vic2NyaXB0aW9uT3duZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb24gPT09IFBFUk1JU1NJT05fTkFNRVMuU3Vic2NyaXB0aW9uU3VwZXJBZG1pbikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4oKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uU3VwZXJPd25lcigpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5pc1N1cGVyQWRtaW4oKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdWJzY3JpcHRpb25TdXBlck93bmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1VzZXJTdWJzY3JpcHRpb25TdXBlck93bmVyKCkgfHwgdGhpcy5pc1N1cGVyQWRtaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgcGVybWlzc2lvbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIEFETUlOX1NVQl9NRU5VX1dISVRFTElTVC5zb21lKHYgPT4gcGVybWlzc2lvbi5pbmNsdWRlcyh2KSkgJiZcbiAgICAgICAgICAgICh0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyT3duZXIoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHIgPSB0aGlzLmhhbmRsZU5vbkJvb2xlYW5QZXJtaXNzaW9ucyhcbiAgICAgICAgICAgIHBlcm1pc3Npb24sXG4gICAgICAgICAgICBleHByLFxuICAgICAgICAgICAgcHJvZHVjdEtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25fa2V5LFxuICAgICAgICAgICAgcHJvZHVjdFNsdWdcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBOb3cgZXhwciBpcyBtYWRlIG9mIHRydWUvZmFsc2UgdmFsdWVzIHdpdGggJiYsIHx8LCAoKVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXZhbFxuICAgICAgICByZXR1cm4gZXZhbChleHByKTsgLy8gTk9TT05BUlxuICAgIH1cblxuICAgIGhhbmRsZU5vbkJvb2xlYW5QZXJtaXNzaW9ucyhwZXJtaXNzaW9uLCBleHByLCBwcm9kdWN0S2V5LCBwZXJtaXNzaW9uX2tleSwgcHJvZHVjdFNsdWcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwZXJtaXNzaW9uICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb24uc3BsaXQoJyAnKS5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHgudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFsnfHwnLCAnJiYnLCAnKCcsICcpJ10uaW5jbHVkZXMocmF3KSkge1xuICAgICAgICAgICAgICAgICAgICBleHByICs9IGAgJHtyYXd9IGA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV2YWx1YXRlZDogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1cGVyQWRtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvbkFkbWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvbk93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgPSB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvblN1cGVyQWRtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VzZXJTdWJzY3JpcHRpb25TdXBlckFkbWluKCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyT3duZXIoKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvblN1cGVyT3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uU3VwZXJPd25lcigpIHx8IHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZHVjdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGl0J3MgUGFnZXMuUHJvZHVjdCBvciBQYWdlcy5Sb2xlIHdpdGggcHJvZHVjdEtleVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5pc0dyYW50ZWQocmF3LCBwcm9kdWN0S2V5LCBwZXJtaXNzaW9uX2tleSwgcHJvZHVjdFNsdWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5pc0dyYW50ZWQocmF3KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGV4cHIgKz0gYCAke2V2YWx1YXRlZH0gYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICBnZXRQZXJtaXNzaW9uQnlSb2xlKHJvbGVJZDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5nZXQoYC9hZG1pbi9yb2xlX3Blcm1pc3Npb25zLyR7cm9sZUlkfWApO1xuICAgIH1cblxuICAgIHNhdmVVc2VyUGVybWlzc2lvbihwYXlsb2FkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5wb3N0KGAvYWRtaW4vcm9sZV9wZXJtaXNzaW9uc2AsIHBheWxvYWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRldGVybWluZSB1c2VyIGlzIHN1cGVyX2FkbWluIHVzaW5nIHVzZXIuYXV0aC5ncmFudGVkWydQYWdlcy5TdXBlckFkbWluJ11cbiAgICAgKi9cbiAgICBpc1N1cGVyQWRtaW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMudXNlci5hdXRoLmdyYW50ZWRbJ1BhZ2VzLlN1cGVyQWRtaW4nXSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQW55IFByb2R1Y3QgQWRtaW4gcmVnYXJkbGVzcyBvZiB0aGUgcHJvZHVjdCBiZWluZyBtYXN0ZXIgcHJvZHVjdCBvciBub3QuXG4gICAgICovXG4gICAgcHVibGljIGlzVXNlclN1YnNjcmlwdGlvbk93bmVyKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvbk93bmVyYFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFueSBQcm9kdWN0IEFkbWluIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb2R1Y3QgYmVpbmcgbWFzdGVyIHByb2R1Y3Qgb3Igbm90LlxuICAgICAqICpyYmFjQWxsb3c9XCJTdWJzY3JpcHRpb25BZG1pblwiXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4ocHJvZHVjdD8pOiBib29sZWFuIHtcbiAgICAgICAgcHJvZHVjdCA/Pz0gdGhpcy5nZXRDdXJyZW50UHJvZHVjdCgpO1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25TbHVnID0gcHJvZHVjdD8uc3Vic2NyaXB0aW9uX3NsdWc7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIXRoaXMudXNlci5hdXRoLmdyYW50ZWRbXG4gICAgICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvbkFkbWluYFxuICAgICAgICAgICAgXSB8fFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25Pd25lcmBcbiAgICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbnkgUHJvZHVjdCBBZG1pbiBvZiB0aGUgcHJvZHVjdCBiZWluZyB0aGUgbWFzdGVyIHByb2R1Y3RcbiAgICAgKi9cbiAgICBpc1VzZXJTdWJzY3JpcHRpb25TdXBlckFkbWluKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlckFkbWluYFxuICAgICAgICAgICAgXSB8fFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlck93bmVyYFxuICAgICAgICAgICAgXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlzVXNlck1hc3RlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4ocHJvZHVjdD8pOiBib29sZWFuIHtcbiAgICAgICAgcHJvZHVjdCA/Pz0gdGhpcy5nZXRDdXJyZW50UHJvZHVjdCgpO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlckFkbWluYFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFueSBQcm9kdWN0IEFkbWluIG9mIHRoZSBwcm9kdWN0IGJlaW5nIHRoZSBtYXN0ZXIgcHJvZHVjdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1VzZXJTdWJzY3JpcHRpb25TdXBlck93bmVyKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvblN1cGVyT3duZXJgXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudFByb2R1Y3QocHJvZHVjdCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICdwcm9kdWN0JyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBpZDogcHJvZHVjdC5pZCxcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uX2tleTogcHJvZHVjdD8ucGVybWlzc2lvbl9rZXksXG4gICAgICAgICAgICAgICAgZmVhdHVyZV9rZXk6IHByb2R1Y3QuZmVhdHVyZV9rZXksXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHByb2R1Y3Quc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uX3NsdWc6IHByb2R1Y3Quc3Vic2NyaXB0aW9uX3NsdWdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRQcm9kdWN0KCkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncHJvZHVjdCcpKTtcbiAgICB9XG59XG4iXX0=
|
|
407
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24tc2VydmljZXMvc3JjL2xpYi9wZXJtaXNzaW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQVEsTUFBTSw0QkFBNEIsQ0FBQztBQUU5RixPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFFbkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQUs3RCxNQUFNLE9BQU8saUJBQWlCO0lBUzFCLFlBQTZCLEdBQXVCO1FBQXZCLFFBQUcsR0FBSCxHQUFHLENBQW9CO1FBRnBELFNBQUksR0FBUyxJQUFJLENBQUM7SUFFcUMsQ0FBQztJQUV4RCxzQkFBc0IsQ0FBQyxZQUFZO1FBQy9CLGlCQUFpQixDQUFDLG9CQUFvQixHQUFHLFlBQVksQ0FBQztJQUMxRCxDQUFDO0lBRUQsU0FBUyxDQUNMLGNBQXNCLEVBQ3RCLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLGNBQWMsR0FBRyxJQUFJLEVBQ3JCLFdBQVcsR0FBRyxJQUFJO1FBRWxCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztZQUV0QixzQ0FBc0M7WUFDdEMseUJBQXlCO1lBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNqQixjQUFjLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZ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LEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNyQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDdkIsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQzdCLENBQUM7K0dBamVRLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmQsTUFBTTs7NEZBRVQsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQURNSU5fU1VCX01FTlVfV0hJVEVMSVNULCBQRVJNSVNTSU9OX05BTUVTLCBVc2VyIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuXG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9jbG9uZURlZXAnO1xuaW1wb3J0IHBpY2tCeSBmcm9tICdsb2Rhc2gvcGlja0J5JztcblxuaW1wb3J0IHsgTWFpbkFwaUh0dHBTZXJ2aWNlIH0gZnJvbSAnLi9tYWluLWFwaS1odHRwLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25TZXJ2aWNlIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0YXRpYyBzZWxlY3RlZFByb2R1Y3Q6IGFueTsgLy8gTk9TT05BUlxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgc2VsZWN0ZWRTdWJzY3JpcHRpb246IGFueTsgLy8gTk9TT05BUlxuXG4gICAgdXNlcjogVXNlciA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGFwaTogTWFpbkFwaUh0dHBTZXJ2aWNlKSB7fVxuXG4gICAgc2V0Q3VycmVudFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgUGVybWlzc2lvblNlcnZpY2Uuc2VsZWN0ZWRTdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb247XG4gICAgfVxuXG4gICAgaXNHcmFudGVkKFxuICAgICAgICBwZXJtaXNzaW9uTmFtZTogc3RyaW5nLFxuICAgICAgICBwcm9kdWN0S2V5ID0gbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbl9rZXkgPSBudWxsLFxuICAgICAgICBwcm9kdWN0U2x1ZyA9IG51bGxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudXNlcikge1xuICAgICAgICAgICAgY29uc3QgeyB1c2VyIH0gPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBBZG1pbiBoYXZlIGFjY2VzcyB0byBhbGwgdGhlIG1lbnVzLlxuICAgICAgICAgICAgLy8gRS5nLiwgUGFnZXMuU3VwZXJBZG1pblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdXBlckFkbWluKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbk5hbWUgPSB0aGlzLmdldEZvcm1hdHRlZFBlcm1pc3Npb25OYW1lKHBlcm1pc3Npb25OYW1lLCBwcm9kdWN0U2x1Zyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJldHVybmluZyB0cnVlIGlmIHVzZXIgaGFzIGEgZ2l2ZW4gcGVybWlzc2lvblxuICAgICAgICAgICAgLy8gRS5nLiwgUGFnZXMuUm9sZS5DbG91ZE9saXZlLlNhbGVzTWFuYWdlclxuICAgICAgICAgICAgLy8gb3IgUGFnZXMuQmV0YSBvciBQYWdlcy5BbHBoYVxuXG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbk5hbWU/LmluY2x1ZGVzKCd8fCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwZXJtaXNzaW9uTmFtZS5zcGxpdCgnfHwnKS5tYXAocCA9PiBwLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzQW55R3JhbnRlZFBlcm1pc3Npb24ocGFydHMsIHVzZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlclsnYXV0aCddPy5bJ2dyYW50ZWQnXVtwZXJtaXNzaW9uTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQZXJtaXNzaW9ucyA9IHRoaXMuaGFuZGxlUHJvZHVjdEtleShcbiAgICAgICAgICAgICAgICBwcm9kdWN0S2V5LFxuICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbl9rZXksXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbk5hbWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChmaWx0ZXJlZFBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUGVybWlzc2lvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vIHZhbGlkIHBlcm1pc3Npb24gd2FzIGRldGVjdGVkIGZvciB0aGlzIHVzZXJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VyIG5vdCBsb2dnZWQtaW5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzQW55R3JhbnRlZFBlcm1pc3Npb24ocGFydHM6IHN0cmluZ1tdLCB1c2VyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBwYXJ0cy5zb21lKHBhcnQgPT4gdXNlclsnYXV0aCddPy5bJ2dyYW50ZWQnXVtwYXJ0XSk7XG4gICAgfVxuXG4gICAgaGFuZGxlUHJvZHVjdEtleShwcm9kdWN0S2V5LCB1c2VyLCBwZXJtaXNzaW9uX2tleSwgcGVybWlzc2lvbk5hbWUpIHtcbiAgICAgICAgaWYgKHByb2R1Y3RLZXkpIHtcbiAgICAgICAgICAgIC8vIGZpbHRlcnMgdGhlIHBlcm1pc3Npb24gb25seSBmb3IgdGhlIHNlbGVjdGVkIHByb2R1Y3QuXG4gICAgICAgICAgICBsZXQgZmlsdGVyZWRQZXJtaXNzaW9ucyA9IHBpY2tCeShjbG9uZURlZXAodXNlclsnYXV0aCddWydncmFudGVkJ10pLCAoX3ZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmluY2x1ZGVzKHByb2R1Y3RLZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBhZGQgUGFnZXMuUHJvZHVjdC57cGVybWlzc2lvbl9rZXl9XG4gICAgICAgICAgICBmaWx0ZXJlZFBlcm1pc3Npb25zID0ge1xuICAgICAgICAgICAgICAgIC4uLnsgW2BQYWdlcy5Qcm9kdWN0LiR7cGVybWlzc2lvbl9rZXl9YF06IHRydWUgfSxcbiAgICAgICAgICAgICAgICAuLi5maWx0ZXJlZFBlcm1pc3Npb25zXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBFLmcuLCBQYWdlcy5Qcm9kdWN0LkNsb3VkT2xpdmUuQ2xvdWRPbGl2ZV9Nc3BLZXlcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFBlcm1pc3Npb25zW3Blcm1pc3Npb25OYW1lXSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Rm9ybWF0dGVkUGVybWlzc2lvbk5hbWUocGVybWlzc2lvbk5hbWU6IHN0cmluZywgcHJvZHVjdFNsdWc6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3QgPSBQZXJtaXNzaW9uU2VydmljZT8uc2VsZWN0ZWRQcm9kdWN0ID8/IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHNlbGVjdGVkUHJvZHVjdD8uc3Vic2NyaXB0aW9uX3NsdWc7XG5cbiAgICAgICAgbGV0IHNsdWdUb0NoZWNrOiBzdHJpbmc7XG4gICAgICAgIGlmICghcHJvZHVjdFNsdWcpIHtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUHJvZHVjdC4nKSkge1xuICAgICAgICAgICAgICAgIHNsdWdUb0NoZWNrID0gYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS5gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbk5hbWUuaW5jbHVkZXMoJ1BhZ2VzLlJvbGUuJykpIHtcbiAgICAgICAgICAgICAgICBzbHVnVG9DaGVjayA9IGBQYWdlcy5Sb2xlLiR7c3Vic2NyaXB0aW9uU2x1Z30uYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNsdWdUb0NoZWNrID0gcHJvZHVjdFNsdWc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBlcm1pc3Npb25OYW1lLmluY2x1ZGVzKHNsdWdUb0NoZWNrKSAmJiBwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUHJvZHVjdC4nKSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbk5hbWUgPSBwZXJtaXNzaW9uTmFtZS5yZXBsYWNlKCdQYWdlcy5Qcm9kdWN0LicsIHNsdWdUb0NoZWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUm9sZS4nKSAmJiAhcGVybWlzc2lvbk5hbWUuaW5jbHVkZXMoc2x1Z1RvQ2hlY2spKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9uTmFtZSA9IHBlcm1pc3Npb25OYW1lLnJlcGxhY2UoJ1BhZ2VzLlJvbGUuJywgc2x1Z1RvQ2hlY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25OYW1lO1xuICAgIH1cblxuICAgIGdldFBlcm1pc3Npb25UcmVlRGF0YUJ5Um9sZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gW107XG4gICAgICAgIGRhdGEuYWxsLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCwgLy8gcGVybWlzc2lvbklkOiBVc2VkIHRvIHVwZGF0ZSB0aGUgcGVybWlzc2lvbnMgb24gY2hhbmdlXG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZTogbmFtZS5pbmNsdWRlcygnLicpID8gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZignLicpKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogZWxlbWVudC5uYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgZ3JhbnRlZFBlcm1pc3Npb25OYW1lczogT2JqZWN0LmtleXMoZGF0YS5ncmFudGVkKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGV2YWx1YXRlUGVybWlzc2lvbnMoXG4gICAgICAgIHBlcm1pc3Npb246IHN0cmluZyxcbiAgICAgICAgcHJvZHVjdEtleTogc3RyaW5nID0gbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbl9rZXk6IHN0cmluZyA9IG51bGwsXG4gICAgICAgIHByb2R1Y3RTbHVnOiBzdHJpbmcgPSBudWxsXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghcGVybWlzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4cHIgPSAnJztcblxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdXBlckFkbWluKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1N1cGVyQWRtaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdWJzY3JpcHRpb25BZG1pbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb24gPT09IFBFUk1JU1NJT05fTkFNRVMuU3Vic2NyaXB0aW9uT3duZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb24gPT09IFBFUk1JU1NJT05fTkFNRVMuU3Vic2NyaXB0aW9uU3VwZXJBZG1pbikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4oKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uU3VwZXJPd25lcigpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5pc1N1cGVyQWRtaW4oKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdWJzY3JpcHRpb25TdXBlck93bmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1VzZXJTdWJzY3JpcHRpb25TdXBlck93bmVyKCkgfHwgdGhpcy5pc1N1cGVyQWRtaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgcGVybWlzc2lvbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIEFETUlOX1NVQl9NRU5VX1dISVRFTElTVC5zb21lKHYgPT4gcGVybWlzc2lvbi5pbmNsdWRlcyh2KSkgJiZcbiAgICAgICAgICAgICh0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyT3duZXIoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHIgPSB0aGlzLmhhbmRsZU5vbkJvb2xlYW5QZXJtaXNzaW9ucyhcbiAgICAgICAgICAgIHBlcm1pc3Npb24sXG4gICAgICAgICAgICBleHByLFxuICAgICAgICAgICAgcHJvZHVjdEtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25fa2V5LFxuICAgICAgICAgICAgcHJvZHVjdFNsdWdcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBOb3cgZXhwciBpcyBtYWRlIG9mIHRydWUvZmFsc2UgdmFsdWVzIHdpdGggJiYsIHx8LCAoKVxuICAgICAgICAvLyBTYWZlIGV2YWx1YXRpb24gb2YgYm9vbGVhbiBleHByZXNzaW9ucyB3aXRob3V0IHVzaW5nIGV2YWwoKVxuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZUJvb2xlYW5FeHByZXNzaW9uKGV4cHIpO1xuICAgIH1cblxuICAgIGhhbmRsZU5vbkJvb2xlYW5QZXJtaXNzaW9ucyhwZXJtaXNzaW9uLCBleHByLCBwcm9kdWN0S2V5LCBwZXJtaXNzaW9uX2tleSwgcHJvZHVjdFNsdWcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwZXJtaXNzaW9uICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb24uc3BsaXQoJyAnKS5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHgudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFsnfHwnLCAnJiYnLCAnKCcsICcpJ10uaW5jbHVkZXMocmF3KSkge1xuICAgICAgICAgICAgICAgICAgICBleHByICs9IGAgJHtyYXd9IGA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV2YWx1YXRlZDogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1cGVyQWRtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvbkFkbWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvbk93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgPSB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvblN1cGVyQWRtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VzZXJTdWJzY3JpcHRpb25TdXBlckFkbWluKCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyT3duZXIoKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvblN1cGVyT3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uU3VwZXJPd25lcigpIHx8IHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZHVjdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGl0J3MgUGFnZXMuUHJvZHVjdCBvciBQYWdlcy5Sb2xlIHdpdGggcHJvZHVjdEtleVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5pc0dyYW50ZWQocmF3LCBwcm9kdWN0S2V5LCBwZXJtaXNzaW9uX2tleSwgcHJvZHVjdFNsdWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5pc0dyYW50ZWQocmF3KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGV4cHIgKz0gYCAke2V2YWx1YXRlZH0gYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICBnZXRQZXJtaXNzaW9uQnlSb2xlKHJvbGVJZDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5nZXQoYC9hZG1pbi9yb2xlX3Blcm1pc3Npb25zLyR7cm9sZUlkfWApO1xuICAgIH1cblxuICAgIHNhdmVVc2VyUGVybWlzc2lvbihwYXlsb2FkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5wb3N0KGAvYWRtaW4vcm9sZV9wZXJtaXNzaW9uc2AsIHBheWxvYWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRldGVybWluZSB1c2VyIGlzIHN1cGVyX2FkbWluIHVzaW5nIHVzZXIuYXV0aC5ncmFudGVkWydQYWdlcy5TdXBlckFkbWluJ11cbiAgICAgKi9cbiAgICBpc1N1cGVyQWRtaW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMudXNlci5hdXRoLmdyYW50ZWRbJ1BhZ2VzLlN1cGVyQWRtaW4nXSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQW55IFByb2R1Y3QgQWRtaW4gcmVnYXJkbGVzcyBvZiB0aGUgcHJvZHVjdCBiZWluZyBtYXN0ZXIgcHJvZHVjdCBvciBub3QuXG4gICAgICovXG4gICAgcHVibGljIGlzVXNlclN1YnNjcmlwdGlvbk93bmVyKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvbk93bmVyYFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFueSBQcm9kdWN0IEFkbWluIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb2R1Y3QgYmVpbmcgbWFzdGVyIHByb2R1Y3Qgb3Igbm90LlxuICAgICAqICpyYmFjQWxsb3c9XCJTdWJzY3JpcHRpb25BZG1pblwiXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4ocHJvZHVjdD8pOiBib29sZWFuIHtcbiAgICAgICAgcHJvZHVjdCA/Pz0gdGhpcy5nZXRDdXJyZW50UHJvZHVjdCgpO1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25TbHVnID0gcHJvZHVjdD8uc3Vic2NyaXB0aW9uX3NsdWc7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIXRoaXMudXNlci5hdXRoLmdyYW50ZWRbXG4gICAgICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvbkFkbWluYFxuICAgICAgICAgICAgXSB8fFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25Pd25lcmBcbiAgICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbnkgUHJvZHVjdCBBZG1pbiBvZiB0aGUgcHJvZHVjdCBiZWluZyB0aGUgbWFzdGVyIHByb2R1Y3RcbiAgICAgKi9cbiAgICBpc1VzZXJTdWJzY3JpcHRpb25TdXBlckFkbWluKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlckFkbWluYFxuICAgICAgICAgICAgXSB8fFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlck93bmVyYFxuICAgICAgICAgICAgXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlzVXNlck1hc3RlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4ocHJvZHVjdD8pOiBib29sZWFuIHtcbiAgICAgICAgcHJvZHVjdCA/Pz0gdGhpcy5nZXRDdXJyZW50UHJvZHVjdCgpO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlckFkbWluYFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFueSBQcm9kdWN0IEFkbWluIG9mIHRoZSBwcm9kdWN0IGJlaW5nIHRoZSBtYXN0ZXIgcHJvZHVjdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1VzZXJTdWJzY3JpcHRpb25TdXBlck93bmVyKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvblN1cGVyT3duZXJgXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudFByb2R1Y3QocHJvZHVjdCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICdwcm9kdWN0JyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBpZDogcHJvZHVjdC5pZCxcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uX2tleTogcHJvZHVjdD8ucGVybWlzc2lvbl9rZXksXG4gICAgICAgICAgICAgICAgZmVhdHVyZV9rZXk6IHByb2R1Y3QuZmVhdHVyZV9rZXksXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHByb2R1Y3Quc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uX3NsdWc6IHByb2R1Y3Quc3Vic2NyaXB0aW9uX3NsdWdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRQcm9kdWN0KCkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncHJvZHVjdCcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYWZlbHkgZXZhbHVhdGVzIGJvb2xlYW4gZXhwcmVzc2lvbnMgd2l0aG91dCB1c2luZyBldmFsKClcbiAgICAgKiBTdXBwb3J0czogdHJ1ZSwgZmFsc2UsICYmLCB8fCwgKCwgKVxuICAgICAqIEBwYXJhbSBleHByIC0gQm9vbGVhbiBleHByZXNzaW9uIHN0cmluZyBsaWtlIFwidHJ1ZSAmJiBmYWxzZSB8fCAodHJ1ZSAmJiBmYWxzZSlcIlxuICAgICAqIEByZXR1cm5zIGJvb2xlYW4gcmVzdWx0XG4gICAgICovXG4gICAgcHJpdmF0ZSBldmFsdWF0ZUJvb2xlYW5FeHByZXNzaW9uKGV4cHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWV4cHIgfHwgdHlwZW9mIGV4cHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGV4cHJlc3Npb24gLSByZW1vdmUgZXh0cmEgc3BhY2VzIGFuZCBub3JtYWxpemVcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuRXhwciA9IGV4cHIudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcblxuICAgICAgICAgICAgLy8gU2ltcGxlIHRva2VuaXplciBmb3IgYm9vbGVhbiBleHByZXNzaW9uc1xuICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZUJvb2xlYW5FeHByZXNzaW9uKGNsZWFuRXhwcik7XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIGFuZCBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCb29sZWFuRXhwcmVzc2lvbih0b2tlbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBldmFsdWF0aW5nIGJvb2xlYW4gZXhwcmVzc2lvbjonLCBleHByLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2tlbml6ZXMgYSBib29sZWFuIGV4cHJlc3Npb24gc3RyaW5nXG4gICAgICovXG4gICAgcHJpdmF0ZSB0b2tlbml6ZUJvb2xlYW5FeHByZXNzaW9uKGV4cHI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBleHByLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IGV4cHJbaV07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzV2hpdGVzcGFjZShjaGFyKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1BhcmVudGhlc2lzKGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goY2hhcik7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRG91YmxlT3BlcmF0b3IoZXhwciwgaSwgJyYnKSkge1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKCcmJicpO1xuICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0RvdWJsZU9wZXJhdG9yKGV4cHIsIGksICd8JykpIHtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCgnfHwnKTtcbiAgICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jb2xsZWN0VG9rZW4oZXhwciwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSA9IHRva2VuLm5leHRJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1doaXRlc3BhY2UoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjaGFyID09PSAnICc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BhcmVudGhlc2lzKGNoYXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY2hhciA9PT0gJygnIHx8IGNoYXIgPT09ICcpJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRG91YmxlT3BlcmF0b3IoZXhwcjogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBvcGVyYXRvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBleHByW2luZGV4XSA9PT0gb3BlcmF0b3IgJiYgZXhwcltpbmRleCArIDFdID09PSBvcGVyYXRvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbGxlY3RUb2tlbihleHByOiBzdHJpbmcsIHN0YXJ0SW5kZXg6IG51bWJlcik6IHsgdmFsdWU6IHN0cmluZzsgbmV4dEluZGV4OiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gJyc7XG4gICAgICAgIGxldCBpID0gc3RhcnRJbmRleDtcblxuICAgICAgICB3aGlsZSAoaSA8IGV4cHIubGVuZ3RoICYmICFbJyAnLCAnKCcsICcpJywgJyYnLCAnfCddLmluY2x1ZGVzKGV4cHJbaV0pKSB7XG4gICAgICAgICAgICBjdXJyZW50ICs9IGV4cHJbaV07XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB2YWx1ZTogY3VycmVudCwgbmV4dEluZGV4OiBpIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGFuZCBldmFsdWF0ZXMgYm9vbGVhbiBleHByZXNzaW9uIHRva2Vuc1xuICAgICAqL1xuICAgIHByaXZhdGUgcGFyc2VCb29sZWFuRXhwcmVzc2lvbih0b2tlbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIEhhbmRsZSBzaW1wbGUgY2FzZXMgZmlyc3RcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbnNbMF0gPT09ICd0cnVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgdG8gcG9zdGZpeCBub3RhdGlvbiBhbmQgZXZhbHVhdGVcbiAgICAgICAgY29uc3QgcG9zdGZpeCA9IHRoaXMuaW5maXhUb1Bvc3RmaXgodG9rZW5zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVQb3N0Zml4KHBvc3RmaXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGluZml4IG5vdGF0aW9uIHRvIHBvc3RmaXggKFJldmVyc2UgUG9saXNoIE5vdGF0aW9uKVxuICAgICAqL1xuICAgIHByaXZhdGUgaW5maXhUb1Bvc3RmaXgodG9rZW5zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBvcGVyYXRvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHByZWNlZGVuY2UgPSB7ICd8fCc6IDEsICcmJic6IDIgfTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSAndHJ1ZScgfHwgdG9rZW4gPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRvcnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnKScpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAob3BlcmF0b3JzLmxlbmd0aCA+IDAgJiYgb3BlcmF0b3JzW29wZXJhdG9ycy5sZW5ndGggLSAxXSAhPT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wID0gb3BlcmF0b3JzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3ApIG91dHB1dC5wdXNoKG9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3BlcmF0b3JzLnBvcCgpOyAvLyBSZW1vdmUgJygnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnJiYnIHx8IHRva2VuID09PSAnfHwnKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcnNbb3BlcmF0b3JzLmxlbmd0aCAtIDFdICE9PSAnKCcgJiZcbiAgICAgICAgICAgICAgICAgICAgcHJlY2VkZW5jZVtvcGVyYXRvcnNbb3BlcmF0b3JzLmxlbmd0aCAtIDFdXSA+PSBwcmVjZWRlbmNlW3Rva2VuXVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcCA9IG9wZXJhdG9ycy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wKSBvdXRwdXQucHVzaChvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wZXJhdG9ycy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChvcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgb3AgPSBvcGVyYXRvcnMucG9wKCk7XG4gICAgICAgICAgICBpZiAob3ApIG91dHB1dC5wdXNoKG9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIHBvc3RmaXggYm9vbGVhbiBleHByZXNzaW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSBldmFsdWF0ZVBvc3RmaXgocG9zdGZpeDogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc3RhY2s6IGJvb2xlYW5bXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcG9zdGZpeCkge1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJyYmJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgaWYgKGEgIT09IHVuZGVmaW5lZCAmJiBiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhICYmIGIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd8fCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmIChhICE9PSB1bmRlZmluZWQgJiYgYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8fCBiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RhY2tbMF0gfHwgZmFsc2U7XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { Inject, Injectable } from '@angular/core';
|
|
3
|
+
import { BehaviorSubject, of } from 'rxjs';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Secure Token Storage Service
|
|
7
|
+
*
|
|
8
|
+
* This service provides secure token storage using memory + secure cookies.
|
|
9
|
+
* NO localStorage usage - tokens are stored only in memory and secure cookies.
|
|
10
|
+
*
|
|
11
|
+
* Security Features:
|
|
12
|
+
* - Memory storage (primary) - not persistent across refreshes
|
|
13
|
+
* - Secure cookies (backup) - with SameSite=Strict protection
|
|
14
|
+
* - No localStorage - prevents XSS token theft
|
|
15
|
+
* - Secure flag for HTTPS
|
|
16
|
+
* - CSRF protection via SameSite cookies
|
|
17
|
+
*/
|
|
18
|
+
export class SecureTokenStorageService {
|
|
19
|
+
constructor(document) {
|
|
20
|
+
this.document = document;
|
|
21
|
+
this.TOKEN_COOKIE_NAME = 'auth_token';
|
|
22
|
+
this.IMPERSONATED_TOKEN_COOKIE_NAME = 'user_impersonated_token';
|
|
23
|
+
this.PHONEGAP_TOKEN_COOKIE_NAME = 'user_impersonated_phonegap_token';
|
|
24
|
+
// In-memory fallback for development or when cookies are not available
|
|
25
|
+
this.memoryStorage = new Map();
|
|
26
|
+
this.tokenSubject = new BehaviorSubject(null);
|
|
27
|
+
this.impersonatedTokenSubject = new BehaviorSubject(null);
|
|
28
|
+
this.phonegapTokenSubject = new BehaviorSubject(null);
|
|
29
|
+
this.initializeTokens();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Store authentication token securely
|
|
33
|
+
*/
|
|
34
|
+
storeToken(token) {
|
|
35
|
+
try {
|
|
36
|
+
// Store ONLY in memory and secure cookie - NO localStorage
|
|
37
|
+
this.memoryStorage.set(this.TOKEN_COOKIE_NAME, token);
|
|
38
|
+
this.setSecureCookie(this.TOKEN_COOKIE_NAME, token);
|
|
39
|
+
this.tokenSubject.next(token);
|
|
40
|
+
return of(true);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.warn('Failed to store token, using memory fallback:', error);
|
|
44
|
+
this.memoryStorage.set(this.TOKEN_COOKIE_NAME, token);
|
|
45
|
+
this.tokenSubject.next(token);
|
|
46
|
+
return of(true);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Store impersonated user token
|
|
51
|
+
*/
|
|
52
|
+
storeImpersonatedToken(token) {
|
|
53
|
+
try {
|
|
54
|
+
// Store ONLY in memory and secure cookie - NO localStorage
|
|
55
|
+
this.memoryStorage.set(this.IMPERSONATED_TOKEN_COOKIE_NAME, token);
|
|
56
|
+
this.setSecureCookie(this.IMPERSONATED_TOKEN_COOKIE_NAME, token);
|
|
57
|
+
this.impersonatedTokenSubject.next(token);
|
|
58
|
+
return of(true);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.warn('Failed to store impersonated token, using memory fallback:', error);
|
|
62
|
+
this.memoryStorage.set(this.IMPERSONATED_TOKEN_COOKIE_NAME, token);
|
|
63
|
+
this.impersonatedTokenSubject.next(token);
|
|
64
|
+
return of(true);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Store phonegap impersonated token
|
|
69
|
+
*/
|
|
70
|
+
storePhonegapToken(token) {
|
|
71
|
+
try {
|
|
72
|
+
// Store ONLY in memory and secure cookie - NO localStorage
|
|
73
|
+
this.memoryStorage.set(this.PHONEGAP_TOKEN_COOKIE_NAME, token);
|
|
74
|
+
this.setSecureCookie(this.PHONEGAP_TOKEN_COOKIE_NAME, token);
|
|
75
|
+
this.phonegapTokenSubject.next(token);
|
|
76
|
+
return of(true);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.warn('Failed to store phonegap token, using memory fallback:', error);
|
|
80
|
+
this.memoryStorage.set(this.PHONEGAP_TOKEN_COOKIE_NAME, token);
|
|
81
|
+
this.phonegapTokenSubject.next(token);
|
|
82
|
+
return of(true);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get authentication token
|
|
87
|
+
*/
|
|
88
|
+
getToken() {
|
|
89
|
+
// Try memory storage first (primary storage)
|
|
90
|
+
const memoryToken = this.memoryStorage.get(this.TOKEN_COOKIE_NAME);
|
|
91
|
+
if (memoryToken) {
|
|
92
|
+
return memoryToken;
|
|
93
|
+
}
|
|
94
|
+
// Try cookie as backup
|
|
95
|
+
const cookieToken = this.getCookieValue(this.TOKEN_COOKIE_NAME);
|
|
96
|
+
if (cookieToken) {
|
|
97
|
+
// Restore to memory storage
|
|
98
|
+
this.memoryStorage.set(this.TOKEN_COOKIE_NAME, cookieToken);
|
|
99
|
+
return cookieToken;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get impersonated token
|
|
105
|
+
*/
|
|
106
|
+
getImpersonatedToken() {
|
|
107
|
+
const memoryToken = this.memoryStorage.get(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
108
|
+
if (memoryToken) {
|
|
109
|
+
return memoryToken;
|
|
110
|
+
}
|
|
111
|
+
const cookieToken = this.getCookieValue(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
112
|
+
if (cookieToken) {
|
|
113
|
+
this.memoryStorage.set(this.IMPERSONATED_TOKEN_COOKIE_NAME, cookieToken);
|
|
114
|
+
return cookieToken;
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get phonegap token
|
|
120
|
+
*/
|
|
121
|
+
getPhonegapToken() {
|
|
122
|
+
const memoryToken = this.memoryStorage.get(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
123
|
+
if (memoryToken) {
|
|
124
|
+
return memoryToken;
|
|
125
|
+
}
|
|
126
|
+
const cookieToken = this.getCookieValue(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
127
|
+
if (cookieToken) {
|
|
128
|
+
this.memoryStorage.set(this.PHONEGAP_TOKEN_COOKIE_NAME, cookieToken);
|
|
129
|
+
return cookieToken;
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get token as Observable
|
|
135
|
+
*/
|
|
136
|
+
getToken$() {
|
|
137
|
+
return this.tokenSubject.asObservable();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get impersonated token as Observable
|
|
141
|
+
*/
|
|
142
|
+
getImpersonatedToken$() {
|
|
143
|
+
return this.impersonatedTokenSubject.asObservable();
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get phonegap token as Observable
|
|
147
|
+
*/
|
|
148
|
+
getPhonegapToken$() {
|
|
149
|
+
return this.phonegapTokenSubject.asObservable();
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Remove all tokens
|
|
153
|
+
*/
|
|
154
|
+
clearTokens() {
|
|
155
|
+
try {
|
|
156
|
+
// Clear cookies
|
|
157
|
+
this.deleteCookie(this.TOKEN_COOKIE_NAME);
|
|
158
|
+
this.deleteCookie(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
159
|
+
this.deleteCookie(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.warn('Failed to clear cookies:', error);
|
|
163
|
+
}
|
|
164
|
+
// Clear memory storage
|
|
165
|
+
this.memoryStorage.delete(this.TOKEN_COOKIE_NAME);
|
|
166
|
+
this.memoryStorage.delete(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
167
|
+
this.memoryStorage.delete(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
168
|
+
// Update subjects
|
|
169
|
+
this.tokenSubject.next(null);
|
|
170
|
+
this.impersonatedTokenSubject.next(null);
|
|
171
|
+
this.phonegapTokenSubject.next(null);
|
|
172
|
+
return of(true);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Remove specific token
|
|
176
|
+
*/
|
|
177
|
+
removeToken() {
|
|
178
|
+
try {
|
|
179
|
+
this.deleteCookie(this.TOKEN_COOKIE_NAME);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.warn('Failed to remove token:', error);
|
|
183
|
+
}
|
|
184
|
+
this.memoryStorage.delete(this.TOKEN_COOKIE_NAME);
|
|
185
|
+
this.tokenSubject.next(null);
|
|
186
|
+
return of(true);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Remove impersonated tokens
|
|
190
|
+
*/
|
|
191
|
+
removeImpersonatedTokens() {
|
|
192
|
+
try {
|
|
193
|
+
this.deleteCookie(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
194
|
+
this.deleteCookie(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.warn('Failed to remove impersonated tokens:', error);
|
|
198
|
+
}
|
|
199
|
+
this.memoryStorage.delete(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
200
|
+
this.memoryStorage.delete(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
201
|
+
this.impersonatedTokenSubject.next(null);
|
|
202
|
+
this.phonegapTokenSubject.next(null);
|
|
203
|
+
return of(true);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Set secure cookie
|
|
207
|
+
* Note: HttpOnly cannot be set from client-side JavaScript
|
|
208
|
+
* For maximum security, backend should set httpOnly cookies
|
|
209
|
+
*/
|
|
210
|
+
setSecureCookie(name, value) {
|
|
211
|
+
const isSecure = this.document.location.protocol === 'https:';
|
|
212
|
+
// Set cookie with maximum security possible from client-side
|
|
213
|
+
const cookieString = `${name}=${value}; Path=/; ${isSecure ? 'Secure; ' : ''}SameSite=Strict; Max-Age=86400`;
|
|
214
|
+
this.document.cookie = cookieString;
|
|
215
|
+
// Log warning about security limitations
|
|
216
|
+
console.warn('⚠️ SECURITY WARNING: Cookie is not httpOnly. For maximum security, backend should set httpOnly cookies.');
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get cookie value
|
|
220
|
+
*/
|
|
221
|
+
getCookieValue(name) {
|
|
222
|
+
const value = `; ${this.document.cookie}`;
|
|
223
|
+
const parts = value.split(`; ${name}=`);
|
|
224
|
+
if (parts.length === 2) {
|
|
225
|
+
return parts.pop()?.split(';').shift() || null;
|
|
226
|
+
}
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Delete cookie
|
|
231
|
+
*/
|
|
232
|
+
deleteCookie(name) {
|
|
233
|
+
this.document.cookie = `${name}=; Path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Initialize tokens from storage on service startup
|
|
237
|
+
*/
|
|
238
|
+
initializeTokens() {
|
|
239
|
+
const token = this.getToken();
|
|
240
|
+
const impersonatedToken = this.getImpersonatedToken();
|
|
241
|
+
const phonegapToken = this.getPhonegapToken();
|
|
242
|
+
if (token) {
|
|
243
|
+
this.tokenSubject.next(token);
|
|
244
|
+
}
|
|
245
|
+
if (impersonatedToken) {
|
|
246
|
+
this.impersonatedTokenSubject.next(impersonatedToken);
|
|
247
|
+
}
|
|
248
|
+
if (phonegapToken) {
|
|
249
|
+
this.phonegapTokenSubject.next(phonegapToken);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SecureTokenStorageService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
253
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SecureTokenStorageService, providedIn: 'root' }); }
|
|
254
|
+
}
|
|
255
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SecureTokenStorageService, decorators: [{
|
|
256
|
+
type: Injectable,
|
|
257
|
+
args: [{
|
|
258
|
+
providedIn: 'root'
|
|
259
|
+
}]
|
|
260
|
+
}], ctorParameters: () => [{ type: Document, decorators: [{
|
|
261
|
+
type: Inject,
|
|
262
|
+
args: [DOCUMENT]
|
|
263
|
+
}] }] });
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlLXRva2VuLXN0b3JhZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uLXNlcnZpY2VzL3NyYy9saWIvc2VjdXJlLXRva2VuLXN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBRXZEOzs7Ozs7Ozs7Ozs7R0FZRztBQUlILE1BQU0sT0FBTyx5QkFBeUI7SUFXbEMsWUFBK0MsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQVZoRCxzQkFBaUIsR0FBRyxZQUFZLENBQUM7UUFDakMsbUNBQThCLEdBQUcseUJBQXlCLENBQUM7UUFDM0QsK0JBQTBCLEdBQUcsa0NBQWtDLENBQUM7UUFFakYsdUVBQXVFO1FBQ3RELGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDMUMsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDeEQsNkJBQXdCLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3BFLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsQ0FBQztRQUc3RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsS0FBYTtRQUNwQixJQUFJLENBQUM7WUFDRCwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxlQUFlLENB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RyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU5QyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQzsrR0FyUVEseUJBQXlCLGtCQVdkLFFBQVE7bUhBWG5CLHlCQUF5QixjQUZ0QixNQUFNOzs0RkFFVCx5QkFBeUI7a0JBSHJDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFZZ0IsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBTZWN1cmUgVG9rZW4gU3RvcmFnZSBTZXJ2aWNlXG4gKlxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzIHNlY3VyZSB0b2tlbiBzdG9yYWdlIHVzaW5nIG1lbW9yeSArIHNlY3VyZSBjb29raWVzLlxuICogTk8gbG9jYWxTdG9yYWdlIHVzYWdlIC0gdG9rZW5zIGFyZSBzdG9yZWQgb25seSBpbiBtZW1vcnkgYW5kIHNlY3VyZSBjb29raWVzLlxuICpcbiAqIFNlY3VyaXR5IEZlYXR1cmVzOlxuICogLSBNZW1vcnkgc3RvcmFnZSAocHJpbWFyeSkgLSBub3QgcGVyc2lzdGVudCBhY3Jvc3MgcmVmcmVzaGVzXG4gKiAtIFNlY3VyZSBjb29raWVzIChiYWNrdXApIC0gd2l0aCBTYW1lU2l0ZT1TdHJpY3QgcHJvdGVjdGlvblxuICogLSBObyBsb2NhbFN0b3JhZ2UgLSBwcmV2ZW50cyBYU1MgdG9rZW4gdGhlZnRcbiAqIC0gU2VjdXJlIGZsYWcgZm9yIEhUVFBTXG4gKiAtIENTUkYgcHJvdGVjdGlvbiB2aWEgU2FtZVNpdGUgY29va2llc1xuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlY3VyZVRva2VuU3RvcmFnZVNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVE9LRU5fQ09PS0lFX05BTUUgPSAnYXV0aF90b2tlbic7XG4gICAgcHJpdmF0ZSByZWFkb25seSBJTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUgPSAndXNlcl9pbXBlcnNvbmF0ZWRfdG9rZW4nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgUEhPTkVHQVBfVE9LRU5fQ09PS0lFX05BTUUgPSAndXNlcl9pbXBlcnNvbmF0ZWRfcGhvbmVnYXBfdG9rZW4nO1xuXG4gICAgLy8gSW4tbWVtb3J5IGZhbGxiYWNrIGZvciBkZXZlbG9wbWVudCBvciB3aGVuIGNvb2tpZXMgYXJlIG5vdCBhdmFpbGFibGVcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeVN0b3JhZ2UgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGltcGVyc29uYXRlZFRva2VuU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwaG9uZWdhcFRva2VuU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVUb2tlbnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBhdXRoZW50aWNhdGlvbiB0b2tlbiBzZWN1cmVseVxuICAgICAqL1xuICAgIHN0b3JlVG9rZW4odG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU3RvcmUgT05MWSBpbiBtZW1vcnkgYW5kIHNlY3VyZSBjb29raWUgLSBOTyBsb2NhbFN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZS5zZXQodGhpcy5UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWN1cmVDb29raWUodGhpcy5UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuXG4gICAgICAgICAgICB0aGlzLnRva2VuU3ViamVjdC5uZXh0KHRva2VuKTtcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHN0b3JlIHRva2VuLCB1c2luZyBtZW1vcnkgZmFsbGJhY2s6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLnNldCh0aGlzLlRPS0VOX0NPT0tJRV9OQU1FLCB0b2tlbik7XG4gICAgICAgICAgICB0aGlzLnRva2VuU3ViamVjdC5uZXh0KHRva2VuKTtcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3JlIGltcGVyc29uYXRlZCB1c2VyIHRva2VuXG4gICAgICovXG4gICAgc3RvcmVJbXBlcnNvbmF0ZWRUb2tlbih0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBTdG9yZSBPTkxZIGluIG1lbW9yeSBhbmQgc2VjdXJlIGNvb2tpZSAtIE5PIGxvY2FsU3RvcmFnZVxuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLnNldCh0aGlzLklNUEVSU09OQVRFRF9UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWN1cmVDb29raWUodGhpcy5JTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUsIHRva2VuKTtcbiAgICAgICAgICAgIHRoaXMuaW1wZXJzb25hdGVkVG9rZW5TdWJqZWN0Lm5leHQodG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc3RvcmUgaW1wZXJzb25hdGVkIHRva2VuLCB1c2luZyBtZW1vcnkgZmFsbGJhY2s6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLnNldCh0aGlzLklNUEVSU09OQVRFRF9UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5pbXBlcnNvbmF0ZWRUb2tlblN1YmplY3QubmV4dCh0b2tlbik7XG4gICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBwaG9uZWdhcCBpbXBlcnNvbmF0ZWQgdG9rZW5cbiAgICAgKi9cbiAgICBzdG9yZVBob25lZ2FwVG9rZW4odG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU3RvcmUgT05MWSBpbiBtZW1vcnkgYW5kIHNlY3VyZSBjb29raWUgLSBOTyBsb2NhbFN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZS5zZXQodGhpcy5QSE9ORUdBUF9UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWN1cmVDb29raWUodGhpcy5QSE9ORUdBUF9UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5waG9uZWdhcFRva2VuU3ViamVjdC5uZXh0KHRva2VuKTtcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHN0b3JlIHBob25lZ2FwIHRva2VuLCB1c2luZyBtZW1vcnkgZmFsbGJhY2s6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLnNldCh0aGlzLlBIT05FR0FQX1RPS0VOX0NPT0tJRV9OQU1FLCB0b2tlbik7XG4gICAgICAgICAgICB0aGlzLnBob25lZ2FwVG9rZW5TdWJqZWN0Lm5leHQodG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGF1dGhlbnRpY2F0aW9uIHRva2VuXG4gICAgICovXG4gICAgZ2V0VG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIFRyeSBtZW1vcnkgc3RvcmFnZSBmaXJzdCAocHJpbWFyeSBzdG9yYWdlKVxuICAgICAgICBjb25zdCBtZW1vcnlUb2tlbiA9IHRoaXMubWVtb3J5U3RvcmFnZS5nZXQodGhpcy5UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIGlmIChtZW1vcnlUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIG1lbW9yeVRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IGNvb2tpZSBhcyBiYWNrdXBcbiAgICAgICAgY29uc3QgY29va2llVG9rZW4gPSB0aGlzLmdldENvb2tpZVZhbHVlKHRoaXMuVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICBpZiAoY29va2llVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgdG8gbWVtb3J5IHN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZS5zZXQodGhpcy5UT0tFTl9DT09LSUVfTkFNRSwgY29va2llVG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIGNvb2tpZVRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGltcGVyc29uYXRlZCB0b2tlblxuICAgICAqL1xuICAgIGdldEltcGVyc29uYXRlZFRva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBtZW1vcnlUb2tlbiA9IHRoaXMubWVtb3J5U3RvcmFnZS5nZXQodGhpcy5JTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICBpZiAobWVtb3J5VG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBtZW1vcnlUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvb2tpZVRva2VuID0gdGhpcy5nZXRDb29raWVWYWx1ZSh0aGlzLklNUEVSU09OQVRFRF9UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIGlmIChjb29raWVUb2tlbikge1xuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLnNldCh0aGlzLklNUEVSU09OQVRFRF9UT0tFTl9DT09LSUVfTkFNRSwgY29va2llVG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIGNvb2tpZVRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHBob25lZ2FwIHRva2VuXG4gICAgICovXG4gICAgZ2V0UGhvbmVnYXBUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgbWVtb3J5VG9rZW4gPSB0aGlzLm1lbW9yeVN0b3JhZ2UuZ2V0KHRoaXMuUEhPTkVHQVBfVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICBpZiAobWVtb3J5VG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBtZW1vcnlUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvb2tpZVRva2VuID0gdGhpcy5nZXRDb29raWVWYWx1ZSh0aGlzLlBIT05FR0FQX1RPS0VOX0NPT0tJRV9OQU1FKTtcbiAgICAgICAgaWYgKGNvb2tpZVRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLm1lbW9yeVN0b3JhZ2Uuc2V0KHRoaXMuUEhPTkVHQVBfVE9LRU5fQ09PS0lFX05BTUUsIGNvb2tpZVRva2VuKTtcbiAgICAgICAgICAgIHJldHVybiBjb29raWVUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0b2tlbiBhcyBPYnNlcnZhYmxlXG4gICAgICovXG4gICAgZ2V0VG9rZW4kKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGltcGVyc29uYXRlZCB0b2tlbiBhcyBPYnNlcnZhYmxlXG4gICAgICovXG4gICAgZ2V0SW1wZXJzb25hdGVkVG9rZW4kKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBlcnNvbmF0ZWRUb2tlblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHBob25lZ2FwIHRva2VuIGFzIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBnZXRQaG9uZWdhcFRva2VuJCgpOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGhvbmVnYXBUb2tlblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCB0b2tlbnNcbiAgICAgKi9cbiAgICBjbGVhclRva2VucygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIENsZWFyIGNvb2tpZXNcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlQ29va2llKHRoaXMuVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDb29raWUodGhpcy5JTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDb29raWUodGhpcy5QSE9ORUdBUF9UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBjbGVhciBjb29raWVzOicsIGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIG1lbW9yeSBzdG9yYWdlXG4gICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZS5kZWxldGUodGhpcy5UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZS5kZWxldGUodGhpcy5JTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICB0aGlzLm1lbW9yeVN0b3JhZ2UuZGVsZXRlKHRoaXMuUEhPTkVHQVBfVE9LRU5fQ09PS0lFX05BTUUpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdWJqZWN0c1xuICAgICAgICB0aGlzLnRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLmltcGVyc29uYXRlZFRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLnBob25lZ2FwVG9rZW5TdWJqZWN0Lm5leHQobnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBzcGVjaWZpYyB0b2tlblxuICAgICAqL1xuICAgIHJlbW92ZVRva2VuKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDb29raWUodGhpcy5UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZW1vdmUgdG9rZW46JywgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLmRlbGV0ZSh0aGlzLlRPS0VOX0NPT0tJRV9OQU1FKTtcbiAgICAgICAgdGhpcy50b2tlblN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBpbXBlcnNvbmF0ZWQgdG9rZW5zXG4gICAgICovXG4gICAgcmVtb3ZlSW1wZXJzb25hdGVkVG9rZW5zKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDb29raWUodGhpcy5JTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDb29raWUodGhpcy5QSE9ORUdBUF9UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZW1vdmUgaW1wZXJzb25hdGVkIHRva2VuczonLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lbW9yeVN0b3JhZ2UuZGVsZXRlKHRoaXMuSU1QRVJTT05BVEVEX1RPS0VOX0NPT0tJRV9OQU1FKTtcbiAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLmRlbGV0ZSh0aGlzLlBIT05FR0FQX1RPS0VOX0NPT0tJRV9OQU1FKTtcbiAgICAgICAgdGhpcy5pbXBlcnNvbmF0ZWRUb2tlblN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5waG9uZWdhcFRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHNlY3VyZSBjb29raWVcbiAgICAgKiBOb3RlOiBIdHRwT25seSBjYW5ub3QgYmUgc2V0IGZyb20gY2xpZW50LXNpZGUgSmF2YVNjcmlwdFxuICAgICAqIEZvciBtYXhpbXVtIHNlY3VyaXR5LCBiYWNrZW5kIHNob3VsZCBzZXQgaHR0cE9ubHkgY29va2llc1xuICAgICAqL1xuICAgIHByaXZhdGUgc2V0U2VjdXJlQ29va2llKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc1NlY3VyZSA9IHRoaXMuZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonO1xuXG4gICAgICAgIC8vIFNldCBjb29raWUgd2l0aCBtYXhpbXVtIHNlY3VyaXR5IHBvc3NpYmxlIGZyb20gY2xpZW50LXNpZGVcbiAgICAgICAgY29uc3QgY29va2llU3RyaW5nID0gYCR7bmFtZX09JHt2YWx1ZX07IFBhdGg9LzsgJHtpc1NlY3VyZSA/ICdTZWN1cmU7ICcgOiAnJ31TYW1lU2l0ZT1TdHJpY3Q7IE1heC1BZ2U9ODY0MDBgO1xuICAgICAgICB0aGlzLmRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZVN0cmluZztcblxuICAgICAgICAvLyBMb2cgd2FybmluZyBhYm91dCBzZWN1cml0eSBsaW1pdGF0aW9uc1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAn4pqg77iPIFNFQ1VSSVRZIFdBUk5JTkc6IENvb2tpZSBpcyBub3QgaHR0cE9ubHkuIEZvciBtYXhpbXVtIHNlY3VyaXR5LCBiYWNrZW5kIHNob3VsZCBzZXQgaHR0cE9ubHkgY29va2llcy4nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvb2tpZSB2YWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Q29va2llVmFsdWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYDsgJHt0aGlzLmRvY3VtZW50LmNvb2tpZX1gO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KGA7ICR7bmFtZX09YCk7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0cy5wb3AoKT8uc3BsaXQoJzsnKS5zaGlmdCgpIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGNvb2tpZVxuICAgICAqL1xuICAgIHByaXZhdGUgZGVsZXRlQ29va2llKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PTsgUGF0aD0vOyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDEgR01UO2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0b2tlbnMgZnJvbSBzdG9yYWdlIG9uIHNlcnZpY2Ugc3RhcnR1cFxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVRva2VucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgIGNvbnN0IGltcGVyc29uYXRlZFRva2VuID0gdGhpcy5nZXRJbXBlcnNvbmF0ZWRUb2tlbigpO1xuICAgICAgICBjb25zdCBwaG9uZWdhcFRva2VuID0gdGhpcy5nZXRQaG9uZWdhcFRva2VuKCk7XG5cbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLnRva2VuU3ViamVjdC5uZXh0KHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW1wZXJzb25hdGVkVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaW1wZXJzb25hdGVkVG9rZW5TdWJqZWN0Lm5leHQoaW1wZXJzb25hdGVkVG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwaG9uZWdhcFRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLnBob25lZ2FwVG9rZW5TdWJqZWN0Lm5leHQocGhvbmVnYXBUb2tlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|