@ng-dynamic-forms/core
Version:
A rapid form development library for Angular
156 lines • 24.9 kB
JavaScript
import { Injectable, Inject, Optional } from "@angular/core";
import { Validators, NG_VALIDATORS, NG_ASYNC_VALIDATORS } from "@angular/forms";
import { DynamicFormHook } from "../model/misc/dynamic-form-control-validation.model";
import { isObject, isString } from "../utils/core.utils";
import { DYNAMIC_VALIDATORS } from "./dynamic-form-validators";
import { DEFAULT_ERROR_STATE_MATCHER, DYNAMIC_ERROR_MESSAGES_MATCHER } from "./dynamic-form-validation-matchers";
import * as i0 from "@angular/core";
export class DynamicFormValidationService {
constructor(_NG_VALIDATORS, _NG_ASYNC_VALIDATORS, _DYNAMIC_VALIDATORS, _DYNAMIC_ERROR_MESSAGES_MATCHER) {
this._NG_VALIDATORS = _NG_VALIDATORS;
this._NG_ASYNC_VALIDATORS = _NG_ASYNC_VALIDATORS;
this._DYNAMIC_VALIDATORS = _DYNAMIC_VALIDATORS;
this._DYNAMIC_ERROR_MESSAGES_MATCHER = _DYNAMIC_ERROR_MESSAGES_MATCHER;
}
getValidatorFn(validatorName, validatorArgs = null, validatorsToken = this._NG_VALIDATORS) {
let validatorFn;
if (Validators.hasOwnProperty(validatorName)) { // Built-in Angular Validators
validatorFn = Validators[validatorName];
}
else { // Custom Validators
if (this._DYNAMIC_VALIDATORS && this._DYNAMIC_VALIDATORS.has(validatorName)) {
validatorFn = this._DYNAMIC_VALIDATORS.get(validatorName);
}
else if (validatorsToken) {
validatorFn = validatorsToken.find(validator => validator.name === validatorName);
}
}
if (validatorFn === undefined) { // throw when no validator could be resolved
throw new Error(`validator "${validatorName}" is not provided via NG_VALIDATORS, NG_ASYNC_VALIDATORS or DYNAMIC_FORM_VALIDATORS`);
}
if (validatorArgs !== null) {
return validatorFn(validatorArgs);
}
return validatorFn;
}
getValidatorFns(validatorsConfig, validatorsToken = this._NG_VALIDATORS) {
let validatorFns = [];
if (isObject(validatorsConfig)) {
validatorFns = Object.keys(validatorsConfig).map(validatorConfigKey => {
const validatorConfigValue = validatorsConfig[validatorConfigKey];
if (this.isValidatorDescriptor(validatorConfigValue)) {
const descriptor = validatorConfigValue;
return this.getValidatorFn(descriptor.name, descriptor.args, validatorsToken);
}
return this.getValidatorFn(validatorConfigKey, validatorConfigValue, validatorsToken);
});
}
return validatorFns;
}
getValidator(validatorName, validatorArgs = null) {
return this.getValidatorFn(validatorName, validatorArgs);
}
getAsyncValidator(validatorName, validatorArgs = null) {
return this.getValidatorFn(validatorName, validatorArgs, this._NG_ASYNC_VALIDATORS);
}
getValidators(validatorsConfig) {
return this.getValidatorFns(validatorsConfig);
}
getAsyncValidators(asyncValidatorsConfig) {
return this.getValidatorFns(asyncValidatorsConfig, this._NG_ASYNC_VALIDATORS);
}
updateValidators(validatorsConfig, control, model) {
model.validators = validatorsConfig;
if (validatorsConfig === null) {
control.clearValidators();
}
else {
control.setValidators(this.getValidators(validatorsConfig));
}
control.updateValueAndValidity();
}
updateAsyncValidators(asyncValidatorsConfig, control, model) {
model.asyncValidators = asyncValidatorsConfig;
if (asyncValidatorsConfig === null) {
control.clearAsyncValidators();
}
else {
control.setAsyncValidators(this.getAsyncValidators(asyncValidatorsConfig));
}
control.updateValueAndValidity();
}
showErrorMessages(control, model, hasFocus) {
const precondition = control.invalid && model.hasErrorMessages;
const matcher = this._DYNAMIC_ERROR_MESSAGES_MATCHER ? this._DYNAMIC_ERROR_MESSAGES_MATCHER(control, model, hasFocus) :
DEFAULT_ERROR_STATE_MATCHER(control, model, hasFocus);
return precondition && matcher;
}
parseErrorMessageConfig(template, model, error = null) {
return template.replace(/{{\s*(.+?)\s*}}/mg, (_match, expression) => {
let propertySource = model;
let propertyName = expression;
if (expression.indexOf("validator.") >= 0 && error) {
propertySource = error;
propertyName = expression.replace("validator.", "");
}
return propertySource[propertyName] !== null && propertySource[propertyName] !== undefined ?
propertySource[propertyName] : null;
});
}
createErrorMessages(control, model) {
const messages = [];
if (model.hasErrorMessages) {
const messagesConfig = model.errorMessages;
Object.keys(control.errors || {}).forEach(validationErrorKey => {
let messageKey = validationErrorKey;
if (validationErrorKey === "minlength" || validationErrorKey === "maxlength") {
messageKey = messageKey.replace("length", "Length");
}
if (messagesConfig.hasOwnProperty(messageKey)) {
const validationError = control.getError(validationErrorKey);
const messageTemplate = messagesConfig[messageKey];
messages.push(this.parseErrorMessageConfig(messageTemplate, model, validationError));
}
});
}
return messages;
}
isFormHook(value) {
return isString(value) && Object.values(DynamicFormHook).includes(value);
}
isValidatorDescriptor(value) {
if (isObject(value)) {
return value.hasOwnProperty("name") && value.hasOwnProperty("args");
}
return false;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicFormValidationService, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: DYNAMIC_VALIDATORS, optional: true }, { token: DYNAMIC_ERROR_MESSAGES_MATCHER, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicFormValidationService, providedIn: "root" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicFormValidationService, decorators: [{
type: Injectable,
args: [{
providedIn: "root"
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NG_VALIDATORS]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NG_ASYNC_VALIDATORS]
}] }, { type: Map, decorators: [{
type: Optional
}, {
type: Inject,
args: [DYNAMIC_VALIDATORS]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [DYNAMIC_ERROR_MESSAGES_MATCHER]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLXZhbGlkYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWR5bmFtaWMtZm9ybXMvY29yZS9zcmMvbGliL3NlcnZpY2UvZHluYW1pYy1mb3JtLXZhbGlkYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUlILFVBQVUsRUFDVixhQUFhLEVBQ2IsbUJBQW1CLEVBQ3RCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNILGVBQWUsRUFHbEIsTUFBTSxxREFBcUQsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBZ0QsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RyxPQUFPLEVBQ0gsMkJBQTJCLEVBQzNCLDhCQUE4QixFQUVqQyxNQUFNLG9DQUFvQyxDQUFDOztBQUs1QyxNQUFNLE9BQU8sNEJBQTRCO0lBRXJDLFlBQXVELGNBQTZCLEVBQ3ZCLG9CQUF3QyxFQUN6QyxtQkFBOEQsRUFDbEQsK0JBQTREO1FBSDdFLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQ3ZCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBb0I7UUFDekMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUEyQztRQUNsRCxvQ0FBK0IsR0FBL0IsK0JBQStCLENBQTZCO0lBQ3BJLENBQUM7SUFFTyxjQUFjLENBQUMsYUFBcUIsRUFBRSxnQkFBcUIsSUFBSSxFQUNoRCxrQkFBbUMsSUFBSSxDQUFDLGNBQWM7UUFFekUsSUFBSSxXQUFxRCxDQUFDO1FBRTFELElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLDhCQUE4QjtZ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cEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFVO1FBQ2pCLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFVO1FBQzVCLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzs4R0FwS1EsNEJBQTRCLGtCQUVMLGFBQWEsNkJBQ2IsbUJBQW1CLDZCQUNuQixrQkFBa0IsNkJBQ2xCLDhCQUE4QjtrSEFMckQsNEJBQTRCLGNBRnpCLE1BQU07OzJGQUVULDRCQUE0QjtrQkFIeEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQUdnQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGFBQWE7OzBCQUNoQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQ3RDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsa0JBQWtCOzswQkFDckMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyw4QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIEFzeW5jVmFsaWRhdG9yRm4sXG4gICAgVmFsaWRhdG9yRm4sXG4gICAgVmFsaWRhdG9ycyxcbiAgICBOR19WQUxJREFUT1JTLFxuICAgIE5HX0FTWU5DX1ZBTElEQVRPUlNcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9keW5hbWljLWZvcm0tY29udHJvbC5tb2RlbFwiO1xuaW1wb3J0IHtcbiAgICBEeW5hbWljRm9ybUhvb2ssXG4gICAgRHluYW1pY1ZhbGlkYXRvckRlc2NyaXB0b3IsXG4gICAgRHluYW1pY1ZhbGlkYXRvcnNDb25maWdcbn0gZnJvbSBcIi4uL21vZGVsL21pc2MvZHluYW1pYy1mb3JtLWNvbnRyb2wtdmFsaWRhdGlvbi5tb2RlbFwiO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2NvcmUudXRpbHNcIjtcbmltcG9ydCB7IERZTkFNSUNfVkFMSURBVE9SUywgVmFsaWRhdG9yLCBWYWxpZGF0b3JGYWN0b3J5LCBWYWxpZGF0b3JzVG9rZW4gfSBmcm9tIFwiLi9keW5hbWljLWZvcm0tdmFsaWRhdG9yc1wiO1xuaW1wb3J0IHtcbiAgICBERUZBVUxUX0VSUk9SX1NUQVRFX01BVENIRVIsXG4gICAgRFlOQU1JQ19FUlJPUl9NRVNTQUdFU19NQVRDSEVSLFxuICAgIER5bmFtaWNFcnJvck1lc3NhZ2VzTWF0Y2hlclxufSBmcm9tIFwiLi9keW5hbWljLWZvcm0tdmFsaWRhdGlvbi1tYXRjaGVyc1wiO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogXCJyb290XCJcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHByaXZhdGUgX05HX1ZBTElEQVRPUlM6IFZhbGlkYXRvckZuW10sXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOR19BU1lOQ19WQUxJREFUT1JTKSBwcml2YXRlIF9OR19BU1lOQ19WQUxJREFUT1JTOiBBc3luY1ZhbGlkYXRvckZuW10sXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEWU5BTUlDX1ZBTElEQVRPUlMpIHByaXZhdGUgX0RZTkFNSUNfVkFMSURBVE9SUzogTWFwPHN0cmluZywgVmFsaWRhdG9yIHwgVmFsaWRhdG9yRmFjdG9yeT4sXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEWU5BTUlDX0VSUk9SX01FU1NBR0VTX01BVENIRVIpIHByaXZhdGUgX0RZTkFNSUNfRVJST1JfTUVTU0FHRVNfTUFUQ0hFUjogRHluYW1pY0Vycm9yTWVzc2FnZXNNYXRjaGVyKSB7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWYWxpZGF0b3JGbih2YWxpZGF0b3JOYW1lOiBzdHJpbmcsIHZhbGlkYXRvckFyZ3M6IGFueSA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzVG9rZW46IFZhbGlkYXRvcnNUb2tlbiA9IHRoaXMuX05HX1ZBTElEQVRPUlMpOiBWYWxpZGF0b3IgfCBuZXZlciB7XG5cbiAgICAgICAgbGV0IHZhbGlkYXRvckZuOiBWYWxpZGF0b3JGYWN0b3J5IHwgVmFsaWRhdG9yIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChWYWxpZGF0b3JzLmhhc093blByb3BlcnR5KHZhbGlkYXRvck5hbWUpKSB7IC8vIEJ1aWx0LWluIEFuZ3VsYXIgVmFsaWRhdG9yc1xuICAgICAgICAgICAgdmFsaWRhdG9yRm4gPSAoVmFsaWRhdG9ycyBhcyBhbnkpW3ZhbGlkYXRvck5hbWVdO1xuXG4gICAgICAgIH0gZWxzZSB7IC8vIEN1c3RvbSBWYWxpZGF0b3JzXG4gICAgICAgICAgICBpZiAodGhpcy5fRFlOQU1JQ19WQUxJREFUT1JTICYmIHRoaXMuX0RZTkFNSUNfVkFMSURBVE9SUy5oYXModmFsaWRhdG9yTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JGbiA9IHRoaXMuX0RZTkFNSUNfVkFMSURBVE9SUy5nZXQodmFsaWRhdG9yTmFtZSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yc1Rva2VuKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yRm4gPSB2YWxpZGF0b3JzVG9rZW4uZmluZCh2YWxpZGF0b3IgPT4gdmFsaWRhdG9yLm5hbWUgPT09IHZhbGlkYXRvck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbGlkYXRvckZuID09PSB1bmRlZmluZWQpIHsgLy8gdGhyb3cgd2hlbiBubyB2YWxpZGF0b3IgY291bGQgYmUgcmVzb2x2ZWRcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgdmFsaWRhdG9yIFwiJHt2YWxpZGF0b3JOYW1lfVwiIGlzIG5vdCBwcm92aWRlZCB2aWEgTkdfVkFMSURBVE9SUywgTkdfQVNZTkNfVkFMSURBVE9SUyBvciBEWU5BTUlDX0ZPUk1fVkFMSURBVE9SU2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbGlkYXRvckFyZ3MgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAodmFsaWRhdG9yRm4gYXMgVmFsaWRhdG9yRmFjdG9yeSkodmFsaWRhdG9yQXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsaWRhdG9yRm4gYXMgVmFsaWRhdG9yO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmFsaWRhdG9yRm5zKHZhbGlkYXRvcnNDb25maWc6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnNUb2tlbjogVmFsaWRhdG9yc1Rva2VuID0gdGhpcy5fTkdfVkFMSURBVE9SUyk6IFZhbGlkYXRvcltdIHtcblxuICAgICAgICBsZXQgdmFsaWRhdG9yRm5zOiBWYWxpZGF0b3JbXSA9IFtdO1xuXG4gICAgICAgIGlmIChpc09iamVjdCh2YWxpZGF0b3JzQ29uZmlnKSkge1xuXG4gICAgICAgICAgICB2YWxpZGF0b3JGbnMgPSBPYmplY3Qua2V5cyh2YWxpZGF0b3JzQ29uZmlnKS5tYXAodmFsaWRhdG9yQ29uZmlnS2V5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0b3JDb25maWdWYWx1ZSA9ICh2YWxpZGF0b3JzQ29uZmlnIGFzIER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnKVt2YWxpZGF0b3JDb25maWdLZXldO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZGF0b3JEZXNjcmlwdG9yKHZhbGlkYXRvckNvbmZpZ1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdmFsaWRhdG9yQ29uZmlnVmFsdWUgYXMgRHluYW1pY1ZhbGlkYXRvckRlc2NyaXB0b3I7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdG9yRm4oZGVzY3JpcHRvci5uYW1lLCBkZXNjcmlwdG9yLmFyZ3MsIHZhbGlkYXRvcnNUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdG9yRm4odmFsaWRhdG9yQ29uZmlnS2V5LCB2YWxpZGF0b3JDb25maWdWYWx1ZSwgdmFsaWRhdG9yc1Rva2VuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZucztcbiAgICB9XG5cbiAgICBnZXRWYWxpZGF0b3IodmFsaWRhdG9yTmFtZTogc3RyaW5nLCB2YWxpZGF0b3JBcmdzOiBhbnkgPSBudWxsKTogVmFsaWRhdG9yRm4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWxpZGF0b3JGbih2YWxpZGF0b3JOYW1lLCB2YWxpZGF0b3JBcmdzKSBhcyBWYWxpZGF0b3JGbjtcbiAgICB9XG5cbiAgICBnZXRBc3luY1ZhbGlkYXRvcih2YWxpZGF0b3JOYW1lOiBzdHJpbmcsIHZhbGlkYXRvckFyZ3M6IGFueSA9IG51bGwpOiBBc3luY1ZhbGlkYXRvckZuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdG9yRm4odmFsaWRhdG9yTmFtZSwgdmFsaWRhdG9yQXJncywgdGhpcy5fTkdfQVNZTkNfVkFMSURBVE9SUykgYXMgQXN5bmNWYWxpZGF0b3JGbjtcbiAgICB9XG5cbiAgICBnZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnNDb25maWc6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkYXRvckZucyh2YWxpZGF0b3JzQ29uZmlnKSBhcyBWYWxpZGF0b3JGbltdO1xuICAgIH1cblxuICAgIGdldEFzeW5jVmFsaWRhdG9ycyhhc3luY1ZhbGlkYXRvcnNDb25maWc6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnKTogQXN5bmNWYWxpZGF0b3JGbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdG9yRm5zKGFzeW5jVmFsaWRhdG9yc0NvbmZpZywgdGhpcy5fTkdfQVNZTkNfVkFMSURBVE9SUykgYXMgQXN5bmNWYWxpZGF0b3JGbltdO1xuICAgIH1cblxuICAgIHVwZGF0ZVZhbGlkYXRvcnModmFsaWRhdG9yc0NvbmZpZzogRHluYW1pY1ZhbGlkYXRvcnNDb25maWcgfCBudWxsLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gICAgICAgICAgICAgICAgICAgICBtb2RlbDogRHluYW1pY0Zvcm1Db250cm9sTW9kZWwpOiB2b2lkIHtcblxuICAgICAgICBtb2RlbC52YWxpZGF0b3JzID0gdmFsaWRhdG9yc0NvbmZpZztcblxuICAgICAgICBpZiAodmFsaWRhdG9yc0NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuZ2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzQ29uZmlnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVBc3luY1ZhbGlkYXRvcnMoYXN5bmNWYWxpZGF0b3JzQ29uZmlnOiBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZyB8IG51bGwsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw6IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsKTogdm9pZCB7XG5cbiAgICAgICAgbW9kZWwuYXN5bmNWYWxpZGF0b3JzID0gYXN5bmNWYWxpZGF0b3JzQ29uZmlnO1xuXG4gICAgICAgIGlmIChhc3luY1ZhbGlkYXRvcnNDb25maWcgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuY2xlYXJBc3luY1ZhbGlkYXRvcnMoKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5nZXRBc3luY1ZhbGlkYXRvcnMoYXN5bmNWYWxpZGF0b3JzQ29uZmlnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICBzaG93RXJyb3JNZXNzYWdlcyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIG1vZGVsOiBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbCwgaGFzRm9jdXM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcHJlY29uZGl0aW9uID0gY29udHJvbC5pbnZhbGlkICYmIG1vZGVsLmhhc0Vycm9yTWVzc2FnZXM7XG4gICAgICAgIGNvbnN0IG1hdGNoZXIgPSB0aGlzLl9EWU5BTUlDX0VSUk9SX01FU1NBR0VTX01BVENIRVIgPyB0aGlzLl9EWU5BTUlDX0VSUk9SX01FU1NBR0VTX01BVENIRVIoY29udHJvbCwgbW9kZWwsIGhhc0ZvY3VzKSA6XG4gICAgICAgICAgICBERUZBVUxUX0VSUk9SX1NUQVRFX01BVENIRVIoY29udHJvbCwgbW9kZWwsIGhhc0ZvY3VzKTtcblxuICAgICAgICByZXR1cm4gcHJlY29uZGl0aW9uICYmIG1hdGNoZXI7XG4gICAgfVxuXG4gICAgcGFyc2VFcnJvck1lc3NhZ2VDb25maWcodGVtcGxhdGU6IHN0cmluZywgbW9kZWw6IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsLCBlcnJvcjogYW55ID0gbnVsbCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC97e1xccyooLis/KVxccyp9fS9tZywgKF9tYXRjaDogc3RyaW5nLCBleHByZXNzaW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGxldCBwcm9wZXJ0eVNvdXJjZTogYW55ID0gbW9kZWw7XG4gICAgICAgICAgICBsZXQgcHJvcGVydHlOYW1lOiBzdHJpbmcgPSBleHByZXNzaW9uO1xuXG4gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5pbmRleE9mKFwidmFsaWRhdG9yLlwiKSA+PSAwICYmIGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlTb3VyY2UgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBleHByZXNzaW9uLnJlcGxhY2UoXCJ2YWxpZGF0b3IuXCIsIFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlTb3VyY2VbcHJvcGVydHlOYW1lXSAhPT0gbnVsbCAmJiBwcm9wZXJ0eVNvdXJjZVtwcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgIHByb3BlcnR5U291cmNlW3Byb3BlcnR5TmFtZV0gOiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVFcnJvck1lc3NhZ2VzKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgbW9kZWw6IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBpZiAobW9kZWwuaGFzRXJyb3JNZXNzYWdlcykge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXNDb25maWcgPSBtb2RlbC5lcnJvck1lc3NhZ2VzIGFzIER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnO1xuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycyB8fCB7fSkuZm9yRWFjaCh2YWxpZGF0aW9uRXJyb3JLZXkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlS2V5ID0gdmFsaWRhdGlvbkVycm9yS2V5O1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcktleSA9PT0gXCJtaW5sZW5ndGhcIiB8fCB2YWxpZGF0aW9uRXJyb3JLZXkgPT09IFwibWF4bGVuZ3RoXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUtleSA9IG1lc3NhZ2VLZXkucmVwbGFjZShcImxlbmd0aFwiLCBcIkxlbmd0aFwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNDb25maWcuaGFzT3duUHJvcGVydHkobWVzc2FnZUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gY29udHJvbC5nZXRFcnJvcih2YWxpZGF0aW9uRXJyb3JLZXkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlVGVtcGxhdGUgPSBtZXNzYWdlc0NvbmZpZ1ttZXNzYWdlS2V5XSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh0aGlzLnBhcnNlRXJyb3JNZXNzYWdlQ29uZmlnKG1lc3NhZ2VUZW1wbGF0ZSwgbW9kZWwsIHZhbGlkYXRpb25FcnJvcikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzO1xuICAgIH1cblxuICAgIGlzRm9ybUhvb2sodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcodmFsdWUpICYmIChPYmplY3QudmFsdWVzKER5bmFtaWNGb3JtSG9vaykgYXMgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpc1ZhbGlkYXRvckRlc2NyaXB0b3IodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpICYmIHZhbHVlLmhhc093blByb3BlcnR5KFwiYXJnc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iXX0=