ngrx-forms
Version:
Proper integration of forms in Angular 4 applications using ngrx
41 lines • 14.6 kB
JavaScript
import { computeGroupState, isGroupState } from '../state';
import { ensureState } from './util';
function updateGroupControlsState(updateFns) {
return (state) => {
let hasChanged = false;
const newControls = Object.keys(state.controls).reduce((res, key) => {
const control = state.controls[key];
Object.assign(res, { [key]: control });
if (updateFns.hasOwnProperty(key)) {
const newControl = updateFns[key](control, state);
hasChanged = hasChanged || newControl !== control;
Object.assign(res, { [key]: newControl });
}
return res;
}, {});
return hasChanged ? newControls : state.controls;
};
}
function updateGroupSingle(updateFns) {
return (state) => {
const newControls = updateGroupControlsState(updateFns)(state);
return newControls !== state.controls
? computeGroupState(state.id, newControls, state.value, state.errors, state.pendingValidations, state.userDefinedProperties, {
wasOrShouldBeDirty: state.isDirty,
wasOrShouldBeEnabled: state.isEnabled,
wasOrShouldBeTouched: state.isTouched,
wasOrShouldBeSubmitted: state.isSubmitted,
})
: state;
};
}
export function updateGroup(stateOrUpdateFnOrUpdateFnArray, updateFnOrUpdateFnArr, ...rest) {
if (isGroupState(stateOrUpdateFnOrUpdateFnArray)) {
const updateFnArr = Array.isArray(updateFnOrUpdateFnArr) ? updateFnOrUpdateFnArr : [updateFnOrUpdateFnArr];
return updateFnArr.concat(...rest).reduce((s, updateFn) => updateGroupSingle(updateFn)(s), stateOrUpdateFnOrUpdateFnArray);
}
let updateFnArr = Array.isArray(stateOrUpdateFnOrUpdateFnArray) ? stateOrUpdateFnOrUpdateFnArray : [stateOrUpdateFnOrUpdateFnArray];
updateFnArr = updateFnOrUpdateFnArr === undefined ? updateFnArr : updateFnArr.concat(updateFnOrUpdateFnArr);
return (s) => updateGroup(ensureState(s), updateFnArr.concat(rest));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWdyb3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3VwZGF0ZS1mdW5jdGlvbi91cGRhdGUtZ3JvdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFnRCxZQUFZLEVBQVksTUFBTSxVQUFVLENBQUM7QUFDbkgsT0FBTyxFQUFFLFdBQVcsRUFBYyxNQUFNLFFBQVEsQ0FBQztBQU1qRCxTQUFTLHdCQUF3QixDQUEwQixTQUFpQztJQUMxRixPQUFPLENBQUMsS0FBNkIsRUFBRSxFQUFFO1FBQ3ZDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN2QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDbEUsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN2QyxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ25ELFVBQVUsR0FBRyxVQUFVLElBQUksVUFBVSxLQUFLLE9BQU8sQ0FBQztnQkFDbEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7YUFDM0M7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUErQixDQUFDLENBQUM7UUFDcEMsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNuRCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBMEIsU0FBaUM7SUFDbkYsT0FBTyxDQUFDLEtBQTZCLEVBQTBCLEVBQUU7UUFDL0QsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQVMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkUsT0FBTyxXQUFXLEtBQUssS0FBSyxDQUFDLFFBQVE7WUFDbkMsQ0FBQyxDQUFDLGlCQUFpQixDQUNqQixLQUFLLENBQUMsRUFBRSxFQUNSLFdBQVcsRUFDWCxLQUFLLENBQUMsS0FBSyxFQUNYLEtBQUssQ0FBQyxNQUFNLEVBQ1osS0FBSyxDQUFDLGtCQUFrQixFQUN4QixLQUFLLENBQUMscUJBQXFCLEVBQzNCO2dCQUNFLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUNqQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDckMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQ3JDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxXQUFXO2FBQzFDLENBQ0Y7WUFDRCxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1osQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQWdKRCxNQUFNLFVBQVUsV0FBVyxDQUN6Qiw4QkFBMEcsRUFDMUcscUJBQXlFLEVBQ3pFLEdBQUcsSUFBOEI7SUFFakMsSUFBSSxZQUFZLENBQVMsOEJBQThCLENBQUMsRUFBRTtRQUN4RCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFzQixDQUFDLENBQUM7UUFDNUcsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsOEJBQThCLENBQUMsQ0FBQztLQUNwSTtJQUVELElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUNwSSxXQUFXLEdBQUcscUJBQXFCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM1RyxPQUFPLENBQUMsQ0FBeUIsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVHcm91cFN0YXRlLCBGb3JtR3JvdXBDb250cm9scywgRm9ybUdyb3VwU3RhdGUsIEZvcm1TdGF0ZSwgaXNHcm91cFN0YXRlLCBLZXlWYWx1ZSB9IGZyb20gJy4uL3N0YXRlJztcclxuaW1wb3J0IHsgZW5zdXJlU3RhdGUsIFByb2plY3RGbjIgfSBmcm9tICcuL3V0aWwnO1xyXG5cclxuZXhwb3J0IHR5cGUgU3RhdGVVcGRhdGVGbnM8VFZhbHVlIGV4dGVuZHMgS2V5VmFsdWU+ID0ge1xyXG4gIFtjb250cm9sSWQgaW4ga2V5b2YgVFZhbHVlXT86IFByb2plY3RGbjI8Rm9ybVN0YXRlPFRWYWx1ZVtjb250cm9sSWRdPiwgRm9ybUdyb3VwU3RhdGU8VFZhbHVlPj47XHJcbn07XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVHcm91cENvbnRyb2xzU3RhdGU8VFZhbHVlIGV4dGVuZHMgS2V5VmFsdWU+KHVwZGF0ZUZuczogU3RhdGVVcGRhdGVGbnM8VFZhbHVlPikge1xyXG4gIHJldHVybiAoc3RhdGU6IEZvcm1Hcm91cFN0YXRlPFRWYWx1ZT4pID0+IHtcclxuICAgIGxldCBoYXNDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICBjb25zdCBuZXdDb250cm9scyA9IE9iamVjdC5rZXlzKHN0YXRlLmNvbnRyb2xzKS5yZWR1Y2UoKHJlcywga2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBzdGF0ZS5jb250cm9sc1trZXldO1xyXG4gICAgICBPYmplY3QuYXNzaWduKHJlcywgeyBba2V5XTogY29udHJvbCB9KTtcclxuICAgICAgaWYgKHVwZGF0ZUZucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgY29uc3QgbmV3Q29udHJvbCA9IHVwZGF0ZUZuc1trZXldIShjb250cm9sLCBzdGF0ZSk7XHJcbiAgICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV3Q29udHJvbCAhPT0gY29udHJvbDtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHJlcywgeyBba2V5XTogbmV3Q29udHJvbCB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfSwge30gYXMgRm9ybUdyb3VwQ29udHJvbHM8VFZhbHVlPik7XHJcbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5ld0NvbnRyb2xzIDogc3RhdGUuY29udHJvbHM7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlR3JvdXBTaW5nbGU8VFZhbHVlIGV4dGVuZHMgS2V5VmFsdWU+KHVwZGF0ZUZuczogU3RhdGVVcGRhdGVGbnM8VFZhbHVlPikge1xyXG4gIHJldHVybiAoc3RhdGU6IEZvcm1Hcm91cFN0YXRlPFRWYWx1ZT4pOiBGb3JtR3JvdXBTdGF0ZTxUVmFsdWU+ID0+IHtcclxuICAgIGNvbnN0IG5ld0NvbnRyb2xzID0gdXBkYXRlR3JvdXBDb250cm9sc1N0YXRlPFRWYWx1ZT4odXBkYXRlRm5zKShzdGF0ZSk7XHJcbiAgICByZXR1cm4gbmV3Q29udHJvbHMgIT09IHN0YXRlLmNvbnRyb2xzXHJcbiAgICAgID8gY29tcHV0ZUdyb3VwU3RhdGU8VFZhbHVlPihcclxuICAgICAgICBzdGF0ZS5pZCxcclxuICAgICAgICBuZXdDb250cm9scyxcclxuICAgICAgICBzdGF0ZS52YWx1ZSxcclxuICAgICAgICBzdGF0ZS5lcnJvcnMsXHJcbiAgICAgICAgc3RhdGUucGVuZGluZ1ZhbGlkYXRpb25zLFxyXG4gICAgICAgIHN0YXRlLnVzZXJEZWZpbmVkUHJvcGVydGllcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB3YXNPclNob3VsZEJlRGlydHk6IHN0YXRlLmlzRGlydHksXHJcbiAgICAgICAgICB3YXNPclNob3VsZEJlRW5hYmxlZDogc3RhdGUuaXNFbmFibGVkLFxyXG4gICAgICAgICAgd2FzT3JTaG91bGRCZVRvdWNoZWQ6IHN0YXRlLmlzVG91Y2hlZCxcclxuICAgICAgICAgIHdhc09yU2hvdWxkQmVTdWJtaXR0ZWQ6IHN0YXRlLmlzU3VibWl0dGVkLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIClcclxuICAgICAgOiBzdGF0ZTtcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogVGhpcyB1cGRhdGUgZnVuY3Rpb24gdGFrZXMgb25lIG9yIG1vcmUgdXBkYXRlIGZ1bmN0aW9uIG9iamVjdHMgYW5kIHJldHVybnNcclxuICogYSBwcm9qZWN0aW9uIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyBhbGwgb2JqZWN0cyBvbmUgYWZ0ZXIgYW5vdGhlciB0byBhIGZvcm1cclxuICogZ3JvdXAgc3RhdGUuXHJcbiAqXHJcbiAqIFRoZSBmb2xsb3dpbmcgKGNvbnRyaXZlZCkgZXhhbXBsZSB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIGNoaWxkXHJcbiAqIGNvbnRyb2wgYG5hbWVgIHRvIGJlIHJlcXVpcmVkIGFuZCBzZXQgdGhlIGNoaWxkIGNvbnRyb2wgYGVtYWlsYCdzIHZhbHVlIHRvXHJcbiAqIGJlIGAnJ2AgaWYgdGhlIG5hbWUgaXMgaW52YWxpZC5cclxuICpcclxuYGBgdHlwZXNjcmlwdFxyXG5pbnRlcmZhY2UgRm9ybVZhbHVlIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZW1haWw6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgZ3JvdXBVcGRhdGVGbiA9IHVwZGF0ZUdyb3VwPEZvcm1WYWx1ZT4oXHJcbiAge1xyXG4gICAgbmFtZTogdmFsaWRhdGU8c3RyaW5nPihyZXF1aXJlZCksXHJcbiAgfSxcclxuICB7XHJcbiAgICBlbWFpbDogKGVtYWlsLCBwYXJlbnRHcm91cCkgPT5cclxuICAgICAgcGFyZW50R3JvdXAuY29udHJvbHMubmFtZS5pc0ludmFsaWRcclxuICAgICAgICA/IHNldFZhbHVlKCcnLCBlbWFpbClcclxuICAgICAgICA6IGVtYWlsLFxyXG4gIH0sXHJcbik7XHJcbmNvbnN0IHVwZGF0ZWRTdGF0ZSA9IGdyb3VwVXBkYXRlRm4oc3RhdGUpO1xyXG5gYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVHcm91cDxUVmFsdWUgZXh0ZW5kcyBLZXlWYWx1ZT4oXHJcbiAgdXBkYXRlRm46IFN0YXRlVXBkYXRlRm5zPFRWYWx1ZT4sXHJcbiAgLi4udXBkYXRlRm5zQXJyOiBTdGF0ZVVwZGF0ZUZuczxUVmFsdWU+W11cclxuKTogKHN0YXRlOiBGb3JtR3JvdXBTdGF0ZTxUVmFsdWU+KSA9PiBGb3JtR3JvdXBTdGF0ZTxUVmFsdWU+O1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdXBkYXRlIGZ1bmN0aW9uIHRha2VzIGFuIGFycmF5IG9mIHVwZGF0ZSBmdW5jdGlvbiBvYmplY3RzIGFuZFxyXG4gKiByZXR1cm5zIGEgcHJvamVjdGlvbiBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYWxsIG9iamVjdHMgb25lIGFmdGVyIGFub3RoZXIgdG9cclxuICogYSBmb3JtIGdyb3VwIHN0YXRlLlxyXG4gKlxyXG4gKiBUaGUgZm9sbG93aW5nIChjb250cml2ZWQpIGV4YW1wbGUgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSBjaGlsZFxyXG4gKiBjb250cm9sIGBuYW1lYCB0byBiZSByZXF1aXJlZCBhbmQgc2V0IHRoZSBjaGlsZCBjb250cm9sIGBlbWFpbGAncyB2YWx1ZSB0b1xyXG4gKiBiZSBgJydgIGlmIHRoZSBuYW1lIGlzIGludmFsaWQuXHJcbiAqXHJcbmBgYHR5cGVzY3JpcHRcclxuaW50ZXJmYWNlIEZvcm1WYWx1ZSB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IGdyb3VwVXBkYXRlRm4gPSB1cGRhdGVHcm91cDxGb3JtVmFsdWU+KFxyXG4gIFtcclxuICAgIHtcclxuICAgICAgbmFtZTogdmFsaWRhdGU8c3RyaW5nPihyZXF1aXJlZCksXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBlbWFpbDogKGVtYWlsLCBwYXJlbnRHcm91cCkgPT5cclxuICAgICAgICBwYXJlbnRHcm91cC5jb250cm9scy5uYW1lLmlzSW52YWxpZFxyXG4gICAgICAgICAgPyBzZXRWYWx1ZSgnJywgZW1haWwpXHJcbiAgICAgICAgICA6IGVtYWlsLFxyXG4gICAgfSxcclxuICBdLFxyXG4pO1xyXG5jb25zdCB1cGRhdGVkU3RhdGUgPSBncm91cFVwZGF0ZUZuKHN0YXRlKTtcclxuYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlR3JvdXA8VFZhbHVlIGV4dGVuZHMgS2V5VmFsdWU+KFxyXG4gIHVwZGF0ZUZuc0FycjogU3RhdGVVcGRhdGVGbnM8VFZhbHVlPltdLFxyXG4pOiAoc3RhdGU6IEZvcm1Hcm91cFN0YXRlPFRWYWx1ZT4pID0+IEZvcm1Hcm91cFN0YXRlPFRWYWx1ZT47XHJcblxyXG4vKipcclxuICogVGhpcyB1cGRhdGUgZnVuY3Rpb24gdGFrZXMgYSBmb3JtIGdyb3VwIHN0YXRlIGFuZCBvbmUgb3IgbW9yZSB1cGRhdGVcclxuICogZnVuY3Rpb24gb2JqZWN0cyBhbmQgYXBwbGllcyBhbGwgb2JqZWN0cyBvbmUgYWZ0ZXIgYW5vdGhlciB0byB0aGUgc3RhdGUuXHJcbiAqIFByb3ZpZGluZyBtdWx0aXBsZSB1cGRhdGUgZnVuY3Rpb24gb2JqZWN0cyBpcyBtYWlubHkgdXNlZnVsIGlmIHRoZSByZXN1bHRcclxuICogb2YgYSBsYXRlciBvYmplY3QgZGVwZW5kcyBvbiB0aGUgcmVzdWx0IG9mIHByZXZpb3VzIG9iamVjdHMuXHJcbiAqXHJcbiAqIFRoZSBmb2xsb3dpbmcgKGNvbnRyaXZlZCkgZXhhbXBsZSB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIGNoaWxkXHJcbiAqIGNvbnRyb2wgYG5hbWVgIHRvIGJlIHJlcXVpcmVkIGFuZCBzZXQgdGhlIGNoaWxkIGNvbnRyb2wgYGVtYWlsYCdzIHZhbHVlIHRvXHJcbiAqIGJlIGAnJ2AgaWYgdGhlIG5hbWUgaXMgaW52YWxpZC5cclxuICpcclxuYGBgdHlwZXNjcmlwdFxyXG5pbnRlcmZhY2UgRm9ybVZhbHVlIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZW1haWw6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgdXBkYXRlZFN0YXRlID0gdXBkYXRlR3JvdXA8Rm9ybVZhbHVlPihcclxuICBzdGF0ZSxcclxuICB7XHJcbiAgICBuYW1lOiB2YWxpZGF0ZTxzdHJpbmc+KHJlcXVpcmVkKSxcclxuICB9LFxyXG4gIHtcclxuICAgIGVtYWlsOiAoZW1haWwsIHBhcmVudEdyb3VwKSA9PlxyXG4gICAgICBwYXJlbnRHcm91cC5jb250cm9scy5uYW1lLmlzSW52YWxpZFxyXG4gICAgICAgID8gc2V0VmFsdWUoJycsIGVtYWlsKVxyXG4gICAgICAgIDogZW1haWwsXHJcbiAgfSxcclxuKTtcclxuYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlR3JvdXA8VFZhbHVlIGV4dGVuZHMgS2V5VmFsdWU+KFxyXG4gIHN0YXRlOiBGb3JtR3JvdXBTdGF0ZTxUVmFsdWU+LFxyXG4gIHVwZGF0ZUZuOiBTdGF0ZVVwZGF0ZUZuczxUVmFsdWU+LFxyXG4gIC4uLnVwZGF0ZUZuc0FycjogU3RhdGVVcGRhdGVGbnM8VFZhbHVlPltdXHJcbik6IEZvcm1Hcm91cFN0YXRlPFRWYWx1ZT47XHJcblxyXG4vKipcclxuICogVGhpcyB1cGRhdGUgZnVuY3Rpb24gdGFrZXMgYSBmb3JtIGdyb3VwIHN0YXRlIGFuZCBhbiBhcnJheSBvZiB1cGRhdGVcclxuICogZnVuY3Rpb24gb2JqZWN0cyBhbmQgYXBwbGllcyBhbGwgb2JqZWN0cyBvbmUgYWZ0ZXIgYW5vdGhlciB0byB0aGUgc3RhdGUuXHJcbiAqIFByb3ZpZGluZyBtdWx0aXBsZSB1cGRhdGUgZnVuY3Rpb24gb2JqZWN0cyBpcyBtYWlubHkgdXNlZnVsIGlmIHRoZSByZXN1bHRcclxuICogb2YgYSBsYXRlciBvYmplY3QgZGVwZW5kcyBvbiB0aGUgcmVzdWx0IG9mIHByZXZpb3VzIG9iamVjdHMuXHJcbiAqXHJcbiAqIFRoZSBmb2xsb3dpbmcgKGNvbnRyaXZlZCkgZXhhbXBsZSB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIGNoaWxkXHJcbiAqIGNvbnRyb2wgYG5hbWVgIHRvIGJlIHJlcXVpcmVkIGFuZCBzZXQgdGhlIGNoaWxkIGNvbnRyb2wgYGVtYWlsYCdzIHZhbHVlIHRvXHJcbiAqIGJlIGAnJ2AgaWYgdGhlIG5hbWUgaXMgaW52YWxpZC5cclxuICpcclxuYGBgdHlwZXNjcmlwdFxyXG5pbnRlcmZhY2UgRm9ybVZhbHVlIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZW1haWw6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgdXBkYXRlZFN0YXRlID0gdXBkYXRlR3JvdXA8Rm9ybVZhbHVlPihcclxuICBzdGF0ZSxcclxuICBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6IHZhbGlkYXRlPHN0cmluZz4ocmVxdWlyZWQpLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZW1haWw6IChlbWFpbCwgcGFyZW50R3JvdXApID0+XHJcbiAgICAgICAgcGFyZW50R3JvdXAuY29udHJvbHMubmFtZS5pc0ludmFsaWRcclxuICAgICAgICAgID8gc2V0VmFsdWUoJycsIGVtYWlsKVxyXG4gICAgICAgICAgOiBlbWFpbCxcclxuICAgIH0sXHJcbiAgXSxcclxuKTtcclxuYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlR3JvdXA8VFZhbHVlIGV4dGVuZHMgS2V5VmFsdWU+KFxyXG4gIHN0YXRlOiBGb3JtR3JvdXBTdGF0ZTxUVmFsdWU+LFxyXG4gIHVwZGF0ZUZuc0FycjogU3RhdGVVcGRhdGVGbnM8VFZhbHVlPltdLFxyXG4pOiBGb3JtR3JvdXBTdGF0ZTxUVmFsdWU+O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUdyb3VwPFRWYWx1ZSBleHRlbmRzIEtleVZhbHVlPihcclxuICBzdGF0ZU9yVXBkYXRlRm5PclVwZGF0ZUZuQXJyYXk6IEZvcm1Hcm91cFN0YXRlPFRWYWx1ZT4gfCBTdGF0ZVVwZGF0ZUZuczxUVmFsdWU+IHwgU3RhdGVVcGRhdGVGbnM8VFZhbHVlPltdLFxyXG4gIHVwZGF0ZUZuT3JVcGRhdGVGbkFycj86IFN0YXRlVXBkYXRlRm5zPFRWYWx1ZT4gfCBTdGF0ZVVwZGF0ZUZuczxUVmFsdWU+W10sXHJcbiAgLi4ucmVzdDogU3RhdGVVcGRhdGVGbnM8VFZhbHVlPltdXHJcbikge1xyXG4gIGlmIChpc0dyb3VwU3RhdGU8VFZhbHVlPihzdGF0ZU9yVXBkYXRlRm5PclVwZGF0ZUZuQXJyYXkpKSB7XHJcbiAgICBjb25zdCB1cGRhdGVGbkFyciA9IEFycmF5LmlzQXJyYXkodXBkYXRlRm5PclVwZGF0ZUZuQXJyKSA/IHVwZGF0ZUZuT3JVcGRhdGVGbkFyciA6IFt1cGRhdGVGbk9yVXBkYXRlRm5BcnIhXTtcclxuICAgIHJldHVybiB1cGRhdGVGbkFyci5jb25jYXQoLi4ucmVzdCkucmVkdWNlKChzLCB1cGRhdGVGbikgPT4gdXBkYXRlR3JvdXBTaW5nbGU8VFZhbHVlPih1cGRhdGVGbikocyksIHN0YXRlT3JVcGRhdGVGbk9yVXBkYXRlRm5BcnJheSk7XHJcbiAgfVxyXG5cclxuICBsZXQgdXBkYXRlRm5BcnIgPSBBcnJheS5pc0FycmF5KHN0YXRlT3JVcGRhdGVGbk9yVXBkYXRlRm5BcnJheSkgPyBzdGF0ZU9yVXBkYXRlRm5PclVwZGF0ZUZuQXJyYXkgOiBbc3RhdGVPclVwZGF0ZUZuT3JVcGRhdGVGbkFycmF5XTtcclxuICB1cGRhdGVGbkFyciA9IHVwZGF0ZUZuT3JVcGRhdGVGbkFyciA9PT0gdW5kZWZpbmVkID8gdXBkYXRlRm5BcnIgOiB1cGRhdGVGbkFyci5jb25jYXQodXBkYXRlRm5PclVwZGF0ZUZuQXJyKTtcclxuICByZXR1cm4gKHM6IEZvcm1Hcm91cFN0YXRlPFRWYWx1ZT4pID0+IHVwZGF0ZUdyb3VwPFRWYWx1ZT4oZW5zdXJlU3RhdGUocyksIHVwZGF0ZUZuQXJyLmNvbmNhdChyZXN0KSk7XHJcbn1cclxuIl19