UNPKG

cocori-ng

Version:

Cocori-ng is an Angular full of great components & utilites based on Material

277 lines 39.3 kB
import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class HelperService { generateGuid() { return this.s4() + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' + this.s4() + this.s4() + this.s4(); } s4() { return Math.floor((1 + Math.random()) * 0x10000) .toString(16) .substring(1); } removeValueFromArrayByIndex(arrayValues, index) { if (index === -1) return arrayValues; return [...arrayValues.slice(0, index), ...arrayValues.slice(index + 1)]; } /** arrondir un nombre */ roundUp(num, precision) { precision = Math.pow(10, precision); return Math.ceil(num * precision) / precision; } /** */ static retourneNomDeDomaine() { return location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : ''); } static enleverNomDomaineUrl(url) { if (!url) return null; if (!/^http[s]?:\/\//.test(url)) return url; const urlSansHttp = url.split(/^http[s]?:\/\//); const indexSlash = urlSansHttp[1].indexOf("/"); const urlValide = urlSansHttp[1].substring(indexSlash); return urlValide; } static retourneSegmentsURL() { const pathName = window.location.pathname; // on supprime du pathname le dernier caractères s'il s'agit d'un / return pathName.replace(/\/$/, '').split('/'); } static ouvrirUrlExterne(lien, estceNouvelOnglet = false) { if (!this.retourneNullSiNonDéfini(lien)) return; let url = ''; if (!/^http[s]?:\/\//.test(lien)) { url += 'http://'; } url += lien; if (estceNouvelOnglet) { window.open(url); } else { window.location.href = url; } } static nettoyerParametresUrl(ancienneUrl) { let index = 0; let nouvelleUrl = ancienneUrl; index = ancienneUrl.indexOf('?'); if (index === -1) { index = ancienneUrl.indexOf('#'); } if (index !== -1) { nouvelleUrl = ancienneUrl.substring(0, index); } return nouvelleUrl; } static construireUrl(url) { return this.retourneNomDeDomaine() + '/' + url; } static segmentsURL(url) { if (!url) return []; // on supprime de l'url le 1er / et le de dernier / return url.replace(/\/*/, '').replace(/\/$/, '').split('/'); } static estceUrlValide(string) { const res = string.match(/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g); if (!res) { return false; } else { return true; } } static encoderParamètresUrl(data) { const ret = []; for (const key in data) { if (data.hasOwnProperty(key)) { const element = data[key]; ret.push(encodeURIComponent(key) + '=' + encodeURIComponent(element)); } } return ret.join('&'); } static concaténerParamètresUrl(url, paramètres) { return url + '?' + paramètres; } static ajouterParamètreUrl(url, param, value) { const a = document.createElement('a'), regex = /(?:\?|&amp;|&)+([^=]+)(?:=([^&]*))*/g; let match = null; const str = []; a.href = url; param = encodeURIComponent(param); while (match = regex.exec(a.search)) { if (param !== match[1]) str.push(match[1] + (match[2] ? "=" + match[2] : "")); } str.push(param + (value ? "=" + encodeURIComponent(value) : "")); a.search = str.join("&"); return a.href; } /** * Retourne l'url courante sans les paramètres */ static donneUrlCouranteSansParamètre() { return window.location.href.split(/[?#]/)[0]; } /** * JavaScript Get URL Parameter * @param String prop The specific URL parameter you want to retreive the value for * @return String|Object If prop is provided a string value is returned, otherwise an object of all properties is returned */ static donneParamètresUrl(prop, urlStatique) { const params = {}; const urlCourante = urlStatique ? urlStatique : window.location.href; const search = decodeURIComponent(urlCourante.slice(urlCourante.indexOf('?') + 1)); if (search === urlCourante) return null; const definitions = search.split('&'); definitions.forEach(function (val, key) { const parts = val.split('=', 2); params[parts[0]] = parts[1]; }); if ((prop && !(prop in params))) { return null; } return (prop && prop in params) ? params[prop] : params; } static retourneParamètresAccolades(url) { if (!this.retourneNullSiNonDéfini(url)) { return []; } const résultat = url.match(/\{(.*?)\}/g); // entre {} return !résultat ? [] : résultat; } /** efface les paramètres entre accolades d'une chaîne */ static effacerParamètresAccolades(chaine) { return thisviterDoubleSlash(this.replaceAll(chaine, /\{(.*?)\}/g, "")); } static remplacerParamètresAccolades(chercherDans, motif, valeur) { return HelperService.replaceAll(chercherDans, `{${motif}}`, valeur); } static estceObjetVide(objet) { return Object.keys(objet).length === 0 && objet.constructor === Object; } /** * Détection de savoir s'il l'on vient d'une nouvelle page ou d'une page du site */ static pageOuverteDepuisScript() { return window.opener !== null; } static éviterDoubleSlash(chaine) { return HelperService.replaceAll(chaine, /(https?:\/\/)|(\/){2,}/g, "$1$2"); } /** * Vérifie s'il existe une concordance entre les `paramètres de l'url courante` et les `paramètres de la source de données` * @param urlSourceDonnées : exemple : la source de données d'une page de type formulaire, http://api.sonate-dev.fr:85/tiers/individus/{id} * @param urlCouranteStatique : l'url du navigateur, http://localhost:1200/page/lab-formulaire?id=016247a2-2c1c-4e08-bd78-9b05659ec5ee */ static siConcordanceParamètresURLetSourceDonnées(urlSourceDonnées, urlCouranteStatique) { if (!urlSourceDonnées) return null; const urlCourante = urlCouranteStatique ? urlCouranteStatique : window.location.search; const paramètresAccolades = this.retourneParamètresAccolades(urlSourceDonnées); if (!paramètresAccolades.length) { return false; } for (let index = 0; index < paramètresAccolades.length; index++) { const paramètreAvecAccolades = paramètresAccolades[index]; const paramètreSansAccolade = paramètreAvecAccolades.substring(paramètreAvecAccolades.lastIndexOf("{") + 1, paramètreAvecAccolades.lastIndexOf("}")); const valeurParamètre = this.donneParamètresUrl(paramètreSansAccolade, urlCourante); if (!valeurParamètre) { return false; } } return true; } static retourneNullSiNonDéfini(valeur) { if (Array.isArray(valeur)) { valeur = valeur.length === 0 ? null : valeur; } else if (typeof valeur === 'number') { return valeur; } else { valeur = typeof valeur === "string" ? valeur.trim() : valeur; } return !valeur ? null : valeur; } static replaceAll(text, pattern, newText) { return text.replace(new RegExp(pattern, 'g'), newText); } static valeurTexteBooléen(valeur) { if (typeof (valeur) === "boolean") { return valeur ? "Oui" : "Non"; } return null; } static estNumerique(n) { return !isNaN(parseFloat(n)) && isFinite(n); } // 01 02 03 04 05 -> 0102030405 static adapteurEcritureTelephone(valeurAvecEspace) { let valeurSansEspace; if (!this.retourneNullSiNonDéfini(valeurAvecEspace)) { return null; } const tmp = valeurAvecEspace.split(' '); valeurSansEspace = tmp[0] + tmp[1] + tmp[2] + tmp[3] + tmp[4]; return valeurSansEspace; } static retourneValeurObjet(objet, propriété) { if (typeof objet !== 'undefined' && objet.hasOwnProperty(propriété)) { return objet[propriété]; } return null; } static dupliquerTableau(tableau) { return [...tableau]; } static ajouterValeurTableau(tableau, valeur) { return [...tableau, valeur]; } static ajouterValeurUniqueTableau(tableau, valeur) { if (tableau.indexOf(valeur) === -1) { return [...tableau, valeur]; } return tableau; } static arrondirZeroCinqPrès(nombre) { return Math.round(nombre * 2) * 0.5; } /** * Un GUID envoyé depuis le back au front est de la forme : (inheritor) {_value: "0163d59a-bcd8-44fe-852f-100af77dfb9b"} * @param objetInheritor objet GUID envoyé depuis le backoffice */ static désérialiserInheritorGuid(objetInheritor) { return objetInheritor._value ? objetInheritor._value : null; } staticrialiserInheritorGuid(valeur) { return null; // return valeur._value ? valeur : new Guid(valeur); } static estdetypeInheritorGuid(valeur) { return valeur.hasOwnProperty("_value"); } static estdetypeGuid(valeur) { if (!valeur) return false; return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(valeur); } /** fin bloc GUID */ static valeurDéfautBooléen(valeur) { return (typeof valeur !== "undefined" && !valeur) ? false : true; } } HelperService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: HelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); HelperService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: HelperService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: HelperService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Nvcmktbmcvc3JjL2ZlYXR1cmUtY29yZS9zZXJ2aWNlL2hlbHBlci9oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sYUFBYTtJQUV0QixZQUFZO1FBQ1IsT0FBTyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHO1lBQ2xFLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVPLEVBQUU7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO2FBQzNDLFFBQVEsQ0FBQyxFQUFFLENBQUM7YUFDWixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELDJCQUEyQixDQUFDLFdBQWtCLEVBQUUsS0FBYTtRQUN6RCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLFdBQVcsQ0FBQztRQUNyQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixPQUFPLENBQUMsR0FBVyxFQUFFLFNBQWlCO1FBQ2xDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUNuQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQsT0FBTztJQUVQLE1BQU0sQ0FBQyxvQkFBb0I7UUFDdkIsT0FBTyxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQUMsR0FBVztRQUNuQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXRCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFFNUMsTUFBTSxXQUFXLEdBQWEsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTFELE1BQU0sVUFBVSxHQUFXLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkQsTUFBTSxTQUFTLEdBQVcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUvRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsTUFBTSxDQUFDLG1CQUFtQjtRQUN0QixNQUFNLFFBQVEsR0FBVyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNsRCxtRUFBbUU7UUFDbkUsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsb0JBQTZCLEtBQUs7UUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPO1FBRWhELElBQUksR0FBRyxHQUFXLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlCLEdBQUcsSUFBSSxTQUFTLENBQUM7U0FDcEI7UUFFRCxHQUFHLElBQUksSUFBSSxDQUFDO1FBRVosSUFBSSxpQkFBaUIsRUFBRTtZQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO2FBQU07WUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7U0FDOUI7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFdBQW1CO1FBQzVDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUM5QixLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNkLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZCxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDakQ7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFXO1FBQzVCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNuRCxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFXO1FBQzFCLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDcEIsbURBQW1EO1FBQ25ELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUdELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTTtRQUN4QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLG9HQUFvRyxDQUFDLENBQUM7UUFDL0gsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNOLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJO1FBQzVCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUVmLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3BCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUUxQixHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ3pFO1NBQ0o7UUFFRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxHQUFXLEVBQUUsVUFBa0I7UUFDMUQsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQVcsRUFBRSxLQUFhLEVBQUUsS0FBYztRQUNqRSxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxzQ0FBc0MsQ0FBQztRQUN0RixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFBQyxLQUFLLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEUsT0FBTyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakMsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNqRjtRQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsNkJBQTZCO1FBQ2hDLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQWEsRUFBRSxXQUFvQjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3JFLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5GLElBQUksTUFBTSxLQUFLLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV4QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXRDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRztZQUNsQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM1RCxDQUFDO0lBR0QsTUFBTSxDQUFDLDJCQUEyQixDQUFDLEdBQVc7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNwQyxPQUFPLEVBQUUsQ0FBQztTQUNiO1FBRUQsTUFBTSxRQUFRLEdBQWEsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVc7UUFFL0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDckMsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxNQUFNLENBQUMsMEJBQTBCLENBQUMsTUFBYztRQUM1QyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTSxDQUFDLDRCQUE0QixDQUFDLFlBQW9CLEVBQUUsS0FBYSxFQUFFLE1BQWM7UUFDbkYsT0FBTyxhQUFhLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQVU7UUFDNUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUM7SUFDM0UsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLHVCQUF1QjtRQUMxQixPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBYztRQUNuQyxPQUFPLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLHlDQUF5QyxDQUFDLGdCQUF3QixFQUFFLG1CQUE0QjtRQUNuRyxJQUFJLENBQUMsZ0JBQWdCO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFbkMsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUN2RixNQUFNLG1CQUFtQixHQUFhLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXpGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUU7WUFDN0IsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzdELE1BQU0sc0JBQXNCLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsTUFBTSxxQkFBcUIsR0FBVyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3SixNQUFNLGVBQWUsR0FBb0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRXJHLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ2xCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE1BQVc7UUFDdEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDaEQ7YUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUNuQyxPQUFPLE1BQU0sQ0FBQztTQUNqQjthQUFNO1lBQ0gsTUFBTSxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDaEU7UUFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU87UUFDcEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQWU7UUFDckMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQy9CLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUNqQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQU07UUFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELCtCQUErQjtJQUMvQixNQUFNLENBQUMseUJBQXlCLENBQUMsZ0JBQXdCO1FBQ3JELElBQUksZ0JBQXdCLENBQUM7UUFFN0IsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ2pELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxNQUFNLEdBQUcsR0FBYSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbEQsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxPQUFPLGdCQUFnQixDQUFDO0lBQzVCLENBQUM7SUFFRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBVSxFQUFFLFNBQWlCO1FBQ3BELElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDakUsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDM0I7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQWM7UUFDbEMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxPQUFjLEVBQUUsTUFBVztRQUNuRCxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxPQUFjLEVBQUUsTUFBVztRQUN6RCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQy9CO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxNQUFjO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMseUJBQXlCLENBQUMsY0FBbUI7UUFDaEQsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEUsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxNQUFXO1FBQ3RDLE9BQU8sSUFBSSxDQUFBO1FBQ1gsb0RBQW9EO0lBQ3hELENBQUM7SUFFRCxNQUFNLENBQUMsc0JBQXNCLENBQUMsTUFBVztRQUNyQyxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBYztRQUMvQixJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzFCLE9BQU8sK0VBQStFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxvQkFBb0I7SUFFcEIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQVc7UUFDbEMsT0FBTyxDQUFDLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRSxDQUFDOzswR0FuVVEsYUFBYTs4R0FBYixhQUFhLGNBRlYsTUFBTTsyRkFFVCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEhlbHBlclNlcnZpY2Uge1xyXG5cclxuICAgIGdlbmVyYXRlR3VpZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnM0KCkgKyB0aGlzLnM0KCkgKyAnLScgKyB0aGlzLnM0KCkgKyAnLScgKyB0aGlzLnM0KCkgKyAnLScgK1xyXG4gICAgICAgICAgICB0aGlzLnM0KCkgKyAnLScgKyB0aGlzLnM0KCkgKyB0aGlzLnM0KCkgKyB0aGlzLnM0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzNCgpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMClcclxuICAgICAgICAgICAgLnRvU3RyaW5nKDE2KVxyXG4gICAgICAgICAgICAuc3Vic3RyaW5nKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVZhbHVlRnJvbUFycmF5QnlJbmRleChhcnJheVZhbHVlczogYW55W10sIGluZGV4OiBudW1iZXIpOiBhbnlbXSB7XHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIGFycmF5VmFsdWVzO1xyXG4gICAgICAgIHJldHVybiBbLi4uYXJyYXlWYWx1ZXMuc2xpY2UoMCwgaW5kZXgpLCAuLi5hcnJheVZhbHVlcy5zbGljZShpbmRleCArIDEpXTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogYXJyb25kaXIgdW4gbm9tYnJlICovXHJcbiAgICByb3VuZFVwKG51bTogbnVtYmVyLCBwcmVjaXNpb246IG51bWJlcikge1xyXG4gICAgICAgIHByZWNpc2lvbiA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24pXHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW0gKiBwcmVjaXNpb24pIC8gcHJlY2lzaW9uXHJcbiAgICB9XHJcblxyXG4gICAgLyoqICAqL1xyXG5cclxuICAgIHN0YXRpYyByZXRvdXJuZU5vbURlRG9tYWluZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0bmFtZSArIChsb2NhdGlvbi5wb3J0ID8gJzonICsgbG9jYXRpb24ucG9ydCA6ICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW5sZXZlck5vbURvbWFpbmVVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghdXJsKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKCEvXmh0dHBbc10/OlxcL1xcLy8udGVzdCh1cmwpKSByZXR1cm4gdXJsO1xyXG5cclxuICAgICAgICBjb25zdCB1cmxTYW5zSHR0cDogc3RyaW5nW10gPSB1cmwuc3BsaXQoL15odHRwW3NdPzpcXC9cXC8vKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5kZXhTbGFzaDogbnVtYmVyID0gdXJsU2Fuc0h0dHBbMV0uaW5kZXhPZihcIi9cIik7XHJcblxyXG4gICAgICAgIGNvbnN0IHVybFZhbGlkZTogc3RyaW5nID0gdXJsU2Fuc0h0dHBbMV0uc3Vic3RyaW5nKGluZGV4U2xhc2gpO1xyXG5cclxuICAgICAgICByZXR1cm4gdXJsVmFsaWRlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZXRvdXJuZVNlZ21lbnRzVVJMKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICBjb25zdCBwYXRoTmFtZTogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIC8vIG9uIHN1cHByaW1lIGR1IHBhdGhuYW1lIGxlIGRlcm5pZXIgY2FyYWN0w6hyZXMgcydpbCBzJ2FnaXQgZCd1biAvXHJcbiAgICAgICAgcmV0dXJuIHBhdGhOYW1lLnJlcGxhY2UoL1xcLyQvLCAnJykuc3BsaXQoJy8nKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgb3V2cmlyVXJsRXh0ZXJuZShsaWVuOiBzdHJpbmcsIGVzdGNlTm91dmVsT25nbGV0OiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMucmV0b3VybmVOdWxsU2lOb25Ew6lmaW5pKGxpZW4pKSByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCB1cmw6IHN0cmluZyA9ICcnO1xyXG4gICAgICAgIGlmICghL15odHRwW3NdPzpcXC9cXC8vLnRlc3QobGllbikpIHtcclxuICAgICAgICAgICAgdXJsICs9ICdodHRwOi8vJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVybCArPSBsaWVuO1xyXG5cclxuICAgICAgICBpZiAoZXN0Y2VOb3V2ZWxPbmdsZXQpIHtcclxuICAgICAgICAgICAgd2luZG93Lm9wZW4odXJsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG5ldHRveWVyUGFyYW1ldHJlc1VybChhbmNpZW5uZVVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgIGxldCBub3V2ZWxsZVVybCA9IGFuY2llbm5lVXJsO1xyXG4gICAgICAgIGluZGV4ID0gYW5jaWVubmVVcmwuaW5kZXhPZignPycpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gYW5jaWVubmVVcmwuaW5kZXhPZignIycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIG5vdXZlbGxlVXJsID0gYW5jaWVubmVVcmwuc3Vic3RyaW5nKDAsIGluZGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBub3V2ZWxsZVVybDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY29uc3RydWlyZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0b3VybmVOb21EZURvbWFpbmUoKSArICcvJyArIHVybDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2VnbWVudHNVUkwodXJsOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybiBbXTtcclxuICAgICAgICAvLyBvbiBzdXBwcmltZSBkZSBsJ3VybCBsZSAxZXIgLyBldCBsZSBkZSBkZXJuaWVyIC9cclxuICAgICAgICByZXR1cm4gdXJsLnJlcGxhY2UoL1xcLyovLCAnJykucmVwbGFjZSgvXFwvJC8sICcnKS5zcGxpdCgnLycpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgZXN0Y2VVcmxWYWxpZGUoc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gc3RyaW5nLm1hdGNoKC8oaHR0cChzKT86XFwvXFwvLik/KHd3d1xcLik/Wy1hLXpBLVowLTlAOiUuX1xcK34jPV17MiwyNTZ9XFwuW2Etel17Miw2fVxcYihbLWEtekEtWjAtOUA6JV9cXCsufiM/Ji8vPV0qKS9nKTtcclxuICAgICAgICBpZiAoIXJlcykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbmNvZGVyUGFyYW3DqHRyZXNVcmwoZGF0YSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcmV0ID0gW107XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRhdGFba2V5XTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXQucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChlbGVtZW50KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXQuam9pbignJicpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb25jYXTDqW5lclBhcmFtw6h0cmVzVXJsKHVybDogc3RyaW5nLCBwYXJhbcOodHJlczogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdXJsICsgJz8nICsgcGFyYW3DqHRyZXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGFqb3V0ZXJQYXJhbcOodHJlVXJsKHVybDogc3RyaW5nLCBwYXJhbTogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKSwgcmVnZXggPSAvKD86XFw/fCZhbXA7fCYpKyhbXj1dKykoPzo9KFteJl0qKSkqL2c7XHJcbiAgICAgICAgbGV0IG1hdGNoID0gbnVsbDtcclxuICAgICAgICBjb25zdCBzdHIgPSBbXTsgYS5ocmVmID0gdXJsOyBwYXJhbSA9IGVuY29kZVVSSUNvbXBvbmVudChwYXJhbSk7XHJcblxyXG4gICAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4LmV4ZWMoYS5zZWFyY2gpKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbSAhPT0gbWF0Y2hbMV0pIHN0ci5wdXNoKG1hdGNoWzFdICsgKG1hdGNoWzJdID8gXCI9XCIgKyBtYXRjaFsyXSA6IFwiXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0ci5wdXNoKHBhcmFtICsgKHZhbHVlID8gXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpIDogXCJcIikpO1xyXG4gICAgICAgIGEuc2VhcmNoID0gc3RyLmpvaW4oXCImXCIpO1xyXG4gICAgICAgIHJldHVybiBhLmhyZWY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvdXJuZSBsJ3VybCBjb3VyYW50ZSBzYW5zIGxlcyBwYXJhbcOodHJlc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZG9ubmVVcmxDb3VyYW50ZVNhbnNQYXJhbcOodHJlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KC9bPyNdLylbMF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBKYXZhU2NyaXB0IEdldCBVUkwgUGFyYW1ldGVyXHJcbiAgICAgKiBAcGFyYW0gU3RyaW5nIHByb3AgVGhlIHNwZWNpZmljIFVSTCBwYXJhbWV0ZXIgeW91IHdhbnQgdG8gcmV0cmVpdmUgdGhlIHZhbHVlIGZvclxyXG4gICAgICogQHJldHVybiBTdHJpbmd8T2JqZWN0IElmIHByb3AgaXMgcHJvdmlkZWQgYSBzdHJpbmcgdmFsdWUgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBhbiBvYmplY3Qgb2YgYWxsIHByb3BlcnRpZXMgaXMgcmV0dXJuZWRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGRvbm5lUGFyYW3DqHRyZXNVcmwocHJvcD86IHN0cmluZywgdXJsU3RhdGlxdWU/OiBzdHJpbmcpOiBzdHJpbmcgfCBvYmplY3Qge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHVybENvdXJhbnRlID0gdXJsU3RhdGlxdWUgPyB1cmxTdGF0aXF1ZSA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmxDb3VyYW50ZS5zbGljZSh1cmxDb3VyYW50ZS5pbmRleE9mKCc/JykgKyAxKSk7XHJcblxyXG4gICAgICAgIGlmIChzZWFyY2ggPT09IHVybENvdXJhbnRlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgZGVmaW5pdGlvbnMgPSBzZWFyY2guc3BsaXQoJyYnKTtcclxuXHJcbiAgICAgICAgZGVmaW5pdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAodmFsLCBrZXkpIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydHMgPSB2YWwuc3BsaXQoJz0nLCAyKTtcclxuICAgICAgICAgICAgcGFyYW1zW3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoKHByb3AgJiYgIShwcm9wIGluIHBhcmFtcykpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChwcm9wICYmIHByb3AgaW4gcGFyYW1zKSA/IHBhcmFtc1twcm9wXSA6IHBhcmFtcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIHJldG91cm5lUGFyYW3DqHRyZXNBY2NvbGFkZXModXJsOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJldG91cm5lTnVsbFNpTm9uRMOpZmluaSh1cmwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHLDqXN1bHRhdDogc3RyaW5nW10gPSB1cmwubWF0Y2goL1xceyguKj8pXFx9L2cpOyAvLyBlbnRyZSB7fVxyXG5cclxuICAgICAgICByZXR1cm4gIXLDqXN1bHRhdCA/IFtdIDogcsOpc3VsdGF0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBlZmZhY2UgbGVzIHBhcmFtw6h0cmVzIGVudHJlIGFjY29sYWRlcyBkJ3VuZSBjaGHDrm5lICovXHJcbiAgICBzdGF0aWMgZWZmYWNlclBhcmFtw6h0cmVzQWNjb2xhZGVzKGNoYWluZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy7DqXZpdGVyRG91YmxlU2xhc2godGhpcy5yZXBsYWNlQWxsKGNoYWluZSwgL1xceyguKj8pXFx9L2csIFwiXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtcGxhY2VyUGFyYW3DqHRyZXNBY2NvbGFkZXMoY2hlcmNoZXJEYW5zOiBzdHJpbmcsIG1vdGlmOiBzdHJpbmcsIHZhbGV1cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gSGVscGVyU2VydmljZS5yZXBsYWNlQWxsKGNoZXJjaGVyRGFucywgYHske21vdGlmfX1gLCB2YWxldXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlc3RjZU9iamV0VmlkZShvYmpldDogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamV0KS5sZW5ndGggPT09IDAgJiYgb2JqZXQuY29uc3RydWN0b3IgPT09IE9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIETDqXRlY3Rpb24gZGUgc2F2b2lyIHMnaWwgbCdvbiB2aWVudCBkJ3VuZSBub3V2ZWxsZSBwYWdlIG91IGQndW5lIHBhZ2UgZHUgc2l0ZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFnZU91dmVydGVEZXB1aXNTY3JpcHQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5vcGVuZXIgIT09IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIMOpdml0ZXJEb3VibGVTbGFzaChjaGFpbmU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIEhlbHBlclNlcnZpY2UucmVwbGFjZUFsbChjaGFpbmUsIC8oaHR0cHM/OlxcL1xcLyl8KFxcLyl7Mix9L2csIFwiJDEkMlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFbDqXJpZmllIHMnaWwgZXhpc3RlIHVuZSBjb25jb3JkYW5jZSBlbnRyZSBsZXMgYHBhcmFtw6h0cmVzIGRlIGwndXJsIGNvdXJhbnRlYCBldCBsZXMgYHBhcmFtw6h0cmVzIGRlIGxhIHNvdXJjZSBkZSBkb25uw6llc2BcclxuICAgICAqIEBwYXJhbSB1cmxTb3VyY2VEb25uw6llcyA6IGV4ZW1wbGUgOiBsYSBzb3VyY2UgZGUgZG9ubsOpZXMgZCd1bmUgcGFnZSBkZSB0eXBlIGZvcm11bGFpcmUsIGh0dHA6Ly9hcGkuc29uYXRlLWRldi5mcjo4NS90aWVycy9pbmRpdmlkdXMve2lkfVxyXG4gICAgICogQHBhcmFtIHVybENvdXJhbnRlU3RhdGlxdWUgOiBsJ3VybCBkdSBuYXZpZ2F0ZXVyLCBodHRwOi8vbG9jYWxob3N0OjEyMDAvcGFnZS9sYWItZm9ybXVsYWlyZT9pZD0wMTYyNDdhMi0yYzFjLTRlMDgtYmQ3OC05YjA1NjU5ZWM1ZWVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNpQ29uY29yZGFuY2VQYXJhbcOodHJlc1VSTGV0U291cmNlRG9ubsOpZXModXJsU291cmNlRG9ubsOpZXM6IHN0cmluZywgdXJsQ291cmFudGVTdGF0aXF1ZT86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdXJsU291cmNlRG9ubsOpZXMpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCB1cmxDb3VyYW50ZSA9IHVybENvdXJhbnRlU3RhdGlxdWUgPyB1cmxDb3VyYW50ZVN0YXRpcXVlIDogd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcclxuICAgICAgICBjb25zdCBwYXJhbcOodHJlc0FjY29sYWRlczogc3RyaW5nW10gPSB0aGlzLnJldG91cm5lUGFyYW3DqHRyZXNBY2NvbGFkZXModXJsU291cmNlRG9ubsOpZXMpO1xyXG5cclxuICAgICAgICBpZiAoIXBhcmFtw6h0cmVzQWNjb2xhZGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGFyYW3DqHRyZXNBY2NvbGFkZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtw6h0cmVBdmVjQWNjb2xhZGVzID0gcGFyYW3DqHRyZXNBY2NvbGFkZXNbaW5kZXhdO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJhbcOodHJlU2Fuc0FjY29sYWRlOiBzdHJpbmcgPSBwYXJhbcOodHJlQXZlY0FjY29sYWRlcy5zdWJzdHJpbmcocGFyYW3DqHRyZUF2ZWNBY2NvbGFkZXMubGFzdEluZGV4T2YoXCJ7XCIpICsgMSwgcGFyYW3DqHRyZUF2ZWNBY2NvbGFkZXMubGFzdEluZGV4T2YoXCJ9XCIpKTtcclxuICAgICAgICAgICAgY29uc3QgdmFsZXVyUGFyYW3DqHRyZTogc3RyaW5nIHwgb2JqZWN0ID0gdGhpcy5kb25uZVBhcmFtw6h0cmVzVXJsKHBhcmFtw6h0cmVTYW5zQWNjb2xhZGUsIHVybENvdXJhbnRlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdmFsZXVyUGFyYW3DqHRyZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZXRvdXJuZU51bGxTaU5vbkTDqWZpbmkodmFsZXVyOiBhbnkpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWxldXIpKSB7XHJcbiAgICAgICAgICAgIHZhbGV1ciA9IHZhbGV1ci5sZW5ndGggPT09IDAgPyBudWxsIDogdmFsZXVyO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbGV1ciA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbGV1cjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YWxldXIgPSB0eXBlb2YgdmFsZXVyID09PSBcInN0cmluZ1wiID8gdmFsZXVyLnRyaW0oKSA6IHZhbGV1cjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICF2YWxldXIgPyBudWxsIDogdmFsZXVyO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZXBsYWNlQWxsKHRleHQsIHBhdHRlcm4sIG5ld1RleHQpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChwYXR0ZXJuLCAnZycpLCBuZXdUZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdmFsZXVyVGV4dGVCb29sw6llbih2YWxldXI6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHZhbGV1cikgPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWxldXIgPyBcIk91aVwiIDogXCJOb25cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlc3ROdW1lcmlxdWUobjogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAwMSAwMiAwMyAwNCAwNSAtPiAwMTAyMDMwNDA1XHJcbiAgICBzdGF0aWMgYWRhcHRldXJFY3JpdHVyZVRlbGVwaG9uZSh2YWxldXJBdmVjRXNwYWNlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCB2YWxldXJTYW5zRXNwYWNlOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5yZXRvdXJuZU51bGxTaU5vbkTDqWZpbmkodmFsZXVyQXZlY0VzcGFjZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0bXA6IHN0cmluZ1tdID0gdmFsZXVyQXZlY0VzcGFjZS5zcGxpdCgnICcpO1xyXG5cclxuICAgICAgICB2YWxldXJTYW5zRXNwYWNlID0gdG1wWzBdICsgdG1wWzFdICsgdG1wWzJdICsgdG1wWzNdICsgdG1wWzRdO1xyXG4gICAgICAgIHJldHVybiB2YWxldXJTYW5zRXNwYWNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZXRvdXJuZVZhbGV1ck9iamV0KG9iamV0OiBhbnksIHByb3ByacOpdMOpOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodHlwZW9mIG9iamV0ICE9PSAndW5kZWZpbmVkJyAmJiBvYmpldC5oYXNPd25Qcm9wZXJ0eShwcm9wcmnDqXTDqSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iamV0W3Byb3ByacOpdMOpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGR1cGxpcXVlclRhYmxlYXUodGFibGVhdTogYW55W10pOiBhbnlbXSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi50YWJsZWF1XTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWpvdXRlclZhbGV1clRhYmxlYXUodGFibGVhdTogYW55W10sIHZhbGV1cjogYW55KTogYW55W10ge1xyXG4gICAgICAgIHJldHVybiBbLi4udGFibGVhdSwgdmFsZXVyXTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWpvdXRlclZhbGV1clVuaXF1ZVRhYmxlYXUodGFibGVhdTogYW55W10sIHZhbGV1cjogYW55KTogYW55W10ge1xyXG4gICAgICAgIGlmICh0YWJsZWF1LmluZGV4T2YodmFsZXVyKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsuLi50YWJsZWF1LCB2YWxldXJdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRhYmxlYXU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGFycm9uZGlyWmVyb0NpbnFQcsOocyhub21icmU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobm9tYnJlICogMikgKiAwLjU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVbiBHVUlEIGVudm95w6kgZGVwdWlzIGxlIGJhY2sgYXUgZnJvbnQgZXN0IGRlIGxhIGZvcm1lIDogKGluaGVyaXRvcikge192YWx1ZTogXCIwMTYzZDU5YS1iY2Q4LTQ0ZmUtODUyZi0xMDBhZjc3ZGZiOWJcIn1cclxuICAgICAqIEBwYXJhbSBvYmpldEluaGVyaXRvciBvYmpldCBHVUlEIGVudm95w6kgZGVwdWlzIGxlIGJhY2tvZmZpY2VcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGTDqXPDqXJpYWxpc2VySW5oZXJpdG9yR3VpZChvYmpldEluaGVyaXRvcjogYW55KTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gb2JqZXRJbmhlcml0b3IuX3ZhbHVlID8gb2JqZXRJbmhlcml0b3IuX3ZhbHVlIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc8OpcmlhbGlzZXJJbmhlcml0b3JHdWlkKHZhbGV1cjogYW55KTogb2JqZWN0IHtcclxuICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIC8vIHJldHVybiB2YWxldXIuX3ZhbHVlID8gdmFsZXVyIDogbmV3IEd1aWQodmFsZXVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXN0ZGV0eXBlSW5oZXJpdG9yR3VpZCh2YWxldXI6IGFueSk6IG9iamVjdCB7XHJcbiAgICAgICAgcmV0dXJuIHZhbGV1ci5oYXNPd25Qcm9wZXJ0eShcIl92YWx1ZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXN0ZGV0eXBlR3VpZCh2YWxldXI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdmFsZXVyKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIC9eWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JC8udGVzdCh2YWxldXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBmaW4gYmxvYyBHVUlEICovXHJcblxyXG4gICAgc3RhdGljIHZhbGV1ckTDqWZhdXRCb29sw6llbih2YWxldXI6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodHlwZW9mIHZhbGV1ciAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhdmFsZXVyKSA/IGZhbHNlIDogdHJ1ZTtcclxuICAgIH1cclxufVxyXG4iXX0=