@ui-tool/core
Version:
211 lines • 27 kB
JavaScript
import { FormArray, FormControl, FormControlDirective, FormGroup } from '@angular/forms';
import { merge as lodashMerge } from 'lodash-es';
import { ValidationMessage } from '../../../../models/implementations/validation-summarizers/validation-message';
import { builtInValidationMessages } from '../../../../constants/built-in-validation-message.constant';
import { v4 as uuid } from 'uuid';
import { ValidationSummarizerBaseService } from './validation-summarizer-base.service';
export class ValidationSummarizerService extends ValidationSummarizerBaseService {
//#region Constructor
// tslint:disable-next-line:max-line-length
constructor(validationSummarizerOptionProvider) {
// Call base method.
super(validationSummarizerOptionProvider?.getOption()?.groupId || uuid());
this.validationSummarizerOptionProvider = validationSummarizerOptionProvider;
const option = this.validationSummarizerOptionProvider
.getOption() || {};
this._validatorNameToValidationMessage = lodashMerge(builtInValidationMessages, option.validationMessages || {});
}
//#endregion
//#region Methods
getId() {
return this._id;
}
// Get a single control validation message.
loadControlValidationMessage(controlLabel, control) {
const messages = this.loadControlValidationMessages(controlLabel, control);
if (!messages) {
return null;
}
return messages[0];
}
// Get all control validation messages.
loadControlValidationMessages(controlLabel, control) {
// Invalid control.
if (!control) {
return null;
}
// List of validation messages.
const messages = [];
if (!control.errors || !control.errors) {
return [];
}
const keys = Object.keys(control.errors);
for (const key of keys) {
if (!control.hasError(key)) {
continue;
}
let boundValue = '';
if (key === 'min' || key === 'max') {
boundValue = control.errors[key][key];
}
else if (key === 'minlength' || key === 'maxlength') {
boundValue = control.errors[key].requiredLength;
}
else {
boundValue = control.errors[key];
}
const additionalValue = {};
if (key && key.length && boundValue) {
additionalValue[key] = boundValue;
}
const message = this.buildValidationMessage(controlLabel, key, additionalValue);
if (!message) {
return [{
key,
content: key,
additionalValue: additionalValue[key]
}];
}
const validationMessage = new ValidationMessage(key, message);
validationMessage.key = key;
validationMessage.content = message;
validationMessage.additionalValue[key] = boundValue;
messages.push(validationMessage);
}
return messages;
}
// Whether component has been attached with any multiple-validation-summarizers or not.
hasValidator(name, ngControl) {
if (!ngControl) {
return false;
}
const control = ngControl.control;
if (!control) {
return false;
}
if (!control.validator) {
return false;
}
const validator = control.validator({});
if (!validator) {
return false;
}
return validator[name];
}
// Update the dictionary which is used for mapping validation property & validation message.
updateValidationMessageDictionary(validationMessageDictionary) {
if (!validationMessageDictionary) {
this._validatorNameToValidationMessage = {};
return;
}
this._validatorNameToValidationMessage = { ...validationMessageDictionary };
}
// Run validation on controls inside a form.
doFormControlsValidation(formGroup) {
// Form group is not valid.
if (!formGroup) {
return;
}
// No control is found.
const controls = formGroup.controls;
if (!controls) {
return;
}
const keys = Object.keys(controls);
for (const key of keys) {
const control = formGroup.controls[key];
this.doControlValidation(control);
}
}
// Do control validation
doControlValidation(control) {
try {
if (control instanceof FormControl) {
control.markAsTouched({ onlySelf: true });
control.markAsDirty({ onlySelf: true });
control.updateValueAndValidity({ emitEvent: false });
control.statusChanges.emit(control.status);
return;
}
if (control instanceof FormControlDirective) {
const formControlDirective = control;
formControlDirective.control.markAsTouched({ onlySelf: true });
formControlDirective.control.markAsDirty({ onlySelf: true });
formControlDirective.control.updateValueAndValidity({ emitEvent: false });
formControlDirective.statusChanges.emit(control.status);
return;
}
if (control instanceof FormArray) {
const formArray = control;
for (const child of formArray.controls) {
this.doControlValidation(child);
}
return;
}
if (control instanceof FormGroup) {
this.doFormControlsValidation(control);
return;
}
}
catch (exception) {
// Suppress error.
}
}
// Except empty string
isEmptyString(keyword) {
if (!keyword || keyword && keyword.trim() === '') {
return false;
}
return true;
}
// Get control validation errors.
loadControlValidationErrors(control) {
if (control instanceof FormControl) {
return control.errors;
}
if (control instanceof FormControlDirective) {
const formControlDirective = control;
return formControlDirective.errors;
}
const validationErrors = {};
if (control instanceof FormGroup) {
const controlValidationErrors = this.loadFormControlsValidationError(control);
lodashMerge(validationErrors, controlValidationErrors);
}
return validationErrors;
}
// Run validation on controls inside a form.
loadFormControlsValidationError(formGroup) {
// Form group is not valid.
if (!formGroup) {
return null;
}
// No control is found.
const controls = formGroup.controls;
if (!controls) {
return null;
}
const validationErrors = {};
const keys = Object.keys(controls);
for (const key of keys) {
const control = formGroup.controls[key];
const validationError = this.loadControlValidationErrors(control);
lodashMerge(validationErrors, validationError);
}
return validationErrors;
}
//#endregion
//#region Internal methods
// Build validation message from specific information.
buildValidationMessage(controlLabel, validatorName, additionalValue) {
if (!this._validatorNameToValidationMessage) {
return '';
}
const validationMessage = this._validatorNameToValidationMessage[validatorName];
if (!validationMessage) {
return '';
}
return validationMessage;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1zdW1tYXJpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL3NlcnZpY2VzL2ltcGxlbWVudGF0aW9ucy92YWxpZGF0b3JzL3ZhbGlkYXRpb24tc3VtbWFyaXplcnMvdmFsaWRhdGlvbi1zdW1tYXJpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLFNBQVMsRUFJVixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxLQUFLLElBQUksV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRS9DLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhFQUE4RSxDQUFDO0FBQy9HLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDREQUE0RCxDQUFDO0FBQ3JHLE9BQU8sRUFBQyxFQUFFLElBQUksSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR2hDLE9BQU8sRUFBQywrQkFBK0IsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBRXJGLE1BQU0sT0FBTywyQkFBNEIsU0FBUSwrQkFBK0I7SUFFOUUscUJBQXFCO0lBRXJCLDJDQUEyQztJQUMzQyxZQUFvQyxrQ0FBdUU7UUFFekcsb0JBQW9CO1FBQ3BCLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUh4Qyx1Q0FBa0MsR0FBbEMsa0NBQWtDLENBQXFDO1FBS3pHLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQ0FBa0M7YUFDbkQsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxXQUFXLENBQ2xELHlCQUF5QixFQUN6QixNQUFNLENBQUMsa0JBQWtCLElBQUksRUFBRSxD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TSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtZQUN0QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUM7U0FDaEQ7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRCxZQUFZO0lBRVosMEJBQTBCO0lBRTFCLHNEQUFzRDtJQUM1QyxzQkFBc0IsQ0FBQyxZQUFvQixFQUFFLGFBQXFCLEVBQUUsZUFBMkM7UUFDdkgsSUFBSSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRTtZQUMzQyxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3RCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUFycmF5LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xEaXJlY3RpdmUsXG4gIEZvcm1Hcm91cCxcbiAgTmdDb250cm9sLFxuICBOZ0Zvcm0sXG4gIFZhbGlkYXRpb25FcnJvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHttZXJnZSBhcyBsb2Rhc2hNZXJnZX0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7SVZhbGlkYXRpb25TdW1tYXJpemVyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1ZhbGlkYXRpb25NZXNzYWdlfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvaW1wbGVtZW50YXRpb25zL3ZhbGlkYXRpb24tc3VtbWFyaXplcnMvdmFsaWRhdGlvbi1tZXNzYWdlJztcbmltcG9ydCB7YnVpbHRJblZhbGlkYXRpb25NZXNzYWdlc30gZnJvbSAnLi4vLi4vLi4vLi4vY29uc3RhbnRzL2J1aWx0LWluLXZhbGlkYXRpb24tbWVzc2FnZS5jb25zdGFudCc7XG5pbXBvcnQge3Y0IGFzIHV1aWR9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHtJVmFsaWRhdGlvblN1bW1hcml6ZXJPcHRpb25Qcm92aWRlcn0gZnJvbSAnLi4vLi4vLi4vLi4vcHJvdmlkZXJzL2ludGVyZmFjZXMvdmFsaWRhdGlvbi1zdW1tYXJpemVyLW9wdGlvbnMtcHJvdmlkZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VmFsaWRhdGlvblN1bW1hcml6ZXJCYXNlU2VydmljZX0gZnJvbSAnLi92YWxpZGF0aW9uLXN1bW1hcml6ZXItYmFzZS5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25TdW1tYXJpemVyU2VydmljZSBleHRlbmRzIFZhbGlkYXRpb25TdW1tYXJpemVyQmFzZVNlcnZpY2UgaW1wbGVtZW50cyBJVmFsaWRhdGlvblN1bW1hcml6ZXJTZXJ2aWNlIHtcblxuICAvLyNyZWdpb24gQ29uc3RydWN0b3JcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRpb25TdW1tYXJpemVyT3B0aW9uUHJvdmlkZXI6IElWYWxpZGF0aW9uU3VtbWFyaXplck9wdGlvblByb3ZpZGVyKSB7XG5cbiAgICAvLyBDYWxsIGJhc2UgbWV0aG9kLlxuICAgIHN1cGVyKHZhbGlkYXRpb25TdW1tYXJpemVyT3B0aW9uUHJvdmlkZXI/LmdldE9wdGlvbigpPy5ncm91cElkIHx8IHV1aWQoKSk7XG5cbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLnZhbGlkYXRpb25TdW1tYXJpemVyT3B0aW9uUHJvdmlkZXJcbiAgICAgIC5nZXRPcHRpb24oKSB8fCB7fTtcbiAgICB0aGlzLl92YWxpZGF0b3JOYW1lVG9WYWxpZGF0aW9uTWVzc2FnZSA9IGxvZGFzaE1lcmdlKFxuICAgICAgYnVpbHRJblZhbGlkYXRpb25NZXNzYWdlcyxcbiAgICAgIG9wdGlvbi52YWxpZGF0aW9uTWVzc2FnZXMgfHwge30pO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIE1ldGhvZHNcblxuICBwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvLyBHZXQgYSBzaW5nbGUgY29udHJvbCB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gIHB1YmxpYyBsb2FkQ29udHJvbFZhbGlkYXRpb25NZXNzYWdlKGNvbnRyb2xMYWJlbDogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uTWVzc2FnZSB8IG51bGwge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5sb2FkQ29udHJvbFZhbGlkYXRpb25NZXNzYWdlcyhjb250cm9sTGFiZWwsIGNvbnRyb2wpO1xuICAgIGlmICghbWVzc2FnZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlc1swXTtcbiAgfVxuXG4gIC8vIEdldCBhbGwgY29udHJvbCB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICBwdWJsaWMgbG9hZENvbnRyb2xWYWxpZGF0aW9uTWVzc2FnZXMoY29udHJvbExhYmVsOiBzdHJpbmcsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IE5nQ29udHJvbCB8IG51bGwpOiBWYWxpZGF0aW9uTWVzc2FnZVtdIHwgbnVsbCB7XG5cbiAgICAvLyBJbnZhbGlkIGNvbnRyb2wuXG4gICAgaWYgKCFjb250cm9sKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBMaXN0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gICAgY29uc3QgbWVzc2FnZXM6IFZhbGlkYXRpb25NZXNzYWdlW10gPSBbXTtcbiAgICBpZiAoIWNvbnRyb2wuZXJyb3JzIHx8ICFjb250cm9sLmVycm9ycykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFjb250cm9sLmhhc0Vycm9yKGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBib3VuZFZhbHVlID0gJyc7XG4gICAgICBpZiAoa2V5ID09PSAnbWluJyB8fCBrZXkgPT09ICdtYXgnKSB7XG4gICAgICAgIGJvdW5kVmFsdWUgPSBjb250cm9sLmVycm9yc1trZXldW2tleV07XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ21pbmxlbmd0aCcgfHwga2V5ID09PSAnbWF4bGVuZ3RoJykge1xuICAgICAgICBib3VuZFZhbHVlID0gY29udHJvbC5lcnJvcnNba2V5XS5yZXF1aXJlZExlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvdW5kVmFsdWUgPSBjb250cm9sLmVycm9yc1trZXldO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGRpdGlvbmFsVmFsdWU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAgICAgaWYgKGtleSAmJiBrZXkubGVuZ3RoICYmIGJvdW5kVmFsdWUpIHtcbiAgICAgICAgYWRkaXRpb25hbFZhbHVlW2tleV0gPSBib3VuZFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5idWlsZFZhbGlkYXRpb25NZXNzYWdlKGNvbnRyb2xMYWJlbCwga2V5LCBhZGRpdGlvbmFsVmFsdWUpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBbe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBjb250ZW50OiBrZXksXG4gICAgICAgICAgYWRkaXRpb25hbFZhbHVlOiBhZGRpdGlvbmFsVmFsdWVba2V5XVxuICAgICAgICB9XTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2UgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2Uoa2V5LCBtZXNzYWdlKTtcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlLmtleSA9IGtleTtcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlLmNvbnRlbnQgPSBtZXNzYWdlO1xuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UuYWRkaXRpb25hbFZhbHVlW2tleV0gPSBib3VuZFZhbHVlO1xuICAgICAgbWVzc2FnZXMucHVzaCh2YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2VzO1xuICB9XG5cbiAgLy8gV2hldGhlciBjb21wb25lbnQgaGFzIGJlZW4gYXR0YWNoZWQgd2l0aCBhbnkgbXVsdGlwbGUtdmFsaWRhdGlvbi1zdW1tYXJpemVycyBvciBub3QuXG4gIHB1YmxpYyBoYXNWYWxpZGF0b3IobmFtZTogc3RyaW5nLCBuZ0NvbnRyb2w6IE5nQ29udHJvbCk6IGJvb2xlYW4ge1xuXG4gICAgaWYgKCFuZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sID0gbmdDb250cm9sLmNvbnRyb2w7XG4gICAgaWYgKCFjb250cm9sKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFjb250cm9sLnZhbGlkYXRvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbnRyb2wudmFsaWRhdG9yKHt9IGFzIEFic3RyYWN0Q29udHJvbCk7XG4gICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yW25hbWVdO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IHdoaWNoIGlzIHVzZWQgZm9yIG1hcHBpbmcgdmFsaWRhdGlvbiBwcm9wZXJ0eSAmIHZhbGlkYXRpb24gbWVzc2FnZS5cbiAgcHVibGljIHVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlRGljdGlvbmFyeSh2YWxpZGF0aW9uTWVzc2FnZURpY3Rpb25hcnk6IHsgW3A6IHN0cmluZ106IHN0cmluZzsgfSk6IHZvaWQge1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uTWVzc2FnZURpY3Rpb25hcnkpIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRvck5hbWVUb1ZhbGlkYXRpb25NZXNzYWdlID0ge307XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsaWRhdG9yTmFtZVRvVmFsaWRhdGlvbk1lc3NhZ2UgPSB7Li4udmFsaWRhdGlvbk1lc3NhZ2VEaWN0aW9uYXJ5fTtcbiAgfVxuXG4gIC8vIFJ1biB2YWxpZGF0aW9uIG9uIGNvbnRyb2xzIGluc2lkZSBhIGZvcm0uXG4gIHB1YmxpYyBkb0Zvcm1Db250cm9sc1ZhbGlkYXRpb24oZm9ybUdyb3VwOiBGb3JtR3JvdXAgfCBOZ0Zvcm0pOiB2b2lkIHtcblxuICAgIC8vIEZvcm0gZ3JvdXAgaXMgbm90IHZhbGlkLlxuICAgIGlmICghZm9ybUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm8gY29udHJvbCBpcyBmb3VuZC5cbiAgICBjb25zdCBjb250cm9scyA9IGZvcm1Hcm91cC5jb250cm9scztcbiAgICBpZiAoIWNvbnRyb2xzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRyb2xzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmNvbnRyb2xzW2tleV07XG4gICAgICB0aGlzLmRvQ29udHJvbFZhbGlkYXRpb24oY29udHJvbCBhcyBhbnkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERvIGNvbnRyb2wgdmFsaWRhdGlvblxuICBwdWJsaWMgZG9Db250cm9sVmFsaWRhdGlvbihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBGb3JtR3JvdXApOiB2b2lkIHtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSh7b25seVNlbGY6IHRydWV9KTtcbiAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgIChjb250cm9sLnN0YXR1c0NoYW5nZXMgYXMgRXZlbnRFbWl0dGVyPGFueT4pLmVtaXQoY29udHJvbC5zdGF0dXMpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbERpcmVjdGl2ZSkge1xuICAgICAgICBjb25zdCBmb3JtQ29udHJvbERpcmVjdGl2ZSA9IGNvbnRyb2wgYXMgRm9ybUNvbnRyb2xEaXJlY3RpdmU7XG4gICAgICAgIGZvcm1Db250cm9sRGlyZWN0aXZlLmNvbnRyb2wubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcbiAgICAgICAgZm9ybUNvbnRyb2xEaXJlY3RpdmUuY29udHJvbC5tYXJrQXNEaXJ0eSh7b25seVNlbGY6IHRydWV9KTtcbiAgICAgICAgZm9ybUNvbnRyb2xEaXJlY3RpdmUuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgIChmb3JtQ29udHJvbERpcmVjdGl2ZS5zdGF0dXNDaGFuZ2VzIGFzIEV2ZW50RW1pdHRlcjxhbnk+KS5lbWl0KGNvbnRyb2wuc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSBjb250cm9sIGFzIEZvcm1BcnJheTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmb3JtQXJyYXkuY29udHJvbHMpIHtcbiAgICAgICAgICB0aGlzLmRvQ29udHJvbFZhbGlkYXRpb24oY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgdGhpcy5kb0Zvcm1Db250cm9sc1ZhbGlkYXRpb24oY29udHJvbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgLy8gU3VwcHJlc3MgZXJyb3IuXG4gICAgfVxuICB9XG5cbiAgLy8gRXhjZXB0IGVtcHR5IHN0cmluZ1xuICBwdWJsaWMgaXNFbXB0eVN0cmluZyhrZXl3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGlmICgha2V5d29yZCB8fCBrZXl3b3JkICYmIGtleXdvcmQudHJpbSgpID09PSAnJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gR2V0IGNvbnRyb2wgdmFsaWRhdGlvbiBlcnJvcnMuXG4gIHB1YmxpYyBsb2FkQ29udHJvbFZhbGlkYXRpb25FcnJvcnMoY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgRm9ybUdyb3VwKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgcmV0dXJuIGNvbnRyb2wuZXJyb3JzO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2xEaXJlY3RpdmUpIHtcbiAgICAgIGNvbnN0IGZvcm1Db250cm9sRGlyZWN0aXZlID0gY29udHJvbCBhcyBGb3JtQ29udHJvbERpcmVjdGl2ZTtcbiAgICAgIHJldHVybiBmb3JtQ29udHJvbERpcmVjdGl2ZS5lcnJvcnM7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9yczogVmFsaWRhdGlvbkVycm9ycyA9IHt9O1xuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xWYWxpZGF0aW9uRXJyb3JzID0gdGhpcy5sb2FkRm9ybUNvbnRyb2xzVmFsaWRhdGlvbkVycm9yKGNvbnRyb2wpO1xuICAgICAgbG9kYXNoTWVyZ2UodmFsaWRhdGlvbkVycm9ycywgY29udHJvbFZhbGlkYXRpb25FcnJvcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0aW9uRXJyb3JzO1xuICB9XG5cbiAgLy8gUnVuIHZhbGlkYXRpb24gb24gY29udHJvbHMgaW5zaWRlIGEgZm9ybS5cbiAgcHVibGljIGxvYWRGb3JtQ29udHJvbHNWYWxpZGF0aW9uRXJyb3IoZm9ybUdyb3VwOiBGb3JtR3JvdXApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG5cbiAgICAvLyBGb3JtIGdyb3VwIGlzIG5vdCB2YWxpZC5cbiAgICBpZiAoIWZvcm1Hcm91cCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gTm8gY29udHJvbCBpcyBmb3VuZC5cbiAgICBjb25zdCBjb250cm9scyA9IGZvcm1Hcm91cC5jb250cm9scztcbiAgICBpZiAoIWNvbnRyb2xzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzID0ge307XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRyb2xzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmNvbnRyb2xzW2tleV07XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSB0aGlzLmxvYWRDb250cm9sVmFsaWRhdGlvbkVycm9ycyhjb250cm9sKTtcbiAgICAgIGxvZGFzaE1lcmdlKHZhbGlkYXRpb25FcnJvcnMsIHZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRpb25FcnJvcnM7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW50ZXJuYWwgbWV0aG9kc1xuXG4gIC8vIEJ1aWxkIHZhbGlkYXRpb24gbWVzc2FnZSBmcm9tIHNwZWNpZmljIGluZm9ybWF0aW9uLlxuICBwcm90ZWN0ZWQgYnVpbGRWYWxpZGF0aW9uTWVzc2FnZShjb250cm9sTGFiZWw6IHN0cmluZywgdmFsaWRhdG9yTmFtZTogc3RyaW5nLCBhZGRpdGlvbmFsVmFsdWU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9KTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3ZhbGlkYXRvck5hbWVUb1ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2UgPSB0aGlzLl92YWxpZGF0b3JOYW1lVG9WYWxpZGF0aW9uTWVzc2FnZVt2YWxpZGF0b3JOYW1lXTtcbiAgICBpZiAoIXZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRpb25NZXNzYWdlO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG59XG4iXX0=