UNPKG

ngrx-forms

Version:

Proper integration of forms in Angular 4 applications using ngrx

51 lines 20.9 kB
import { computeArrayState, isArrayState } from '../state'; import { ensureState } from './util'; function updateArrayControlsState(filterFn, updateFn) { return (state) => { let hasChanged = false; const newControls = state.controls.map((control, idx) => { if (!filterFn(control, idx)) { return control; } const newControl = updateFn(control, state); hasChanged = hasChanged || newControl !== control; return newControl; }); return hasChanged ? newControls : state.controls; }; } function updateArraySingle(filterFn, updateFn) { return (state) => { const newControls = updateArrayControlsState(filterFn, updateFn)(state); return newControls !== state.controls ? computeArrayState(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 updateArrayWithFilter(stateOrFilterFunction, filterFunctionOrFunctionOrFunctionArray, updateFnOrUpdateFnArr, ...rest) { if (isArrayState(stateOrFilterFunction)) { const filterFn = filterFunctionOrFunctionOrFunctionArray; const updateFnArr = Array.isArray(updateFnOrUpdateFnArr) ? updateFnOrUpdateFnArr : [updateFnOrUpdateFnArr]; return updateFnArr.concat(...rest).reduce((s, updateFn) => updateArraySingle(filterFn, updateFn)(s), stateOrFilterFunction); } let updateFnArr = Array.isArray(filterFunctionOrFunctionOrFunctionArray) ? filterFunctionOrFunctionOrFunctionArray : [filterFunctionOrFunctionOrFunctionArray]; updateFnArr = updateFnOrUpdateFnArr === undefined ? updateFnArr : updateFnArr.concat(updateFnOrUpdateFnArr); return (s) => updateArrayWithFilter(ensureState(s), stateOrFilterFunction, updateFnArr.concat(rest)); } export function updateArray(stateOrFunctionOrFunctionArray, updateFnOrUpdateFnArr, ...rest) { if (isArrayState(stateOrFunctionOrFunctionArray)) { const updateFnArr = Array.isArray(updateFnOrUpdateFnArr) ? updateFnOrUpdateFnArr : [updateFnOrUpdateFnArr]; return updateFnArr.concat(...rest).reduce((s, updateFn) => updateArraySingle(() => true, updateFn)(s), stateOrFunctionOrFunctionArray); } let updateFnArr = Array.isArray(stateOrFunctionOrFunctionArray) ? stateOrFunctionOrFunctionArray : [stateOrFunctionOrFunctionArray]; updateFnArr = updateFnOrUpdateFnArr === undefined ? updateFnArr : updateFnArr.concat(updateFnOrUpdateFnArr); return (s) => updateArray(ensureState(s), updateFnArr.concat(rest)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3VwZGF0ZS1mdW5jdGlvbi91cGRhdGUtYXJyYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUE2QixZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEYsT0FBTyxFQUFFLFdBQVcsRUFBYyxNQUFNLFFBQVEsQ0FBQztBQUlqRCxTQUFTLHdCQUF3QixDQUFTLFFBQTBCLEVBQUUsUUFBK0Q7SUFDbkksT0FBTyxDQUFDLEtBQTZCLEVBQUUsRUFBRTtRQUN2QyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDdkIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQzNCLE9BQU8sT0FBTyxDQUFDO2FBQ2hCO1lBRUQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1QyxVQUFVLEdBQUcsVUFBVSxJQUFJLFVBQVUsS0FBSyxPQUFPLENBQUM7WUFDbEQsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQ25ELENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFTLFFBQTBCLEVBQUUsUUFBK0Q7SUFDNUgsT0FBTyxDQUFDLEtBQTZCLEVBQTBCLEVBQUU7UUFDL0QsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQVMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hGLE9BQU8sV0FBVyxLQUFL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QVcsQ0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3RHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlQXJyYXlTdGF0ZSwgRm9ybUFycmF5U3RhdGUsIEZvcm1TdGF0ZSwgaXNBcnJheVN0YXRlIH0gZnJvbSAnLi4vc3RhdGUnO1xyXG5pbXBvcnQgeyBlbnN1cmVTdGF0ZSwgUHJvamVjdEZuMiB9IGZyb20gJy4vdXRpbCc7XHJcblxyXG5leHBvcnQgdHlwZSBGaWx0ZXJGbjxUVmFsdWU+ID0gKHM6IEZvcm1TdGF0ZTxUVmFsdWU+LCBpZHg6IG51bWJlcikgPT4gYm9vbGVhbjtcclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUFycmF5Q29udHJvbHNTdGF0ZTxUVmFsdWU+KGZpbHRlckZuOiBGaWx0ZXJGbjxUVmFsdWU+LCB1cGRhdGVGbjogUHJvamVjdEZuMjxGb3JtU3RhdGU8VFZhbHVlPiwgRm9ybUFycmF5U3RhdGU8VFZhbHVlPj4pIHtcclxuICByZXR1cm4gKHN0YXRlOiBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+KSA9PiB7XHJcbiAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgY29uc3QgbmV3Q29udHJvbHMgPSBzdGF0ZS5jb250cm9scy5tYXAoKGNvbnRyb2wsIGlkeCkgPT4ge1xyXG4gICAgICBpZiAoIWZpbHRlckZuKGNvbnRyb2wsIGlkeCkpIHtcclxuICAgICAgICByZXR1cm4gY29udHJvbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbmV3Q29udHJvbCA9IHVwZGF0ZUZuKGNvbnRyb2wsIHN0YXRlKTtcclxuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV3Q29udHJvbCAhPT0gY29udHJvbDtcclxuICAgICAgcmV0dXJuIG5ld0NvbnRyb2w7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV3Q29udHJvbHMgOiBzdGF0ZS5jb250cm9scztcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVBcnJheVNpbmdsZTxUVmFsdWU+KGZpbHRlckZuOiBGaWx0ZXJGbjxUVmFsdWU+LCB1cGRhdGVGbjogUHJvamVjdEZuMjxGb3JtU3RhdGU8VFZhbHVlPiwgRm9ybUFycmF5U3RhdGU8VFZhbHVlPj4pIHtcclxuICByZXR1cm4gKHN0YXRlOiBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+KTogRm9ybUFycmF5U3RhdGU8VFZhbHVlPiA9PiB7XHJcbiAgICBjb25zdCBuZXdDb250cm9scyA9IHVwZGF0ZUFycmF5Q29udHJvbHNTdGF0ZTxUVmFsdWU+KGZpbHRlckZuLCB1cGRhdGVGbikoc3RhdGUpO1xyXG4gICAgcmV0dXJuIG5ld0NvbnRyb2xzICE9PSBzdGF0ZS5jb250cm9sc1xyXG4gICAgICA/IGNvbXB1dGVBcnJheVN0YXRlPFRWYWx1ZT4oXHJcbiAgICAgICAgc3RhdGUuaWQsXHJcbiAgICAgICAgbmV3Q29udHJvbHMsXHJcbiAgICAgICAgc3RhdGUudmFsdWUsXHJcbiAgICAgICAgc3RhdGUuZXJyb3JzLFxyXG4gICAgICAgIHN0YXRlLnBlbmRpbmdWYWxpZGF0aW9ucyxcclxuICAgICAgICBzdGF0ZS51c2VyRGVmaW5lZFByb3BlcnRpZXMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgd2FzT3JTaG91bGRCZURpcnR5OiBzdGF0ZS5pc0RpcnR5LFxyXG4gICAgICAgICAgd2FzT3JTaG91bGRCZUVuYWJsZWQ6IHN0YXRlLmlzRW5hYmxlZCxcclxuICAgICAgICAgIHdhc09yU2hvdWxkQmVUb3VjaGVkOiBzdGF0ZS5pc1RvdWNoZWQsXHJcbiAgICAgICAgICB3YXNPclNob3VsZEJlU3VibWl0dGVkOiBzdGF0ZS5pc1N1Ym1pdHRlZCxcclxuICAgICAgICB9LFxyXG4gICAgICApXHJcbiAgICAgIDogc3RhdGU7XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgdXBkYXRlIGZ1bmN0aW9uIHRha2VzIGEgZmlsdGVyIGZ1bmN0aW9uIGFuZCBvbmUgb3IgbW9yZSB1cGRhdGUgZnVuY3Rpb25zXHJcbiAqIGFuZCByZXR1cm5zIGEgcHJvamVjdGlvbiBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYWxsIHVwZGF0ZSBmdW5jdGlvbnMgb25lIGFmdGVyXHJcbiAqIGFub3RoZXIgdG8gZWFjaCBlbGVtZW50IG9mIHRoZSBmb3JtIGFycmF5IHN0YXRlIGZvciB3aGljaCB0aGUgZmlsdGVyIGZ1bmN0aW9uXHJcbiAqIHJldHVybnMgYHRydWVgLlxyXG4gKlxyXG4gKiBUaGUgZm9sbG93aW5nIChjb250cml2ZWQpIGV4YW1wbGUgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGFsbCBpdHNcclxuICogY2hpbGRyZW4gdG8gYmUgcmVxdWlyZWQgYW5kIG1hcmsgdGhlbSBhcyBkaXJ0eS5cclxuICpcclxuYGBgdHlwZXNjcmlwdFxyXG5jb25zdCBhcnJheVVwZGF0ZUZuID0gdXBkYXRlQXJyYXk8c3RyaW5nPihcclxuICAoXywgaWR4KSA9PiBpZHggPiAwLFxyXG4gIHZhbGlkYXRlKHJlcXVpcmVkKSxcclxuICBtYXJrQXNEaXJ0eSxcclxuKTtcclxuY29uc3QgdXBkYXRlZFN0YXRlID0gYXJyYXlVcGRhdGVGbihzdGF0ZSk7XHJcbmBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFycmF5V2l0aEZpbHRlcjxUVmFsdWU+KFxyXG4gIGZpbHRlckZuOiBGaWx0ZXJGbjxUVmFsdWU+LFxyXG4gIHVwZGF0ZUZuOiBQcm9qZWN0Rm4yPEZvcm1TdGF0ZTxUVmFsdWU+LCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+PixcclxuICAuLi51cGRhdGVGbkFycjogUHJvamVjdEZuMjxGb3JtU3RhdGU8VFZhbHVlPiwgRm9ybUFycmF5U3RhdGU8VFZhbHVlPj5bXVxyXG4pOiAoc3RhdGU6IEZvcm1BcnJheVN0YXRlPFRWYWx1ZT4pID0+IEZvcm1BcnJheVN0YXRlPFRWYWx1ZT47XHJcblxyXG4vKipcclxuICogVGhpcyB1cGRhdGUgZnVuY3Rpb24gdGFrZXMgYSBmaWx0ZXIgZnVuY3Rpb24gYW5kIGFuIGFycmF5IG9mIHVwZGF0ZSBmdW5jdGlvbnNcclxuICogYW5kIHJldHVybnMgYSBwcm9qZWN0aW9uIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyBhbGwgdXBkYXRlIGZ1bmN0aW9ucyBvbmUgYWZ0ZXJcclxuICogYW5vdGhlciB0byBlYWNoIGVsZW1lbnQgb2YgdGhlIGZvcm0gYXJyYXkgc3RhdGUgZm9yIHdoaWNoIHRoZSBmaWx0ZXIgZnVuY3Rpb25cclxuICogcmV0dXJucyBgdHJ1ZWAuXHJcbiAqXHJcbiAqIFRoZSBmb2xsb3dpbmcgKGNvbnRyaXZlZCkgZXhhbXBsZSB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gdmFsaWRhdGUgYWxsIGl0c1xyXG4gKiBjaGlsZHJlbiB0byBiZSByZXF1aXJlZCBhbmQgbWFyayB0aGVtIGFzIGRpcnR5LlxyXG4gKlxyXG5gYGB0eXBlc2NyaXB0XHJcbmNvbnN0IGFycmF5VXBkYXRlRm4gPSB1cGRhdGVBcnJheTxzdHJpbmc+KFxyXG4gIChfLCBpZHgpID0+IGlkeCA+IDAsXHJcbiAgW1xyXG4gICAgdmFsaWRhdGUocmVxdWlyZWQpLFxyXG4gICAgbWFya0FzRGlydHksXHJcbiAgXSxcclxuKTtcclxuY29uc3QgdXBkYXRlZFN0YXRlID0gYXJyYXlVcGRhdGVGbihzdGF0ZSk7XHJcbmBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFycmF5V2l0aEZpbHRlcjxUVmFsdWU+KFxyXG4gIGZpbHRlckZuOiBGaWx0ZXJGbjxUVmFsdWU+LFxyXG4gIHVwZGF0ZUZuQXJyOiBQcm9qZWN0Rm4yPEZvcm1TdGF0ZTxUVmFsdWU+LCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+PltdLFxyXG4pOiAoc3RhdGU6IEZvcm1BcnJheVN0YXRlPFRWYWx1ZT4pID0+IEZvcm1BcnJheVN0YXRlPFRWYWx1ZT47XHJcblxyXG4vKipcclxuICogVGhpcyB1cGRhdGUgZnVuY3Rpb24gdGFrZXMgYSBmb3JtIGFycmF5IHN0YXRlLCBhIGZpbHRlciBmdW5jdGlvbiwgYW5kIGEgdmFyaWFibGVcclxuICogbnVtYmVyIG9mIHVwZGF0ZSBmdW5jdGlvbnMgYW5kIGFwcGxpZXMgYWxsIHVwZGF0ZSBmdW5jdGlvbnMgb25lIGFmdGVyIGFub3RoZXIgdG9cclxuICogZWFjaCBlbGVtZW50IG9mIHRoZSBmb3JtIGFycmF5IHN0YXRlIGZvciB3aGljaCB0aGUgZmlsdGVyIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgLlxyXG4gKlxyXG4gKiBUaGUgZm9sbG93aW5nIChjb250cml2ZWQpIGV4YW1wbGUgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGFsbCBpdHNcclxuICogY2hpbGRyZW4gdG8gYmUgcmVxdWlyZWQgYW5kIG1hcmsgdGhlbSBhcyBkaXJ0eS5cclxuICpcclxuYGBgdHlwZXNjcmlwdFxyXG5jb25zdCB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBcnJheTxzdHJpbmc+KFxyXG4gIHN0YXRlLFxyXG4gIChfLCBpZHgpID0+IGlkeCA+IDAsXHJcbiAgdmFsaWRhdGUocmVxdWlyZWQpLFxyXG4gIG1hcmtBc0RpcnR5LFxyXG4pO1xyXG5gYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBcnJheVdpdGhGaWx0ZXI8VFZhbHVlPihcclxuICBzdGF0ZTogRm9ybUFycmF5U3RhdGU8VFZhbHVlPixcclxuICBmaWx0ZXJGbjogRmlsdGVyRm48VFZhbHVlPixcclxuICB1cGRhdGVGbjogUHJvamVjdEZuMjxGb3JtU3RhdGU8VFZhbHVlPiwgRm9ybUFycmF5U3RhdGU8VFZhbHVlPj4sXHJcbiAgLi4udXBkYXRlRm5BcnI6IFByb2plY3RGbjI8Rm9ybVN0YXRlPFRWYWx1ZT4sIEZvcm1BcnJheVN0YXRlPFRWYWx1ZT4+W11cclxuKTogRm9ybUFycmF5U3RhdGU8VFZhbHVlPjtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHVwZGF0ZSBmdW5jdGlvbiB0YWtlcyBhIGZvcm0gYXJyYXkgc3RhdGUsIGEgZmlsdGVyIGZ1bmN0aW9uLCBhbmQgYW4gYXJyYXkgb2ZcclxuICogdXBkYXRlIGZ1bmN0aW9ucyBhbmQgYXBwbGllcyBhbGwgdXBkYXRlIGZ1bmN0aW9ucyBvbmUgYWZ0ZXIgYW5vdGhlciB0byBlYWNoXHJcbiAqIGVsZW1lbnQgb2YgdGhlIGZvcm0gYXJyYXkgc3RhdGUgZm9yIHdoaWNoIHRoZSBmaWx0ZXIgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAuXHJcbiAqXHJcbiAqIFRoZSBmb2xsb3dpbmcgKGNvbnRyaXZlZCkgZXhhbXBsZSB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gdmFsaWRhdGUgYWxsIGl0c1xyXG4gKiBjaGlsZHJlbiB0byBiZSByZXF1aXJlZCBhbmQgbWFyayB0aGVtIGFzIGRpcnR5LlxyXG4gKlxyXG5gYGB0eXBlc2NyaXB0XHJcbmNvbnN0IHVwZGF0ZWRTdGF0ZSA9IHVwZGF0ZUFycmF5PHN0cmluZz4oXHJcbiAgc3RhdGUsXHJcbiAgKF8sIGlkeCkgPT4gaWR4ID4gMCxcclxuICBbXHJcbiAgICB2YWxpZGF0ZShyZXF1aXJlZCksXHJcbiAgICBtYXJrQXNEaXJ0eSxcclxuICBdLFxyXG4pO1xyXG5gYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBcnJheVdpdGhGaWx0ZXI8VFZhbHVlPihcclxuICBzdGF0ZTogRm9ybUFycmF5U3RhdGU8VFZhbHVlPixcclxuICBmaWx0ZXJGbjogRmlsdGVyRm48VFZhbHVlPixcclxuICB1cGRhdGVGbkFycjogUHJvamVjdEZuMjxGb3JtU3RhdGU8VFZhbHVlPiwgRm9ybUFycmF5U3RhdGU8VFZhbHVlPj5bXSxcclxuKTogRm9ybUFycmF5U3RhdGU8VFZhbHVlPjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBcnJheVdpdGhGaWx0ZXI8VFZhbHVlPihcclxuICBzdGF0ZU9yRmlsdGVyRnVuY3Rpb246IEZvcm1BcnJheVN0YXRlPFRWYWx1ZT4gfCBGaWx0ZXJGbjxUVmFsdWU+LFxyXG4gIGZpbHRlckZ1bmN0aW9uT3JGdW5jdGlvbk9yRnVuY3Rpb25BcnJheTpcclxuICAgIHwgRmlsdGVyRm48VFZhbHVlPlxyXG4gICAgfCBQcm9qZWN0Rm4yPEZvcm1TdGF0ZTxUVmFsdWU+LCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+PlxyXG4gICAgfCBQcm9qZWN0Rm4yPEZvcm1TdGF0ZTxUVmFsdWU+LCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+PltdLFxyXG4gIHVwZGF0ZUZuT3JVcGRhdGVGbkFycj86IFByb2plY3RGbjI8Rm9ybVN0YXRlPFRWYWx1ZT4sIEZvcm1BcnJheVN0YXRlPFRWYWx1ZT4+IHwgUHJvamVjdEZuMjxGb3JtU3RhdGU8VFZhbHVlPiwgRm9ybUFycmF5U3RhdGU8VFZhbHVlPj5bXSxcclxuICAuLi5yZXN0OiBQcm9qZWN0Rm4yPEZvcm1TdGF0ZTxUVmFsdWU+LCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+PltdXHJcbikge1xyXG4gIGlmIChpc0FycmF5U3RhdGU8VFZhbHVlPihzdGF0ZU9yRmlsdGVyRnVuY3Rpb24pKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJGbiA9IGZpbHRlckZ1bmN0aW9uT3JGdW5jdGlvbk9yRnVuY3Rpb25BcnJheSBhcyBGaWx0ZXJGbjxUVmFsdWU+O1xyXG4gICAgY29uc3QgdXBkYXRlRm5BcnIgPSBBcnJheS5pc0FycmF5KHVwZGF0ZUZuT3JVcGRhdGVGbkFycikgPyB1cGRhdGVGbk9yVXBkYXRlRm5BcnIgOiBbdXBkYXRlRm5PclVwZGF0ZUZuQXJyIV07XHJcbiAgICByZXR1cm4gdXBkYXRlRm5BcnIuY29uY2F0KC4uLnJlc3QpLnJlZHVjZSgocywgdXBkYXRlRm4pID0+IHVwZGF0ZUFycmF5U2luZ2xlPFRWYWx1ZT4oZmlsdGVyRm4sIHVwZGF0ZUZuKShzKSwgc3RhdGVPckZpbHRlckZ1bmN0aW9uKTtcclxuICB9XHJcblxyXG4gIGxldCB1cGRhdGVGbkFyciA9IEFycmF5LmlzQXJyYXkoZmlsdGVyRnVuY3Rpb25PckZ1bmN0aW9uT3JGdW5jdGlvbkFycmF5KVxyXG4gICAgPyBmaWx0ZXJGdW5jdGlvbk9yRnVuY3Rpb25PckZ1bmN0aW9uQXJyYXlcclxuICAgIDogW2ZpbHRlckZ1bmN0aW9uT3JGdW5jdGlvbk9yRnVuY3Rpb25BcnJheSBhcyBQcm9qZWN0Rm4yPEZvcm1TdGF0ZTxUVmFsdWU+LCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+Pl07XHJcbiAgdXBkYXRlRm5BcnIgPSB1cGRhdGVGbk9yVXBkYXRlRm5BcnIgPT09IHVuZGVmaW5lZCA/IHVwZGF0ZUZuQXJyIDogdXBkYXRlRm5BcnIuY29uY2F0KHVwZGF0ZUZuT3JVcGRhdGVGbkFycik7XHJcbiAgcmV0dXJuIChzOiBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+KSA9PiB1cGRhdGVBcnJheVdpdGhGaWx0ZXI8VFZhbHVlPihlbnN1cmVTdGF0ZShzKSwgc3RhdGVPckZpbHRlckZ1bmN0aW9uLCB1cGRhdGVGbkFyci5jb25jYXQocmVzdCkpO1xyXG59XHJcblxyXG4vKipcclxuICogVGhpcyB1cGRhdGUgZnVuY3Rpb24gdGFrZXMgb25lIG9yIG1vcmUgdXBkYXRlIGZ1bmN0aW9ucyBhbmQgcmV0dXJucyBhXHJcbiAqIHByb2plY3Rpb24gZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGFsbCB1cGRhdGUgZnVuY3Rpb25zIG9uZSBhZnRlciBhbm90aGVyIHRvXHJcbiAqIGVhY2ggZWxlbWVudCBvZiB0aGUgZm9ybSBhcnJheSBzdGF0ZS5cclxuICpcclxuICogVGhlIGZvbGxvd2luZyAoY29udHJpdmVkKSBleGFtcGxlIHVzZXMgdGhpcyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBhbGwgaXRzXHJcbiAqIGNoaWxkcmVuIHRvIGJlIHJlcXVpcmVkIGFuZCBtYXJrIHRoZW0gYXMgZGlydHkuXHJcbiAqXHJcbmBgYHR5cGVzY3JpcHRcclxuY29uc3QgYXJyYXlVcGRhdGVGbiA9IHVwZGF0ZUFycmF5PHN0cmluZz4oXHJcbiAgdmFsaWRhdGU8c3RyaW5nPihyZXF1aXJlZCksXHJcbiAgbWFya0FzRGlydHksXHJcbik7XHJcbmNvbnN0IHVwZGF0ZWRTdGF0ZSA9IGFycmF5VXBkYXRlRm4oc3RhdGUpO1xyXG5gYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBcnJheTxUVmFsdWU+KFxyXG4gIHVwZGF0ZUZuOiBQcm9qZWN0Rm4yPEZvcm1TdGF0ZTxUVmFsdWU+LCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+PixcclxuICAuLi51cGRhdGVGbkFycjogUHJvamVjdEZuMjxGb3JtU3RhdGU8VFZhbHVlPiwgRm9ybUFycmF5U3RhdGU8VFZhbHVlPj5bXVxyXG4pOiAoc3RhdGU6IEZvcm1BcnJheVN0YXRlPFRWYWx1ZT4pID0+IEZvcm1BcnJheVN0YXRlPFRWYWx1ZT47XHJcblxyXG4vKipcclxuICogVGhpcyB1cGRhdGUgZnVuY3Rpb24gdGFrZXMgYW4gYXJyYXkgb2YgdXBkYXRlIGZ1bmN0aW9ucyBhbmQgcmV0dXJuc1xyXG4gKiBhIHByb2plY3Rpb24gZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGFsbCB1cGRhdGUgZnVuY3Rpb25zIG9uZSBhZnRlciBhbm90aGVyIHRvXHJcbiAqIGVhY2ggZWxlbWVudCBvZiB0aGUgZm9ybSBhcnJheSBzdGF0ZS5cclxuICpcclxuICogVGhlIGZvbGxvd2luZyAoY29udHJpdmVkKSBleGFtcGxlIHVzZXMgdGhpcyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBhbGwgaXRzXHJcbiAqIGNoaWxkcmVuIHRvIGJlIHJlcXVpcmVkIGFuZCBtYXJrIHRoZW0gYXMgZGlydHkuXHJcbiAqXHJcbmBgYHR5cGVzY3JpcHRcclxuY29uc3QgYXJyYXlVcGRhdGVGbiA9IHVwZGF0ZUFycmF5PHN0cmluZz4oW1xyXG4gIHZhbGlkYXRlPHN0cmluZz4ocmVxdWlyZWQpLFxyXG4gIG1hcmtBc0RpcnR5LFxyXG5dKTtcclxuY29uc3QgdXBkYXRlZFN0YXRlID0gYXJyYXlVcGRhdGVGbihzdGF0ZSk7XHJcbmBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFycmF5PFRWYWx1ZT4oXHJcbiAgdXBkYXRlRm5BcnI6IFByb2plY3RGbjI8Rm9ybVN0YXRlPFRWYWx1ZT4sIEZvcm1BcnJheVN0YXRlPFRWYWx1ZT4+W10sXHJcbik6IChzdGF0ZTogRm9ybUFycmF5U3RhdGU8VFZhbHVlPikgPT4gRm9ybUFycmF5U3RhdGU8VFZhbHVlPjtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHVwZGF0ZSBmdW5jdGlvbiB0YWtlcyBhIGZvcm0gYXJyYXkgc3RhdGUgYW5kIG9uZSBvciBtb3JlIHVwZGF0ZSBmdW5jdGlvbnNcclxuICogYW5kIGFwcGxpZXMgYWxsIHVwZGF0ZSBmdW5jdGlvbnMgb25lIGFmdGVyIGFub3RoZXIgdG8gZWFjaCBlbGVtZW50IG9mIHRoZSBmb3JtXHJcbiAqIGFycmF5IHN0YXRlLlxyXG4gKlxyXG4gKiBUaGUgZm9sbG93aW5nIChjb250cml2ZWQpIGV4YW1wbGUgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGFsbCBpdHNcclxuICogY2hpbGRyZW4gdG8gYmUgcmVxdWlyZWQgYW5kIG1hcmsgdGhlbSBhcyBkaXJ0eS5cclxuICpcclxuYGBgdHlwZXNjcmlwdFxyXG5jb25zdCB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBcnJheTxzdHJpbmc+KFxyXG4gIHN0YXRlLFxyXG4gIHZhbGlkYXRlPHN0cmluZz4ocmVxdWlyZWQpLFxyXG4gIG1hcmtBc0RpcnR5LFxyXG4pO1xyXG5gYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBcnJheTxUVmFsdWU+KFxyXG4gIHN0YXRlOiBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+LFxyXG4gIHVwZGF0ZUZuOiBQcm9qZWN0Rm4yPEZvcm1TdGF0ZTxUVmFsdWU+LCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+PixcclxuICAuLi51cGRhdGVGbkFycjogUHJvamVjdEZuMjxGb3JtU3RhdGU8VFZhbHVlPiwgRm9ybUFycmF5U3RhdGU8VFZhbHVlPj5bXVxyXG4pOiBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+O1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdXBkYXRlIGZ1bmN0aW9uIHRha2VzIGEgZm9ybSBhcnJheSBzdGF0ZSBhbmQgYW4gYXJyYXkgb2YgdXBkYXRlXHJcbiAqIGZ1bmN0aW9ucyBhbmQgYXBwbGllcyBhbGwgdXBkYXRlIGZ1bmN0aW9ucyBvbmUgYWZ0ZXIgYW5vdGhlciB0byBlYWNoIGVsZW1lbnRcclxuICogb2YgdGhlIGZvcm0gYXJyYXkgc3RhdGUuXHJcbiAqXHJcbiAqIFRoZSBmb2xsb3dpbmcgKGNvbnRyaXZlZCkgZXhhbXBsZSB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gdmFsaWRhdGUgYWxsIGl0c1xyXG4gKiBjaGlsZHJlbiB0byBiZSByZXF1aXJlZCBhbmQgbWFyayB0aGVtIGFzIGRpcnR5LlxyXG4gKlxyXG5gYGB0eXBlc2NyaXB0XHJcbmNvbnN0IHVwZGF0ZWRTdGF0ZSA9IHVwZGF0ZUFycmF5PHN0cmluZz4oXHJcbiAgc3RhdGUsXHJcbiAgW1xyXG4gICAgdmFsaWRhdGU8c3RyaW5nPihyZXF1aXJlZCksXHJcbiAgICBtYXJrQXNEaXJ0eSxcclxuICBdLFxyXG4pO1xyXG5gYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBcnJheTxUVmFsdWU+KFxyXG4gIHN0YXRlOiBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+LFxyXG4gIHVwZGF0ZUZuQXJyOiBQcm9qZWN0Rm4yPEZvcm1TdGF0ZTxUVmFsdWU+LCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+PltdLFxyXG4pOiBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFycmF5PFRWYWx1ZT4oXHJcbiAgc3RhdGVPckZ1bmN0aW9uT3JGdW5jdGlvbkFycmF5OlxyXG4gICAgfCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+XHJcbiAgICB8IFByb2plY3RGbjI8Rm9ybVN0YXRlPFRWYWx1ZT4sIEZvcm1BcnJheVN0YXRlPFRWYWx1ZT4+XHJcbiAgICB8IFByb2plY3RGbjI8Rm9ybVN0YXRlPFRWYWx1ZT4sIEZvcm1BcnJheVN0YXRlPFRWYWx1ZT4+W10sXHJcbiAgdXBkYXRlRm5PclVwZGF0ZUZuQXJyPzogUHJvamVjdEZuMjxGb3JtU3RhdGU8VFZhbHVlPiwgRm9ybUFycmF5U3RhdGU8VFZhbHVlPj4gfCBQcm9qZWN0Rm4yPEZvcm1TdGF0ZTxUVmFsdWU+LCBGb3JtQXJyYXlTdGF0ZTxUVmFsdWU+PltdLFxyXG4gIC4uLnJlc3Q6IFByb2plY3RGbjI8Rm9ybVN0YXRlPFRWYWx1ZT4sIEZvcm1BcnJheVN0YXRlPFRWYWx1ZT4+W11cclxuKSB7XHJcbiAgaWYgKGlzQXJyYXlTdGF0ZTxUVmFsdWU+KHN0YXRlT3JGdW5jdGlvbk9yRnVuY3Rpb25BcnJheSkpIHtcclxuICAgIGNvbnN0IHVwZGF0ZUZuQXJyID0gQXJyYXkuaXNBcnJheSh1cGRhdGVGbk9yVXBkYXRlRm5BcnIpID8gdXBkYXRlRm5PclVwZGF0ZUZuQXJyIDogW3VwZGF0ZUZuT3JVcGRhdGVGbkFyciFdO1xyXG4gICAgcmV0dXJuIHVwZGF0ZUZuQXJyLmNvbmNhdCguLi5yZXN0KS5yZWR1Y2UoKHMsIHVwZGF0ZUZuKSA9PiB1cGRhdGVBcnJheVNpbmdsZTxUVmFsdWU+KCgpID0+IHRydWUsIHVwZGF0ZUZuKShzKSwgc3RhdGVPckZ1bmN0aW9uT3JGdW5jdGlvbkFycmF5KTtcclxuICB9XHJcblxyXG4gIGxldCB1cGRhdGVGbkFyciA9IEFycmF5LmlzQXJyYXkoc3RhdGVPckZ1bmN0aW9uT3JGdW5jdGlvbkFycmF5KSA/IHN0YXRlT3JGdW5jdGlvbk9yRnVuY3Rpb25BcnJheSA6IFtzdGF0ZU9yRnVuY3Rpb25PckZ1bmN0aW9uQXJyYXldO1xyXG4gIHVwZGF0ZUZuQXJyID0gdXBkYXRlRm5PclVwZGF0ZUZuQXJyID09PSB1bmRlZmluZWQgPyB1cGRhdGVGbkFyciA6IHVwZGF0ZUZuQXJyLmNvbmNhdCh1cGRhdGVGbk9yVXBkYXRlRm5BcnIpO1xyXG4gIHJldHVybiAoczogRm9ybUFycmF5U3RhdGU8VFZhbHVlPikgPT4gdXBkYXRlQXJyYXk8VFZhbHVlPihlbnN1cmVTdGF0ZShzKSwgdXBkYXRlRm5BcnIuY29uY2F0KHJlc3QpKTtcclxufVxyXG4iXX0=