UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

198 lines • 28.6 kB
import { FormArray } from '@angular/forms'; import { DatapointLibraryValidationErrors } from './validation-pattern'; import { get } from 'lodash-es'; // @dynamic export class C8yValidators { static minMaxValidator() { return (control) => { const min = control.get(`min`); const max = control.get(`max`); const minDefined = min && min.value !== undefined && min.value !== null; const maxDefined = max && max.value !== undefined && max.value !== null; // remove previous errors this.removeErrors(min, [DatapointLibraryValidationErrors.GREATER_THAN_RANGE_MAX]); this.removeErrors(max, [DatapointLibraryValidationErrors.LESS_THAN_RANGE_MIN]); if (!minDefined || !maxDefined) { return null; } // sets errors if (min.value >= max.value) { const minError = { [DatapointLibraryValidationErrors.GREATER_THAN_RANGE_MAX]: true }; const maxError = { [DatapointLibraryValidationErrors.LESS_THAN_RANGE_MIN]: true }; const errors = Object.assign({}, minError, maxError); min.setErrors(Object.assign(minError, min.errors || {})); max.setErrors(Object.assign(maxError, max.errors || {})); return errors; } return null; }; } static requireBothMinAndMax() { const errorAttribute = DatapointLibraryValidationErrors.SHOULD_BE_DEFINED; return (control) => { const min = control.get(`min`); const max = control.get(`max`); const minDefined = min && min.value !== undefined && min.value !== null; const maxDefined = max && max.value !== undefined && max.value !== null; const errors = {}; if (minDefined && !maxDefined && max) { // sets error const error = { [errorAttribute]: true }; max.setErrors(Object.assign({}, max.errors || {}, error)); Object.assign(errors, error); } else { // remove previous error this.removeErrors(max, [errorAttribute]); } if (maxDefined && !minDefined && min) { // sets error const error = { [errorAttribute]: true }; min.setErrors(Object.assign({}, min.errors || {}, error)); Object.assign(errors, error); } else { // remove previous error this.removeErrors(min, [errorAttribute]); } return Object.keys(errors).length ? errors : null; }; } static withinScale(field) { return (control) => { if (!field) { return null; } const min = control.get(`range.min`); const max = control.get(`range.max`); const fieldControl = control.get(field); const minDefined = min && min.value !== undefined && min.value !== null; const maxDefined = max && max.value !== undefined && max.value !== null; const fieldDefined = fieldControl && fieldControl.value !== undefined && fieldControl.value !== null; // remove previous errors this.removeErrors(fieldControl, [ DatapointLibraryValidationErrors.GREATER_THAN_SCALE_MAX, DatapointLibraryValidationErrors.LESS_THAN_SCALE_MIN ]); if (!minDefined || !maxDefined || !fieldDefined) { return null; } const errors = {}; // sets errors if (fieldControl.value < min.value) { const error = { [DatapointLibraryValidationErrors.LESS_THAN_SCALE_MIN]: true }; fieldControl.setErrors(Object.assign({}, fieldControl.errors || {}, error)); Object.assign(errors, error); } if (fieldControl.value > max.value) { const error = { [DatapointLibraryValidationErrors.GREATER_THAN_SCALE_MAX]: true }; fieldControl.setErrors(Object.assign({}, fieldControl.errors || {}, error)); Object.assign(errors, error); } return Object.keys(errors).length ? errors : null; }; } static maxActiveCount(maxActive, activeAttribute = 'details.__active') { return (control) => { if (!Number.isInteger(maxActive) || Number.isNaN(maxActive)) { return null; } if (!(control instanceof FormArray)) { return null; } const formArray = control; const value = formArray.value; if (!Array.isArray(value)) { return null; } const filteredActiveEntries = value.filter(tmp => tmp && !!get(tmp, activeAttribute)); if (filteredActiveEntries.length <= maxActive) { return null; } return { [DatapointLibraryValidationErrors.MAX_ACTIVE_COUNT]: { maxActive, actualLength: filteredActiveEntries.length } }; }; } static minActiveCount(minActive, activeAttribute = 'details.__active') { return (control) => { if (!Number.isInteger(minActive) || Number.isNaN(minActive)) { return null; } if (!(control instanceof FormArray)) { return null; } const formArray = control; const value = formArray.value; if (!Array.isArray(value)) { return null; } const filteredActiveEntries = value.filter(tmp => tmp && !!get(tmp, activeAttribute)); if (filteredActiveEntries.length >= minActive) { return null; } return { [DatapointLibraryValidationErrors.MIN_ACTIVE_COUNT]: { minActive, actualLength: filteredActiveEntries.length } }; }; } static filesValidator(options) { return (control) => { const files = control.value; if (!files) { return null; } for (const fileObj of files) { const file = fileObj.file; if (options.typePrefix && !file.type.startsWith(options.typePrefix)) { return { wrongFileType: { wrongFileType: file.type } }; } if (options.allowedFileEndings?.length && !options.allowedFileEndings.some(ending => file.name.endsWith(ending))) { return { wrongFileEnding: { allowedFileEndings: options.allowedFileEndings } }; } if (file.size > options.maximumFileSizeInKb * 1024) { const actualFileSize = file.size / 1024; return { maxFileSizeReached: { maxFileSize: options.maximumFileSizeInKb, actualFileSize: `~${actualFileSize.toFixed(0)}` } }; } } return null; }; } static removeErrors(control, errors) { if (!control || !control.errors) { return false; } let removedError = false; for (const error of errors) { if (control.errors[error]) { removedError = true; delete control.errors[error]; } } if (removedError) { control.setErrors(Object.keys(control.errors).length ? Object.assign({}, control.errors) : null); } return removedError; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3RpdmUtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZm9ybXMvcmVhY3RpdmUtdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1CLFNBQVMsRUFBaUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhDLFdBQVc7QUFDWCxNQUFNLE9BQU8sYUFBYTtJQUN4QixNQUFNLENBQUMsZUFBZTtRQUNwQixPQUFPLENBQUMsT0FBd0IsRUFBMkIsRUFBRTtZQUMzRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFL0IsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDO1lBQ3hFLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztZQUV4RSx5QkFBeUI7WUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFFL0UsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMvQixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxj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QUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxTQUFTLENBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDOUUsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRhcG9pbnRMaWJyYXJ5VmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJy4vdmFsaWRhdGlvbi1wYXR0ZXJuJztcbmltcG9ydCB7IGdldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgQzh5VmFsaWRhdG9ycyB7XG4gIHN0YXRpYyBtaW5NYXhWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgbWluID0gY29udHJvbC5nZXQoYG1pbmApO1xuICAgICAgY29uc3QgbWF4ID0gY29udHJvbC5nZXQoYG1heGApO1xuXG4gICAgICBjb25zdCBtaW5EZWZpbmVkID0gbWluICYmIG1pbi52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIG1pbi52YWx1ZSAhPT0gbnVsbDtcbiAgICAgIGNvbnN0IG1heERlZmluZWQgPSBtYXggJiYgbWF4LnZhbHVlICE9PSB1bmRlZmluZWQgJiYgbWF4LnZhbHVlICE9PSBudWxsO1xuXG4gICAgICAvLyByZW1vdmUgcHJldmlvdXMgZXJyb3JzXG4gICAgICB0aGlzLnJlbW92ZUVycm9ycyhtaW4sIFtEYXRhcG9pbnRMaWJyYXJ5VmFsaWRhdGlvbkVycm9ycy5HUkVBVEVSX1RIQU5fUkFOR0VfTUFYXSk7XG4gICAgICB0aGlzLnJlbW92ZUVycm9ycyhtYXgsIFtEYXRhcG9pbnRMaWJyYXJ5VmFsaWRhdGlvbkVycm9ycy5MRVNTX1RIQU5fUkFOR0VfTUlOXSk7XG5cbiAgICAgIGlmICghbWluRGVmaW5lZCB8fCAhbWF4RGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gc2V0cyBlcnJvcnNcbiAgICAgIGlmIChtaW4udmFsdWUgPj0gbWF4LnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1pbkVycm9yID0geyBbRGF0YXBvaW50TGlicmFyeVZhbGlkYXRpb25FcnJvcnMuR1JFQVRFUl9USEFOX1JBTkdFX01BWF06IHRydWUgfTtcbiAgICAgICAgY29uc3QgbWF4RXJyb3IgPSB7IFtEYXRhcG9pbnRMaWJyYXJ5VmFsaWRhdGlvbkVycm9ycy5MRVNTX1RIQU5fUkFOR0VfTUlOXTogdHJ1ZSB9O1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBPYmplY3QuYXNzaWduKHt9LCBtaW5FcnJvciwgbWF4RXJyb3IpO1xuICAgICAgICBtaW4uc2V0RXJyb3JzKE9iamVjdC5hc3NpZ24obWluRXJyb3IsIG1pbi5lcnJvcnMgfHwge30pKTtcbiAgICAgICAgbWF4LnNldEVycm9ycyhPYmplY3QuYXNzaWduKG1heEVycm9yLCBtYXguZXJyb3JzIHx8IHt9KSk7XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgcmVxdWlyZUJvdGhNaW5BbmRNYXgoKTogVmFsaWRhdG9yRm4ge1xuICAgIGNvbnN0IGVycm9yQXR0cmlidXRlID0gRGF0YXBvaW50TGlicmFyeVZhbGlkYXRpb25FcnJvcnMuU0hPVUxEX0JFX0RFRklORUQ7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBtaW4gPSBjb250cm9sLmdldChgbWluYCk7XG4gICAgICBjb25zdCBtYXggPSBjb250cm9sLmdldChgbWF4YCk7XG5cbiAgICAgIGNvbnN0IG1pbkRlZmluZWQgPSBtaW4gJiYgbWluLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgbWluLnZhbHVlICE9PSBudWxsO1xuICAgICAgY29uc3QgbWF4RGVmaW5lZCA9IG1heCAmJiBtYXgudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBtYXgudmFsdWUgIT09IG51bGw7XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuICAgICAgaWYgKG1pbkRlZmluZWQgJiYgIW1heERlZmluZWQgJiYgbWF4KSB7XG4gICAgICAgIC8vIHNldHMgZXJyb3JcbiAgICAgICAgY29uc3QgZXJyb3IgPSB7IFtlcnJvckF0dHJpYnV0ZV06IHRydWUgfTtcbiAgICAgICAgbWF4LnNldEVycm9ycyhPYmplY3QuYXNzaWduKHt9LCBtYXguZXJyb3JzIHx8IHt9LCBlcnJvcikpO1xuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9ycywgZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIHByZXZpb3VzIGVycm9yXG4gICAgICAgIHRoaXMucmVtb3ZlRXJyb3JzKG1heCwgW2Vycm9yQXR0cmlidXRlXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXhEZWZpbmVkICYmICFtaW5EZWZpbmVkICYmIG1pbikge1xuICAgICAgICAvLyBzZXRzIGVycm9yXG4gICAgICAgIGNvbnN0IGVycm9yID0geyBbZXJyb3JBdHRyaWJ1dGVdOiB0cnVlIH07XG4gICAgICAgIG1pbi5zZXRFcnJvcnMoT2JqZWN0LmFzc2lnbih7fSwgbWluLmVycm9ycyB8fCB7fSwgZXJyb3IpKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvcnMsIGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91cyBlcnJvclxuICAgICAgICB0aGlzLnJlbW92ZUVycm9ycyhtaW4sIFtlcnJvckF0dHJpYnV0ZV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgd2l0aGluU2NhbGUoZmllbGQ6IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBtaW4gPSBjb250cm9sLmdldChgcmFuZ2UubWluYCk7XG4gICAgICBjb25zdCBtYXggPSBjb250cm9sLmdldChgcmFuZ2UubWF4YCk7XG4gICAgICBjb25zdCBmaWVsZENvbnRyb2wgPSBjb250cm9sLmdldChmaWVsZCk7XG5cbiAgICAgIGNvbnN0IG1pbkRlZmluZWQgPSBtaW4gJiYgbWluLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgbWluLnZhbHVlICE9PSBudWxsO1xuICAgICAgY29uc3QgbWF4RGVmaW5lZCA9IG1heCAmJiBtYXgudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBtYXgudmFsdWUgIT09IG51bGw7XG4gICAgICBjb25zdCBmaWVsZERlZmluZWQgPVxuICAgICAgICBmaWVsZENvbnRyb2wgJiYgZmllbGRDb250cm9sLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgZmllbGRDb250cm9sLnZhbHVlICE9PSBudWxsO1xuXG4gICAgICAvLyByZW1vdmUgcHJldmlvdXMgZXJyb3JzXG4gICAgICB0aGlzLnJlbW92ZUVycm9ycyhmaWVsZENvbnRyb2wsIFtcbiAgICAgICAgRGF0YXBvaW50TGlicmFyeVZhbGlkYXRpb25FcnJvcnMuR1JFQVRFUl9USEFOX1NDQUxFX01BWCxcbiAgICAgICAgRGF0YXBvaW50TGlicmFyeVZhbGlkYXRpb25FcnJvcnMuTEVTU19USEFOX1NDQUxFX01JTlxuICAgICAgXSk7XG5cbiAgICAgIGlmICghbWluRGVmaW5lZCB8fCAhbWF4RGVmaW5lZCB8fCAhZmllbGREZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSB7fTtcblxuICAgICAgLy8gc2V0cyBlcnJvcnNcbiAgICAgIGlmIChmaWVsZENvbnRyb2wudmFsdWUgPCBtaW4udmFsdWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB7IFtEYXRhcG9pbnRMaWJyYXJ5VmFsaWRhdGlvbkVycm9ycy5MRVNTX1RIQU5fU0NBTEVfTUlOXTogdHJ1ZSB9O1xuICAgICAgICBmaWVsZENvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5hc3NpZ24oe30sIGZpZWxkQ29udHJvbC5lcnJvcnMgfHwge30sIGVycm9yKSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZENvbnRyb2wudmFsdWUgPiBtYXgudmFsdWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB7IFtEYXRhcG9pbnRMaWJyYXJ5VmFsaWRhdGlvbkVycm9ycy5HUkVBVEVSX1RIQU5fU0NBTEVfTUFYXTogdHJ1ZSB9O1xuICAgICAgICBmaWVsZENvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5hc3NpZ24oe30sIGZpZWxkQ29udHJvbC5lcnJvcnMgfHwge30sIGVycm9yKSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA/IGVycm9ycyA6IG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBtYXhBY3RpdmVDb3VudChtYXhBY3RpdmU6IG51bWJlciwgYWN0aXZlQXR0cmlidXRlID0gJ2RldGFpbHMuX19hY3RpdmUnKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heEFjdGl2ZSkgfHwgTnVtYmVyLmlzTmFOKG1heEFjdGl2ZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybUFycmF5ID0gY29udHJvbCBhcyBGb3JtQXJyYXk7XG4gICAgICBjb25zdCB2YWx1ZTogYW55W10gPSBmb3JtQXJyYXkudmFsdWU7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEFjdGl2ZUVudHJpZXMgPSB2YWx1ZS5maWx0ZXIodG1wID0+IHRtcCAmJiAhIWdldCh0bXAsIGFjdGl2ZUF0dHJpYnV0ZSkpO1xuICAgICAgaWYgKGZpbHRlcmVkQWN0aXZlRW50cmllcy5sZW5ndGggPD0gbWF4QWN0aXZlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbRGF0YXBvaW50TGlicmFyeVZhbGlkYXRpb25FcnJvcnMuTUFYX0FDVElWRV9DT1VOVF06IHtcbiAgICAgICAgICBtYXhBY3RpdmUsXG4gICAgICAgICAgYWN0dWFsTGVuZ3RoOiBmaWx0ZXJlZEFjdGl2ZUVudHJpZXMubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBtaW5BY3RpdmVDb3VudChtaW5BY3RpdmU6IG51bWJlciwgYWN0aXZlQXR0cmlidXRlID0gJ2RldGFpbHMuX19hY3RpdmUnKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1pbkFjdGl2ZSkgfHwgTnVtYmVyLmlzTmFOKG1pbkFjdGl2ZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybUFycmF5ID0gY29udHJvbCBhcyBGb3JtQXJyYXk7XG4gICAgICBjb25zdCB2YWx1ZTogYW55W10gPSBmb3JtQXJyYXkudmFsdWU7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEFjdGl2ZUVudHJpZXMgPSB2YWx1ZS5maWx0ZXIodG1wID0+IHRtcCAmJiAhIWdldCh0bXAsIGFjdGl2ZUF0dHJpYnV0ZSkpO1xuICAgICAgaWYgKGZpbHRlcmVkQWN0aXZlRW50cmllcy5sZW5ndGggPj0gbWluQWN0aXZlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbRGF0YXBvaW50TGlicmFyeVZhbGlkYXRpb25FcnJvcnMuTUlOX0FDVElWRV9DT1VOVF06IHtcbiAgICAgICAgICBtaW5BY3RpdmUsXG4gICAgICAgICAgYWN0dWFsTGVuZ3RoOiBmaWx0ZXJlZEFjdGl2ZUVudHJpZXMubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmaWxlc1ZhbGlkYXRvcihvcHRpb25zOiB7XG4gICAgbWF4aW11bUZpbGVTaXplSW5LYj86IG51bWJlcjtcbiAgICB0eXBlUHJlZml4Pzogc3RyaW5nO1xuICAgIGFsbG93ZWRGaWxlRW5kaW5ncz86IHN0cmluZ1tdO1xuICB9KTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgZmlsZXM6IHsgZmlsZTogRmlsZSB9W10gfCBudWxsID0gY29udHJvbC52YWx1ZTtcbiAgICAgIGlmICghZmlsZXMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpbGVPYmogb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IGZpbGVPYmouZmlsZTtcbiAgICAgICAgaWYgKG9wdGlvbnMudHlwZVByZWZpeCAmJiAhZmlsZS50eXBlLnN0YXJ0c1dpdGgob3B0aW9ucy50eXBlUHJlZml4KSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3cm9uZ0ZpbGVUeXBlOiB7XG4gICAgICAgICAgICAgIHdyb25nRmlsZVR5cGU6IGZpbGUudHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3B0aW9ucy5hbGxvd2VkRmlsZUVuZGluZ3M/Lmxlbmd0aCAmJlxuICAgICAgICAgICFvcHRpb25zLmFsbG93ZWRGaWxlRW5kaW5ncy5zb21lKGVuZGluZyA9PiBmaWxlLm5hbWUuZW5kc1dpdGgoZW5kaW5nKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdyb25nRmlsZUVuZGluZzoge1xuICAgICAgICAgICAgICBhbGxvd2VkRmlsZUVuZGluZ3M6IG9wdGlvbnMuYWxsb3dlZEZpbGVFbmRpbmdzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlLnNpemUgPiBvcHRpb25zLm1heGltdW1GaWxlU2l6ZUluS2IgKiAxMDI0KSB7XG4gICAgICAgICAgY29uc3QgYWN0dWFsRmlsZVNpemUgPSBmaWxlLnNpemUgLyAxMDI0O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXhGaWxlU2l6ZVJlYWNoZWQ6IHtcbiAgICAgICAgICAgICAgbWF4RmlsZVNpemU6IG9wdGlvbnMubWF4aW11bUZpbGVTaXplSW5LYixcbiAgICAgICAgICAgICAgYWN0dWFsRmlsZVNpemU6IGB+JHthY3R1YWxGaWxlU2l6ZS50b0ZpeGVkKDApfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVtb3ZlRXJyb3JzKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgZXJyb3JzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC5lcnJvcnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHJlbW92ZWRFcnJvciA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgZXJyb3Igb2YgZXJyb3JzKSB7XG4gICAgICBpZiAoY29udHJvbC5lcnJvcnNbZXJyb3JdKSB7XG4gICAgICAgIHJlbW92ZWRFcnJvciA9IHRydWU7XG4gICAgICAgIGRlbGV0ZSBjb250cm9sLmVycm9yc1tlcnJvcl07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZW1vdmVkRXJyb3IpIHtcbiAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKFxuICAgICAgICBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycykubGVuZ3RoID8gT2JqZWN0LmFzc2lnbih7fSwgY29udHJvbC5lcnJvcnMpIDogbnVsbFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbW92ZWRFcnJvcjtcbiAgfVxufVxuIl19