WikiLerni/front/public/JS/manageQuestionnaires.app.js

2221 lines
332 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******/ (function() { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "../config/illustrations.js":
/*!**********************************!*\
!*** ../config/illustrations.js ***!
\**********************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
const instance = __webpack_require__(/*! ./instance */ "../config/instance.js");
module.exports = {
// API'routes (after "apiUrl" defined in instance.js)
illustrationsRoute: "/illustration/",
// forms : à compléter avec valeurs par défaut, etc. cf modèle
Illustration: {
alt: {
maxlength: 255
},
title: {
maxlength: 255
},
caption: {
maxlength: 255
},
image: {
required: true,
accept: instance.mimeTypesForIllustration.join(",")
}
},
// files upload tempory dir
dirIllustrationsTmp: "temp",
dirIllustrations: "front/public/img/quizs"
};
/***/ }),
/***/ "../config/instance.js":
/*!*****************************!*\
!*** ../config/instance.js ***!
\*****************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
const users = __webpack_require__(/*! ./users */ "../config/users.js");
const questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js");
module.exports = {
apiUrl: "http://localhost:3000/api",
siteUrl: "http://localhost:8080",
adminName: "Fabrice",
adminEmail: "dev@wikilerni.com",
senderName: "WikiLerni (local)",
senderEmail: "bonjour@wikilerni.com",
adminLang: "fr",
theme: "wikilerni",
// le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.
availableLangs: ["fr"],
// Languages in which the site is available. The first one is the default one.
siteName: "WikiLerni (local)",
beginCodeGodfather: "WL",
// case-sensitive and can't contain "@" !
defaultReceiptDays: "147",
// Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)
cronTimingAlertInSeconde: 120,
// for logs
responseTimingAlertInSeconde: 3,
// idem
tokenSignupValidationTimeInHours: "48h",
// https://github.com/zeit/ms
tokenLoginLinkTimeInHours: "1h",
tokenConnexionMinTimeInHours: "24h",
tokenConnexionMaxTimeInDays: "180 days",
tokenLoginChangingTimeInHours: "1h",
// for email & password changing
tokenDeleteUserTimeInHours: "1h",
tokenUnsubscribeLinkTimeInDays: "7 days",
// token send with subscription's emails
freeAccountTimingInDays: 0,
// if 0 = unlimited
freeAccountExpirationNotificationInDays: 3,
accountExpirationFirstNotificationInDays: 10,
accountExpirationSecondNotificationInDays: 3,
inactiveAccountTimeToDeleteInDays: 180,
// Questionnaires:
nbQuestionsMin: 1,
// minimum number of questions for the questionnaire to be publishable
nbQuestionsMax: 2,
// if 0 = not maximum
nbChoicesMax: 10,
nbNewQuestionnaires: 12,
// for RSS, etc.
hourGiveNewQuestionnaireBegin: 7,
// in user local time
hourGiveNewQuestionnaireEnd: 21,
// idem
maxQuestionnaireSendedAtSameTime: 50,
// for subscription's e-mailing
minSearchQuestionnaires: 3,
fieldNewQuestionnaires: "publishingAt",
// field to be used to create the list of the last questionnaires, can be "createdAt", "updatedAt" or "publishingAt"
// Groups :
nbQuestionnairesByGroupMin: 1,
nbQuestionnairesByGroupMax: 0,
// Illustrations:
nbIllustrationsMin: 1,
nbIllustrationsMax: 1,
maxIllustrationSizeinOctet: 1000000,
// pas contrôlé pour l'instant. À revoir.
mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"],
// -- Upload and resize:
illustrationsWidthMaxInPx: 500,
illustrationsMiniaturesWidthMaxInPx: 200,
// Links:
nbLinksMin: 1,
nbLinksMax: 0,
// Questions & responses:
nbQuestionsMin: 1,
nbQuestionsMax: 0,
nbChoicesMax: 10,
// à supprimer quand tous les "require" à jour:
passwordMinLength: users.password.minlength,
dirCacheUsers: users.dirCacheUsers,
dirCacheUsersAnswers: users.dirCacheUsersAnswers,
dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,
dirCacheQuestions: questionnaires.dirCacheQuestions,
dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,
dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,
dirWebQuestionnaires: questionnaires.dirWebQuestionnaires
};
/***/ }),
/***/ "../config/links.js":
/*!**************************!*\
!*** ../config/links.js ***!
\**************************/
/***/ (function(module) {
module.exports = {
// API'routes (after "apiUrl" defined in instance.js)
linksRoute: "/link/",
// forms : à compléter avec valeurs par défaut, etc. cf modèle
Link: {
url: {
maxlength: 255,
required: true
},
anchor: {
maxlength: 150,
required: true
}
}
};
/***/ }),
/***/ "../config/questionnaires.js":
/*!***********************************!*\
!*** ../config/questionnaires.js ***!
\***********************************/
/***/ (function(module) {
module.exports = {
// API'routes (after "apiUrl" defined in instance.js)
questionnaireRoutes: "/questionnaire",
// la base à laquelle s'ajoute les routes suivantes
getListNextQuestionnaires: "/getlistnextquestionnaires/",
getQuestionnaireRoutes: "/get",
getRandomQuestionnairesRoute: "/getrandom",
getStatsQuestionnaires: "/stats/",
previewQuestionnaireRoutes: "/preview",
publishedQuestionnaireRoutes: "/quiz/",
regenerateHTML: "/htmlregenerated",
searchAdminQuestionnairesRoute: "/searchadmin",
searchQuestionnairesRoute: "/search",
// -- groupes :
groupRoutes: "/group",
getGroupRoute: "/get/",
previewGroupRoutes: "/preview",
searchGroupsRoute: "/search",
// -- questions & choices :
questionsRoute: "/question/",
// -- tags :
tagsSearchRoute: "/tags/search/",
// -- answers :
getAdminStats: "/getadminstats/",
getPreviousAnswers: "/user/answers/",
getStatsAnswers: "/user/anwswers/stats/",
// fonctionne aussi pour les groupes
saveAnswersRoute: "/answer/",
// idem
// forms : à compléter avec valeurs par défaut, etc. cf modèle
Questionnaire: {
title: {
maxlength: 255,
required: true
},
slug: {
maxlength: 150
},
// champ requis mais calculé à partir du titre qd laissé vide dans le formulaire
introduction: {
required: true
}
},
searchQuestionnaires: {
minlength: 3,
required: true
},
Group: {
title: {
maxlength: 255,
required: true
},
slug: {
maxlength: 150
} // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire
},
Question: {
text: {
maxlength: 255,
required: true
},
rank: {
required: true,
min: 1,
defaultValue: 1
}
},
Choice: {
text: {
maxlength: 255,
required: true
}
},
search: {
minlength: 3,
required: true
},
searchGroups: {
minlength: 3,
required: true
},
// Emplacement des fichiers JSON générés :
dirCacheGroups: "datas/questionnaires/groups",
dirCacheQuestionnaires: "datas/questionnaires",
dirCacheQuestions: "datas/questionnaires/questions",
dirCacheTags: "datas/questionnaires/tags",
dirCacheUsersQuestionnaires: "datas/users/questionnaires",
// Emplacement des fichiers HTML générés :
dirHTMLGroups: "front/public/quiz/gp",
dirHTMLQuestionnaires: "front/public/quiz",
dirHTMLNews: "front/public/quizs",
dirHTMLTags: "front/public/quizs",
// Idem mais pour urls :
dirWebGroups: "quiz/gp",
dirWebQuestionnaires: "quiz",
dirWebNews: "quizs/",
dirWebTags: "quizs/",
// limite des résultat du moteur de recherche, quand demande de résultats au hasard :
nbRandomResults: 3,
/* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */
nbQuestionsMin: 1,
nbQuestionsMax: 0,
nbChoicesMax: 10,
nbTagsMin: 0,
nbTagsMax: 0 // 0 = not max
};
/***/ }),
/***/ "../config/users.js":
/*!**************************!*\
!*** ../config/users.js ***!
\**************************/
/***/ (function(module) {
module.exports = {
// API'routes (after "apiUrl" defined in instance.js)
userRoutes: "/user",
checkDeleteLinkRoute: "/confirmdelete/",
checkIfIsEmailfreeRoute: "/isemailfree",
checkLoginRoute: "/checklogin/",
checkNewLoginLinkRoute: "/confirmnewlogin/",
checkSubscribeTokenRoute: "/validation/",
connectionRoute: "/login",
connectionWithLinkRoute: "/checkloginlink",
createUserRoute: "/create",
getAdminStats: "/getadminstats/",
getGodChilds: "/getgodchilds/",
getGodfatherRoute: "/getgodfatherid",
getLoginLinkRoute: "/getloginlink",
getPayments: "/payment/getforoneuser/",
getUserInfos: "/get/",
getUsersQuestionnairesRoute: "/getusersquestionnaires/",
// les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement
searchUserRoute: "/search/",
signupCompletionRoute: "/signupcompletion/",
subscribeRoute: "/signup",
unsubscribeRoute: "/subscription/stop/",
updateUserInfos: "/modify/",
validateUserRoute: "/validate/",
// forms : à compléter avec valeurs par défaut, etc. cf modèle
name: {
maxlength: 70,
required: true
},
email: {
maxlength: 255,
required: true
},
password: {
minlength: 8,
maxlength: 72,
required: true
},
// https://www.npmjs.com/package/bcrypt#security-issues-and-concerns
newPassword: {
minlength: 8,
maxlength: 72
},
codeGodfather: {
maxlength: 255
},
cguOk: {
value: "true",
required: true
},
search: {
minlength: 1,
required: true
},
timeDifferenceMin: -720,
timeDifferenceMax: 840,
// JSON dir
dirCacheUsers: "datas/users",
dirCacheUsersAnswers: "datas/users/questionnaires/answers",
dirCacheUsersWithoutAnswers: "datas/users/questionnaires/without"
};
/***/ }),
/***/ "./src/tools/clientstorage.js":
/*!************************************!*\
!*** ./src/tools/clientstorage.js ***!
\************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "saveLocaly": function() { return /* binding */ saveLocaly; },
/* harmony export */ "getLocaly": function() { return /* binding */ getLocaly; },
/* harmony export */ "removeLocaly": function() { return /* binding */ removeLocaly; }
/* harmony export */ });
// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
const saveLocaly = (name, data) => {
localStorage.setItem(name, JSON.stringify(data));
};
const getLocaly = (name, json = false) => {
if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
};
const removeLocaly = name => {
localStorage.removeItem(name);
};
/***/ }),
/***/ "./src/tools/dom.js":
/*!**************************!*\
!*** ./src/tools/dom.js ***!
\**************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "addElement": function() { return /* binding */ addElement; }
/* harmony export */ });
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
// Fonction associant les attributs fournis à un champ de formulaire
const addElement = (eltParent, eltType, eltContent = "", eltId = "", eltClass = [], eltAttributes = {}, replace = true) => {
if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {
const newElement = document.createElement(eltType);
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
newElement.id = eltId;
if (Array.isArray(eltClass) && eltClass.length != 0) {
for (let i in eltClass) newElement.classList.add(eltClass[i]);
}
if (typeof eltAttributes === "object") // !! tous les objets ne sont pas ok
{
for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);
}
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "<br>"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.
if (replace) eltParent.innerHTML = "";
eltParent.appendChild(newElement);
}
};
/***/ }),
/***/ "./src/tools/everywhere.js":
/*!*********************************!*\
!*** ./src/tools/everywhere.js ***!
\*********************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "helloDev": function() { return /* binding */ helloDev; },
/* harmony export */ "updateAccountLink": function() { return /* binding */ updateAccountLink; }
/* harmony export */ });
// Ce script fournit des fonctions utilisées sur toutes les pages du site
const helloDev = () => {
console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****");
return true;
};
const updateAccountLink = (status, configTemplate) => {
const link = document.getElementById("accountHeadLink");
const homePage = status + "HomePage";
link.href = "/" + configTemplate[homePage];
};
/***/ }),
/***/ "./src/tools/forms.js":
/*!****************************!*\
!*** ./src/tools/forms.js ***!
\****************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "setAttributesToInputs": function() { return /* binding */ setAttributesToInputs; },
/* harmony export */ "getDatasFromInputs": function() { return /* binding */ getDatasFromInputs; },
/* harmony export */ "empyForm": function() { return /* binding */ empyForm; },
/* harmony export */ "empyAndHideForm": function() { return /* binding */ empyAndHideForm; }
/* harmony export */ });
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
// Fonction associant les attributs fournis à un champ de formulaire
const setAttributesToInputs = (inputsConf, myForm) => {
for (let i in myForm.elements) {
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(myForm.elements[i].id)) {
let idInput = myForm.elements[i].id;
if (inputsConf[idInput] !== undefined) {
let inputHTML = document.getElementById(idInput);
for (let attribute in inputsConf[idInput]) inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);
}
}
}
return true;
}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.
const getDatasFromInputs = myForm => {
const datas = {};
const formData = new FormData(myForm);
for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];
return datas;
}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
// Revoir pour les select
const empyForm = myForm => {
const formData = new FormData(myForm);
for (let entrie of formData.entries()) {
if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = "";
}
return true;
}; // Vide et cache le formulaire
const empyAndHideForm = myForm => {
empyForm(myForm);
myForm.style.display = "none";
};
/***/ }),
/***/ "./src/tools/url.js":
/*!**************************!*\
!*** ./src/tools/url.js ***!
\**************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "getUrlParams": function() { return /* binding */ getUrlParams; }
/* harmony export */ });
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
// Fonction récupérant les paramètres passés par l'url
const getUrlParams = () => {
if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(location.search)) return false;
const parameters = location.search.substring(1).split("&");
if (!Array.isArray(parameters) || parameters.length === 0) return false;
let param,
datas = {};
for (let i in parameters) {
param = parameters[i].split("=");
if (param.length === 2) datas[param[0]] = decodeURI(param[1]);
}
return datas;
};
/***/ }),
/***/ "./src/tools/users.js":
/*!****************************!*\
!*** ./src/tools/users.js ***!
\****************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "getTimeDifference": function() { return /* binding */ getTimeDifference; },
/* harmony export */ "setSession": function() { return /* binding */ setSession; },
/* harmony export */ "checkAnswerDatas": function() { return /* binding */ checkAnswerDatas; },
/* harmony export */ "checkSession": function() { return /* binding */ checkSession; }
/* harmony export */ });
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js");
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js");
/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);
const lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];
const configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + "/config/" + lang + ".js");
const getTimeDifference = () => {
// multiplier par -1, car c'est ce qu'il faut "ajouter" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse
const timeLocal = new Date().getTimezoneOffset() * -1;
if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;
}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite
// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.
const setSession = (userId, token, durationTS) => {
const storageUser = {
id: userId,
token: token,
duration: durationTS
};
(0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("user", storageUser);
}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs
// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas
const checkAnswerDatas = datas => {
const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("lastAnswer");
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {
const answer = JSON.parse(lastAnswer);
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {
datas.duration = answer.duration;
datas.nbCorrectAnswers = answer.nbCorrectAnswers;
datas.nbQuestions = answer.nbQuestions;
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;
}
}
return datas;
}; // Cette fonction teste la connexion de l'utilisateur d'une page
// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté
const checkSession = async (status = [], urlRedirection, message, urlWanted) => {
return new Promise((resolve, reject) => {
const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("user");
if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
} else {
const user = JSON.parse(userDatas);
if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {
(0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
} else {
const xhr = new XMLHttpRequest();
xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);
xhr.onload = () => {
let response = JSON.parse(xhr.responseText);
if (xhr.status === 200 && response.isValid && response.id != undefined) {
if (response.id === user.id) {
user.name = response.name;
user.language = response.language;
user.timeDifference = response.timeDifference;
user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API
(0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-)
if (response.status === "user" && response.nbDaysOk <= 0) {
const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + "/" + configTemplate.accountPage;
if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate.accountPage + "#subscribe"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?
resolve(true);
} else {
if (status.length !== 0 && status.indexOf(response.status) === -1) {
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
} else resolve(true);
}
} else {
(0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
}
} else {
(0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
}
};
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
}
}
});
}; // Cette fonction sert à la précédente en cas de connexion non valide
const redirectUser = (urlRedirection, message, urlWanted) => {
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("message", message);
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("url", urlWanted);
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);
};
/***/ }),
/***/ "../lang/fr/general.js":
/*!*****************************!*\
!*** ../lang/fr/general.js ***!
\*****************************/
/***/ (function(module) {
module.exports = {
addBtnTxt: "Ajouter",
addOkMessage: "Les données ont bien été enregistrées.",
alertNewWindow: "nouvelle fenêtre",
badUrl: "Tentative d'accès à une page n'existant pas :",
btnLinkToQuestionnaire: "Afficher !",
btnProposeConnection: "Je me connecte.",
btnProposeSubscribe: "Je crée mon compte.",
btnShowOnWebSite: "Lire la suite sur #SITE_NAME",
deleteBtnTxt: "Supprimer",
deleteFailMessage: "La suppression de l'enregistrement #ID a échoué.",
deleteOkMessage: "La suppression a bien été enregistrée.",
failAuth: "Erreur d'authentification.",
failAuthCron: "Tentative de lancement d'un cron sans le bon token.",
failAuthHeader: "Absence de header Authorization.",
failAuthId: "Identifiant non valide : ",
failAuthToken: "Token invalide ou utilisateur non trouvé.",
neededParams: "Des paramètres nécessaires manquants sont manquants.",
nextPage: "Page suivante",
notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.",
notRequired: "Facultatif.",
notValidFormat: "Format non valide.",
previousPage: "Page précédente",
serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.",
serverErrorAdmin: "Bug de l'application :",
siteHTMLTitle: "WikiLerni : la culture générale en liberté",
siteMetaDescription: "Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.",
scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.<br>En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.<br>Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",
subscriptionCall: "Inscrivez-vous !",
updateBtnTxt: "Modifier",
updateOkMessage: "La mise à jour à jour a bien été enregistrée."
};
/***/ }),
/***/ "../lang/fr/illustration.js":
/*!**********************************!*\
!*** ../lang/fr/illustration.js ***!
\**********************************/
/***/ (function(module) {
module.exports = {
addedOkMessage: "L'illustration a bien été enregistrée.",
addIllustrationTxt: "Ajouter une illustration",
defaultAlt: "Illustration du quiz",
deletedOkMessage: "L'illustration a bien été supprimée.",
introNoIllustration: "Aucune illustration pour l'instant.",
introTitleForIllustration: "Illustrations du quiz",
needGoodFile: "Votre fichier n'a pas été accepté.",
needGoodLongAlt: "Le texte de la propriété 'alt' ne doit pas compter plus de 255 caractères.",
needGoodLongCaption: "Le texte de la légende de l'image ne doit pas compter plus de 255 caractères.",
needGoodLongTitle: "Le texte de la propriété 'title' ne doit pas compter plus de 255 caractères.",
needGoodLongUrl: "L'url de l'image doit contenir entre 5 et 255 caractères.",
needMaxIllustrationsForQuestionnaire: "Vous avez déjà atteint le nombre maximal d'illustrations pour ce questionnaire.",
needQuestionnaireForIllustration: "Tentative d'ajout/mise à jour/suppreession d'une illustration pour un questionnaire n'ayant pas été trouvé.",
needUniqueUrl: "L'url est déjà utilisée par une autre image.",
needUrl: "Merci de fournir une url pour l'image.",
notFound: "L'enregistrement de l'illustration n'a pas été trouvé : ",
updatedOkMessage: "L'illustration a bien été modifiée."
};
/***/ }),
/***/ "../lang/fr/link.js":
/*!**************************!*\
!*** ../lang/fr/link.js ***!
\**************************/
/***/ (function(module) {
module.exports = {
addedOkMessage: "Le lien a bien été ajouté.",
addLinkTxt: "Ajouter un lien",
defaultValueForLink: "Lire l'article sur Wikipédia.",
deletedOkMessage: "Le lien a bien été supprimé.",
introNoLink: "Aucun lien pour l'instant.",
introTitleForLink: "Lectures proposées",
needAnchor: "Merci de fournir une ancre pour ce lien.",
needGoodLongAnchor: "Merci de fournir une ancre pour ce lien comptant entre 5 et 150 caractères.",
needMaxLinksForQuestionnaire: "Vous avez déjà atteint le nombre maximal de liens pour ce questionnaire.",
needNotTooLongUrl: "Merci de saisir un url ne comptant pas plus de 255 caractères.",
needQuestionnaire: "Le questionnaire du lien n'a pas été trouvé.",
needUrl: "Merci de saisir l'url du lien.",
needValidUrl: "Merci de saisir un url ayant un format valide.",
notFound: "L'enregistrement du lien n'a pas été trouvé.",
updatedOkMessage: "Le lien a bien été modifié."
};
/***/ }),
/***/ "../lang/fr/question.js":
/*!******************************!*\
!*** ../lang/fr/question.js ***!
\******************************/
/***/ (function(module) {
module.exports = {
addOkMessage: "La question a bien été ajoutée.",
addQuestionTxt: "Ajouter une question",
deleteOkMessage: "La question a bien été supprimée.",
introNoQuestion: "Aucune question n'a été saisie pour l'instant",
introTitleForQuestion: "Les questions enregistrées",
needMaxQuestions: "Vous avez déjà atteint le nombre maximal de questions pour ce questionnaire : ",
needNotTooLongText: "La question ne doit pas compter plus de 255 caractères.",
needNumberForRank: "Vous devez fournir un nombre supérieur ou égal à 1 pour le rang de cette question.",
needQuestionnaire: "Le questionnaire concerné n'a pas été trouvé.",
needText: "Merci de saisir le texte de la question !",
notFound: "L'enregistrement de la question n'a pas été trouvé.",
updateOkMessage: "La question a bien été modifiée."
};
/***/ }),
/***/ "../lang/fr/questionnaire.js":
/*!***********************************!*\
!*** ../lang/fr/questionnaire.js ***!
\***********************************/
/***/ (function(module) {
module.exports = {
btnProposeConnection: "Je me connecte.",
// déplacé dans general.js
btnProposeSubscribe: "Je crée mon compte.",
//idem
btnSendResponse: "Testez vos réponses.",
btnShareQuizTxt: "Partager via ",
btnShareQuizMailBody: "Bonjour,%0A%0AVoici%20un%20lien%20internet%20qui%20devrait%20t'intéresser :%0A",
btnShowQuestionnaire: "Répondre au quiz !",
correctAnswerTxt: "Bonne réponse",
estimatedTime: "Durée de lecture estimée : ",
estimatedTimeOption: {
short: "courte",
medium: "moyenne",
long: "longue"
},
explanationBeforeTxt: "Extrait :",
haveBeenPublished: ":NB nouveaux questionnaires ont été publiés.",
haveBeenRegenerated: "Les pages HTML de #NB1 questionnaires ou éléments de groupes, #NB2 quizs groupés et #NB3 thèmes ont été regénérés.",
lastUpdated: "Dernière mise à jour, le ",
linkGoToNextElement: "Article suivant",
linkGoToQuiz: "Accéder au quiz",
needCorrectPublishingDate: "La date de publication fournie n'a pas un format valide.",
needEstimatedTime: "Merci de sélectionner une estimation de la durée de ce quiz.",
needGroupIfRank: "Vous avez saisi un rang de classement, sans sélectionner le groupe du quiz.",
needIntroduction: "Merci de fournir un texte d'introduction à votre quiz.",
needKnowIfIsPublished: "Il faut savoir si ce quiz est publié.",
needLanguage: "Vous devez sélectionner la langue de ce quiz.",
needNotTooLongTitle: "Le titre du quiz ne doit pas compter plus de 255 caractères.",
needNumberForRank: "Vous devez saisir un nombre entier pour le rang de ce questionnaire dans son groupe.",
needTitle: "Merci de fournir un titre à votre quiz.",
needUniqueUrl: "L'url du quiz doit être unique.",
needUrl: "Merci de fournir l'url à votre quiz.",
nextDateWithoutQuestionnaire: "Prochaine date sans quiz programmé : ",
nextQuestionnairesList: "Les #NB prochains quizs devant être publiés",
questionnairesName: "quiz",
questionnaireNeedBeCompleted: "Quiz incomplet",
publishedAt: ", le",
publishedBy: "Quiz publié par",
searchQuestionnaireResultTitle: "Résultat pour votre recherche",
searchQuestionnaireWithNoResult: "Aucun quiz n'a été trouvé pour votre recherche.",
searchQuestionnaireWithResult: "Il y a #NB article#S correspondant à votre recherche :",
wrongAnswerTxt: "Mauvaise réponse"
};
/***/ }),
/***/ "../lang/fr/user.js":
/*!**************************!*\
!*** ../lang/fr/user.js ***!
\**************************/
/***/ (function(module) {
module.exports = {
alreadyConnected: "Vous êtes déjà connecté au site !",
badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau <a href='#URL'>en cliquant ici</a>.",
badPassword: "Aucun compte utilisateur ne correspond aux informations saisies.",
byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.<br>À bientôt !",
connectionOk: "Connexion réussie.",
creationOkMessage: "Le nouvel utilisateur a bien été enregistré.",
cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.",
deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ",
deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.",
deleteOkMessage: "L'utilisateur a bien été supprimé.",
emailNotFound: "Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",
failBotTest: "Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",
failBotTestLog: "Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",
formsEmailLabel: "E-mail :",
formsEmailPlaceholder: "Votre adresse e-mail",
formsEmail2Placeholder: "Si vous voyez ce champ, laissez-le vide",
//champ qui ne devrait pas être visible par des humains
formsCGUOkLabel: "J'accepte <a href=#link target=\"_blank\" rel=\"noopener\" title=\"À lire :)\">les Conditions Générale d'Utilisation</a> du site (requis).",
formsSubmitTxt: "Je m'abonne !",
godfatherFound: "Votre \"parrain\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.",
godfatherNotFound: "Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",
infosAdminGodfather: "Cet utilisateur a été parrainé par ",
infosAdminNbGodChilds: "Ses #NB filleuls : ",
infosUserForAdmin: "Cet utilisateur (id: ID_USER) a <b>créé son compte le DATE_CREA</b>, la dernière mise à jour datant du DATE_UPDATE.<br><b>Date de sa dernière connexion : DATE_CONNECTION.</b>",
infosUserNbGodChilds: "Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \"parrain\" : ",
infosUserNoGodchilds: "Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",
mailDeleteBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder.</p>",
mailDeleteBodyTxt: "Bonjour USER_NAME,\n\nPour confirmer la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.",
mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il a expiré.",
mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.",
mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.",
mailDeleteLinkTxt: "Confirmer.",
mailDeleteSubject: "Confirmer la suppression de votre compte.",
mailLoginLinkBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :</p>",
mailLoginLinkBodyTxt: "Bonjour USER_NAME,\n\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant *TIMING* !",
mailLoginLinkSubject: "Votre lien de connexion.",
mailLoginLinkTxt: "Me connecter.",
mailThankGodfatherBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.<br>Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.</p><p>Encore merci et à bientôt !</p>",
mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nSi dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.\nEncore merci et à bientôt !",
mailThankGodfatherLinkTxt: "Me connecter à mon compte.",
mailThankGodfatherSubject: "Merci !",
mailUpdateLoginBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder.</p>",
mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\n\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (e-mail et/ou mot de passe) et <b>vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement</b>.<br>En attendant, merci de continuer à utiliser vos anciens identifiants.",
mailUpdateLoginLinkTxt: "Valider.",
mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.",
mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.",
mailValidationLinkSBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.</p>",
mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider et compléter votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
mailValidationLinkSubject: "Merci de valider votre inscription",
mailValidationLinkTxt: "Valider mon compte.",
mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24 H sur le lien de confirmation qui vient d'être envoyé à votre adresse e-mail (#EMAIL).",
mailWelcomeBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !<br><br>Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à <b>EMAIL</b>.<br><br>Je vous conseille d'ailleurs d'ajouter <b>EMAIL</b> à votre carnet d'adresses <b>pour éviter que les prochains envois de NOM_SITE n'arrivent en <i>spam</i></b>.<br><br>Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.<br><br>Pour ce faire, utilisez le lien ci-dessous.<br><br>À bientôt sur NOM_SITE.",
mailWelcomeBodyTxt: "Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",
mailWelcomeLinkTxt: "Me connecter à mon compte.",
mailWelcomeSubject: "Bienvenue !",
needBeConnected: "Vous devez être connecté pour accéder à cette page.",
needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",
needEmail: "Merci de saisir votre adresse e-mail.",
needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",
needLanguage: "Il manque le code langue.",
needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",
needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",
needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",
needName: "Merci de choisir un nom d'utilisateur.",
needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",
needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",
needPassWord: "Merci de fournir un mot de passe.",
needSMTP: "Il manque le serveur SMTP.",
needSMTPNotFound: "Il manque un serveur SMTP valide.",
needStatus: "Il manque le statut.",
needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.",
needUGCOk: "Merci d'accepter les CGU pour créer votre compte.",
needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, <a href='/#URL'>cliquez-ici pour vous connecter</a>.",
needValidationToLogin: "Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",
needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.",
passwordCopied: "Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \"coller\" où vous le souhaitez.",
searchUsersWithoutResult: "L'utilisateur n'a pas été trouvé.",
tooManyLoginFails: "Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",
updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",
updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",
updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",
updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",
updatedNeedValidatedUser: "L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",
updatedOkMessage: "Vos informations ont bien été mises à jour.",
validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter <a href='#URL'>en cliquant ici</a>.",
validationAlreadyMessageAdmin: "Ce compte a déjà été validé.",
validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !<br>Vous pouvez compléter les informations de votre abonnement ci-dessous.",
validationMessageAdmin: "Le compte a bien été validé.",
welcomeMessage: "Bienvenue #NAME !"
};
/***/ }),
/***/ "../tools/main.js":
/*!************************!*\
!*** ../tools/main.js ***!
\************************/
/***/ (function(module) {
// Quelques fonctions utiles pour les chaînes
class Tool {
static isEmpty(myVar) {
if (myVar === undefined || myVar === null) return true;else {
myVar += ""; // si autre chose qu'une chaîne envoyé...
myVar = myVar.trim();
if (myVar === "") return true;else return false;
}
}
static trimIfNotNull(myString) {
if (Tool.isEmpty(myString)) myString = null;else {
myString += ""; // si autre chose qu'une chaîne envoyé...
myString = myString.trim();
}
return myString;
}
static shortenIfLongerThan(myString, max) {
myString += ""; // au cas où cela ne serait pas une chaîne...
if (myString.length > max) myString = myString.substring(0, max - 3) + "…";
return myString;
} // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings
static replaceAll(myString, mapObj) {
const replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi");
return myString.replace(replaceElts, matched => {
return mapObj[matched];
});
} // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random
static getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
} // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country
static dateFormat(dateString, lang = "fr") {
if (Tool.isEmpty(dateString)) return "";
let myDate = new Date(dateString);
let myDay = myDate.getDate() + "";
if (myDay.length === 1) myDay = "0" + myDay;
let myMounth = myDate.getMonth() + 1 + "";
if (myMounth.length === 1) myMounth = "0" + myMounth;
let myYear = myDate.getFullYear();
if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09
return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear;
} // On enlève volontairement les 0/O pour éviter les confusions !
// Et mieux vaut aussi débuter et finir par une lettre simple.
static getPassword(nbCarMin, nbCarMax) {
const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));
const letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz";
const others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";
let password = letters[Math.floor(Math.random() * letters.length)];
for (let i = 1; i < nbCar - 1; i++) {
if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];
}
password += letters[Math.floor(Math.random() * letters.length)];
return password;
}
}
module.exports = Tool;
/***/ }),
/***/ "../views/default/config/fr.js":
/*!*************************************!*\
!*** ../views/default/config/fr.js ***!
\*************************************/
/***/ (function(module) {
module.exports = {
headLinks: [{
anchor: "Accueil",
attributes: {
href: "/"
}
}, {
anchor: "Mon compte",
attributes: {
href: "/connexion.html",
id: "accountHeadLink"
}
}, {
anchor: "À propos",
attributes: {
href: "/a-propos.html"
}
}, {
anchor: "Contact",
attributes: {
href: "/contact.html"
}
}],
footLinks: [{
anchor: "Crédits",
attributes: {
href: "/credits.html"
}
}, {
anchor: "Mentions légales",
attributes: {
href: "/mentions-legales.html",
rel: "nofollow"
}
}, {
anchor: "Données personnelles",
attributes: {
href: "/donnees.html"
}
}, {
anchor: "C.G.U.",
attributes: {
href: "/cgu.html",
rel: "nofollow"
}
}, {
anchor: "C.G.V.",
attributes: {
href: "/cgv.html",
rel: "nofollow"
}
}],
maxQuestionnairesByPage: 10,
userHomePage: "accueil.html",
adminHomePage: "admin.html",
managerHomePage: "gestion.html",
subscribePage: "inscription.html",
connectionPage: "connexion.html",
accountPage: "compte.html",
questionnairesManagementPage: "gestion-quizs.html",
usersManagementPage: "gestion-utilisateurs.html",
nbQuestionnairesUserHomePage: 10,
illustrationDir: "/img/quizs/",
siteSlogan: "Cultivons notre jardin !",
homeTitle1: "De nature curieuse ?",
homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.<br>Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.<br>De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".",
homeTitle2: "La culture en liberté",
homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.<br>Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.<br>Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.<br>Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.<br><br><small><em>(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.</em></small>",
newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni",
newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.",
explanationTitle: "Vous découvrez WikiLerni ?",
explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.<br>Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.<br><br>Toutes les réponses se trouvent dans l'article proposé à la lecture. <b>Vous êtes ici pour apprendre de nouvelles choses</b>, mais libre à vous d'essayer d'y répondre immédiatement.<br><br>Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)<br><br>Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.<br>Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.<br><br>Mais <b>la création de ce compte est facultative</b> et <a href='/quizs/' title='Les derniers quizs publiés'>vous pouvez parcourir WikiLerni librement</a>.",
noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",
tagsListTxt: "Parcourir les rubriques :"
};
/***/ }),
/***/ "../views/wikilerni/config/fr.js":
/*!***************************************!*\
!*** ../views/wikilerni/config/fr.js ***!
\***************************************/
/***/ (function(module) {
module.exports = {
// liens de l'interface
headLinks: [{
anchor: "Contact",
attributes: {
href: "/contact.html",
rel: "nofollow"
}
}, {
anchor: "Parcourir",
attributes: {
href: "/quizs/",
id: "indexHeadLink",
title: "Les dernières publications"
}
}, {
anchor: "Mon compte",
attributes: {
href: "/connexion.html",
id: "accountHeadLink",
title: "Accéder ou créez votre compte WikiLerni"
}
}, {
anchor: "À propos",
attributes: {
href: "/a-propos.html",
title: "En savoir + sur WikiLerni"
}
}, {
anchor: "Accueil",
attributes: {
href: "/",
title: "Page d'accueil"
}
}],
footLinks: [{
anchor: "Blog",
attributes: {
href: "https://framasphere.org/people/7e54b7a0b53201389eef2a0000053625",
title: "Le blog WikiLerni sur diaspora*"
}
}, {
anchor: "Crédits",
attributes: {
href: "/credits.html",
title: "Qui a créé WikiLerni ? Quels sont vos droits ?"
}
}, {
anchor: "Mentions légales",
attributes: {
href: "/mentions-legales.html",
rel: "nofollow"
}
}, {
anchor: "Données personnelles",
attributes: {
href: "/donnees.html",
title: "Vos données personnelles sur WikiLerni"
}
}, {
anchor: "CGV & CGU",
attributes: {
href: "/CGV-CGU.html",
rel: "nofollow"
}
}],
accountPage: "compte.html",
aboutPage: "a-propos.html",
adminHomePage: "admin.html",
cguPage: "CGV-CGU.html",
connectionPage: "connexion.html",
deleteLinkPage: "aurevoir.html?t=",
loginLinkPage: "login.html?t=",
managerHomePage: "gestion.html",
newLoginLinkPage: "newlogin.html?t=",
questionnairesManagementPage: "gestion-quizs.html",
stopMailPage: "stop-mail.html?t=",
subscribePage: "inscription.html",
updateAccountPage: "compte.html",
userHomePage: "accueil.html",
userHomePageTxt: "Ma page d'accueil.",
usersManagementPage: "gestion-utilisateurs.html",
validationLinkPage: "validation.html?t=",
/* Textes (général) */
siteSlogan: "Cultivons notre jardin !",
noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",
mailRecipientTxt: "Message envoyé à :",
licenceTxt: "@copyleft Le contenu de WikiLerni <a href=\"/credits.html\" title=\"En savoir plus ?\">est libre</a> et vous est offert sans publicité. Vous pouvez <a href=\"/participer-financement.html\" title=\"Financement participatif avec contre-parties\">participer à son financement en cliquant ici</a>.",
/* Page d'accueil */
homePageTxt: "Page d'accueil",
homeTitle1: "De nature curieuse ?",
homeP1: "<b>Avec WikiLerni, vous apprenez régulièrement de nouvelles choses</b>.<br>Vous recevez de courts articles, lisibles en quelques minutes.<br>Des quizs vous permettent ensuite de tester ce que vous avez retenu.<br>De jour en jour <b>de nouvelles graines de culture sont ainsi semées dans votre jardin</b>.",
homeTitle2: "La culture générale en liberté",
homeP2: "<b>Pas de faits alternatifs</b>, tous les contenus sont <b>sourcés par des articles Wikipédia</b>.<br>Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni <a href=\"/credits.html\" title=\"En savoir plus sur ce sujet\">sont partagés sous licences libres</a>.<br>Le tout sans publicité, ni commercialisation de vos données.<br><b>Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.</b>",
homeBtnAboutTxt: "En savoir plus sur WikiLerni ?",
homeBtnSubscribeTxt: "Testez WikiLerni",
homeSubcriptionFormTitle: "Recevez les prochains articles WikiLerni",
/* Page dernières publications... */
newQuestionnairesTitle: "Culture générale - apprenez de nouvelles choses avec WikiLerni",
newQuestionnairesIntro: "WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
newsListTitle: "<p><b>Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau</b><br>Si dessous les dernières publications. Vous pouvez aussi <a href='/quizs/themes.html'>parcourir le site par thèmes ou mots-clés</a>.</p>",
/* Plan du site, liste des tags */
tagListTitle: "Culture générale - des articles et quizs sur de nombreux thèmes !",
tagListMetaDesc: "WikiLerni : découvrir les différents thèmes abordés par WikiLerni. Inxex du site.",
tagListIntro: "<h3>Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)</h3><blockquote>Aristote: «Lhomme a naturellement la passion de connaître…»</blockquote>",
/* Page quizs */
answersExplanationsLinkText: "Relire",
quizElementLinksIntro: "En savoir plus",
quizElementSubcriptionFormTitle: "Recevez les prochains articles WikiLerni",
explanationTitle: "Vous découvrez WikiLerni?",
explanationTxt: "<p>Le principe est simple: <b>vous commencez par lire larticle Wikipédia dont le lien vous est proposé</b>. Puis vous <b>afficher le quiz pour vérifier ce que vous avez retenu de votre lecture</b>. Suivant les questions, <b>une ou plusieurs réponses peuvent être correctes</b> et doivent donc être cochées. Cest toujours <b>le contenu de larticle Wikipédia qui fait foi</b> concernant les «bonnes» réponses. Cest une façon de tester à la fois votre capacité dattention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc nhésitez pas <a href='/contact.html'>à me signaler une erreur</a>.</p><p><b>WikiLerni vous propose dautres solutions pour améliorer votre culture générale</b>. Pour en savoir plus, cliquez sur le bouton ci-dessous.</p>",
explanationElementTxt: "<p>WikiLerni vous propose de <b>recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes</b> et portant sur des sujets très variés de <b>culture générale</b> (arts, histoire, littérature, sciences, etc.).</p><p>Ces articles sont basés sur <b>une ou plusieurs pages de Wikipédia</b> (fournies en lien), dont <b>ils extraient certaines informations</b>.</p><p>Chaque série darticles est <b>suivie dun quiz</b> permettant de tester ce que vous en avez retenu.</p><p><b>Vous apprenez ainsi régulièrement de nouvelles choses</b> très simplement.</p>",
/* Autres */
illustrationDir: "/img/quizs/",
twitterAccount: "WikiLerni",
maxQuestionnairesByPage: 12,
maxQuestionnairesSiteHomePage: 3,
nbQuestionnairesUserHomePage: 3
};
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/general$":
/*!***************************************!*\
!*** ../lang/ sync ^\.\/.*\/general$ ***!
\***************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var map = {
"./fr/general": "../lang/fr/general.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/illustration$":
/*!********************************************!*\
!*** ../lang/ sync ^\.\/.*\/illustration$ ***!
\********************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var map = {
"./fr/illustration": "../lang/fr/illustration.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/illustration$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/link$":
/*!************************************!*\
!*** ../lang/ sync ^\.\/.*\/link$ ***!
\************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var map = {
"./fr/link": "../lang/fr/link.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/link$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/question$":
/*!****************************************!*\
!*** ../lang/ sync ^\.\/.*\/question$ ***!
\****************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var map = {
"./fr/question": "../lang/fr/question.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/question$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/questionnaire$":
/*!*********************************************!*\
!*** ../lang/ sync ^\.\/.*\/questionnaire$ ***!
\*********************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var map = {
"./fr/questionnaire": "../lang/fr/questionnaire.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/questionnaire$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/user$":
/*!************************************!*\
!*** ../lang/ sync ^\.\/.*\/user$ ***!
\************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var map = {
"./fr/user": "../lang/fr/user.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$";
/***/ }),
/***/ "../views sync recursive ^\\.\\/.*\\.js$":
/*!***********************************!*\
!*** ../views/ sync ^\.\/.*\.js$ ***!
\***********************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var map = {
"./default/config/fr.js": "../views/default/config/fr.js",
"./wikilerni/config/fr.js": "../views/wikilerni/config/fr.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$";
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ !function() {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function() { return module['default']; } :
/******/ function() { return module; };
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(exports, definition) {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ }();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
!function() {
"use strict";
/*!*************************************!*\
!*** ./src/manageQuestionnaires.js ***!
\*************************************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js");
/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js");
// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES QUIZS ET LEURS DÉPENDANCES (LIENS, IMAGES, TAGS, ETC.)
/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas.
/// Si c'est ok, propose un moteur de recherche permettant de chercher un quiz
/// Si un id est passé par l'url on affiche les informations du quiz dans un formulaire permettant de l'éditer/supprimer avec une liste des éléments liés (liens, illustrations, questions...) pouvant eux-mêmes être édités/supprimés.
/// Si le nombre max configuré pour chacun de ses éléments n'est pas atteint, il est aussi proposé d'ajouter un nouvel élément.
/// Si pas d'id passé par l'url, on affiche un formulaire vide permettant de saisir un nouveau quiz.
// Fichiers de configuration :
const lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];
const config = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
const configIllustrations = __webpack_require__(/*! ../../config/illustrations.js */ "../config/illustrations.js");
const configLinks = __webpack_require__(/*! ../../config/links.js */ "../config/links.js");
const configQuestionnaires = __webpack_require__(/*! ../../config/questionnaires.js */ "../config/questionnaires.js");
const configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + "/config/" + lang + ".js"); // Fonctions :
// Dictionnaires :
const {
addOkMessage,
deleteBtnTxt,
serverError,
updateBtnTxt
} = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
const {
addIllustrationTxt,
defaultAlt,
introNoIllustration,
introTitleForIllustration
} = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/illustration$")("./" + lang + "/illustration");
const {
addLinkTxt,
defaultValueForLink,
introNoLink,
introTitleForLink
} = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/link$")("./" + lang + "/link");
const {
addQuestionTxt,
introNoQuestion,
introTitleForQuestion
} = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/question$")("./" + lang + "/question");
const {
needGroupIfRank,
nextDateWithoutQuestionnaire,
nextQuestionnairesList,
questionnaireNeedBeCompleted,
searchQuestionnaireWithNoResult
} = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire");
const {
needBeConnected
} = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); // Principaux éléments du DOM manipulés :
const btnNewQuestionnaire = document.getElementById("wantNewQuestionnaire");
const btnPreviewQuestionnaire = document.getElementById("previewQuestionnaire");
const deleteCheckBox = document.getElementById("deleteOkLabel");
const divCrash = document.getElementById("crash");
const divIllustrations = document.getElementById("illustrationsList");
const divLinks = document.getElementById("linksList");
const divMain = document.getElementById("main-content");
const divMessage = document.getElementById("message");
const divQuestionnaires = document.getElementById("questionnairesList");
const divQuestions = document.getElementById("questionsList");
const divResponse = document.getElementById("response");
const divSearchResult = document.getElementById("searchResult");
const formLink = document.getElementById("links");
const formIllustration = document.getElementById("illustrations");
const formQuestion = document.getElementById("questions");
const formQuestionnaire = document.getElementById("questionnaires");
const formSearch = document.getElementById("search");
const helpClassification = document.getElementById("helpClassification");
const helpGroup = document.getElementById("helpGroup");
const helpPublishingAt = document.getElementById("helpPublishingAt");
const inputClassification = document.getElementById("classification");
const inputGroup = document.getElementById("group");
const inputRankInGroup = document.getElementById("rankInGroup"); // Vide et cache tous les formulaires annexes au questionnaire :
const hideAllForms = () => {
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.empyAndHideForm)(formLink);
if (defaultValueForLink != 0) document.getElementById("anchor").value = defaultValueForLink;
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.empyAndHideForm)(formIllustration);
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.empyAndHideForm)(formQuestion);
}; // Affiche les données d'un lien dans le formulaire adhoc :
const showFormLinkInfos = Link => {
// On commence par cacher et vider tous les formulaires annexes
hideAllForms(); // Puis on affiche celui concerné
formLink.style.display = "block"; // + Les contraintes de champ & valeurs par défaut :
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configLinks.Link, formLink);
for (let data in Link) {
if (formLink.elements[data] !== undefined) formLink.elements[data].value = Link[data];
}
}; // Affiche les infos connues concernant les liens du questionnaire affiché :
const showLinkInfos = (Links, token) => {
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divLinks, "h2", introTitleForLink);
let listLinks = "";
for (let i in Links) listLinks += "<li><a href='" + Links[i].url + "' target='_blank'>" + Links[i].anchor + "</a><br><a href='#updateLink" + Links[i].id + "' id='#updateLink" + Links[i].id + "' class='button' >" + updateBtnTxt + "</a> <a href='#deleteLink" + Links[i].id + "' id='#deleteLink" + Links[i].id + "' class='button' >" + deleteBtnTxt + "</a></li>";
if (listLinks === "") listLinks = "<li>" + introNoLink + "</li>";
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divLinks, "ul", listLinks, "", [], "", false); // ! à intégrer d'abord dans le DOM pour pouvoir ajouter les Listeners ensuite
for (let i in Links) {
document.getElementById("#updateLink" + Links[i].id).addEventListener("click", function (e) {
e.preventDefault();
showFormLinkInfos(Links[i]);
window.location.assign("#links");
});
document.getElementById("#deleteLink" + Links[i].id).addEventListener("click", function (e) {
e.preventDefault();
showFormLinkInfos(Links[i]);
formLink.elements["deleteOk"].value = true;
sendLinkForm(token);
});
}
if (Links.length < config.nbLinksMax || config.nbLinksMax === 0) {
let newBtn = "<a href='#newLink' id='newLink' class='button'>" + addLinkTxt + "</a>";
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divLinks, "p", newBtn, "", [], {}, false);
document.getElementById("newLink").addEventListener("click", function (e) {
e.preventDefault();
hideAllForms();
formLink.style.display = "block";
formLink.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value;
window.location.assign("#links");
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configLinks, formLink);
});
}
}; // Envoi des données d'un lien.
const sendLinkForm = token => {
const divResponseLink = document.getElementById("responseLink");
divResponseLink.innerHTML = "";
let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.getDatasFromInputs)(formLink);
const xhrLinkDatas = new XMLHttpRequest();
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.deleteOk)) xhrLinkDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configLinks.linksRoute + datas.id);else if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id)) xhrLinkDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configLinks.linksRoute + datas.id);else xhrLinkDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configLinks.linksRoute);
xhrLinkDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
let response = JSON.parse(this.responseText);
if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
showLinkInfos(response.questionnaire.Links, token); // le serveur retourne une version actualisée de la liste des liens
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divLinks, "p", response.message, "", ["success"], "", false);
hideAllForms();
window.location.assign("#linksList");
showNextQuestionnaires(token); // peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = serverError;
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseLink, "p", response.errors, "", ["error"]);
} else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseLink, "p", serverError, "", ["error"]);
}
};
xhrLinkDatas.setRequestHeader("Content-Type", "application/json");
xhrLinkDatas.setRequestHeader("Authorization", "Bearer " + token);
xhrLinkDatas.send(JSON.stringify(datas));
}; // Affiche les données d'une illustration dans le formulaire adhoc :
const showFormIllustrationInfos = Illustration => {
// On commence par cacher et vider tous les formulaires annexes
hideAllForms(); // Puis on affiche celui concerné
formIllustration.style.display = "block"; // + Les contraintes de champ & valeurs par défaut
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configIllustrations.Illustration, formIllustration); // Mais le champ file n'est plus requis, quand un fichier existe déjà
formIllustration.elements["image"].removeAttribute("required");
for (let data in Illustration) {
if (formIllustration.elements[data] !== undefined) formIllustration.elements[data].value = Illustration[data];
}
}; // Affiche les infos connues concernant les illustrations du questionnaire affiché :
const showIllustrationInfos = (Illustrations, token) => {
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divIllustrations, "h2", introTitleForIllustration);
let listIllustrations = "";
for (let i in Illustrations) listIllustrations += "<li><a href='" + configTemplate.illustrationDir + Illustrations[i].url + "' target='_blank'><img src='" + configTemplate.illustrationDir + Illustrations[i].url + "' alt='" + defaultAlt + "' style='max-height:150px'></a><br><a href='#updateIllustration" + Illustrations[i].id + "' id='#updateIllustration" + Illustrations[i].id + "' class='button'>" + updateBtnTxt + "</a> <a href='#deleteIllustration" + Illustrations[i].id + "' id='#deleteIllustration" + Illustrations[i].id + "' class='button'>" + deleteBtnTxt + "</a></li>";
if (listIllustrations === "") listIllustrations = "<li>" + introNoIllustration + "</li>";
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divIllustrations, "ul", listIllustrations, "", [], "", false); // ! à intégrer d'abord dans le DOM pour pouvoir ajouter les Listeners ensuite
for (let i in Illustrations) {
document.getElementById("#updateIllustration" + Illustrations[i].id).addEventListener("click", function (e) {
e.preventDefault();
showFormIllustrationInfos(Illustrations[i]);
window.location.assign("#illustrations");
});
document.getElementById("#deleteIllustration" + Illustrations[i].id).addEventListener("click", function (e) {
e.preventDefault();
showFormIllustrationInfos(Illustrations[i]);
formIllustration.elements["deleteOk"].value = true;
sendIllustrationForm(token);
});
}
if (Illustrations.length < config.nbIllustrationsMax || config.nbIllustrationsMax === 0) {
let newBtn = "<a href='#newIllustration' id='newIllustration' class='button'>" + addIllustrationTxt + "</a>";
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divIllustrations, "p", newBtn, "", [], {}, false);
document.getElementById("newIllustration").addEventListener("click", function (e) {
e.preventDefault();
hideAllForms();
formIllustration.style.display = "block";
formIllustration.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value;
window.location.assign("#illustrations");
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configIllustrations, formIllustration);
});
}
}; // Envoi des données d'une illustration.
const sendIllustrationForm = token => {
const divResponseIllustration = document.getElementById("responseIllustration");
divResponseIllustration.innerHTML = "";
let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.getDatasFromInputs)(formIllustration);
let datasWithFiles = new FormData(formIllustration); // car il me manque les informations du fichier avec la fonction getDatasFromInputs
const xhrIllustrationDatas = new XMLHttpRequest();
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.deleteOk)) xhrIllustrationDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configIllustrations.illustrationsRoute + datas.id);else if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id)) xhrIllustrationDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configIllustrations.illustrationsRoute + datas.id);else xhrIllustrationDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configIllustrations.illustrationsRoute);
xhrIllustrationDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
let response = JSON.parse(this.responseText);
if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
showIllustrationInfos(response.questionnaire.Illustrations, token); // le serveur retourne une version actualisée de la liste des liens
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divIllustrations, "p", response.message, "", ["success"], "", false);
hideAllForms();
window.location.assign("#illustrationsList");
showNextQuestionnaires(token); // peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = serverError;
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseIllustration, "p", response.errors, "", ["error"]);
} else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseIllustration, "p", serverError, "", ["error"]);
}
};
xhrIllustrationDatas.setRequestHeader("Authorization", "Bearer " + token);
xhrIllustrationDatas.send(datasWithFiles);
}; // Affiche les données d'une question + ses réponses possibles dans le formulaire adhoc
const showFormQuestionInfos = Question => {
// On commence par cacher et vider tous les formulaires annexes
hideAllForms(); // Puis on affiche celui concerné
formQuestion.style.display = "block";
for (let data in Question.Question) {
if (formQuestion.elements[data] !== undefined) formQuestion.elements[data].value = Question.Question[data];
} // + Les contraintes de champ & les valeurs par défaut
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configQuestionnaires.Question, formQuestion);
for (let data in Question.Choices) {
if (formQuestion.elements["choiceText" + data] !== undefined) {
formQuestion.elements["choiceText" + data].value = Question.Choices[data].text;
if (Question.Choices[data].isCorrect == true) formQuestion.elements["choiceIsCorrect" + data].checked = true;
formQuestion.elements["idChoice" + data].value = Question.Choices[data].id;
}
}
}; // Affiche les infos des questions du quiz affiché :
const showQuestionInfos = (Questions, token) => {
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divQuestions, "h2", introTitleForQuestion);
let listQuestions = "";
for (let i in Questions) listQuestions += "<li>" + Questions[i].Question.rank + " - " + Questions[i].Question.text + "<br><a href='#updateQuestion" + Questions[i].Question.id + "' id='#updateQuestion" + Questions[i].Question.id + "' class='button'>" + updateBtnTxt + "</a> <a href='#deleteQuestion" + Questions[i].Question.id + "' id='#deleteQuestion" + Questions[i].Question.id + "' class='button'>" + deleteBtnTxt + "</a></li>";
if (listQuestions === "") listQuestions = "<li>" + introNoQuestion + "</li>";
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divQuestions, "ul", listQuestions, "", [], "", false); // à intégrer d'abord dans le DOM pour pouvoir ajouter les Listeners ensuite
for (let i in Questions) {
document.getElementById("#updateQuestion" + Questions[i].Question.id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionInfos(Questions[i]);
window.location.assign("#questions");
});
document.getElementById("#deleteQuestion" + Questions[i].Question.id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionInfos(Questions[i]);
formQuestion.elements["deleteOk"].value = true;
sendQuestionForm(token);
});
}
if (Questions.length < config.nbQuestionsMax || config.nbQuestionsMax === 0) {
let newBtn = "<a href='#newQuestion' id='newQuestion' class='button'>" + addQuestionTxt + "</a>";
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divQuestions, "p", newBtn, "", [], {}, false);
document.getElementById("newQuestion").addEventListener("click", function (e) {
e.preventDefault();
hideAllForms();
formQuestion.style.display = "block";
formQuestion.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value;
formQuestion.elements["rank"].value = Questions.length === 0 ? configQuestionnaires.Question.rank.defaultValue : Questions.length + 1;
window.location.assign("#questions");
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configQuestionnaires.Question, formQuestion);
});
}
}; // Envoi des données d'une question et de ses réponse. Peut être généré par le bouton submit ou par le lien "supprimer".
const sendQuestionForm = token => {
const divResponseQuestion = document.getElementById("responseQuestion");
divResponseQuestion.innerHTML = "";
let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.getDatasFromInputs)(formQuestion);
const xhrQuestionDatas = new XMLHttpRequest();
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.deleteOk)) xhrQuestionDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionsRoute + datas.id);else if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id)) xhrQuestionDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionsRoute + datas.id); // mise à jour d'une question
else xhrQuestionDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionsRoute); // nouvelle question
xhrQuestionDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
let response = JSON.parse(this.responseText);
if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
showQuestionInfos(response.questionnaire.Questions, token); // le serveur me retourne une version actualisée de la liste des questions
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divQuestions, "p", response.message, "", ["success"], "", false);
hideAllForms();
window.location.assign("#questionsList");
showNextQuestionnaires(token); // car peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = serverError;
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseQuestion, "p", response.errors, "", ["error"]);
} else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseQuestion, "p", serverError, "", ["error"]);
}
};
xhrQuestionDatas.setRequestHeader("Content-Type", "application/json");
xhrQuestionDatas.setRequestHeader("Authorization", "Bearer " + token);
xhrQuestionDatas.send(JSON.stringify(datas));
}; // Affichant les infos connues concernant un questionnaire et ses dépendances
const showFormQuestionnaireInfos = (id, token) => {
const xhrGetInfos = new XMLHttpRequest();
xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + configQuestionnaires.getQuestionnaireRoutes + "/" + id);
xhrGetInfos.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
let response = JSON.parse(this.responseText);
if (this.status === 200 && response.Questionnaire != undefined) {
formQuestionnaire.reset(); // pour ne pas garder les données déjà affichées si vide dans ce qui est retourné
for (let data in response.Questionnaire) {
if (formQuestionnaire.elements[data] !== undefined) {
if (data === "publishingAt" && response.Questionnaire[data] !== null) formQuestionnaire.elements[data].value = (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.dateFormat)(response.Questionnaire[data], "form"); // !! revoir car format pouvant poser soucis si navigateur ne gère pas les champs de type "date"
else formQuestionnaire.elements[data].value = response.Questionnaire[data];
}
}
deleteCheckBox.style.display = "block";
} // ajouter gestion des retours en erreur ?
if (response.Tags != undefined) {
let classification = "";
for (let i in response.Tags) {
if (i == 0) classification += response.Tags[i].name;else classification += "," + response.Tags[i].name;
}
formQuestionnaire.elements["classification"].value = classification;
}
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(response.Group)) formQuestionnaire.elements["group"].value = response.Group.Group.title + " (" + response.Group.Group.id + ")";
divLinks.style.display = "block";
divQuestions.style.display = "block";
divIllustrations.style.display = "block";
if (response.Links != undefined) showLinkInfos(response.Links, token);
if (response.Questions != undefined) showQuestionInfos(response.Questions, token);
if (response.Illustrations != undefined) showIllustrationInfos(response.Illustrations, token);
helpPublishingAt.style.display = "none"; // info uniquement utile pour "placer" un nouveau quiz
// à revoir : remplacer lien pour un bouton + reset complet du formulaire, y compris champs hidden :
btnNewQuestionnaire.style.display = "block";
btnNewQuestionnaire.setAttribute("href", configTemplate.questionnairesManagementPage);
btnPreviewQuestionnaire.style.display = "block";
if (response.Questionnaire["isPublished"] === false) btnPreviewQuestionnaire.setAttribute("href", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + configQuestionnaires.previewQuestionnaireRoutes + "/" + id + "/" + token);else btnPreviewQuestionnaire.setAttribute("href", config.siteUrl + configQuestionnaires.publishedQuestionnaireRoutes + response.Questionnaire["slug"] + ".html");
}
};
xhrGetInfos.send();
}; // Affiche les questionnaires bientôt publiés.
const showNextQuestionnaires = token => {
const xhrNextQuestionnaires = new XMLHttpRequest();
xhrNextQuestionnaires.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + configQuestionnaires.getListNextQuestionnaires);
xhrNextQuestionnaires.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
let response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response.questionnaires)) {
let listHTML = "",
dayStr,
optionsDayStr = {
weekday: 'long'
};
for (let i in response.questionnaires) {
dayStr = new Intl.DateTimeFormat(lang, optionsDayStr).format(new Date(response.questionnaires[i].datePublishing));
listHTML += "<li>" + dayStr + " " + (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.dateFormat)(response.questionnaires[i].datePublishing, "fr") + ": <a href='" + configTemplate.questionnairesManagementPage + "?id=" + response.questionnaires[i].id + "' id='questionnaire_" + response.questionnaires[i].id + "'>" + response.questionnaires[i].title + "</a>";
if (response.questionnaires[i].isPublishable === false) listHTML += " <span class='error'>(" + questionnaireNeedBeCompleted + ")</li>";
listHTML += "</li>";
}
if (response.questionnaires.length !== 0) (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divQuestionnaires, "h3", nextQuestionnairesList.replace("#NB", response.questionnaires.length));
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(helpPublishingAt, "em", nextDateWithoutQuestionnaire + (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.dateFormat)(new Date(response.dateNeeded), "fr"));
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divQuestionnaires, "ul", listHTML, "", "", "", false);
for (let i in response.questionnaires) {
document.getElementById("questionnaire_" + response.questionnaires[i].id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionnaireInfos(e.target.id.split("_")[1], token);
window.location.assign("#questionnaires");
});
}
} // ajouter gestion erreurs reçues du serveur ?
}
};
xhrNextQuestionnaires.setRequestHeader("Authorization", "Bearer " + token);
xhrNextQuestionnaires.send();
};
const initialise = async () => {
try {
const isConnected = await (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_7__.checkSession)(["manager", "admin"], "/" + configTemplate.connectionPage, {
message: needBeConnected,
color: "error"
}, window.location);
if (isConnected) {
divMain.style.display = "block";
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)((0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)("message"))) {
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divMessage, "p", (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)("message", true).message, "", [(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)("message", true).color], "", false);
(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.removeLocaly)("message");
}
const user = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)("user", true); // Mise à jour du lien "compte" du header :
(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.updateAccountLink)(user.status, configTemplate); // Initialisation des formulaires :
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configQuestionnaires, formSearch);
(0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configQuestionnaires.Questionnaire, formQuestionnaire); // Vide/cache les éléments inutiles en mode création :
btnPreviewQuestionnaire.style.display = "none";
deleteCheckBox.style.display = "none";
hideAllForms(); // Si un id est passé par l'url, on essaye d'afficher le questionnaire :
let urlDatas = (0,_tools_url_js__WEBPACK_IMPORTED_MODULE_6__.getUrlParams)();
if (urlDatas && urlDatas.id !== undefined) showFormQuestionnaireInfos(urlDatas.id, user.token); // les prochaines publications :
showNextQuestionnaires(user.token); // Lancement d'une recherche :
formSearch.addEventListener("submit", function (e) {
e.preventDefault();
let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.getDatasFromInputs)(formSearch);
const xhrSearch = new XMLHttpRequest();
xhrSearch.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + configQuestionnaires.searchAdminQuestionnairesRoute);
xhrSearch.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
let response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response)) {
if (response.length === 0) (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSearchResult, "p", searchQuestionnaireWithNoResult, "", ["info"]);else {
let selectHTML = "<option value=''></option>";
for (let i in response) selectHTML += "<option value='" + response[i].id + "'>" + response[i].title + "</option>";
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSearchResult, "select", selectHTML, "selectSearch");
const searchSelect = document.getElementById("selectSearch");
searchSelect.addEventListener("change", function () {
if (searchSelect.value !== "") showFormQuestionnaireInfos(searchSelect.value, user.token);
});
}
} else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSearchResult, "p", serverError, "", ["error"]);
}
};
xhrSearch.setRequestHeader("Content-Type", "application/json");
xhrSearch.setRequestHeader("Authorization", "Bearer " + user.token);
if (datas) xhrSearch.send(JSON.stringify(datas));
}); // Aide à la saisie pour le classement du quiz
inputClassification.addEventListener("input", function (e) {
divResponse.innerHTML = "";
const tags = inputClassification.value.split(",");
tags.reverse();
const lastTag = tags[0].trim();
if (lastTag.length >= 2) {
const xhrSearchTags = new XMLHttpRequest();
xhrSearchTags.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + configQuestionnaires.tagsSearchRoute);
xhrSearchTags.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
let response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response)) {
helpClassification.innerHTML = "";
for (let i in response) {
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(helpClassification, "a", response[i].name, "#tag" + response[i].id, ["info"], {
href: "#tag" + response[i].id
}, false);
document.getElementById("#tag" + response[i].id).addEventListener("click", function (e) {
e.preventDefault();
tags[0] = e.target.innerHTML;
tags.reverse();
inputClassification.value = tags.join(",");
helpClassification.innerHTML = "";
});
}
}
}
};
xhrSearchTags.setRequestHeader("Content-Type", "application/json");
xhrSearchTags.setRequestHeader("Authorization", "Bearer " + user.token);
xhrSearchTags.send(JSON.stringify({
search: lastTag
}));
}
}); // Aide à la sélection d'un groupe pour le quiz
inputGroup.addEventListener("input", function (e) {
formQuestionnaire["GroupId"].value = "";
const groupInput = inputGroup.value.trim();
if (groupInput.length >= configQuestionnaires.searchGroups.minlength) {
const xhrSearchGroups = new XMLHttpRequest();
xhrSearchGroups.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.groupRoutes + configQuestionnaires.searchGroupsRoute);
xhrSearchGroups.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
let response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response)) {
helpGroup.innerHTML = "";
for (let i in response) {
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(helpGroup, "a", response[i].title, "#group" + response[i].id, ["info"], {
href: "#group" + response[i].id
}, false);
document.getElementById("#group" + response[i].id).addEventListener("click", function (e) {
e.preventDefault();
inputGroup.value = response[i].title + " (" + response[i].id + ")";
formQuestionnaire["GroupId"].value = response[i].id;
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(response[i].maxRank)) inputRankInGroup.value = response[i].maxRank + 1;else inputRankInGroup.value = 1;
helpGroup.innerHTML = "";
});
}
}
}
};
xhrSearchGroups.setRequestHeader("Content-Type", "application/json");
xhrSearchGroups.setRequestHeader("Authorization", "Bearer " + user.token);
xhrSearchGroups.send(JSON.stringify({
searchGroups: groupInput
}));
}
}); // Traitement de l'envoi du formulaire des infos de base du quiz
formQuestionnaire.addEventListener("submit", function (e) {
e.preventDefault();
divResponse.innerHTML = "";
let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.getDatasFromInputs)(formQuestionnaire);
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.rankInGroup) && (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.GroupId)) (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, "p", needGroupIfRank, "", ["error"]);else {
if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.rankInGroup) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.GroupId)) datas.rankInGroup = 1;
const xhrQuestionnaireDatas = new XMLHttpRequest();
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id) && datas.deleteOk !== undefined) xhrQuestionnaireDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + "/" + datas.id);else if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id)) xhrQuestionnaireDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + "/" + datas.id);else xhrQuestionnaireDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + "/");
xhrQuestionnaireDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
let response = JSON.parse(this.responseText);
if (this.status === 201 && response.id != undefined) {
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, "p", addOkMessage, "", ["success"]);
datas.id = response.id;
showNextQuestionnaires(user.token); // peut avoir évolué suivant ce qui s'est passé
} else if (this.status === 200 && response.message != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, "p", response.message, "", ["success"]);
showNextQuestionnaires(user.token); // peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = serverError;
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, "p", response.errors, "", ["error"]);
} else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, "p", serverError, "", ["error"]);
if (datas.deleteOk === undefined && response.errors === undefined) showFormQuestionnaireInfos(datas.id, user.token); // on actualise les données
else if (response.errors === undefined) {
formQuestionnaire.reset();
divLinks.innerHTML = "";
divIllustrations.innerHTML = "";
divQuestions.innerHTML = "";
}
}
};
xhrQuestionnaireDatas.setRequestHeader("Content-Type", "application/json");
xhrQuestionnaireDatas.setRequestHeader("Authorization", "Bearer " + user.token);
if (datas) xhrQuestionnaireDatas.send(JSON.stringify(datas));
}
});
formLink.addEventListener("submit", function (e) {
e.preventDefault();
sendLinkForm(user.token);
});
formIllustration.addEventListener("submit", function (e) {
e.preventDefault();
sendIllustrationForm(user.token);
});
formQuestion.addEventListener("submit", function (e) {
e.preventDefault();
sendQuestionForm(user.token);
});
}
} catch (e) {
console.error(e);
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divCrash, "p", serverError, "", ["error"]);
}
};
initialise();
(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.helloDev)();
}();
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vY29uZmlnL2lsbHVzdHJhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vY29uZmlnL2xpbmtzLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9jb25maWcvcXVlc3Rpb25uYWlyZXMuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL2NvbmZpZy91c2Vycy5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvY2xpZW50c3RvcmFnZS5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvZG9tLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uL3NyYy90b29scy9ldmVyeXdoZXJlLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uL3NyYy90b29scy9mb3Jtcy5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvdXJsLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uL3NyYy90b29scy91c2Vycy5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9sYW5nL2ZyL2lsbHVzdHJhdGlvbi5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vbGFuZy9mci9saW5rLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9sYW5nL2ZyL3F1ZXN0aW9uLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9sYW5nL2ZyL3F1ZXN0aW9ubmFpcmUuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL3ZpZXdzL3dpa2lsZXJuaS9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy9ob21lL2ZhYnJpY2UvRG9jdW1lbnRzL0JpZG91aWxsZXMvd2lraWxlcm5pL2xhbmd8c3luY3wvXlxcLlxcLy4qXFwvZ2VuZXJhbCQvIiwid2VicGFjazovL3dpa2lsZXJuaS8vaG9tZS9mYWJyaWNlL0RvY3VtZW50cy9CaWRvdWlsbGVzL3dpa2lsZXJuaS9sYW5nfHN5bmN8L15cXC5cXC8uKlxcL2lsbHVzdHJhdGlvbiQvIiwid2VicGFjazovL3dpa2lsZXJuaS8vaG9tZS9mYWJyaWNlL0RvY3VtZW50cy9CaWRvdWlsbGVzL3dpa2lsZXJuaS9sYW5nfHN5bmN8L15cXC5cXC8uKlxcL2xpbmskLyIsIndlYnBhY2s6Ly93aWtpbGVybmkvL2hvbWUvZmFicmljZS9Eb2N1bWVudHMvQmlkb3VpbGxlcy93aWtpbGVybmkvbGFuZ3xzeW5jfC9eXFwuXFwvLipcXC9xdWVzdGlvbiQvIiwid2VicGFjazovL3dpa2lsZXJuaS8vaG9tZS9mYWJyaWNlL0RvY3VtZW50cy9CaWRvdWlsbGVzL3dpa2lsZXJuaS9sYW5nfHN5bmN8L15cXC5cXC8uKlxcL3F1ZXN0aW9ubmFpcmUkLyIsIndlYnBhY2s6Ly93aWtpbGVybmkvL2hvbWUvZmFicmljZS9Eb2N1bWVudHMvQmlkb3VpbGxlcy93aWtpbGVybmkvbGFuZ3xzeW5jfC9eXFwuXFwvLipcXC91c2VyJC8iLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy9ob21lL2ZhYnJpY2UvRG9jdW1lbnRzL0JpZG91aWxsZXMvd2lraWxlcm5pL3ZpZXdzfHN5bmN8L15cXC5cXC8uKlxcLmpzJC8iLCJ3ZWJwYWNrOi8vd2lraWxlcm5pL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3dpa2lsZXJuaS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly93aWtpbGVybmkvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3dpa2lsZXJuaS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3dpa2lsZXJuaS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3dpa2lsZXJuaS8uL3NyYy9tYW5hZ2VRdWVzdGlvbm5haXJlcy5qcyJdLCJuYW1lcyI6WyJpbnN0YW5jZSIsInJlcXVpcmUiLCJtb2R1bGUiLCJleHBvcnRzIiwiaWxsdXN0cmF0aW9uc1JvdXRlIiwiSWxsdXN0cmF0aW9uIiwiYWx0IiwibWF4bGVuZ3RoIiwidGl0bGUiLCJjYXB0aW9uIiwiaW1hZ2UiLCJyZXF1aXJlZCIsImFjY2VwdCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImpvaW4iLCJkaXJJbGx1c3RyYXRpb25zVG1wIiwiZGlySWxsdXN0cmF0aW9ucyIsInVzZXJzIiwicXVlc3Rpb25uYWlyZXMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImRlZmF1bHRSZWNlaXB0RGF5cyIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm1heFF1ZXN0aW9ubmFpcmVTZW5kZWRBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJmaWVsZE5ld1F1ZXN0aW9ubmFpcmVzIiwibmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNaW4iLCJuYlF1ZXN0aW9ubmFpcmVzQnlHcm91cE1heCIsIm5iSWxsdXN0cmF0aW9uc01pbiIsIm5iSWxsdXN0cmF0aW9uc01heCIsIm1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0IiwiaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeCIsImlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4IiwibmJMaW5rc01pbiIsIm5iTGlua3NNYXgiLCJwYXNzd29yZE1pbkxlbmd0aCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmVzIiwiZGlyV2ViUXVlc3Rpb25uYWlyZXMiLCJsaW5rc1JvdXRlIiwiTGluayIsInVybCIsImFuY2hvciIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFJhbmRvbVF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwicHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzIiwicmVnZW5lcmF0ZUhUTUwiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIiwiZ3JvdXBSb3V0ZXMiLCJnZXRHcm91cFJvdXRlIiwicHJldmlld0dyb3VwUm91dGVzIiwic2VhcmNoR3JvdXBzUm91dGUiLCJxdWVzdGlvbnNSb3V0ZSIsInRhZ3NTZWFyY2hSb3V0ZSIsImdldEFkbWluU3RhdHMiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiUXVlc3Rpb25uYWlyZSIsInNsdWciLCJpbnRyb2R1Y3Rpb24iLCJzZWFyY2hRdWVzdGlvbm5haXJlcyIsIkdyb3VwIiwiUXVlc3Rpb24iLCJ0ZXh0IiwicmFuayIsIm1pbiIsImRlZmF1bHRWYWx1ZSIsIkNob2ljZSIsInNlYXJjaCIsInNlYXJjaEdyb3VwcyIsImRpckNhY2hlR3JvdXBzIiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTEdyb3VwcyIsImRpckhUTUxOZXdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJHcm91cHMiLCJkaXJXZWJOZXdzIiwiZGlyV2ViVGFncyIsIm5iUmFuZG9tUmVzdWx0cyIsIm5iVGFnc01pbiIsIm5iVGFnc01heCIsInVzZXJSb3V0ZXMiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwiY3JlYXRlVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJnZXRMb2dpbkxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwiZ2V0VXNlckluZm9zIiwiZ2V0VXNlcnNRdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoVXNlclJvdXRlIiwic2lnbnVwQ29tcGxldGlvblJvdXRlIiwic3Vic2NyaWJlUm91dGUiLCJ1bnN1YnNjcmliZVJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwidmFsaWRhdGVVc2VyUm91dGUiLCJuYW1lIiwiZW1haWwiLCJuZXdQYXNzd29yZCIsImNvZGVHb2RmYXRoZXIiLCJjZ3VPayIsInZhbHVlIiwidGltZURpZmZlcmVuY2VNaW4iLCJ0aW1lRGlmZmVyZW5jZU1heCIsImRpckNhY2hlVXNlcnNXaXRob3V0QW5zd2VycyIsInNhdmVMb2NhbHkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXRMb2NhbHkiLCJqc29uIiwicGFyc2UiLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImFkZEVsZW1lbnQiLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwicmVwbGFjZSIsImlzRW1wdHkiLCJuZXdFbGVtZW50IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaWQiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJpIiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwic2V0QXR0cmlidXRlIiwiaW5uZXJIVE1MIiwiYXBwZW5kQ2hpbGQiLCJoZWxsb0RldiIsImNvbnNvbGUiLCJsb2ciLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsImNvbmZpZ1RlbXBsYXRlIiwibGluayIsImdldEVsZW1lbnRCeUlkIiwiaG9tZVBhZ2UiLCJocmVmIiwic2V0QXR0cmlidXRlc1RvSW5wdXRzIiwiaW5wdXRzQ29uZiIsIm15Rm9ybSIsImVsZW1lbnRzIiwiaWRJbnB1dCIsInVuZGVmaW5lZCIsImlucHV0SFRNTCIsImF0dHJpYnV0ZSIsImdldERhdGFzRnJvbUlucHV0cyIsImRhdGFzIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsImVudHJpZSIsImVudHJpZXMiLCJlbXB5Rm9ybSIsInR5cGUiLCJjaGVja2VkIiwiZW1weUFuZEhpZGVGb3JtIiwic3R5bGUiLCJkaXNwbGF5IiwiZ2V0VXJsUGFyYW1zIiwibG9jYXRpb24iLCJwYXJhbWV0ZXJzIiwic3Vic3RyaW5nIiwic3BsaXQiLCJwYXJhbSIsImRlY29kZVVSSSIsImxhbmciLCJnZXRUaW1lRGlmZmVyZW5jZSIsInRpbWVMb2NhbCIsIkRhdGUiLCJnZXRUaW1lem9uZU9mZnNldCIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJ0b2tlbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwibmJRdWVzdGlvbnMiLCJRdWVzdGlvbm5haXJlSWQiLCJHcm91cElkIiwiY2hlY2tTZXNzaW9uIiwidXJsUmVkaXJlY3Rpb24iLCJtZXNzYWdlIiwidXJsV2FudGVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJ1c2VyIiwibm93IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25sb2FkIiwicmVzcG9uc2UiLCJyZXNwb25zZVRleHQiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ0aW1lRGlmZmVyZW5jZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsImFjY291bnRQYWdlIiwid2luZG93IiwiaW5kZXhPZiIsImFzc2lnbiIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Iiwic2VuZCIsImFkZEJ0blR4dCIsImFkZE9rTWVzc2FnZSIsImFsZXJ0TmV3V2luZG93IiwiYmFkVXJsIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsImJ0blByb3Bvc2VDb25uZWN0aW9uIiwiYnRuUHJvcG9zZVN1YnNjcmliZSIsImJ0blNob3dPbldlYlNpdGUiLCJkZWxldGVCdG5UeHQiLCJkZWxldGVGYWlsTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhDcm9uIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhUb2tlbiIsIm5lZWRlZFBhcmFtcyIsIm5leHRQYWdlIiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwibm90VmFsaWRGb3JtYXQiLCJwcmV2aW91c1BhZ2UiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0FsZXJ0Iiwic2NyaXB0VGltaW5nSW5mbyIsInN0YXRzQWRtaW4iLCJzdWJzY3JpcHRpb25DYWxsIiwidXBkYXRlQnRuVHh0IiwidXBkYXRlT2tNZXNzYWdlIiwiYWRkZWRPa01lc3NhZ2UiLCJhZGRJbGx1c3RyYXRpb25UeHQiLCJkZWZhdWx0QWx0IiwiZGVsZXRlZE9rTWVzc2FnZSIsImludHJvTm9JbGx1c3RyYXRpb24iLCJpbnRyb1RpdGxlRm9ySWxsdXN0cmF0aW9uIiwibmVlZEdvb2RGaWxlIiwibmVlZEdvb2RMb25nQWx0IiwibmVlZEdvb2RMb25nQ2FwdGlvbiIsIm5lZWRHb29kTG9uZ1RpdGxlIiwibmVlZEdvb2RMb25nVXJsIiwibmVlZE1heElsbHVzdHJhdGlvbnNGb3JRdWVzdGlvbm5haXJlIiwibmVlZFF1ZXN0aW9ubmFpcmVGb3JJbGx1c3RyYXRpb24iLCJuZWVkVW5pcXVlVXJsIiwibmVlZFVybCIsIm5vdEZvdW5kIiwidXBkYXRlZE9rTWVzc2FnZSIsImFkZExpbmtUeHQiLCJkZWZhdWx0VmFsdWVGb3JMaW5rIiwiaW50cm9Ob0xpbmsiLCJpbnRyb1RpdGxlRm9yTGluayIsIm5lZWRBbmNob3IiLCJuZWVkR29vZExvbmdBbmNob3IiLCJuZWVkTWF4TGlua3NGb3JRdWVzdGlvbm5haXJlIiwibmVlZE5vdFRvb0xvbmdVcmwiLCJuZWVkUXVlc3Rpb25uYWlyZSIsIm5lZWRWYWxpZFVybCIsImFkZFF1ZXN0aW9uVHh0IiwiaW50cm9Ob1F1ZXN0aW9uIiwiaW50cm9UaXRsZUZvclF1ZXN0aW9uIiwibmVlZE1heFF1ZXN0aW9ucyIsIm5lZWROb3RUb29Mb25nVGV4dCIsIm5lZWROdW1iZXJGb3JSYW5rIiwibmVlZFRleHQiLCJidG5TZW5kUmVzcG9uc2UiLCJidG5TaGFyZVF1aXpUeHQiLCJidG5TaGFyZVF1aXpNYWlsQm9keSIsImJ0blNob3dRdWVzdGlvbm5haXJlIiwiY29ycmVjdEFuc3dlclR4dCIsImVzdGltYXRlZFRpbWUiLCJlc3RpbWF0ZWRUaW1lT3B0aW9uIiwic2hvcnQiLCJtZWRpdW0iLCJsb25nIiwiZXhwbGFuYXRpb25CZWZvcmVUeHQiLCJoYXZlQmVlblB1Ymxpc2hlZCIsImhhdmVCZWVuUmVnZW5lcmF0ZWQiLCJsYXN0VXBkYXRlZCIsImxpbmtHb1RvTmV4dEVsZW1lbnQiLCJsaW5rR29Ub1F1aXoiLCJuZWVkQ29ycmVjdFB1Ymxpc2hpbmdEYXRlIiwibmVlZEVzdGltYXRlZFRpbWUiLCJuZWVkR3JvdXBJZlJhbmsiLCJuZWVkSW50cm9kdWN0aW9uIiwibmVlZEtub3dJZklzUHVibGlzaGVkIiwibmVlZExhbmd1YWdlIiwibmVlZE5vdFRvb0xvbmdUaXRsZSIsIm5lZWRUaXRsZSIsIm5leHREYXRlV2l0aG91dFF1ZXN0aW9ubmFpcmUiLCJuZXh0UXVlc3Rpb25uYWlyZXNMaXN0IiwicXVlc3Rpb25uYWlyZXNOYW1lIiwicXVlc3Rpb25uYWlyZU5lZWRCZUNvbXBsZXRlZCIsInB1Ymxpc2hlZEF0IiwicHVibGlzaGVkQnkiLCJzZWFyY2hRdWVzdGlvbm5haXJlUmVzdWx0VGl0bGUiLCJzZWFyY2hRdWVzdGlvbm5haXJlV2l0aE5vUmVzdWx0Iiwic2VhcmNoUXVlc3Rpb25uYWlyZVdpdGhSZXN1bHQiLCJ3cm9uZ0Fuc3dlclR4dCIsImFscmVhZHlDb25uZWN0ZWQiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJiYWRQYXNzd29yZCIsImJ5ZWJ5ZU1lc3NhZ2UiLCJjb25uZWN0aW9uT2siLCJjcmVhdGlvbk9rTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsImVtYWlsTm90Rm91bmQiLCJmYWlsQm90VGVzdCIsImZhaWxCb3RUZXN0TG9nIiwiZm9ybXNFbWFpbExhYmVsIiwiZm9ybXNFbWFpbFBsYWNlaG9sZGVyIiwiZm9ybXNFbWFpbDJQbGFjZWhvbGRlciIsImZvcm1zQ0dVT2tMYWJlbCIsImZvcm1zU3VibWl0VHh0IiwiZ29kZmF0aGVyRm91bmQiLCJnb2RmYXRoZXJOb3RGb3VuZCIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zVXNlck5iR29kQ2hpbGRzIiwiaW5mb3NVc2VyTm9Hb2RjaGlsZHMiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua1R4dCIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsIm1haWxMb2dpbkxpbmtTdWJqZWN0IiwibWFpbExvZ2luTGlua1R4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckxpbmtUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJtYWlsVXBkYXRlTG9naW5MaW5rVHh0IiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwibWFpbFVwZGF0ZUxvZ2luU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IiwibWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1R4dCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsV2VsY29tZUJvZHlUeHQiLCJtYWlsV2VsY29tZUxpbmtUeHQiLCJtYWlsV2VsY29tZVN1YmplY3QiLCJuZWVkQmVDb25uZWN0ZWQiLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkRW1haWwiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRMb25nUGFzc1dvcmQiLCJuZWVkTWF4VGltZURpZmZlcmVuY2UiLCJuZWVkTWluVGltZURpZmZlcmVuY2UiLCJuZWVkTmFtZSIsIm5lZWROb3RUb29Mb25nTmFtZSIsIm5lZWROb3RUb29Mb25nRW1haWwiLCJuZWVkUGFzc1dvcmQiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkU3RhdHVzIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZFZhbGlkYXRpb25Ub0xvZ2luIiwibmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIiwicGFzc3dvcmRDb3BpZWQiLCJzZWFyY2hVc2Vyc1dpdGhvdXRSZXN1bHQiLCJ0b29NYW55TG9naW5GYWlscyIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwid2VsY29tZU1lc3NhZ2UiLCJUb29sIiwibXlWYXIiLCJ0cmltIiwidHJpbUlmTm90TnVsbCIsIm15U3RyaW5nIiwic2hvcnRlbklmTG9uZ2VyVGhhbiIsIm1heCIsInJlcGxhY2VBbGwiLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJtYXRjaGVkIiwiZ2V0UmFuZG9tSW50IiwiTWF0aCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVGb3JtYXQiLCJkYXRlU3RyaW5nIiwibXlEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwiaGVhZExpbmtzIiwiYXR0cmlidXRlcyIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsInRhZ3NMaXN0VHh0IiwiYWJvdXRQYWdlIiwiY2d1UGFnZSIsImRlbGV0ZUxpbmtQYWdlIiwibG9naW5MaW5rUGFnZSIsIm5ld0xvZ2luTGlua1BhZ2UiLCJzdG9wTWFpbFBhZ2UiLCJ1cGRhdGVBY2NvdW50UGFnZSIsInVzZXJIb21lUGFnZVR4dCIsInZhbGlkYXRpb25MaW5rUGFnZSIsIm1haWxSZWNpcGllbnRUeHQiLCJsaWNlbmNlVHh0IiwiaG9tZVBhZ2VUeHQiLCJob21lQnRuQWJvdXRUeHQiLCJob21lQnRuU3Vic2NyaWJlVHh0IiwiaG9tZVN1YmNyaXB0aW9uRm9ybVRpdGxlIiwibmV3c0xpc3RUaXRsZSIsInRhZ0xpc3RUaXRsZSIsInRhZ0xpc3RNZXRhRGVzYyIsInRhZ0xpc3RJbnRybyIsImFuc3dlcnNFeHBsYW5hdGlvbnNMaW5rVGV4dCIsInF1aXpFbGVtZW50TGlua3NJbnRybyIsInF1aXpFbGVtZW50U3ViY3JpcHRpb25Gb3JtVGl0bGUiLCJleHBsYW5hdGlvbkVsZW1lbnRUeHQiLCJ0d2l0dGVyQWNjb3VudCIsIm1heFF1ZXN0aW9ubmFpcmVzU2l0ZUhvbWVQYWdlIiwiY29uZmlnIiwiY29uZmlnSWxsdXN0cmF0aW9ucyIsImNvbmZpZ0xpbmtzIiwiY29uZmlnUXVlc3Rpb25uYWlyZXMiLCJidG5OZXdRdWVzdGlvbm5haXJlIiwiYnRuUHJldmlld1F1ZXN0aW9ubmFpcmUiLCJkZWxldGVDaGVja0JveCIsImRpdkNyYXNoIiwiZGl2SWxsdXN0cmF0aW9ucyIsImRpdkxpbmtzIiwiZGl2TWFpbiIsImRpdk1lc3NhZ2UiLCJkaXZRdWVzdGlvbm5haXJlcyIsImRpdlF1ZXN0aW9ucyIsImRpdlJlc3BvbnNlIiwiZGl2U2VhcmNoUmVzdWx0IiwiZm9ybUxpbmsiLCJmb3JtSWxsdXN0cmF0aW9uIiwiZm9ybVF1ZXN0aW9uIiwiZm9ybVF1ZXN0aW9ubmFpcmUiLCJmb3JtU2VhcmNoIiwiaGVscENsYXNzaWZpY2F0aW9uIiwiaGVscEdyb3VwIiwiaGVscFB1Ymxpc2hpbmdBdCIsImlucHV0Q2xhc3NpZmljYXRpb24iLCJpbnB1dEdyb3VwIiwiaW5wdXRSYW5rSW5Hcm91cCIsImhpZGVBbGxGb3JtcyIsInNob3dGb3JtTGlua0luZm9zIiwic2hvd0xpbmtJbmZvcyIsIkxpbmtzIiwibGlzdExpbmtzIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInNlbmRMaW5rRm9ybSIsIm5ld0J0biIsImRpdlJlc3BvbnNlTGluayIsInhockxpbmtEYXRhcyIsImRlbGV0ZU9rIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJxdWVzdGlvbm5haXJlIiwic2hvd05leHRRdWVzdGlvbm5haXJlcyIsImVycm9ycyIsInNldFJlcXVlc3RIZWFkZXIiLCJzaG93Rm9ybUlsbHVzdHJhdGlvbkluZm9zIiwicmVtb3ZlQXR0cmlidXRlIiwic2hvd0lsbHVzdHJhdGlvbkluZm9zIiwiSWxsdXN0cmF0aW9ucyIsImxpc3RJbGx1c3RyYXRpb25zIiwic2VuZElsbHVzdHJhdGlvbkZvcm0iLCJkaXZSZXNwb25zZUlsbHVzdHJhdGlvbiIsImRhdGFzV2l0aEZpbGVzIiwieGhySWxsdXN0cmF0aW9uRGF0YXMiLCJzaG93Rm9ybVF1ZXN0aW9uSW5mb3MiLCJDaG9pY2VzIiwiaXNDb3JyZWN0Iiwic2hvd1F1ZXN0aW9uSW5mb3MiLCJRdWVzdGlvbnMiLCJsaXN0UXVlc3Rpb25zIiwic2VuZFF1ZXN0aW9uRm9ybSIsImRpdlJlc3BvbnNlUXVlc3Rpb24iLCJ4aHJRdWVzdGlvbkRhdGFzIiwic2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MiLCJ4aHJHZXRJbmZvcyIsInJlc2V0IiwiVGFncyIsImNsYXNzaWZpY2F0aW9uIiwieGhyTmV4dFF1ZXN0aW9ubmFpcmVzIiwibGlzdEhUTUwiLCJkYXlTdHIiLCJvcHRpb25zRGF5U3RyIiwid2Vla2RheSIsIkludGwiLCJEYXRlVGltZUZvcm1hdCIsImZvcm1hdCIsImRhdGVQdWJsaXNoaW5nIiwiaXNQdWJsaXNoYWJsZSIsImRhdGVOZWVkZWQiLCJ0YXJnZXQiLCJpbml0aWFsaXNlIiwiaXNDb25uZWN0ZWQiLCJjb2xvciIsInVybERhdGFzIiwieGhyU2VhcmNoIiwic2VsZWN0SFRNTCIsInNlYXJjaFNlbGVjdCIsInRhZ3MiLCJyZXZlcnNlIiwibGFzdFRhZyIsInhoclNlYXJjaFRhZ3MiLCJncm91cElucHV0IiwieGhyU2VhcmNoR3JvdXBzIiwibWF4UmFuayIsInJhbmtJbkdyb3VwIiwieGhyUXVlc3Rpb25uYWlyZURhdGFzIiwiZXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE1BQU1BLFFBQVEsR0FBR0MsbUJBQU8sQ0FBQyx5Q0FBRCxDQUF4Qjs7QUFFQUMsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSTtBQUNBQyxvQkFBa0IsRUFBRSxnQkFGeEI7QUFHSTtBQUNBQyxjQUFZLEVBQ1o7QUFDSUMsT0FBRyxFQUFFO0FBQUVDLGVBQVMsRUFBRTtBQUFiLEtBRFQ7QUFFSUMsU0FBSyxFQUFFO0FBQUVELGVBQVMsRUFBRTtBQUFiLEtBRlg7QUFHSUUsV0FBTyxFQUFFO0FBQUVGLGVBQVMsRUFBRTtBQUFiLEtBSGI7QUFJSUcsU0FBSyxFQUFFO0FBQUVDLGNBQVEsRUFBRSxJQUFaO0FBQWtCQyxZQUFNLEVBQUVaLFFBQVEsQ0FBQ2Esd0JBQVQsQ0FBa0NDLElBQWxDLENBQXVDLEdBQXZDO0FBQTFCO0FBSlgsR0FMSjtBQVdJO0FBQ0FDLHFCQUFtQixFQUFHLE1BWjFCO0FBYUlDLGtCQUFnQixFQUFFO0FBYnRCLENBREEsQzs7Ozs7Ozs7OztBQ0ZBLE1BQU1DLEtBQUssR0FBR2hCLG1CQUFPLENBQUMsbUNBQUQsQ0FBckI7O0FBQ0EsTUFBTWlCLGNBQWMsR0FBR2pCLG1CQUFPLENBQUMscURBQUQsQ0FBOUI7O0FBRUFDLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0lnQixRQUFNLEVBQUUsMkJBRFo7QUFFSUMsU0FBTyxFQUFFLHVCQUZiO0FBR0lDLFdBQVMsRUFBRSxTQUhmO0FBSUlDLFlBQVUsRUFBRSxtQkFK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LENBcEVuQztBQXFFSXJDLDhCQUE0QixFQUFHO0FBckVuQyxDQURBLEM7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRTs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RTs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRDs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRTs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RTs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRDs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEOzs7Ozs7VUN2QkE7VUFD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QUFxQixDQUFDbkQsZ0JBQXRCLENBQXVDLGVBQXZDLEVBQXdELFlBQVVqVixJQUFJLENBQUNwQixLQUF2RTtBQUNBLGNBQUd6QixLQUFILEVBQ0lpYixxQkFBcUIsQ0FBQ2pYLElBQXRCLENBQTJCbEgsSUFBSSxDQUFDQyxTQUFMLENBQWVpRCxLQUFmLENBQTNCO0FBQ1A7QUFDSixPQWhFRDtBQWlFQWdXLGNBQVEsQ0FBQ2dCLGdCQUFULENBQTBCLFFBQTFCLEVBQW9DLFVBQVNDLENBQVQsRUFDcEM7QUFDSUEsU0FBQyxDQUFDQyxjQUFGO0FBQ0FDLG9CQUFZLENBQUN0VSxJQUFJLENBQUNwQixLQUFOLENBQVo7QUFDSCxPQUpEO0FBS0F3VSxzQkFBZ0IsQ0FBQ2UsZ0JBQWpCLENBQWtDLFFBQWxDLEVBQTRDLFVBQVNDLENBQVQsRUFDNUM7QUFDSUEsU0FBQyxDQUFDQyxjQUFGO0FBQ0FrQiw0QkFBb0IsQ0FBQ3ZWLElBQUksQ0FBQ3BCLEtBQU4sQ0FBcEI7QUFDSCxPQUpEO0FBS0F5VSxrQkFBWSxDQUFDYyxnQkFBYixDQUE4QixRQUE5QixFQUF3QyxVQUFTQyxDQUFULEVBQ3hDO0FBQ0lBLFNBQUMsQ0FBQ0MsY0FBRjtBQUNBNEIsd0JBQWdCLENBQUNqVyxJQUFJLENBQUNwQixLQUFOLENBQWhCO0FBQ0gsT0FKRDtBQUtIO0FBQ0osR0F2T0QsQ0F3T0EsT0FBTXdWLENBQU4sRUFDQTtBQUNJblksV0FBTyxDQUFDb2MsS0FBUixDQUFjakUsQ0FBZDtBQUNBM1osNkRBQVUsQ0FBQ2lZLFFBQUQsRUFBVyxHQUFYLEVBQWdCaFEsV0FBaEIsRUFBNkIsRUFBN0IsRUFBaUMsQ0FBQyxPQUFELENBQWpDLENBQVY7QUFDSDtBQUNKLENBL09EOztBQWdQQTJVLFVBQVU7QUFDVnJiLDhEQUFRLEciLCJmaWxlIjoiLi9KUy9tYW5hZ2VRdWVzdGlvbm5haXJlcy5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpbnN0YW5jZSA9IHJlcXVpcmUoXCIuL2luc3RhbmNlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIGlsbHVzdHJhdGlvbnNSb3V0ZTogXCIvaWxsdXN0cmF0aW9uL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIElsbHVzdHJhdGlvbiA6XG4gICAge1xuICAgICAgICBhbHQ6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICAgICAgY2FwdGlvbjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgICAgICBpbWFnZTogeyByZXF1aXJlZDogdHJ1ZSwgYWNjZXB0OiBpbnN0YW5jZS5taW1lVHlwZXNGb3JJbGx1c3RyYXRpb24uam9pbihcIixcIikgfVxuICAgIH0sXG4gICAgLy8gZmlsZXMgdXBsb2FkIHRlbXBvcnkgZGlyXG4gICAgZGlySWxsdXN0cmF0aW9uc1RtcCA6IFwidGVtcFwiLFxuICAgIGRpcklsbHVzdHJhdGlvbnM6IFwiZnJvbnQvcHVibGljL2ltZy9xdWl6c1wiXG59OyIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pIChsb2NhbClcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJ3aWtpbGVybmlcIiwgLy8gbGUgdGjDqG1lIHV0aWxpc8OpIChkYW5zIC92aWV3cykgcG91ciBnw6luw6lyZXIgbGVzIHBhZ2VzIEhUTUwuIENvbnRpZW50IHNlcyBwcm9wcmVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXZhaWxhYmxlTGFuZ3M6IFtcImZyXCJdLC8vIExhbmd1YWdlcyBpbiB3aGljaCB0aGUgc2l0ZSBpcyBhdmFpbGFibGUuIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgb25lLlxuICAgIHNpdGVOYW1lOiBcIldpa2lMZXJuaSAobG9jYWwpXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIldMXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBkZWZhdWx0UmVjZWlwdERheXM6IFwiMTQ3XCIsIC8vIFBhciBkw6lmYXV0LCBxdWVsKHMpIGpvdXIocykgZGUgbGEgc2VtYWluZSwgbCd1dGlsaXNhdGV1ciByZcOnb2l0LWlsIHF1ZWxxdWUgY2hvc2UgPyAoMT1kaW1hbmNoZSwgMj1sdW5kaS4uLiA3PXNhbWVkaSlcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDAsLy8gaWYgMCA9IHVubGltaXRlZFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogMyxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxMCxcbiAgICBhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5czogMyxcbiAgICBpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXM6IDE4MCxcbiAgICAvLyBRdWVzdGlvbm5haXJlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSwgLy8gbWluaW11bSBudW1iZXIgb2YgcXVlc3Rpb25zIGZvciB0aGUgcXVlc3Rpb25uYWlyZSB0byBiZSBwdWJsaXNoYWJsZVxuICAgIG5iUXVlc3Rpb25zTWF4OiAyLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEyLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjo3LCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjEsIC8vIGlkZW1cbiAgICBtYXhRdWVzdGlvbm5haXJlU2VuZGVkQXRTYW1lVGltZTogNTAsIC8vIGZvciBzdWJzY3JpcHRpb24ncyBlLW1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICBmaWVsZE5ld1F1ZXN0aW9ubmFpcmVzIDogXCJwdWJsaXNoaW5nQXRcIiwgLy8gZmllbGQgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGxpc3Qgb2YgdGhlIGxhc3QgcXVlc3Rpb25uYWlyZXMsIGNhbiBiZSBcImNyZWF0ZWRBdFwiLCBcInVwZGF0ZWRBdFwiIG9yIFwicHVibGlzaGluZ0F0XCJcbiAgICAvLyBHcm91cHMgOlxuICAgIG5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWluOiAxLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWF4OiAwLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAxLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDUwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMCxcbiAgICAvLyBRdWVzdGlvbnMgJiByZXNwb25zZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlySFRNTFF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlc1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIGxpbmtzUm91dGU6IFwiL2xpbmsvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgTGluayA6XG4gICAge1xuICAgICAgICB1cmw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIGFuY2hvcjogeyBtYXhsZW5ndGg6IDE1MCwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLC8vIGxhIGJhc2Ugw6AgbGFxdWVsbGUgcydham91dGUgbGVzIHJvdXRlcyBzdWl2YW50ZXNcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIGdldFJhbmRvbVF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9nZXRyYW5kb21cIiwgXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICByZWdlbmVyYXRlSFRNTDogXCIvaHRtbHJlZ2VuZXJhdGVkXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgLy8gLS0gZ3JvdXBlcyA6XG4gICAgZ3JvdXBSb3V0ZXM6IFwiL2dyb3VwXCIsXG4gICAgZ2V0R3JvdXBSb3V0ZTogXCIvZ2V0L1wiLFxuICAgIHByZXZpZXdHcm91cFJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHNlYXJjaEdyb3Vwc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICBnZXRQcmV2aW91c0Fuc3dlcnM6IFwiL3VzZXIvYW5zd2Vycy9cIixcbiAgICBnZXRTdGF0c0Fuc3dlcnMgOiBcIi91c2VyL2Fud3N3ZXJzL3N0YXRzL1wiLC8vIGZvbmN0aW9ubmUgYXVzc2kgcG91ciBsZXMgZ3JvdXBlc1xuICAgIHNhdmVBbnN3ZXJzUm91dGU6IFwiL2Fuc3dlci9cIiwvLyBpZGVtXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgUXVlc3Rpb25uYWlyZSA6XG4gICAge1xuICAgICAgICB0aXRsZTogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgc2x1ZzogeyBtYXhsZW5ndGg6IDE1MCB9LCAvLyBjaGFtcCByZXF1aXMgbWFpcyBjYWxjdWzDqSDDoCBwYXJ0aXIgZHUgdGl0cmUgcWQgbGFpc3PDqSB2aWRlIGRhbnMgbGUgZm9ybXVsYWlyZVxuICAgICAgICBpbnRyb2R1Y3Rpb246IHsgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXMgOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBHcm91cCA6XG4gICAge1xuICAgICAgICB0aXRsZTogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgc2x1ZzogeyBtYXhsZW5ndGg6IDE1MCB9LCAvLyBjaGFtcCByZXF1aXMgbWFpcyBjYWxjdWzDqSDDoCBwYXJ0aXIgZHUgdGl0cmUgcWQgbGFpc3PDqSB2aWRlIGRhbnMgbGUgZm9ybXVsYWlyZVxuICAgIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzZWFyY2hHcm91cHM6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIC8vIEVtcGxhY2VtZW50IGRlcyBmaWNoaWVycyBKU09OIGfDqW7DqXLDqXMgOlxuICAgIGRpckNhY2hlR3JvdXBzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9ncm91cHNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9xdWVzdGlvbnNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIixcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgLy8gRW1wbGFjZW1lbnQgZGVzIGZpY2hpZXJzIEhUTUwgZ8OpbsOpcsOpcyA6XG4gICAgZGlySFRNTEdyb3VwcyA6IFwiZnJvbnQvcHVibGljL3F1aXovZ3BcIixcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZXMgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTE5ld3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICAvLyBJZGVtIG1haXMgcG91ciB1cmxzIDpcbiAgICBkaXJXZWJHcm91cHMgOiBcInF1aXovZ3BcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlcyA6IFwicXVpelwiLFxuICAgIGRpcldlYk5ld3MgOiBcInF1aXpzL1wiLFxuICAgIGRpcldlYlRhZ3MgOiBcInF1aXpzL1wiLFxuICAgIC8vIGxpbWl0ZSBkZXMgcsOpc3VsdGF0IGR1IG1vdGV1ciBkZSByZWNoZXJjaGUsIHF1YW5kIGRlbWFuZGUgZGUgcsOpc3VsdGF0cyBhdSBoYXNhcmQgOlxuICAgIG5iUmFuZG9tUmVzdWx0cyA6IDMsXG4gICAgLyogVmFsZXVycyBlbiBmYWl0IGTDqWZpbmllcyBkYW5zIGluc3RhbmNlLmpzIGRvbmMgw6Agc3VwcHJpbWVyIHF1YW5kIHBsdXMgdXRpbGlzw6llcyBhaWxsZXVycyA6ICovXG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsICAgXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tMb2dpblJvdXRlOiBcIi9jaGVja2xvZ2luL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja1N1YnNjcmliZVRva2VuUm91dGU6IFwiL3ZhbGlkYXRpb24vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIiwgICAgXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGdldFBheW1lbnRzOiBcIi9wYXltZW50L2dldGZvcm9uZXVzZXIvXCIsXG4gICAgZ2V0VXNlckluZm9zOiBcIi9nZXQvXCIsXG4gICAgZ2V0VXNlcnNRdWVzdGlvbm5haXJlc1JvdXRlOiBcIi9nZXR1c2Vyc3F1ZXN0aW9ubmFpcmVzL1wiLC8vIGxlcyBxdWVzdGlvbm5haXJlcyBhdXhxdWVscyBsJ3V0aWxpc2F0ZXVyIGEgZMOpasOgIGV1IGFjY8OocyB2aWEgc29uIGFib25uZW1lbnQgICAgXG4gICAgc2VhcmNoVXNlclJvdXRlOiBcIi9zZWFyY2gvXCIsXG4gICAgc2lnbnVwQ29tcGxldGlvblJvdXRlOiBcIi9zaWdudXBjb21wbGV0aW9uL1wiLFxuICAgIHN1YnNjcmliZVJvdXRlOiBcIi9zaWdudXBcIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICB2YWxpZGF0ZVVzZXJSb3V0ZTogXCIvdmFsaWRhdGUvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzZWFyY2g6IHsgbWlubGVuZ3RoOiAxLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRpbWVEaWZmZXJlbmNlTWluOiAtNzIwLFxuICAgIHRpbWVEaWZmZXJlbmNlTWF4OiA4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1dpdGhvdXRBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy93aXRob3V0XCJcbn07XG4iLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG5cXG5MZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgdm91cyBwb3V2ZXogbGUgdHJvdXZlciDDoCBjZXR0ZSBhZHJlc3NlIDpcXG5odHRwczovL2ZvcmdlLmNoYXByaWwub3JnL0ZhYl9CbGFiL1dpa2lMZXJuaVxcblxcblBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3Qgc2V0QXR0cmlidXRlc1RvSW5wdXRzID0gKGlucHV0c0NvbmYsIG15Rm9ybSkgPT5cbntcbiAgICBmb3IobGV0IGkgaW4gbXlGb3JtLmVsZW1lbnRzKVxuICAgIHtcbiAgICAgICAgaWYoIWlzRW1wdHkobXlGb3JtLmVsZW1lbnRzW2ldLmlkKSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGlkSW5wdXQ9bXlGb3JtLmVsZW1lbnRzW2ldLmlkO1xuICAgICAgICAgICAgaWYoaW5wdXRzQ29uZltpZElucHV0XSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRIVE1MPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkSW5wdXQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBpbnB1dHNDb25mW2lkSW5wdXRdKVxuICAgICAgICAgICAgICAgICAgICBpbnB1dEhUTUwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5wdXRzQ29uZltpZElucHV0XVthdHRyaWJ1dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gUsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHZhbGV1cnMgZGUgY2hhbXBzIGVuIG9tZXR0YW50IGxlcyBjaGVja2JveCBub24gY29jaMOpZXMsIGV0Yy5cbmV4cG9ydCBjb25zdCBnZXREYXRhc0Zyb21JbnB1dHMgPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGRhdGFzPXt9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgICAgIGRhdGFzW2VudHJpZVswXV09ZW50cmllWzFdO1xuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gVmlkZSB0b3VzIGxlcyBjaGFtcHMgZCd1biBmb3JtdWxhaXJlLCB5IGNvbXByaXMgaGlkZGVuLCBjaGVja2JveCwgZXRjLlxuLy8gUmV2b2lyIHBvdXIgbGVzIHNlbGVjdFxuZXhwb3J0IGNvbnN0IGVtcHlGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICB7XG4gICAgICAgIGlmKG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwiY2hlY2tib3hcIiB8fCBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cInJhZGlvXCIpXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS5jaGVja2VkPWZhbHNlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS52YWx1ZT1cIlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFZpZGUgZXQgY2FjaGUgbGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGVtcHlBbmRIaWRlRm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgZW1weUZvcm0obXlGb3JtKTtcbiAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gcsOpY3Vww6lyYW50IGxlcyBwYXJhbcOodHJlcyBwYXNzw6lzIHBhciBsJ3VybFxuZXhwb3J0IGNvbnN0IGdldFVybFBhcmFtcyA9ICgpID0+XG57XG4gICAgaWYoaXNFbXB0eShsb2NhdGlvbi5zZWFyY2gpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdChcIiZcIik7XG4gICAgaWYoIUFycmF5LmlzQXJyYXkocGFyYW1ldGVycykgfHwgcGFyYW1ldGVycy5sZW5ndGg9PT0wKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgIGxldCBwYXJhbSwgZGF0YXM9e307XG4gICAgZm9yKGxldCBpIGluIHBhcmFtZXRlcnMpXG4gICAge1xuICAgICAgICBwYXJhbSA9IHBhcmFtZXRlcnNbaV0uc3BsaXQoXCI9XCIpO1xuICAgICAgICBpZihwYXJhbS5sZW5ndGg9PT0yKVxuICAgICAgICAgICAgZGF0YXNbcGFyYW1bMF1dPWRlY29kZVVSSShwYXJhbVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgLy8gbXVsdGlwbGllciBwYXIgLTEsIGNhciBjJ2VzdCBjZSBxdSdpbCBmYXV0IFwiYWpvdXRlclwiIMOgIGwnaGV1cmUgVVRDIHBvdXIgcmV2ZW5pciBlbiBoZXVyZSBsb2NhbGUgcXVpIG0naW50w6lyZXNzZSBldCBub24gbCdpbnZlcnNlXG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSotMTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXogb3UgZCd1biBncm91cGUgZGUgcXVpenNcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykgJiYgKCFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpIHx8ICFpc0VtcHR5KGFuc3dlci5Hcm91cElkKSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSlcbiAgICAgICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkYXRhcy5Hcm91cElkPWFuc3dlci5Hcm91cElkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGMnZXN0IGxlIHRva2VuIHF1aSBzZXJ0IMOgIHbDqXJpZmllciBsZSBzdGF0dXQgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZS5hY2NvdW50UGFnZStcIiNzdWJzY3JpYmVcIik7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBhZGRPa01lc3NhZ2UgOiBcIkxlcyBkb25uw6llcyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWVzLlwiLFxuICAgIGFsZXJ0TmV3V2luZG93OiBcIm5vdXZlbGxlIGZlbsOqdHJlXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFmZmljaGVyICFcIixcbiAgICBidG5Qcm9wb3NlQ29ubmVjdGlvbjogXCJKZSBtZSBjb25uZWN0ZS5cIixcbiAgICBidG5Qcm9wb3NlU3Vic2NyaWJlOiBcIkplIGNyw6llIG1vbiBjb21wdGUuXCIsXG4gICAgYnRuU2hvd09uV2ViU2l0ZTogXCJMaXJlIGxhIHN1aXRlIHN1ciAjU0lURV9OQU1FXCIsXG4gICAgZGVsZXRlQnRuVHh0OiBcIlN1cHByaW1lclwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBkZSBsJ2VucmVnaXN0cmVtZW50ICNJRCBhIMOpY2hvdcOpLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBmYWlsQXV0aCA6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvbi5cIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aFRva2VuIDogXCJUb2tlbiBpbnZhbGlkZSBvdSB1dGlsaXNhdGV1ciBub24gdHJvdXbDqS5cIixcbiAgICBuZWVkZWRQYXJhbXMgOiBcIkRlcyBwYXJhbcOodHJlcyBuw6ljZXNzYWlyZXMgbWFucXVhbnRzIHNvbnQgbWFucXVhbnRzLlwiLFxuICAgIG5leHRQYWdlIDogXCJQYWdlIHN1aXZhbnRlXCIsXG4gICAgbm90QWxsb3dlZCA6IFwiVm91cyBuJ2F2ZXogcGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgY2V0dGUgYWN0aW9uLlwiLFxuICAgIG5vdFJlcXVpcmVkIDogXCJGYWN1bHRhdGlmLlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBwcmV2aW91c1BhZ2UgOiBcIlBhZ2UgcHLDqWPDqWRlbnRlXCIsXG4gICAgc2VydmVyRXJyb3IgOiBcIkTDqXNvbMOpLiBVbmUgZXJyZXVyIGltcHLDqXZ1ZSBlc3Qgc3VydmVudWUuIFNpIGNlbGEgcGVyc2lzdGUsIG4naMOpc2l0ZXogw6AgcHLDqXZlbmlyIGwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZS5cIixcbiAgICBzZXJ2ZXJFcnJvckFkbWluIDogXCJCdWcgZGUgbCdhcHBsaWNhdGlvbiA6XCIsXG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogbGEgY3VsdHVyZSBnw6luw6lyYWxlIGVuIGxpYmVydMOpXCIsXG4gICAgc2l0ZU1ldGFEZXNjcmlwdGlvbiA6IFwiQXZlYyBXaWtpTGVybmksIHZvdXMgYXBwcmVuZXogcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBjaG9zZXMuIFZvdXMgcmVjZXZleiBkZSBjb3VydHMgYXJ0aWNsZXMgbGlzaWJsZXMgZW4gcXVlbHF1ZXMgbWludXRlcy4gRGVzIHF1aXpzIHZvdXMgcGVybWV0dGVudCBlbnN1aXRlIGRlIHRlc3RlciBjZSBxdWUgdm91cyBhdmV6IHJldGVudS5cIixcbiAgICBzY3JpcHRUaW1pbmdBbGVydCA6IFwiKioqIFNjcmlwdCBsZW50IDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiLFxuICAgIHN1YnNjcmlwdGlvbkNhbGw6IFwiSW5zY3JpdmV6LXZvdXMgIVwiLFxuICAgIHVwZGF0ZUJ0blR4dDogXCJNb2RpZmllclwiLFxuICAgIHVwZGF0ZU9rTWVzc2FnZSA6IFwiTGEgbWlzZSDDoCBqb3VyIMOgIGpvdXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYWRkZWRPa01lc3NhZ2U6IFwiTCdpbGx1c3RyYXRpb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBhZGRJbGx1c3RyYXRpb25UeHQ6IFwiQWpvdXRlciB1bmUgaWxsdXN0cmF0aW9uXCIsXG4gICAgZGVmYXVsdEFsdCA6IFwiSWxsdXN0cmF0aW9uIGR1IHF1aXpcIixcbiAgICBkZWxldGVkT2tNZXNzYWdlOiBcIkwnaWxsdXN0cmF0aW9uIGEgYmllbiDDqXTDqSBzdXBwcmltw6llLlwiLFxuICAgIGludHJvTm9JbGx1c3RyYXRpb24gOiBcIkF1Y3VuZSBpbGx1c3RyYXRpb24gcG91ciBsJ2luc3RhbnQuXCIsXG4gICAgaW50cm9UaXRsZUZvcklsbHVzdHJhdGlvbiA6IFwiSWxsdXN0cmF0aW9ucyBkdSBxdWl6XCIsXG4gICAgbmVlZEdvb2RGaWxlIDogXCJWb3RyZSBmaWNoaWVyIG4nYSBwYXMgw6l0w6kgYWNjZXB0w6kuXCIsXG4gICAgbmVlZEdvb2RMb25nQWx0IDogXCJMZSB0ZXh0ZSBkZSBsYSBwcm9wcmnDqXTDqSAnYWx0JyBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRHb29kTG9uZ0NhcHRpb24gOiBcIkxlIHRleHRlIGRlIGxhIGzDqWdlbmRlIGRlIGwnaW1hZ2UgbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkR29vZExvbmdUaXRsZSA6IFwiTGUgdGV4dGUgZGUgbGEgcHJvcHJpw6l0w6kgJ3RpdGxlJyBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRHb29kTG9uZ1VybCA6IFwiTCd1cmwgZGUgbCdpbWFnZSBkb2l0IGNvbnRlbmlyIGVudHJlIDUgZXQgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRNYXhJbGx1c3RyYXRpb25zRm9yUXVlc3Rpb25uYWlyZSA6IFwiVm91cyBhdmV6IGTDqWrDoCBhdHRlaW50IGxlIG5vbWJyZSBtYXhpbWFsIGQnaWxsdXN0cmF0aW9ucyBwb3VyIGNlIHF1ZXN0aW9ubmFpcmUuXCIsXG4gICAgbmVlZFF1ZXN0aW9ubmFpcmVGb3JJbGx1c3RyYXRpb24gOiBcIlRlbnRhdGl2ZSBkJ2Fqb3V0L21pc2Ugw6Agam91ci9zdXBwcmVlc3Npb24gZCd1bmUgaWxsdXN0cmF0aW9uIHBvdXIgdW4gcXVlc3Rpb25uYWlyZSBuJ2F5YW50IHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWRVbmlxdWVVcmwgOiBcIkwndXJsIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBhciB1bmUgYXV0cmUgaW1hZ2UuXCIsXG4gICAgbmVlZFVybCA6IFwiTWVyY2kgZGUgZm91cm5pciB1bmUgdXJsIHBvdXIgbCdpbWFnZS5cIixcbiAgICBub3RGb3VuZDogXCJMJ2VucmVnaXN0cmVtZW50IGRlIGwnaWxsdXN0cmF0aW9uIG4nYSBwYXMgw6l0w6kgdHJvdXbDqSA6IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiTCdpbGx1c3RyYXRpb24gYSBiaWVuIMOpdMOpIG1vZGlmacOpZS5cIixcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFkZGVkT2tNZXNzYWdlOiBcIkxlIGxpZW4gYSBiaWVuIMOpdMOpIGFqb3V0w6kuXCIsXG4gICAgYWRkTGlua1R4dDogXCJBam91dGVyIHVuIGxpZW5cIixcbiAgICBkZWZhdWx0VmFsdWVGb3JMaW5rOiBcIkxpcmUgbCdhcnRpY2xlIHN1ciBXaWtpcMOpZGlhLlwiLFxuICAgIGRlbGV0ZWRPa01lc3NhZ2U6IFwiTGUgbGllbiBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGludHJvTm9MaW5rIDogXCJBdWN1biBsaWVuIHBvdXIgbCdpbnN0YW50LlwiLFxuICAgIGludHJvVGl0bGVGb3JMaW5rIDogXCJMZWN0dXJlcyBwcm9wb3PDqWVzXCIsXG4gICAgbmVlZEFuY2hvciA6IFwiTWVyY2kgZGUgZm91cm5pciB1bmUgYW5jcmUgcG91ciBjZSBsaWVuLlwiLFxuICAgIG5lZWRHb29kTG9uZ0FuY2hvciA6IFwiTWVyY2kgZGUgZm91cm5pciB1bmUgYW5jcmUgcG91ciBjZSBsaWVuIGNvbXB0YW50IGVudHJlIDUgZXQgMTUwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRNYXhMaW5rc0ZvclF1ZXN0aW9ubmFpcmUgOiBcIlZvdXMgYXZleiBkw6lqw6AgYXR0ZWludCBsZSBub21icmUgbWF4aW1hbCBkZSBsaWVucyBwb3VyIGNlIHF1ZXN0aW9ubmFpcmUuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdVcmwgOiBcIk1lcmNpIGRlICBzYWlzaXIgdW4gdXJsIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUXVlc3Rpb25uYWlyZSA6IFwiTGUgcXVlc3Rpb25uYWlyZSBkdSBsaWVuIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkVXJsIDogXCJNZXJjaSBkZSAgc2Fpc2lyIGwndXJsIGR1IGxpZW4uXCIsXG4gICAgbmVlZFZhbGlkVXJsIDogXCJNZXJjaSBkZSAgc2Fpc2lyIHVuIHVybCBheWFudCB1biBmb3JtYXQgdmFsaWRlLlwiLFxuICAgIG5vdEZvdW5kIDogXCJMJ2VucmVnaXN0cmVtZW50IGR1IGxpZW4gbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiTGUgbGllbiBhIGJpZW4gw6l0w6kgbW9kaWZpw6kuXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFkZE9rTWVzc2FnZTogXCJMYSBxdWVzdGlvbiBhIGJpZW4gw6l0w6kgYWpvdXTDqWUuXCIsXG4gICAgYWRkUXVlc3Rpb25UeHQ6IFwiQWpvdXRlciB1bmUgcXVlc3Rpb25cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTGEgcXVlc3Rpb24gYSBiaWVuIMOpdMOpIHN1cHByaW3DqWUuXCIsXG4gICAgaW50cm9Ob1F1ZXN0aW9uOiBcIkF1Y3VuZSBxdWVzdGlvbiBuJ2Egw6l0w6kgc2Fpc2llIHBvdXIgbCdpbnN0YW50XCIsXG4gICAgaW50cm9UaXRsZUZvclF1ZXN0aW9uOiBcIkxlcyBxdWVzdGlvbnMgZW5yZWdpc3Ryw6llc1wiLFxuICAgIG5lZWRNYXhRdWVzdGlvbnM6IFwiVm91cyBhdmV6IGTDqWrDoCBhdHRlaW50IGxlIG5vbWJyZSBtYXhpbWFsIGRlIHF1ZXN0aW9ucyBwb3VyIGNlIHF1ZXN0aW9ubmFpcmUgOiBcIiwgICAgICAgICBcbiAgICBuZWVkTm90VG9vTG9uZ1RleHQ6IFwiTGEgcXVlc3Rpb24gbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkTnVtYmVyRm9yUmFuayA6IFwiVm91cyBkZXZleiBmb3VybmlyIHVuIG5vbWJyZSBzdXDDqXJpZXVyIG91IMOpZ2FsIMOgIDEgcG91ciBsZSByYW5nIGRlIGNldHRlIHF1ZXN0aW9uLlwiLCBcbiAgICBuZWVkUXVlc3Rpb25uYWlyZTogXCJMZSBxdWVzdGlvbm5haXJlIGNvbmNlcm7DqSBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZFRleHQ6IFwiTWVyY2kgZGUgc2Fpc2lyIGxlIHRleHRlIGRlIGxhIHF1ZXN0aW9uICFcIiwgICBcbiAgICBub3RGb3VuZDogXCJMJ2VucmVnaXN0cmVtZW50IGRlIGxhIHF1ZXN0aW9uIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2U6IFwiTGEgcXVlc3Rpb24gYSBiaWVuIMOpdMOpIG1vZGlmacOpZS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYnRuUHJvcG9zZUNvbm5lY3Rpb246IFwiSmUgbWUgY29ubmVjdGUuXCIsLy8gZMOpcGxhY8OpIGRhbnMgZ2VuZXJhbC5qc1xuICAgIGJ0blByb3Bvc2VTdWJzY3JpYmU6IFwiSmUgY3LDqWUgbW9uIGNvbXB0ZS5cIiwvL2lkZW1cbiAgICBidG5TZW5kUmVzcG9uc2U6IFwiVGVzdGV6IHZvcyByw6lwb25zZXMuXCIsXG4gICAgYnRuU2hhcmVRdWl6VHh0OiBcIlBhcnRhZ2VyIHZpYSBcIixcbiAgICBidG5TaGFyZVF1aXpNYWlsQm9keTogXCJCb25qb3VyLCUwQSUwQVZvaWNpJTIwdW4lMjBsaWVuJTIwaW50ZXJuZXQlMjBxdWklMjBkZXZyYWl0JTIwdCdpbnTDqXJlc3NlciA6JTBBXCIsICAgIFxuICAgIGJ0blNob3dRdWVzdGlvbm5haXJlOiBcIlLDqXBvbmRyZSBhdSBxdWl6ICFcIixcbiAgICBjb3JyZWN0QW5zd2VyVHh0OiBcIkJvbm5lIHLDqXBvbnNlXCIsXG4gICAgZXN0aW1hdGVkVGltZTogXCJEdXLDqWUgZGUgbGVjdHVyZSBlc3RpbcOpZSA6IFwiLFxuICAgIGVzdGltYXRlZFRpbWVPcHRpb24gOlxuICAgIHtcbiAgICAgICAgc2hvcnQ6IFwiY291cnRlXCIsXG4gICAgICAgIG1lZGl1bTogXCJtb3llbm5lXCIsXG4gICAgICAgIGxvbmc6IFwibG9uZ3VlXCJcbiAgICB9LFxuICAgIGV4cGxhbmF0aW9uQmVmb3JlVHh0OiBcIkV4dHJhaXQgOlwiLFxuICAgIGhhdmVCZWVuUHVibGlzaGVkIDogXCI6TkIgbm91dmVhdXggcXVlc3Rpb25uYWlyZXMgb250IMOpdMOpIHB1Ymxpw6lzLlwiLFxuICAgIGhhdmVCZWVuUmVnZW5lcmF0ZWQgOiBcIkxlcyBwYWdlcyBIVE1MIGRlICNOQjEgcXVlc3Rpb25uYWlyZXMgb3Ugw6lsw6ltZW50cyBkZSBncm91cGVzLCAjTkIyIHF1aXpzIGdyb3Vww6lzIGV0ICNOQjMgdGjDqG1lcyBvbnQgw6l0w6kgcmVnw6luw6lyw6lzLlwiLFxuICAgIGxhc3RVcGRhdGVkOiBcIkRlcm5pw6hyZSBtaXNlIMOgIGpvdXIsIGxlIFwiLFxuICAgIGxpbmtHb1RvTmV4dEVsZW1lbnQ6IFwiQXJ0aWNsZSBzdWl2YW50XCIsXG4gICAgbGlua0dvVG9RdWl6OiBcIkFjY8OpZGVyIGF1IHF1aXpcIiwgICAgXG4gICAgbmVlZENvcnJlY3RQdWJsaXNoaW5nRGF0ZTogXCJMYSBkYXRlIGRlIHB1YmxpY2F0aW9uIGZvdXJuaWUgbidhIHBhcyB1biBmb3JtYXQgdmFsaWRlLlwiLFxuICAgIG5lZWRFc3RpbWF0ZWRUaW1lOiBcIk1lcmNpIGRlIHPDqWxlY3Rpb25uZXIgdW5lIGVzdGltYXRpb24gZGUgbGEgZHVyw6llIGRlIGNlIHF1aXouXCIsXG4gICAgbmVlZEdyb3VwSWZSYW5rOiBcIlZvdXMgYXZleiBzYWlzaSB1biByYW5nIGRlIGNsYXNzZW1lbnQsIHNhbnMgc8OpbGVjdGlvbm5lciBsZSBncm91cGUgZHUgcXVpei5cIixcbiAgICBuZWVkSW50cm9kdWN0aW9uOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gdGV4dGUgZCdpbnRyb2R1Y3Rpb24gw6Agdm90cmUgcXVpei5cIixcbiAgICBuZWVkS25vd0lmSXNQdWJsaXNoZWQ6IFwiSWwgZmF1dCBzYXZvaXIgc2kgY2UgcXVpeiBlc3QgcHVibGnDqS5cIixcbiAgICBuZWVkTGFuZ3VhZ2U6IFwiVm91cyBkZXZleiBzw6lsZWN0aW9ubmVyIGxhIGxhbmd1ZSBkZSBjZSBxdWl6LlwiLFxuICAgIG5lZWROb3RUb29Mb25nVGl0bGU6IFwiTGUgdGl0cmUgZHUgcXVpeiBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWROdW1iZXJGb3JSYW5rOiBcIlZvdXMgZGV2ZXogc2Fpc2lyIHVuIG5vbWJyZSBlbnRpZXIgcG91ciBsZSByYW5nIGRlIGNlIHF1ZXN0aW9ubmFpcmUgZGFucyBzb24gZ3JvdXBlLlwiLCAgICAgICAgICAgICAgXG4gICAgbmVlZFRpdGxlOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gdGl0cmUgw6Agdm90cmUgcXVpei5cIixcbiAgICBuZWVkVW5pcXVlVXJsOiBcIkwndXJsIGR1IHF1aXogZG9pdCDDqnRyZSB1bmlxdWUuXCIsXG4gICAgbmVlZFVybDogXCJNZXJjaSBkZSBmb3VybmlyIGwndXJsIMOgIHZvdHJlIHF1aXouXCIsXG4gICAgbmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZTogXCJQcm9jaGFpbmUgZGF0ZSBzYW5zIHF1aXogcHJvZ3JhbW3DqSA6IFwiLFxuICAgIG5leHRRdWVzdGlvbm5haXJlc0xpc3Q6IFwiTGVzICNOQiBwcm9jaGFpbnMgcXVpenMgZGV2YW50IMOqdHJlIHB1Ymxpw6lzXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNOYW1lOiBcInF1aXpcIixcbiAgICBxdWVzdGlvbm5haXJlTmVlZEJlQ29tcGxldGVkOiBcIlF1aXogaW5jb21wbGV0XCIsXG4gICAgcHVibGlzaGVkQXQ6IFwiLCBsZVwiLFxuICAgIHB1Ymxpc2hlZEJ5OiBcIlF1aXogcHVibGnDqSBwYXJcIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlUmVzdWx0VGl0bGUgOiBcIlLDqXN1bHRhdCBwb3VyIHZvdHJlIHJlY2hlcmNoZVwiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVXaXRoTm9SZXN1bHQgOiBcIkF1Y3VuIHF1aXogbidhIMOpdMOpIHRyb3V2w6kgcG91ciB2b3RyZSByZWNoZXJjaGUuXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZVdpdGhSZXN1bHQgOiBcIklsIHkgYSAjTkIgYXJ0aWNsZSNTIGNvcnJlc3BvbmRhbnQgw6Agdm90cmUgcmVjaGVyY2hlIDpcIixcbiAgICB3cm9uZ0Fuc3dlclR4dDogXCJNYXV2YWlzZSByw6lwb25zZVwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhbHJlYWR5Q29ubmVjdGVkOiBcIlZvdXMgw6p0ZXMgZMOpasOgIGNvbm5lY3TDqSBhdSBzaXRlICFcIixcbiAgICBiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBjb25maXJtYXRpb24gbmUgc2VtYmxlIHBhcyB2YWxpZGUgb3UgYmllbiBpbCBhIGV4cGlyw6kuIFZvdXMgcG91dmV6IGVuIHJlY2V2b2lyIHVuIG5vdXZlYXUgPGEgaHJlZj0nI1VSTCc+ZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICBiYWRQYXNzd29yZDogXCJBdWN1biBjb21wdGUgdXRpbGlzYXRldXIgbmUgY29ycmVzcG9uZCBhdXggaW5mb3JtYXRpb25zIHNhaXNpZXMuXCIsXG4gICAgYnllYnllTWVzc2FnZTogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBkw6ljb25uZXhpb24gcydlc3QgYmllbiBkw6lyb3Vsw6llLjxicj7DgCBiaWVudMO0dCAhXCIsIFxuICAgIGNvbm5lY3Rpb25PazogXCJDb25uZXhpb24gcsOpdXNzaWUuXCIsXG4gICAgY3JlYXRpb25Pa01lc3NhZ2U6IFwiTGUgbm91dmVsIHV0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqS5cIixcbiAgICBjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBub24gdmFsaWTDqXMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlRmFpbE1lc3NhZ2U6IFwiVGVudGF0aXZlIGRlIHN1cHByZXNzaW9uIGQndW4gdXRpbGlzYXRldXIgaW5leGlzdGFudCA6IFwiLFxuICAgIGRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBpbmFjdGlmcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGVtYWlsTm90Rm91bmQ6IFwiQXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG4nYSDDqXTDqSB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgZmFpbEJvdFRlc3Q6IFwiVW4gcHJvYmzDqG1lIGEgw6l0w6kgcmVuY29udHLDqSBkdXJhbnQgdm90cmUgaW5zY3JpcHRpb24uIEVuIGNhcyBkZSBkaWZmaWN1bHTDqSwgbidow6lzaXRleiBwYXMgY29udGFjdGVyIGwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZS5cIixcbiAgICBmYWlsQm90VGVzdExvZzogXCJVbmUgaW5zY3JpcHRpb24gYSDDqXTDqSBibG9xdcOpZSwgcGFyY2UgcXVlIGxlIGNoYW1wIGVtYWlsMiDDqXRhaXQgcmVuc2VpZ27DqSBhdmVjIDogXCIsXG4gICAgZm9ybXNFbWFpbExhYmVsOiBcIkUtbWFpbCA6XCIsXG4gICAgZm9ybXNFbWFpbFBsYWNlaG9sZGVyOiBcIlZvdHJlIGFkcmVzc2UgZS1tYWlsXCIsXG4gICAgZm9ybXNFbWFpbDJQbGFjZWhvbGRlcjogXCJTaSB2b3VzIHZveWV6IGNlIGNoYW1wLCBsYWlzc2V6LWxlIHZpZGVcIiwvL2NoYW1wIHF1aSBuZSBkZXZyYWl0IHBhcyDDqnRyZSB2aXNpYmxlIHBhciBkZXMgaHVtYWluc1xuICAgIGZvcm1zQ0dVT2tMYWJlbDogXCJKJ2FjY2VwdGUgPGEgaHJlZj0jbGluayB0YXJnZXQ9XFxcIl9ibGFua1xcXCIgcmVsPVxcXCJub29wZW5lclxcXCIgdGl0bGU9XFxcIsOAIGxpcmUgOilcXFwiPmxlcyBDb25kaXRpb25zIEfDqW7DqXJhbGUgZCdVdGlsaXNhdGlvbjwvYT4gZHUgc2l0ZSAocmVxdWlzKS5cIixcbiAgICBmb3Jtc1N1Ym1pdFR4dDogXCJKZSBtJ2Fib25uZSAhXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgXFxcInBhcnJhaW5cXFwiIGEgYmllbiDDqXTDqSB0cm91dsOpLiBDZXR0ZSBwZXJzb25uZSBzZXJhIGF2ZXJ0aWUgcXVlIHZvdXMgbCdhdmV6IGTDqXNpZ27DqWUuXCIsXG4gICAgZ29kZmF0aGVyTm90Rm91bmQ6IFwiRMOpc29sw6kgbWFpcyBhdWN1biB1dGlsaXNhdGV1ciBuJ2Egw6l0w6kgdHJvdXbDqSBwb3VyIGNlIGNvZGUgLyBlLW1haWwgZGUgcGFycmFpbmFnZSA6KFwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVscyA6IFwiLFxuICAgIGluZm9zVXNlckZvckFkbWluOiBcIkNldCB1dGlsaXNhdGV1ciAoaWQ6IElEX1VTRVIpIGEgPGI+Y3LDqcOpIHNvbiBjb21wdGUgbGUgREFURV9DUkVBPC9iPiwgbGEgZGVybmnDqHJlIG1pc2Ugw6Agam91ciBkYXRhbnQgZHUgREFURV9VUERBVEUuPGJyPjxiPkRhdGUgZGUgc2EgZGVybmnDqHJlIGNvbm5leGlvbiA6IERBVEVfQ09OTkVDVElPTi48L2I+XCIsXG4gICAgaW5mb3NVc2VyTmJHb2RDaGlsZHM6IFwiVm9pY2kgbGVzICNOQiB1dGlsaXNhdGV1cihzKSBpbnNjcml0KHMpIGVuIHZvdXMgZMOpc2lnbmFudCBjb21tZSBcXFwicGFycmFpblxcXCIgOiBcIixcbiAgICBpbmZvc1VzZXJOb0dvZGNoaWxkczogXCJQb3VyIGwnaW5zdGFudCwgYXVjdW5lIHBlcnNvbm5lIG5lIHMnZXN0IGluc2NyaXRlLCBlbiB2b3VzIGTDqXNpZ25hbnQgY29tbWUgXFxcInBhcnJhaW5cXFwiLlwiLFxuICAgIG1haWxEZWxldGVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciBjb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMgc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIGNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgc3VwcHJlc3Npb24gbidlc3QgcGFzIHZhbGlkZSBvdSBhbG9ycyBpbCBhIGV4cGlyw6kuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtNZXNzYWdlOiBcIlZvdHJlIGRlbWFuZGUgZGUgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS4gTWVyY2kgZGUgY2xpcXVlciBzYW5zIHRhcmRlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwgcG91ciBjb25maXJtZXIuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtPa01lc3NhZ2U6IFwiVm90cmUgY29tcHRlIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuIE1lcmNpIGQnYXZvaXIgdXRpbGlzw6kgbm9zIHNlcnZpY2VzLlwiLFxuICAgIG1haWxEZWxldGVMaW5rVHh0IDogXCJDb25maXJtZXIuXCIsXG4gICAgbWFpbERlbGV0ZVN1YmplY3QgOiBcIkNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+XCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua01lc3NhZ2UgOiBcIlVuIGxpZW4gZGUgY29ubmV4aW9uIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSBlLW1haWwuIE5lIHRhcmRleiBwYXMgw6AgbCd1dGlsaXNlciwgY2FyIGlsIG4nZXN0IHZhbGFibGUgcXVlIGR1cmFudCAqVElNSU5HKiAhXCIsXG4gICAgbWFpbExvZ2luTGlua1N1YmplY3QgOiBcIlZvdHJlIGxpZW4gZGUgY29ubmV4aW9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtUeHQgOiBcIk1lIGNvbm5lY3Rlci5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMsIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLjxicj5TaSBkYW5zIGwnYXZlbmlyIGNldHRlIHBlcnNvbm5lIHNvdXNjcml0IHVuIGFib25uZW1lbnQgcHLDqW1pdW0sIHZvdHJlIHByb3ByZSBhYm9ubmVtZW50IHNlcmEgcHJvbG9uZ8OpIGRlIDMwIGpvdXJzLjwvcD48cD5FbmNvcmUgbWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5HcsOiY2Ugw6Agdm91cywgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuXFxuU2kgZGFucyBsJ2F2ZW5pciBjZXR0ZSBwZXJzb25uZSBzb3VzY3JpdCB1biBhYm9ubmVtZW50IHByw6ltaXVtLCB2b3RyZSBwcm9wcmUgYWJvbm5lbWVudCBzZXJhIHByb2xvbmfDqSBkZSAzMCBqb3Vycy5cXG5FbmNvcmUgbWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckxpbmtUeHQgOiBcIk1lIGNvbm5lY3RlciDDoCBtb24gY29tcHRlLlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlclN1YmplY3QgOiBcIk1lcmNpICFcIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCBjbGlxdWV6IHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMgc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlLW1haWwgZXQvb3UgbW90IGRlIHBhc3NlKSBldCA8Yj52b3VzIGRldmV6IGNsaXF1ZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmVzIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgKE5FV19FTUFJTCkgcG91ciB2YWxpZGVyIGNlIGNoYW5nZW1lbnQ8L2I+Ljxicj5FbiBhdHRlbmRhbnQsIG1lcmNpIGRlIGNvbnRpbnVlciDDoCB1dGlsaXNlciB2b3MgYW5jaWVucyBpZGVudGlmaWFudHMuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luTGlua1R4dCA6IFwiVmFsaWRlci5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2U6IFwiTGEgbWlzZSDDoCBqb3VyIGRlIHZvcyBpZGVudGlmaWFudHMgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5TdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgZXQgY29tcGzDqXRlciB2b3RyZSBpbnNjcmlwdGlvbiwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIGRhbnMgbGVzIDI0aC48L3A+XCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciBldCBjb21wbMOpdGVyIHZvdHJlIGluc2NyaXB0aW9uLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb25cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtUeHQgOiBcIlZhbGlkZXIgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0IEggc3VyIGxlIGxpZW4gZGUgY29uZmlybWF0aW9uIHF1aSB2aWVudCBkJ8OqdHJlIGVudm95w6kgw6Agdm90cmUgYWRyZXNzZSBlLW1haWwgKCNFTUFJTCkuXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm91cyB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLiBNZXJjaSBldCBiaWVudmVudWUgITxicj48YnI+U2kgdm91cyBhdmV6IGxhIG1vaW5kcmUgcXVlc3Rpb24gb3Ugc3VnZ2VzdGlvbiBjb25jZXJuYW50IE5PTV9TSVRFLCBuJ2jDqXNpdGV6IHBhcyDDoCBtZSBjb250YWN0ZXIgZW4gw6ljcml2YW50IMOgIDxiPkVNQUlMPC9iPi48YnI+PGJyPkplIHZvdXMgY29uc2VpbGxlIGQnYWlsbGV1cnMgZCdham91dGVyIDxiPkVNQUlMPC9iPiDDoCB2b3RyZSBjYXJuZXQgZCdhZHJlc3NlcyA8Yj5wb3VyIMOpdml0ZXIgcXVlIGxlcyBwcm9jaGFpbnMgZW52b2lzIGRlIE5PTV9TSVRFIG4nYXJyaXZlbnQgZW4gPGk+c3BhbTwvaT48L2I+Ljxicj48YnI+UGFyIGFpbGxldXJzLCBwb3VyIGfDqXJlciB2b3RyZSBhYm9ubmVtZW50LCBhY2PDqWRlciDDoCB2b3MgaW5mb3JtYXRpb25zIG91IGVuY29yZSBjaGVyY2hlciBwbHVzIGZhY2lsZW1lbnQgcGFybWkgbGUgY29udGVudSBkdSBzaXRlLCB2b3VzIHBvdXZleiDDoCB0b3V0IG1vbWVudCB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUgdXRpbGlzYXRldXIuPGJyPjxicj5Qb3VyIGNlIGZhaXJlLCB1dGlsaXNleiBsZSBsaWVuIGNpLWRlc3NvdXMuPGJyPjxicj7DgCBiaWVudMO0dCBzdXIgTk9NX1NJVEUuXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Wb3VzIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuIE1lcmNpIGV0IGJpZW52ZW51ZSAhXFxuXFxuU2kgdm91cyBhdmV6IGxhIG1vaW5kcmUgcXVlc3Rpb24gb3Ugc3VnZ2VzdGlvbiBjb25jZXJuYW50IE5PTV9TSVRFLCBuJ2jDqXNpdGV6IHBhcyDDoCBtZSBjb250YWN0ZXIgZW4gw6ljcml2YW50IMOgIEVNQUlMLlxcblxcbkplIHZvdXMgY29uc2VpbGxlIGQnYWlsbGV1cnMgZCdham91dGVyIEVNQUlMIMOgIHZvdHJlIGNhcm5ldCBkJ2FkcmVzc2VzIHBvdXIgw6l2aXRlciBxdWUgbGVzIHByb2NoYWlucyBlbnZvaXMgZGUgTk9NX1NJVEUgbidhcnJpdmVudCBlbiBcXFwic3BhbVxcXCIuXFxuXFxuUGFyIGFpbGxldXJzLCBwb3VyIGfDqXJlciB2b3RyZSBhYm9ubmVtZW50LCBhY2PDqWRlciDDoCB2b3MgaW5mb3JtYXRpb25zIG91IGVuY29yZSBjaGVyY2hlciBwbHVzIGZhY2lsZW1lbnQgcGFybWkgbGUgY29udGVudSBkdSBzaXRlLCB2b3VzIHBvdXZleiDDoCB0b3V0IG1vbWVudCB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUgdXRpbGlzYXRldXIuXFxuXFxuUG91ciBjZSBmYWlyZSwgdXRpbGlzZXogbGUgbGllbiBzdWl2YW50IDogTElOS19VUkxcXG5cXG7DgCBiaWVudMO0dCBzdXIgTk9NX1NJVEUuXCIsXG4gICAgbWFpbFdlbGNvbWVMaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIgw6AgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsV2VsY29tZVN1YmplY3QgOiBcIkJpZW52ZW51ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBuZWVkQ2hvb3NlTG9naW5XYXk6IFwiVm91cyBkZXZleiBzb2l0IHNhaXNpciB2b3RyZSBtb3QgZGUgcGFzc2UsIHNvaXQgY29jaGVyIGxhIGNhc2Ugdm91cyBwZXJtZXR0YW50IGRlIHJlY2V2b2lyIHVuIGxpZW4gZGUgY29ubmV4aW9uIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZEVtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB2b3RyZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRMb25nUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlIGQnYXUgbW9pbnMgTUlOX0xFTkdUSCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkTWF4VGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBham91dGVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDg0MC5cIixcbiAgICBuZWVkTWluVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBlbmxldmVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDcyMC5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkU01UUCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkU01UUE5vdEZvdW5kIDogXCJJbCBtYW5xdWUgdW4gc2VydmV1ciBTTVRQIHZhbGlkZS5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiTWVyY2kgZCdhY2NlcHRlciBsZXMgQ0dVIHBvdXIgY3LDqWVyIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBuZWVkVW5pcXVlRW1haWw6IFwiTCdhZHJlc3NlIGUtbWFpbCBxdWUgdm91cyBhdmV6IHNhaXNpZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwb3VyIHVuIGNvbXB0ZSB1dGlsaXNhdGV1ci4gU2kgdm91cyBhdmV6IGTDqWrDoCB1biBjb21wdGUsIDxhIGhyZWY9Jy8jVVJMJz5jbGlxdWV6LWljaSBwb3VyIHZvdXMgY29ubmVjdGVyPC9hPi5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSBwb3V2b2lyIHZvdXMgY29ubmVjdGVyLiBQb3VyIGNlIGZhaXJlLCB1biBub3V2ZWF1IGxpZW4gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIDogXCJMYSBkYXRlIGRlIGRlcm5pw6hyZSBjb25uZXhpb24gbidlc3QgcGFzIHZhbGlkZS5cIixcbiAgICBwYXNzd29yZENvcGllZDogXCJMZSBtb3QgZGUgcGFzc2UgZ8OpbsOpcsOpIGEgw6l0w6kgY29wacOpIGRhbnMgbGUgcHJlc3NlLXBhcGllciBkZSB2b3RyZSBvcmRpbmF0ZXVyIChvdSBtb2JpbGUpLiBWb3VzIHBvdXZleiBsZSBcXFwiY29sbGVyXFxcIiBvw7kgdm91cyBsZSBzb3VoYWl0ZXouXCIsXG4gICAgc2VhcmNoVXNlcnNXaXRob3V0UmVzdWx0OiBcIkwndXRpbGlzYXRldXIgbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIHRvb01hbnlMb2dpbkZhaWxzIDogXCJEw6lzb2zDqSBtYWlzIGlsIHkgYSBldSB0cm9wIGRlIHRlbnRhdGl2ZXMgZGUgY29ubmV4aW9uIGluZnJ1Y3R1ZXVzZXMgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC4gVm91cyBkZXZleiBhdHRlbmRyZSBNSU5VVEVTIG1pbnV0ZXMgcG91ciBlc3NheWVyIGRlIG5vdXZlYXUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llLCBjYXIgZWxsZSBuJ2EgcGFzIHVuIGZvcm1hdCBjb3JyZWN0LlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyOiBcIkwndXRpbGlzYXRldXIgcXVlIHZvdXMgc291aGFpdGV6IG1vZGlmaWVyIG4nZXhpc3RlIHBhcy9wbHVzIG91IG4nYSBwYXMgZW5jb3JlIHZhbGlkw6kgc29uIGNvbXB0ZS5cIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIlZvcyBpbmZvcm1hdGlvbnMgb250IGJpZW4gw6l0w6kgbWlzZXMgw6Agam91ci5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLiBWb3VzIHBvdXZleiB2b3VzIHkgY29ubmVjdGVyIDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW46IFwiQ2UgY29tcHRlIGEgZMOpasOgIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgY29tcHRlIHZpZW50IGJpZW4gZCfDqnRyZSB2YWxpZMOpLiBNZXJjaSBldCBiaWVudmVudWUgITxicj5Wb3VzIHBvdXZleiBjb21wbMOpdGVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgdm90cmUgYWJvbm5lbWVudCBjaS1kZXNzb3VzLlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlQWRtaW46IFwiTGUgY29tcHRlIGEgYmllbiDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIHdlbGNvbWVNZXNzYWdlOiBcIkJpZW52ZW51ZSAjTkFNRSAhXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIuKAplwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxuXG4gICAgLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4gICAgLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG4gICAgc3RhdGljIGdldFBhc3N3b3JkIChuYkNhck1pbiwgbmJDYXJNYXgpXG4gICAge1xuICAgICAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgICAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgICAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICAgICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgICAgICB9XG4gICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgICAgICByZXR1cm4gcGFzc3dvcmQ7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmh0bWxcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCLDgCBwcm9wb3NcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2EtcHJvcG9zLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiIH0gfSxcbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlUuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5WLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d2Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgIF0sXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2U6IDEwLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhICgqKSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwYXJ0YWfDqSBzdXIgV2lraUxlcm5pIHNvbnQgbGlicmVzLjxicj5Wb3VzIHBvdXZleiBsZXMgdXRpbGlzZXIsIGxlcyBtb2RpZmllciBldCBsZXMgZGlmZnVzZXIgc2Vsb24gdm90cmUgc291aGFpdC48YnI+U3VyIFdpa2lMZXJuaSwgcGFzIGRlIHB1YmxpY2l0w6ksIG5pIGRlIGNvbW1lcmNpYWxpc2F0aW9uIGRlIHZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMuPGJyPlZvdXMgcG91dmV6IHZlbmlyIHkgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIgZW4gdG91dGUgdHJhbnF1aWxsaXTDqS48YnI+PGJyPjxzbWFsbD48ZW0+KCopIEJpZW4gcXVlIHBhcnRhZ2VhbnQgc2VzIHZhbGV1cnMsIFdpa2lMZXJuaSBlc3QgdW4gcHJvamV0IGluZMOpcGVuZGFudCBkZSBsYSBmb25kYXRpb24gV2lraXDDqWRpYS48L2VtPjwvc21hbGw+XCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNUaXRsZTogXCJMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiTGlzdGUgZGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmkuXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5pID9cIixcbiAgICBleHBsYW5hdGlvblR4dDogXCJMZSBwcmluY2lwZSBlc3Qgc2ltcGxlIDogdm91cyBjb21tZW5jZXogcGFyIGxpcmUgbCdhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpLjxicj5QdWlzIHZvdXMgYWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlLiBWb3VzIG9idGVuZXogYWxvcnMgdm90cmUgcsOpc3VsdGF0IGltbcOpZGlhdGVtZW50Ljxicj48YnI+VG91dGVzIGxlcyByw6lwb25zZXMgc2UgdHJvdXZlbnQgZGFucyBsJ2FydGljbGUgcHJvcG9zw6kgw6AgbGEgbGVjdHVyZS4gPGI+Vm91cyDDqnRlcyBpY2kgcG91ciBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3NlczwvYj4sIG1haXMgbGlicmUgw6Agdm91cyBkJ2Vzc2F5ZXIgZCd5IHLDqXBvbmRyZSBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlF1YW5kIGxlIHN1amV0IHMneSBwcsOqdGUsIG5lIHZvdXMgw6l0b25uZXogcGFzIHNpIGNlcnRhaW5lcyBkZXMgcsOpcG9uc2VzIHByb3Bvc8OpZXMgcGV1dmVudCDDqnRyZSB1biBwZXUgZMOpY2Fsw6llcywgYWJzdXJkZXMuLi4gT24gcGV1dCBhcHByZW5kcmUgYXZlYyBsZSBzb3VyaXJlLCBub24gPyA6LSk8YnI+PGJyPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuPGJyPkNlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSB0ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IHBsdXNpZXVycyBqb3Vycywgc2VtYWluZXMsIG1vaXMuLi4gRXQgZGUgcmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBzdWdnZXN0aW9ucyBkZSBsZWN0dXJlcy48YnI+PGJyPk1haXMgPGI+bGEgY3LDqWF0aW9uIGRlIGNlIGNvbXB0ZSBlc3QgZmFjdWx0YXRpdmU8L2I+IGV0IDxhIGhyZWY9Jy9xdWl6cy8nIHRpdGxlPSdMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMnPnZvdXMgcG91dmV6IHBhcmNvdXJpciBXaWtpTGVybmkgbGlicmVtZW50PC9hPi5cIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxuICAgIHRhZ3NMaXN0VHh0OiBcIlBhcmNvdXJpciBsZXMgcnVicmlxdWVzIDpcIixcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIGxpZW5zIGRlIGwnaW50ZXJmYWNlXG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQ29udGFjdFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29udGFjdC5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiUGFyY291cmlyXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9xdWl6cy9cIiwgaWQ6XCJpbmRleEhlYWRMaW5rXCIsIHRpdGxlOlwiTGVzIGRlcm5pw6hyZXMgcHVibGljYXRpb25zXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaHRtbFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiwgdGl0bGU6XCJBY2PDqWRlciBvdSBjcsOpZXogdm90cmUgY29tcHRlIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIsIHRpdGxlOlwiRW4gc2F2b2lyICsgc3VyIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIsIHRpdGxlOlwiUGFnZSBkJ2FjY3VlaWxcIiB9IH1cbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkJsb2dcIiwgYXR0cmlidXRlczogeyBocmVmOlwiaHR0cHM6Ly9mcmFtYXNwaGVyZS5vcmcvcGVvcGxlLzdlNTRiN2EwYjUzMjAxMzg5ZWVmMmEwMDAwMDUzNjI1XCIsIHRpdGxlOlwiTGUgYmxvZyBXaWtpTGVybmkgc3VyIGRpYXNwb3JhKlwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiLCB0aXRsZTpcIlF1aSBhIGNyw6nDqSBXaWtpTGVybmkgPyBRdWVscyBzb250IHZvcyBkcm9pdHMgP1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIsIHRpdGxlOlwiVm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcyBzdXIgV2lraUxlcm5pXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDR1YgJiBDR1VcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL0NHVi1DR1UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH1cbiAgICBdLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgYWJvdXRQYWdlOiBcImEtcHJvcG9zLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlOiBcImFkbWluLmh0bWxcIixcbiAgICBjZ3VQYWdlOiBcIkNHVi1DR1UuaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGRlbGV0ZUxpbmtQYWdlIDogXCJhdXJldm9pci5odG1sP3Q9XCIsXG4gICAgbG9naW5MaW5rUGFnZSA6IFwibG9naW4uaHRtbD90PVwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgbmV3TG9naW5MaW5rUGFnZSA6IFwibmV3bG9naW4uaHRtbD90PVwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsICAgIFxuICAgIHN0b3BNYWlsUGFnZSA6IFwic3RvcC1tYWlsLmh0bWw/dD1cIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgdXBkYXRlQWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIHVzZXJIb21lUGFnZVR4dCA6IFwiTWEgcGFnZSBkJ2FjY3VlaWwuXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgdmFsaWRhdGlvbkxpbmtQYWdlIDogXCJ2YWxpZGF0aW9uLmh0bWw/dD1cIixcbiAgICAvKiBUZXh0ZXMgKGfDqW7DqXJhbCkgKi9cbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG4gICAgbWFpbFJlY2lwaWVudFR4dDogXCJNZXNzYWdlIGVudm95w6kgw6AgOlwiLFxuICAgIGxpY2VuY2VUeHQ6IFwiQGNvcHlsZWZ0IExlIGNvbnRlbnUgZGUgV2lraUxlcm5pIDxhIGhyZWY9XFxcIi9jcmVkaXRzLmh0bWxcXFwiIHRpdGxlPVxcXCJFbiBzYXZvaXIgcGx1cyA/XFxcIj5lc3QgbGlicmU8L2E+IGV0IHZvdXMgZXN0IG9mZmVydCBzYW5zIHB1YmxpY2l0w6kuIFZvdXMgcG91dmV6IDxhIGhyZWY9XFxcIi9wYXJ0aWNpcGVyLWZpbmFuY2VtZW50Lmh0bWxcXFwiIHRpdGxlPVxcXCJGaW5hbmNlbWVudCBwYXJ0aWNpcGF0aWYgYXZlYyBjb250cmUtcGFydGllc1xcXCI+cGFydGljaXBlciDDoCBzb24gZmluYW5jZW1lbnQgZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICAvKiBQYWdlIGQnYWNjdWVpbCAqL1xuICAgIGhvbWVQYWdlVHh0OiBcIlBhZ2UgZCdhY2N1ZWlsXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCI8Yj5BdmVjIFdpa2lMZXJuaSwgdm91cyBhcHByZW5leiByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIGNob3NlczwvYj4uPGJyPlZvdXMgcmVjZXZleiBkZSBjb3VydHMgYXJ0aWNsZXMsIGxpc2libGVzIGVuIHF1ZWxxdWVzIG1pbnV0ZXMuPGJyPkRlcyBxdWl6cyB2b3VzIHBlcm1ldHRlbnQgZW5zdWl0ZSBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgYXZleiByZXRlbnUuPGJyPkRlIGpvdXIgZW4gam91ciA8Yj5kZSBub3V2ZWxsZXMgZ3JhaW5lcyBkZSBjdWx0dXJlIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIGphcmRpbjwvYj4uXCIsXG4gICAgaG9tZVRpdGxlMjogXCJMYSBjdWx0dXJlIGfDqW7DqXJhbGUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiPGI+UGFzIGRlIGZhaXRzIGFsdGVybmF0aWZzPC9iPiwgdG91cyBsZXMgY29udGVudXMgc29udCA8Yj5zb3VyY8OpcyBwYXIgZGVzIGFydGljbGVzIFdpa2lww6lkaWE8L2I+Ljxicj5FdCB0b3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhLCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHB1Ymxpw6kgc3VyIFdpa2lMZXJuaSA8YSBocmVmPVxcXCIvY3JlZGl0cy5odG1sXFxcIiB0aXRsZT1cXFwiRW4gc2F2b2lyIHBsdXMgc3VyIGNlIHN1amV0XFxcIj5zb250IHBhcnRhZ8OpcyBzb3VzIGxpY2VuY2VzIGxpYnJlczwvYT4uPGJyPkxlIHRvdXQgc2FucyBwdWJsaWNpdMOpLCBuaSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMuPGJyPjxiPlN1ciBXaWtpTGVybmksIHZvdXMgY3VsdGl2ZXogdm90cmUgamFyZGluIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPC9iPlwiLFxuICAgIGhvbWVCdG5BYm91dFR4dDogXCJFbiBzYXZvaXIgcGx1cyBzdXIgV2lraUxlcm5pID9cIixcbiAgICBob21lQnRuU3Vic2NyaWJlVHh0OiAgXCJUZXN0ZXogV2lraUxlcm5pXCIsXG4gICAgaG9tZVN1YmNyaXB0aW9uRm9ybVRpdGxlOiAgXCJSZWNldmV6IGxlcyBwcm9jaGFpbnMgYXJ0aWNsZXMgV2lraUxlcm5pXCIsXG4gICAgLyogUGFnZSBkZXJuacOocmVzIHB1YmxpY2F0aW9ucy4uLiAqLyAgIFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiQ3VsdHVyZSBnw6luw6lyYWxlIC0gYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiV2lraUxlcm5pIDogdGVzdGV6IHZvcyBjb25uYWlzc2FuY2VzIGV0IGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmkuXCIsXG4gICAgbmV3c0xpc3RUaXRsZTogXCI8cD48Yj5BdmVjIFdpa2lMZXJuaSwgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBxdWVscXVlIGNob3NlIGRlIG5vdXZlYXU8L2I+PGJyPlNpIGRlc3NvdXMgbGVzIGRlcm5pw6hyZXMgcHVibGljYXRpb25zLiBWb3VzIHBvdXZleiBhdXNzaSA8YSBocmVmPScvcXVpenMvdGhlbWVzLmh0bWwnPnBhcmNvdXJpciBsZSBzaXRlIHBhciB0aMOobWVzIG91IG1vdHMtY2zDqXM8L2E+LjwvcD5cIixcbiAgICAvKiBQbGFuIGR1IHNpdGUsIGxpc3RlIGRlcyB0YWdzICovICAgXG4gICAgdGFnTGlzdFRpdGxlOiBcIkN1bHR1cmUgZ8OpbsOpcmFsZSAtIGRlcyBhcnRpY2xlcyBldCBxdWl6cyBzdXIgZGUgbm9tYnJldXggdGjDqG1lcyAhXCIsXG4gICAgdGFnTGlzdE1ldGFEZXNjOiBcIldpa2lMZXJuaSA6IGTDqWNvdXZyaXIgbGVzIGRpZmbDqXJlbnRzIHRow6htZXMgYWJvcmTDqXMgcGFyIFdpa2lMZXJuaS4gSW54ZXggZHUgc2l0ZS5cIixcbiAgICB0YWdMaXN0SW50cm86IFwiPGgzPkF2ZWMgV2lraUxlcm5pLCBkZXZlbmV6IGZvcnQgZW4gdGjDqG1lcy4uLiBPdWkgbWFpcyBxdWVscyB0aMOobWVzID8gOik8L2gzPjxibG9ja3F1b3RlPkFyaXN0b3Rl4oCvOiDCq+KAr0zigJlob21tZSBhIG5hdHVyZWxsZW1lbnQgbGEgcGFzc2lvbiBkZSBjb25uYcOudHJl4oCm4oCvwrs8L2Jsb2NrcXVvdGU+XCIsXG4gICAgLyogUGFnZSBxdWl6cyAqL1xuICAgIGFuc3dlcnNFeHBsYW5hdGlvbnNMaW5rVGV4dDogXCJSZWxpcmVcIixcbiAgICBxdWl6RWxlbWVudExpbmtzSW50cm86IFwiRW4gc2F2b2lyIHBsdXNcIixcbiAgICBxdWl6RWxlbWVudFN1YmNyaXB0aW9uRm9ybVRpdGxlOiBcIlJlY2V2ZXogbGVzIHByb2NoYWlucyBhcnRpY2xlcyBXaWtpTGVybmlcIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmnigK8/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiPHA+TGUgcHJpbmNpcGUgZXN0IHNpbXBsZeKArzogPGI+dm91cyBjb21tZW5jZXogcGFyIGxpcmUgbOKAmWFydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6k8L2I+LiBQdWlzIHZvdXMgPGI+YWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlPC9iPi4gU3VpdmFudCBsZXMgcXVlc3Rpb25zLCA8Yj51bmUgb3UgcGx1c2lldXJzIHLDqXBvbnNlcyBwZXV2ZW50IMOqdHJlIGNvcnJlY3RlczwvYj4gZXQgZG9pdmVudCBkb25jIMOqdHJlIGNvY2jDqWVzLiBD4oCZZXN0IHRvdWpvdXJzIDxiPmxlIGNvbnRlbnUgZGUgbOKAmWFydGljbGUgV2lraXDDqWRpYSBxdWkgZmFpdCBmb2k8L2I+IGNvbmNlcm5hbnQgbGVzIMKr4oCvYm9ubmVz4oCvwrsgcsOpcG9uc2VzLiBD4oCZZXN0IHVuZSBmYcOnb24gZGUgdGVzdGVyIMOgIGxhIGZvaXMgdm90cmUgY2FwYWNpdMOpIGTigJlhdHRlbnRpb24gZXQgdm90cmUgbcOpbW9pcmUuIExlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHBldXZlbnQgw6l2b2x1ZXIsIGRvbmMgbuKAmWjDqXNpdGV6IHBhcyA8YSBocmVmPScvY29udGFjdC5odG1sJz7DoCBtZSBzaWduYWxlciB1bmUgZXJyZXVyPC9hPi48L3A+PHA+PGI+V2lraUxlcm5pIHZvdXMgcHJvcG9zZSBk4oCZYXV0cmVzIHNvbHV0aW9ucyBwb3VyIGFtw6lsaW9yZXIgdm90cmUgY3VsdHVyZSBnw6luw6lyYWxlPC9iPi4gUG91ciBlbiBzYXZvaXIgcGx1cywgY2xpcXVleiBzdXIgbGUgYm91dG9uIGNpLWRlc3NvdXMuPC9wPlwiLFxuICAgIGV4cGxhbmF0aW9uRWxlbWVudFR4dDogXCI8cD5XaWtpTGVybmkgdm91cyBwcm9wb3NlIGRlIDxiPnJlY2V2b2lyIHBhciBlLW1haWwgw6AgbGEgZnLDqXF1ZW5jZSBjaG9pc2llLCBkZSBjb3VydHMgYXJ0aWNsZXMgbGlzaWJsZXMgZW4gcXVlbHF1ZXMgbWludXRlczwvYj4gZXQgcG9ydGFudCBzdXIgZGVzIHN1amV0cyB0csOocyB2YXJpw6lzIGRlIDxiPmN1bHR1cmUgZ8OpbsOpcmFsZTwvYj4gKGFydHMsIGhpc3RvaXJlLCBsaXR0w6lyYXR1cmUsIHNjaWVuY2VzLCBldGMuKS48L3A+PHA+Q2VzIGFydGljbGVzIHNvbnQgYmFzw6lzIHN1ciA8Yj51bmUgb3UgcGx1c2lldXJzIHBhZ2VzIGRlIFdpa2lww6lkaWE8L2I+IChmb3VybmllcyBlbiBsaWVuKSwgZG9udCA8Yj5pbHMgZXh0cmFpZW50IGNlcnRhaW5lcyBpbmZvcm1hdGlvbnM8L2I+LjwvcD48cD5DaGFxdWUgc8OpcmllIGTigJlhcnRpY2xlcyBlc3QgPGI+c3VpdmllIGTigJl1biBxdWl6PC9iPiBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48L3A+PHA+PGI+Vm91cyBhcHByZW5leiBhaW5zaSByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIGNob3NlczwvYj4gdHLDqHMgc2ltcGxlbWVudC48L3A+XCIsXG4gICAgLyogQXV0cmVzICovXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHR3aXR0ZXJBY2NvdW50OiBcIldpa2lMZXJuaVwiLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMixcbiAgICBtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZTogMyxcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMyxcbn07IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9pbGx1c3RyYXRpb25cIjogXCIuLi9sYW5nL2ZyL2lsbHVzdHJhdGlvbi5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2lsbHVzdHJhdGlvbiRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvbGlua1wiOiBcIi4uL2xhbmcvZnIvbGluay5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2xpbmskXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3F1ZXN0aW9uXCI6IFwiLi4vbGFuZy9mci9xdWVzdGlvbi5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3F1ZXN0aW9uJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9xdWVzdGlvbm5haXJlXCI6IFwiLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvcXVlc3Rpb25uYWlyZSRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIixcblx0XCIuL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgZGVmaW5pdGlvbikge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvLyAtLSBHRVNUSU9OIERVIEZPUk1VTEFJUkUgUEVSTUVUVEFOVCBERSBTQUlTSVIgLyDDiURJVEVSIExFUyBRVUlaUyBFVCBMRVVSUyBEw4lQRU5EQU5DRVMgKExJRU5TLCBJTUFHRVMsIFRBR1MsIEVUQy4pXG5cbi8vLyBWw6lyaWZpZSBxdWUgbCd1dGlsaXNhdGV1ciBlc3QgYmllbiBjb25uZWN0w6ksIGEgbGUgYm9uIHN0YXR1dCBldCBsZSByZWRpcmlnZSB2ZXJzIGxlIGZvcm11bGFpcmUgZCdpbnNjcmlwdGlvbiBzaSBjZSBuJ2VzdCBwYXMgbGUgY2FzLlxuLy8vIFNpIGMnZXN0IG9rLCBwcm9wb3NlIHVuIG1vdGV1ciBkZSByZWNoZXJjaGUgcGVybWV0dGFudCBkZSBjaGVyY2hlciB1biBxdWl6XG4vLy8gU2kgdW4gaWQgZXN0IHBhc3PDqSBwYXIgbCd1cmwgb24gYWZmaWNoZSBsZXMgaW5mb3JtYXRpb25zIGR1IHF1aXogZGFucyB1biBmb3JtdWxhaXJlIHBlcm1ldHRhbnQgZGUgbCfDqWRpdGVyL3N1cHByaW1lciBhdmVjIHVuZSBsaXN0ZSBkZXMgw6lsw6ltZW50cyBsacOpcyAobGllbnMsIGlsbHVzdHJhdGlvbnMsIHF1ZXN0aW9ucy4uLikgcG91dmFudCBldXgtbcOqbWVzIMOqdHJlIMOpZGl0w6lzL3N1cHByaW3DqXMuXG4vLy8gU2kgbGUgbm9tYnJlIG1heCBjb25maWd1csOpIHBvdXIgY2hhY3VuIGRlIHNlcyDDqWzDqW1lbnRzIG4nZXN0IHBhcyBhdHRlaW50LCBpbCBlc3QgYXVzc2kgcHJvcG9zw6kgZCdham91dGVyIHVuIG5vdXZlbCDDqWzDqW1lbnQuXG4vLy8gU2kgcGFzIGQnaWQgcGFzc8OpIHBhciBsJ3VybCwgb24gYWZmaWNoZSB1biBmb3JtdWxhaXJlIHZpZGUgcGVybWV0dGFudCBkZSBzYWlzaXIgdW4gbm91dmVhdSBxdWl6LlxuXG4vLyBGaWNoaWVycyBkZSBjb25maWd1cmF0aW9uIDpcbmltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHRoZW1lIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIik7XG5jb25zdCBjb25maWdJbGx1c3RyYXRpb25zID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy9pbGx1c3RyYXRpb25zLmpzXCIpO1xuY29uc3QgY29uZmlnTGlua3MgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnL2xpbmtzLmpzXCIpO1xuY29uc3QgY29uZmlnUXVlc3Rpb25uYWlyZXMgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzXCIpO1xuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEZvbmN0aW9ucyA6XG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2LCB1cGRhdGVBY2NvdW50TGluayB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGVtcHlBbmRIaWRlRm9ybSwgZ2V0RGF0YXNGcm9tSW5wdXRzLCBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMgfSBmcm9tIFwiLi90b29scy9mb3Jtcy5qc1wiO1xuaW1wb3J0IHsgZGF0ZUZvcm1hdCwgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi90b29scy9tYWluXCI7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tIFwiLi90b29scy91cmwuanNcIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgeyBhZGRPa01lc3NhZ2UsIGRlbGV0ZUJ0blR4dCwgc2VydmVyRXJyb3IsIHVwZGF0ZUJ0blR4dCB9ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgeyBhZGRJbGx1c3RyYXRpb25UeHQsIGRlZmF1bHRBbHQsIGludHJvTm9JbGx1c3RyYXRpb24sIGludHJvVGl0bGVGb3JJbGx1c3RyYXRpb24gfSA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvaWxsdXN0cmF0aW9uXCIpO1xuY29uc3QgeyBhZGRMaW5rVHh0LCBkZWZhdWx0VmFsdWVGb3JMaW5rLCBpbnRyb05vTGluaywgaW50cm9UaXRsZUZvckxpbmsgfSA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvbGlua1wiKTtcbmNvbnN0IHsgYWRkUXVlc3Rpb25UeHQsIGludHJvTm9RdWVzdGlvbiwgaW50cm9UaXRsZUZvclF1ZXN0aW9uIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3F1ZXN0aW9uXCIpO1xuY29uc3QgeyBuZWVkR3JvdXBJZlJhbmssIG5leHREYXRlV2l0aG91dFF1ZXN0aW9ubmFpcmUsIG5leHRRdWVzdGlvbm5haXJlc0xpc3QsIHF1ZXN0aW9ubmFpcmVOZWVkQmVDb21wbGV0ZWQsIHNlYXJjaFF1ZXN0aW9ubmFpcmVXaXRoTm9SZXN1bHQgfSA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvcXVlc3Rpb25uYWlyZVwiKTtcbmNvbnN0IHsgbmVlZEJlQ29ubmVjdGVkIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBidG5OZXdRdWVzdGlvbm5haXJlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3YW50TmV3UXVlc3Rpb25uYWlyZVwiKTtcbmNvbnN0IGJ0blByZXZpZXdRdWVzdGlvbm5haXJlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwcmV2aWV3UXVlc3Rpb25uYWlyZVwiKTtcbmNvbnN0IGRlbGV0ZUNoZWNrQm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkZWxldGVPa0xhYmVsXCIpO1xuY29uc3QgZGl2Q3Jhc2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNyYXNoXCIpO1xuY29uc3QgZGl2SWxsdXN0cmF0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaWxsdXN0cmF0aW9uc0xpc3RcIik7XG5jb25zdCBkaXZMaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGlua3NMaXN0XCIpO1xuY29uc3QgZGl2TWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFpbi1jb250ZW50XCIpO1xuY29uc3QgZGl2TWVzc2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWVzc2FnZVwiKTtcbmNvbnN0IGRpdlF1ZXN0aW9ubmFpcmVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbm5haXJlc0xpc3RcIik7XG5jb25zdCBkaXZRdWVzdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9uc0xpc3RcIik7XG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5jb25zdCBkaXZTZWFyY2hSZXN1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNlYXJjaFJlc3VsdFwiKTtcbmNvbnN0IGZvcm1MaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJsaW5rc1wiKTtcbmNvbnN0IGZvcm1JbGx1c3RyYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlsbHVzdHJhdGlvbnNcIik7XG5jb25zdCBmb3JtUXVlc3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9uc1wiKTtcbmNvbnN0IGZvcm1RdWVzdGlvbm5haXJlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbm5haXJlc1wiKTtcbmNvbnN0IGZvcm1TZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNlYXJjaFwiKTtcbmNvbnN0IGhlbHBDbGFzc2lmaWNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVscENsYXNzaWZpY2F0aW9uXCIpO1xuY29uc3QgaGVscEdyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoZWxwR3JvdXBcIik7XG5jb25zdCBoZWxwUHVibGlzaGluZ0F0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoZWxwUHVibGlzaGluZ0F0XCIpO1xuY29uc3QgaW5wdXRDbGFzc2lmaWNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2xhc3NpZmljYXRpb25cIik7XG5jb25zdCBpbnB1dEdyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJncm91cFwiKTtcbmNvbnN0IGlucHV0UmFua0luR3JvdXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJhbmtJbkdyb3VwXCIpO1xuXG4vLyBWaWRlIGV0IGNhY2hlIHRvdXMgbGVzIGZvcm11bGFpcmVzIGFubmV4ZXMgYXUgcXVlc3Rpb25uYWlyZSA6XG5jb25zdCBoaWRlQWxsRm9ybXMgPSAoKSA9Plxue1xuICAgIGVtcHlBbmRIaWRlRm9ybShmb3JtTGluayk7XG4gICAgaWYoZGVmYXVsdFZhbHVlRm9yTGluayE9MClcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhbmNob3JcIikudmFsdWU9ZGVmYXVsdFZhbHVlRm9yTGluaztcbiAgICBlbXB5QW5kSGlkZUZvcm0oZm9ybUlsbHVzdHJhdGlvbik7XG4gICAgZW1weUFuZEhpZGVGb3JtKGZvcm1RdWVzdGlvbik7XG59XG5cbi8vIEFmZmljaGUgbGVzIGRvbm7DqWVzIGQndW4gbGllbiBkYW5zIGxlIGZvcm11bGFpcmUgYWRob2MgOlxuY29uc3Qgc2hvd0Zvcm1MaW5rSW5mb3MgPSAoTGluaykgPT5cbntcbiAgICAvLyBPbiBjb21tZW5jZSBwYXIgY2FjaGVyIGV0IHZpZGVyIHRvdXMgbGVzIGZvcm11bGFpcmVzIGFubmV4ZXNcbiAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAvLyBQdWlzIG9uIGFmZmljaGUgY2VsdWkgY29uY2VybsOpXG4gICAgZm9ybUxpbmsuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgLy8gKyBMZXMgY29udHJhaW50ZXMgZGUgY2hhbXAgJiB2YWxldXJzIHBhciBkw6lmYXV0IDpcbiAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnTGlua3MuTGluaywgZm9ybUxpbmspO1xuICAgIGZvcihsZXQgZGF0YSBpbiBMaW5rKVxuICAgIHtcbiAgICAgICAgaWYoZm9ybUxpbmsuZWxlbWVudHNbZGF0YV0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICBmb3JtTGluay5lbGVtZW50c1tkYXRhXS52YWx1ZT1MaW5rW2RhdGFdO1xuICAgIH1cbn1cblxuLy8gQWZmaWNoZSBsZXMgaW5mb3MgY29ubnVlcyBjb25jZXJuYW50IGxlcyBsaWVucyBkdSBxdWVzdGlvbm5haXJlIGFmZmljaMOpIDpcbmNvbnN0IHNob3dMaW5rSW5mb3MgPSAoTGlua3MsIHRva2VuKSA9Plxue1xuICAgIGFkZEVsZW1lbnQoZGl2TGlua3MsIFwiaDJcIiwgaW50cm9UaXRsZUZvckxpbmspO1xuICAgIGxldCBsaXN0TGlua3M9XCJcIjtcbiAgICBmb3IobGV0IGkgaW4gTGlua3MpXG4gICAgICAgIGxpc3RMaW5rcys9XCI8bGk+PGEgaHJlZj0nXCIrTGlua3NbaV0udXJsK1wiJyB0YXJnZXQ9J19ibGFuayc+XCIrTGlua3NbaV0uYW5jaG9yK1wiPC9hPjxicj48YSBocmVmPScjdXBkYXRlTGlua1wiK0xpbmtzW2ldLmlkK1wiJyBpZD0nI3VwZGF0ZUxpbmtcIitMaW5rc1tpXS5pZCtcIicgY2xhc3M9J2J1dHRvbicgPlwiK3VwZGF0ZUJ0blR4dCtcIjwvYT4gPGEgaHJlZj0nI2RlbGV0ZUxpbmtcIitMaW5rc1tpXS5pZCtcIicgaWQ9JyNkZWxldGVMaW5rXCIrTGlua3NbaV0uaWQrXCInIGNsYXNzPSdidXR0b24nID5cIitkZWxldGVCdG5UeHQrXCI8L2E+PC9saT5cIjtcbiAgICBpZihsaXN0TGlua3M9PT1cIlwiKVxuICAgICAgICBsaXN0TGlua3M9XCI8bGk+XCIraW50cm9Ob0xpbmsrXCI8L2xpPlwiO1xuICAgIGFkZEVsZW1lbnQoZGl2TGlua3MsIFwidWxcIiwgbGlzdExpbmtzLCBcIlwiLCBbXSwgXCJcIiwgZmFsc2UpOy8vICEgw6AgaW50w6lncmVyIGQnYWJvcmQgZGFucyBsZSBET00gcG91ciBwb3V2b2lyIGFqb3V0ZXIgbGVzIExpc3RlbmVycyBlbnN1aXRlXG4gICAgZm9yKGxldCBpIGluIExpbmtzKVxuICAgIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjdXBkYXRlTGlua1wiK0xpbmtzW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgc2hvd0Zvcm1MaW5rSW5mb3MoTGlua3NbaV0pO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNsaW5rc1wiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI2RlbGV0ZUxpbmtcIitMaW5rc1tpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHNob3dGb3JtTGlua0luZm9zKExpbmtzW2ldKTtcbiAgICAgICAgICAgIGZvcm1MaW5rLmVsZW1lbnRzW1wiZGVsZXRlT2tcIl0udmFsdWU9dHJ1ZTtcbiAgICAgICAgICAgIHNlbmRMaW5rRm9ybSh0b2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZihMaW5rcy5sZW5ndGggPCBjb25maWcubmJMaW5rc01heCB8fCBjb25maWcubmJMaW5rc01heCA9PT0gMClcbiAgICB7XG4gICAgICAgIGxldCBuZXdCdG49XCI8YSBocmVmPScjbmV3TGluaycgaWQ9J25ld0xpbmsnIGNsYXNzPSdidXR0b24nPlwiK2FkZExpbmtUeHQrXCI8L2E+XCI7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2TGlua3MsIFwicFwiLCBuZXdCdG4sIFwiXCIsIFtdLCB7IH0sIGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJuZXdMaW5rXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgIGZvcm1MaW5rLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgZm9ybUxpbmsuZWxlbWVudHNbXCJRdWVzdGlvbm5haXJlSWRcIl0udmFsdWU9Zm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbXCJpZFwiXS52YWx1ZTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjbGlua3NcIik7XG4gICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnTGlua3MsIGZvcm1MaW5rKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vLyBFbnZvaSBkZXMgZG9ubsOpZXMgZCd1biBsaWVuLlxuY29uc3Qgc2VuZExpbmtGb3JtID0gKHRva2VuKSA9Plxue1xuICAgIGNvbnN0IGRpdlJlc3BvbnNlTGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlTGlua1wiKTtcbiAgICBkaXZSZXNwb25zZUxpbmsuaW5uZXJIVE1MPVwiXCI7XG4gICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtTGluayk7XG4gICAgY29uc3QgeGhyTGlua0RhdGFzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgaWYoIWlzRW1wdHkoZGF0YXMuaWQpICYmICghaXNFbXB0eShkYXRhcy5kZWxldGVPaykpKVxuICAgICAgICB4aHJMaW5rRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnTGlua3MubGlua3NSb3V0ZStkYXRhcy5pZCk7XG4gICAgZWxzZSBpZighaXNFbXB0eShkYXRhcy5pZCkpXG4gICAgICAgIHhockxpbmtEYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWdMaW5rcy5saW5rc1JvdXRlK2RhdGFzLmlkKTtcbiAgICBlbHNlXG4gICAgICAgIHhockxpbmtEYXRhcy5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnTGlua3MubGlua3NSb3V0ZSk7XG4gICAgeGhyTGlua0RhdGFzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgaWYgKCh0aGlzLnN0YXR1cyA9PT0gMjAwIHx8IHRoaXMuc3RhdHVzID09PSAyMDEpICYmIHJlc3BvbnNlLm1lc3NhZ2UhPXVuZGVmaW5lZCAmJiByZXNwb25zZS5xdWVzdGlvbm5haXJlIT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBzaG93TGlua0luZm9zKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmUuTGlua3MsIHRva2VuKTsvLyBsZSBzZXJ2ZXVyIHJldG91cm5lIHVuZSB2ZXJzaW9uIGFjdHVhbGlzw6llIGRlIGxhIGxpc3RlIGRlcyBsaWVuc1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TGlua3MsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNsaW5rc0xpc3RcIik7XG4gICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcyh0b2tlbik7Ly8gcGV1dCBhdm9pciDDqXZvbHXDqSBzdWl2YW50IGNlIHF1aSBzJ2VzdCBwYXNzw6lcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2VMaW5rLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZUxpbmssIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHhockxpbmtEYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICB4aHJMaW5rRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdG9rZW4pO1xuICAgIHhockxpbmtEYXRhcy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG59XG5cbi8vIEFmZmljaGUgbGVzIGRvbm7DqWVzIGQndW5lIGlsbHVzdHJhdGlvbiBkYW5zIGxlIGZvcm11bGFpcmUgYWRob2MgOlxuY29uc3Qgc2hvd0Zvcm1JbGx1c3RyYXRpb25JbmZvcyA9IChJbGx1c3RyYXRpb24pID0+XG57XG4gICAgLy8gT24gY29tbWVuY2UgcGFyIGNhY2hlciBldCB2aWRlciB0b3VzIGxlcyBmb3JtdWxhaXJlcyBhbm5leGVzXG4gICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgLy8gUHVpcyBvbiBhZmZpY2hlIGNlbHVpIGNvbmNlcm7DqVxuICAgIGZvcm1JbGx1c3RyYXRpb24uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgLy8gKyBMZXMgY29udHJhaW50ZXMgZGUgY2hhbXAgJiB2YWxldXJzIHBhciBkw6lmYXV0XG4gICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ0lsbHVzdHJhdGlvbnMuSWxsdXN0cmF0aW9uLCBmb3JtSWxsdXN0cmF0aW9uKTsgICAgICAgICAgICAgIFxuICAgIC8vIE1haXMgbGUgY2hhbXAgZmlsZSBuJ2VzdCBwbHVzIHJlcXVpcywgcXVhbmQgdW4gZmljaGllciBleGlzdGUgZMOpasOgXG4gICAgZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tcImltYWdlXCJdLnJlbW92ZUF0dHJpYnV0ZShcInJlcXVpcmVkXCIpO1xuICAgIGZvcihsZXQgZGF0YSBpbiBJbGx1c3RyYXRpb24pXG4gICAge1xuICAgICAgICBpZihmb3JtSWxsdXN0cmF0aW9uLmVsZW1lbnRzW2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tkYXRhXS52YWx1ZT1JbGx1c3RyYXRpb25bZGF0YV07XG4gICAgfVxufVxuXG4vLyBBZmZpY2hlIGxlcyBpbmZvcyBjb25udWVzIGNvbmNlcm5hbnQgbGVzIGlsbHVzdHJhdGlvbnMgZHUgcXVlc3Rpb25uYWlyZSBhZmZpY2jDqSA6XG5jb25zdCBzaG93SWxsdXN0cmF0aW9uSW5mb3MgPSAoSWxsdXN0cmF0aW9ucywgdG9rZW4pID0+XG57XG4gICAgYWRkRWxlbWVudChkaXZJbGx1c3RyYXRpb25zLCBcImgyXCIsIGludHJvVGl0bGVGb3JJbGx1c3RyYXRpb24pO1xuICAgIGxldCBsaXN0SWxsdXN0cmF0aW9ucz1cIlwiO1xuICAgIGZvcihsZXQgaSBpbiBJbGx1c3RyYXRpb25zKVxuICAgICAgICBsaXN0SWxsdXN0cmF0aW9ucys9XCI8bGk+PGEgaHJlZj0nXCIrY29uZmlnVGVtcGxhdGUuaWxsdXN0cmF0aW9uRGlyK0lsbHVzdHJhdGlvbnNbaV0udXJsK1wiJyB0YXJnZXQ9J19ibGFuayc+PGltZyBzcmM9J1wiK2NvbmZpZ1RlbXBsYXRlLmlsbHVzdHJhdGlvbkRpcitJbGx1c3RyYXRpb25zW2ldLnVybCtcIicgYWx0PSdcIitkZWZhdWx0QWx0K1wiJyBzdHlsZT0nbWF4LWhlaWdodDoxNTBweCc+PC9hPjxicj48YSBocmVmPScjdXBkYXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCtcIicgaWQ9JyN1cGRhdGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkK1wiJyBjbGFzcz0nYnV0dG9uJz5cIit1cGRhdGVCdG5UeHQrXCI8L2E+IDxhIGhyZWY9JyNkZWxldGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkK1wiJyBpZD0nI2RlbGV0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQrXCInIGNsYXNzPSdidXR0b24nPlwiK2RlbGV0ZUJ0blR4dCtcIjwvYT48L2xpPlwiO1xuICAgIGlmKGxpc3RJbGx1c3RyYXRpb25zID09PSBcIlwiKVxuICAgICAgICBsaXN0SWxsdXN0cmF0aW9ucz1cIjxsaT5cIitpbnRyb05vSWxsdXN0cmF0aW9uK1wiPC9saT5cIjtcbiAgICBhZGRFbGVtZW50KGRpdklsbHVzdHJhdGlvbnMsIFwidWxcIiwgbGlzdElsbHVzdHJhdGlvbnMsIFwiXCIsIFtdLCBcIlwiLCBmYWxzZSk7Ly8gISDDoCBpbnTDqWdyZXIgZCdhYm9yZCBkYW5zIGxlIERPTSBwb3VyIHBvdXZvaXIgYWpvdXRlciBsZXMgTGlzdGVuZXJzIGVuc3VpdGVcbiAgICBmb3IobGV0IGkgaW4gSWxsdXN0cmF0aW9ucylcbiAgICB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3VwZGF0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBzaG93Rm9ybUlsbHVzdHJhdGlvbkluZm9zKElsbHVzdHJhdGlvbnNbaV0pO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNpbGx1c3RyYXRpb25zXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjZGVsZXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHNob3dGb3JtSWxsdXN0cmF0aW9uSW5mb3MoSWxsdXN0cmF0aW9uc1tpXSk7XG4gICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLmVsZW1lbnRzW1wiZGVsZXRlT2tcIl0udmFsdWU9dHJ1ZTtcbiAgICAgICAgICAgIHNlbmRJbGx1c3RyYXRpb25Gb3JtKHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmKElsbHVzdHJhdGlvbnMubGVuZ3RoIDwgY29uZmlnLm5iSWxsdXN0cmF0aW9uc01heCB8fCBjb25maWcubmJJbGx1c3RyYXRpb25zTWF4ID09PSAwKVxuICAgIHtcbiAgICAgICAgbGV0IG5ld0J0bj1cIjxhIGhyZWY9JyNuZXdJbGx1c3RyYXRpb24nIGlkPSduZXdJbGx1c3RyYXRpb24nIGNsYXNzPSdidXR0b24nPlwiK2FkZElsbHVzdHJhdGlvblR4dCtcIjwvYT5cIjtcbiAgICAgICAgYWRkRWxlbWVudChkaXZJbGx1c3RyYXRpb25zLCBcInBcIiwgbmV3QnRuLCBcIlwiLCBbXSwgeyB9LCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmV3SWxsdXN0cmF0aW9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgIGZvcm1JbGx1c3RyYXRpb24uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLmVsZW1lbnRzW1wiUXVlc3Rpb25uYWlyZUlkXCJdLnZhbHVlPWZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiaWRcIl0udmFsdWU7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2lsbHVzdHJhdGlvbnNcIik7XG4gICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnSWxsdXN0cmF0aW9ucywgZm9ybUlsbHVzdHJhdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gRW52b2kgZGVzIGRvbm7DqWVzIGQndW5lIGlsbHVzdHJhdGlvbi5cbmNvbnN0IHNlbmRJbGx1c3RyYXRpb25Gb3JtID0gKHRva2VuKSA9Plxue1xuICAgIGNvbnN0IGRpdlJlc3BvbnNlSWxsdXN0cmF0aW9uPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VJbGx1c3RyYXRpb25cIik7XG4gICAgZGl2UmVzcG9uc2VJbGx1c3RyYXRpb24uaW5uZXJIVE1MPVwiXCI7XG4gICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtSWxsdXN0cmF0aW9uKTtcbiAgICBsZXQgZGF0YXNXaXRoRmlsZXM9bmV3IEZvcm1EYXRhKGZvcm1JbGx1c3RyYXRpb24pOyAvLyBjYXIgaWwgbWUgbWFucXVlIGxlcyBpbmZvcm1hdGlvbnMgZHUgZmljaGllciBhdmVjIGxhIGZvbmN0aW9uIGdldERhdGFzRnJvbUlucHV0c1xuICAgIGNvbnN0IHhocklsbHVzdHJhdGlvbkRhdGFzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgaWYoIWlzRW1wdHkoZGF0YXMuaWQpICYmICghaXNFbXB0eShkYXRhcy5kZWxldGVPaykpKVxuICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vcGVuKFwiREVMRVRFXCIsIGFwaVVybCtjb25maWdJbGx1c3RyYXRpb25zLmlsbHVzdHJhdGlvbnNSb3V0ZStkYXRhcy5pZCk7XG4gICAgZWxzZSBpZighaXNFbXB0eShkYXRhcy5pZCkpXG4gICAgICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLm9wZW4oXCJQVVRcIiwgYXBpVXJsK2NvbmZpZ0lsbHVzdHJhdGlvbnMuaWxsdXN0cmF0aW9uc1JvdXRlK2RhdGFzLmlkKTtcbiAgICBlbHNlXG4gICAgICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdJbGx1c3RyYXRpb25zLmlsbHVzdHJhdGlvbnNSb3V0ZSk7XG4gICAgeGhySWxsdXN0cmF0aW9uRGF0YXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBpZiAoKHRoaXMuc3RhdHVzID09PSAyMDAgfHwgdGhpcy5zdGF0dXMgPT09IDIwMSkgJiYgcmVzcG9uc2UubWVzc2FnZSE9dW5kZWZpbmVkICYmIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmUhPXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZS5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHNob3dJbGx1c3RyYXRpb25JbmZvcyhyZXNwb25zZS5xdWVzdGlvbm5haXJlLklsbHVzdHJhdGlvbnMsIHRva2VuKTsvLyBsZSBzZXJ2ZXVyIHJldG91cm5lIHVuZSB2ZXJzaW9uIGFjdHVhbGlzw6llIGRlIGxhIGxpc3RlIGRlcyBsaWVuc1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2SWxsdXN0cmF0aW9ucywgXCJwXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2lsbHVzdHJhdGlvbnNMaXN0XCIpO1xuICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXModG9rZW4pOy8vIHBldXQgYXZvaXIgw6l2b2x1w6kgc3VpdmFudCBjZSBxdWkgcydlc3QgcGFzc8OpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSBzZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlSWxsdXN0cmF0aW9uLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZUlsbHVzdHJhdGlvbiwgXCJwXCIsIHNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgeGhySWxsdXN0cmF0aW9uRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdG9rZW4pO1xuICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLnNlbmQoZGF0YXNXaXRoRmlsZXMpO1xufVxuXG4vLyBBZmZpY2hlIGxlcyBkb25uw6llcyBkJ3VuZSBxdWVzdGlvbiArIHNlcyByw6lwb25zZXMgcG9zc2libGVzIGRhbnMgbGUgZm9ybXVsYWlyZSBhZGhvY1xuY29uc3Qgc2hvd0Zvcm1RdWVzdGlvbkluZm9zID0gKFF1ZXN0aW9uKSA9Plxue1xuICAgIC8vIE9uIGNvbW1lbmNlIHBhciBjYWNoZXIgZXQgdmlkZXIgdG91cyBsZXMgZm9ybXVsYWlyZXMgYW5uZXhlc1xuICAgIGhpZGVBbGxGb3JtcygpO1xuICAgIC8vIFB1aXMgb24gYWZmaWNoZSBjZWx1aSBjb25jZXJuw6lcbiAgICBmb3JtUXVlc3Rpb24uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgZm9yKGxldCBkYXRhIGluIFF1ZXN0aW9uLlF1ZXN0aW9uKVxuICAgIHtcbiAgICAgICAgaWYoZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW2RhdGFdLnZhbHVlPVF1ZXN0aW9uLlF1ZXN0aW9uW2RhdGFdO1xuICAgIH1cbiAgICAvLyArIExlcyBjb250cmFpbnRlcyBkZSBjaGFtcCAmIGxlcyB2YWxldXJzIHBhciBkw6lmYXV0XG4gICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ1F1ZXN0aW9ubmFpcmVzLlF1ZXN0aW9uLCBmb3JtUXVlc3Rpb24pOyAgICAgICAgICAgICAgXG4gICAgZm9yKGxldCBkYXRhIGluIFF1ZXN0aW9uLkNob2ljZXMpXG4gICAge1xuICAgICAgICBpZihmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJjaG9pY2VUZXh0XCIrZGF0YV0hPT11bmRlZmluZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcm1RdWVzdGlvbi5lbGVtZW50c1tcImNob2ljZVRleHRcIitkYXRhXS52YWx1ZT1RdWVzdGlvbi5DaG9pY2VzW2RhdGFdLnRleHQ7XG4gICAgICAgICAgICBpZihRdWVzdGlvbi5DaG9pY2VzW2RhdGFdLmlzQ29ycmVjdD09dHJ1ZSlcbiAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJjaG9pY2VJc0NvcnJlY3RcIitkYXRhXS5jaGVja2VkPXRydWU7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJpZENob2ljZVwiK2RhdGFdLnZhbHVlPVF1ZXN0aW9uLkNob2ljZXNbZGF0YV0uaWQ7XG4gICAgICAgIH0gICAgICAgICAgICAgICAgXG4gICAgfVxufVxuXG4vLyBBZmZpY2hlIGxlcyBpbmZvcyBkZXMgcXVlc3Rpb25zIGR1IHF1aXogYWZmaWNow6kgOlxuY29uc3Qgc2hvd1F1ZXN0aW9uSW5mb3MgPSAoUXVlc3Rpb25zLCB0b2tlbikgPT5cbntcbiAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ucywgXCJoMlwiLCBpbnRyb1RpdGxlRm9yUXVlc3Rpb24pO1xuICAgIGxldCBsaXN0UXVlc3Rpb25zPVwiXCI7XG4gICAgZm9yKGxldCBpIGluIFF1ZXN0aW9ucylcbiAgICAgICAgbGlzdFF1ZXN0aW9ucys9XCI8bGk+XCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLnJhbmsrXCIgLSBcIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24udGV4dCtcIjxicj48YSBocmVmPScjdXBkYXRlUXVlc3Rpb25cIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24uaWQrXCInIGlkPScjdXBkYXRlUXVlc3Rpb25cIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24uaWQrXCInIGNsYXNzPSdidXR0b24nPlwiK3VwZGF0ZUJ0blR4dCtcIjwvYT4gPGEgaHJlZj0nI2RlbGV0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkK1wiJyBpZD0nI2RlbGV0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkK1wiJyBjbGFzcz0nYnV0dG9uJz5cIitkZWxldGVCdG5UeHQrXCI8L2E+PC9saT5cIjtcbiAgICBpZihsaXN0UXVlc3Rpb25zID09PSBcIlwiKVxuICAgICAgICBsaXN0UXVlc3Rpb25zPVwiPGxpPlwiK2ludHJvTm9RdWVzdGlvbitcIjwvbGk+XCI7XG4gICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwidWxcIiwgbGlzdFF1ZXN0aW9ucywgXCJcIiwgW10sIFwiXCIsIGZhbHNlKTsvLyDDoCBpbnTDqWdyZXIgZCdhYm9yZCBkYW5zIGxlIERPTSBwb3VyIHBvdXZvaXIgYWpvdXRlciBsZXMgTGlzdGVuZXJzIGVuc3VpdGVcbiAgICBmb3IobGV0IGkgaW4gUXVlc3Rpb25zKVxuICAgIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjdXBkYXRlUXVlc3Rpb25cIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9uSW5mb3MoUXVlc3Rpb25zW2ldKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVlc3Rpb25zXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjZGVsZXRlUXVlc3Rpb25cIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9uSW5mb3MoUXVlc3Rpb25zW2ldKTtcbiAgICAgICAgICAgIGZvcm1RdWVzdGlvbi5lbGVtZW50c1tcImRlbGV0ZU9rXCJdLnZhbHVlPXRydWU7XG4gICAgICAgICAgICBzZW5kUXVlc3Rpb25Gb3JtKHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmKFF1ZXN0aW9ucy5sZW5ndGggPCBjb25maWcubmJRdWVzdGlvbnNNYXggfHwgY29uZmlnLm5iUXVlc3Rpb25zTWF4ID09PSAwKVxuICAgIHtcbiAgICAgICAgbGV0IG5ld0J0bj1cIjxhIGhyZWY9JyNuZXdRdWVzdGlvbicgaWQ9J25ld1F1ZXN0aW9uJyBjbGFzcz0nYnV0dG9uJz5cIithZGRRdWVzdGlvblR4dCtcIjwvYT5cIjtcbiAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwicFwiLCBuZXdCdG4sIFwiXCIsIFtdLCB7IH0sIGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJuZXdRdWVzdGlvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJRdWVzdGlvbm5haXJlSWRcIl0udmFsdWU9Zm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbXCJpZFwiXS52YWx1ZTtcbiAgICAgICAgICAgIGZvcm1RdWVzdGlvbi5lbGVtZW50c1tcInJhbmtcIl0udmFsdWU9KFF1ZXN0aW9ucy5sZW5ndGg9PT0wKSA/IGNvbmZpZ1F1ZXN0aW9ubmFpcmVzLlF1ZXN0aW9uLnJhbmsuZGVmYXVsdFZhbHVlIDogUXVlc3Rpb25zLmxlbmd0aCsxO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNxdWVzdGlvbnNcIik7XG4gICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnUXVlc3Rpb25uYWlyZXMuUXVlc3Rpb24sIGZvcm1RdWVzdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gRW52b2kgZGVzIGRvbm7DqWVzIGQndW5lIHF1ZXN0aW9uIGV0IGRlIHNlcyByw6lwb25zZS4gUGV1dCDDqnRyZSBnw6luw6lyw6kgcGFyIGxlIGJvdXRvbiBzdWJtaXQgb3UgcGFyIGxlIGxpZW4gXCJzdXBwcmltZXJcIi5cbmNvbnN0IHNlbmRRdWVzdGlvbkZvcm0gPSAodG9rZW4pID0+XG57XG4gICAgY29uc3QgZGl2UmVzcG9uc2VRdWVzdGlvbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlUXVlc3Rpb25cIik7XG4gICAgZGl2UmVzcG9uc2VRdWVzdGlvbi5pbm5lckhUTUw9XCJcIjtcbiAgICBsZXQgZGF0YXM9Z2V0RGF0YXNGcm9tSW5wdXRzKGZvcm1RdWVzdGlvbik7XG4gICAgY29uc3QgeGhyUXVlc3Rpb25EYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSAmJiAoIWlzRW1wdHkoZGF0YXMuZGVsZXRlT2spKSlcbiAgICAgICAgeGhyUXVlc3Rpb25EYXRhcy5vcGVuKFwiREVMRVRFXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbnNSb3V0ZStkYXRhcy5pZCk7XG4gICAgZWxzZSBpZighaXNFbXB0eShkYXRhcy5pZCkpXG4gICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub3BlbihcIlBVVFwiLCBhcGlVcmwrY29uZmlnUXVlc3Rpb25uYWlyZXMucXVlc3Rpb25zUm91dGUrZGF0YXMuaWQpOy8vIG1pc2Ugw6Agam91ciBkJ3VuZSBxdWVzdGlvblxuICAgIGVsc2VcbiAgICAgICAgeGhyUXVlc3Rpb25EYXRhcy5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnUXVlc3Rpb25uYWlyZXMucXVlc3Rpb25zUm91dGUpOy8vIG5vdXZlbGxlIHF1ZXN0aW9uXG4gICAgeGhyUXVlc3Rpb25EYXRhcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gMjAxKSAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQgJiYgcmVzcG9uc2UucXVlc3Rpb25uYWlyZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgc2hvd1F1ZXN0aW9uSW5mb3MocmVzcG9uc2UucXVlc3Rpb25uYWlyZS5RdWVzdGlvbnMsIHRva2VuKTsvLyBsZSBzZXJ2ZXVyIG1lIHJldG91cm5lIHVuZSB2ZXJzaW9uIGFjdHVhbGlzw6llIGRlIGxhIGxpc3RlIGRlcyBxdWVzdGlvbnNcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ucywgXCJwXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI3F1ZXN0aW9uc0xpc3RcIik7XG4gICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcyh0b2tlbik7Ly8gY2FyIHBldXQgYXZvaXIgw6l2b2x1w6kgc3VpdmFudCBjZSBxdWkgcydlc3QgcGFzc8OpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSBzZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlUXVlc3Rpb24sIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlUXVlc3Rpb24sIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHhoclF1ZXN0aW9uRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgeGhyUXVlc3Rpb25EYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit0b2tlbik7XG4gICAgeGhyUXVlc3Rpb25EYXRhcy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG59XG5cbi8vIEFmZmljaGFudCBsZXMgaW5mb3MgY29ubnVlcyBjb25jZXJuYW50IHVuIHF1ZXN0aW9ubmFpcmUgZXQgc2VzIGTDqXBlbmRhbmNlc1xuY29uc3Qgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MgPSAoaWQsIHRva2VuKSA9Plxue1xuICAgIGNvbnN0IHhockdldEluZm9zID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyR2V0SW5mb3Mub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnUXVlc3Rpb25uYWlyZXMucXVlc3Rpb25uYWlyZVJvdXRlcytjb25maWdRdWVzdGlvbm5haXJlcy5nZXRRdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiK2lkKTtcbiAgICB4aHJHZXRJbmZvcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLlF1ZXN0aW9ubmFpcmUgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLnJlc2V0KCk7Ly8gcG91ciBuZSBwYXMgZ2FyZGVyIGxlcyBkb25uw6llcyBkw6lqw6AgYWZmaWNow6llcyBzaSB2aWRlIGRhbnMgY2UgcXVpIGVzdCByZXRvdXJuw6lcbiAgICAgICAgICAgICAgICBmb3IobGV0IGRhdGEgaW4gcmVzcG9uc2UuUXVlc3Rpb25uYWlyZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhPT09XCJwdWJsaXNoaW5nQXRcIiAmJiByZXNwb25zZS5RdWVzdGlvbm5haXJlW2RhdGFdIT09bnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tkYXRhXS52YWx1ZT1kYXRlRm9ybWF0KHJlc3BvbnNlLlF1ZXN0aW9ubmFpcmVbZGF0YV0sIFwiZm9ybVwiKTsvLyAhISByZXZvaXIgY2FyIGZvcm1hdCBwb3V2YW50IHBvc2VyIHNvdWNpcyBzaSBuYXZpZ2F0ZXVyIG5lIGfDqHJlIHBhcyBsZXMgY2hhbXBzIGRlIHR5cGUgXCJkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW2RhdGFdLnZhbHVlPXJlc3BvbnNlLlF1ZXN0aW9ubmFpcmVbZGF0YV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGVDaGVja0JveC5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIH0vLyBham91dGVyIGdlc3Rpb24gZGVzIHJldG91cnMgZW4gZXJyZXVyID9cbiAgICAgICAgICAgIGlmKHJlc3BvbnNlLlRhZ3MgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBjbGFzc2lmaWNhdGlvbj1cIlwiO1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5UYWdzKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoaT09MClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uKz1yZXNwb25zZS5UYWdzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uKz1cIixcIityZXNwb25zZS5UYWdzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiY2xhc3NpZmljYXRpb25cIl0udmFsdWU9Y2xhc3NpZmljYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZighaXNFbXB0eShyZXNwb25zZS5Hcm91cCkpXG4gICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbXCJncm91cFwiXS52YWx1ZT1yZXNwb25zZS5Hcm91cC5Hcm91cC50aXRsZStcIiAoXCIrcmVzcG9uc2UuR3JvdXAuR3JvdXAuaWQrXCIpXCI7XG4gICAgICAgICAgICBkaXZMaW5rcy5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIGRpdlF1ZXN0aW9ucy5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIGRpdklsbHVzdHJhdGlvbnMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICBpZihyZXNwb25zZS5MaW5rcyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgc2hvd0xpbmtJbmZvcyhyZXNwb25zZS5MaW5rcywgdG9rZW4pO1xuICAgICAgICAgICAgaWYocmVzcG9uc2UuUXVlc3Rpb25zICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBzaG93UXVlc3Rpb25JbmZvcyhyZXNwb25zZS5RdWVzdGlvbnMsIHRva2VuKTtcbiAgICAgICAgICAgIGlmKHJlc3BvbnNlLklsbHVzdHJhdGlvbnMgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHNob3dJbGx1c3RyYXRpb25JbmZvcyhyZXNwb25zZS5JbGx1c3RyYXRpb25zLCB0b2tlbik7XG4gICAgICAgICAgICBoZWxwUHVibGlzaGluZ0F0LnN0eWxlLmRpc3BsYXk9XCJub25lXCI7Ly8gaW5mbyB1bmlxdWVtZW50IHV0aWxlIHBvdXIgXCJwbGFjZXJcIiB1biBub3V2ZWF1IHF1aXpcbiAgICAgICAgICAgIC8vIMOgIHJldm9pciA6IHJlbXBsYWNlciBsaWVuIHBvdXIgdW4gYm91dG9uICsgcmVzZXQgY29tcGxldCBkdSBmb3JtdWxhaXJlLCB5IGNvbXByaXMgY2hhbXBzIGhpZGRlbiA6XG4gICAgICAgICAgICBidG5OZXdRdWVzdGlvbm5haXJlLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgYnRuTmV3UXVlc3Rpb25uYWlyZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGNvbmZpZ1RlbXBsYXRlLnF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UpO1xuICAgICAgICAgICAgYnRuUHJldmlld1F1ZXN0aW9ubmFpcmUuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICBpZihyZXNwb25zZS5RdWVzdGlvbm5haXJlW1wiaXNQdWJsaXNoZWRcIl0gPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIGJ0blByZXZpZXdRdWVzdGlvbm5haXJlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnUXVlc3Rpb25uYWlyZXMucHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMrXCIvXCIraWQrXCIvXCIrdG9rZW4pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGJ0blByZXZpZXdRdWVzdGlvbm5haXJlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgY29uZmlnLnNpdGVVcmwrY29uZmlnUXVlc3Rpb25uYWlyZXMucHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcytyZXNwb25zZS5RdWVzdGlvbm5haXJlW1wic2x1Z1wiXStcIi5odG1sXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHhockdldEluZm9zLnNlbmQoKTtcbn1cblxuLy8gQWZmaWNoZSBsZXMgcXVlc3Rpb25uYWlyZXMgYmllbnTDtHQgcHVibGnDqXMuXG5jb25zdCBzaG93TmV4dFF1ZXN0aW9ubmFpcmVzID0gKHRva2VuKSA9Plxue1xuICAgIGNvbnN0IHhock5leHRRdWVzdGlvbm5haXJlcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLmdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMpO1xuICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2UucXVlc3Rpb25uYWlyZXMpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBsaXN0SFRNTD1cIlwiLCBkYXlTdHIsIG9wdGlvbnNEYXlTdHIgPSB7IHdlZWtkYXk6ICdsb25nJ307XG4gICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGF5U3RyPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxhbmcsIG9wdGlvbnNEYXlTdHIpLmZvcm1hdChuZXcgRGF0ZShyZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5kYXRlUHVibGlzaGluZykpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0SFRNTCs9XCI8bGk+XCIrZGF5U3RyK1wiIFwiK2RhdGVGb3JtYXQocmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uZGF0ZVB1Ymxpc2hpbmcsIFwiZnJcIikrXCI6IDxhIGhyZWY9J1wiK2NvbmZpZ1RlbXBsYXRlLnF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UrXCI/aWQ9XCIrcmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uaWQrXCInIGlkPSdxdWVzdGlvbm5haXJlX1wiK3Jlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmlkK1wiJz5cIityZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS50aXRsZStcIjwvYT5cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uaXNQdWJsaXNoYWJsZT09PWZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEhUTUwrPVwiIDxzcGFuIGNsYXNzPSdlcnJvcic+KFwiK3F1ZXN0aW9ubmFpcmVOZWVkQmVDb21wbGV0ZWQrXCIpPC9saT5cIjtcbiAgICAgICAgICAgICAgICAgICAgbGlzdEhUTUwrPVwiPC9saT5cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYocmVzcG9uc2UucXVlc3Rpb25uYWlyZXMubGVuZ3RoIT09MClcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbm5haXJlcywgXCJoM1wiLCBuZXh0UXVlc3Rpb25uYWlyZXNMaXN0LnJlcGxhY2UoXCIjTkJcIiwgcmVzcG9uc2UucXVlc3Rpb25uYWlyZXMubGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChoZWxwUHVibGlzaGluZ0F0LCBcImVtXCIsIG5leHREYXRlV2l0aG91dFF1ZXN0aW9ubmFpcmUrZGF0ZUZvcm1hdChuZXcgRGF0ZShyZXNwb25zZS5kYXRlTmVlZGVkKSwgXCJmclwiKSk7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbm5haXJlcywgXCJ1bFwiLCBsaXN0SFRNTCwgXCJcIiwgXCJcIiwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5xdWVzdGlvbm5haXJlcylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZV9cIityZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGb3JtUXVlc3Rpb25uYWlyZUluZm9zKGUudGFyZ2V0LmlkLnNwbGl0KFwiX1wiKVsxXSwgdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNxdWVzdGlvbm5haXJlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS8vIGFqb3V0ZXIgZ2VzdGlvbiBlcnJldXJzIHJlw6d1ZXMgZHUgc2VydmV1ciA/XG4gICAgICAgIH1cbiAgICB9XG4gICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3Rva2VuKTsgXG4gICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLnNlbmQoKTtcbn1cblxuY29uc3QgaW5pdGlhbGlzZSA9IGFzeW5jICgpID0+XG57XG4gICAgdHJ5XG4gICAgeyAgICAgICAgXG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkPWF3YWl0IGNoZWNrU2Vzc2lvbihbXCJtYW5hZ2VyXCIsIFwiYWRtaW5cIl0sIFwiL1wiK2NvbmZpZ1RlbXBsYXRlLmNvbm5lY3Rpb25QYWdlLCB7IG1lc3NhZ2U6IG5lZWRCZUNvbm5lY3RlZCwgY29sb3I6XCJlcnJvclwiIH0sIHdpbmRvdy5sb2NhdGlvbik7XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBkaXZNYWluLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgaWYoIWlzRW1wdHkoZ2V0TG9jYWx5KFwibWVzc2FnZVwiKSkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5tZXNzYWdlLCBcIlwiLCBbZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5jb2xvcl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJtZXNzYWdlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgLy8gTWlzZSDDoCBqb3VyIGR1IGxpZW4gXCJjb21wdGVcIiBkdSBoZWFkZXIgOlxuICAgICAgICAgICAgdXBkYXRlQWNjb3VudExpbmsodXNlci5zdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKTtcbiAgICAgICAgICAgIC8vIEluaXRpYWxpc2F0aW9uIGRlcyBmb3JtdWxhaXJlcyA6XG4gICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnUXVlc3Rpb25uYWlyZXMsIGZvcm1TZWFyY2gpO1xuICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ1F1ZXN0aW9ubmFpcmVzLlF1ZXN0aW9ubmFpcmUsIGZvcm1RdWVzdGlvbm5haXJlKTtcbiAgICAgICAgICAgIC8vIFZpZGUvY2FjaGUgbGVzIMOpbMOpbWVudHMgaW51dGlsZXMgZW4gbW9kZSBjcsOpYXRpb24gOlxuICAgICAgICAgICAgYnRuUHJldmlld1F1ZXN0aW9ubmFpcmUuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgICAgIGRlbGV0ZUNoZWNrQm94LnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgIC8vIFNpIHVuIGlkIGVzdCBwYXNzw6kgcGFyIGwndXJsLCBvbiBlc3NheWUgZCdhZmZpY2hlciBsZSBxdWVzdGlvbm5haXJlIDpcbiAgICAgICAgICAgIGxldCB1cmxEYXRhcz1nZXRVcmxQYXJhbXMoKTtcbiAgICAgICAgICAgIGlmKHVybERhdGFzICYmIHVybERhdGFzLmlkIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHNob3dGb3JtUXVlc3Rpb25uYWlyZUluZm9zKHVybERhdGFzLmlkLCB1c2VyLnRva2VuKTtcbiAgICAgICAgICAgIC8vIGxlcyBwcm9jaGFpbmVzIHB1YmxpY2F0aW9ucyA6XG4gICAgICAgICAgICBzaG93TmV4dFF1ZXN0aW9ubmFpcmVzKHVzZXIudG9rZW4pO1xuICAgICAgICAgICAgLy8gTGFuY2VtZW50IGQndW5lIHJlY2hlcmNoZSA6XG4gICAgICAgICAgICBmb3JtU2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtU2VhcmNoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHJTZWFyY2ggPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHJTZWFyY2gub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnUXVlc3Rpb25uYWlyZXMuc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlKTtcbiAgICAgICAgICAgICAgICB4aHJTZWFyY2gub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5sZW5ndGg9PT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlNlYXJjaFJlc3VsdCwgXCJwXCIsIHNlYXJjaFF1ZXN0aW9ubmFpcmVXaXRoTm9SZXN1bHQsIFwiXCIsIFtcImluZm9cIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RIVE1MPVwiPG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0SFRNTCs9XCI8b3B0aW9uIHZhbHVlPSdcIityZXNwb25zZVtpXS5pZCtcIic+XCIrcmVzcG9uc2VbaV0udGl0bGUrXCI8L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTZWFyY2hSZXN1bHQsIFwic2VsZWN0XCIsIHNlbGVjdEhUTUwsIFwic2VsZWN0U2VhcmNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hTZWxlY3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWxlY3RTZWFyY2hcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VhcmNoU2VsZWN0LnZhbHVlIT09XCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyhzZWFyY2hTZWxlY3QudmFsdWUsIHVzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTZWFyY2hSZXN1bHQsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoclNlYXJjaC5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICB4aHJTZWFyY2guc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgaWYoZGF0YXMpXG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWlkZSDDoCBsYSBzYWlzaWUgcG91ciBsZSBjbGFzc2VtZW50IGR1IHF1aXpcbiAgICAgICAgICAgIGlucHV0Q2xhc3NpZmljYXRpb24uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGl2UmVzcG9uc2UuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFncz1pbnB1dENsYXNzaWZpY2F0aW9uLnZhbHVlLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICB0YWdzLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0VGFnPXRhZ3NbMF0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmKGxhc3RUYWcubGVuZ3RoID49IDIpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJTZWFyY2hUYWdzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Mub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnUXVlc3Rpb25uYWlyZXMudGFnc1NlYXJjaFJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoVGFncy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwQ2xhc3NpZmljYXRpb24uaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChoZWxwQ2xhc3NpZmljYXRpb24sIFwiYVwiLCByZXNwb25zZVtpXS5uYW1lLCBcIiN0YWdcIityZXNwb25zZVtpXS5pZCwgW1wiaW5mb1wiXSwgeyBocmVmOlwiI3RhZ1wiK3Jlc3BvbnNlW2ldLmlkIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3RhZ1wiK3Jlc3BvbnNlW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnc1swXT1lLnRhcmdldC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFncy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbGFzc2lmaWNhdGlvbi52YWx1ZT10YWdzLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBDbGFzc2lmaWNhdGlvbi5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoVGFncy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoVGFncy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoVGFncy5zZW5kKEpTT04uc3RyaW5naWZ5KHtzZWFyY2g6IGxhc3RUYWd9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEFpZGUgw6AgbGEgc8OpbGVjdGlvbiBkJ3VuIGdyb3VwZSBwb3VyIGxlIHF1aXpcbiAgICAgICAgICAgIGlucHV0R3JvdXAuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmVbXCJHcm91cElkXCJdLnZhbHVlPVwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJbnB1dD1pbnB1dEdyb3VwLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZihncm91cElucHV0Lmxlbmd0aCA+PSBjb25maWdRdWVzdGlvbm5haXJlcy5zZWFyY2hHcm91cHMubWlubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyU2VhcmNoR3JvdXBzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaEdyb3Vwcy5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnUXVlc3Rpb25uYWlyZXMuZ3JvdXBSb3V0ZXMrY29uZmlnUXVlc3Rpb25uYWlyZXMuc2VhcmNoR3JvdXBzUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hHcm91cHMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscEdyb3VwLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoaGVscEdyb3VwLCBcImFcIiwgcmVzcG9uc2VbaV0udGl0bGUsIFwiI2dyb3VwXCIrcmVzcG9uc2VbaV0uaWQsIFtcImluZm9cIl0sIHsgaHJlZjpcIiNncm91cFwiK3Jlc3BvbnNlW2ldLmlkIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI2dyb3VwXCIrcmVzcG9uc2VbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEdyb3VwLnZhbHVlPXJlc3BvbnNlW2ldLnRpdGxlK1wiIChcIityZXNwb25zZVtpXS5pZCtcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZVtcIkdyb3VwSWRcIl0udmFsdWU9cmVzcG9uc2VbaV0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzRW1wdHkocmVzcG9uc2VbaV0ubWF4UmFuaykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UmFua0luR3JvdXAudmFsdWU9cmVzcG9uc2VbaV0ubWF4UmFuaysxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSYW5rSW5Hcm91cC52YWx1ZT0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBHcm91cC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaEdyb3Vwcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoR3JvdXBzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hHcm91cHMuc2VuZChKU09OLnN0cmluZ2lmeSh7c2VhcmNoR3JvdXBzOiBncm91cElucHV0fSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBUcmFpdGVtZW50IGRlIGwnZW52b2kgZHUgZm9ybXVsYWlyZSBkZXMgaW5mb3MgZGUgYmFzZSBkdSBxdWl6XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGRpdlJlc3BvbnNlLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybVF1ZXN0aW9ubmFpcmUpO1xuICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KGRhdGFzLnJhbmtJbkdyb3VwKSAmJiBpc0VtcHR5KGRhdGFzLkdyb3VwSWQpKVxuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgbmVlZEdyb3VwSWZSYW5rLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNFbXB0eShkYXRhcy5yYW5rSW5Hcm91cCkgJiYgIWlzRW1wdHkoZGF0YXMuR3JvdXBJZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5yYW5rSW5Hcm91cD0xO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJRdWVzdGlvbm5haXJlRGF0YXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWlzRW1wdHkoZGF0YXMuaWQpICYmIChkYXRhcy5kZWxldGVPayE9PXVuZGVmaW5lZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbm5haXJlRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnUXVlc3Rpb25uYWlyZXMucXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIitkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9wZW4oXCJQVVRcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrXCIvXCIrZGF0YXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbm5haXJlRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrXCIvXCIpO1xuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbm5haXJlRGF0YXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAxICYmIHJlc3BvbnNlLmlkICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBhZGRPa01lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5pZD1yZXNwb25zZS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcyh1c2VyLnRva2VuKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLm1lc3NhZ2UgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TmV4dFF1ZXN0aW9ubmFpcmVzKHVzZXIudG9rZW4pOy8vIHBldXQgYXZvaXIgw6l2b2x1w6kgc3VpdmFudCBjZSBxdWkgcydlc3QgcGFzc8OpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhcy5kZWxldGVPayA9PT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlLmVycm9ycyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyhkYXRhcy5pZCwgdXNlci50b2tlbik7Ly8gb24gYWN0dWFsaXNlIGxlcyBkb25uw6llc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2TGlua3MuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdklsbHVzdHJhdGlvbnMuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdlF1ZXN0aW9ucy5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbm5haXJlRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvcm1MaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgc2VuZExpbmtGb3JtKHVzZXIudG9rZW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgc2VuZElsbHVzdHJhdGlvbkZvcm0odXNlci50b2tlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvcm1RdWVzdGlvbi5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHNlbmRRdWVzdGlvbkZvcm0odXNlci50b2tlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgYWRkRWxlbWVudChkaXZDcmFzaCwgXCJwXCIsIHNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgfVxufVxuaW5pdGlhbGlzZSgpO1xuaGVsbG9EZXYoKTsiXSwic291cmNlUm9vdCI6IiJ9