UNPKG

@ngez/core

Version:

A collection of minimalistic, easy-to-use and fully customizable Angular components, directives and services

235 lines 25.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { FormGroup } from '@angular/forms'; // @dynamic export class NgEzValidators { /** * @param {?} c1 * @param {?} c2 * @return {?} */ static equals(c1, c2) { return (control) => { const { value } = control; if (!value || !(control instanceof FormGroup)) return null; /** @type {?} */ const formControl1 = control.get(c1); /** @type {?} */ const formControl2 = control.get(c2); if (!formControl1 || !formControl2) return null; return formControl1.value == formControl2.value ? null : { equals: true }; }; } /** * @param {?} control * @return {?} */ static url(control) { if (!control.value) return null; /** @type {?} */ const urlRegex = new RegExp("^" + // protocol identifier (optional) // short syntax // still required "(?:(?:(?:https?|ftp):)?\\/\\/)" + // user:pass BasicAuth (optional) "(?:\\S+(?::\\S*)?@)?" + "(?:" + // IP address exclusion // private & local networks "(?!(?:10|127)(?:\\.\\d{1,3}){3})" + "(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" + "(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})" + // IP address dotted notation octets // excludes loopback network 0.0.0.0 // excludes reserved space >= 224.0.0.0 // excludes network & broacast addresses // (first & last IP address of each class) "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" + "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" + "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" + "|" + // host & domain names, may end with dot // can be replaced by a shortest alternative // (?![-_])(?:[-\\w\\u00a1-\\uffff]{0,63}[^-_]\\.)+ "(?:" + "(?:" + "[a-z0-9\\u00a1-\\uffff]" + "[a-z0-9\\u00a1-\\uffff_-]{0,62}" + ")?" + "[a-z0-9\\u00a1-\\uffff]\\." + ")+" + // TLD identifier name, may end with dot "(?:[a-z\\u00a1-\\uffff]{2,}\\.?)" + ")" + // port number (optional) "(?::\\d{2,5})?" + // resource path (optional) "(?:[/?#]\\S*)?" + "$", "i"); return urlRegex.test(control.value) ? null : { url: true }; } /** * @param {?} accept * @return {?} */ static fileType(accept) { if (!accept) return (control) => null; /** @type {?} */ const AUDIO_WILDCARD = "audio/*"; /** @type {?} */ const VIDEO_WILDCARD = "video/*"; /** @type {?} */ const IMAGE_WILDCARD = "image/*"; /** @type {?} */ const extensions = []; /** @type {?} */ const mimeTypes = []; /** @type {?} */ let anyAudio = false; /** @type {?} */ let anyVideo = false; /** @type {?} */ let anyImage = false; accept .split(",") .map(accept => accept.trim()) .filter(accept => accept) .forEach(accept => { //is an extension if (/^\./.test(accept)) return extensions.push(accept); //is a wildcard switch (accept) { case AUDIO_WILDCARD: return (anyAudio = true); case VIDEO_WILDCARD: return (anyVideo = true); case IMAGE_WILDCARD: return (anyImage = true); } //anything else is a mime-type return mimeTypes.push(accept); }); /** @type {?} */ const validate = (file) => { if ((anyImage && this.getMimeTypeRegex(IMAGE_WILDCARD).test(file.type)) || (anyAudio && this.getMimeTypeRegex(AUDIO_WILDCARD).test(file.type)) || (anyVideo && this.getMimeTypeRegex(VIDEO_WILDCARD).test(file.type)) || mimeTypes.some(type => file.type == type)) return null; /** @type {?} */ const name = file.name.split("."); /** @type {?} */ const fileExtension = name[name.length - 1]; if (extensions.some(extension => extension.toLowerCase().includes(fileExtension.toLowerCase()))) return null; return { fileType: { accept, actualFile: file } }; }; return (control) => { const { value } = control; if (!value || !(value instanceof File || (Array.isArray(value) && value.every(value => value instanceof File)) || value instanceof FileList)) return null; if (value instanceof File) return validate(value); /** @type {?} */ const files = value instanceof FileList ? Array.from(value) : value; /** @type {?} */ const errors = files.map(file => validate(file)).filter(file => file); return errors.length ? errors : null; }; } /** * @param {?} bytes * @return {?} */ static maxSize(bytes) { /** @type {?} */ const validate = (file) => { return file.size > bytes ? { maxSize: { requiredSize: bytes, actualFile: file } } : null; }; return (control) => { const { value } = control; if (!value || !bytes || !(value instanceof File || (Array.isArray(value) && value.every(value => value instanceof File)) || value instanceof FileList)) return null; if (value instanceof File) return validate(value); /** @type {?} */ const files = value instanceof FileList ? Array.from(value) : value; /** @type {?} */ const errors = files.map(file => validate(file)).filter(file => file); return errors.length ? errors : null; }; } /** * @param {?} bytes * @return {?} */ static totalSize(bytes) { return (control) => { const { value } = control; if (!value || !bytes || !(value instanceof File || (Array.isArray(value) && value.every(value => value instanceof File)) || value instanceof FileList)) return null; /** @type {?} */ const files = value instanceof FileList ? Array.from(value) : Array.isArray(value) ? value : [value]; /** @type {?} */ const totalBytes = files.reduce((total, file) => total + file.size, 0); return totalBytes <= bytes ? null : { totalSize: { requiredTotal: bytes, actualTotal: totalBytes } }; }; } /** * @private * @param {?} str * @return {?} */ static getMimeTypeRegex(str) { return new RegExp(str.replace("*", ".*"), "i"); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZ2V6L2NvcmUvIiwic291cmNlcyI6WyJmb3Jtcy92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQW1CLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUc1RCxNQUFNLE9BQU8sY0FBYzs7Ozs7O0lBQ3pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBcUIsRUFBRSxFQUFxQjtRQUN4RCxPQUFPLENBQUMsT0FBa0IsRUFBRSxFQUFFO2tCQUN0QixFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU87WUFFekIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLFNBQVMsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQzs7a0JBRXJELFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7a0JBQzlCLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUVwQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsWUFBWTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUVoRCxPQUFPLFlBQVksQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLEtBQUs7Z0JBQzdDLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQztvQkFDRSxNQUFNLEVBQUUsSUFBSTtpQkFDYixDQUFDO1FBQ1IsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7Ozs7SUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQXdCO1FBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDOztjQUUxQixRQUFRLEdBQUcsSUFBSSxNQUFNLENBQ3pCLEdBQUc7WUFDRCxpQ0FBaUM7WUFDakMsaUNBQWlDO1lBQ2pDLGdDQUFnQztZQUNoQyxpQ0FBaUM7WUFDakMsc0JBQXNCO1lBQ3RCLEtBQUs7WUFDTCx1QkFBdUI7WUFDdkIsMkJBQTJC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QUFDLEdBQVc7UUFDekMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBOZ0V6VmFsaWRhdG9ycyB7XHJcbiAgc3RhdGljIGVxdWFscyhjMTogc3RyaW5nIHwgc3RyaW5nW10sIGMyOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBGb3JtR3JvdXApID0+IHtcclxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gY29udHJvbDtcclxuXHJcbiAgICAgIGlmICghdmFsdWUgfHwgIShjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBmb3JtQ29udHJvbDEgPSBjb250cm9sLmdldChjMSk7XHJcbiAgICAgIGNvbnN0IGZvcm1Db250cm9sMiA9IGNvbnRyb2wuZ2V0KGMyKTtcclxuXHJcbiAgICAgIGlmICghZm9ybUNvbnRyb2wxIHx8ICFmb3JtQ29udHJvbDIpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgcmV0dXJuIGZvcm1Db250cm9sMS52YWx1ZSA9PSBmb3JtQ29udHJvbDIudmFsdWVcclxuICAgICAgICA/IG51bGxcclxuICAgICAgICA6IHtcclxuICAgICAgICAgICAgZXF1YWxzOiB0cnVlXHJcbiAgICAgICAgICB9O1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB1cmwoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHVybFJlZ2V4ID0gbmV3IFJlZ0V4cChcclxuICAgICAgXCJeXCIgK1xyXG4gICAgICAgIC8vIHByb3RvY29sIGlkZW50aWZpZXIgKG9wdGlvbmFsKVxyXG4gICAgICAgIC8vIHNob3J0IHN5bnRheCAvLyBzdGlsbCByZXF1aXJlZFxyXG4gICAgICAgIFwiKD86KD86KD86aHR0cHM/fGZ0cCk6KT9cXFxcL1xcXFwvKVwiICtcclxuICAgICAgICAvLyB1c2VyOnBhc3MgQmFzaWNBdXRoIChvcHRpb25hbClcclxuICAgICAgICBcIig/OlxcXFxTKyg/OjpcXFxcUyopP0ApP1wiICtcclxuICAgICAgICBcIig/OlwiICtcclxuICAgICAgICAvLyBJUCBhZGRyZXNzIGV4Y2x1c2lvblxyXG4gICAgICAgIC8vIHByaXZhdGUgJiBsb2NhbCBuZXR3b3Jrc1xyXG4gICAgICAgIFwiKD8hKD86MTB8MTI3KSg/OlxcXFwuXFxcXGR7MSwzfSl7M30pXCIgK1xyXG4gICAgICAgIFwiKD8hKD86MTY5XFxcXC4yNTR8MTkyXFxcXC4xNjgpKD86XFxcXC5cXFxcZHsxLDN9KXsyfSlcIiArXHJcbiAgICAgICAgXCIoPyExNzJcXFxcLig/OjFbNi05XXwyXFxcXGR8M1swLTFdKSg/OlxcXFwuXFxcXGR7MSwzfSl7Mn0pXCIgK1xyXG4gICAgICAgIC8vIElQIGFkZHJlc3MgZG90dGVkIG5vdGF0aW9uIG9jdGV0c1xyXG4gICAgICAgIC8vIGV4Y2x1ZGVzIGxvb3BiYWNrIG5ldHdvcmsgMC4wLjAuMFxyXG4gICAgICAgIC8vIGV4Y2x1ZGVzIHJlc2VydmVkIHNwYWNlID49IDIyNC4wLjAuMFxyXG4gICAgICAgIC8vIGV4Y2x1ZGVzIG5ldHdvcmsgJiBicm9hY2FzdCBhZGRyZXNzZXNcclxuICAgICAgICAvLyAoZmlyc3QgJiBsYXN0IElQIGFkZHJlc3Mgb2YgZWFjaCBjbGFzcylcclxuICAgICAgICBcIig/OlsxLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMDFdXFxcXGR8MjJbMC0zXSlcIiArXHJcbiAgICAgICAgXCIoPzpcXFxcLig/OjE/XFxcXGR7MSwyfXwyWzAtNF1cXFxcZHwyNVswLTVdKSl7Mn1cIiArXHJcbiAgICAgICAgXCIoPzpcXFxcLig/OlsxLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMC00XVxcXFxkfDI1WzAtNF0pKVwiICtcclxuICAgICAgICBcInxcIiArXHJcbiAgICAgICAgLy8gaG9zdCAmIGRvbWFpbiBuYW1lcywgbWF5IGVuZCB3aXRoIGRvdFxyXG4gICAgICAgIC8vIGNhbiBiZSByZXBsYWNlZCBieSBhIHNob3J0ZXN0IGFsdGVybmF0aXZlXHJcbiAgICAgICAgLy8gKD8hWy1fXSkoPzpbLVxcXFx3XFxcXHUwMGExLVxcXFx1ZmZmZl17MCw2M31bXi1fXVxcXFwuKStcclxuICAgICAgICBcIig/OlwiICtcclxuICAgICAgICBcIig/OlwiICtcclxuICAgICAgICBcIlthLXowLTlcXFxcdTAwYTEtXFxcXHVmZmZmXVwiICtcclxuICAgICAgICBcIlthLXowLTlcXFxcdTAwYTEtXFxcXHVmZmZmXy1dezAsNjJ9XCIgK1xyXG4gICAgICAgIFwiKT9cIiArXHJcbiAgICAgICAgXCJbYS16MC05XFxcXHUwMGExLVxcXFx1ZmZmZl1cXFxcLlwiICtcclxuICAgICAgICBcIikrXCIgK1xyXG4gICAgICAgIC8vIFRMRCBpZGVudGlmaWVyIG5hbWUsIG1heSBlbmQgd2l0aCBkb3RcclxuICAgICAgICBcIig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH1cXFxcLj8pXCIgK1xyXG4gICAgICAgIFwiKVwiICtcclxuICAgICAgICAvLyBwb3J0IG51bWJlciAob3B0aW9uYWwpXHJcbiAgICAgICAgXCIoPzo6XFxcXGR7Miw1fSk/XCIgK1xyXG4gICAgICAgIC8vIHJlc291cmNlIHBhdGggKG9wdGlvbmFsKVxyXG4gICAgICAgIFwiKD86Wy8/I11cXFxcUyopP1wiICtcclxuICAgICAgICBcIiRcIixcclxuICAgICAgXCJpXCJcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHVybFJlZ2V4LnRlc3QoY29udHJvbC52YWx1ZSkgPyBudWxsIDogeyB1cmw6IHRydWUgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmaWxlVHlwZShhY2NlcHQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFhY2NlcHQpIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBudWxsO1xyXG5cclxuICAgIGNvbnN0IEFVRElPX1dJTERDQVJEID0gXCJhdWRpby8qXCI7XHJcbiAgICBjb25zdCBWSURFT19XSUxEQ0FSRCA9IFwidmlkZW8vKlwiO1xyXG4gICAgY29uc3QgSU1BR0VfV0lMRENBUkQgPSBcImltYWdlLypcIjtcclxuICAgIGNvbnN0IGV4dGVuc2lvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBtaW1lVHlwZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsZXQgYW55QXVkaW8gPSBmYWxzZTtcclxuICAgIGxldCBhbnlWaWRlbyA9IGZhbHNlO1xyXG4gICAgbGV0IGFueUltYWdlID0gZmFsc2U7XHJcblxyXG4gICAgYWNjZXB0XHJcbiAgICAgIC5zcGxpdChcIixcIilcclxuICAgICAgLm1hcChhY2NlcHQgPT4gYWNjZXB0LnRyaW0oKSlcclxuICAgICAgLmZpbHRlcihhY2NlcHQgPT4gYWNjZXB0KVxyXG4gICAgICAuZm9yRWFjaChhY2NlcHQgPT4ge1xyXG4gICAgICAgIC8vaXMgYW4gZXh0ZW5zaW9uXHJcbiAgICAgICAgaWYgKC9eXFwuLy50ZXN0KGFjY2VwdCkpIHJldHVybiBleHRlbnNpb25zLnB1c2goYWNjZXB0KTtcclxuXHJcbiAgICAgICAgLy9pcyBhIHdpbGRjYXJkXHJcbiAgICAgICAgc3dpdGNoIChhY2NlcHQpIHtcclxuICAgICAgICAgIGNhc2UgQVVESU9fV0lMRENBUkQ6XHJcbiAgICAgICAgICAgIHJldHVybiAoYW55QXVkaW8gPSB0cnVlKTtcclxuICAgICAgICAgIGNhc2UgVklERU9fV0lMRENBUkQ6XHJcbiAgICAgICAgICAgIHJldHVybiAoYW55VmlkZW8gPSB0cnVlKTtcclxuICAgICAgICAgIGNhc2UgSU1BR0VfV0lMRENBUkQ6XHJcbiAgICAgICAgICAgIHJldHVybiAoYW55SW1hZ2UgPSB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vYW55dGhpbmcgZWxzZSBpcyBhIG1pbWUtdHlwZVxyXG4gICAgICAgIHJldHVybiBtaW1lVHlwZXMucHVzaChhY2NlcHQpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCB2YWxpZGF0ZSA9IChmaWxlOiBGaWxlKSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAoYW55SW1hZ2UgJiYgdGhpcy5nZXRNaW1lVHlwZVJlZ2V4KElNQUdFX1dJTERDQVJEKS50ZXN0KGZpbGUudHlwZSkpIHx8XHJcbiAgICAgICAgKGFueUF1ZGlvICYmIHRoaXMuZ2V0TWltZVR5cGVSZWdleChBVURJT19XSUxEQ0FSRCkudGVzdChmaWxlLnR5cGUpKSB8fFxyXG4gICAgICAgIChhbnlWaWRlbyAmJiB0aGlzLmdldE1pbWVUeXBlUmVnZXgoVklERU9fV0lMRENBUkQpLnRlc3QoZmlsZS50eXBlKSkgfHxcclxuICAgICAgICBtaW1lVHlwZXMuc29tZSh0eXBlID0+IGZpbGUudHlwZSA9PSB0eXBlKVxyXG4gICAgICApXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBuYW1lID0gZmlsZS5uYW1lLnNwbGl0KFwiLlwiKTtcclxuICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IG5hbWVbbmFtZS5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBleHRlbnNpb25zLnNvbWUoZXh0ZW5zaW9uID0+XHJcbiAgICAgICAgICBleHRlbnNpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWxlRXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgKVxyXG4gICAgICApXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGZpbGVUeXBlOiB7XHJcbiAgICAgICAgICBhY2NlcHQsXHJcbiAgICAgICAgICBhY3R1YWxGaWxlOiBmaWxlXHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBjb250cm9sO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgICF2YWx1ZSB8fFxyXG4gICAgICAgICEoXHJcbiAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgfHxcclxuICAgICAgICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxyXG4gICAgICAgICAgICB2YWx1ZS5ldmVyeSh2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpKSB8fFxyXG4gICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGaWxlTGlzdFxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkgcmV0dXJuIHZhbGlkYXRlKHZhbHVlKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpbGVzOiBGaWxlW10gPVxyXG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpc3QgPyBBcnJheS5mcm9tKHZhbHVlKSA6IHZhbHVlO1xyXG5cclxuICAgICAgY29uc3QgZXJyb3JzID0gZmlsZXMubWFwKGZpbGUgPT4gdmFsaWRhdGUoZmlsZSkpLmZpbHRlcihmaWxlID0+IGZpbGUpO1xyXG5cclxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBtYXhTaXplKGJ5dGVzOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHZhbGlkYXRlID0gKGZpbGU6IEZpbGUpID0+IHtcclxuICAgICAgcmV0dXJuIGZpbGUuc2l6ZSA+IGJ5dGVzXHJcbiAgICAgICAgPyB7XHJcbiAgICAgICAgICAgIG1heFNpemU6IHtcclxuICAgICAgICAgICAgICByZXF1aXJlZFNpemU6IGJ5dGVzLFxyXG4gICAgICAgICAgICAgIGFjdHVhbEZpbGU6IGZpbGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gY29udHJvbDtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICAhdmFsdWUgfHxcclxuICAgICAgICAhYnl0ZXMgfHxcclxuICAgICAgICAhKFxyXG4gICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGaWxlIHx8XHJcbiAgICAgICAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcclxuICAgICAgICAgICAgdmFsdWUuZXZlcnkodmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBGaWxlKSkgfHxcclxuICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpc3RcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHJldHVybiB2YWxpZGF0ZSh2YWx1ZSk7XHJcblxyXG4gICAgICBjb25zdCBmaWxlcyA9IHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpc3QgPyBBcnJheS5mcm9tKHZhbHVlKSA6IHZhbHVlO1xyXG5cclxuICAgICAgY29uc3QgZXJyb3JzID0gZmlsZXMubWFwKGZpbGUgPT4gdmFsaWRhdGUoZmlsZSkpLmZpbHRlcihmaWxlID0+IGZpbGUpO1xyXG5cclxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB0b3RhbFNpemUoYnl0ZXM6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gY29udHJvbDtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICAhdmFsdWUgfHxcclxuICAgICAgICAhYnl0ZXMgfHxcclxuICAgICAgICAhKFxyXG4gICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGaWxlIHx8XHJcbiAgICAgICAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcclxuICAgICAgICAgICAgdmFsdWUuZXZlcnkodmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBGaWxlKSkgfHxcclxuICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpc3RcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGNvbnN0IGZpbGVzOiBGaWxlW10gPVxyXG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpc3RcclxuICAgICAgICAgID8gQXJyYXkuZnJvbSh2YWx1ZSlcclxuICAgICAgICAgIDogQXJyYXkuaXNBcnJheSh2YWx1ZSlcclxuICAgICAgICAgID8gdmFsdWVcclxuICAgICAgICAgIDogW3ZhbHVlXTtcclxuXHJcbiAgICAgIGNvbnN0IHRvdGFsQnl0ZXMgPSBmaWxlcy5yZWR1Y2UoKHRvdGFsLCBmaWxlKSA9PiB0b3RhbCArIGZpbGUuc2l6ZSwgMCk7XHJcblxyXG4gICAgICByZXR1cm4gdG90YWxCeXRlcyA8PSBieXRlc1xyXG4gICAgICAgID8gbnVsbFxyXG4gICAgICAgIDoge1xyXG4gICAgICAgICAgICB0b3RhbFNpemU6IHtcclxuICAgICAgICAgICAgICByZXF1aXJlZFRvdGFsOiBieXRlcyxcclxuICAgICAgICAgICAgICBhY3R1YWxUb3RhbDogdG90YWxCeXRlc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGdldE1pbWVUeXBlUmVnZXgoc3RyOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBuZXcgUmVnRXhwKHN0ci5yZXBsYWNlKFwiKlwiLCBcIi4qXCIpLCBcImlcIik7XHJcbiAgfVxyXG59XHJcbiJdfQ==