@decaf-ts/decorator-validation 1.7.10 → 1.7.12
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/dist/decorator-validation.cjs +54 -14
- package/dist/decorator-validation.esm.cjs +54 -15
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/model/validation.d.ts +3 -1
- package/lib/esm/model/validation.js +47 -10
- package/lib/esm/validation/decorators.d.ts +1 -1
- package/lib/esm/validation/decorators.js +6 -4
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/model/validation.cjs +48 -10
- package/lib/model/validation.d.ts +3 -1
- package/lib/validation/decorators.cjs +6 -4
- package/lib/validation/decorators.d.ts +1 -1
- package/package.json +1 -1
package/lib/esm/index.d.ts
CHANGED
package/lib/esm/index.js
CHANGED
|
@@ -16,5 +16,5 @@ export * from "./model/index.js";
|
|
|
16
16
|
* @const VERSION
|
|
17
17
|
* @memberOf module:decorator-validation
|
|
18
18
|
*/
|
|
19
|
-
export const VERSION = "1.7.
|
|
19
|
+
export const VERSION = "1.7.12";
|
|
20
20
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gscUNBQTRCO0FBQzVCLGlDQUF3QjtBQUN4QixpQ0FBd0I7QUFDeEIsc0NBQTZCO0FBQzdCLGlDQUF3QjtBQUV4Qjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBUeXBlU2NyaXB0IGRlY29yYXRvci1iYXNlZCB2YWxpZGF0aW9uIGxpYnJhcnlcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIGZyYW1ld29yayB1c2luZyBUeXBlU2NyaXB0IGRlY29yYXRvcnMuXG4gKiBJdCBleHBvc2VzIHV0aWxpdHkgZnVuY3Rpb25zLCB2YWxpZGF0aW9uIGRlY29yYXRvcnMsIGFuZCBtb2RlbC1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgZm9yXG4gKiBpbXBsZW1lbnRpbmcgdHlwZS1zYWZlLCBkZWNsYXJhdGl2ZSB2YWxpZGF0aW9uIGluIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSByZWZsZWN0aW9uIHBhY2thZ2VcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2VcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl19
|
|
@@ -34,6 +34,7 @@ export declare function getValidationDecorators(model: Record<string, any>, prop
|
|
|
34
34
|
* @function getValidatableProperties
|
|
35
35
|
*/
|
|
36
36
|
export declare function getValidatableProperties<M extends Model>(model: M, propsToIgnore: string[]): ValidationPropertyDecoratorDefinition[];
|
|
37
|
+
export declare function validateChildValue<M extends Model>(prop: string, childValue: any, parentModel: M, allowedTypes: string[], async: boolean): string | undefined | ModelErrorDefinition | Promise<string | undefined | ModelErrorDefinition>;
|
|
37
38
|
export declare function validateDecorator<M extends Model, Async extends boolean = false>(model: M, value: any, decorator: DecoratorMetadataAsync, async?: Async): ConditionalAsync<Async, string | undefined>;
|
|
38
39
|
/**
|
|
39
40
|
* @description
|
|
@@ -51,6 +52,7 @@ export declare function validateDecorator<M extends Model, Async extends boolean
|
|
|
51
52
|
* @template Async - A boolean indicating whether validation should be performed asynchronously.
|
|
52
53
|
*
|
|
53
54
|
* @param {M} model - The model instance that the validation is associated with.
|
|
55
|
+
* @param {string} prop - The model field name
|
|
54
56
|
* @param {any} value - The value to be validated against the provided decorators.
|
|
55
57
|
* @param {DecoratorMetadataAsync[]} decorators - An array of metadata objects representing validation decorators.
|
|
56
58
|
* @param {Async} [async] - Optional flag indicating whether validation should be performed asynchronously.
|
|
@@ -61,7 +63,7 @@ export declare function validateDecorator<M extends Model, Async extends boolean
|
|
|
61
63
|
*
|
|
62
64
|
* @function validateDecorators
|
|
63
65
|
*/
|
|
64
|
-
export declare function validateDecorators<M extends Model, Async extends boolean = false>(model: M, value: any, decorators: DecoratorMetadataAsync[], async?: Async): ConditionalAsync<Async, Record<string, string> | undefined>;
|
|
66
|
+
export declare function validateDecorators<M extends Model, Async extends boolean = false>(model: M, prop: string, value: any, decorators: DecoratorMetadataAsync[], async?: Async): ConditionalAsync<Async, Record<string, string> | undefined>;
|
|
65
67
|
/**
|
|
66
68
|
* @function validate
|
|
67
69
|
* @template M
|
|
@@ -85,6 +85,33 @@ function getNestedValidationErrors(nestedModel, parentModel, isAsync) {
|
|
|
85
85
|
cleanupTemporaryContext(nestedModel, ASYNC_META_KEY);
|
|
86
86
|
return errs;
|
|
87
87
|
}
|
|
88
|
+
export function validateChildValue(prop, childValue, parentModel, allowedTypes, async) {
|
|
89
|
+
let err = undefined;
|
|
90
|
+
let atLeastOneMatched = false;
|
|
91
|
+
for (const allowedType of allowedTypes) {
|
|
92
|
+
const Constr = Model.get(allowedType);
|
|
93
|
+
if (!Constr) {
|
|
94
|
+
err = new ModelErrorDefinition({
|
|
95
|
+
[prop]: {
|
|
96
|
+
[ValidationKeys.TYPE]: `Unable to verify type consistency, missing model registry for ${allowedType}`,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (childValue instanceof Constr) {
|
|
101
|
+
atLeastOneMatched = true;
|
|
102
|
+
err = getNestedValidationErrors(childValue, parentModel, async);
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (atLeastOneMatched)
|
|
107
|
+
return err;
|
|
108
|
+
return (err ||
|
|
109
|
+
new ModelErrorDefinition({
|
|
110
|
+
[prop]: {
|
|
111
|
+
[ValidationKeys.TYPE]: `Value must be an instance of one of the expected types: ${allowedTypes.join(", ")}`,
|
|
112
|
+
},
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
88
115
|
export function validateDecorator(model, value, decorator, async) {
|
|
89
116
|
const validator = Validation.get(decorator.key);
|
|
90
117
|
if (!validator) {
|
|
@@ -119,6 +146,7 @@ export function validateDecorator(model, value, decorator, async) {
|
|
|
119
146
|
* @template Async - A boolean indicating whether validation should be performed asynchronously.
|
|
120
147
|
*
|
|
121
148
|
* @param {M} model - The model instance that the validation is associated with.
|
|
149
|
+
* @param {string} prop - The model field name
|
|
122
150
|
* @param {any} value - The value to be validated against the provided decorators.
|
|
123
151
|
* @param {DecoratorMetadataAsync[]} decorators - An array of metadata objects representing validation decorators.
|
|
124
152
|
* @param {Async} [async] - Optional flag indicating whether validation should be performed asynchronously.
|
|
@@ -129,7 +157,7 @@ export function validateDecorator(model, value, decorator, async) {
|
|
|
129
157
|
*
|
|
130
158
|
* @function validateDecorators
|
|
131
159
|
*/
|
|
132
|
-
export function validateDecorators(model, value, decorators, async) {
|
|
160
|
+
export function validateDecorators(model, prop, value, decorators, async) {
|
|
133
161
|
const result = {};
|
|
134
162
|
for (const decorator of decorators) {
|
|
135
163
|
// skip async decorators if validateDecorators is called synchronously (async = false)
|
|
@@ -144,15 +172,16 @@ export function validateDecorators(model, value, decorators, async) {
|
|
|
144
172
|
if (decorator.key === ValidationKeys.LIST && (!validationErrors || async)) {
|
|
145
173
|
const values = value instanceof Set ? [...value] : value;
|
|
146
174
|
if (values && values.length > 0) {
|
|
147
|
-
const types = decorator.props.class ||
|
|
175
|
+
const types = (decorator.props.class ||
|
|
148
176
|
decorator.props.clazz ||
|
|
149
|
-
decorator.props.customTypes;
|
|
177
|
+
decorator.props.customTypes);
|
|
150
178
|
const allowedTypes = [types].flat().map((t) => String(t).toLowerCase());
|
|
151
179
|
// const reserved = Object.values(ReservedModels).map((v) => v.toLowerCase()) as string[];
|
|
152
180
|
const errs = values.map((childValue) => {
|
|
153
181
|
// if (Model.isModel(v) && !reserved.includes(v) {
|
|
154
182
|
if (Model.isModel(childValue)) {
|
|
155
|
-
return
|
|
183
|
+
return validateChildValue(prop, childValue, model, [types].flat(), !!async);
|
|
184
|
+
// return getNestedValidationErrors(childValue, model, async);
|
|
156
185
|
}
|
|
157
186
|
return allowedTypes.includes(typeof childValue)
|
|
158
187
|
? undefined
|
|
@@ -280,23 +309,31 @@ export function validate(model, async, ...propsToIgnore) {
|
|
|
280
309
|
}
|
|
281
310
|
propValue = propValue instanceof Set ? [...propValue] : propValue;
|
|
282
311
|
}
|
|
283
|
-
const propErrors = validateDecorators(model, propValue, decorators, async) || {};
|
|
312
|
+
const propErrors = validateDecorators(model, propKey, propValue, decorators, async) || {};
|
|
284
313
|
// Check for nested properties.
|
|
285
314
|
// To prevent unnecessary processing, "propValue" must be defined and validatable
|
|
286
315
|
// let nestedErrors: Record<string, any> = {};
|
|
287
316
|
const isConstr = Model.isPropertyModel(model, propKey);
|
|
288
|
-
|
|
289
|
-
if (
|
|
317
|
+
const hasPropValue = propValue !== null && propValue !== undefined;
|
|
318
|
+
if (isConstr && hasPropValue) {
|
|
290
319
|
const instance = propValue;
|
|
291
320
|
const isInvalidModel = typeof instance !== "object" ||
|
|
292
|
-
!instance.hasErrors ||
|
|
293
321
|
typeof instance.hasErrors !== "function";
|
|
294
322
|
if (isInvalidModel) {
|
|
295
323
|
// propErrors[ValidationKeys.TYPE] = "Model should be validatable but it's not.";
|
|
296
324
|
console.warn("Model should be validatable but it's not.");
|
|
297
325
|
}
|
|
298
326
|
else {
|
|
299
|
-
|
|
327
|
+
const Constr = Model.get(designType);
|
|
328
|
+
// Ensure instance is of the expected model class.
|
|
329
|
+
if (!Constr || !(instance instanceof Constr)) {
|
|
330
|
+
propErrors[ValidationKeys.TYPE] = !Constr
|
|
331
|
+
? `Unable to verify type consistency, missing model registry for ${designType} on prop ${propKey}`
|
|
332
|
+
: `Value must be an instance of ${Constr.name}`;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
nestedErrors[propKey] = getNestedValidationErrors(instance, model, async);
|
|
336
|
+
}
|
|
300
337
|
}
|
|
301
338
|
}
|
|
302
339
|
// Add to the result if we have any errors
|
|
@@ -351,4 +388,4 @@ export function validate(model, async, ...propsToIgnore) {
|
|
|
351
388
|
: undefined;
|
|
352
389
|
});
|
|
353
390
|
}
|
|
354
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbC92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQ0FBK0I7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQ0FBMkI7QUFDL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxtQkFBZ0I7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxzQ0FBaUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnREFBMkM7QUFNcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQ0FBMkI7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxnQ0FBcUI7QUFFckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBZ0I7QUFFL0M7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsS0FBMEIsRUFDMUIsSUFBWSxFQUNaLGFBQXFCLGNBQWMsQ0FBQyxPQUFPO0lBRTNDLE9BQU8sVUFBVSxDQUFDLHFCQUFxQixDQUNyQyxVQUFVLEVBQ1YsS0FBSyxFQUNMLElBQUksQ0FDK0MsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLE1BQU0sbUJBQW1CLEdBQTRDLEVBQUUsQ0FBQztJQUV4RSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQ0UsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7WUFDakQsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUM3QixDQUFDO1lBQ0QsTUFBTSxHQUFH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Szt3QkFDekIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTzt3QkFDcEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbkMsQ0FBQyxDQUFDLElBQUksb0JBQW9CLENBQUMsTUFBTSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQyxDQUFRLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIE1vZGVsRXJyb3JzLFxuICBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGF0aFByb3h5RW5naW5lIH0gZnJvbSBcIi4uL3V0aWxzL1BhdGhQcm94eVwiO1xuaW1wb3J0IHsgQVNZTkNfTUVUQV9LRVksIFZBTElEQVRJT05fUEFSRU5UX0tFWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbmRpdGlvbmFsQXN5bmMsIERlY29yYXRvck1ldGFkYXRhQXN5bmMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IHRvQ29uZGl0aW9uYWxQcm9taXNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbGlkYXRpb24gbWV0YWRhdGEgZGVjb3JhdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBwcm9wZXJ0eSBvZiBhIG1vZGVsLFxuICogdXNpbmcgdGhlIHJlZmxlY3RpdmUgbWV0YWRhdGEga2V5LlxuICpcbiAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjbGFzcyBjb250YWluaW5nIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBkZWNvcmF0b3JzIHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmbGVjdEtleSAtIFRoZSBtZXRhZGF0YSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGVjb3JhdG9ycy5cbiAqICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gYFZhbGlkYXRpb25LZXlzLlJFRkxFQ1RgLlxuICpcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIGRlY29yYXRvcnMgYXBwbGllZCB0byB0aGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkYXRpb25EZWNvcmF0b3JzKFxuICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJvcDogc3RyaW5nLFxuICByZWZsZWN0S2V5OiBzdHJpbmcgPSBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uIHtcbiAgcmV0dXJuIFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgIHJlZmxlY3RLZXksXG4gICAgbW9kZWwsXG4gICAgcHJvcFxuICApIGFzIHVua25vd24gYXMgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHJpZXZlcyBhbGwgdmFsaWRhdGFibGUgcHJvcGVydHkgZGVjb3JhdG9ycyBmcm9tIGEgZ2l2ZW4gbW9kZWwsIGV4Y2x1ZGluZyBzcGVjaWZpZWQgcHJvcGVydGllcy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhIG1vZGVsIGluc3RhbmNlLCBmaWx0ZXJpbmcgb3V0IGFueSBwcm9wZXJ0aWVzXG4gKiBsaXN0ZWQgaW4gdGhlIGBwcm9wc1RvSWdub3JlYCBhcnJheS4gRm9yIGVhY2ggcmVtYWluaW5nIHByb3BlcnR5LCBpdCBjaGVja3Mgd2hldGhlciB2YWxpZGF0aW9uXG4gKiBkZWNvcmF0b3JzIGFyZSBwcmVzZW50IHVzaW5nIGBnZXRWYWxpZGF0aW9uRGVjb3JhdG9yc2AsIGFuZCBpZiBzbywgY29sbGVjdHMgdGhlbSBpbiB0aGUgcmVzdWx0IGFycmF5LlxuICpcbiAqIEB0ZW1wbGF0ZSBNIC0gQSBnZW5lcmljIHBhcmFtZXRlciBleHRlbmRpbmcgdGhlIGBNb2RlbGAgY2xhc3MsIHJlcHJlc2VudGluZyB0aGUgbW9kZWwgdHlwZSBiZWluZyBpbnNwZWN0ZWQuXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIEFuIGluc3RhbmNlIG9mIGEgY2xhc3MgZXh0ZW5kaW5nIGBNb2RlbGAgZnJvbSB3aGljaCB2YWxpZGF0YWJsZSBwcm9wZXJ0aWVzIHdpbGwgYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHNUb0lnbm9yZSAtIEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdmFsaWRhdGlvbiBpbnNwZWN0aW9uLlxuICpcbiAqIEByZXR1cm4ge1ZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25bXX0gQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBkZWNvcmF0b3IgZGVmaW5pdGlvbnNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwncyBwcm9wZXJ0aWVzLCBleGNsdWRpbmcgdGhvc2UgbGlzdGVkIGluIGBwcm9wc1RvSWdub3JlYC5cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gbW9kZWwpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHByb3ApICYmXG4gICAgICAhcHJvcHNUb0lnbm9yZS5pbmNsdWRlcyhwcm9wKVxuICAgICkge1xuICAgICAgY29uc3QgZGVjID0gZ2V0VmFsaWRhdGlvbkRlY29yYXRvcnMobW9kZWwsIHByb3ApO1xuICAgICAgaWYgKGRlYykgZGVjb3JhdGVkUHJvcGVydGllcy5wdXNoKGRlYyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlY29yYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogU2FmZWx5IHNldHMgdGVtcG9yYXJ5IG1ldGFkYXRhIG9uIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBzZXRUZW1wb3JhcnlDb250ZXh0KFxuICB0YXJnZXQ6IGFueSxcbiAga2V5OiBzeW1ib2wgfCBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkpIHRhcmdldFtrZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogU2FmZWx5IHJlbW92ZXMgdGVtcG9yYXJ5IG1ldGFkYXRhIGZyb20gYW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KHRhcmdldDogYW55LCBrZXk6IHN5bWJvbCB8IHN0cmluZyk6IHZvaWQge1xuICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSBkZWxldGUgdGFyZ2V0W2tleV07XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdmFsaWRhdGlvbiB3aXRoIHRlbXBvcmFyeSBjb250ZXh0IGFuZCByZXR1cm5zIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICpcbiAqIEBwYXJhbSBuZXN0ZWRNb2RlbCAtIFRoZSBpbnN0YW5jZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHBhcmVudE1vZGVsIC0gUmVmZXJlbmNlIHRvIGEgcGFyZW50IG9iamVjdCBmb3IgbmVzdGVkIHZhbGlkYXRpb25cbiAqIEBwYXJhbSBpc0FzeW5jIC0gV2hldGhlciB0byBwZXJmb3JtIGFzeW5jIHZhbGlkYXRpb25cbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IGZyb20gaGFzRXJyb3JzKClcbiAqL1xuZnVuY3Rpb24gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG5lc3RlZE1vZGVsOiBNLFxuICBwYXJlbnRNb2RlbD86IE0sXG4gIGlzQXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgLy8gU2V0IHRlbXBvcmFyeSBjb250ZXh0IGZvciBuZXN0ZWQgbW9kZWxzXG4gIGlmIChwYXJlbnRNb2RlbCkge1xuICAgIHNldFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIFZBTElEQVRJT05fUEFSRU5UX0tFWSwgcGFyZW50TW9kZWwpO1xuICB9XG4gIHNldFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIEFTWU5DX01FVEFfS0VZLCAhIWlzQXN5bmMpO1xuXG4gIGNvbnN0IGVycnMgPSBuZXN0ZWRNb2RlbC5oYXNFcnJvcnMoKTtcbiAgY2xlYW51cFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIFZBTElEQVRJT05fUEFSRU5UX0tFWSk7XG4gIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBBU1lOQ19NRVRBX0tFWSk7XG4gIHJldHVybiBlcnJzIGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgbW9kZWw6IE0sXG4gIHZhbHVlOiBhbnksXG4gIGRlY29yYXRvcjogRGVjb3JhdG9yTWV0YWRhdGFBc3luYyxcbiAgYXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHZhbGlkYXRvciA9IFZhbGlkYXRpb24uZ2V0KGRlY29yYXRvci5rZXkpO1xuICBpZiAoIXZhbGlkYXRvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB2YWxpZGF0b3IgZm9yICR7ZGVjb3JhdG9yLmtleX1gKTtcbiAgfVxuXG4gIC8vIHNraXAgYXN5bmMgZGVjb3JhdG9ycyBpZiB2YWxpZGF0ZURlY29yYXRvcnMgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgKGFzeW5jID0gZmFsc2UpXG4gIGlmICghYXN5bmMgJiYgZGVjb3JhdG9yLnByb3BzLmFzeW5jKSByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcblxuICBjb25zdCBkZWNvcmF0b3JQcm9wcyA9XG4gICAgZGVjb3JhdG9yLmtleSA9PT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgID8gW2RlY29yYXRvci5wcm9wc11cbiAgICAgIDogZGVjb3JhdG9yLnByb3BzIHx8IHt9O1xuXG4gIGNvbnN0IGNvbnRleHQgPSBQYXRoUHJveHlFbmdpbmUuY3JlYXRlKG1vZGVsLCB7XG4gICAgaWdub3JlVW5kZWZpbmVkOiB0cnVlLFxuICAgIGlnbm9yZU51bGw6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IG1heWJlQXN5bmNFcnJvcnMgPSB2YWxpZGF0b3IuaGFzRXJyb3JzKFxuICAgIHZhbHVlLFxuICAgIGRlY29yYXRvclByb3BzIGFzIFZhbGlkYXRvck9wdGlvbnMsXG4gICAgY29udGV4dFxuICApO1xuXG4gIHJldHVybiB0b0NvbmRpdGlvbmFsUHJvbWlzZShtYXliZUFzeW5jRXJyb3JzLCBhc3luYyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeGVjdXRlcyB2YWxpZGF0aW9uIGxvZ2ljIGZvciBhIHNldCBvZiBkZWNvcmF0b3JzIGFwcGxpZWQgdG8gYSBtb2RlbCdzIHByb3BlcnR5LCBoYW5kbGluZyBib3RoXG4gKiBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHZhbGlkYXRpb25zLCBpbmNsdWRpbmcgc3VwcG9ydCBmb3IgbmVzdGVkIHZhbGlkYXRpb25zIGFuZCBsaXN0cy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgb3ZlciBhbiBhcnJheSBvZiBkZWNvcmF0b3IgbWV0YWRhdGEgb2JqZWN0cyBhbmQgYXBwbGllcyBlYWNoIHZhbGlkYXRpb24gcnVsZSB0byB0aGVcbiAqIHByb3ZpZGVkIHZhbHVlLiBGb3IgbGlzdCBkZWNvcmF0b3JzIChgVmFsaWRhdGlvbktleXMuTElTVGApLCBpdCBwZXJmb3JtcyBlbGVtZW50LXdpc2UgdmFsaWRhdGlvbixcbiAqIHN1cHBvcnRpbmcgbmVzdGVkIG1vZGVsIHZhbGlkYXRpb24gYW5kIHR5cGUgY2hlY2tzLiBJZiB0aGUgYGFzeW5jYCBmbGFnIGlzIHNldCwgYXN5bmNocm9ub3VzXG4gKiB2YWxpZGF0aW9uIGlzIHN1cHBvcnRlZCB1c2luZyBgUHJvbWlzZS5hbGxgLiBUaGUgcmVzdWx0IGlzIGEgcmVjb3JkIG1hcHBpbmcgdmFsaWRhdGlvbiBrZXlzIHRvXG4gKiBlcnJvciBtZXNzYWdlcywgb3IgYHVuZGVmaW5lZGAgaWYgbm8gZXJyb3JzIGFyZSBmb3VuZC5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIEEgdHlwZSBwYXJhbWV0ZXIgZXh0ZW5kaW5nIGBNb2RlbGAsIHJlcHJlc2VudGluZyB0aGUgbW9kZWwgdHlwZSBiZWluZyB2YWxpZGF0ZWQuXG4gKiBAdGVtcGxhdGUgQXN5bmMgLSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRoYXQgdGhlIHZhbGlkYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBwcm92aWRlZCBkZWNvcmF0b3JzLlxuICogQHBhcmFtIHtEZWNvcmF0b3JNZXRhZGF0YUFzeW5jW119IGRlY29yYXRvcnMgLSBBbiBhcnJheSBvZiBtZXRhZGF0YSBvYmplY3RzIHJlcHJlc2VudGluZyB2YWxpZGF0aW9uIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0ge0FzeW5jfSBbYXN5bmNdIC0gT3B0aW9uYWwgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEByZXR1cm4ge0NvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkfVxuICogUmV0dXJucyBlaXRoZXIgYSByZWNvcmQgb2YgdmFsaWRhdGlvbiBlcnJvcnMgKGtleWVkIGJ5IHRoZSBkZWNvcmF0b3Iga2V5KSBvciBgdW5kZWZpbmVkYCBpZiBubyBlcnJvcnMgYXJlIGZvdW5kLlxuICogSWYgYGFzeW5jYCBpcyB0cnVlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNhbWUgc3RydWN0dXJlLlxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZURlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG1vZGVsOiBNLFxuICB2YWx1ZTogYW55LFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YUFzeW5jW10sXG4gIGFzeW5jPzogQXN5bmNcbik6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4+ID0ge307XG5cbiAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgIC8vIHNraXAgYXN5bmMgZGVjb3JhdG9ycyBpZiB2YWxpZGF0ZURlY29yYXRvcnMgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgKGFzeW5jID0gZmFsc2UpXG4gICAgaWYgKCFhc3luYyAmJiBkZWNvcmF0b3IucHJvcHMuYXN5bmMpIGNvbnRpbnVlO1xuXG4gICAgbGV0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0ZURlY29yYXRvcihtb2RlbCwgdmFsdWUsIGRlY29yYXRvciwgYXN5bmMpO1xuXG4gICAgLypcbiAgICBJZiB0aGUgZGVjb3JhdG9yIGlzIGEgbGlzdCwgZWFjaCBlbGVtZW50IG11c3QgYmUgY2hlY2tlZC5cbiAgICBXaGVuICdhc3luYycgaXMgdHJ1ZSwgdGhlICdlcnInIHdpbGwgYWx3YXlzIGJlIGEgcGVuZGluZyBwcm9taXNlIGluaXRpYWxseSxcbiAgICBzbyB0aGUgJyFlcnInIGNoZWNrIHdpbGwgZXZhbHVhdGUgdG8gZmFsc2UgKGV2ZW4gaWYgdGhlIHByb21pc2UgbGF0ZXIgcmVzb2x2ZXMgd2l0aCBubyBlcnJvcnMpXG4gICAgKi9cbiAgICBpZiAoZGVjb3JhdG9yLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVCAmJiAoIXZhbGlkYXRpb25FcnJvcnMgfHwgYXN5bmMpKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZSBpbnN0YW5jZW9mIFNldCA/IFsuLi52YWx1ZV0gOiB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPVxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jbGFzcyB8fFxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jbGF6eiB8fFxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jdXN0b21UeXBlcztcblxuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSBbdHlwZXNdLmZsYXQoKS5tYXAoKHQpID0+IFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgLy8gY29uc3QgcmVzZXJ2ZWQgPSBPYmplY3QudmFsdWVzKFJlc2VydmVkTW9kZWxzKS5tYXAoKHYpID0+IHYudG9Mb3dlckNhc2UoKSkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgY29uc3QgZXJycyA9IHZhbHVlcy5tYXAoKGNoaWxkVmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIGlmIChNb2RlbC5pc01vZGVsKHYpICYmICFyZXNlcnZlZC5pbmNsdWRlcyh2KSB7XG4gICAgICAgICAgaWYgKE1vZGVsLmlzTW9kZWwoY2hpbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXROZXN0ZWRWYWxpZGF0aW9uRXJyb3JzKGNoaWxkVmFsdWUsIG1vZGVsLCBhc3luYyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5pbmNsdWRlcyh0eXBlb2YgY2hpbGRWYWx1ZSlcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IFwiVmFsdWUgaGFzIG5vIHZhbGlkYXRhYmxlIHR5cGVcIjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyA9IFByb21pc2UuYWxsKGVycnMpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWxsRW1wdHkgPSByZXN1bHQuZXZlcnkoKHIpID0+ICFyKTtcbiAgICAgICAgICAgIHJldHVybiBhbGxFbXB0eSA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgICAgICB9KSBhcyBhbnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYWxsRW1wdHkgPSBlcnJzLmV2ZXJ5KChyOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+ICFyKTtcbiAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzID0gZXJycy5sZW5ndGggPiAwICYmICFhbGxFbXB0eSA/IGVycnMgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGlvbkVycm9ycykgKHJlc3VsdCBhcyBhbnkpW2RlY29yYXRvci5rZXldID0gdmFsaWRhdGlvbkVycm9ycztcbiAgfVxuXG4gIGlmICghYXN5bmMpXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMFxuICAgICAgPyAocmVzdWx0IGFzIGFueSlcbiAgICAgIDogKHVuZGVmaW5lZCBhcyBhbnkpO1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXN1bHQpO1xuICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KSBhcyBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD5bXTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKChyZXNvbHZlZFZhbHVlcykgPT4ge1xuICAgIGNvbnN0IHJlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbCA9IHJlc29sdmVkVmFsdWVzW2ldO1xuICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc1trZXlzW2ldXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlcykubGVuZ3RoID4gMCA/IHJlcyA6IHVuZGVmaW5lZDtcbiAgfSkgYXMgYW55O1xufVxuXG4vKipcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZVxuICogQHRlbXBsYXRlIE1cbiAqIEB0ZW1wbGF0ZSBBc3luY1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBWYWxpZGF0ZXMgdGhlIHByb3BlcnRpZXMgb2YgYSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlIHVzaW5nIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycy5cbiAqIFN1cHBvcnRzIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIGZsb3dzLCBkZXBlbmRpbmcgb24gdGhlIGBhc3luY2AgZmxhZy5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhpcyBmdW5jdGlvbiBpbnNwZWN0cyBhIGdpdmVuIG1vZGVsIG9iamVjdCwgaWRlbnRpZmllcyBkZWNvcmF0ZWQgcHJvcGVydGllcyB0aGF0IHJlcXVpcmUgdmFsaWRhdGlvbixcbiAqIGFuZCBhcHBsaWVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbGlkYXRpb24gcnVsZXMuIEl0IGFsc28gc3VwcG9ydHMgbmVzdGVkIG1vZGVsIHZhbGlkYXRpb24gYW5kIGdyYWNlZnVsbHlcbiAqIG1lcmdlcyBhbnkgdmFsaWRhdGlvbiBlcnJvcnMuIEZvciBjb2xsZWN0aW9ucyAoQXJyYXkvU2V0KSwgaXQgZW5mb3JjZXMgdGhlIHByZXNlbmNlIG9mIHRoZSBgQGxpc3RgIGRlY29yYXRvclxuICogYW5kIGNoZWNrcyB0aGUgdHlwZSBvZiBlbGVtZW50cy4gSWYgYSBwcm9wZXJ0eSBpcyBhIG5lc3RlZCBtb2RlbCwgaXQgd2lsbCBjYWxsIGBoYXNFcnJvcnNgIG9uIGl0IGFuZCBmbGF0dGVuXG4gKiB0aGUgbmVzdGVkIGVycm9yIGtleXMgdXNpbmcgZG90IG5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gYmUgdmFsaWRhdGVkLiBNdXN0IGV4dGVuZCBmcm9tIHtAbGluayBNb2RlbH0uXG4gKiBAcGFyYW0ge0FzeW5jfSBbYXN5bmNdIC0gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB2YWxpZGF0aW9uIHNob3VsZCBiZSBhc3luY2hyb25vdXMuXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcHJvcHNUb0lnbm9yZSAtIEEgdmFyaWFkaWMgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGR1cmluZyB2YWxpZGF0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD59XG4gKiBSZXR1cm5zIGVpdGhlciBhIHtAbGluayBNb2RlbEVycm9yRGVmaW5pdGlvbn0gY29udGFpbmluZyB2YWxpZGF0aW9uIGVycm9ycyxcbiAqIG9yIGB1bmRlZmluZWRgIGlmIG5vIGVycm9ycyBhcmUgZm91bmQuIFdoZW4gYGFzeW5jYCBpcyBgdHJ1ZWAsIHJldHVybnMgYSBQcm9taXNlLlxuICpcbiAqIEBzZWUge0BsaW5rIE1vZGVsfVxuICogQHNlZSB7QGxpbmsgTW9kZWxFcnJvckRlZmluaXRpb259XG4gKiBAc2VlIHtAbGluayB2YWxpZGF0ZURlY29yYXRvcnN9XG4gKiBAc2VlIHtAbGluayBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXN9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICAgIHBhcnRpY2lwYW50IHZhbGlkYXRlXG4gKiAgICAgcGFydGljaXBhbnQgZ2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzXG4gKiAgICAgcGFydGljaXBhbnQgdmFsaWRhdGVEZWNvcmF0b3JzXG4gKiAgICAgcGFydGljaXBhbnQgTW9kZWxJbnN0YW5jZVxuICogICAgIENhbGxlci0+PnZhbGlkYXRlOiBjYWxsIHdpdGggb2JqLCBhc3luYywgcHJvcHNUb0lnbm9yZVxuICogICAgIHZhbGlkYXRlLT4+Z2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzOiByZXRyaWV2ZSBkZWNvcmF0ZWQgcHJvcHNcbiAqICAgICBsb29wIGZvciBlYWNoIHByb3BlcnR5XG4gKiAgICAgICAgIHZhbGlkYXRlLT4+dmFsaWRhdGVEZWNvcmF0b3JzOiB2YWxpZGF0ZSB1c2luZyBkZWNvcmF0b3JzXG4gKiAgICAgICAgIGFsdCBpcyBuZXN0ZWQgbW9kZWxcbiAqICAgICAgICAgICAgIHZhbGlkYXRlLT4+TW9kZWxJbnN0YW5jZTogY2FsbCBoYXNFcnJvcnMoKVxuICogICAgICAgICBlbmRcbiAqICAgICBlbmRcbiAqICAgICBhbHQgYXN5bmNcbiAqICAgICAgICAgdmFsaWRhdGUtPj52YWxpZGF0ZTogUHJvbWlzZS5hbGxTZXR0bGVkIGZvciBlcnJvcnNcbiAqICAgICBlbmRcbiAqICAgICB2YWxpZGF0ZS0tPj5DYWxsZXI6IHJldHVybiBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgQXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+KFxuICBtb2RlbDogTSxcbiAgYXN5bmM6IEFzeW5jLFxuICAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZGVjb3JhdGVkUHJvcGVydGllczogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdID1cbiAgICBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXMobW9kZWwsIHByb3BzVG9JZ25vcmUpO1xuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBjb25zdCBuZXN0ZWRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IHsgcHJvcCwgZGVjb3JhdG9ycyB9IG9mIGRlY29yYXRlZFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBwcm9wS2V5ID0gU3RyaW5nKHByb3ApO1xuICAgIGxldCBwcm9wVmFsdWUgPSAobW9kZWwgYXMgYW55KVtwcm9wXTtcblxuICAgIGlmICghZGVjb3JhdG9ycz8ubGVuZ3RoKSBjb250aW51ZTtcblxuICAgIC8vIEdldCB0aGUgZGVmYXVsdCB0eXBlIHZhbGlkYXRvclxuICAgIGNvbnN0IGRlc2lnblR5cGVEZWMgPSBkZWNvcmF0b3JzLmZpbmQoKGQpID0+IHtcbiAgICAgIHJldHVybiBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEVdLmluY2x1ZGVzKGQua2V5IGFzIGFueSk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWRlc2lnblR5cGVEZWMpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZGVzaWduVHlwZSA9IGRlc2lnblR5cGVEZWMucHJvcHMubmFtZTtcblxuICAgIC8vIEhhbmRsZSBhcnJheSBvciBTZXQgdHlwZXMgYW5kIGVuZm9yY2UgdGhlIHByZXNlbmNlIG9mIEBsaXN0IGRlY29yYXRvclxuICAgIGlmIChbQXJyYXkubmFtZSwgU2V0Lm5hbWVdLmluY2x1ZGVzKGRlc2lnblR5cGUpKSB7XG4gICAgICBpZiAoIWRlY29yYXRvcnMuc29tZSgoZCkgPT4gZC5rZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1QpKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wS2V5XSA9IHtcbiAgICAgICAgICBbVmFsaWRhdGlvbktleXMuVFlQRV06IGBBcnJheSBvciBTZXQgcHJvcGVydHkgJyR7cHJvcEtleX0nIHJlcXVpcmVzIGEgQGxpc3QgZGVjb3JhdG9yYCxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvcFZhbHVlICYmXG4gICAgICAgICEoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpIHx8IHByb3BWYWx1ZSBpbnN0YW5jZW9mIFNldClcbiAgICAgICkge1xuICAgICAgICByZXN1bHRbcHJvcEtleV0gPSB7XG4gICAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlRZUEVdOiBgUHJvcGVydHkgJyR7U3RyaW5nKHByb3ApfScgbXVzdCBiZSBlaXRoZXIgYW4gQXJyYXkgb3IgYSBTZXRgLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIGRlc2lnbjp0eXBlIGRlY29yYXRvciwgc2luY2UgQGxpc3QgZGVjb3JhdG9yIGFscmVhZHkgZW5zdXJlcyB0eXBlXG4gICAgICBmb3IgKGxldCBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXS5rZXkgPT09IE1vZGVsS2V5cy5UWVBFKSB7XG4gICAgICAgICAgZGVjb3JhdG9ycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByb3BWYWx1ZSA9IHByb3BWYWx1ZSBpbnN0YW5jZW9mIFNldCA/IFsuLi5wcm9wVmFsdWVdIDogcHJvcFZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BFcnJvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPVxuICAgICAgdmFsaWRhdGVEZWNvcmF0b3JzKG1vZGVsLCBwcm9wVmFsdWUsIGRlY29yYXRvcnMsIGFzeW5jKSB8fCB7fTtcblxuICAgIC8vIENoZWNrIGZvciBuZXN0ZWQgcHJvcGVydGllcy5cbiAgICAvLyBUbyBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb2Nlc3NpbmcsIFwicHJvcFZhbHVlXCIgbXVzdCBiZSBkZWZpbmVkIGFuZCB2YWxpZGF0YWJsZVxuICAgIC8vIGxldCBuZXN0ZWRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBpc0NvbnN0ciA9IE1vZGVsLmlzUHJvcGVydHlNb2RlbChtb2RlbCwgcHJvcEtleSk7XG4gICAgLy8gaWYgcHJvcFZhbHVlICE9PSB1bmRlZmluZWQsIG51bGxcbiAgICBpZiAocHJvcFZhbHVlICYmIGlzQ29uc3RyKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZTogTW9kZWwgPSBwcm9wVmFsdWU7XG4gICAgICBjb25zdCBpc0ludmFsaWRNb2RlbCA9XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICAhaW5zdGFuY2UuaGFzRXJyb3JzIHx8XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZS5oYXNFcnJvcnMgIT09IFwiZnVuY3Rpb25cIjtcblxuICAgICAgaWYgKGlzSW52YWxpZE1vZGVsKSB7XG4gICAgICAgIC8vIHByb3BFcnJvcnNbVmFsaWRhdGlvbktleXMuVFlQRV0gPSBcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXQncyBub3QuXCI7XG4gICAgICAgIGNvbnNvbGUud2FybihcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXQncyBub3QuXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVzdGVkRXJyb3JzW3Byb3BLZXldID0gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9ycyhcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBhc3luY1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCB0byB0aGUgcmVzdWx0IGlmIHdlIGhhdmUgYW55IGVycm9yc1xuICAgIC8vIEFzeW5jIG1vZGUgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB1bmRlZmluZWQgd2hlbiBubyBlcnJvcnMgZXhpc3RcbiAgICBpZiAoT2JqZWN0LmtleXMocHJvcEVycm9ycykubGVuZ3RoID4gMCB8fCBhc3luYylcbiAgICAgIHJlc3VsdFtwcm9wS2V5XSA9IHByb3BFcnJvcnM7XG5cbiAgICAvLyBUaGVuIG1lcmdlIGFueSBuZXN0ZWQgZXJyb3JzXG4gICAgaWYgKCFhc3luYykge1xuICAgICAgT2JqZWN0LmVudHJpZXMobmVzdGVkRXJyb3JzW3Byb3BLZXldIHx8IHt9KS5mb3JFYWNoKChba2V5LCBlcnJvcl0pID0+IHtcbiAgICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHRbYCR7cHJvcEtleX0uJHtrZXl9YF0gPSBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU3luY2hyb25vdXMgcmV0dXJuXG4gIGlmICghYXN5bmMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICAgID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdClcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICApIGFzIGFueTtcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZDogYW55ID0gcmVzdWx0OyAvLyBUT0RPOiBhcHBseSBmaWx0ZXJpbmdcblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobWVyZ2VkKTtcbiAgY29uc3QgcHJvbWlzZXMgPSBPYmplY3QudmFsdWVzKG1lcmdlZCk7XG4gIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpLnRoZW4oYXN5bmMgKHJlc3VsdHMpID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IE1vZGVsRXJyb3JzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtwYXJlbnRQcm9wLCBuZXN0ZWRFcnJQcm9taXNlXSBvZiBPYmplY3QuZW50cmllcyhuZXN0ZWRFcnJvcnMpKSB7XG4gICAgICBjb25zdCBuZXN0ZWRQcm9wRGVjRXJyb3JzID0gKGF3YWl0IG5lc3RlZEVyclByb21pc2UpIGFzIFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBhbnlcbiAgICAgID47XG5cbiAgICAgIGlmIChuZXN0ZWRQcm9wRGVjRXJyb3JzKVxuICAgICAgICBPYmplY3QuZW50cmllcyhuZXN0ZWRQcm9wRGVjRXJyb3JzKS5mb3JFYWNoKFxuICAgICAgICAgIChbbmVzdGVkUHJvcCwgbmVzdGVkUHJvcERlY0Vycm9yXSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5lc3RlZFByb3BEZWNFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5lc3RlZEtleSA9IFtwYXJlbnRQcm9wLCBuZXN0ZWRQcm9wXS5qb2luKFwiLlwiKTtcbiAgICAgICAgICAgICAgcmVzdWx0W25lc3RlZEtleV0gPSBuZXN0ZWRQcm9wRGVjRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IHJlcyA9IHJlc3VsdHNbaV07XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiICYmIHJlcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KVtrZXldID0gcmVzLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpW2tleV0gPVxuICAgICAgICAgIHJlcy5yZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgPyByZXMucmVhc29uLm1lc3NhZ2VcbiAgICAgICAgICAgIDogU3RyaW5nKHJlcy5yZWFzb24gfHwgXCJWYWxpZGF0aW9uIGZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICA/IG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbihyZXN1bHQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSkgYXMgYW55O1xufVxuIl19
|
|
391
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbC92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQ0FBK0I7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQ0FBMkI7QUFDL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxtQkFBZ0I7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxzQ0FBaUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnREFBMkM7QUFNcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQ0FBMkI7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxnQ0FBcUI7QUFFckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBZ0I7QUFFL0M7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsS0FBMEIsRUFDMUIsSUFBWSxFQUNaLGFBQXFCLGNBQWMsQ0FBQyxPQUFPO0lBRTNDLE9BQU8sVUFBVSxDQUFDLHFCQUFxQixDQUNyQyxVQUFVLEVBQ1YsS0FBSyxFQUNMLElBQUksQ0FDK0MsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLE1BQU0sbUJBQW1CLEdBQTRDLEVBQUUsQ0FBQztJQUV4RSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQ0UsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7WUFDakQsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUM3QixDQUFDO1lBQ0QsTUFBTSxHQUFH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QUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXZCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxXQUFXLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekQsTUFBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDbkMsQ0FBQztpQkFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3BDLE1BQWMsQ0FBQyxHQUFHLENBQUM7b0JBQ2xCLEdBQUcsQ0FBQyxNQUFNLFlBQVksS0FBSzt3QkFDekIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTzt3QkFDcEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbkMsQ0FBQyxDQUFDLElBQUksb0JBQW9CLENBQUMsTUFBTSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQyxDQUFRLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIE1vZGVsRXJyb3JzLFxuICBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGF0aFByb3h5RW5naW5lIH0gZnJvbSBcIi4uL3V0aWxzL1BhdGhQcm94eVwiO1xuaW1wb3J0IHsgQVNZTkNfTUVUQV9LRVksIFZBTElEQVRJT05fUEFSRU5UX0tFWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbmRpdGlvbmFsQXN5bmMsIERlY29yYXRvck1ldGFkYXRhQXN5bmMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IHRvQ29uZGl0aW9uYWxQcm9taXNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbGlkYXRpb24gbWV0YWRhdGEgZGVjb3JhdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBwcm9wZXJ0eSBvZiBhIG1vZGVsLFxuICogdXNpbmcgdGhlIHJlZmxlY3RpdmUgbWV0YWRhdGEga2V5LlxuICpcbiAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjbGFzcyBjb250YWluaW5nIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBkZWNvcmF0b3JzIHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmbGVjdEtleSAtIFRoZSBtZXRhZGF0YSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGVjb3JhdG9ycy5cbiAqICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gYFZhbGlkYXRpb25LZXlzLlJFRkxFQ1RgLlxuICpcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIGRlY29yYXRvcnMgYXBwbGllZCB0byB0aGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkYXRpb25EZWNvcmF0b3JzKFxuICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJvcDogc3RyaW5nLFxuICByZWZsZWN0S2V5OiBzdHJpbmcgPSBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uIHtcbiAgcmV0dXJuIFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgIHJlZmxlY3RLZXksXG4gICAgbW9kZWwsXG4gICAgcHJvcFxuICApIGFzIHVua25vd24gYXMgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHJpZXZlcyBhbGwgdmFsaWRhdGFibGUgcHJvcGVydHkgZGVjb3JhdG9ycyBmcm9tIGEgZ2l2ZW4gbW9kZWwsIGV4Y2x1ZGluZyBzcGVjaWZpZWQgcHJvcGVydGllcy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhIG1vZGVsIGluc3RhbmNlLCBmaWx0ZXJpbmcgb3V0IGFueSBwcm9wZXJ0aWVzXG4gKiBsaXN0ZWQgaW4gdGhlIGBwcm9wc1RvSWdub3JlYCBhcnJheS4gRm9yIGVhY2ggcmVtYWluaW5nIHByb3BlcnR5LCBpdCBjaGVja3Mgd2hldGhlciB2YWxpZGF0aW9uXG4gKiBkZWNvcmF0b3JzIGFyZSBwcmVzZW50IHVzaW5nIGBnZXRWYWxpZGF0aW9uRGVjb3JhdG9yc2AsIGFuZCBpZiBzbywgY29sbGVjdHMgdGhlbSBpbiB0aGUgcmVzdWx0IGFycmF5LlxuICpcbiAqIEB0ZW1wbGF0ZSBNIC0gQSBnZW5lcmljIHBhcmFtZXRlciBleHRlbmRpbmcgdGhlIGBNb2RlbGAgY2xhc3MsIHJlcHJlc2VudGluZyB0aGUgbW9kZWwgdHlwZSBiZWluZyBpbnNwZWN0ZWQuXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIEFuIGluc3RhbmNlIG9mIGEgY2xhc3MgZXh0ZW5kaW5nIGBNb2RlbGAgZnJvbSB3aGljaCB2YWxpZGF0YWJsZSBwcm9wZXJ0aWVzIHdpbGwgYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHNUb0lnbm9yZSAtIEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdmFsaWRhdGlvbiBpbnNwZWN0aW9uLlxuICpcbiAqIEByZXR1cm4ge1ZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25bXX0gQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBkZWNvcmF0b3IgZGVmaW5pdGlvbnNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwncyBwcm9wZXJ0aWVzLCBleGNsdWRpbmcgdGhvc2UgbGlzdGVkIGluIGBwcm9wc1RvSWdub3JlYC5cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gbW9kZWwpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHByb3ApICYmXG4gICAgICAhcHJvcHNUb0lnbm9yZS5pbmNsdWRlcyhwcm9wKVxuICAgICkge1xuICAgICAgY29uc3QgZGVjID0gZ2V0VmFsaWRhdGlvbkRlY29yYXRvcnMobW9kZWwsIHByb3ApO1xuICAgICAgaWYgKGRlYykgZGVjb3JhdGVkUHJvcGVydGllcy5wdXNoKGRlYyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlY29yYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogU2FmZWx5IHNldHMgdGVtcG9yYXJ5IG1ldGFkYXRhIG9uIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBzZXRUZW1wb3JhcnlDb250ZXh0KFxuICB0YXJnZXQ6IGFueSxcbiAga2V5OiBzeW1ib2wgfCBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkpIHRhcmdldFtrZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogU2FmZWx5IHJlbW92ZXMgdGVtcG9yYXJ5IG1ldGFkYXRhIGZyb20gYW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KHRhcmdldDogYW55LCBrZXk6IHN5bWJvbCB8IHN0cmluZyk6IHZvaWQge1xuICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSBkZWxldGUgdGFyZ2V0W2tleV07XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdmFsaWRhdGlvbiB3aXRoIHRlbXBvcmFyeSBjb250ZXh0IGFuZCByZXR1cm5zIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICpcbiAqIEBwYXJhbSBuZXN0ZWRNb2RlbCAtIFRoZSBpbnN0YW5jZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHBhcmVudE1vZGVsIC0gUmVmZXJlbmNlIHRvIGEgcGFyZW50IG9iamVjdCBmb3IgbmVzdGVkIHZhbGlkYXRpb25cbiAqIEBwYXJhbSBpc0FzeW5jIC0gV2hldGhlciB0byBwZXJmb3JtIGFzeW5jIHZhbGlkYXRpb25cbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IGZyb20gaGFzRXJyb3JzKClcbiAqL1xuZnVuY3Rpb24gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG5lc3RlZE1vZGVsOiBNLFxuICBwYXJlbnRNb2RlbD86IE0sXG4gIGlzQXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgLy8gU2V0IHRlbXBvcmFyeSBjb250ZXh0IGZvciBuZXN0ZWQgbW9kZWxzXG4gIGlmIChwYXJlbnRNb2RlbCkge1xuICAgIHNldFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIFZBTElEQVRJT05fUEFSRU5UX0tFWSwgcGFyZW50TW9kZWwpO1xuICB9XG4gIHNldFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIEFTWU5DX01FVEFfS0VZLCAhIWlzQXN5bmMpO1xuXG4gIGNvbnN0IGVycnMgPSBuZXN0ZWRNb2RlbC5oYXNFcnJvcnMoKTtcbiAgY2xlYW51cFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIFZBTElEQVRJT05fUEFSRU5UX0tFWSk7XG4gIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBBU1lOQ19NRVRBX0tFWSk7XG4gIHJldHVybiBlcnJzIGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRWYWx1ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBwcm9wOiBzdHJpbmcsXG4gIGNoaWxkVmFsdWU6IGFueSxcbiAgcGFyZW50TW9kZWw6IE0sXG4gIGFsbG93ZWRUeXBlczogc3RyaW5nW10sXG4gIGFzeW5jOiBib29sZWFuXG4pOlxuICB8IHN0cmluZ1xuICB8IHVuZGVmaW5lZFxuICB8IE1vZGVsRXJyb3JEZWZpbml0aW9uXG4gIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCBNb2RlbEVycm9yRGVmaW5pdGlvbj4ge1xuICBsZXQgZXJyOlxuICAgIHwgTW9kZWxFcnJvckRlZmluaXRpb25cbiAgICB8IHN0cmluZ1xuICAgIHwgdW5kZWZpbmVkXG4gICAgfCBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZCB8IE1vZGVsRXJyb3JEZWZpbml0aW9uPiA9IHVuZGVmaW5lZDtcbiAgbGV0IGF0TGVhc3RPbmVNYXRjaGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgYWxsb3dlZFR5cGUgb2YgYWxsb3dlZFR5cGVzKSB7XG4gICAgY29uc3QgQ29uc3RyID0gTW9kZWwuZ2V0KGFsbG93ZWRUeXBlKSBhcyBhbnk7XG4gICAgaWYgKCFDb25zdHIpIHtcbiAgICAgIGVyciA9IG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbih7XG4gICAgICAgIFtwcm9wXToge1xuICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYFVuYWJsZSB0byB2ZXJpZnkgdHlwZSBjb25zaXN0ZW5jeSwgbWlzc2luZyBtb2RlbCByZWdpc3RyeSBmb3IgJHthbGxvd2VkVHlwZX1gLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkVmFsdWUgaW5zdGFuY2VvZiBDb25zdHIpIHtcbiAgICAgIGF0TGVhc3RPbmVNYXRjaGVkID0gdHJ1ZTtcbiAgICAgIGVyciA9IGdldE5lc3RlZFZhbGlkYXRpb25FcnJvcnMoY2hpbGRWYWx1ZSwgcGFyZW50TW9kZWwsIGFzeW5jKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhdExlYXN0T25lTWF0Y2hlZCkgcmV0dXJuIGVycjtcblxuICByZXR1cm4gKFxuICAgIGVyciB8fFxuICAgIG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbih7XG4gICAgICBbcHJvcF06IHtcbiAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlRZUEVdOiBgVmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGV4cGVjdGVkIHR5cGVzOiAke2FsbG93ZWRUeXBlcy5qb2luKFwiLCBcIil9YCxcbiAgICAgIH0sXG4gICAgfSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgbW9kZWw6IE0sXG4gIHZhbHVlOiBhbnksXG4gIGRlY29yYXRvcjogRGVjb3JhdG9yTWV0YWRhdGFBc3luYyxcbiAgYXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHZhbGlkYXRvciA9IFZhbGlkYXRpb24uZ2V0KGRlY29yYXRvci5rZXkpO1xuICBpZiAoIXZhbGlkYXRvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB2YWxpZGF0b3IgZm9yICR7ZGVjb3JhdG9yLmtleX1gKTtcbiAgfVxuXG4gIC8vIHNraXAgYXN5bmMgZGVjb3JhdG9ycyBpZiB2YWxpZGF0ZURlY29yYXRvcnMgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgKGFzeW5jID0gZmFsc2UpXG4gIGlmICghYXN5bmMgJiYgZGVjb3JhdG9yLnByb3BzLmFzeW5jKSByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcblxuICBjb25zdCBkZWNvcmF0b3JQcm9wcyA9XG4gICAgZGVjb3JhdG9yLmtleSA9PT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgID8gW2RlY29yYXRvci5wcm9wc11cbiAgICAgIDogZGVjb3JhdG9yLnByb3BzIHx8IHt9O1xuXG4gIGNvbnN0IGNvbnRleHQgPSBQYXRoUHJveHlFbmdpbmUuY3JlYXRlKG1vZGVsLCB7XG4gICAgaWdub3JlVW5kZWZpbmVkOiB0cnVlLFxuICAgIGlnbm9yZU51bGw6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IG1heWJlQXN5bmNFcnJvcnMgPSB2YWxpZGF0b3IuaGFzRXJyb3JzKFxuICAgIHZhbHVlLFxuICAgIGRlY29yYXRvclByb3BzIGFzIFZhbGlkYXRvck9wdGlvbnMsXG4gICAgY29udGV4dFxuICApO1xuXG4gIHJldHVybiB0b0NvbmRpdGlvbmFsUHJvbWlzZShtYXliZUFzeW5jRXJyb3JzLCBhc3luYyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeGVjdXRlcyB2YWxpZGF0aW9uIGxvZ2ljIGZvciBhIHNldCBvZiBkZWNvcmF0b3JzIGFwcGxpZWQgdG8gYSBtb2RlbCdzIHByb3BlcnR5LCBoYW5kbGluZyBib3RoXG4gKiBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHZhbGlkYXRpb25zLCBpbmNsdWRpbmcgc3VwcG9ydCBmb3IgbmVzdGVkIHZhbGlkYXRpb25zIGFuZCBsaXN0cy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgb3ZlciBhbiBhcnJheSBvZiBkZWNvcmF0b3IgbWV0YWRhdGEgb2JqZWN0cyBhbmQgYXBwbGllcyBlYWNoIHZhbGlkYXRpb24gcnVsZSB0byB0aGVcbiAqIHByb3ZpZGVkIHZhbHVlLiBGb3IgbGlzdCBkZWNvcmF0b3JzIChgVmFsaWRhdGlvbktleXMuTElTVGApLCBpdCBwZXJmb3JtcyBlbGVtZW50LXdpc2UgdmFsaWRhdGlvbixcbiAqIHN1cHBvcnRpbmcgbmVzdGVkIG1vZGVsIHZhbGlkYXRpb24gYW5kIHR5cGUgY2hlY2tzLiBJZiB0aGUgYGFzeW5jYCBmbGFnIGlzIHNldCwgYXN5bmNocm9ub3VzXG4gKiB2YWxpZGF0aW9uIGlzIHN1cHBvcnRlZCB1c2luZyBgUHJvbWlzZS5hbGxgLiBUaGUgcmVzdWx0IGlzIGEgcmVjb3JkIG1hcHBpbmcgdmFsaWRhdGlvbiBrZXlzIHRvXG4gKiBlcnJvciBtZXNzYWdlcywgb3IgYHVuZGVmaW5lZGAgaWYgbm8gZXJyb3JzIGFyZSBmb3VuZC5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIEEgdHlwZSBwYXJhbWV0ZXIgZXh0ZW5kaW5nIGBNb2RlbGAsIHJlcHJlc2VudGluZyB0aGUgbW9kZWwgdHlwZSBiZWluZyB2YWxpZGF0ZWQuXG4gKiBAdGVtcGxhdGUgQXN5bmMgLSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRoYXQgdGhlIHZhbGlkYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3AgLSBUaGUgbW9kZWwgZmllbGQgbmFtZVxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBwcm92aWRlZCBkZWNvcmF0b3JzLlxuICogQHBhcmFtIHtEZWNvcmF0b3JNZXRhZGF0YUFzeW5jW119IGRlY29yYXRvcnMgLSBBbiBhcnJheSBvZiBtZXRhZGF0YSBvYmplY3RzIHJlcHJlc2VudGluZyB2YWxpZGF0aW9uIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0ge0FzeW5jfSBbYXN5bmNdIC0gT3B0aW9uYWwgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEByZXR1cm4ge0NvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkfVxuICogUmV0dXJucyBlaXRoZXIgYSByZWNvcmQgb2YgdmFsaWRhdGlvbiBlcnJvcnMgKGtleWVkIGJ5IHRoZSBkZWNvcmF0b3Iga2V5KSBvciBgdW5kZWZpbmVkYCBpZiBubyBlcnJvcnMgYXJlIGZvdW5kLlxuICogSWYgYGFzeW5jYCBpcyB0cnVlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNhbWUgc3RydWN0dXJlLlxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZURlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG1vZGVsOiBNLFxuICBwcm9wOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIGRlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhQXN5bmNbXSxcbiAgYXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFByb21pc2U8c3RyaW5nPj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgLy8gc2tpcCBhc3luYyBkZWNvcmF0b3JzIGlmIHZhbGlkYXRlRGVjb3JhdG9ycyBpcyBjYWxsZWQgc3luY2hyb25vdXNseSAoYXN5bmMgPSBmYWxzZSlcbiAgICBpZiAoIWFzeW5jICYmIGRlY29yYXRvci5wcm9wcy5hc3luYykgY29udGludWU7XG5cbiAgICBsZXQgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRlRGVjb3JhdG9yKG1vZGVsLCB2YWx1ZSwgZGVjb3JhdG9yLCBhc3luYyk7XG5cbiAgICAvKlxuICAgIElmIHRoZSBkZWNvcmF0b3IgaXMgYSBsaXN0LCBlYWNoIGVsZW1lbnQgbXVzdCBiZSBjaGVja2VkLlxuICAgIFdoZW4gJ2FzeW5jJyBpcyB0cnVlLCB0aGUgJ2Vycicgd2lsbCBhbHdheXMgYmUgYSBwZW5kaW5nIHByb21pc2UgaW5pdGlhbGx5LFxuICAgIHNvIHRoZSAnIWVycicgY2hlY2sgd2lsbCBldmFsdWF0ZSB0byBmYWxzZSAoZXZlbiBpZiB0aGUgcHJvbWlzZSBsYXRlciByZXNvbHZlcyB3aXRoIG5vIGVycm9ycylcbiAgICAqL1xuICAgIGlmIChkZWNvcmF0b3Iua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUICYmICghdmFsaWRhdGlvbkVycm9ycyB8fCBhc3luYykpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlIGluc3RhbmNlb2YgU2V0ID8gWy4uLnZhbHVlXSA6IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0eXBlcyA9IChkZWNvcmF0b3IucHJvcHMuY2xhc3MgfHxcbiAgICAgICAgICBkZWNvcmF0b3IucHJvcHMuY2xhenogfHxcbiAgICAgICAgICBkZWNvcmF0b3IucHJvcHMuY3VzdG9tVHlwZXMpIGFzIHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gICAgICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IFt0eXBlc10uZmxhdCgpLm1hcCgodCkgPT4gU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAvLyBjb25zdCByZXNlcnZlZCA9IE9iamVjdC52YWx1ZXMoUmVzZXJ2ZWRNb2RlbHMpLm1hcCgodikgPT4gdi50b0xvd2VyQ2FzZSgpKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICBjb25zdCBlcnJzID0gdmFsdWVzLm1hcCgoY2hpbGRWYWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gaWYgKE1vZGVsLmlzTW9kZWwodikgJiYgIXJlc2VydmVkLmluY2x1ZGVzKHYpIHtcbiAgICAgICAgICBpZiAoTW9kZWwuaXNNb2RlbChjaGlsZFZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlQ2hpbGRWYWx1ZShcbiAgICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgICAgY2hpbGRWYWx1ZSxcbiAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgIFt0eXBlc10uZmxhdCgpLFxuICAgICAgICAgICAgICAhIWFzeW5jXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gcmV0dXJuIGdldE5lc3RlZFZhbGlkYXRpb25FcnJvcnMoY2hpbGRWYWx1ZSwgbW9kZWwsIGFzeW5jKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKHR5cGVvZiBjaGlsZFZhbHVlKVxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogXCJWYWx1ZSBoYXMgbm8gdmFsaWRhdGFibGUgdHlwZVwiO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzID0gUHJvbWlzZS5hbGwoZXJycykudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbGxFbXB0eSA9IHJlc3VsdC5ldmVyeSgocikgPT4gIXIpO1xuICAgICAgICAgICAgcmV0dXJuIGFsbEVtcHR5ID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgICAgIH0pIGFzIGFueTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhbGxFbXB0eSA9IGVycnMuZXZlcnkoKHI6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gIXIpO1xuICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMgPSBlcnJzLmxlbmd0aCA+IDAgJiYgIWFsbEVtcHR5ID8gZXJycyA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0aW9uRXJyb3JzKSAocmVzdWx0IGFzIGFueSlbZGVjb3JhdG9yLmtleV0gPSB2YWxpZGF0aW9uRXJyb3JzO1xuICB9XG5cbiAgaWYgKCFhc3luYylcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICA/IChyZXN1bHQgYXMgYW55KVxuICAgICAgOiAodW5kZWZpbmVkIGFzIGFueSk7XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XG4gIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQpIGFzIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPltdO1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHJlc29sdmVkVmFsdWVzKSA9PiB7XG4gICAgY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsID0gcmVzb2x2ZWRWYWx1ZXNbaV07XG4gICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzW2tleXNbaV1dID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzKS5sZW5ndGggPiAwID8gcmVzIDogdW5kZWZpbmVkO1xuICB9KSBhcyBhbnk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uIHZhbGlkYXRlXG4gKiBAdGVtcGxhdGUgTVxuICogQHRlbXBsYXRlIEFzeW5jXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFZhbGlkYXRlcyB0aGUgcHJvcGVydGllcyBvZiBhIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgdXNpbmcgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzLlxuICogU3VwcG9ydHMgYm90aCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gZmxvd3MsIGRlcGVuZGluZyBvbiB0aGUgYGFzeW5jYCBmbGFnLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGZ1bmN0aW9uIGluc3BlY3RzIGEgZ2l2ZW4gbW9kZWwgb2JqZWN0LCBpZGVudGlmaWVzIGRlY29yYXRlZCBwcm9wZXJ0aWVzIHRoYXQgcmVxdWlyZSB2YWxpZGF0aW9uLFxuICogYW5kIGFwcGxpZXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsaWRhdGlvbiBydWxlcy4gSXQgYWxzbyBzdXBwb3J0cyBuZXN0ZWQgbW9kZWwgdmFsaWRhdGlvbiBhbmQgZ3JhY2VmdWxseVxuICogbWVyZ2VzIGFueSB2YWxpZGF0aW9uIGVycm9ycy4gRm9yIGNvbGxlY3Rpb25zIChBcnJheS9TZXQpLCBpdCBlbmZvcmNlcyB0aGUgcHJlc2VuY2Ugb2YgdGhlIGBAbGlzdGAgZGVjb3JhdG9yXG4gKiBhbmQgY2hlY2tzIHRoZSB0eXBlIG9mIGVsZW1lbnRzLiBJZiBhIHByb3BlcnR5IGlzIGEgbmVzdGVkIG1vZGVsLCBpdCB3aWxsIGNhbGwgYGhhc0Vycm9yc2Agb24gaXQgYW5kIGZsYXR0ZW5cbiAqIHRoZSBuZXN0ZWQgZXJyb3Iga2V5cyB1c2luZyBkb3Qgbm90YXRpb24uXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBiZSB2YWxpZGF0ZWQuIE11c3QgZXh0ZW5kIGZyb20ge0BsaW5rIE1vZGVsfS5cbiAqIEBwYXJhbSB7QXN5bmN9IFthc3luY10gLSBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIGFzeW5jaHJvbm91cy5cbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwcm9wc1RvSWdub3JlIC0gQSB2YXJpYWRpYyBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgZHVyaW5nIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMge0NvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPn1cbiAqIFJldHVybnMgZWl0aGVyIGEge0BsaW5rIE1vZGVsRXJyb3JEZWZpbml0aW9ufSBjb250YWluaW5nIHZhbGlkYXRpb24gZXJyb3JzLFxuICogb3IgYHVuZGVmaW5lZGAgaWYgbm8gZXJyb3JzIGFyZSBmb3VuZC4gV2hlbiBgYXN5bmNgIGlzIGB0cnVlYCwgcmV0dXJucyBhIFByb21pc2UuXG4gKlxuICogQHNlZSB7QGxpbmsgTW9kZWx9XG4gKiBAc2VlIHtAbGluayBNb2RlbEVycm9yRGVmaW5pdGlvbn1cbiAqIEBzZWUge0BsaW5rIHZhbGlkYXRlRGVjb3JhdG9yc31cbiAqIEBzZWUge0BsaW5rIGdldFZhbGlkYXRhYmxlUHJvcGVydGllc31cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgICAgcGFydGljaXBhbnQgdmFsaWRhdGVcbiAqICAgICBwYXJ0aWNpcGFudCBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXNcbiAqICAgICBwYXJ0aWNpcGFudCB2YWxpZGF0ZURlY29yYXRvcnNcbiAqICAgICBwYXJ0aWNpcGFudCBNb2RlbEluc3RhbmNlXG4gKiAgICAgQ2FsbGVyLT4+dmFsaWRhdGU6IGNhbGwgd2l0aCBvYmosIGFzeW5jLCBwcm9wc1RvSWdub3JlXG4gKiAgICAgdmFsaWRhdGUtPj5nZXRWYWxpZGF0YWJsZVByb3BlcnRpZXM6IHJldHJpZXZlIGRlY29yYXRlZCBwcm9wc1xuICogICAgIGxvb3AgZm9yIGVhY2ggcHJvcGVydHlcbiAqICAgICAgICAgdmFsaWRhdGUtPj52YWxpZGF0ZURlY29yYXRvcnM6IHZhbGlkYXRlIHVzaW5nIGRlY29yYXRvcnNcbiAqICAgICAgICAgYWx0IGlzIG5lc3RlZCBtb2RlbFxuICogICAgICAgICAgICAgdmFsaWRhdGUtPj5Nb2RlbEluc3RhbmNlOiBjYWxsIGhhc0Vycm9ycygpXG4gKiAgICAgICAgIGVuZFxuICogICAgIGVuZFxuICogICAgIGFsdCBhc3luY1xuICogICAgICAgICB2YWxpZGF0ZS0+PnZhbGlkYXRlOiBQcm9taXNlLmFsbFNldHRsZWQgZm9yIGVycm9yc1xuICogICAgIGVuZFxuICogICAgIHZhbGlkYXRlLS0+PkNhbGxlcjogcmV0dXJuIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG1vZGVsOiBNLFxuICBhc3luYzogQXN5bmMsXG4gIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPVxuICAgIGdldFZhbGlkYXRhYmxlUHJvcGVydGllcyhtb2RlbCwgcHJvcHNUb0lnbm9yZSk7XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IG5lc3RlZEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGZvciAoY29uc3QgeyBwcm9wLCBkZWNvcmF0b3JzIH0gb2YgZGVjb3JhdGVkUHJvcGVydGllcykge1xuICAgIGNvbnN0IHByb3BLZXkgPSBTdHJpbmcocHJvcCk7XG4gICAgbGV0IHByb3BWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3Byb3BdO1xuXG4gICAgaWYgKCFkZWNvcmF0b3JzPy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2V0IHRoZSBkZWZhdWx0IHR5cGUgdmFsaWRhdG9yXG4gICAgY29uc3QgZGVzaWduVHlwZURlYyA9IGRlY29yYXRvcnMuZmluZCgoZCkgPT4ge1xuICAgICAgcmV0dXJuIFtNb2RlbEtleXMuVFlQRSwgVmFsaWRhdGlvbktleXMuVFlQRV0uaW5jbHVkZXMoZC5rZXkgYXMgYW55KTtcbiAgICB9KTtcblxuICAgIGlmICghZGVzaWduVHlwZURlYykgY29udGludWU7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlID0gZGVzaWduVHlwZURlYy5wcm9wcy5uYW1lO1xuXG4gICAgLy8gSGFuZGxlIGFycmF5IG9yIFNldCB0eXBlcyBhbmQgZW5mb3JjZSB0aGUgcHJlc2VuY2Ugb2YgQGxpc3QgZGVjb3JhdG9yXG4gICAgaWYgKFtBcnJheS5uYW1lLCBTZXQubmFtZV0uaW5jbHVkZXMoZGVzaWduVHlwZSkpIHtcbiAgICAgIGlmICghZGVjb3JhdG9ycy5zb21lKChkKSA9PiBkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVCkpIHtcbiAgICAgICAgcmVzdWx0W3Byb3BLZXldID0ge1xuICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYEFycmF5IG9yIFNldCBwcm9wZXJ0eSAnJHtwcm9wS2V5fScgcmVxdWlyZXMgYSBAbGlzdCBkZWNvcmF0b3JgLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwcm9wVmFsdWUgJiZcbiAgICAgICAgIShBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkgfHwgcHJvcFZhbHVlIGluc3RhbmNlb2YgU2V0KVxuICAgICAgKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wS2V5XSA9IHtcbiAgICAgICAgICBbVmFsaWRhdGlvbktleXMuVFlQRV06IGBQcm9wZXJ0eSAnJHtTdHJpbmcocHJvcCl9JyBtdXN0IGJlIGVpdGhlciBhbiBBcnJheSBvciBhIFNldGAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgZGVzaWduOnR5cGUgZGVjb3JhdG9yLCBzaW5jZSBAbGlzdCBkZWNvcmF0b3IgYWxyZWFkeSBlbnN1cmVzIHR5cGVcbiAgICAgIGZvciAobGV0IGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChkZWNvcmF0b3JzW2ldLmtleSA9PT0gTW9kZWxLZXlzLlRZUEUpIHtcbiAgICAgICAgICBkZWNvcmF0b3JzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvcFZhbHVlID0gcHJvcFZhbHVlIGluc3RhbmNlb2YgU2V0ID8gWy4uLnByb3BWYWx1ZV0gOiBwcm9wVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICB2YWxpZGF0ZURlY29yYXRvcnMobW9kZWwsIHByb3BLZXksIHByb3BWYWx1ZSwgZGVjb3JhdG9ycywgYXN5bmMpIHx8IHt9O1xuXG4gICAgLy8gQ2hlY2sgZm9yIG5lc3RlZCBwcm9wZXJ0aWVzLlxuICAgIC8vIFRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcHJvY2Vzc2luZywgXCJwcm9wVmFsdWVcIiBtdXN0IGJlIGRlZmluZWQgYW5kIHZhbGlkYXRhYmxlXG4gICAgLy8gbGV0IG5lc3RlZEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IGlzQ29uc3RyID0gTW9kZWwuaXNQcm9wZXJ0eU1vZGVsKG1vZGVsLCBwcm9wS2V5KTtcbiAgICBjb25zdCBoYXNQcm9wVmFsdWUgPSBwcm9wVmFsdWUgIT09IG51bGwgJiYgcHJvcFZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzQ29uc3RyICYmIGhhc1Byb3BWYWx1ZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBwcm9wVmFsdWUgYXMgTW9kZWw7XG4gICAgICBjb25zdCBpc0ludmFsaWRNb2RlbCA9XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICB0eXBlb2YgaW5zdGFuY2UuaGFzRXJyb3JzICE9PSBcImZ1bmN0aW9uXCI7XG5cbiAgICAgIGlmIChpc0ludmFsaWRNb2RlbCkge1xuICAgICAgICAvLyBwcm9wRXJyb3JzW1ZhbGlkYXRpb25LZXlzLlRZUEVdID0gXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0J3Mgbm90LlwiO1xuICAgICAgICBjb25zb2xlLndhcm4oXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0J3Mgbm90LlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IENvbnN0ciA9IE1vZGVsLmdldChkZXNpZ25UeXBlKSBhcyBhbnk7XG5cbiAgICAgICAgLy8gRW5zdXJlIGluc3RhbmNlIGlzIG9mIHRoZSBleHBlY3RlZCBtb2RlbCBjbGFzcy5cbiAgICAgICAgaWYgKCFDb25zdHIgfHwgIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cikpIHtcbiAgICAgICAgICBwcm9wRXJyb3JzW1ZhbGlkYXRpb25LZXlzLlRZUEVdID0gIUNvbnN0clxuICAgICAgICAgICAgPyBgVW5hYmxlIHRvIHZlcmlmeSB0eXBlIGNvbnNpc3RlbmN5LCBtaXNzaW5nIG1vZGVsIHJlZ2lzdHJ5IGZvciAke2Rlc2lnblR5cGV9IG9uIHByb3AgJHtwcm9wS2V5fWBcbiAgICAgICAgICAgIDogYFZhbHVlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgJHtDb25zdHIubmFtZX1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5lc3RlZEVycm9yc1twcm9wS2V5XSA9IGdldE5lc3RlZFZhbGlkYXRpb25FcnJvcnMoXG4gICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgYXN5bmNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHRvIHRoZSByZXN1bHQgaWYgd2UgaGF2ZSBhbnkgZXJyb3JzXG4gICAgLy8gQXN5bmMgbW9kZSByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHVuZGVmaW5lZCB3aGVuIG5vIGVycm9ycyBleGlzdFxuICAgIGlmIChPYmplY3Qua2V5cyhwcm9wRXJyb3JzKS5sZW5ndGggPiAwIHx8IGFzeW5jKVxuICAgICAgcmVzdWx0W3Byb3BLZXldID0gcHJvcEVycm9ycztcblxuICAgIC8vIFRoZW4gbWVyZ2UgYW55IG5lc3RlZCBlcnJvcnNcbiAgICBpZiAoIWFzeW5jKSB7XG4gICAgICBPYmplY3QuZW50cmllcyhuZXN0ZWRFcnJvcnNbcHJvcEtleV0gfHwge30pLmZvckVhY2goKFtrZXksIGVycm9yXSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdFtgJHtwcm9wS2V5fS4ke2tleX1gXSA9IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBTeW5jaHJvbm91cyByZXR1cm5cbiAgaWYgKCFhc3luYykge1xuICAgIHJldHVybiAoXG4gICAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDBcbiAgICAgICAgPyBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24ocmVzdWx0KVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICkgYXMgYW55O1xuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBhbnkgPSByZXN1bHQ7IC8vIFRPRE86IGFwcGx5IGZpbHRlcmluZ1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhtZXJnZWQpO1xuICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC52YWx1ZXMobWVyZ2VkKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcykudGhlbihhc3luYyAocmVzdWx0cykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogTW9kZWxFcnJvcnMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgW3BhcmVudFByb3AsIG5lc3RlZEVyclByb21pc2VdIG9mIE9iamVjdC5lbnRyaWVzKG5lc3RlZEVycm9ycykpIHtcbiAgICAgIGNvbnN0IG5lc3RlZFByb3BEZWNFcnJvcnMgPSAoYXdhaXQgbmVzdGVkRXJyUHJvbWlzZSkgYXMgUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIGFueVxuICAgICAgPjtcblxuICAgICAgaWYgKG5lc3RlZFByb3BEZWNFcnJvcnMpXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG5lc3RlZFByb3BEZWNFcnJvcnMpLmZvckVhY2goXG4gICAgICAgICAgKFtuZXN0ZWRQcm9wLCBuZXN0ZWRQcm9wRGVjRXJyb3JdKSA9PiB7XG4gICAgICAgICAgICBpZiAobmVzdGVkUHJvcERlY0Vycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmVzdGVkS2V5ID0gW3BhcmVudFByb3AsIG5lc3RlZFByb3BdLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgICByZXN1bHRbbmVzdGVkS2V5XSA9IG5lc3RlZFByb3BEZWNFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgcmVzID0gcmVzdWx0c1tpXTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIgJiYgcmVzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpW2tleV0gPSByZXMudmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAocmVzdWx0IGFzIGFueSlba2V5XSA9XG4gICAgICAgICAgcmVzLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IHJlcy5yZWFzb24ubWVzc2FnZVxuICAgICAgICAgICAgOiBTdHJpbmcocmVzLnJlYXNvbiB8fCBcIlZhbGlkYXRpb24gZmFpbGVkXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDBcbiAgICAgID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9KSBhcyBhbnk7XG59XG4iXX0=
|
|
@@ -96,7 +96,7 @@ export declare function step(value: number, message?: string): (target: any, pro
|
|
|
96
96
|
* @function minlength
|
|
97
97
|
* @category Property Decorators
|
|
98
98
|
*/
|
|
99
|
-
export declare function minlength(value: number, message?: string): (target:
|
|
99
|
+
export declare function minlength(value: number, message?: string): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void;
|
|
100
100
|
/**
|
|
101
101
|
* @summary Defines a maximum length for the property
|
|
102
102
|
* @description Validators to validate a decorated property must use key {@link ValidationKeys#MAX_LENGTH}
|
|
@@ -165,9 +165,11 @@ export function minlength(value, message = DEFAULT_ERROR_MESSAGES.MIN_LENGTH) {
|
|
|
165
165
|
description: `defines the min length of the attribute as ${value} (applies to strings or lists)`,
|
|
166
166
|
async: false,
|
|
167
167
|
};
|
|
168
|
-
return
|
|
169
|
-
|
|
170
|
-
|
|
168
|
+
return validationMetadata(minlength, key, meta);
|
|
169
|
+
//
|
|
170
|
+
// Decoration.for(key)
|
|
171
|
+
// .define(validationMetadata<MinLengthValidatorOptions>(minlength, key, meta))
|
|
172
|
+
// .apply();
|
|
171
173
|
}
|
|
172
174
|
/**
|
|
173
175
|
* @summary Defines a maximum length for the property
|
|
@@ -521,4 +523,4 @@ export function gte(propertyToCompare, message = DEFAULT_ERROR_MESSAGES.GREATER_
|
|
|
521
523
|
};
|
|
522
524
|
return validationMetadata(gte, Validation.key(ValidationKeys.GREATER_THAN_OR_EQUAL), { ...options, async: false });
|
|
523
525
|
}
|
|
524
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQW1CMUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsY0FBYyxHQUNmLGtDQUErQjtBQUNoQyxPQUFPLEVBQUUsRUFBRSxFQUFFLDhCQUF5QjtBQUV0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLDRCQUF1QjtBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlDQUE0QjtBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUFxQjtBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGlDQUE0QjtBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQ0FBcUI7QUFFOUM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUksU0FBYyxFQUFFLEdBQVcsRUFBRSxLQUFRO0lBQ3pFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0MsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLFVBQVUsS0FBSztJQUNuQixPQUFPLENBQUMsS0FBYSxFQUFRLEVBQUU7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDO1lBQzdELEtBQWEsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDMUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxV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QUFPLEVBQUUsT0FBTztRQUNoQixDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxpQkFBaUI7UUFDaEQsV0FBVyxFQUFFLHFDQUFxQyxpQkFBaUIsRUFBRTtLQUN0RSxDQUFDO0lBRUYsT0FBTyxrQkFBa0IsQ0FDdkIsRUFBRSxFQUNGLFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUMzQyxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQXdCLENBQ25ELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUNqQixpQkFBeUIsRUFDekIsVUFBa0Isc0JBQXNCLENBQUMscUJBQXFCO0lBRTlELE1BQU0sT0FBTyxHQUF1QztRQUNsRCxPQUFPLEVBQUUsT0FBTztRQUNoQixDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLGlCQUFpQjtRQUN6RCxXQUFXLEVBQUUsNENBQTRDLGlCQUFpQixFQUFFO0tBQzdFLENBQUM7SUFFRixPQUFPLGtCQUFrQixDQUN2QixHQUFHLEVBQ0gsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsRUFDcEQsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUF3QixDQUNuRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIERhdGVWYWxpZGF0b3JPcHRpb25zLFxuICBEaWZmVmFsaWRhdG9yT3B0aW9ucyxcbiAgRXF1YWxzVmFsaWRhdG9yT3B0aW9ucyxcbiAgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyxcbiAgR3JlYXRlclRoYW5WYWxpZGF0b3JPcHRpb25zLFxuICBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zLFxuICBMZXNzVGhhblZhbGlkYXRvck9wdGlvbnMsXG4gIExpc3RWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5WYWxpZGF0b3JPcHRpb25zLFxuICBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyxcbiAgU3RlcFZhbGlkYXRvck9wdGlvbnMsXG4gIFZhbGlkYXRpb25NZXRhZGF0YSxcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIERFRkFVTFRfUEFUVEVSTlMsXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiLi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vbW9kZWwvdHlwZXNcIjtcbmltcG9ydCB7IHBhcnNlRGF0ZSB9IGZyb20gXCIuLi91dGlscy9kYXRlc1wiO1xuaW1wb3J0IHsgcHJvcE1ldGFkYXRhIH0gZnJvbSBcIi4uL3V0aWxzL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi9WYWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL0RlY29yYXRpb25cIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBBU1lOQ19NRVRBX0tFWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tYmluZWQgcHJvcGVydHkgZGVjb3JhdG9yIGZhY3RvcnkgZm9yIG1ldGFkYXRhIGFuZCBhdHRyaWJ1dGUgbWFya2luZ1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IGJvdGggbWFya3MgYSBwcm9wZXJ0eSBhcyBhIG1vZGVsIGF0dHJpYnV0ZSBhbmQgYXNzaWducyBtZXRhZGF0YSB0byBpdFxuICpcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1Byb3BlcnR5RGVjb3JhdG9yfSBkZWNvcmF0b3IgLSBUaGUgbWV0YWRhdGEga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG1ldGFkYXRhIGtleVxuICogQHBhcmFtIHtWfSB2YWx1ZSAtIFRoZSBtZXRhZGF0YSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvcGVydHlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSAtIENvbWJpbmVkIGRlY29yYXRvciBmdW5jdGlvblxuICogQGZ1bmN0aW9uIHZhbGlkYXRpb25NZXRhZGF0YVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRpb25NZXRhZGF0YTxWPihkZWNvcmF0b3I6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBWKSB7XG4gIFZhbGlkYXRpb24ucmVnaXN0ZXJEZWNvcmF0b3Ioa2V5LCBkZWNvcmF0b3IpO1xuICByZXR1cm4gYXBwbHkocHJvcE1ldGFkYXRhPFY+KGtleSwgdmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzeW5jKCkge1xuICByZXR1cm4gKG1vZGVsOiBvYmplY3QpOiB2b2lkID0+IHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwgQVNZTkNfTUVUQV9LRVkpKVxuICAgICAgKG1vZGVsIGFzIGFueSlbQVNZTkNfTUVUQV9LRVldID0gdHJ1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgbWFya3MgYSBmaWVsZCBhcyByZXF1aXJlZFxuICogQHN1bW1hcnkgTWFya3MgdGhlIHByb3BlcnR5IGFzIHJlcXVpcmVkLCBjYXVzaW5nIHZhbGlkYXRpb24gdG8gZmFpbCBpZiB0aGUgcHJvcGVydHkgaXMgdW5kZWZpbmVkLCBudWxsLCBvciBlbXB0eS5cbiAqIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNSRVFVSVJFRH0uXG4gKiBUaGlzIGRlY29yYXRvciBpcyBjb21tb25seSB1c2VkIGFzIHRoZSBmaXJzdCB2YWxpZGF0aW9uIHN0ZXAgZm9yIGltcG9ydGFudCBmaWVsZHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNSRVFVSVJFRH1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqXG4gKiBAZnVuY3Rpb24gcmVxdWlyZWRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIge1xuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICpcbiAqICAgQHJlcXVpcmVkKFwiRW1haWwgYWRkcmVzcyBpcyBtYW5kYXRvcnlcIilcbiAqICAgZW1haWw6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRVFVSVJFRCkge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCk7XG4gIGNvbnN0IG1ldGE6IFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIGF0dHJpYnV0ZSBhcyByZXF1aXJlZGAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUodmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRvck9wdGlvbnM+KHJlcXVpcmVkLCBrZXksIG1ldGEpKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBlbmZvcmNlcyBhIG1pbmltdW0gdmFsdWUgY29uc3RyYWludFxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSwgY2F1c2luZyB2YWxpZGF0aW9uIHRvIGZhaWwgaWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIG1pbmltdW0uXG4gKiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUlOfS5cbiAqIFRoaXMgZGVjb3JhdG9yIHdvcmtzIHdpdGggbnVtZXJpYyB2YWx1ZXMgYW5kIGRhdGVzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyIHwgRGF0ZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgbWluaW11bSB2YWx1ZSBhbGxvd2VkLiBGb3IgZGF0ZXMsIGNhbiBiZSBhIERhdGUgb2JqZWN0IG9yIGEgc3RyaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscy4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUlOfVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICpcbiAqIEBmdW5jdGlvbiBtaW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFByb2R1Y3Qge1xuICogICBAbWluKDApXG4gKiAgIHByaWNlOiBudW1iZXI7XG4gKlxuICogICBAbWluKG5ldyBEYXRlKDIwMjMsIDAsIDEpLCBcIkRhdGUgbXVzdCBiZSBhZnRlciBKYW51YXJ5IDEsIDIwMjNcIilcbiAqICAgcmVsZWFzZURhdGU6IERhdGU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbihcbiAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUlOKTtcbiAgY29uc3QgbWV0YTogTWluVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuTUlOXTogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW051bWJlci5uYW1lLCBEYXRlLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgbWF4IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgYXMgJHt2YWx1ZX0gKGFwcGxpZXMgdG8gbnVtYmVycyBvciBEYXRlcylgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHZhbGlkYXRpb25NZXRhZGF0YTxNaW5WYWxpZGF0b3JPcHRpb25zPihtaW4sIGtleSwgbWV0YSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1heGltdW0gdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNNQVh9XG4gKlxuICogQHBhcmFtIHtudW1iZXIgfCBEYXRlfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYfVxuICpcbiAqIEBmdW5jdGlvbiBtYXhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgoXG4gIHZhbHVlOiBudW1iZXIgfCBEYXRlIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLk1BWCk7XG4gIGNvbnN0IG1ldGE6IE1heFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1BWF06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtOdW1iZXIubmFtZSwgRGF0ZS5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIG1heCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGFzICR7dmFsdWV9IChhcHBsaWVzIHRvIG51bWJlcnMgb3IgRGF0ZXMpYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh2YWxpZGF0aW9uTWV0YWRhdGE8TWF4VmFsaWRhdG9yT3B0aW9ucz4obWF4LCBrZXksIG1ldGEpKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBzdGVwIHZhbHVlIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjU1RFUH1cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1NURVB9XG4gKlxuICogQGZ1bmN0aW9uIHN0ZXBcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlNURVBcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5TVEVQKTtcbiAgY29uc3QgbWV0YTogU3RlcFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlNURVBdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbTnVtYmVyLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgc3RlcCBvZiB0aGUgYXR0cmlidXRlIGFzICR7dmFsdWV9YCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh2YWxpZGF0aW9uTWV0YWRhdGE8U3RlcFZhbGlkYXRvck9wdGlvbnM+KHN0ZXAsIGtleSwgbWV0YSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1pbmltdW0gbGVuZ3RoIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUlOX0xFTkdUSH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTl9MRU5HVEh9XG4gKlxuICogQGZ1bmN0aW9uIG1pbmxlbmd0aFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbmxlbmd0aChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NSU5fTEVOR1RIXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSCk7XG4gIGNvbnN0IG1ldGE6IE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEhdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUsIFNldC5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIG1pbiBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfSAoYXBwbGllcyB0byBzdHJpbmdzIG9yIGxpc3RzKWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUodmFsaWRhdGlvbk1ldGFkYXRhPE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnM+KG1pbmxlbmd0aCwga2V5LCBtZXRhKSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWF4aW11bSBsZW5ndGggZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNNQVhfTEVOR1RIfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAZnVuY3Rpb24gbWF4bGVuZ3RoXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4bGVuZ3RoKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWF9MRU5HVEhcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIKTtcbiAgY29uc3QgbWV0YTogTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZSwgQXJyYXkubmFtZSwgU2V0Lm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgbWF4IGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIGFzICR7dmFsdWV9IChhcHBsaWVzIHRvIHN0cmluZ3Mgb3IgbGlzdHMpYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh2YWxpZGF0aW9uTWV0YWRhdGE8TWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucz4obWF4bGVuZ3RoLCBrZXksIG1ldGEpKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBSZWdFeHAgcGF0dGVybiB0aGUgcHJvcGVydHkgbXVzdCByZXNwZWN0XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBVFRFUk59XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVRURVJOfVxuICpcbiAqIEBmdW5jdGlvbiBwYXR0ZXJuXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0dGVybihcbiAgdmFsdWU6IFJlZ0V4cCB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVRURVJOXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuUEFUVEVSTik7XG4gIGNvbnN0IG1ldGE6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTpcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgYXNzaWducyB0aGUgJHt2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKX0gcGF0dGVybiB0byB0aGUgYXR0cmlidXRlYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh2YWxpZGF0aW9uTWV0YWRhdGE8UGF0dGVyblZhbGlkYXRvck9wdGlvbnM+KHBhdHRlcm4sIGtleSwgbWV0YSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgcHJvcGVydHkgYXMgYW4gZW1haWxcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjRU1BSUx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRU1BSUx9XG4gKlxuICogQGZ1bmN0aW9uIGVtYWlsXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZW1haWwobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FTUFJTCkge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5FTUFJTCk7XG4gIGNvbnN0IG1ldGE6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTogREVGQVVMVF9QQVRURVJOUy5FTUFJTC50b1N0cmluZygpLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IFwibWFya3MgdGhlIGF0dHJpYnV0ZSBhcyBhbiBlbWFpbFwiLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHZhbGlkYXRpb25NZXRhZGF0YTxQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucz4oZW1haWwsIGtleSwgbWV0YSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgcHJvcGVydHkgYXMgYW4gVVJMXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1VSTH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNVUkx9XG4gKlxuICogQGZ1bmN0aW9uIHVybFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybChtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlVSTCkge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5VUkwpO1xuICBjb25zdCBtZXRhOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06IERFRkFVTFRfUEFUVEVSTlMuVVJMLnRvU3RyaW5nKCksXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogXCJtYXJrcyB0aGUgYXR0cmlidXRlIGFzIGFuIHVybFwiLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHZhbGlkYXRpb25NZXRhZGF0YTxQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucz4odXJsLCBrZXksIG1ldGEpKVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVNZXRhZGF0YSBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBjdXN0b21UeXBlczogc3RyaW5nW10gfCBzdHJpbmc7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRW5mb3JjZXMgdHlwZSB2ZXJpZmljYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjVFlQRX1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nfSB0eXBlcyBhY2NlcHRlZCB0eXBlc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVFlQRX1cbiAqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGUoXG4gIHR5cGVzOiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVFlQRSk7XG4gIGNvbnN0IG1ldGE6IFR5cGVNZXRhZGF0YSA9IHtcbiAgICBjdXN0b21UeXBlczogdHlwZXMsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBkZXNjcmlwdGlvbjogXCJkZWZpbmVzIHRoZSBhY2NlcHRlZCB0eXBlcyBmb3IgdGhlIGF0dHJpYnV0ZVwiLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHZhbGlkYXRpb25NZXRhZGF0YTxUeXBlTWV0YWRhdGE+KHR5cGUsIGtleSwgbWV0YSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZU1ldGFkYXRhIGV4dGVuZHMgRGF0ZVZhbGlkYXRvck9wdGlvbnMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBIYW5kbGVyIERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNEQVRFfVxuICpcbiAqIFdpbGwgZW5mb3JjZSBzZXJpYWxpemF0aW9uIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgZm9ybWF0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCBhY2NlcHRlZCBmb3JtYXQgYWNjb3JkaW5nIHRvIHtAbGluayBmb3JtYXREYXRlfVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjREFURX1cbiAqXG4gKiBAZnVuY3Rpb24gZGF0ZVxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRlKFxuICBmb3JtYXQ6IHN0cmluZyA9IFwiZGQvTU0veXl5eVwiLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRBVEVcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5EQVRFKTtcbiAgY29uc3QgbWV0YTogRGF0ZU1ldGFkYXRhID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5GT1JNQVRdOiBmb3JtYXQsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW0RhdGUubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBhdHRyaWJ1dGUgYXMgYSBkYXRlIHdpdGggdGhlIGZvcm1hdCAke2Zvcm1hdH1gLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgY29uc3QgZGF0ZURlYyA9ICh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHByb3BlcnR5S2V5PzogYW55KTogYW55ID0+IHtcbiAgICB2YWxpZGF0aW9uTWV0YWRhdGEoZGF0ZSwga2V5LCBtZXRhKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHNldCh0aGlzOiBhbnksIG5ld1ZhbHVlOiBzdHJpbmcgfCBEYXRlKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKVxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6ICgpID0+IHZhbHVlcy5nZXQodGhpcyksXG4gICAgICAgICAgICBzZXQ6IChuZXdWYWx1ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICBsZXQgdmFsOiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhbCA9IHBhcnNlRGF0ZShmb3JtYXQsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIHZhbCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioc2YoXCJGYWlsZWQgdG8gcGFyc2UgZGF0ZTogezB9XCIsIGUubWVzc2FnZSB8fCBlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIHRoaXNbcHJvcGVydHlLZXldID0gbmV3VmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0KCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcImhlcmVcIik7XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KS5kZWZpbmUoZGF0ZURlYykuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBQYXNzd29yZCBIYW5kbGVyIERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNQQVNTV09SRH1cbiAqXG4gKiBAcGFyYW0ge1JlZ0V4cH0gW3BhdHRlcm5dIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1BBVFRFUk5TI0NIQVI4X09ORV9PRl9FQUNIfVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFTU1dPUkR9XG4gKlxuICogQGZ1bmN0aW9uIHBhc3N3b3JkXG4gKlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhc3N3b3JkKFxuICBwYXR0ZXJuOiBSZWdFeHAgPSBERUZBVUxUX1BBVFRFUk5TLlBBU1NXT1JELkNIQVI4X09ORV9PRl9FQUNILFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlBBU1NXT1JEXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuUEFTU1dPUkQpO1xuICBjb25zdCBtZXRhOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06IHBhdHRlcm4udG9TdHJpbmcoKSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgYXR0cmlidXRlIGFzIGEgcGFzc3dvcmRgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHZhbGlkYXRpb25NZXRhZGF0YShwYXNzd29yZCwga2V5LCBtZXRhKSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0TWV0YWRhdGEgZXh0ZW5kcyBMaXN0VmFsaWRhdG9yT3B0aW9ucyB7XG4gIHR5cGU6IFwiQXJyYXlcIiB8IFwiU2V0XCI7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgTGlzdCBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBBbHNvIHNldHMgdGhlIHtAbGluayB0eXBlfSB0byB0aGUgcHJvdmlkZWQgY29sbGVjdGlvblxuICpcbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcn0gY2xhenpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29sbGVjdGlvbl0gVGhlIGNvbGxlY3Rpb24gYmVpbmcgdXNlZC4gZGVmYXVsdHMgdG8gQXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTElTVH1cbiAqXG4gKiBAZnVuY3Rpb24gbGlzdFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0KFxuICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8IENvbnN0cnVjdG9yPGFueT5bXSxcbiAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MSVNUXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTElTVCk7XG4gIGNvbnN0IG1ldGE6IExpc3RNZXRhZGF0YSA9IHtcbiAgICBjbGF6ejogQXJyYXkuaXNBcnJheShjbGF6eikgPyBjbGF6ei5tYXAoKGMpID0+IGMubmFtZSkgOiBbY2xhenoubmFtZV0sXG4gICAgdHlwZTogY29sbGVjdGlvbixcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIGF0dHJpYnV0ZSBhcyBhICR7Y29sbGVjdGlvbn0gb2YgJHsoY2xhenogYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+KS5uYW1lfWAsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh2YWxpZGF0aW9uTWV0YWRhdGEobGlzdCwga2V5LCBtZXRhKSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBTZXQgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gV3JhcHBlciBmb3Ige0BsaW5rIGxpc3R9IHdpdGggdGhlICdTZXQnIENvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3J9IGNsYXp6XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKlxuICogQGZ1bmN0aW9uIHNldFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQoXG4gIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVFxuKSB7XG4gIHJldHVybiBsaXN0KGNsYXp6LCBcIlNldFwiLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCB0byBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRVFVQUxTfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGVxdWFsaXR5IGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFNdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBlcXVhbGl0eSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBlcVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVRVUFMU1xuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuRVFVQUxTXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBlcXVhbCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGVxLFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkVRVUFMUyksXG4gICAgeyAuLi5vcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRElGRn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGRpZmZlcmVuY2UgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZGlmZlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmYoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRlxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IERpZmZWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkRJRkZdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGRpZmZlcmVudCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGRpZmYsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRElGRiksXG4gICAge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGFzeW5jOiBmYWxzZSxcbiAgICB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlY2xhcmVzIHRoYXQgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IGJlIGxlc3MgdGhhbiBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuTEVTU19USEFOfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGxlc3MgdGhhbiB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBsdFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGx0KFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTlxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5dOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGxlc3MgdGhhbiB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGx0LFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTiksXG4gICAgeyAuLi5vcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTH0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGVxdWFsIG9yIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUxdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBsZXNzIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gbHRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbHRlKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl9PUl9FUVVBTFxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBsZXNzIG9yIGVxdWFsIHRvICR7cHJvcGVydHlUb0NvbXBhcmV9YCxcbiAgfTtcblxuICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgbHRlLFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTCksXG4gICAgeyAuLi5vcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5dIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBncmVhdGVyIHRoYW4gdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZ3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBndChcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5cbikge1xuICBjb25zdCBvcHRpb25zOiBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBncmVhdGVyIHRoYW4gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBndCxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU4pLFxuICAgIHsgLi4ub3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUx9IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOX09SX0VRVUFMXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIHJldHVybiBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGd0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGd0ZShcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxcbikge1xuICBjb25zdCBvcHRpb25zOiBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTF06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgZ3JlYXRlciBvciBlcXVhbCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGd0ZSxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwpLFxuICAgIHsgLi4ub3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG4iXX0=
|
|
526
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQW1CMUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsY0FBYyxHQUNmLGtDQUErQjtBQUNoQyxPQUFPLEVBQUUsRUFBRSxFQUFFLDhCQUF5QjtBQUV0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLDRCQUF1QjtBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlDQUE0QjtBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUFxQjtBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGlDQUE0QjtBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQ0FBcUI7QUFFOUM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUksU0FBYyxFQUFFLEdBQVcsRUFBRSxLQUFRO0lBQ3pFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0MsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLFVBQVUsS0FBSztJQUNuQixPQUFPLENBQUMsS0FBYSxFQUFRLEVBQUU7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDO1lBQzdELEtBQWEsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDMUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxV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Q0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUUsaUJBQWlCO1FBQ2hELFdBQVcsRUFBRSxxQ0FBcUMsaUJBQWlCLEVBQUU7S0FDdEUsQ0FBQztJQUVGLE9BQU8sa0JBQWtCLENBQ3ZCLEVBQUUsRUFDRixVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFDM0MsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUF3QixDQUNuRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsQ0FDakIsaUJBQXlCLEVBQ3pCLFVBQWtCLHNCQUFzQixDQUFDLHFCQUFxQjtJQUU5RCxNQUFNLE9BQU8sR0FBdUM7UUFDbEQsT0FBTyxFQUFFLE9BQU87UUFDaEIsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsRUFBRSxpQkFBaUI7UUFDekQsV0FBVyxFQUFFLDRDQUE0QyxpQkFBaUIsRUFBRTtLQUM3RSxDQUFDO0lBRUYsT0FBTyxrQkFBa0IsQ0FDdkIsR0FBRyxFQUNILFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLEVBQ3BELEVBQUUsR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBd0IsQ0FDbkQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBEYXRlVmFsaWRhdG9yT3B0aW9ucyxcbiAgRGlmZlZhbGlkYXRvck9wdGlvbnMsXG4gIEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMsXG4gIEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMsXG4gIEdyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9ucyxcbiAgTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyxcbiAgTGVzc1RoYW5WYWxpZGF0b3JPcHRpb25zLFxuICBMaXN0VmFsaWRhdG9yT3B0aW9ucyxcbiAgTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyxcbiAgTWF4VmFsaWRhdG9yT3B0aW9ucyxcbiAgTWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyxcbiAgTWluVmFsaWRhdG9yT3B0aW9ucyxcbiAgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMsXG4gIFN0ZXBWYWxpZGF0b3JPcHRpb25zLFxuICBWYWxpZGF0aW9uTWV0YWRhdGEsXG4gIFZhbGlkYXRvck9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBERUZBVUxUX1BBVFRFUk5TLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIi4vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIi4uL21vZGVsL3R5cGVzXCI7XG5pbXBvcnQgeyBwYXJzZURhdGUgfSBmcm9tIFwiLi4vdXRpbHMvZGF0ZXNcIjtcbmltcG9ydCB7IHByb3BNZXRhZGF0YSB9IGZyb20gXCIuLi91dGlscy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSBcIi4vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiB9IGZyb20gXCIuLi91dGlscy9EZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBhcHBseSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQVNZTkNfTUVUQV9LRVkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbWJpbmVkIHByb3BlcnR5IGRlY29yYXRvciBmYWN0b3J5IGZvciBtZXRhZGF0YSBhbmQgYXR0cmlidXRlIG1hcmtpbmdcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBib3RoIG1hcmtzIGEgcHJvcGVydHkgYXMgYSBtb2RlbCBhdHRyaWJ1dGUgYW5kIGFzc2lnbnMgbWV0YWRhdGEgdG8gaXRcbiAqXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtQcm9wZXJ0eURlY29yYXRvcn0gZGVjb3JhdG9yIC0gVGhlIG1ldGFkYXRhIGtleVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBtZXRhZGF0YSBrZXlcbiAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBUaGUgbWV0YWRhdGEgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHByb3BlcnR5XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gLSBDb21iaW5lZCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqIEBmdW5jdGlvbiB2YWxpZGF0aW9uTWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0aW9uTWV0YWRhdGE8Vj4oZGVjb3JhdG9yOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogVikge1xuICBWYWxpZGF0aW9uLnJlZ2lzdGVyRGVjb3JhdG9yKGtleSwgZGVjb3JhdG9yKTtcbiAgcmV0dXJuIGFwcGx5KHByb3BNZXRhZGF0YTxWPihrZXksIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3luYygpIHtcbiAgcmV0dXJuIChtb2RlbDogb2JqZWN0KTogdm9pZCA9PiB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIEFTWU5DX01FVEFfS0VZKSlcbiAgICAgIChtb2RlbCBhcyBhbnkpW0FTWU5DX01FVEFfS0VZXSA9IHRydWU7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IG1hcmtzIGEgZmllbGQgYXMgcmVxdWlyZWRcbiAqIEBzdW1tYXJ5IE1hcmtzIHRoZSBwcm9wZXJ0eSBhcyByZXF1aXJlZCwgY2F1c2luZyB2YWxpZGF0aW9uIHRvIGZhaWwgaWYgdGhlIHByb3BlcnR5IGlzIHVuZGVmaW5lZCwgbnVsbCwgb3IgZW1wdHkuXG4gKiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjUkVRVUlSRUR9LlxuICogVGhpcyBkZWNvcmF0b3IgaXMgY29tbW9ubHkgdXNlZCBhcyB0aGUgZmlyc3QgdmFsaWRhdGlvbiBzdGVwIGZvciBpbXBvcnRhbnQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscy4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUkVRVUlSRUR9XG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKlxuICogQGZ1bmN0aW9uIHJlcXVpcmVkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEByZXF1aXJlZChcIkVtYWlsIGFkZHJlc3MgaXMgbWFuZGF0b3J5XCIpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVRVUlSRUQpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpO1xuICBjb25zdCBtZXRhOiBWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBhdHRyaWJ1dGUgYXMgcmVxdWlyZWRgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0b3JPcHRpb25zPihyZXF1aXJlZCwga2V5LCBtZXRhKSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgZW5mb3JjZXMgYSBtaW5pbXVtIHZhbHVlIGNvbnN0cmFpbnRcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtaW5pbXVtIHZhbHVlIGZvciB0aGUgcHJvcGVydHksIGNhdXNpbmcgdmFsaWRhdGlvbiB0byBmYWlsIGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCBtaW5pbXVtLlxuICogVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01JTn0uXG4gKiBUaGlzIGRlY29yYXRvciB3b3JrcyB3aXRoIG51bWVyaWMgdmFsdWVzIGFuZCBkYXRlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlciB8IERhdGUgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZC4gRm9yIGRhdGVzLCBjYW4gYmUgYSBEYXRlIG9iamVjdCBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTn1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqXG4gKiBAZnVuY3Rpb24gbWluXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBQcm9kdWN0IHtcbiAqICAgQG1pbigwKVxuICogICBwcmljZTogbnVtYmVyO1xuICpcbiAqICAgQG1pbihuZXcgRGF0ZSgyMDIzLCAwLCAxKSwgXCJEYXRlIG11c3QgYmUgYWZ0ZXIgSmFudWFyeSAxLCAyMDIzXCIpXG4gKiAgIHJlbGVhc2VEYXRlOiBEYXRlO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW4oXG4gIHZhbHVlOiBudW1iZXIgfCBEYXRlIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTlxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLk1JTik7XG4gIGNvbnN0IG1ldGE6IE1pblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1JTl06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtOdW1iZXIubmFtZSwgRGF0ZS5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIG1heCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGFzICR7dmFsdWV9IChhcHBsaWVzIHRvIG51bWJlcnMgb3IgRGF0ZXMpYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh2YWxpZGF0aW9uTWV0YWRhdGE8TWluVmFsaWRhdG9yT3B0aW9ucz4obWluLCBrZXksIG1ldGEpKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtYXhpbXVtIHZhbHVlIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUFYfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyIHwgRGF0ZX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWH1cbiAqXG4gKiBAZnVuY3Rpb24gbWF4XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4KFxuICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVhcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NQVgpO1xuICBjb25zdCBtZXRhOiBNYXhWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5NQVhdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbTnVtYmVyLm5hbWUsIERhdGUubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBtYXggdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfSAoYXBwbGllcyB0byBudW1iZXJzIG9yIERhdGVzKWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUodmFsaWRhdGlvbk1ldGFkYXRhPE1heFZhbGlkYXRvck9wdGlvbnM+KG1heCwga2V5LCBtZXRhKSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgc3RlcCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1NURVB9XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNTVEVQfVxuICpcbiAqIEBmdW5jdGlvbiBzdGVwXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3RlcChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5TVEVQXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuU1RFUCk7XG4gIGNvbnN0IG1ldGE6IFN0ZXBWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5TVEVQXTogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW051bWJlci5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIHN0ZXAgb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUodmFsaWRhdGlvbk1ldGFkYXRhPFN0ZXBWYWxpZGF0b3JPcHRpb25zPihzdGVwLCBrZXksIG1ldGEpKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtaW5pbXVtIGxlbmd0aCBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01JTl9MRU5HVEh9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNSU5fTEVOR1RIfVxuICpcbiAqIEBmdW5jdGlvbiBtaW5sZW5ndGhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW5sZW5ndGgoXG4gIHZhbHVlOiBudW1iZXIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOX0xFTkdUSFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEgpO1xuICBjb25zdCBtZXRhOiBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIXTogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lLCBBcnJheS5uYW1lLCBTZXQubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBtaW4gbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgYXMgJHt2YWx1ZX0gKGFwcGxpZXMgdG8gc3RyaW5ncyBvciBsaXN0cylgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YShtaW5sZW5ndGgsIGtleSwgbWV0YSk7XG4gIC8vXG4gIC8vIERlY29yYXRpb24uZm9yKGtleSlcbiAgLy8gICAuZGVmaW5lKHZhbGlkYXRpb25NZXRhZGF0YTxNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zPihtaW5sZW5ndGgsIGtleSwgbWV0YSkpXG4gIC8vICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1heGltdW0gbGVuZ3RoIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWF9MRU5HVEh9XG4gKlxuICogQGZ1bmN0aW9uIG1heGxlbmd0aFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heGxlbmd0aChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVhfTEVOR1RIXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSCk7XG4gIGNvbnN0IG1ldGE6IE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUsIFNldC5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIG1heCBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfSAoYXBwbGllcyB0byBzdHJpbmdzIG9yIGxpc3RzKWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUodmFsaWRhdGlvbk1ldGFkYXRhPE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnM+KG1heGxlbmd0aCwga2V5LCBtZXRhKSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgUmVnRXhwIHBhdHRlcm4gdGhlIHByb3BlcnR5IG11c3QgcmVzcGVjdFxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNQQVRURVJOfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFUVEVSTn1cbiAqXG4gKiBAZnVuY3Rpb24gcGF0dGVyblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdHRlcm4oXG4gIHZhbHVlOiBSZWdFeHAgfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUEFUVEVSTlxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pO1xuICBjb25zdCBtZXRhOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGFzc2lnbnMgdGhlICR7dmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCl9IHBhdHRlcm4gdG8gdGhlIGF0dHJpYnV0ZWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUodmFsaWRhdGlvbk1ldGFkYXRhPFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zPihwYXR0ZXJuLCBrZXksIG1ldGEpKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByb3BlcnR5IGFzIGFuIGVtYWlsXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI0VNQUlMfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0VNQUlMfVxuICpcbiAqIEBmdW5jdGlvbiBlbWFpbFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRU1BSUwpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRU1BSUwpO1xuICBjb25zdCBtZXRhOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06IERFRkFVTFRfUEFUVEVSTlMuRU1BSUwudG9TdHJpbmcoKSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBcIm1hcmtzIHRoZSBhdHRyaWJ1dGUgYXMgYW4gZW1haWxcIixcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh2YWxpZGF0aW9uTWV0YWRhdGE8UGF0dGVyblZhbGlkYXRvck9wdGlvbnM+KGVtYWlsLCBrZXksIG1ldGEpKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByb3BlcnR5IGFzIGFuIFVSTFxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNVUkx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVVJMfVxuICpcbiAqIEBmdW5jdGlvbiB1cmxcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmwobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5VUkwpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVVJMKTtcbiAgY29uc3QgbWV0YTogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBERUZBVUxUX1BBVFRFUk5TLlVSTC50b1N0cmluZygpLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IFwibWFya3MgdGhlIGF0dHJpYnV0ZSBhcyBhbiB1cmxcIixcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh2YWxpZGF0aW9uTWV0YWRhdGE8UGF0dGVyblZhbGlkYXRvck9wdGlvbnM+KHVybCwga2V5LCBtZXRhKSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlTWV0YWRhdGEgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgY3VzdG9tVHlwZXM6IHN0cmluZ1tdIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEVuZm9yY2VzIHR5cGUgdmVyaWZpY2F0aW9uXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1RZUEV9XG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gdHlwZXMgYWNjZXB0ZWQgdHlwZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1RZUEV9XG4gKlxuICogQGZ1bmN0aW9uIHR5cGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlKFxuICB0eXBlczogc3RyaW5nW10gfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRVxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlRZUEUpO1xuICBjb25zdCBtZXRhOiBUeXBlTWV0YWRhdGEgPSB7XG4gICAgY3VzdG9tVHlwZXM6IHR5cGVzLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgZGVzY3JpcHRpb246IFwiZGVmaW5lcyB0aGUgYWNjZXB0ZWQgdHlwZXMgZm9yIHRoZSBhdHRyaWJ1dGVcIixcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh2YWxpZGF0aW9uTWV0YWRhdGE8VHlwZU1ldGFkYXRhPih0eXBlLCBrZXksIG1ldGEpKVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVNZXRhZGF0YSBleHRlbmRzIERhdGVWYWxpZGF0b3JPcHRpb25zIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERhdGUgSGFuZGxlciBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjREFURX1cbiAqXG4gKiBXaWxsIGVuZm9yY2Ugc2VyaWFsaXphdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgYWNjZXB0ZWQgZm9ybWF0IGFjY29yZGluZyB0byB7QGxpbmsgZm9ybWF0RGF0ZX1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RBVEV9XG4gKlxuICogQGZ1bmN0aW9uIGRhdGVcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZShcbiAgZm9ybWF0OiBzdHJpbmcgPSBcImRkL01NL3l5eXlcIixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5EQVRFXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuREFURSk7XG4gIGNvbnN0IG1ldGE6IERhdGVNZXRhZGF0YSA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuRk9STUFUXTogZm9ybWF0LFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtEYXRlLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgYXR0cmlidXRlIGFzIGEgZGF0ZSB3aXRoIHRoZSBmb3JtYXQgJHtmb3JtYXR9YCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIGNvbnN0IGRhdGVEZWMgPSAodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcm9wZXJ0eUtleT86IGFueSk6IGFueSA9PiB7XG4gICAgdmFsaWRhdGlvbk1ldGFkYXRhKGRhdGUsIGtleSwgbWV0YSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBzZXQodGhpczogYW55LCBuZXdWYWx1ZTogc3RyaW5nIHwgRGF0ZSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIGlmICghZGVzY3JpcHRvciB8fCBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSlcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiB2YWx1ZXMuZ2V0KHRoaXMpLFxuICAgICAgICAgICAgc2V0OiAobmV3VmFsdWU6IHN0cmluZyB8IERhdGUgfCBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHZhbDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YWwgPSBwYXJzZURhdGUoZm9ybWF0LCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnNldCh0aGlzLCB2YWwpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHNmKFwiRmFpbGVkIHRvIHBhcnNlIGRhdGU6IHswfVwiLCBlLm1lc3NhZ2UgfHwgZSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzW3Byb3BlcnR5S2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgfSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJoZXJlXCIpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSkuZGVmaW5lKGRhdGVEZWMpLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUGFzc3dvcmQgSGFuZGxlciBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjUEFTU1dPUkR9XG4gKlxuICogQHBhcmFtIHtSZWdFeHB9IFtwYXR0ZXJuXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9QQVRURVJOUyNDSEFSOF9PTkVfT0ZfRUFDSH1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1BBU1NXT1JEfVxuICpcbiAqIEBmdW5jdGlvbiBwYXNzd29yZFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXNzd29yZChcbiAgcGF0dGVybjogUmVnRXhwID0gREVGQVVMVF9QQVRURVJOUy5QQVNTV09SRC5DSEFSOF9PTkVfT0ZfRUFDSCxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVNTV09SRFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlBBU1NXT1JEKTtcbiAgY29uc3QgbWV0YTogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBwYXR0ZXJuLnRvU3RyaW5nKCksXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGF0dHJpYnV0ZSBhcyBhIHBhc3N3b3JkYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh2YWxpZGF0aW9uTWV0YWRhdGEocGFzc3dvcmQsIGtleSwgbWV0YSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdE1ldGFkYXRhIGV4dGVuZHMgTGlzdFZhbGlkYXRvck9wdGlvbnMge1xuICB0eXBlOiBcIkFycmF5XCIgfCBcIlNldFwiO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IExpc3QgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gQWxzbyBzZXRzIHRoZSB7QGxpbmsgdHlwZX0gdG8gdGhlIHByb3ZpZGVkIGNvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3J9IGNsYXp6XG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvbGxlY3Rpb25dIFRoZSBjb2xsZWN0aW9uIGJlaW5nIHVzZWQuIGRlZmF1bHRzIHRvIEFycmF5XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKlxuICogQGZ1bmN0aW9uIGxpc3RcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdChcbiAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCBDb25zdHJ1Y3Rvcjxhbnk+W10sXG4gIGNvbGxlY3Rpb246IFwiQXJyYXlcIiB8IFwiU2V0XCIgPSBcIkFycmF5XCIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxJU1QpO1xuICBjb25zdCBtZXRhOiBMaXN0TWV0YWRhdGEgPSB7XG4gICAgY2xheno6IEFycmF5LmlzQXJyYXkoY2xhenopID8gY2xhenoubWFwKChjKSA9PiBjLm5hbWUpIDogW2NsYXp6Lm5hbWVdLFxuICAgIHR5cGU6IGNvbGxlY3Rpb24sXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhc3luYzogZmFsc2UsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBhdHRyaWJ1dGUgYXMgYSAke2NvbGxlY3Rpb259IG9mICR7KGNsYXp6IGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PikubmFtZX1gLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUodmFsaWRhdGlvbk1ldGFkYXRhKGxpc3QsIGtleSwgbWV0YSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgU2V0IERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIFdyYXBwZXIgZm9yIHtAbGluayBsaXN0fSB3aXRoIHRoZSAnU2V0JyBDb2xsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yfSBjbGF6elxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMSVNUfVxuICpcbiAqIEBmdW5jdGlvbiBzZXRcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0KFxuICBjbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxJU1Rcbikge1xuICByZXR1cm4gbGlzdChjbGF6eiwgXCJTZXRcIiwgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZXF1YWwgdG8gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkVRVUFMU30gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIG1hdGNoZXMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBlcXVhbGl0eSBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuRVFVQUxTXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIHJldHVybiBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgZXF1YWxpdHkgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZXFcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcShcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFNcbikge1xuICBjb25zdCBvcHRpb25zOiBFcXVhbHNWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkVRVUFMU106IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgZXF1YWwgdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBlcSxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5FUVVBTFMpLFxuICAgIHsgLi4ub3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZGlmZmVyZW50IGZyb20gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkRJRkZ9IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGRpZmZlcmVuY2UgYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRJRkZdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBkaWZmZXJlbmNlIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGRpZmZcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRJRkZcbikge1xuICBjb25zdCBvcHRpb25zOiBEaWZmVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5ESUZGXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBkaWZmZXJlbnQgdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBkaWZmLFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkRJRkYpLFxuICAgIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBhc3luYzogZmFsc2UsXG4gICAgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5dIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBsZXNzIHRoYW4gdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gbHRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsdChcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5cbikge1xuICBjb25zdCBvcHRpb25zOiBMZXNzVGhhblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBsZXNzIHRoYW4gdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBsdCxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU4pLFxuICAgIHsgLi4ub3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUx9IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBlcXVhbCBvciBsZXNzIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuTEVTU19USEFOX09SX0VRVUFMXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIHJldHVybiBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgbGVzcyB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGx0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGx0ZShcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUxcbikge1xuICBjb25zdCBvcHRpb25zOiBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTF06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgbGVzcyBvciBlcXVhbCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGx0ZSxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUwpLFxuICAgIHsgLi4ub3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZ3JlYXRlciB0aGFuIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU59IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIHJldHVybiBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgZ3JlYXRlciB0aGFuIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGd0XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ3QoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOXG4pIHtcbiAgY29uc3Qgb3B0aW9uczogR3JlYXRlclRoYW5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgZ3JlYXRlciB0aGFuICR7cHJvcGVydHlUb0NvbXBhcmV9YCxcbiAgfTtcblxuICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgZ3QsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOKSxcbiAgICB7IC4uLm9wdGlvbnMsIGFzeW5jOiBmYWxzZSB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlY2xhcmVzIHRoYXQgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkdSRUFURVJfVEhBTl9PUl9FUVVBTF0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBndGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBndGUoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOX09SX0VRVUFMXG4pIHtcbiAgY29uc3Qgb3B0aW9uczogR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBndGUsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMKSxcbiAgICB7IC4uLm9wdGlvbnMsIGFzeW5jOiBmYWxzZSB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuIl19
|
package/lib/index.cjs
CHANGED
|
@@ -33,5 +33,5 @@ __exportStar(require("./model/index.cjs"), exports);
|
|
|
33
33
|
* @const VERSION
|
|
34
34
|
* @memberOf module:decorator-validation
|
|
35
35
|
*/
|
|
36
|
-
exports.VERSION = "1.7.
|
|
36
|
+
exports.VERSION = "1.7.12";
|
|
37
37
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7O0dBTUc7QUFDSCx3REFBNEI7QUFDNUIsb0RBQXdCO0FBQ3hCLG9EQUF3QjtBQUN4Qix5REFBNkI7QUFDN0Isb0RBQXdCO0FBRXhCOzs7OztHQUtHO0FBQ1UsUUFBQSxPQUFPLEdBQUcsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAZGVzY3JpcHRpb24gVHlwZVNjcmlwdCBkZWNvcmF0b3ItYmFzZWQgdmFsaWRhdGlvbiBsaWJyYXJ5XG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgdXNpbmcgVHlwZVNjcmlwdCBkZWNvcmF0b3JzLlxuICogSXQgZXhwb3NlcyB1dGlsaXR5IGZ1bmN0aW9ucywgdmFsaWRhdGlvbiBkZWNvcmF0b3JzLCBhbmQgbW9kZWwtcmVsYXRlZCBmdW5jdGlvbmFsaXR5IGZvclxuICogaW1wbGVtZW50aW5nIHR5cGUtc2FmZSwgZGVjbGFyYXRpdmUgdmFsaWRhdGlvbiBpbiBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcmVmbGVjdGlvbiBwYWNrYWdlXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
|
package/lib/index.d.ts
CHANGED