@ng-flexy/form
Version:
Flexy components and tools to build Angular 8+ applications
215 lines • 27.7 kB
JavaScript
import { FormArray, FormControl } from '@angular/forms';
import { get, has, merge, set } from 'lodash';
import * as jsonata_ from 'jsonata';
const jsonata = jsonata_;
const ifExpressionsCache = {};
const calculatedExpresionCache = {};
export var FlexyFormDataMode;
(function (FlexyFormDataMode) {
FlexyFormDataMode["All"] = "all";
FlexyFormDataMode["Dirty"] = "dirty";
FlexyFormDataMode["Touched"] = "toched";
})(FlexyFormDataMode || (FlexyFormDataMode = {}));
export function findErrors(schema, currentData) {
const errors = {};
for (const item of schema) {
if (checkIf(item, currentData) && item.items) {
item.items.forEach((aItem, index) => {
const arrItemError = findErrors([aItem], currentData);
if (arrItemError && Object.values(arrItemError).length) {
errors[item.formName + '.' + index] = arrItemError;
}
});
}
else if (checkIf(item, currentData) &&
item.formName &&
item.formControl &&
item.formControl.invalid) {
errors[item.formName] = item.formControl.errors;
}
if (checkIf(item, currentData) && item.children) {
Object.assign(errors, findErrors(item.children, currentData));
}
}
return errors;
}
export function findSchema(fieldName, schema) {
for (const item of schema) {
if (item.formName && item.formName === fieldName) {
return item;
}
else if (item.children) {
const childSchema = findSchema(fieldName, item.children);
if (childSchema) {
return childSchema;
}
}
}
return null;
}
export function calculate(calcExp, data) {
let value;
try {
if (!calculatedExpresionCache[calcExp]) {
calculatedExpresionCache[calcExp] = jsonata(calcExp);
}
value = calculatedExpresionCache[calcExp].evaluate(data);
}
catch (e) {
// console.error(e);
value = null;
}
return value;
}
export function getSchemaData(schemas, currentData, mode = FlexyFormDataMode.All) {
let data = {};
if (schemas) {
schemas.forEach(schema => {
const fieldSchema = schema;
if (checkIf(fieldSchema, currentData)) {
const isFormControl = fieldSchema.formControl && fieldSchema.formName;
if (isFormControl && fieldSchema.formControl instanceof FormControl) {
if (checkSchemaData(fieldSchema.formControl, mode)) {
set(data, fieldSchema.formName, fieldSchema.formControl.value);
}
}
else if (isFormControl && fieldSchema.formControl instanceof FormArray) {
const arrayData = getArrayData(fieldSchema, currentData, mode, data);
if (mode === FlexyFormDataMode.All) {
set(data, fieldSchema.formName, Object.values(arrayData));
}
else if (!isInputEmpty(arrayData)) {
set(data, fieldSchema.formName, arrayData);
}
}
if (checkIf(fieldSchema, currentData)) {
data = merge(data, getSchemaData(fieldSchema.children, currentData, mode));
}
}
});
}
return data;
}
export function findRemoved(allData, originalData) {
const removed = {};
if (originalData) {
Object.keys(originalData).forEach(key => {
const path = key;
if (!isInputEmpty(originalData[key]) && isInputEmpty(allData[key])) {
set(removed, path, null);
}
else if (originalData[key] && Array.isArray(originalData[key])) {
originalData[key].forEach((item, index) => {
if (!isInputEmpty(item) && isInputEmpty(allData[key][index])) {
if (!has(removed, path)) {
set(removed, path, {});
}
const v = get(removed, path);
v['' + index] = null;
}
else if (item && isObject(item)) {
const founded = findRemoved(allData[key][index], item);
if (founded && !isInputEmpty(founded)) {
if (!has(removed, path)) {
set(removed, path, {});
}
const v = get(removed, path);
v['' + index] = founded;
}
}
});
}
else if (originalData[key] && isObject(originalData[key])) {
const founded = findRemoved(allData[key], originalData[key]);
if (founded && !isInputEmpty(founded)) {
set(removed, path, founded);
}
}
});
}
return removed;
}
export function clearEmptyArrayAndObjects(data) {
if (data) {
if (isObject(data)) {
Object.keys(data).forEach(key => {
if (isEmptyStructure(data[key])) {
delete data[key];
}
else if (isObject(data[key])) {
clearEmptyArrayAndObjects(data[key]);
}
});
}
}
}
function isObject(a) {
return !!a && a.constructor === Object;
}
function checkIf(fieldSchema, currentData) {
if (!fieldSchema.if) {
return true;
}
const ifName = 'IF_' + fieldSchema.if;
let ret;
try {
if (!ifExpressionsCache[ifName]) {
ifExpressionsCache[ifName] = jsonata(fieldSchema.if);
}
ret = ifExpressionsCache[ifName].evaluate(currentData ? currentData : {});
}
catch (e) {
// console.error(e);
ret = null;
}
return !!ret;
}
function getArrayData(fieldSchema, currentData, mode, data) {
const arrayData = {};
fieldSchema.items.forEach((item, index) => {
const itemFormControl = item.formControl;
if (!itemFormControl || checkSchemaData(itemFormControl, mode)) {
if (item.children) {
const itemData = getSchemaData(item.children, currentData, mode);
if (!isInputEmpty(itemData)) {
arrayData['' + index] = itemData;
}
}
else {
arrayData['' + index] = item.formControl.value;
}
}
});
return arrayData;
}
function checkSchemaData(control, mode) {
return (control &&
(mode === FlexyFormDataMode.All ||
(mode === FlexyFormDataMode.Dirty && control.dirty) ||
(mode === FlexyFormDataMode.Touched && control.touched)));
}
function isInputEmpty(v) {
return v === void 0 || v === '';
}
function isEmptyStructure(data) {
let ret = true;
if (Array.isArray(data)) {
if (data.length > 0) {
data.forEach(item => {
ret = ret && isEmptyStructure(item);
});
}
}
else if (isObject(data)) {
if (Object.keys(data).length > 0) {
Object.keys(data).forEach(key => {
ret = ret && isEmptyStructure(data[key]);
});
}
}
else {
return isInputEmpty(data);
}
return ret;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9tb2RlbHMvZm9ybS51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQW1CLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sU0FBUyxDQUFDO0FBRXBDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUV6QixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUVwQyxNQUFNLENBQU4sSUFBWSxpQkFJWDtBQUpELFdBQVksaUJBQWlCO0lBQzNCLGdDQUFXLENBQUE7SUFDWCxvQ0FBZSxDQUFBO0lBQ2YsdUNBQWtCLENBQUE7QUFDcEIsQ0FBQyxFQUpXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFJNUI7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLE1BQStCLEVBQUUsV0FBMEI7SUFDcEYsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO1FBQ3pCLElBQUksT0FBTyxDQUFDLElBQWtDLEVBQUUsV0FBVyxDQUFDLElBQUssSUFBbUMsQ0FBQyxLQUFLLEVBQUU7WUFDekcsSUFBbUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNsRSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxZQUFZLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENB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QU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDOUIsR0FBRyxHQUFHLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxDQUFDLENBQUMsQ0FBQztTQUNKO0tBQ0Y7U0FBTTtRQUNMLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEsIEZsZXh5Rm9ybUxheW91dFNjaGVtYSB9IGZyb20gJy4vbGF5b3V0LXNjaGVtYS5tb2RlbCc7XG5pbXBvcnQgeyBGbGV4eUZvcm1EYXRhIH0gZnJvbSAnLi9mb3JtLmRhdGEnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZ2V0LCBoYXMsIG1lcmdlLCBzZXQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMganNvbmF0YV8gZnJvbSAnanNvbmF0YSc7XG5cbmNvbnN0IGpzb25hdGEgPSBqc29uYXRhXztcblxuY29uc3QgaWZFeHByZXNzaW9uc0NhY2hlID0ge307XG5jb25zdCBjYWxjdWxhdGVkRXhwcmVzaW9uQ2FjaGUgPSB7fTtcblxuZXhwb3J0IGVudW0gRmxleHlGb3JtRGF0YU1vZGUge1xuICBBbGwgPSAnYWxsJyxcbiAgRGlydHkgPSAnZGlydHknLFxuICBUb3VjaGVkID0gJ3RvY2hlZCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFcnJvcnMoc2NoZW1hOiBGbGV4eUZvcm1MYXlvdXRTY2hlbWFbXSwgY3VycmVudERhdGE6IEZsZXh5Rm9ybURhdGEpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgY29uc3QgZXJyb3JzID0ge307XG4gIGZvciAoY29uc3QgaXRlbSBvZiBzY2hlbWEpIHtcbiAgICBpZiAoY2hlY2tJZihpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBjdXJyZW50RGF0YSkgJiYgKGl0ZW0gYXMgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEpLml0ZW1zKSB7XG4gICAgICAoaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkuaXRlbXMuZm9yRWFjaCgoYUl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFyckl0ZW1FcnJvciA9IGZpbmRFcnJvcnMoW2FJdGVtXSwgY3VycmVudERhdGEpO1xuICAgICAgICBpZiAoYXJySXRlbUVycm9yICYmIE9iamVjdC52YWx1ZXMoYXJySXRlbUVycm9yKS5sZW5ndGgpIHtcbiAgICAgICAgICBlcnJvcnNbKGl0ZW0gYXMgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEpLmZvcm1OYW1lICsgJy4nICsgaW5kZXhdID0gYXJySXRlbUVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY2hlY2tJZihpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBjdXJyZW50RGF0YSkgJiZcbiAgICAgIChpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hKS5mb3JtTmFtZSAmJlxuICAgICAgKGl0ZW0gYXMgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEpLmZvcm1Db250cm9sICYmXG4gICAgICAoaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkuZm9ybUNvbnRyb2wuaW52YWxpZFxuICAgICkge1xuICAgICAgZXJyb3JzWyhpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hKS5mb3JtTmFtZV0gPSAoaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkuZm9ybUNvbnRyb2wuZXJyb3JzO1xuICAgIH1cbiAgICBpZiAoY2hlY2tJZihpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBjdXJyZW50RGF0YSkgJiYgaXRlbS5jaGlsZHJlbikge1xuICAgICAgT2JqZWN0LmFzc2lnbihlcnJvcnMsIGZpbmRFcnJvcnMoaXRlbS5jaGlsZHJlbiwgY3VycmVudERhdGEpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTY2hlbWEoZmllbGROYW1lOiBzdHJpbmcsIHNjaGVtYTogRmxleHlGb3JtTGF5b3V0U2NoZW1hW10pOiBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBzY2hlbWEpIHtcbiAgICBpZiAoKGl0ZW0gYXMgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEpLmZvcm1OYW1lICYmIChpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hKS5mb3JtTmFtZSA9PT0gZmllbGROYW1lKSB7XG4gICAgICByZXR1cm4gaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkU2NoZW1hID0gZmluZFNjaGVtYShmaWVsZE5hbWUsIGl0ZW0uY2hpbGRyZW4pO1xuICAgICAgaWYgKGNoaWxkU2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBjaGlsZFNjaGVtYTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGUoY2FsY0V4cDogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgbGV0IHZhbHVlO1xuICB0cnkge1xuICAgIGlmICghY2FsY3VsYXRlZEV4cHJlc2lvbkNhY2hlW2NhbGNFeHBdKSB7XG4gICAgICBjYWxjdWxhdGVkRXhwcmVzaW9uQ2FjaGVbY2FsY0V4cF0gPSBqc29uYXRhKGNhbGNFeHApO1xuICAgIH1cbiAgICB2YWx1ZSA9IGNhbGN1bGF0ZWRFeHByZXNpb25DYWNoZVtjYWxjRXhwXS5ldmFsdWF0ZShkYXRhKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVtYURhdGEoc2NoZW1hczogRmxleHlGb3JtTGF5b3V0U2NoZW1hW10sIGN1cnJlbnREYXRhOiBGbGV4eUZvcm1EYXRhLCBtb2RlID0gRmxleHlGb3JtRGF0YU1vZGUuQWxsKTogRmxleHlGb3JtRGF0YSB7XG4gIGxldCBkYXRhOiBGbGV4eUZvcm1EYXRhID0ge307XG4gIGlmIChzY2hlbWFzKSB7XG4gICAgc2NoZW1hcy5mb3JFYWNoKHNjaGVtYSA9PiB7XG4gICAgICBjb25zdCBmaWVsZFNjaGVtYTogRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEgPSBzY2hlbWEgYXMgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWE7XG4gICAgICBpZiAoY2hlY2tJZihmaWVsZFNjaGVtYSwgY3VycmVudERhdGEpKSB7XG4gICAgICAgIGNvbnN0IGlzRm9ybUNvbnRyb2wgPSBmaWVsZFNjaGVtYS5mb3JtQ29udHJvbCAmJiBmaWVsZFNjaGVtYS5mb3JtTmFtZTtcbiAgICAgICAgaWYgKGlzRm9ybUNvbnRyb2wgJiYgZmllbGRTY2hlbWEuZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgICAgIGlmIChjaGVja1NjaGVtYURhdGEoZmllbGRTY2hlbWEuZm9ybUNvbnRyb2wsIG1vZGUpKSB7XG4gICAgICAgICAgICBzZXQoZGF0YSwgZmllbGRTY2hlbWEuZm9ybU5hbWUsIGZpZWxkU2NoZW1hLmZvcm1Db250cm9sLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGb3JtQ29udHJvbCAmJiBmaWVsZFNjaGVtYS5mb3JtQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIGNvbnN0IGFycmF5RGF0YSA9IGdldEFycmF5RGF0YShmaWVsZFNjaGVtYSwgY3VycmVudERhdGEsIG1vZGUsIGRhdGEpO1xuXG4gICAgICAgICAgaWYgKG1vZGUgPT09IEZsZXh5Rm9ybURhdGFNb2RlLkFsbCkge1xuICAgICAgICAgICAgc2V0KGRhdGEsIGZpZWxkU2NoZW1hLmZvcm1OYW1lLCBPYmplY3QudmFsdWVzKGFycmF5RGF0YSkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWlzSW5wdXRFbXB0eShhcnJheURhdGEpKSB7XG4gICAgICAgICAgICBzZXQoZGF0YSwgZmllbGRTY2hlbWEuZm9ybU5hbWUsIGFycmF5RGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrSWYoZmllbGRTY2hlbWEsIGN1cnJlbnREYXRhKSkge1xuICAgICAgICAgIGRhdGEgPSBtZXJnZShkYXRhLCBnZXRTY2hlbWFEYXRhKGZpZWxkU2NoZW1hLmNoaWxkcmVuLCBjdXJyZW50RGF0YSwgbW9kZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUmVtb3ZlZChhbGxEYXRhLCBvcmlnaW5hbERhdGEpIHtcbiAgY29uc3QgcmVtb3ZlZCA9IHt9O1xuICBpZiAob3JpZ2luYWxEYXRhKSB7XG4gICAgT2JqZWN0LmtleXMob3JpZ2luYWxEYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0ga2V5O1xuICAgICAgaWYgKCFpc0lucHV0RW1wdHkob3JpZ2luYWxEYXRhW2tleV0pICYmIGlzSW5wdXRFbXB0eShhbGxEYXRhW2tleV0pKSB7XG4gICAgICAgIHNldChyZW1vdmVkLCBwYXRoLCBudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWxEYXRhW2tleV0gJiYgQXJyYXkuaXNBcnJheShvcmlnaW5hbERhdGFba2V5XSkpIHtcbiAgICAgICAgb3JpZ2luYWxEYXRhW2tleV0uZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoIWlzSW5wdXRFbXB0eShpdGVtKSAmJiBpc0lucHV0RW1wdHkoYWxsRGF0YVtrZXldW2luZGV4XSkpIHtcbiAgICAgICAgICAgIGlmICghaGFzKHJlbW92ZWQsIHBhdGgpKSB7XG4gICAgICAgICAgICAgIHNldChyZW1vdmVkLCBwYXRoLCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2ID0gZ2V0KHJlbW92ZWQsIHBhdGgpO1xuICAgICAgICAgICAgdlsnJyArIGluZGV4XSA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIGlmIChpdGVtICYmIGlzT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZGVkID0gZmluZFJlbW92ZWQoYWxsRGF0YVtrZXldW2luZGV4XSwgaXRlbSk7XG4gICAgICAgICAgICBpZiAoZm91bmRlZCAmJiAhaXNJbnB1dEVtcHR5KGZvdW5kZWQpKSB7XG4gICAgICAgICAgICAgIGlmICghaGFzKHJlbW92ZWQsIHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgc2V0KHJlbW92ZWQsIHBhdGgsIHt9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCB2ID0gZ2V0KHJlbW92ZWQsIHBhdGgpO1xuICAgICAgICAgICAgICB2WycnICsgaW5kZXhdID0gZm91bmRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbERhdGFba2V5XSAmJiBpc09iamVjdChvcmlnaW5hbERhdGFba2V5XSkpIHtcbiAgICAgICAgY29uc3QgZm91bmRlZCA9IGZpbmRSZW1vdmVkKGFsbERhdGFba2V5XSwgb3JpZ2luYWxEYXRhW2tleV0pO1xuICAgICAgICBpZiAoZm91bmRlZCAmJiAhaXNJbnB1dEVtcHR5KGZvdW5kZWQpKSB7XG4gICAgICAgICAgc2V0KHJlbW92ZWQsIHBhdGgsIGZvdW5kZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckVtcHR5QXJyYXlBbmRPYmplY3RzKGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgaWYgKGRhdGEpIHtcbiAgICBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGlzRW1wdHlTdHJ1Y3R1cmUoZGF0YVtrZXldKSkge1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YVtrZXldKSkge1xuICAgICAgICAgIGNsZWFyRW1wdHlBcnJheUFuZE9iamVjdHMoZGF0YVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGEpIHtcbiAgcmV0dXJuICEhYSAmJiBhLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSWYoZmllbGRTY2hlbWE6IEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBjdXJyZW50RGF0YTogRmxleHlGb3JtRGF0YSk6IGJvb2xlYW4ge1xuICBpZiAoIWZpZWxkU2NoZW1hLmlmKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgaWZOYW1lID0gJ0lGXycgKyBmaWVsZFNjaGVtYS5pZjtcbiAgbGV0IHJldDtcbiAgdHJ5IHtcbiAgICBpZiAoIWlmRXhwcmVzc2lvbnNDYWNoZVtpZk5hbWVdKSB7XG4gICAgICBpZkV4cHJlc3Npb25zQ2FjaGVbaWZOYW1lXSA9IGpzb25hdGEoZmllbGRTY2hlbWEuaWYpO1xuICAgIH1cbiAgICByZXQgPSBpZkV4cHJlc3Npb25zQ2FjaGVbaWZOYW1lXS5ldmFsdWF0ZShjdXJyZW50RGF0YSA/IGN1cnJlbnREYXRhIDoge30pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29uc29sZS5lcnJvcihlKTtcbiAgICByZXQgPSBudWxsO1xuICB9XG4gIHJldHVybiAhIXJldDtcbn1cblxuZnVuY3Rpb24gZ2V0QXJyYXlEYXRhKFxuICBmaWVsZFNjaGVtYTogRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEsXG4gIGN1cnJlbnREYXRhOiBGbGV4eUZvcm1EYXRhLFxuICBtb2RlOiBGbGV4eUZvcm1EYXRhTW9kZSxcbiAgZGF0YToge1tuYW1lOiBzdHJpbmddOiBhbnl9XG4pIHtcbiAgY29uc3QgYXJyYXlEYXRhID0ge307XG4gIGZpZWxkU2NoZW1hLml0ZW1zLmZvckVhY2goKGl0ZW06IEZsZXh5Rm9ybUxheW91dFNjaGVtYSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpdGVtRm9ybUNvbnRyb2wgPSAoaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkuZm9ybUNvbnRyb2w7XG4gICAgaWYgKCFpdGVtRm9ybUNvbnRyb2wgfHwgY2hlY2tTY2hlbWFEYXRhKGl0ZW1Gb3JtQ29udHJvbCwgbW9kZSkpIHtcbiAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1EYXRhID0gZ2V0U2NoZW1hRGF0YShpdGVtLmNoaWxkcmVuLCBjdXJyZW50RGF0YSwgbW9kZSk7XG4gICAgICAgIGlmICghaXNJbnB1dEVtcHR5KGl0ZW1EYXRhKSkge1xuICAgICAgICAgIGFycmF5RGF0YVsnJyArIGluZGV4XSA9IGl0ZW1EYXRhO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheURhdGFbJycgKyBpbmRleF0gPSAoaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkuZm9ybUNvbnRyb2wudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXJyYXlEYXRhO1xufVxuXG5mdW5jdGlvbiBjaGVja1NjaGVtYURhdGEoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBtb2RlOiBGbGV4eUZvcm1EYXRhTW9kZSkge1xuICByZXR1cm4gKFxuICAgIGNvbnRyb2wgJiZcbiAgICAobW9kZSA9PT0gRmxleHlGb3JtRGF0YU1vZGUuQWxsIHx8XG4gICAgICAobW9kZSA9PT0gRmxleHlGb3JtRGF0YU1vZGUuRGlydHkgJiYgY29udHJvbC5kaXJ0eSkgfHxcbiAgICAgIChtb2RlID09PSBGbGV4eUZvcm1EYXRhTW9kZS5Ub3VjaGVkICYmIGNvbnRyb2wudG91Y2hlZCkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzSW5wdXRFbXB0eSh2KSB7XG4gIHJldHVybiB2ID09PSB2b2lkIDAgfHwgdiA9PT0gJyc7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlTdHJ1Y3R1cmUoZGF0YTogYW55KSB7XG4gIGxldCByZXQgPSB0cnVlO1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIGRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgcmV0ID0gcmV0ICYmIGlzRW1wdHlTdHJ1Y3R1cmUoaXRlbSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICByZXQgPSByZXQgJiYgaXNFbXB0eVN0cnVjdHVyZShkYXRhW2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBpc0lucHV0RW1wdHkoZGF0YSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==