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

2394 lines
347 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(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // 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 });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/manageQuestionnaires.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "../config/illustrations.js":
/*!**********************************!*\
!*** ../config/illustrations.js ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var 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 ***!
\*****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var _module$exports;
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var users = __webpack_require__(/*! ./users */ "../config/users.js");
var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js");
module.exports = (_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
}, _defineProperty(_module$exports, "nbQuestionsMin", 1), _defineProperty(_module$exports, "nbQuestionsMax", 0), _defineProperty(_module$exports, "nbChoicesMax", 10), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaires", questionnaires.dirHTMLQuestionnaires), _defineProperty(_module$exports, "dirWebQuestionnaires", questionnaires.dirWebQuestionnaires), _module$exports);
/***/ }),
/***/ "../config/links.js":
/*!**************************!*\
!*** ../config/links.js ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
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 ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
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 ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
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"
};
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/general$":
/*!**************************************!*\
!*** ../lang sync ^\.\/.*\/general$ ***!
\**************************************/
/*! no static exports found */
/***/ (function(module, 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$ ***!
\*******************************************/
/*! no static exports found */
/***/ (function(module, 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$ ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, 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$ ***!
\***************************************/
/*! no static exports found */
/***/ (function(module, 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$ ***!
\********************************************/
/*! no static exports found */
/***/ (function(module, 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$ ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, 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$";
/***/ }),
/***/ "../lang/fr/general.js":
/*!*****************************!*\
!*** ../lang/fr/general.js ***!
\*****************************/
/*! no static exports found */
/***/ (function(module, exports) {
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 ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports) {
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 ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
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 ***!
\******************************/
/*! no static exports found */
/***/ (function(module, exports) {
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 ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
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 ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
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 ***!
\************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
// Quelques fonctions utiles pour les chaînes
var Tool = /*#__PURE__*/function () {
function Tool() {
_classCallCheck(this, Tool);
}
_createClass(Tool, null, [{
key: "isEmpty",
value: function 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;
}
}
}, {
key: "trimIfNotNull",
value: function trimIfNotNull(myString) {
if (Tool.isEmpty(myString)) myString = null;else {
myString += ""; // si autre chose qu'une chaîne envoyé...
myString = myString.trim();
}
return myString;
}
}, {
key: "shortenIfLongerThan",
value: function 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
}, {
key: "replaceAll",
value: function replaceAll(myString, mapObj) {
var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi");
return myString.replace(replaceElts, function (matched) {
return mapObj[matched];
});
} // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random
}, {
key: "getRandomInt",
value: function 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
}, {
key: "dateFormat",
value: function dateFormat(dateString) {
var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr";
if (Tool.isEmpty(dateString)) return "";
var myDate = new Date(dateString);
var myDay = myDate.getDate() + "";
if (myDay.length === 1) myDay = "0" + myDay;
var myMounth = myDate.getMonth() + 1 + "";
if (myMounth.length === 1) myMounth = "0" + myMounth;
var 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.
}, {
key: "getPassword",
value: function getPassword(nbCarMin, nbCarMax) {
var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));
var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz";
var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";
var password = letters[Math.floor(Math.random() * letters.length)];
for (var 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;
}
}]);
return Tool;
}();
module.exports = Tool;
/***/ }),
/***/ "../views sync recursive ^\\.\\/.*\\.js$":
/*!**********************************!*\
!*** ../views sync ^\.\/.*\.js$ ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, 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$";
/***/ }),
/***/ "../views/default/config/fr.js":
/*!*************************************!*\
!*** ../views/default/config/fr.js ***!
\*************************************/
/*! no static exports found */
/***/ (function(module, exports) {
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 ***!
\***************************************/
/*! no static exports found */
/***/ (function(module, exports) {
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
};
/***/ }),
/***/ "./src/manageQuestionnaires.js":
/*!*************************************!*\
!*** ./src/manageQuestionnaires.js ***!
\*************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__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");
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
// -- 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 :
var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
var config = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
var configIllustrations = __webpack_require__(/*! ../../config/illustrations.js */ "../config/illustrations.js");
var configLinks = __webpack_require__(/*! ../../config/links.js */ "../config/links.js");
var configQuestionnaires = __webpack_require__(/*! ../../config/questionnaires.js */ "../config/questionnaires.js");
var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions :
// Dictionnaires :
var _require = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"),
addOkMessage = _require.addOkMessage,
deleteBtnTxt = _require.deleteBtnTxt,
serverError = _require.serverError,
updateBtnTxt = _require.updateBtnTxt;
var _require2 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/illustration$")("./" + lang + "/illustration"),
addIllustrationTxt = _require2.addIllustrationTxt,
defaultAlt = _require2.defaultAlt,
introNoIllustration = _require2.introNoIllustration,
introTitleForIllustration = _require2.introTitleForIllustration;
var _require3 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/link$")("./" + lang + "/link"),
addLinkTxt = _require3.addLinkTxt,
defaultValueForLink = _require3.defaultValueForLink,
introNoLink = _require3.introNoLink,
introTitleForLink = _require3.introTitleForLink;
var _require4 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/question$")("./" + lang + "/question"),
addQuestionTxt = _require4.addQuestionTxt,
introNoQuestion = _require4.introNoQuestion,
introTitleForQuestion = _require4.introTitleForQuestion;
var _require5 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire"),
needGroupIfRank = _require5.needGroupIfRank,
nextDateWithoutQuestionnaire = _require5.nextDateWithoutQuestionnaire,
nextQuestionnairesList = _require5.nextQuestionnairesList,
questionnaireNeedBeCompleted = _require5.questionnaireNeedBeCompleted,
searchQuestionnaireWithNoResult = _require5.searchQuestionnaireWithNoResult;
var _require6 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"),
needBeConnected = _require6.needBeConnected; // Principaux éléments du DOM manipulés :
var btnNewQuestionnaire = document.getElementById("wantNewQuestionnaire");
var btnPreviewQuestionnaire = document.getElementById("previewQuestionnaire");
var deleteCheckBox = document.getElementById("deleteOkLabel");
var divCrash = document.getElementById("crash");
var divIllustrations = document.getElementById("illustrationsList");
var divLinks = document.getElementById("linksList");
var divMain = document.getElementById("main-content");
var divMessage = document.getElementById("message");
var divQuestionnaires = document.getElementById("questionnairesList");
var divQuestions = document.getElementById("questionsList");
var divResponse = document.getElementById("response");
var divSearchResult = document.getElementById("searchResult");
var formLink = document.getElementById("links");
var formIllustration = document.getElementById("illustrations");
var formQuestion = document.getElementById("questions");
var formQuestionnaire = document.getElementById("questionnaires");
var formSearch = document.getElementById("search");
var helpClassification = document.getElementById("helpClassification");
var helpGroup = document.getElementById("helpGroup");
var helpPublishingAt = document.getElementById("helpPublishingAt");
var inputClassification = document.getElementById("classification");
var inputGroup = document.getElementById("group");
var inputRankInGroup = document.getElementById("rankInGroup"); // Vide et cache tous les formulaires annexes au questionnaire :
var hideAllForms = function hideAllForms() {
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formLink);
if (defaultValueForLink != 0) document.getElementById("anchor").value = defaultValueForLink;
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formIllustration);
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formQuestion);
}; // Affiche les données d'un lien dans le formulaire adhoc :
var showFormLinkInfos = function 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 :
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configLinks.Link, formLink);
for (var data in Link) {
if (formLink.elements[data] !== undefined) formLink.elements[data].value = Link[data];
}
}; // Affiche les infos connues concernant les liens du questionnaire affiché :
var showLinkInfos = function showLinkInfos(Links, token) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "h2", introTitleForLink);
var listLinks = "";
for (var 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>";
Object(_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
var _loop = function _loop(_i) {
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);
});
};
for (var _i in Links) {
_loop(_i);
}
if (Links.length < config.nbLinksMax || config.nbLinksMax === 0) {
var newBtn = "<a href='#newLink' id='newLink' class='button'>" + addLinkTxt + "</a>";
Object(_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");
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configLinks, formLink);
});
}
}; // Envoi des données d'un lien.
var sendLinkForm = function sendLinkForm(token) {
var divResponseLink = document.getElementById("responseLink");
divResponseLink.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formLink);
var xhrLinkDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_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 (!Object(_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) {
var 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
Object(_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;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseLink, "p", response.errors, "", ["error"]);
} else Object(_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 :
var showFormIllustrationInfos = function 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
Object(_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 (var data in Illustration) {
if (formIllustration.elements[data] !== undefined) formIllustration.elements[data].value = Illustration[data];
}
}; // Affiche les infos connues concernant les illustrations du questionnaire affiché :
var showIllustrationInfos = function showIllustrationInfos(Illustrations, token) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "h2", introTitleForIllustration);
var listIllustrations = "";
for (var 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>";
Object(_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
var _loop2 = function _loop2(_i2) {
document.getElementById("#updateIllustration" + Illustrations[_i2].id).addEventListener("click", function (e) {
e.preventDefault();
showFormIllustrationInfos(Illustrations[_i2]);
window.location.assign("#illustrations");
});
document.getElementById("#deleteIllustration" + Illustrations[_i2].id).addEventListener("click", function (e) {
e.preventDefault();
showFormIllustrationInfos(Illustrations[_i2]);
formIllustration.elements["deleteOk"].value = true;
sendIllustrationForm(token);
});
};
for (var _i2 in Illustrations) {
_loop2(_i2);
}
if (Illustrations.length < config.nbIllustrationsMax || config.nbIllustrationsMax === 0) {
var newBtn = "<a href='#newIllustration' id='newIllustration' class='button'>" + addIllustrationTxt + "</a>";
Object(_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");
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configIllustrations, formIllustration);
});
}
}; // Envoi des données d'une illustration.
var sendIllustrationForm = function sendIllustrationForm(token) {
var divResponseIllustration = document.getElementById("responseIllustration");
divResponseIllustration.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formIllustration);
var datasWithFiles = new FormData(formIllustration); // car il me manque les informations du fichier avec la fonction getDatasFromInputs
var xhrIllustrationDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_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 (!Object(_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) {
var 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
Object(_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;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseIllustration, "p", response.errors, "", ["error"]);
} else Object(_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
var showFormQuestionInfos = function showFormQuestionInfos(Question) {
// On commence par cacher et vider tous les formulaires annexes
hideAllForms(); // Puis on affiche celui concerné
formQuestion.style.display = "block";
for (var 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
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configQuestionnaires.Question, formQuestion);
for (var _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é :
var showQuestionInfos = function showQuestionInfos(Questions, token) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "h2", introTitleForQuestion);
var listQuestions = "";
for (var 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>";
Object(_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
var _loop3 = function _loop3(_i3) {
document.getElementById("#updateQuestion" + Questions[_i3].Question.id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionInfos(Questions[_i3]);
window.location.assign("#questions");
});
document.getElementById("#deleteQuestion" + Questions[_i3].Question.id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionInfos(Questions[_i3]);
formQuestion.elements["deleteOk"].value = true;
sendQuestionForm(token);
});
};
for (var _i3 in Questions) {
_loop3(_i3);
}
if (Questions.length < config.nbQuestionsMax || config.nbQuestionsMax === 0) {
var newBtn = "<a href='#newQuestion' id='newQuestion' class='button'>" + addQuestionTxt + "</a>";
Object(_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");
Object(_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".
var sendQuestionForm = function sendQuestionForm(token) {
var divResponseQuestion = document.getElementById("responseQuestion");
divResponseQuestion.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formQuestion);
var xhrQuestionDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_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 (!Object(_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) {
var 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
Object(_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;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseQuestion, "p", response.errors, "", ["error"]);
} else Object(_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
var showFormQuestionnaireInfos = function showFormQuestionnaireInfos(id, token) {
var 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) {
var 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 (var data in response.Questionnaire) {
if (formQuestionnaire.elements[data] !== undefined) {
if (data === "publishingAt" && response.Questionnaire[data] !== null) formQuestionnaire.elements[data].value = Object(_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) {
var classification = "";
for (var i in response.Tags) {
if (i == 0) classification += response.Tags[i].name;else classification += "," + response.Tags[i].name;
}
formQuestionnaire.elements["classification"].value = classification;
}
if (!Object(_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.
var showNextQuestionnaires = function showNextQuestionnaires(token) {
var 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) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response.questionnaires)) {
var listHTML = "",
dayStr,
optionsDayStr = {
weekday: 'long'
};
for (var i in response.questionnaires) {
dayStr = new Intl.DateTimeFormat(lang, optionsDayStr).format(new Date(response.questionnaires[i].datePublishing));
listHTML += "<li>" + dayStr + " " + Object(_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) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "h3", nextQuestionnairesList.replace("#NB", response.questionnaires.length));
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(helpPublishingAt, "em", nextDateWithoutQuestionnaire + Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(new Date(response.dateNeeded), "fr"));
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "ul", listHTML, "", "", "", false);
for (var _i4 in response.questionnaires) {
document.getElementById("questionnaire_" + response.questionnaires[_i4].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();
};
var initialise = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
var isConnected, user, urlDatas;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
_context.next = 3;
return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["checkSession"])(["manager", "admin"], "/" + configTemplate.connectionPage, {
message: needBeConnected,
color: "error"
}, window.location);
case 3:
isConnected = _context.sent;
if (isConnected) {
divMain.style.display = "block";
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false);
Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message");
}
user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); // Mise à jour du lien "compte" du header :
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configTemplate); // Initialisation des formulaires :
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configQuestionnaires, formSearch);
Object(_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 :
urlDatas = Object(_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();
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formSearch);
var 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) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response)) {
if (response.length === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", searchQuestionnaireWithNoResult, "", ["info"]);else {
var selectHTML = "<option value=''></option>";
for (var i in response) {
selectHTML += "<option value='" + response[i].id + "'>" + response[i].title + "</option>";
}
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "select", selectHTML, "selectSearch");
var searchSelect = document.getElementById("selectSearch");
searchSelect.addEventListener("change", function () {
if (searchSelect.value !== "") showFormQuestionnaireInfos(searchSelect.value, user.token);
});
}
} else Object(_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 = "";
var tags = inputClassification.value.split(",");
tags.reverse();
var lastTag = tags[0].trim();
if (lastTag.length >= 2) {
var 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) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response)) {
helpClassification.innerHTML = "";
for (var i in response) {
Object(_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 = "";
var groupInput = inputGroup.value.trim();
if (groupInput.length >= configQuestionnaires.searchGroups.minlength) {
var xhrSearchGroups = new XMLHttpRequest();
xhrSearchGroups.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.groupRoutes + configQuestionnaires.searchGroupsRoute);
xhrSearchGroups.onreadystatechange = function () {
var _this = this;
if (this.readyState == XMLHttpRequest.DONE) {
(function () {
var response = JSON.parse(_this.responseText);
if (_this.status === 200 && Array.isArray(response)) {
helpGroup.innerHTML = "";
var _loop4 = function _loop4(i) {
Object(_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 (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response[i].maxRank)) inputRankInGroup.value = response[i].maxRank + 1;else inputRankInGroup.value = 1;
helpGroup.innerHTML = "";
});
};
for (var i in response) {
_loop4(i);
}
}
})();
}
};
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 = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formQuestionnaire);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.rankInGroup) && Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.GroupId)) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", needGroupIfRank, "", ["error"]);else {
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.rankInGroup) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.GroupId)) datas.rankInGroup = 1;
var xhrQuestionnaireDatas = new XMLHttpRequest();
if (!Object(_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 (!Object(_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) {
var response = JSON.parse(this.responseText);
if (this.status === 201 && response.id != undefined) {
Object(_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;
Object(_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;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
} else Object(_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);
});
}
_context.next = 11;
break;
case 7:
_context.prev = 7;
_context.t0 = _context["catch"](0);
console.error(_context.t0);
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divCrash, "p", serverError, "", ["error"]);
case 11:
case "end":
return _context.stop();
}
}
}, _callee, null, [[0, 7]]);
}));
return function initialise() {
return _ref.apply(this, arguments);
};
}();
initialise();
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
/***/ }),
/***/ "./src/tools/clientstorage.js":
/*!************************************!*\
!*** ./src/tools/clientstorage.js ***!
\************************************/
/*! exports provided: saveLocaly, getLocaly, removeLocaly */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
// 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
var saveLocaly = function saveLocaly(name, data) {
localStorage.setItem(name, JSON.stringify(data));
};
var getLocaly = function getLocaly(name) {
var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
};
var removeLocaly = function removeLocaly(name) {
localStorage.removeItem(name);
};
/***/ }),
/***/ "./src/tools/dom.js":
/*!**************************!*\
!*** ./src/tools/dom.js ***!
\**************************/
/*! exports provided: addElement */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
/* 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__);
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
// Fonction associant les attributs fournis à un champ de formulaire
var addElement = function addElement(eltParent, eltType) {
var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
var newElement = document.createElement(eltType);
if (!Object(_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 (var i in eltClass) {
newElement.classList.add(eltClass[i]);
}
}
if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
{
for (var attributName in eltAttributes) {
newElement.setAttribute(attributName, eltAttributes[attributName]);
}
}
if (!Object(_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 ***!
\*********************************/
/*! exports provided: helloDev, updateAccountLink */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; });
// Ce script fournit des fonctions utilisées sur toutes les pages du site
var helloDev = function 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;
};
var updateAccountLink = function updateAccountLink(status, configTemplate) {
var link = document.getElementById("accountHeadLink");
var homePage = status + "HomePage";
link.href = "/" + configTemplate[homePage];
};
/***/ }),
/***/ "./src/tools/forms.js":
/*!****************************!*\
!*** ./src/tools/forms.js ***!
\****************************/
/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; });
/* 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__);
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// Fonction associant les attributs fournis à un champ de formulaire
var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) {
for (var i in myForm.elements) {
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) {
var idInput = myForm.elements[i].id;
if (inputsConf[idInput] !== undefined) {
var inputHTML = document.getElementById(idInput);
for (var 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.
var getDatasFromInputs = function getDatasFromInputs(myForm) {
var datas = {};
var formData = new FormData(myForm);
var _iterator = _createForOfIteratorHelper(formData.entries()),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var entrie = _step.value;
datas[entrie[0]] = entrie[1];
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return datas;
}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
// Revoir pour les select
var empyForm = function empyForm(myForm) {
var formData = new FormData(myForm);
var _iterator2 = _createForOfIteratorHelper(formData.entries()),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var entrie = _step2.value;
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 = "";
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
return true;
}; // Vide et cache le formulaire
var empyAndHideForm = function empyAndHideForm(myForm) {
empyForm(myForm);
myForm.style.display = "none";
};
/***/ }),
/***/ "./src/tools/url.js":
/*!**************************!*\
!*** ./src/tools/url.js ***!
\**************************/
/*! exports provided: getUrlParams */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; });
/* 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
var getUrlParams = function getUrlParams() {
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false;
var parameters = location.search.substring(1).split("&");
if (!Array.isArray(parameters) || parameters.length === 0) return false;
var param,
datas = {};
for (var 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 ***!
\****************************/
/*! exports provided: getTimeDifference, setSession, checkAnswerDatas, checkSession */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; });
/* 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__);
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js");
var getTimeDifference = function 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
var 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.
var setSession = function setSession(userId, token, durationTS) {
var storageUser = {
id: userId,
token: token,
duration: durationTS
};
Object(_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
var checkAnswerDatas = function checkAnswerDatas(datas) {
var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer");
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) {
var answer = JSON.parse(lastAnswer);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions) && (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) || !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.GroupId))) {
datas.duration = answer.duration;
datas.nbCorrectAnswers = answer.nbCorrectAnswers;
datas.nbQuestions = answer.nbQuestions;
if (!Object(_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é
var checkSession = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
var status,
urlRedirection,
message,
urlWanted,
_args = arguments;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
status = _args.length > 0 && _args[0] !== undefined ? _args[0] : [];
urlRedirection = _args.length > 1 ? _args[1] : undefined;
message = _args.length > 2 ? _args[2] : undefined;
urlWanted = _args.length > 3 ? _args[3] : undefined;
return _context.abrupt("return", new Promise(function (resolve, reject) {
var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user");
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) {
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
} else {
var user = JSON.parse(userDatas);
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) {
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
} else {
var 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 = function () {
var 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
Object(_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) {
var 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 {
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
}
} else {
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
}
};
xhr.onerror = function () {
return reject(xhr.statusText);
};
xhr.send();
}
}
}));
case 5:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function checkSession() {
return _ref.apply(this, arguments);
};
}(); // Cette fonction sert à la précédente en cas de connexion non valide
var redirectUser = function redirectUser(urlRedirection, message, urlWanted) {
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection);
};
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbGx1c3RyYXRpb25zLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvaW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9saW5rcy5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL2lsbHVzdHJhdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9saW5rJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9uJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9ubmFpcmUkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvdXNlciQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvZ2VuZXJhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9pbGx1c3RyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvbGluay5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mvd2lraWxlcm5pL2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFuYWdlUXVlc3Rpb25uYWlyZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZm9ybXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsiaW5zdGFuY2UiLCJyZXF1aXJlIiwibW9kdWxlIiwiZXhwb3J0cyIsImlsbHVzdHJhdGlvbnNSb3V0ZSIsIklsbHVzdHJhdGlvbiIsImFsdCIsIm1heGxlbmd0aCIsInRpdGxlIiwiY2FwdGlvbiIsImltYWdlIiwicmVxdWlyZWQiLCJhY2NlcHQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJqb2luIiwiZGlySWxsdXN0cmF0aW9uc1RtcCIsImRpcklsbHVzdHJhdGlvbnMiLCJ1c2VycyIsInF1ZXN0aW9ubmFpcmVzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJkZWZhdWx0UmVjZWlwdERheXMiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJtYXhRdWVzdGlvbm5haXJlU2VuZGVkQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiZmllbGROZXdRdWVzdGlvbm5haXJlcyIsIm5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWluIiwibmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNYXgiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZXMiLCJkaXJXZWJRdWVzdGlvbm5haXJlcyIsImxpbmtzUm91dGUiLCJMaW5rIiwidXJsIiwiYW5jaG9yIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJyZWdlbmVyYXRlSFRNTCIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJncm91cFJvdXRlcyIsImdldEdyb3VwUm91dGUiLCJwcmV2aWV3R3JvdXBSb3V0ZXMiLCJzZWFyY2hHcm91cHNSb3V0ZSIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0QWRtaW5TdGF0cyIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsInNhdmVBbnN3ZXJzUm91dGUiLCJRdWVzdGlvbm5haXJlIiwic2x1ZyIsImludHJvZHVjdGlvbiIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiR3JvdXAiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwic2VhcmNoIiwic2VhcmNoR3JvdXBzIiwiZGlyQ2FjaGVHcm91cHMiLCJkaXJDYWNoZVRhZ3MiLCJkaXJIVE1MR3JvdXBzIiwiZGlySFRNTE5ld3MiLCJkaXJIVE1MVGFncyIsImRpcldlYkdyb3VwcyIsImRpcldlYk5ld3MiLCJkaXJXZWJUYWdzIiwibmJSYW5kb21SZXN1bHRzIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwidXNlclJvdXRlcyIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiY2hlY2tJZklzRW1haWxmcmVlUm91dGUiLCJjaGVja0xvZ2luUm91dGUiLCJjaGVja05ld0xvZ2luTGlua1JvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJjcmVhdGVVc2VyUm91dGUiLCJnZXRHb2RDaGlsZHMiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJnZXRVc2VySW5mb3MiLCJnZXRVc2Vyc1F1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hVc2VyUm91dGUiLCJzaWdudXBDb21wbGV0aW9uUm91dGUiLCJzdWJzY3JpYmVSb3V0ZSIsInVuc3Vic2NyaWJlUm91dGUiLCJ1cGRhdGVVc2VySW5mb3MiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4IiwiZGlyQ2FjaGVVc2Vyc1dpdGhvdXRBbnN3ZXJzIiwiYWRkQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwiYWxlcnROZXdXaW5kb3ciLCJiYWRVcmwiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwiYnRuUHJvcG9zZUNvbm5lY3Rpb24iLCJidG5Qcm9wb3NlU3Vic2NyaWJlIiwiYnRuU2hvd09uV2ViU2l0ZSIsImRlbGV0ZUJ0blR4dCIsImRlbGV0ZUZhaWxNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aENyb24iLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoSWQiLCJmYWlsQXV0aFRva2VuIiwibmVlZGVkUGFyYW1zIiwibmV4dFBhZ2UiLCJub3RBbGxvd2VkIiwibm90UmVxdWlyZWQiLCJub3RWYWxpZEZvcm1hdCIsInByZXZpb3VzUGFnZSIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsInNpdGVIVE1MVGl0bGUiLCJzaXRlTWV0YURlc2NyaXB0aW9uIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzY3JpcHRUaW1pbmdJbmZvIiwic3RhdHNBZG1pbiIsInN1YnNjcmlwdGlvbkNhbGwiLCJ1cGRhdGVCdG5UeHQiLCJ1cGRhdGVPa01lc3NhZ2UiLCJhZGRlZE9rTWVzc2FnZSIsImFkZElsbHVzdHJhdGlvblR4dCIsImRlZmF1bHRBbHQiLCJkZWxldGVkT2tNZXNzYWdlIiwiaW50cm9Ob0lsbHVzdHJhdGlvbiIsImludHJvVGl0bGVGb3JJbGx1c3RyYXRpb24iLCJuZWVkR29vZEZpbGUiLCJuZWVkR29vZExvbmdBbHQiLCJuZWVkR29vZExvbmdDYXB0aW9uIiwibmVlZEdvb2RMb25nVGl0bGUiLCJuZWVkR29vZExvbmdVcmwiLCJuZWVkTWF4SWxsdXN0cmF0aW9uc0ZvclF1ZXN0aW9ubmFpcmUiLCJuZWVkUXVlc3Rpb25uYWlyZUZvcklsbHVzdHJhdGlvbiIsIm5lZWRVbmlxdWVVcmwiLCJuZWVkVXJsIiwibm90Rm91bmQiLCJ1cGRhdGVkT2tNZXNzYWdlIiwiYWRkTGlua1R4dCIsImRlZmF1bHRWYWx1ZUZvckxpbmsiLCJpbnRyb05vTGluayIsImludHJvVGl0bGVGb3JMaW5rIiwibmVlZEFuY2hvciIsIm5lZWRHb29kTG9uZ0FuY2hvciIsIm5lZWRNYXhMaW5rc0ZvclF1ZXN0aW9ubmFpcmUiLCJuZWVkTm90VG9vTG9uZ1VybCIsIm5lZWRRdWVzdGlvbm5haXJlIiwibmVlZFZhbGlkVXJsIiwiYWRkUXVlc3Rpb25UeHQiLCJpbnRyb05vUXVlc3Rpb24iLCJpbnRyb1RpdGxlRm9yUXVlc3Rpb24iLCJuZWVkTWF4UXVlc3Rpb25zIiwibmVlZE5vdFRvb0xvbmdUZXh0IiwibmVlZE51bWJlckZvclJhbmsiLCJuZWVkVGV4dCIsImJ0blNlbmRSZXNwb25zZSIsImJ0blNoYXJlUXVpelR4dCIsImJ0blNoYXJlUXVpek1haWxCb2R5IiwiYnRuU2hvd1F1ZXN0aW9ubmFpcmUiLCJjb3JyZWN0QW5zd2VyVHh0IiwiZXN0aW1hdGVkVGltZSIsImVzdGltYXRlZFRpbWVPcHRpb24iLCJzaG9ydCIsIm1lZGl1bSIsImxvbmciLCJleHBsYW5hdGlvbkJlZm9yZVR4dCIsImhhdmVCZWVuUHVibGlzaGVkIiwiaGF2ZUJlZW5SZWdlbmVyYXRlZCIsImxhc3RVcGRhdGVkIiwibGlua0dvVG9OZXh0RWxlbWVudCIsImxpbmtHb1RvUXVpeiIsIm5lZWRDb3JyZWN0UHVibGlzaGluZ0RhdGUiLCJuZWVkRXN0aW1hdGVkVGltZSIsIm5lZWRHcm91cElmUmFuayIsIm5lZWRJbnRyb2R1Y3Rpb24iLCJuZWVkS25vd0lmSXNQdWJsaXNoZWQiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkTm90VG9vTG9uZ1RpdGxlIiwibmVlZFRpdGxlIiwibmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZSIsIm5leHRRdWVzdGlvbm5haXJlc0xpc3QiLCJxdWVzdGlvbm5haXJlc05hbWUiLCJxdWVzdGlvbm5haXJlTmVlZEJlQ29tcGxldGVkIiwicHVibGlzaGVkQXQiLCJwdWJsaXNoZWRCeSIsInNlYXJjaFF1ZXN0aW9ubmFpcmVSZXN1bHRUaXRsZSIsInNlYXJjaFF1ZXN0aW9ubmFpcmVXaXRoTm9SZXN1bHQiLCJzZWFyY2hRdWVzdGlvbm5haXJlV2l0aFJlc3VsdCIsIndyb25nQW5zd2VyVHh0IiwiYWxyZWFkeUNvbm5lY3RlZCIsImJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZSIsImJhZFBhc3N3b3JkIiwiYnllYnllTWVzc2FnZSIsImNvbm5lY3Rpb25PayIsImNyZWF0aW9uT2tNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImZhaWxCb3RUZXN0IiwiZmFpbEJvdFRlc3RMb2ciLCJmb3Jtc0VtYWlsTGFiZWwiLCJmb3Jtc0VtYWlsUGxhY2Vob2xkZXIiLCJmb3Jtc0VtYWlsMlBsYWNlaG9sZGVyIiwiZm9ybXNDR1VPa0xhYmVsIiwiZm9ybXNTdWJtaXRUeHQiLCJnb2RmYXRoZXJGb3VuZCIsImdvZGZhdGhlck5vdEZvdW5kIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NVc2VyTmJHb2RDaGlsZHMiLCJpbmZvc1VzZXJOb0dvZGNoaWxkcyIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVCb2R5VHh0IiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua09rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rVHh0IiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rVHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyTGlua1R4dCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsIm1haWxVcGRhdGVMb2dpbkxpbmtUeHQiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rVHh0IiwibWFpbFZhbGlkYXRpb25NZXNzYWdlIiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lTGlua1R4dCIsIm1haWxXZWxjb21lU3ViamVjdCIsIm5lZWRCZUNvbm5lY3RlZCIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRFbWFpbCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZExvbmdQYXNzV29yZCIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRTdGF0dXMiLCJuZWVkVGltZURpZmZlcmVuY2UiLCJuZWVkVUdDT2siLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJwYXNzd29yZENvcGllZCIsInNlYXJjaFVzZXJzV2l0aG91dFJlc3VsdCIsInRvb01hbnlMb2dpbkZhaWxzIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwidXBkYXRlZE5lZWRHb29kRW1haWwiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJ1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ3ZWxjb21lTWVzc2FnZSIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJyZXBsYWNlIiwibWF0Y2hlZCIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJkYXRlU3RyaW5nIiwibGFuZyIsIm15RGF0ZSIsIkRhdGUiLCJteURheSIsImdldERhdGUiLCJteU1vdW50aCIsImdldE1vbnRoIiwibXlZZWFyIiwiZ2V0RnVsbFllYXIiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwiaSIsImhlYWRMaW5rcyIsImF0dHJpYnV0ZXMiLCJocmVmIiwiaWQiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsInRhZ3NMaXN0VHh0IiwiYWJvdXRQYWdlIiwiY2d1UGFnZSIsImRlbGV0ZUxpbmtQYWdlIiwibG9naW5MaW5rUGFnZSIsIm5ld0xvZ2luTGlua1BhZ2UiLCJzdG9wTWFpbFBhZ2UiLCJ1cGRhdGVBY2NvdW50UGFnZSIsInVzZXJIb21lUGFnZVR4dCIsInZhbGlkYXRpb25MaW5rUGFnZSIsIm1haWxSZWNpcGllbnRUeHQiLCJsaWNlbmNlVHh0IiwiaG9tZVBhZ2VUeHQiLCJob21lQnRuQWJvdXRUeHQiLCJob21lQnRuU3Vic2NyaWJlVHh0IiwiaG9tZVN1YmNyaXB0aW9uRm9ybVRpdGxlIiwibmV3c0xpc3RUaXRsZSIsInRhZ0xpc3RUaXRsZSIsInRhZ0xpc3RNZXRhRGVzYyIsInRhZ0xpc3RJbnRybyIsImFuc3dlcnNFeHBsYW5hdGlvbnNMaW5rVGV4dCIsInF1aXpFbGVtZW50TGlua3NJbnRybyIsInF1aXpFbGVtZW50U3ViY3JpcHRpb25Gb3JtVGl0bGUiLCJleHBsYW5hdGlvbkVsZW1lbnRUeHQiLCJ0d2l0dGVyQWNjb3VudCIsIm1heFF1ZXN0aW9ubmFpcmVzU2l0ZUhvbWVQYWdlIiwiY29uZmlnIiwiY29uZmlnSWxsdXN0cmF0aW9ucyIsImNvbmZpZ0xpbmtzIiwiY29uZmlnUXVlc3Rpb25uYWlyZXMiLCJjb25maWdUZW1wbGF0ZSIsImJ0bk5ld1F1ZXN0aW9ubmFpcmUiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiYnRuUHJldmlld1F1ZXN0aW9ubmFpcmUiLCJkZWxldGVDaGVja0JveCIsImRpdkNyYXNoIiwiZGl2SWxsdXN0cmF0aW9ucyIsImRpdkxpbmtzIiwiZGl2TWFpbiIsImRpdk1lc3NhZ2UiLCJkaXZRdWVzdGlvbm5haXJlcyIsImRpdlF1ZXN0aW9ucyIsImRpdlJlc3BvbnNlIiwiZGl2U2VhcmNoUmVzdWx0IiwiZm9ybUxpbmsiLCJmb3JtSWxsdXN0cmF0aW9uIiwiZm9ybVF1ZXN0aW9uIiwiZm9ybVF1ZXN0aW9ubmFpcmUiLCJmb3JtU2VhcmNoIiwiaGVscENsYXNzaWZpY2F0aW9uIiwiaGVscEdyb3VwIiwiaGVscFB1Ymxpc2hpbmdBdCIsImlucHV0Q2xhc3NpZmljYXRpb24iLCJpbnB1dEdyb3VwIiwiaW5wdXRSYW5rSW5Hcm91cCIsImhpZGVBbGxGb3JtcyIsImVtcHlBbmRIaWRlRm9ybSIsInNob3dGb3JtTGlua0luZm9zIiwic3R5bGUiLCJkaXNwbGF5Iiwic2V0QXR0cmlidXRlc1RvSW5wdXRzIiwiZGF0YSIsImVsZW1lbnRzIiwic2hvd0xpbmtJbmZvcyIsIkxpbmtzIiwidG9rZW4iLCJhZGRFbGVtZW50IiwibGlzdExpbmtzIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsIndpbmRvdyIsImxvY2F0aW9uIiwiYXNzaWduIiwic2VuZExpbmtGb3JtIiwibmV3QnRuIiwiZGl2UmVzcG9uc2VMaW5rIiwiaW5uZXJIVE1MIiwiZGF0YXMiLCJnZXREYXRhc0Zyb21JbnB1dHMiLCJ4aHJMaW5rRGF0YXMiLCJYTUxIdHRwUmVxdWVzdCIsImRlbGV0ZU9rIiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJzdGF0dXMiLCJtZXNzYWdlIiwicXVlc3Rpb25uYWlyZSIsIkFycmF5IiwiaXNBcnJheSIsInNob3dOZXh0UXVlc3Rpb25uYWlyZXMiLCJlcnJvcnMiLCJzZXRSZXF1ZXN0SGVhZGVyIiwic2VuZCIsInN0cmluZ2lmeSIsInNob3dGb3JtSWxsdXN0cmF0aW9uSW5mb3MiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzaG93SWxsdXN0cmF0aW9uSW5mb3MiLCJJbGx1c3RyYXRpb25zIiwibGlzdElsbHVzdHJhdGlvbnMiLCJzZW5kSWxsdXN0cmF0aW9uRm9ybSIsImRpdlJlc3BvbnNlSWxsdXN0cmF0aW9uIiwiZGF0YXNXaXRoRmlsZXMiLCJGb3JtRGF0YSIsInhocklsbHVzdHJhdGlvbkRhdGFzIiwic2hvd0Zvcm1RdWVzdGlvbkluZm9zIiwiQ2hvaWNlcyIsImlzQ29ycmVjdCIsImNoZWNrZWQiLCJzaG93UXVlc3Rpb25JbmZvcyIsIlF1ZXN0aW9ucyIsImxpc3RRdWVzdGlvbnMiLCJzZW5kUXVlc3Rpb25Gb3JtIiwiZGl2UmVzcG9uc2VRdWVzdGlvbiIsInhoclF1ZXN0aW9uRGF0YXMiLCJzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyIsInhockdldEluZm9zIiwicmVzZXQiLCJkYXRlRm9ybWF0IiwiVGFncyIsImNsYXNzaWZpY2F0aW9uIiwic2V0QXR0cmlidXRlIiwieGhyTmV4dFF1ZXN0aW9ubmFpcmVzIiwibGlzdEhUTUwiLCJkYXlTdHIiLCJvcHRpb25zRGF5U3RyIiwid2Vla2RheSIsIkludGwiLCJEYXRlVGltZUZvcm1hdCIsImZvcm1hdCIsImRhdGVQdWJsaXNoaW5nIiwiaXNQdWJsaXNoYWJsZSIsImRhdGVOZWVkZWQiLCJ0YXJnZXQiLCJzcGxpdCIsImluaXRpYWxpc2UiLCJjaGVja1Nlc3Npb24iLCJjb2xvciIsImlzQ29ubmVjdGVkIiwiZ2V0TG9jYWx5IiwicmVtb3ZlTG9jYWx5IiwidXNlciIsInVwZGF0ZUFjY291bnRMaW5rIiwidXJsRGF0YXMiLCJnZXRVcmxQYXJhbXMiLCJ4aHJTZWFyY2giLCJzZWxlY3RIVE1MIiwic2VhcmNoU2VsZWN0IiwidGFncyIsInJldmVyc2UiLCJsYXN0VGFnIiwieGhyU2VhcmNoVGFncyIsImdyb3VwSW5wdXQiLCJ4aHJTZWFyY2hHcm91cHMiLCJtYXhSYW5rIiwicmFua0luR3JvdXAiLCJHcm91cElkIiwieGhyUXVlc3Rpb25uYWlyZURhdGFzIiwiY29uc29sZSIsImVycm9yIiwiaGVsbG9EZXYiLCJzYXZlTG9jYWx5IiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTGlzdCIsImFkZCIsImF0dHJpYnV0TmFtZSIsImFwcGVuZENoaWxkIiwibG9nIiwibGluayIsImhvbWVQYWdlIiwiaW5wdXRzQ29uZiIsIm15Rm9ybSIsImlkSW5wdXQiLCJpbnB1dEhUTUwiLCJhdHRyaWJ1dGUiLCJmb3JtRGF0YSIsImVudHJpZXMiLCJlbnRyaWUiLCJlbXB5Rm9ybSIsInR5cGUiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJkZWNvZGVVUkkiLCJnZXRUaW1lRGlmZmVyZW5jZSIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0Iiwic2V0U2Vzc2lvbiIsInVzZXJJZCIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwibmJRdWVzdGlvbnMiLCJRdWVzdGlvbm5haXJlSWQiLCJ1cmxSZWRpcmVjdGlvbiIsInVybFdhbnRlZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwibm93IiwieGhyIiwib25sb2FkIiwiaXNWYWxpZCIsImxhbmd1YWdlIiwidGltZURpZmZlcmVuY2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIiwib25lcnJvciIsInN0YXR1c1RleHQiXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQSxJQUFNQSxRQUFRLEdBQUdDLG1CQUFPLENBQUMseUNBQUQsQ0FBeEI7O0FBRUFDLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0k7QUFDQUMsb0JBQWtCLEVBQUUsZ0JBRnhCO0FBR0k7QUFDQUMsY0FBWSxFQUNaO0FBQ0lDLE9BQUcsRUFBRTtBQUFFQyxlQUFTLEVBQUU7QUFBYixLQURUO0FBRUlDLFNBQUss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QixDQUFaO0FBQ0FFLDZCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBSyxxQkFBRyxDQUFDUSxPQUFKLEdBQWM7QUFBQSwyQkFBTVosTUFBTSxDQUFDSSxHQUFHLENBQUNTLFVBQUwsQ0FBWjtBQUFBLG1CQUFkOztBQUNBVCxxQkFBRyxDQUFDNUgsSUFBSjtBQUNIO0FBQ0o7QUFDSixhQXRFTSxDQUZpQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFIOztBQUFBLGtCQUFaMkMsWUFBWTtBQUFBO0FBQUE7QUFBQSxHQUFsQixDLENBMEVQOztBQUNBLElBQU0rRSxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDTixjQUFELEVBQWlCM0gsT0FBakIsRUFBMEI0SCxTQUExQixFQUNyQjtBQUNJLE1BQUcsQ0FBQ25SLDJEQUFPLENBQUN1SixPQUFELENBQVgsRUFDSTJFLG9FQUFVLENBQUMsU0FBRCxFQUFZM0UsT0FBWixDQUFWO0FBQ0osTUFBRyxDQUFDdkosMkRBQU8sQ0FBQ21SLFNBQUQsQ0FBWCxFQUNJakQsb0VBQVUsQ0FBQyxLQUFELEVBQVFpRCxTQUFSLENBQVY7QUFDSixNQUFHLENBQUNuUiwyREFBTyxDQUFDa1IsY0FBRCxDQUFYLEVBQ0loSixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCOEksY0FBdkI7QUFDUCxDQVJELEMiLCJmaWxlIjoiLi9KUy9tYW5hZ2VRdWVzdGlvbm5haXJlcy5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9tYW5hZ2VRdWVzdGlvbm5haXJlcy5qc1wiKTtcbiIsImNvbnN0IGluc3RhbmNlID0gcmVxdWlyZShcIi4vaW5zdGFuY2VcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgaWxsdXN0cmF0aW9uc1JvdXRlOiBcIi9pbGx1c3RyYXRpb24vXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgSWxsdXN0cmF0aW9uIDpcbiAgICB7XG4gICAgICAgIGFsdDogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgICAgICB0aXRsZTogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgICAgICBjYXB0aW9uOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgICAgIGltYWdlOiB7IHJlcXVpcmVkOiB0cnVlLCBhY2NlcHQ6IGluc3RhbmNlLm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbi5qb2luKFwiLFwiKSB9XG4gICAgfSxcbiAgICAvLyBmaWxlcyB1cGxvYWQgdGVtcG9yeSBkaXJcbiAgICBkaXJJbGx1c3RyYXRpb25zVG1wIDogXCJ0ZW1wXCIsXG4gICAgZGlySWxsdXN0cmF0aW9uczogXCJmcm9udC9wdWJsaWMvaW1nL3F1aXpzXCJcbn07IiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmkgKGxvY2FsKVwiLFxuICAgIHNlbmRlckVtYWlsOiBcImJvbmpvdXJAd2lraWxlcm5pLmNvbVwiLFxuICAgIGFkbWluTGFuZzogXCJmclwiLFxuICAgIHRoZW1lOiBcIndpa2lsZXJuaVwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pIChsb2NhbClcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwiV0xcIiwgLy8gY2FzZS1zZW5zaXRpdmUgYW5kIGNhbid0IGNvbnRhaW4gXCJAXCIgIVxuICAgIGRlZmF1bHRSZWNlaXB0RGF5czogXCIxNDdcIiwgLy8gUGFyIGTDqWZhdXQsIHF1ZWwocykgam91cihzKSBkZSBsYSBzZW1haW5lLCBsJ3V0aWxpc2F0ZXVyIHJlw6dvaXQtaWwgcXVlbHF1ZSBjaG9zZSA/ICgxPWRpbWFuY2hlLCAyPWx1bmRpLi4uIDc9c2FtZWRpKVxuICAgIGNyb25UaW1pbmdBbGVydEluU2Vjb25kZTogMTIwLCAvLyBmb3IgbG9nc1xuICAgIHJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGU6IDMsIC8vIGlkZW1cbiAgICB0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VyczogXCI0OGhcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3plaXQvbXNcbiAgICB0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VyczogXCIyNGhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXM6IFwiMTgwIGRheXNcIixcbiAgICB0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VyczogXCIxaFwiLC8vIGZvciBlbWFpbCAmIHBhc3N3b3JkIGNoYW5naW5nXG4gICAgdG9rZW5EZWxldGVVc2VyVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXM6IFwiNyBkYXlzXCIsIC8vIHRva2VuIHNlbmQgd2l0aCBzdWJzY3JpcHRpb24ncyBlbWFpbHNcbiAgICBmcmVlQWNjb3VudFRpbWluZ0luRGF5czogMCwvLyBpZiAwID0gdW5saW1pdGVkXG4gICAgZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzOiAzLFxuICAgIGFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXM6IDEwLFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiAzLFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDIsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTIsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjcsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyMSwgLy8gaWRlbVxuICAgIG1heFF1ZXN0aW9ubmFpcmVTZW5kZWRBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIHN1YnNjcmlwdGlvbidzIGUtbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIGZpZWxkTmV3UXVlc3Rpb25uYWlyZXMgOiBcInB1Ymxpc2hpbmdBdFwiLCAvLyBmaWVsZCB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbGlzdCBvZiB0aGUgbGFzdCBxdWVzdGlvbm5haXJlcywgY2FuIGJlIFwiY3JlYXRlZEF0XCIsIFwidXBkYXRlZEF0XCIgb3IgXCJwdWJsaXNoaW5nQXRcIlxuICAgIC8vIEdyb3VwcyA6XG4gICAgbmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNaW46IDEsXG4gICAgbmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNYXg6IDAsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDEsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNTAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAwLFxuICAgIC8vIFF1ZXN0aW9ucyAmIHJlc3BvbnNlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVzXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgbGlua3NSb3V0ZTogXCIvbGluay9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBMaW5rIDpcbiAgICB7XG4gICAgICAgIHVybDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgYW5jaG9yOiB7IG1heGxlbmd0aDogMTUwLCByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57ICAgIFxuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBxdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWVzdGlvbm5haXJlXCIsLy8gbGEgYmFzZSDDoCBsYXF1ZWxsZSBzJ2Fqb3V0ZSBsZXMgcm91dGVzIHN1aXZhbnRlc1xuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgZ2V0UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvZ2V0XCIsXG4gICAgZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL2dldHJhbmRvbVwiLCBcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHJlZ2VuZXJhdGVIVE1MOiBcIi9odG1scmVnZW5lcmF0ZWRcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICAvLyAtLSBncm91cGVzIDpcbiAgICBncm91cFJvdXRlczogXCIvZ3JvdXBcIixcbiAgICBnZXRHcm91cFJvdXRlOiBcIi9nZXQvXCIsXG4gICAgcHJldmlld0dyb3VwUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgc2VhcmNoR3JvdXBzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICAvLyAtLSBxdWVzdGlvbnMgJiBjaG9pY2VzIDpcbiAgICBxdWVzdGlvbnNSb3V0ZTogXCIvcXVlc3Rpb24vXCIsXG4gICAgLy8gLS0gdGFncyA6XG4gICAgdGFnc1NlYXJjaFJvdXRlOiBcIi90YWdzL3NlYXJjaC9cIixcbiAgICAvLyAtLSBhbnN3ZXJzIDpcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsLy8gZm9uY3Rpb25uZSBhdXNzaSBwb3VyIGxlcyBncm91cGVzXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLC8vIGlkZW1cbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCBsYWlzc8OpIHZpZGUgZGFucyBsZSBmb3JtdWxhaXJlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIEdyb3VwIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCBsYWlzc8OpIHZpZGUgZGFucyBsZSBmb3JtdWxhaXJlXG4gICAgfSxcbiAgICBRdWVzdGlvbiA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICByYW5rOiB7IHJlcXVpcmVkOiB0cnVlLCBtaW46MSwgZGVmYXVsdFZhbHVlOjEgfVxuICAgIH0sICAgICAgICAgIFxuICAgIENob2ljZSA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2g6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNlYXJjaEdyb3VwczogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgLy8gRW1wbGFjZW1lbnQgZGVzIGZpY2hpZXJzIEpTT04gZ8OpbsOpcsOpcyA6XG4gICAgZGlyQ2FjaGVHcm91cHMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL2dyb3Vwc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICAvLyBFbXBsYWNlbWVudCBkZXMgZmljaGllcnMgSFRNTCBnw6luw6lyw6lzIDpcbiAgICBkaXJIVE1MR3JvdXBzIDogXCJmcm9udC9wdWJsaWMvcXVpei9ncFwiLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlcyA6IFwiZnJvbnQvcHVibGljL3F1aXpcIixcbiAgICBkaXJIVE1MTmV3cyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIC8vIElkZW0gbWFpcyBwb3VyIHVybHMgOlxuICAgIGRpcldlYkdyb3VwcyA6IFwicXVpei9ncFwiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmVzIDogXCJxdWl6XCIsXG4gICAgZGlyV2ViTmV3cyA6IFwicXVpenMvXCIsXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenMvXCIsXG4gICAgLy8gbGltaXRlIGRlcyByw6lzdWx0YXQgZHUgbW90ZXVyIGRlIHJlY2hlcmNoZSwgcXVhbmQgZGVtYW5kZSBkZSByw6lzdWx0YXRzIGF1IGhhc2FyZCA6XG4gICAgbmJSYW5kb21SZXN1bHRzIDogMyxcbiAgICAvKiBWYWxldXJzIGVuIGZhaXQgZMOpZmluaWVzIGRhbnMgaW5zdGFuY2UuanMgZG9uYyDDoCBzdXBwcmltZXIgcXVhbmQgcGx1cyB1dGlsaXPDqWVzIGFpbGxldXJzIDogKi9cbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIiwgICBcbiAgICBjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZTogXCIvaXNlbWFpbGZyZWVcIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZTogXCIvY29uZmlybW5ld2xvZ2luL1wiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgY29ubmVjdGlvbldpdGhMaW5rUm91dGU6IFwiL2NoZWNrbG9naW5saW5rXCIsXG4gICAgY3JlYXRlVXNlclJvdXRlOiBcIi9jcmVhdGVcIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLCAgICBcbiAgICBnZXRHb2RmYXRoZXJSb3V0ZTogXCIvZ2V0Z29kZmF0aGVyaWRcIixcbiAgICBnZXRMb2dpbkxpbmtSb3V0ZTogXCIvZ2V0bG9naW5saW5rXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBnZXRVc2Vyc1F1ZXN0aW9ubmFpcmVzUm91dGU6IFwiL2dldHVzZXJzcXVlc3Rpb25uYWlyZXMvXCIsLy8gbGVzIHF1ZXN0aW9ubmFpcmVzIGF1eHF1ZWxzIGwndXRpbGlzYXRldXIgYSBkw6lqw6AgZXUgYWNjw6hzIHZpYSBzb24gYWJvbm5lbWVudCAgICBcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBzaWdudXBDb21wbGV0aW9uUm91dGU6IFwiL3NpZ251cGNvbXBsZXRpb24vXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNlYXJjaDogeyBtaW5sZW5ndGg6IDEsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6IDg0MCxcbiAgICAvLyBKU09OIGRpclxuICAgIGRpckNhY2hlVXNlcnMgOiBcImRhdGFzL3VzZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL2Fuc3dlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzV2l0aG91dEFuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL3dpdGhvdXRcIlxufTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9nZW5lcmFsXCI6IFwiLi4vbGFuZy9mci9nZW5lcmFsLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvZ2VuZXJhbCRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvaWxsdXN0cmF0aW9uXCI6IFwiLi4vbGFuZy9mci9pbGx1c3RyYXRpb24uanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9pbGx1c3RyYXRpb24kXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2xpbmtcIjogXCIuLi9sYW5nL2ZyL2xpbmsuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9saW5rJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9xdWVzdGlvblwiOiBcIi4uL2xhbmcvZnIvcXVlc3Rpb24uanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9xdWVzdGlvbiRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvcXVlc3Rpb25uYWlyZVwiOiBcIi4uL2xhbmcvZnIvcXVlc3Rpb25uYWlyZS5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3F1ZXN0aW9ubmFpcmUkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3VzZXJcIjogXCIuLi9sYW5nL2ZyL3VzZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC91c2VyJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhZGRCdG5UeHQ6IFwiQWpvdXRlclwiLFxuICAgIGFkZE9rTWVzc2FnZSA6IFwiTGVzIGRvbm7DqWVzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCIsXG4gICAgYWxlcnROZXdXaW5kb3c6IFwibm91dmVsbGUgZmVuw6p0cmVcIixcbiAgICBiYWRVcmwgOiBcIlRlbnRhdGl2ZSBkJ2FjY8OocyDDoCB1bmUgcGFnZSBuJ2V4aXN0YW50IHBhcyA6XCIsXG4gICAgYnRuTGlua1RvUXVlc3Rpb25uYWlyZSA6IFwiQWZmaWNoZXIgIVwiLFxuICAgIGJ0blByb3Bvc2VDb25uZWN0aW9uOiBcIkplIG1lIGNvbm5lY3RlLlwiLFxuICAgIGJ0blByb3Bvc2VTdWJzY3JpYmU6IFwiSmUgY3LDqWUgbW9uIGNvbXB0ZS5cIixcbiAgICBidG5TaG93T25XZWJTaXRlOiBcIkxpcmUgbGEgc3VpdGUgc3VyICNTSVRFX05BTUVcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgZGVsZXRlRmFpbE1lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGRlIGwnZW5yZWdpc3RyZW1lbnQgI0lEIGEgw6ljaG91w6kuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoQ3JvbiA6IFwiVGVudGF0aXZlIGRlIGxhbmNlbWVudCBkJ3VuIGNyb24gc2FucyBsZSBib24gdG9rZW4uXCIsXG4gICAgZmFpbEF1dGhIZWFkZXIgOiBcIkFic2VuY2UgZGUgaGVhZGVyIEF1dGhvcml6YXRpb24uXCIsXG4gICAgZmFpbEF1dGhJZCA6IFwiSWRlbnRpZmlhbnQgbm9uIHZhbGlkZSA6IFwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgbmV4dFBhZ2UgOiBcIlBhZ2Ugc3VpdmFudGVcIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgbm90VmFsaWRGb3JtYXQgOiBcIkZvcm1hdCBub24gdmFsaWRlLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBzZXJ2ZXJFcnJvciA6IFwiRMOpc29sw6kuIFVuZSBlcnJldXIgaW1wcsOpdnVlIGVzdCBzdXJ2ZW51ZS4gU2kgY2VsYSBwZXJzaXN0ZSwgbidow6lzaXRleiDDoCBwcsOpdmVuaXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIHNlcnZlckVycm9yQWRtaW4gOiBcIkJ1ZyBkZSBsJ2FwcGxpY2F0aW9uIDpcIixcbiAgICBzaXRlSFRNTFRpdGxlIDogXCJXaWtpTGVybmkgOiBsYSBjdWx0dXJlIGfDqW7DqXJhbGUgZW4gbGliZXJ0w6lcIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJBdmVjIFdpa2lMZXJuaSwgdm91cyBhcHByZW5leiByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIGNob3Nlcy4gVm91cyByZWNldmV6IGRlIGNvdXJ0cyBhcnRpY2xlcyBsaXNpYmxlcyBlbiBxdWVscXVlcyBtaW51dGVzLiBEZXMgcXVpenMgdm91cyBwZXJtZXR0ZW50IGVuc3VpdGUgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGF2ZXogcmV0ZW51LlwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0luZm8gOiBcIkR1csOpZSBkZSBsYSByw6lwb25zZSA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc3RhdHNBZG1pbiA6IFwiRHVyYW50IGxlcyBkZXJuacOocmVzIDI0aCA6IE5CX1VTRVJTXzI0SCBjb21wdGVzIG9udCDDqXTDqSBjcsOpw6lzLCBOQl9TVUJTQ1JJUFRJT05TXzI0SCB2YWxpZMOpcyBldCBOQl9VU0VSU19ERUxFVEVEXzI0SCBzdXBwcmltw6lzLiBOQl9BTlNXRVJTXzI0SCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5FbiB0b3V0LCBpbCB5IGEgOiBOQl9VU0VSU19UT1QgY29tcHRlcywgZG9udCBOQl9TVUJTQ1JJUFRJT05TX1RPVCB2YWxpZMOpcyBldCBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gY29tcHRlcyBwcsOpbWl1bS4gTkJfQU5TV0VSU19UT1QgcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+UGFybWkgbGVzIE5CX1VTRVJTX0RFTEVURURfVE9UIGNvbXB0ZXMgc3VwcHJpbcOpcywgTkJfVVNFUlNfREVMRVRFRF9WQUxJREVEIGF2YWllbnQgdmFsaWTDqSBsZXVyIGNvbXB0ZSBldCBOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0gYXZhaWVudCBzb3VzY3JpdCB1biBjb21wdGUgcHLDqW1pdW0uXCIsXG4gICAgc3Vic2NyaXB0aW9uQ2FsbDogXCJJbnNjcml2ZXotdm91cyAhXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlIDogXCJMYSBtaXNlIMOgIGpvdXIgw6Agam91ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhZGRlZE9rTWVzc2FnZTogXCJMJ2lsbHVzdHJhdGlvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGFkZElsbHVzdHJhdGlvblR4dDogXCJBam91dGVyIHVuZSBpbGx1c3RyYXRpb25cIixcbiAgICBkZWZhdWx0QWx0IDogXCJJbGx1c3RyYXRpb24gZHUgcXVpelwiLFxuICAgIGRlbGV0ZWRPa01lc3NhZ2U6IFwiTCdpbGx1c3RyYXRpb24gYSBiaWVuIMOpdMOpIHN1cHByaW3DqWUuXCIsXG4gICAgaW50cm9Ob0lsbHVzdHJhdGlvbiA6IFwiQXVjdW5lIGlsbHVzdHJhdGlvbiBwb3VyIGwnaW5zdGFudC5cIixcbiAgICBpbnRyb1RpdGxlRm9ySWxsdXN0cmF0aW9uIDogXCJJbGx1c3RyYXRpb25zIGR1IHF1aXpcIixcbiAgICBuZWVkR29vZEZpbGUgOiBcIlZvdHJlIGZpY2hpZXIgbidhIHBhcyDDqXTDqSBhY2NlcHTDqS5cIixcbiAgICBuZWVkR29vZExvbmdBbHQgOiBcIkxlIHRleHRlIGRlIGxhIHByb3ByacOpdMOpICdhbHQnIG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEdvb2RMb25nQ2FwdGlvbiA6IFwiTGUgdGV4dGUgZGUgbGEgbMOpZ2VuZGUgZGUgbCdpbWFnZSBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRHb29kTG9uZ1RpdGxlIDogXCJMZSB0ZXh0ZSBkZSBsYSBwcm9wcmnDqXTDqSAndGl0bGUnIG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEdvb2RMb25nVXJsIDogXCJMJ3VybCBkZSBsJ2ltYWdlIGRvaXQgY29udGVuaXIgZW50cmUgNSBldCAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZE1heElsbHVzdHJhdGlvbnNGb3JRdWVzdGlvbm5haXJlIDogXCJWb3VzIGF2ZXogZMOpasOgIGF0dGVpbnQgbGUgbm9tYnJlIG1heGltYWwgZCdpbGx1c3RyYXRpb25zIHBvdXIgY2UgcXVlc3Rpb25uYWlyZS5cIixcbiAgICBuZWVkUXVlc3Rpb25uYWlyZUZvcklsbHVzdHJhdGlvbiA6IFwiVGVudGF0aXZlIGQnYWpvdXQvbWlzZSDDoCBqb3VyL3N1cHByZWVzc2lvbiBkJ3VuZSBpbGx1c3RyYXRpb24gcG91ciB1biBxdWVzdGlvbm5haXJlIG4nYXlhbnQgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZFVuaXF1ZVVybCA6IFwiTCd1cmwgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuZSBhdXRyZSBpbWFnZS5cIixcbiAgICBuZWVkVXJsIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuZSB1cmwgcG91ciBsJ2ltYWdlLlwiLFxuICAgIG5vdEZvdW5kOiBcIkwnZW5yZWdpc3RyZW1lbnQgZGUgbCdpbGx1c3RyYXRpb24gbidhIHBhcyDDqXTDqSB0cm91dsOpIDogXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJMJ2lsbHVzdHJhdGlvbiBhIGJpZW4gw6l0w6kgbW9kaWZpw6llLlwiLFxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYWRkZWRPa01lc3NhZ2U6IFwiTGUgbGllbiBhIGJpZW4gw6l0w6kgYWpvdXTDqS5cIixcbiAgICBhZGRMaW5rVHh0OiBcIkFqb3V0ZXIgdW4gbGllblwiLFxuICAgIGRlZmF1bHRWYWx1ZUZvckxpbms6IFwiTGlyZSBsJ2FydGljbGUgc3VyIFdpa2lww6lkaWEuXCIsXG4gICAgZGVsZXRlZE9rTWVzc2FnZTogXCJMZSBsaWVuIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuXCIsXG4gICAgaW50cm9Ob0xpbmsgOiBcIkF1Y3VuIGxpZW4gcG91ciBsJ2luc3RhbnQuXCIsXG4gICAgaW50cm9UaXRsZUZvckxpbmsgOiBcIkxlY3R1cmVzIHByb3Bvc8OpZXNcIixcbiAgICBuZWVkQW5jaG9yIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuZSBhbmNyZSBwb3VyIGNlIGxpZW4uXCIsXG4gICAgbmVlZEdvb2RMb25nQW5jaG9yIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuZSBhbmNyZSBwb3VyIGNlIGxpZW4gY29tcHRhbnQgZW50cmUgNSBldCAxNTAgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZE1heExpbmtzRm9yUXVlc3Rpb25uYWlyZSA6IFwiVm91cyBhdmV6IGTDqWrDoCBhdHRlaW50IGxlIG5vbWJyZSBtYXhpbWFsIGRlIGxpZW5zIHBvdXIgY2UgcXVlc3Rpb25uYWlyZS5cIixcbiAgICBuZWVkTm90VG9vTG9uZ1VybCA6IFwiTWVyY2kgZGUgIHNhaXNpciB1biB1cmwgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRRdWVzdGlvbm5haXJlIDogXCJMZSBxdWVzdGlvbm5haXJlIGR1IGxpZW4gbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWRVcmwgOiBcIk1lcmNpIGRlICBzYWlzaXIgbCd1cmwgZHUgbGllbi5cIixcbiAgICBuZWVkVmFsaWRVcmwgOiBcIk1lcmNpIGRlICBzYWlzaXIgdW4gdXJsIGF5YW50IHVuIGZvcm1hdCB2YWxpZGUuXCIsXG4gICAgbm90Rm91bmQgOiBcIkwnZW5yZWdpc3RyZW1lbnQgZHUgbGllbiBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJMZSBsaWVuIGEgYmllbiDDqXTDqSBtb2RpZmnDqS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYWRkT2tNZXNzYWdlOiBcIkxhIHF1ZXN0aW9uIGEgYmllbiDDqXTDqSBham91dMOpZS5cIixcbiAgICBhZGRRdWVzdGlvblR4dDogXCJBam91dGVyIHVuZSBxdWVzdGlvblwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZTogXCJMYSBxdWVzdGlvbiBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpZS5cIixcbiAgICBpbnRyb05vUXVlc3Rpb246IFwiQXVjdW5lIHF1ZXN0aW9uIG4nYSDDqXTDqSBzYWlzaWUgcG91ciBsJ2luc3RhbnRcIixcbiAgICBpbnRyb1RpdGxlRm9yUXVlc3Rpb246IFwiTGVzIHF1ZXN0aW9ucyBlbnJlZ2lzdHLDqWVzXCIsXG4gICAgbmVlZE1heFF1ZXN0aW9uczogXCJWb3VzIGF2ZXogZMOpasOgIGF0dGVpbnQgbGUgbm9tYnJlIG1heGltYWwgZGUgcXVlc3Rpb25zIHBvdXIgY2UgcXVlc3Rpb25uYWlyZSA6IFwiLCAgICAgICAgIFxuICAgIG5lZWROb3RUb29Mb25nVGV4dDogXCJMYSBxdWVzdGlvbiBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWROdW1iZXJGb3JSYW5rIDogXCJWb3VzIGRldmV6IGZvdXJuaXIgdW4gbm9tYnJlIHN1cMOpcmlldXIgb3Ugw6lnYWwgw6AgMSBwb3VyIGxlIHJhbmcgZGUgY2V0dGUgcXVlc3Rpb24uXCIsIFxuICAgIG5lZWRRdWVzdGlvbm5haXJlOiBcIkxlIHF1ZXN0aW9ubmFpcmUgY29uY2VybsOpIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkVGV4dDogXCJNZXJjaSBkZSBzYWlzaXIgbGUgdGV4dGUgZGUgbGEgcXVlc3Rpb24gIVwiLCAgIFxuICAgIG5vdEZvdW5kOiBcIkwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgcXVlc3Rpb24gbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIHVwZGF0ZU9rTWVzc2FnZTogXCJMYSBxdWVzdGlvbiBhIGJpZW4gw6l0w6kgbW9kaWZpw6llLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBidG5Qcm9wb3NlQ29ubmVjdGlvbjogXCJKZSBtZSBjb25uZWN0ZS5cIiwvLyBkw6lwbGFjw6kgZGFucyBnZW5lcmFsLmpzXG4gICAgYnRuUHJvcG9zZVN1YnNjcmliZTogXCJKZSBjcsOpZSBtb24gY29tcHRlLlwiLC8vaWRlbVxuICAgIGJ0blNlbmRSZXNwb25zZTogXCJUZXN0ZXogdm9zIHLDqXBvbnNlcy5cIixcbiAgICBidG5TaGFyZVF1aXpUeHQ6IFwiUGFydGFnZXIgdmlhIFwiLFxuICAgIGJ0blNoYXJlUXVpek1haWxCb2R5OiBcIkJvbmpvdXIsJTBBJTBBVm9pY2klMjB1biUyMGxpZW4lMjBpbnRlcm5ldCUyMHF1aSUyMGRldnJhaXQlMjB0J2ludMOpcmVzc2VyIDolMEFcIiwgICAgXG4gICAgYnRuU2hvd1F1ZXN0aW9ubmFpcmU6IFwiUsOpcG9uZHJlIGF1IHF1aXogIVwiLFxuICAgIGNvcnJlY3RBbnN3ZXJUeHQ6IFwiQm9ubmUgcsOpcG9uc2VcIixcbiAgICBlc3RpbWF0ZWRUaW1lOiBcIkR1csOpZSBkZSBsZWN0dXJlIGVzdGltw6llIDogXCIsXG4gICAgZXN0aW1hdGVkVGltZU9wdGlvbiA6XG4gICAge1xuICAgICAgICBzaG9ydDogXCJjb3VydGVcIixcbiAgICAgICAgbWVkaXVtOiBcIm1veWVubmVcIixcbiAgICAgICAgbG9uZzogXCJsb25ndWVcIlxuICAgIH0sXG4gICAgZXhwbGFuYXRpb25CZWZvcmVUeHQ6IFwiRXh0cmFpdCA6XCIsXG4gICAgaGF2ZUJlZW5QdWJsaXNoZWQgOiBcIjpOQiBub3V2ZWF1eCBxdWVzdGlvbm5haXJlcyBvbnQgw6l0w6kgcHVibGnDqXMuXCIsXG4gICAgaGF2ZUJlZW5SZWdlbmVyYXRlZCA6IFwiTGVzIHBhZ2VzIEhUTUwgZGUgI05CMSBxdWVzdGlvbm5haXJlcyBvdSDDqWzDqW1lbnRzIGRlIGdyb3VwZXMsICNOQjIgcXVpenMgZ3JvdXDDqXMgZXQgI05CMyB0aMOobWVzIG9udCDDqXTDqSByZWfDqW7DqXLDqXMuXCIsXG4gICAgbGFzdFVwZGF0ZWQ6IFwiRGVybmnDqHJlIG1pc2Ugw6Agam91ciwgbGUgXCIsXG4gICAgbGlua0dvVG9OZXh0RWxlbWVudDogXCJBcnRpY2xlIHN1aXZhbnRcIixcbiAgICBsaW5rR29Ub1F1aXo6IFwiQWNjw6lkZXIgYXUgcXVpelwiLCAgICBcbiAgICBuZWVkQ29ycmVjdFB1Ymxpc2hpbmdEYXRlOiBcIkxhIGRhdGUgZGUgcHVibGljYXRpb24gZm91cm5pZSBuJ2EgcGFzIHVuIGZvcm1hdCB2YWxpZGUuXCIsXG4gICAgbmVlZEVzdGltYXRlZFRpbWU6IFwiTWVyY2kgZGUgc8OpbGVjdGlvbm5lciB1bmUgZXN0aW1hdGlvbiBkZSBsYSBkdXLDqWUgZGUgY2UgcXVpei5cIixcbiAgICBuZWVkR3JvdXBJZlJhbms6IFwiVm91cyBhdmV6IHNhaXNpIHVuIHJhbmcgZGUgY2xhc3NlbWVudCwgc2FucyBzw6lsZWN0aW9ubmVyIGxlIGdyb3VwZSBkdSBxdWl6LlwiLFxuICAgIG5lZWRJbnRyb2R1Y3Rpb246IFwiTWVyY2kgZGUgZm91cm5pciB1biB0ZXh0ZSBkJ2ludHJvZHVjdGlvbiDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWRLbm93SWZJc1B1Ymxpc2hlZDogXCJJbCBmYXV0IHNhdm9pciBzaSBjZSBxdWl6IGVzdCBwdWJsacOpLlwiLFxuICAgIG5lZWRMYW5ndWFnZTogXCJWb3VzIGRldmV6IHPDqWxlY3Rpb25uZXIgbGEgbGFuZ3VlIGRlIGNlIHF1aXouXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdUaXRsZTogXCJMZSB0aXRyZSBkdSBxdWl6IG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZE51bWJlckZvclJhbms6IFwiVm91cyBkZXZleiBzYWlzaXIgdW4gbm9tYnJlIGVudGllciBwb3VyIGxlIHJhbmcgZGUgY2UgcXVlc3Rpb25uYWlyZSBkYW5zIHNvbiBncm91cGUuXCIsICAgICAgICAgICAgICBcbiAgICBuZWVkVGl0bGU6IFwiTWVyY2kgZGUgZm91cm5pciB1biB0aXRyZSDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWRVbmlxdWVVcmw6IFwiTCd1cmwgZHUgcXVpeiBkb2l0IMOqdHJlIHVuaXF1ZS5cIixcbiAgICBuZWVkVXJsOiBcIk1lcmNpIGRlIGZvdXJuaXIgbCd1cmwgw6Agdm90cmUgcXVpei5cIixcbiAgICBuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlOiBcIlByb2NoYWluZSBkYXRlIHNhbnMgcXVpeiBwcm9ncmFtbcOpIDogXCIsXG4gICAgbmV4dFF1ZXN0aW9ubmFpcmVzTGlzdDogXCJMZXMgI05CIHByb2NoYWlucyBxdWl6cyBkZXZhbnQgw6p0cmUgcHVibGnDqXNcIixcbiAgICBxdWVzdGlvbm5haXJlc05hbWU6IFwicXVpelwiLFxuICAgIHF1ZXN0aW9ubmFpcmVOZWVkQmVDb21wbGV0ZWQ6IFwiUXVpeiBpbmNvbXBsZXRcIixcbiAgICBwdWJsaXNoZWRBdDogXCIsIGxlXCIsXG4gICAgcHVibGlzaGVkQnk6IFwiUXVpeiBwdWJsacOpIHBhclwiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVSZXN1bHRUaXRsZSA6IFwiUsOpc3VsdGF0IHBvdXIgdm90cmUgcmVjaGVyY2hlXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZVdpdGhOb1Jlc3VsdCA6IFwiQXVjdW4gcXVpeiBuJ2Egw6l0w6kgdHJvdXbDqSBwb3VyIHZvdHJlIHJlY2hlcmNoZS5cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlV2l0aFJlc3VsdCA6IFwiSWwgeSBhICNOQiBhcnRpY2xlI1MgY29ycmVzcG9uZGFudCDDoCB2b3RyZSByZWNoZXJjaGUgOlwiLFxuICAgIHdyb25nQW5zd2VyVHh0OiBcIk1hdXZhaXNlIHLDqXBvbnNlXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFscmVhZHlDb25uZWN0ZWQ6IFwiVm91cyDDqnRlcyBkw6lqw6AgY29ubmVjdMOpIGF1IHNpdGUgIVwiLFxuICAgIGJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBuZSBzZW1ibGUgcGFzIHZhbGlkZSBvdSBiaWVuIGlsIGEgZXhwaXLDqS4gVm91cyBwb3V2ZXogZW4gcmVjZXZvaXIgdW4gbm91dmVhdSA8YSBocmVmPScjVVJMJz5lbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBuZSBjb3JyZXNwb25kIGF1eCBpbmZvcm1hdGlvbnMgc2Fpc2llcy5cIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIiwgXG4gICAgY29ubmVjdGlvbk9rOiBcIkNvbm5leGlvbiByw6l1c3NpZS5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZTogXCJUZW50YXRpdmUgZGUgc3VwcHJlc3Npb24gZCd1biB1dGlsaXNhdGV1ciBpbmV4aXN0YW50IDogXCIsXG4gICAgZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIGluYWN0aWZzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZTogXCJMJ3V0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biBjb21wdGUgdXRpbGlzYXRldXIgbidhIMOpdMOpIHRyb3V2w6kgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBmYWlsQm90VGVzdDogXCJVbiBwcm9ibMOobWUgYSDDqXTDqSByZW5jb250csOpIGR1cmFudCB2b3RyZSBpbnNjcmlwdGlvbi4gRW4gY2FzIGRlIGRpZmZpY3VsdMOpLCBuJ2jDqXNpdGV6IHBhcyBjb250YWN0ZXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIGZhaWxCb3RUZXN0TG9nOiBcIlVuZSBpbnNjcmlwdGlvbiBhIMOpdMOpIGJsb3F1w6llLCBwYXJjZSBxdWUgbGUgY2hhbXAgZW1haWwyIMOpdGFpdCByZW5zZWlnbsOpIGF2ZWMgOiBcIixcbiAgICBmb3Jtc0VtYWlsTGFiZWw6IFwiRS1tYWlsIDpcIixcbiAgICBmb3Jtc0VtYWlsUGxhY2Vob2xkZXI6IFwiVm90cmUgYWRyZXNzZSBlLW1haWxcIixcbiAgICBmb3Jtc0VtYWlsMlBsYWNlaG9sZGVyOiBcIlNpIHZvdXMgdm95ZXogY2UgY2hhbXAsIGxhaXNzZXotbGUgdmlkZVwiLC8vY2hhbXAgcXVpIG5lIGRldnJhaXQgcGFzIMOqdHJlIHZpc2libGUgcGFyIGRlcyBodW1haW5zXG4gICAgZm9ybXNDR1VPa0xhYmVsOiBcIkonYWNjZXB0ZSA8YSBocmVmPSNsaW5rIHRhcmdldD1cXFwiX2JsYW5rXFxcIiByZWw9XFxcIm5vb3BlbmVyXFxcIiB0aXRsZT1cXFwiw4AgbGlyZSA6KVxcXCI+bGVzIENvbmRpdGlvbnMgR8OpbsOpcmFsZSBkJ1V0aWxpc2F0aW9uPC9hPiBkdSBzaXRlIChyZXF1aXMpLlwiLFxuICAgIGZvcm1zU3VibWl0VHh0OiBcIkplIG0nYWJvbm5lICFcIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBcXFwicGFycmFpblxcXCIgYSBiaWVuIMOpdMOpIHRyb3V2w6kuIENldHRlIHBlcnNvbm5lIHNlcmEgYXZlcnRpZSBxdWUgdm91cyBsJ2F2ZXogZMOpc2lnbsOpZS5cIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJEw6lzb2zDqSBtYWlzIGF1Y3VuIHV0aWxpc2F0ZXVyIG4nYSDDqXTDqSB0cm91dsOpIHBvdXIgY2UgY29kZSAvIGUtbWFpbCBkZSBwYXJyYWluYWdlIDooXCIsXG4gICAgaW5mb3NBZG1pbkdvZGZhdGhlcjogXCJDZXQgdXRpbGlzYXRldXIgYSDDqXTDqSBwYXJyYWluw6kgcGFyIFwiLFxuICAgIGluZm9zQWRtaW5OYkdvZENoaWxkczogXCJTZXMgI05CIGZpbGxldWxzIDogXCIsXG4gICAgaW5mb3NVc2VyRm9yQWRtaW46IFwiQ2V0IHV0aWxpc2F0ZXVyIChpZDogSURfVVNFUikgYSA8Yj5jcsOpw6kgc29uIGNvbXB0ZSBsZSBEQVRFX0NSRUE8L2I+LCBsYSBkZXJuacOocmUgbWlzZSDDoCBqb3VyIGRhdGFudCBkdSBEQVRFX1VQREFURS48YnI+PGI+RGF0ZSBkZSBzYSBkZXJuacOocmUgY29ubmV4aW9uIDogREFURV9DT05ORUNUSU9OLjwvYj5cIixcbiAgICBpbmZvc1VzZXJOYkdvZENoaWxkczogXCJWb2ljaSBsZXMgI05CIHV0aWxpc2F0ZXVyKHMpIGluc2NyaXQocykgZW4gdm91cyBkw6lzaWduYW50IGNvbW1lIFxcXCJwYXJyYWluXFxcIiA6IFwiLFxuICAgIGluZm9zVXNlck5vR29kY2hpbGRzOiBcIlBvdXIgbCdpbnN0YW50LCBhdWN1bmUgcGVyc29ubmUgbmUgcydlc3QgaW5zY3JpdGUsIGVuIHZvdXMgZMOpc2lnbmFudCBjb21tZSBcXFwicGFycmFpblxcXCIuXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIGNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gY2ktZGVzc291cyBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbERlbGV0ZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgY29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBzdXBwcmVzc2lvbiBuJ2VzdCBwYXMgdmFsaWRlIG91IGFsb3JzIGlsIGEgZXhwaXLDqS5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtUeHQgOiBcIkNvbmZpcm1lci5cIixcbiAgICBtYWlsRGVsZXRlU3ViamVjdCA6IFwiQ29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50ICpUSU1JTkcqICFcIixcbiAgICBtYWlsTG9naW5MaW5rU3ViamVjdCA6IFwiVm90cmUgbGllbiBkZSBjb25uZXhpb24uXCIsXG4gICAgbWFpbExvZ2luTGlua1R4dCA6IFwiTWUgY29ubmVjdGVyLlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5HcsOiY2Ugw6Agdm91cywgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPGJyPlNpIGRhbnMgbCdhdmVuaXIgY2V0dGUgcGVyc29ubmUgc291c2NyaXQgdW4gYWJvbm5lbWVudCBwcsOpbWl1bSwgdm90cmUgcHJvcHJlIGFib25uZW1lbnQgc2VyYSBwcm9sb25nw6kgZGUgMzAgam91cnMuPC9wPjxwPkVuY29yZSBtZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzLCB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS5cXG5TaSBkYW5zIGwnYXZlbmlyIGNldHRlIHBlcnNvbm5lIHNvdXNjcml0IHVuIGFib25uZW1lbnQgcHLDqW1pdW0sIHZvdHJlIHByb3ByZSBhYm9ubmVtZW50IHNlcmEgcHJvbG9uZ8OpIGRlIDMwIGpvdXJzLlxcbkVuY29yZSBtZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyTGlua1R4dCA6IFwiTWUgY29ubmVjdGVyIMOgIG1vbiBjb21wdGUuXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gY2ktZGVzc291cyBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2U6IFwiQ2VwZW5kYW50LCB2b3VzIGF2ZXogbW9kaWZpw6kgYXUgbW9pbnMgdW4gZGUgdm9zIGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24gKGUtbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uPGJyPkVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rVHh0IDogXCJWYWxpZGVyLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZTogXCJMYSBtaXNlIMOgIGpvdXIgZGUgdm9zIGlkZW50aWZpYW50cyBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpblN1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cy5cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciBldCBjb21wbMOpdGVyIHZvdHJlIGluc2NyaXB0aW9uLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMgZGFucyBsZXMgMjRoLjwvcD5cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciB2YWxpZGVyIGV0IGNvbXBsw6l0ZXIgdm90cmUgaW5zY3JpcHRpb24sIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvblwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1R4dCA6IFwiVmFsaWRlciBtb24gY29tcHRlLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBpbnNjcmlwdGlvbiBlc3QgYmllbiBlbnJlZ2lzdHLDqWUuXFxuUG91ciBsYSBmaW5hbGlzZXIsIG1lcmNpIGRlIGNsaXF1ZXIgZGFucyBsZXMgMjQgSCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGQnw6p0cmUgZW52b3nDqSDDoCB2b3RyZSBhZHJlc3NlIGUtbWFpbCAoI0VNQUlMKS5cIixcbiAgICBtYWlsV2VsY29tZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3VzIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPjxicj5TaSB2b3VzIGF2ZXogbGEgbW9pbmRyZSBxdWVzdGlvbiBvdSBzdWdnZXN0aW9uIGNvbmNlcm5hbnQgTk9NX1NJVEUsIG4naMOpc2l0ZXogcGFzIMOgIG1lIGNvbnRhY3RlciBlbiDDqWNyaXZhbnQgw6AgPGI+RU1BSUw8L2I+Ljxicj48YnI+SmUgdm91cyBjb25zZWlsbGUgZCdhaWxsZXVycyBkJ2Fqb3V0ZXIgPGI+RU1BSUw8L2I+IMOgIHZvdHJlIGNhcm5ldCBkJ2FkcmVzc2VzIDxiPnBvdXIgw6l2aXRlciBxdWUgbGVzIHByb2NoYWlucyBlbnZvaXMgZGUgTk9NX1NJVEUgbidhcnJpdmVudCBlbiA8aT5zcGFtPC9pPjwvYj4uPGJyPjxicj5QYXIgYWlsbGV1cnMsIHBvdXIgZ8OpcmVyIHZvdHJlIGFib25uZW1lbnQsIGFjY8OpZGVyIMOgIHZvcyBpbmZvcm1hdGlvbnMgb3UgZW5jb3JlIGNoZXJjaGVyIHBsdXMgZmFjaWxlbWVudCBwYXJtaSBsZSBjb250ZW51IGR1IHNpdGUsIHZvdXMgcG91dmV6IMOgIHRvdXQgbW9tZW50IHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSB1dGlsaXNhdGV1ci48YnI+PGJyPlBvdXIgY2UgZmFpcmUsIHV0aWxpc2V6IGxlIGxpZW4gY2ktZGVzc291cy48YnI+PGJyPsOAIGJpZW50w7R0IHN1ciBOT01fU0lURS5cIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblZvdXMgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS4gTWVyY2kgZXQgYmllbnZlbnVlICFcXG5cXG5TaSB2b3VzIGF2ZXogbGEgbW9pbmRyZSBxdWVzdGlvbiBvdSBzdWdnZXN0aW9uIGNvbmNlcm5hbnQgTk9NX1NJVEUsIG4naMOpc2l0ZXogcGFzIMOgIG1lIGNvbnRhY3RlciBlbiDDqWNyaXZhbnQgw6AgRU1BSUwuXFxuXFxuSmUgdm91cyBjb25zZWlsbGUgZCdhaWxsZXVycyBkJ2Fqb3V0ZXIgRU1BSUwgw6Agdm90cmUgY2FybmV0IGQnYWRyZXNzZXMgcG91ciDDqXZpdGVyIHF1ZSBsZXMgcHJvY2hhaW5zIGVudm9pcyBkZSBOT01fU0lURSBuJ2Fycml2ZW50IGVuIFxcXCJzcGFtXFxcIi5cXG5cXG5QYXIgYWlsbGV1cnMsIHBvdXIgZ8OpcmVyIHZvdHJlIGFib25uZW1lbnQsIGFjY8OpZGVyIMOgIHZvcyBpbmZvcm1hdGlvbnMgb3UgZW5jb3JlIGNoZXJjaGVyIHBsdXMgZmFjaWxlbWVudCBwYXJtaSBsZSBjb250ZW51IGR1IHNpdGUsIHZvdXMgcG91dmV6IMOgIHRvdXQgbW9tZW50IHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSB1dGlsaXNhdGV1ci5cXG5cXG5Qb3VyIGNlIGZhaXJlLCB1dGlsaXNleiBsZSBsaWVuIHN1aXZhbnQgOiBMSU5LX1VSTFxcblxcbsOAIGJpZW50w7R0IHN1ciBOT01fU0lURS5cIixcbiAgICBtYWlsV2VsY29tZUxpbmtUeHQgOiBcIk1lIGNvbm5lY3RlciDDoCBtb24gY29tcHRlLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBuZWVkQmVDb25uZWN0ZWQ6IFwiVm91cyBkZXZleiDDqnRyZSBjb25uZWN0w6kgcG91ciBhY2PDqWRlciDDoCBjZXR0ZSBwYWdlLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIG5lZWRLbm93TmV3c2xldHRlck9rIDogXCJJbCBmYXV0IHNhdm9pciBzaSBsJ3V0aWxpc2F0ZXVyIGFjY2VwdGUgb3UgcmVmdXNlIGRlIHJlY2V2b2lyIGxhIG5ld3NsZXR0ZXIuXCIsXG4gICAgbmVlZExhbmd1YWdlIDogXCJJbCBtYW5xdWUgbGUgY29kZSBsYW5ndWUuXCIsXG4gICAgbmVlZExvbmdQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UgZCdhdSBtb2lucyBNSU5fTEVOR1RIIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWROYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdOYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgNzAgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdW5lIGFkcmVzc2UgZS1tYWlsIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlLlwiLFxuICAgIG5lZWRTTVRQIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRTTVRQTm90Rm91bmQgOiBcIklsIG1hbnF1ZSB1biBzZXJ2ZXVyIFNNVFAgdmFsaWRlLlwiLFxuICAgIG5lZWRTdGF0dXMgOiBcIklsIG1hbnF1ZSBsZSBzdGF0dXQuXCIsXG4gICAgbmVlZFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGNvbm5hw650cmUgbGUgbm9tYnJlIGRlIG1pbnV0ZXMgZHUgZMOpY2FsYWdlIGhvcmFpcmUuXCIsXG4gICAgbmVlZFVHQ09rIDogXCJNZXJjaSBkJ2FjY2VwdGVyIGxlcyBDR1UgcG91ciBjcsOpZXIgdm90cmUgY29tcHRlLlwiLFxuICAgIG5lZWRVbmlxdWVFbWFpbDogXCJMJ2FkcmVzc2UgZS1tYWlsIHF1ZSB2b3VzIGF2ZXogc2Fpc2llIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBvdXIgdW4gY29tcHRlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWRWYWxpZGF0aW9uVG9Mb2dpbiA6IFwiVm91cyBkZXZleiBkJ2Fib3JkIHZhbGlkZXIgdm90cmUgY29tcHRlIGF2YW50IGRlIHBvdXZvaXIgdm91cyBjb25uZWN0ZXIuIFBvdXIgY2UgZmFpcmUsIHVuIG5vdXZlYXUgbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUgOiBcIkxhIGRhdGUgZGUgZGVybmnDqHJlIGNvbm5leGlvbiBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgIHBhc3N3b3JkQ29waWVkOiBcIkxlIG1vdCBkZSBwYXNzZSBnw6luw6lyw6kgYSDDqXTDqSBjb3Bpw6kgZGFucyBsZSBwcmVzc2UtcGFwaWVyIGRlIHZvdHJlIG9yZGluYXRldXIgKG91IG1vYmlsZSkuIFZvdXMgcG91dmV6IGxlIFxcXCJjb2xsZXJcXFwiIG/DuSB2b3VzIGxlIHNvdWhhaXRlei5cIixcbiAgICBzZWFyY2hVc2Vyc1dpdGhvdXRSZXN1bHQ6IFwiTCd1dGlsaXNhdGV1ciBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgdG9vTWFueUxvZ2luRmFpbHMgOiBcIkTDqXNvbMOpIG1haXMgaWwgeSBhIGV1IHRyb3AgZGUgdGVudGF0aXZlcyBkZSBjb25uZXhpb24gaW5mcnVjdHVldXNlcyBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLiBWb3VzIGRldmV6IGF0dGVuZHJlIE1JTlVURVMgbWludXRlcyBwb3VyIGVzc2F5ZXIgZGUgbm91dmVhdS5cIixcbiAgICB1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQgOiBcIkwnaWRlbnRpZmlhbnQgZm91cm5pIHBvdXIgbGUgcGFycmFpbiBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIHV0aWxpc2F0ZXVyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIG4nYSBwYXMgdW4gZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIDogXCJNYWlzIGxlIG5vdXZlYXUgY29kZSBwYXJyYWluIG4nYSBwdSDDqnRyZSByZXRlbnUsIGNhciBpbCBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBvdSDDoCBsJ3V0aWxpc2F0ZXVyIGx1aS1tw6ptZS5cIixcbiAgICB1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIHNhaXNpZSAoTkVXX0VNQUlMKSBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llLCBjYXIgZWxsZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwb3VyIHVuIGF1dHJlIGNvbXB0ZS5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0ZXogbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSB2b3RyZSBjb21wdGUuIFZvdXMgcG91dmV6IHZvdXMgeSBjb25uZWN0ZXIgPGEgaHJlZj0nI1VSTCc+ZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbjogXCJDZSBjb21wdGUgYSBkw6lqw6Agw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgdmllbnQgYmllbiBkJ8OqdHJlIHZhbGlkw6kuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPlZvdXMgcG91dmV6IGNvbXBsw6l0ZXIgbGVzIGluZm9ybWF0aW9ucyBkZSB2b3RyZSBhYm9ubmVtZW50IGNpLWRlc3NvdXMuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VBZG1pbjogXCJMZSBjb21wdGUgYSBiaWVuIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wi4oCmXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG5cbiAgICAvLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbiAgICAvLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbiAgICBzdGF0aWMgZ2V0UGFzc3dvcmQgKG5iQ2FyTWluLCBuYkNhck1heClcbiAgICB7XG4gICAgICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICAgICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgICAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgICAgIH1cbiAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgICAgIHJldHVybiBwYXNzd29yZDtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiLFxuXHRcIi4vd2lraWxlcm5pL2NvbmZpZy9mci5qc1wiOiBcIi4uL3ZpZXdzL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vdmlld3Mgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwuanMkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmh0bWxcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCLDgCBwcm9wb3NcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2EtcHJvcG9zLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiIH0gfSxcbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlUuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5WLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d2Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgIF0sXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2U6IDEwLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhICgqKSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwYXJ0YWfDqSBzdXIgV2lraUxlcm5pIHNvbnQgbGlicmVzLjxicj5Wb3VzIHBvdXZleiBsZXMgdXRpbGlzZXIsIGxlcyBtb2RpZmllciBldCBsZXMgZGlmZnVzZXIgc2Vsb24gdm90cmUgc291aGFpdC48YnI+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+XCIsXG4gICAgLyogQXV0cmVzICovXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHR3aXR0ZXJBY2NvdW50OiBcIldpa2lMZXJuaVwiLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMixcbiAgICBtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZTogMyxcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMyxcbn07IiwiLy8gLS0gR0VTVElPTiBEVSBGT1JNVUxBSVJFIFBFUk1FVFRBTlQgREUgU0FJU0lSIC8gw4lESVRFUiBMRVMgUVVJWlMgRVQgTEVVUlMgRMOJUEVOREFOQ0VTIChMSUVOUywgSU1BR0VTLCBUQUdTLCBFVEMuKVxuXG4vLy8gVsOpcmlmaWUgcXVlIGwndXRpbGlzYXRldXIgZXN0IGJpZW4gY29ubmVjdMOpLCBhIGxlIGJvbiBzdGF0dXQgZXQgbGUgcmVkaXJpZ2UgdmVycyBsZSBmb3JtdWxhaXJlIGQnaW5zY3JpcHRpb24gc2kgY2Ugbidlc3QgcGFzIGxlIGNhcy5cbi8vLyBTaSBjJ2VzdCBvaywgcHJvcG9zZSB1biBtb3RldXIgZGUgcmVjaGVyY2hlIHBlcm1ldHRhbnQgZGUgY2hlcmNoZXIgdW4gcXVpelxuLy8vIFNpIHVuIGlkIGVzdCBwYXNzw6kgcGFyIGwndXJsIG9uIGFmZmljaGUgbGVzIGluZm9ybWF0aW9ucyBkdSBxdWl6IGRhbnMgdW4gZm9ybXVsYWlyZSBwZXJtZXR0YW50IGRlIGwnw6lkaXRlci9zdXBwcmltZXIgYXZlYyB1bmUgbGlzdGUgZGVzIMOpbMOpbWVudHMgbGnDqXMgKGxpZW5zLCBpbGx1c3RyYXRpb25zLCBxdWVzdGlvbnMuLi4pIHBvdXZhbnQgZXV4LW3Dqm1lcyDDqnRyZSDDqWRpdMOpcy9zdXBwcmltw6lzLlxuLy8vIFNpIGxlIG5vbWJyZSBtYXggY29uZmlndXLDqSBwb3VyIGNoYWN1biBkZSBzZXMgw6lsw6ltZW50cyBuJ2VzdCBwYXMgYXR0ZWludCwgaWwgZXN0IGF1c3NpIHByb3Bvc8OpIGQnYWpvdXRlciB1biBub3V2ZWwgw6lsw6ltZW50LlxuLy8vIFNpIHBhcyBkJ2lkIHBhc3PDqSBwYXIgbCd1cmwsIG9uIGFmZmljaGUgdW4gZm9ybXVsYWlyZSB2aWRlIHBlcm1ldHRhbnQgZGUgc2Fpc2lyIHVuIG5vdXZlYXUgcXVpei5cblxuLy8gRmljaGllcnMgZGUgY29uZmlndXJhdGlvbiA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5jb25zdCBjb25maWcgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCIpO1xuY29uc3QgY29uZmlnSWxsdXN0cmF0aW9ucyA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWcvaWxsdXN0cmF0aW9ucy5qc1wiKTtcbmNvbnN0IGNvbmZpZ0xpbmtzID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy9saW5rcy5qc1wiKTtcbmNvbnN0IGNvbmZpZ1F1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy9xdWVzdGlvbm5haXJlcy5qc1wiKTtcbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG4vLyBGb25jdGlvbnMgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiwgdXBkYXRlQWNjb3VudExpbmsgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBlbXB5QW5kSGlkZUZvcm0sIGdldERhdGFzRnJvbUlucHV0cywgc2V0QXR0cmlidXRlc1RvSW5wdXRzIH0gZnJvbSBcIi4vdG9vbHMvZm9ybXMuanNcIjtcbmltcG9ydCB7IGRhdGVGb3JtYXQsIGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vdG9vbHMvbWFpblwiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW1zIH0gZnJvbSBcIi4vdG9vbHMvdXJsLmpzXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24gfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHsgYWRkT2tNZXNzYWdlLCBkZWxldGVCdG5UeHQsIHNlcnZlckVycm9yLCB1cGRhdGVCdG5UeHQgfSA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHsgYWRkSWxsdXN0cmF0aW9uVHh0LCBkZWZhdWx0QWx0LCBpbnRyb05vSWxsdXN0cmF0aW9uLCBpbnRyb1RpdGxlRm9ySWxsdXN0cmF0aW9uIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2lsbHVzdHJhdGlvblwiKTtcbmNvbnN0IHsgYWRkTGlua1R4dCwgZGVmYXVsdFZhbHVlRm9yTGluaywgaW50cm9Ob0xpbmssIGludHJvVGl0bGVGb3JMaW5rIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2xpbmtcIik7XG5jb25zdCB7IGFkZFF1ZXN0aW9uVHh0LCBpbnRyb05vUXVlc3Rpb24sIGludHJvVGl0bGVGb3JRdWVzdGlvbiB9ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9xdWVzdGlvblwiKTtcbmNvbnN0IHsgbmVlZEdyb3VwSWZSYW5rLCBuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlLCBuZXh0UXVlc3Rpb25uYWlyZXNMaXN0LCBxdWVzdGlvbm5haXJlTmVlZEJlQ29tcGxldGVkLCBzZWFyY2hRdWVzdGlvbm5haXJlV2l0aE5vUmVzdWx0IH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3F1ZXN0aW9ubmFpcmVcIik7XG5jb25zdCB7IG5lZWRCZUNvbm5lY3RlZCB9ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuXG4vLyBQcmluY2lwYXV4IMOpbMOpbWVudHMgZHUgRE9NIG1hbmlwdWzDqXMgOlxuY29uc3QgYnRuTmV3UXVlc3Rpb25uYWlyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2FudE5ld1F1ZXN0aW9ubmFpcmVcIik7XG5jb25zdCBidG5QcmV2aWV3UXVlc3Rpb25uYWlyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHJldmlld1F1ZXN0aW9ubmFpcmVcIik7XG5jb25zdCBkZWxldGVDaGVja0JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGVsZXRlT2tMYWJlbFwiKTtcbmNvbnN0IGRpdkNyYXNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjcmFzaFwiKTtcbmNvbnN0IGRpdklsbHVzdHJhdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlsbHVzdHJhdGlvbnNMaXN0XCIpO1xuY29uc3QgZGl2TGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxpbmtzTGlzdFwiKTtcbmNvbnN0IGRpdk1haW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1haW4tY29udGVudFwiKTtcbmNvbnN0IGRpdk1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1lc3NhZ2VcIik7XG5jb25zdCBkaXZRdWVzdGlvbm5haXJlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZXNMaXN0XCIpO1xuY29uc3QgZGl2UXVlc3Rpb25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbnNMaXN0XCIpO1xuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xuY29uc3QgZGl2U2VhcmNoUmVzdWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWFyY2hSZXN1bHRcIik7XG5jb25zdCBmb3JtTGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGlua3NcIik7XG5jb25zdCBmb3JtSWxsdXN0cmF0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbGx1c3RyYXRpb25zXCIpO1xuY29uc3QgZm9ybVF1ZXN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbnNcIik7XG5jb25zdCBmb3JtUXVlc3Rpb25uYWlyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZXNcIik7XG5jb25zdCBmb3JtU2VhcmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWFyY2hcIik7XG5jb25zdCBoZWxwQ2xhc3NpZmljYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhlbHBDbGFzc2lmaWNhdGlvblwiKTtcbmNvbnN0IGhlbHBHcm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVscEdyb3VwXCIpO1xuY29uc3QgaGVscFB1Ymxpc2hpbmdBdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVscFB1Ymxpc2hpbmdBdFwiKTtcbmNvbnN0IGlucHV0Q2xhc3NpZmljYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNsYXNzaWZpY2F0aW9uXCIpO1xuY29uc3QgaW5wdXRHcm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZ3JvdXBcIik7XG5jb25zdCBpbnB1dFJhbmtJbkdyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyYW5rSW5Hcm91cFwiKTtcblxuLy8gVmlkZSBldCBjYWNoZSB0b3VzIGxlcyBmb3JtdWxhaXJlcyBhbm5leGVzIGF1IHF1ZXN0aW9ubmFpcmUgOlxuY29uc3QgaGlkZUFsbEZvcm1zID0gKCkgPT5cbntcbiAgICBlbXB5QW5kSGlkZUZvcm0oZm9ybUxpbmspO1xuICAgIGlmKGRlZmF1bHRWYWx1ZUZvckxpbmshPTApXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYW5jaG9yXCIpLnZhbHVlPWRlZmF1bHRWYWx1ZUZvckxpbms7XG4gICAgZW1weUFuZEhpZGVGb3JtKGZvcm1JbGx1c3RyYXRpb24pO1xuICAgIGVtcHlBbmRIaWRlRm9ybShmb3JtUXVlc3Rpb24pO1xufVxuXG4vLyBBZmZpY2hlIGxlcyBkb25uw6llcyBkJ3VuIGxpZW4gZGFucyBsZSBmb3JtdWxhaXJlIGFkaG9jIDpcbmNvbnN0IHNob3dGb3JtTGlua0luZm9zID0gKExpbmspID0+XG57XG4gICAgLy8gT24gY29tbWVuY2UgcGFyIGNhY2hlciBldCB2aWRlciB0b3VzIGxlcyBmb3JtdWxhaXJlcyBhbm5leGVzXG4gICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgLy8gUHVpcyBvbiBhZmZpY2hlIGNlbHVpIGNvbmNlcm7DqVxuICAgIGZvcm1MaW5rLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgIC8vICsgTGVzIGNvbnRyYWludGVzIGRlIGNoYW1wICYgdmFsZXVycyBwYXIgZMOpZmF1dCA6XG4gICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ0xpbmtzLkxpbmssIGZvcm1MaW5rKTtcbiAgICBmb3IobGV0IGRhdGEgaW4gTGluaylcbiAgICB7XG4gICAgICAgIGlmKGZvcm1MaW5rLmVsZW1lbnRzW2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgZm9ybUxpbmsuZWxlbWVudHNbZGF0YV0udmFsdWU9TGlua1tkYXRhXTtcbiAgICB9XG59XG5cbi8vIEFmZmljaGUgbGVzIGluZm9zIGNvbm51ZXMgY29uY2VybmFudCBsZXMgbGllbnMgZHUgcXVlc3Rpb25uYWlyZSBhZmZpY2jDqSA6XG5jb25zdCBzaG93TGlua0luZm9zID0gKExpbmtzLCB0b2tlbikgPT5cbntcbiAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcImgyXCIsIGludHJvVGl0bGVGb3JMaW5rKTtcbiAgICBsZXQgbGlzdExpbmtzPVwiXCI7XG4gICAgZm9yKGxldCBpIGluIExpbmtzKVxuICAgICAgICBsaXN0TGlua3MrPVwiPGxpPjxhIGhyZWY9J1wiK0xpbmtzW2ldLnVybCtcIicgdGFyZ2V0PSdfYmxhbmsnPlwiK0xpbmtzW2ldLmFuY2hvcitcIjwvYT48YnI+PGEgaHJlZj0nI3VwZGF0ZUxpbmtcIitMaW5rc1tpXS5pZCtcIicgaWQ9JyN1cGRhdGVMaW5rXCIrTGlua3NbaV0uaWQrXCInIGNsYXNzPSdidXR0b24nID5cIit1cGRhdGVCdG5UeHQrXCI8L2E+IDxhIGhyZWY9JyNkZWxldGVMaW5rXCIrTGlua3NbaV0uaWQrXCInIGlkPScjZGVsZXRlTGlua1wiK0xpbmtzW2ldLmlkK1wiJyBjbGFzcz0nYnV0dG9uJyA+XCIrZGVsZXRlQnRuVHh0K1wiPC9hPjwvbGk+XCI7XG4gICAgaWYobGlzdExpbmtzPT09XCJcIilcbiAgICAgICAgbGlzdExpbmtzPVwiPGxpPlwiK2ludHJvTm9MaW5rK1wiPC9saT5cIjtcbiAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcInVsXCIsIGxpc3RMaW5rcywgXCJcIiwgW10sIFwiXCIsIGZhbHNlKTsvLyAhIMOgIGludMOpZ3JlciBkJ2Fib3JkIGRhbnMgbGUgRE9NIHBvdXIgcG91dm9pciBham91dGVyIGxlcyBMaXN0ZW5lcnMgZW5zdWl0ZVxuICAgIGZvcihsZXQgaSBpbiBMaW5rcylcbiAgICB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3VwZGF0ZUxpbmtcIitMaW5rc1tpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHNob3dGb3JtTGlua0luZm9zKExpbmtzW2ldKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjbGlua3NcIik7XG4gICAgICAgIH0pO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiNkZWxldGVMaW5rXCIrTGlua3NbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBzaG93Rm9ybUxpbmtJbmZvcyhMaW5rc1tpXSk7XG4gICAgICAgICAgICBmb3JtTGluay5lbGVtZW50c1tcImRlbGV0ZU9rXCJdLnZhbHVlPXRydWU7XG4gICAgICAgICAgICBzZW5kTGlua0Zvcm0odG9rZW4pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYoTGlua3MubGVuZ3RoIDwgY29uZmlnLm5iTGlua3NNYXggfHwgY29uZmlnLm5iTGlua3NNYXggPT09IDApXG4gICAge1xuICAgICAgICBsZXQgbmV3QnRuPVwiPGEgaHJlZj0nI25ld0xpbmsnIGlkPSduZXdMaW5rJyBjbGFzcz0nYnV0dG9uJz5cIithZGRMaW5rVHh0K1wiPC9hPlwiO1xuICAgICAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcInBcIiwgbmV3QnRuLCBcIlwiLCBbXSwgeyB9LCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmV3TGlua1wiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICBmb3JtTGluay5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIGZvcm1MaW5rLmVsZW1lbnRzW1wiUXVlc3Rpb25uYWlyZUlkXCJdLnZhbHVlPWZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiaWRcIl0udmFsdWU7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2xpbmtzXCIpO1xuICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ0xpbmtzLCBmb3JtTGluayk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gRW52b2kgZGVzIGRvbm7DqWVzIGQndW4gbGllbi5cbmNvbnN0IHNlbmRMaW5rRm9ybSA9ICh0b2tlbikgPT5cbntcbiAgICBjb25zdCBkaXZSZXNwb25zZUxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZUxpbmtcIik7XG4gICAgZGl2UmVzcG9uc2VMaW5rLmlubmVySFRNTD1cIlwiO1xuICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybUxpbmspO1xuICAgIGNvbnN0IHhockxpbmtEYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSAmJiAoIWlzRW1wdHkoZGF0YXMuZGVsZXRlT2spKSlcbiAgICAgICAgeGhyTGlua0RhdGFzLm9wZW4oXCJERUxFVEVcIiwgYXBpVXJsK2NvbmZpZ0xpbmtzLmxpbmtzUm91dGUrZGF0YXMuaWQpO1xuICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICB4aHJMaW5rRGF0YXMub3BlbihcIlBVVFwiLCBhcGlVcmwrY29uZmlnTGlua3MubGlua3NSb3V0ZStkYXRhcy5pZCk7XG4gICAgZWxzZVxuICAgICAgICB4aHJMaW5rRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ0xpbmtzLmxpbmtzUm91dGUpO1xuICAgIHhockxpbmtEYXRhcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gMjAxKSAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQgJiYgcmVzcG9uc2UucXVlc3Rpb25uYWlyZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgc2hvd0xpbmtJbmZvcyhyZXNwb25zZS5xdWVzdGlvbm5haXJlLkxpbmtzLCB0b2tlbik7Ly8gbGUgc2VydmV1ciByZXRvdXJuZSB1bmUgdmVyc2lvbiBhY3R1YWxpc8OpZSBkZSBsYSBsaXN0ZSBkZXMgbGllbnNcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjbGlua3NMaXN0XCIpO1xuICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXModG9rZW4pOy8vIHBldXQgYXZvaXIgw6l2b2x1w6kgc3VpdmFudCBjZSBxdWkgcydlc3QgcGFzc8OpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSBzZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlTGluaywgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2VMaW5rLCBcInBcIiwgc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB4aHJMaW5rRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgeGhyTGlua0RhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3Rva2VuKTtcbiAgICB4aHJMaW5rRGF0YXMuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xufVxuXG4vLyBBZmZpY2hlIGxlcyBkb25uw6llcyBkJ3VuZSBpbGx1c3RyYXRpb24gZGFucyBsZSBmb3JtdWxhaXJlIGFkaG9jIDpcbmNvbnN0IHNob3dGb3JtSWxsdXN0cmF0aW9uSW5mb3MgPSAoSWxsdXN0cmF0aW9uKSA9Plxue1xuICAgIC8vIE9uIGNvbW1lbmNlIHBhciBjYWNoZXIgZXQgdmlkZXIgdG91cyBsZXMgZm9ybXVsYWlyZXMgYW5uZXhlc1xuICAgIGhpZGVBbGxGb3JtcygpO1xuICAgIC8vIFB1aXMgb24gYWZmaWNoZSBjZWx1aSBjb25jZXJuw6lcbiAgICBmb3JtSWxsdXN0cmF0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgIC8vICsgTGVzIGNvbnRyYWludGVzIGRlIGNoYW1wICYgdmFsZXVycyBwYXIgZMOpZmF1dFxuICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWdJbGx1c3RyYXRpb25zLklsbHVzdHJhdGlvbiwgZm9ybUlsbHVzdHJhdGlvbik7ICAgICAgICAgICAgICBcbiAgICAvLyBNYWlzIGxlIGNoYW1wIGZpbGUgbidlc3QgcGx1cyByZXF1aXMsIHF1YW5kIHVuIGZpY2hpZXIgZXhpc3RlIGTDqWrDoFxuICAgIGZvcm1JbGx1c3RyYXRpb24uZWxlbWVudHNbXCJpbWFnZVwiXS5yZW1vdmVBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKTtcbiAgICBmb3IobGV0IGRhdGEgaW4gSWxsdXN0cmF0aW9uKVxuICAgIHtcbiAgICAgICAgaWYoZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIGZvcm1JbGx1c3RyYXRpb24uZWxlbWVudHNbZGF0YV0udmFsdWU9SWxsdXN0cmF0aW9uW2RhdGFdO1xuICAgIH1cbn1cblxuLy8gQWZmaWNoZSBsZXMgaW5mb3MgY29ubnVlcyBjb25jZXJuYW50IGxlcyBpbGx1c3RyYXRpb25zIGR1IHF1ZXN0aW9ubmFpcmUgYWZmaWNow6kgOlxuY29uc3Qgc2hvd0lsbHVzdHJhdGlvbkluZm9zID0gKElsbHVzdHJhdGlvbnMsIHRva2VuKSA9Plxue1xuICAgIGFkZEVsZW1lbnQoZGl2SWxsdXN0cmF0aW9ucywgXCJoMlwiLCBpbnRyb1RpdGxlRm9ySWxsdXN0cmF0aW9uKTtcbiAgICBsZXQgbGlzdElsbHVzdHJhdGlvbnM9XCJcIjtcbiAgICBmb3IobGV0IGkgaW4gSWxsdXN0cmF0aW9ucylcbiAgICAgICAgbGlzdElsbHVzdHJhdGlvbnMrPVwiPGxpPjxhIGhyZWY9J1wiK2NvbmZpZ1RlbXBsYXRlLmlsbHVzdHJhdGlvbkRpcitJbGx1c3RyYXRpb25zW2ldLnVybCtcIicgdGFyZ2V0PSdfYmxhbmsnPjxpbWcgc3JjPSdcIitjb25maWdUZW1wbGF0ZS5pbGx1c3RyYXRpb25EaXIrSWxsdXN0cmF0aW9uc1tpXS51cmwrXCInIGFsdD0nXCIrZGVmYXVsdEFsdCtcIicgc3R5bGU9J21heC1oZWlnaHQ6MTUwcHgnPjwvYT48YnI+PGEgaHJlZj0nI3VwZGF0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQrXCInIGlkPScjdXBkYXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCtcIicgY2xhc3M9J2J1dHRvbic+XCIrdXBkYXRlQnRuVHh0K1wiPC9hPiA8YSBocmVmPScjZGVsZXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCtcIicgaWQ9JyNkZWxldGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkK1wiJyBjbGFzcz0nYnV0dG9uJz5cIitkZWxldGVCdG5UeHQrXCI8L2E+PC9saT5cIjtcbiAgICBpZihsaXN0SWxsdXN0cmF0aW9ucyA9PT0gXCJcIilcbiAgICAgICAgbGlzdElsbHVzdHJhdGlvbnM9XCI8bGk+XCIraW50cm9Ob0lsbHVzdHJhdGlvbitcIjwvbGk+XCI7XG4gICAgYWRkRWxlbWVudChkaXZJbGx1c3RyYXRpb25zLCBcInVsXCIsIGxpc3RJbGx1c3RyYXRpb25zLCBcIlwiLCBbXSwgXCJcIiwgZmFsc2UpOy8vICEgw6AgaW50w6lncmVyIGQnYWJvcmQgZGFucyBsZSBET00gcG91ciBwb3V2b2lyIGFqb3V0ZXIgbGVzIExpc3RlbmVycyBlbnN1aXRlXG4gICAgZm9yKGxldCBpIGluIElsbHVzdHJhdGlvbnMpXG4gICAge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiN1cGRhdGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgc2hvd0Zvcm1JbGx1c3RyYXRpb25JbmZvcyhJbGx1c3RyYXRpb25zW2ldKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjaWxsdXN0cmF0aW9uc1wiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI2RlbGV0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBzaG93Rm9ybUlsbHVzdHJhdGlvbkluZm9zKElsbHVzdHJhdGlvbnNbaV0pO1xuICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tcImRlbGV0ZU9rXCJdLnZhbHVlPXRydWU7XG4gICAgICAgICAgICBzZW5kSWxsdXN0cmF0aW9uRm9ybSh0b2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZihJbGx1c3RyYXRpb25zLmxlbmd0aCA8IGNvbmZpZy5uYklsbHVzdHJhdGlvbnNNYXggfHwgY29uZmlnLm5iSWxsdXN0cmF0aW9uc01heCA9PT0gMClcbiAgICB7XG4gICAgICAgIGxldCBuZXdCdG49XCI8YSBocmVmPScjbmV3SWxsdXN0cmF0aW9uJyBpZD0nbmV3SWxsdXN0cmF0aW9uJyBjbGFzcz0nYnV0dG9uJz5cIithZGRJbGx1c3RyYXRpb25UeHQrXCI8L2E+XCI7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2SWxsdXN0cmF0aW9ucywgXCJwXCIsIG5ld0J0biwgXCJcIiwgW10sIHsgfSwgZmFsc2UpO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5ld0lsbHVzdHJhdGlvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tcIlF1ZXN0aW9ubmFpcmVJZFwiXS52YWx1ZT1mb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tcImlkXCJdLnZhbHVlO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNpbGx1c3RyYXRpb25zXCIpO1xuICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ0lsbHVzdHJhdGlvbnMsIGZvcm1JbGx1c3RyYXRpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIEVudm9pIGRlcyBkb25uw6llcyBkJ3VuZSBpbGx1c3RyYXRpb24uXG5jb25zdCBzZW5kSWxsdXN0cmF0aW9uRm9ybSA9ICh0b2tlbikgPT5cbntcbiAgICBjb25zdCBkaXZSZXNwb25zZUlsbHVzdHJhdGlvbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlSWxsdXN0cmF0aW9uXCIpO1xuICAgIGRpdlJlc3BvbnNlSWxsdXN0cmF0aW9uLmlubmVySFRNTD1cIlwiO1xuICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybUlsbHVzdHJhdGlvbik7XG4gICAgbGV0IGRhdGFzV2l0aEZpbGVzPW5ldyBGb3JtRGF0YShmb3JtSWxsdXN0cmF0aW9uKTsgLy8gY2FyIGlsIG1lIG1hbnF1ZSBsZXMgaW5mb3JtYXRpb25zIGR1IGZpY2hpZXIgYXZlYyBsYSBmb25jdGlvbiBnZXREYXRhc0Zyb21JbnB1dHNcbiAgICBjb25zdCB4aHJJbGx1c3RyYXRpb25EYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSAmJiAoIWlzRW1wdHkoZGF0YXMuZGVsZXRlT2spKSlcbiAgICAgICAgeGhySWxsdXN0cmF0aW9uRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnSWxsdXN0cmF0aW9ucy5pbGx1c3RyYXRpb25zUm91dGUrZGF0YXMuaWQpO1xuICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWdJbGx1c3RyYXRpb25zLmlsbHVzdHJhdGlvbnNSb3V0ZStkYXRhcy5pZCk7XG4gICAgZWxzZVxuICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnSWxsdXN0cmF0aW9ucy5pbGx1c3RyYXRpb25zUm91dGUpO1xuICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgaWYgKCh0aGlzLnN0YXR1cyA9PT0gMjAwIHx8IHRoaXMuc3RhdHVzID09PSAyMDEpICYmIHJlc3BvbnNlLm1lc3NhZ2UhPXVuZGVmaW5lZCAmJiByZXNwb25zZS5xdWVzdGlvbm5haXJlIT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBzaG93SWxsdXN0cmF0aW9uSW5mb3MocmVzcG9uc2UucXVlc3Rpb25uYWlyZS5JbGx1c3RyYXRpb25zLCB0b2tlbik7Ly8gbGUgc2VydmV1ciByZXRvdXJuZSB1bmUgdmVyc2lvbiBhY3R1YWxpc8OpZSBkZSBsYSBsaXN0ZSBkZXMgbGllbnNcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdklsbHVzdHJhdGlvbnMsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNpbGx1c3RyYXRpb25zTGlzdFwiKTtcbiAgICAgICAgICAgICAgICBzaG93TmV4dFF1ZXN0aW9ubmFpcmVzKHRva2VuKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZUlsbHVzdHJhdGlvbiwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2VJbGx1c3RyYXRpb24sIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3Rva2VuKTtcbiAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5zZW5kKGRhdGFzV2l0aEZpbGVzKTtcbn1cblxuLy8gQWZmaWNoZSBsZXMgZG9ubsOpZXMgZCd1bmUgcXVlc3Rpb24gKyBzZXMgcsOpcG9uc2VzIHBvc3NpYmxlcyBkYW5zIGxlIGZvcm11bGFpcmUgYWRob2NcbmNvbnN0IHNob3dGb3JtUXVlc3Rpb25JbmZvcyA9IChRdWVzdGlvbikgPT5cbntcbiAgICAvLyBPbiBjb21tZW5jZSBwYXIgY2FjaGVyIGV0IHZpZGVyIHRvdXMgbGVzIGZvcm11bGFpcmVzIGFubmV4ZXNcbiAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAvLyBQdWlzIG9uIGFmZmljaGUgY2VsdWkgY29uY2VybsOpXG4gICAgZm9ybVF1ZXN0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgIGZvcihsZXQgZGF0YSBpbiBRdWVzdGlvbi5RdWVzdGlvbilcbiAgICB7XG4gICAgICAgIGlmKGZvcm1RdWVzdGlvbi5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIGZvcm1RdWVzdGlvbi5lbGVtZW50c1tkYXRhXS52YWx1ZT1RdWVzdGlvbi5RdWVzdGlvbltkYXRhXTtcbiAgICB9XG4gICAgLy8gKyBMZXMgY29udHJhaW50ZXMgZGUgY2hhbXAgJiBsZXMgdmFsZXVycyBwYXIgZMOpZmF1dFxuICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWdRdWVzdGlvbm5haXJlcy5RdWVzdGlvbiwgZm9ybVF1ZXN0aW9uKTsgICAgICAgICAgICAgIFxuICAgIGZvcihsZXQgZGF0YSBpbiBRdWVzdGlvbi5DaG9pY2VzKVxuICAgIHtcbiAgICAgICAgaWYoZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiY2hvaWNlVGV4dFwiK2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJjaG9pY2VUZXh0XCIrZGF0YV0udmFsdWU9UXVlc3Rpb24uQ2hvaWNlc1tkYXRhXS50ZXh0O1xuICAgICAgICAgICAgaWYoUXVlc3Rpb24uQ2hvaWNlc1tkYXRhXS5pc0NvcnJlY3Q9PXRydWUpXG4gICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiY2hvaWNlSXNDb3JyZWN0XCIrZGF0YV0uY2hlY2tlZD10cnVlO1xuICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiaWRDaG9pY2VcIitkYXRhXS52YWx1ZT1RdWVzdGlvbi5DaG9pY2VzW2RhdGFdLmlkO1xuICAgICAgICB9ICAgICAgICAgICAgICAgIFxuICAgIH1cbn1cblxuLy8gQWZmaWNoZSBsZXMgaW5mb3MgZGVzIHF1ZXN0aW9ucyBkdSBxdWl6IGFmZmljaMOpIDpcbmNvbnN0IHNob3dRdWVzdGlvbkluZm9zID0gKFF1ZXN0aW9ucywgdG9rZW4pID0+XG57XG4gICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwiaDJcIiwgaW50cm9UaXRsZUZvclF1ZXN0aW9uKTtcbiAgICBsZXQgbGlzdFF1ZXN0aW9ucz1cIlwiO1xuICAgIGZvcihsZXQgaSBpbiBRdWVzdGlvbnMpXG4gICAgICAgIGxpc3RRdWVzdGlvbnMrPVwiPGxpPlwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5yYW5rK1wiIC0gXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLnRleHQrXCI8YnI+PGEgaHJlZj0nI3VwZGF0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkK1wiJyBpZD0nI3VwZGF0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkK1wiJyBjbGFzcz0nYnV0dG9uJz5cIit1cGRhdGVCdG5UeHQrXCI8L2E+IDxhIGhyZWY9JyNkZWxldGVRdWVzdGlvblwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5pZCtcIicgaWQ9JyNkZWxldGVRdWVzdGlvblwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5pZCtcIicgY2xhc3M9J2J1dHRvbic+XCIrZGVsZXRlQnRuVHh0K1wiPC9hPjwvbGk+XCI7XG4gICAgaWYobGlzdFF1ZXN0aW9ucyA9PT0gXCJcIilcbiAgICAgICAgbGlzdFF1ZXN0aW9ucz1cIjxsaT5cIitpbnRyb05vUXVlc3Rpb24rXCI8L2xpPlwiO1xuICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25zLCBcInVsXCIsIGxpc3RRdWVzdGlvbnMsIFwiXCIsIFtdLCBcIlwiLCBmYWxzZSk7Ly8gw6AgaW50w6lncmVyIGQnYWJvcmQgZGFucyBsZSBET00gcG91ciBwb3V2b2lyIGFqb3V0ZXIgbGVzIExpc3RlbmVycyBlbnN1aXRlXG4gICAgZm9yKGxldCBpIGluIFF1ZXN0aW9ucylcbiAgICB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3VwZGF0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbkluZm9zKFF1ZXN0aW9uc1tpXSk7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI3F1ZXN0aW9uc1wiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI2RlbGV0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbkluZm9zKFF1ZXN0aW9uc1tpXSk7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJkZWxldGVPa1wiXS52YWx1ZT10cnVlO1xuICAgICAgICAgICAgc2VuZFF1ZXN0aW9uRm9ybSh0b2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZihRdWVzdGlvbnMubGVuZ3RoIDwgY29uZmlnLm5iUXVlc3Rpb25zTWF4IHx8IGNvbmZpZy5uYlF1ZXN0aW9uc01heCA9PT0gMClcbiAgICB7XG4gICAgICAgIGxldCBuZXdCdG49XCI8YSBocmVmPScjbmV3UXVlc3Rpb24nIGlkPSduZXdRdWVzdGlvbicgY2xhc3M9J2J1dHRvbic+XCIrYWRkUXVlc3Rpb25UeHQrXCI8L2E+XCI7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25zLCBcInBcIiwgbmV3QnRuLCBcIlwiLCBbXSwgeyB9LCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmV3UXVlc3Rpb25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiUXVlc3Rpb25uYWlyZUlkXCJdLnZhbHVlPWZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiaWRcIl0udmFsdWU7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJyYW5rXCJdLnZhbHVlPShRdWVzdGlvbnMubGVuZ3RoPT09MCkgPyBjb25maWdRdWVzdGlvbm5haXJlcy5RdWVzdGlvbi5yYW5rLmRlZmF1bHRWYWx1ZSA6IFF1ZXN0aW9ucy5sZW5ndGgrMTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVlc3Rpb25zXCIpO1xuICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ1F1ZXN0aW9ubmFpcmVzLlF1ZXN0aW9uLCBmb3JtUXVlc3Rpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIEVudm9pIGRlcyBkb25uw6llcyBkJ3VuZSBxdWVzdGlvbiBldCBkZSBzZXMgcsOpcG9uc2UuIFBldXQgw6p0cmUgZ8OpbsOpcsOpIHBhciBsZSBib3V0b24gc3VibWl0IG91IHBhciBsZSBsaWVuIFwic3VwcHJpbWVyXCIuXG5jb25zdCBzZW5kUXVlc3Rpb25Gb3JtID0gKHRva2VuKSA9Plxue1xuICAgIGNvbnN0IGRpdlJlc3BvbnNlUXVlc3Rpb249ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVF1ZXN0aW9uXCIpO1xuICAgIGRpdlJlc3BvbnNlUXVlc3Rpb24uaW5uZXJIVE1MPVwiXCI7XG4gICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtUXVlc3Rpb24pO1xuICAgIGNvbnN0IHhoclF1ZXN0aW9uRGF0YXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBpZighaXNFbXB0eShkYXRhcy5pZCkgJiYgKCFpc0VtcHR5KGRhdGFzLmRlbGV0ZU9rKSkpXG4gICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnUXVlc3Rpb25uYWlyZXMucXVlc3Rpb25zUm91dGUrZGF0YXMuaWQpO1xuICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLm9wZW4oXCJQVVRcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9uc1JvdXRlK2RhdGFzLmlkKTsvLyBtaXNlIMOgIGpvdXIgZCd1bmUgcXVlc3Rpb25cbiAgICBlbHNlXG4gICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9uc1JvdXRlKTsvLyBub3V2ZWxsZSBxdWVzdGlvblxuICAgIHhoclF1ZXN0aW9uRGF0YXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBpZiAoKHRoaXMuc3RhdHVzID09PSAyMDAgfHwgdGhpcy5zdGF0dXMgPT09IDIwMSkgJiYgcmVzcG9uc2UubWVzc2FnZSE9dW5kZWZpbmVkICYmIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmUhPXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZS5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHNob3dRdWVzdGlvbkluZm9zKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmUuUXVlc3Rpb25zLCB0b2tlbik7Ly8gbGUgc2VydmV1ciBtZSByZXRvdXJuZSB1bmUgdmVyc2lvbiBhY3R1YWxpc8OpZSBkZSBsYSBsaXN0ZSBkZXMgcXVlc3Rpb25zXG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNxdWVzdGlvbnNMaXN0XCIpO1xuICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXModG9rZW4pOy8vIGNhciBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZVF1ZXN0aW9uLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZVF1ZXN0aW9uLCBcInBcIiwgc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB4aHJRdWVzdGlvbkRhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgIHhoclF1ZXN0aW9uRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdG9rZW4pO1xuICAgIHhoclF1ZXN0aW9uRGF0YXMuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xufVxuXG4vLyBBZmZpY2hhbnQgbGVzIGluZm9zIGNvbm51ZXMgY29uY2VybmFudCB1biBxdWVzdGlvbm5haXJlIGV0IHNlcyBkw6lwZW5kYW5jZXNcbmNvbnN0IHNob3dGb3JtUXVlc3Rpb25uYWlyZUluZm9zID0gKGlkLCB0b2tlbikgPT5cbntcbiAgICBjb25zdCB4aHJHZXRJbmZvcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhockdldEluZm9zLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnUXVlc3Rpb25uYWlyZXMuZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIitpZCk7XG4gICAgeGhyR2V0SW5mb3Mub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5RdWVzdGlvbm5haXJlICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5yZXNldCgpOy8vIHBvdXIgbmUgcGFzIGdhcmRlciBsZXMgZG9ubsOpZXMgZMOpasOgIGFmZmljaMOpZXMgc2kgdmlkZSBkYW5zIGNlIHF1aSBlc3QgcmV0b3VybsOpXG4gICAgICAgICAgICAgICAgZm9yKGxldCBkYXRhIGluIHJlc3BvbnNlLlF1ZXN0aW9ubmFpcmUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZihmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YT09PVwicHVibGlzaGluZ0F0XCIgJiYgcmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtkYXRhXSE9PW51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbZGF0YV0udmFsdWU9ZGF0ZUZvcm1hdChyZXNwb25zZS5RdWVzdGlvbm5haXJlW2RhdGFdLCBcImZvcm1cIik7Ly8gISEgcmV2b2lyIGNhciBmb3JtYXQgcG91dmFudCBwb3NlciBzb3VjaXMgc2kgbmF2aWdhdGV1ciBuZSBnw6hyZSBwYXMgbGVzIGNoYW1wcyBkZSB0eXBlIFwiZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tkYXRhXS52YWx1ZT1yZXNwb25zZS5RdWVzdGlvbm5haXJlW2RhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlQ2hlY2tCb3guc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICB9Ly8gYWpvdXRlciBnZXN0aW9uIGRlcyByZXRvdXJzIGVuIGVycmV1ciA/XG4gICAgICAgICAgICBpZihyZXNwb25zZS5UYWdzICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NpZmljYXRpb249XCJcIjtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UuVGFncylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGk9PTApXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbis9cmVzcG9uc2UuVGFnc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbis9XCIsXCIrcmVzcG9uc2UuVGFnc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tcImNsYXNzaWZpY2F0aW9uXCJdLnZhbHVlPWNsYXNzaWZpY2F0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIWlzRW1wdHkocmVzcG9uc2UuR3JvdXApKVxuICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiZ3JvdXBcIl0udmFsdWU9cmVzcG9uc2UuR3JvdXAuR3JvdXAudGl0bGUrXCIgKFwiK3Jlc3BvbnNlLkdyb3VwLkdyb3VwLmlkK1wiKVwiO1xuICAgICAgICAgICAgZGl2TGlua3Muc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICBkaXZRdWVzdGlvbnMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICBkaXZJbGx1c3RyYXRpb25zLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgaWYocmVzcG9uc2UuTGlua3MgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHNob3dMaW5rSW5mb3MocmVzcG9uc2UuTGlua3MsIHRva2VuKTtcbiAgICAgICAgICAgIGlmKHJlc3BvbnNlLlF1ZXN0aW9ucyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgc2hvd1F1ZXN0aW9uSW5mb3MocmVzcG9uc2UuUXVlc3Rpb25zLCB0b2tlbik7XG4gICAgICAgICAgICBpZihyZXNwb25zZS5JbGx1c3RyYXRpb25zICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBzaG93SWxsdXN0cmF0aW9uSW5mb3MocmVzcG9uc2UuSWxsdXN0cmF0aW9ucywgdG9rZW4pO1xuICAgICAgICAgICAgaGVscFB1Ymxpc2hpbmdBdC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiOy8vIGluZm8gdW5pcXVlbWVudCB1dGlsZSBwb3VyIFwicGxhY2VyXCIgdW4gbm91dmVhdSBxdWl6XG4gICAgICAgICAgICAvLyDDoCByZXZvaXIgOiByZW1wbGFjZXIgbGllbiBwb3VyIHVuIGJvdXRvbiArIHJlc2V0IGNvbXBsZXQgZHUgZm9ybXVsYWlyZSwgeSBjb21wcmlzIGNoYW1wcyBoaWRkZW4gOlxuICAgICAgICAgICAgYnRuTmV3UXVlc3Rpb25uYWlyZS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIGJ0bk5ld1F1ZXN0aW9ubmFpcmUuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBjb25maWdUZW1wbGF0ZS5xdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlKTtcbiAgICAgICAgICAgIGJ0blByZXZpZXdRdWVzdGlvbm5haXJlLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgaWYocmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtcImlzUHVibGlzaGVkXCJdID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICBidG5QcmV2aWV3UXVlc3Rpb25uYWlyZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiK2lkK1wiL1wiK3Rva2VuKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBidG5QcmV2aWV3UXVlc3Rpb25uYWlyZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGNvbmZpZy5zaXRlVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMrcmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtcInNsdWdcIl0rXCIuaHRtbFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB4aHJHZXRJbmZvcy5zZW5kKCk7XG59XG5cbi8vIEFmZmljaGUgbGVzIHF1ZXN0aW9ubmFpcmVzIGJpZW50w7R0IHB1Ymxpw6lzLlxuY29uc3Qgc2hvd05leHRRdWVzdGlvbm5haXJlcyA9ICh0b2tlbikgPT5cbntcbiAgICBjb25zdCB4aHJOZXh0UXVlc3Rpb25uYWlyZXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHJOZXh0UXVlc3Rpb25uYWlyZXMub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnUXVlc3Rpb25uYWlyZXMucXVlc3Rpb25uYWlyZVJvdXRlcytjb25maWdRdWVzdGlvbm5haXJlcy5nZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzKTtcbiAgICB4aHJOZXh0UXVlc3Rpb25uYWlyZXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgbGlzdEhUTUw9XCJcIiwgZGF5U3RyLCBvcHRpb25zRGF5U3RyID0geyB3ZWVrZGF5OiAnbG9uZyd9O1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5xdWVzdGlvbm5haXJlcylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRheVN0cj1uZXcgSW50bC5EYXRlVGltZUZvcm1hdChsYW5nLCBvcHRpb25zRGF5U3RyKS5mb3JtYXQobmV3IERhdGUocmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uZGF0ZVB1Ymxpc2hpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdEhUTUwrPVwiPGxpPlwiK2RheVN0citcIiBcIitkYXRlRm9ybWF0KHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmRhdGVQdWJsaXNoaW5nLCBcImZyXCIpK1wiOiA8YSBocmVmPSdcIitjb25maWdUZW1wbGF0ZS5xdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlK1wiP2lkPVwiK3Jlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmlkK1wiJyBpZD0ncXVlc3Rpb25uYWlyZV9cIityZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5pZCtcIic+XCIrcmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0udGl0bGUrXCI8L2E+XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmlzUHVibGlzaGFibGU9PT1mYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RIVE1MKz1cIiA8c3BhbiBjbGFzcz0nZXJyb3InPihcIitxdWVzdGlvbm5haXJlTmVlZEJlQ29tcGxldGVkK1wiKTwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RIVE1MKz1cIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCE9PTApXG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25uYWlyZXMsIFwiaDNcIiwgbmV4dFF1ZXN0aW9ubmFpcmVzTGlzdC5yZXBsYWNlKFwiI05CXCIsIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoaGVscFB1Ymxpc2hpbmdBdCwgXCJlbVwiLCBuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlK2RhdGVGb3JtYXQobmV3IERhdGUocmVzcG9uc2UuZGF0ZU5lZWRlZCksIFwiZnJcIikpO1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25uYWlyZXMsIFwidWxcIiwgbGlzdEhUTUwsIFwiXCIsIFwiXCIsIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UucXVlc3Rpb25uYWlyZXMpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9ubmFpcmVfXCIrcmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyhlLnRhcmdldC5pZC5zcGxpdChcIl9cIilbMV0sIHRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVlc3Rpb25uYWlyZXNcIik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0vLyBham91dGVyIGdlc3Rpb24gZXJyZXVycyByZcOndWVzIGR1IHNlcnZldXIgP1xuICAgICAgICB9XG4gICAgfVxuICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit0b2tlbik7IFxuICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5zZW5kKCk7XG59XG5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHsgICAgICAgIFxuICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oW1wibWFuYWdlclwiLCBcImFkbWluXCJdLCBcIi9cIitjb25maWdUZW1wbGF0ZS5jb25uZWN0aW9uUGFnZSwgeyBtZXNzYWdlOiBuZWVkQmVDb25uZWN0ZWQsIGNvbG9yOlwiZXJyb3JcIiB9LCB3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICBpZihpc0Nvbm5lY3RlZClcbiAgICAgICAge1xuICAgICAgICAgICAgZGl2TWFpbi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIGlmKCFpc0VtcHR5KGdldExvY2FseShcIm1lc3NhZ2VcIikpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIGdldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkubWVzc2FnZSwgXCJcIiwgW2dldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkuY29sb3JdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibWVzc2FnZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIE1pc2Ugw6Agam91ciBkdSBsaWVuIFwiY29tcHRlXCIgZHUgaGVhZGVyIDpcbiAgICAgICAgICAgIHVwZGF0ZUFjY291bnRMaW5rKHVzZXIuc3RhdHVzLCBjb25maWdUZW1wbGF0ZSk7XG4gICAgICAgICAgICAvLyBJbml0aWFsaXNhdGlvbiBkZXMgZm9ybXVsYWlyZXMgOlxuICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ1F1ZXN0aW9ubmFpcmVzLCBmb3JtU2VhcmNoKTtcbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWdRdWVzdGlvbm5haXJlcy5RdWVzdGlvbm5haXJlLCBmb3JtUXVlc3Rpb25uYWlyZSk7XG4gICAgICAgICAgICAvLyBWaWRlL2NhY2hlIGxlcyDDqWzDqW1lbnRzIGludXRpbGVzIGVuIG1vZGUgY3LDqWF0aW9uIDpcbiAgICAgICAgICAgIGJ0blByZXZpZXdRdWVzdGlvbm5haXJlLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICBkZWxldGVDaGVja0JveC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAvLyBTaSB1biBpZCBlc3QgcGFzc8OpIHBhciBsJ3VybCwgb24gZXNzYXllIGQnYWZmaWNoZXIgbGUgcXVlc3Rpb25uYWlyZSA6XG4gICAgICAgICAgICBsZXQgdXJsRGF0YXM9Z2V0VXJsUGFyYW1zKCk7XG4gICAgICAgICAgICBpZih1cmxEYXRhcyAmJiB1cmxEYXRhcy5pZCE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyh1cmxEYXRhcy5pZCwgdXNlci50b2tlbik7XG4gICAgICAgICAgICAvLyBsZXMgcHJvY2hhaW5lcyBwdWJsaWNhdGlvbnMgOlxuICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcyh1c2VyLnRva2VuKTtcbiAgICAgICAgICAgIC8vIExhbmNlbWVudCBkJ3VuZSByZWNoZXJjaGUgOlxuICAgICAgICAgICAgZm9ybVNlYXJjaC5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybVNlYXJjaCk7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyU2VhcmNoID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyU2VhcmNoLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSk7XG4gICAgICAgICAgICAgICAgeGhyU2VhcmNoLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UubGVuZ3RoPT09MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTZWFyY2hSZXN1bHQsIFwicFwiLCBzZWFyY2hRdWVzdGlvbm5haXJlV2l0aE5vUmVzdWx0LCBcIlwiLCBbXCJpbmZvXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0SFRNTD1cIjxvcHRpb24gdmFsdWU9Jyc+PC9vcHRpb24+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEhUTUwrPVwiPG9wdGlvbiB2YWx1ZT0nXCIrcmVzcG9uc2VbaV0uaWQrXCInPlwiK3Jlc3BvbnNlW2ldLnRpdGxlK1wiPC9vcHRpb24+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2U2VhcmNoUmVzdWx0LCBcInNlbGVjdFwiLCBzZWxlY3RIVE1MLCBcInNlbGVjdFNlYXJjaFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VhcmNoU2VsZWN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2VsZWN0U2VhcmNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlYXJjaFNlbGVjdC52YWx1ZSE9PVwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3Moc2VhcmNoU2VsZWN0LnZhbHVlLCB1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2U2VhcmNoUmVzdWx0LCBcInBcIiwgc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHJTZWFyY2guc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmKGRhdGFzKVxuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2guc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEFpZGUgw6AgbGEgc2Fpc2llIHBvdXIgbGUgY2xhc3NlbWVudCBkdSBxdWl6XG4gICAgICAgICAgICBpbnB1dENsYXNzaWZpY2F0aW9uLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpdlJlc3BvbnNlLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3M9aW5wdXRDbGFzc2lmaWNhdGlvbi52YWx1ZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgdGFncy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFRhZz10YWdzWzBdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZihsYXN0VGFnLmxlbmd0aCA+PSAyKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyU2VhcmNoVGFncyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hUYWdzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnRhZ3NTZWFyY2hSb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Mub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscENsYXNzaWZpY2F0aW9uLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoaGVscENsYXNzaWZpY2F0aW9uLCBcImFcIiwgcmVzcG9uc2VbaV0ubmFtZSwgXCIjdGFnXCIrcmVzcG9uc2VbaV0uaWQsIFtcImluZm9cIl0sIHsgaHJlZjpcIiN0YWdcIityZXNwb25zZVtpXS5pZCB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiN0YWdcIityZXNwb25zZVtpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3NbMF09ZS50YXJnZXQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q2xhc3NpZmljYXRpb24udmFsdWU9dGFncy5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwQ2xhc3NpZmljYXRpb24uaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Muc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Muc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Muc2VuZChKU09OLnN0cmluZ2lmeSh7c2VhcmNoOiBsYXN0VGFnfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBBaWRlIMOgIGxhIHPDqWxlY3Rpb24gZCd1biBncm91cGUgcG91ciBsZSBxdWl6XG4gICAgICAgICAgICBpbnB1dEdyb3VwLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlW1wiR3JvdXBJZFwiXS52YWx1ZT1cIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSW5wdXQ9aW5wdXRHcm91cC52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYoZ3JvdXBJbnB1dC5sZW5ndGggPj0gY29uZmlnUXVlc3Rpb25uYWlyZXMuc2VhcmNoR3JvdXBzLm1pbmxlbmd0aClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclNlYXJjaEdyb3VwcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hHcm91cHMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLmdyb3VwUm91dGVzK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnNlYXJjaEdyb3Vwc1JvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoR3JvdXBzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBHcm91cC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGhlbHBHcm91cCwgXCJhXCIsIHJlc3BvbnNlW2ldLnRpdGxlLCBcIiNncm91cFwiK3Jlc3BvbnNlW2ldLmlkLCBbXCJpbmZvXCJdLCB7IGhyZWY6XCIjZ3JvdXBcIityZXNwb25zZVtpXS5pZCB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiNncm91cFwiK3Jlc3BvbnNlW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRHcm91cC52YWx1ZT1yZXNwb25zZVtpXS50aXRsZStcIiAoXCIrcmVzcG9uc2VbaV0uaWQrXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmVbXCJHcm91cElkXCJdLnZhbHVlPXJlc3BvbnNlW2ldLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KHJlc3BvbnNlW2ldLm1heFJhbmspKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFJhbmtJbkdyb3VwLnZhbHVlPXJlc3BvbnNlW2ldLm1heFJhbmsrMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UmFua0luR3JvdXAudmFsdWU9MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwR3JvdXAuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hHcm91cHMuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaEdyb3Vwcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoR3JvdXBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe3NlYXJjaEdyb3VwczogZ3JvdXBJbnB1dH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gVHJhaXRlbWVudCBkZSBsJ2Vudm9pIGR1IGZvcm11bGFpcmUgZGVzIGluZm9zIGRlIGJhc2UgZHUgcXVpelxuICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUuYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBkaXZSZXNwb25zZS5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YXM9Z2V0RGF0YXNGcm9tSW5wdXRzKGZvcm1RdWVzdGlvbm5haXJlKTtcbiAgICAgICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5yYW5rSW5Hcm91cCkgJiYgaXNFbXB0eShkYXRhcy5Hcm91cElkKSlcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIG5lZWRHcm91cElmUmFuaywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGlzRW1wdHkoZGF0YXMucmFua0luR3JvdXApICYmICFpc0VtcHR5KGRhdGFzLkdyb3VwSWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMucmFua0luR3JvdXA9MTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyUXVlc3Rpb25uYWlyZURhdGFzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSAmJiAoZGF0YXMuZGVsZXRlT2shPT11bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9wZW4oXCJERUxFVEVcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrXCIvXCIrZGF0YXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMSAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgYWRkT2tNZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMuaWQ9cmVzcG9uc2UuaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXModXNlci50b2tlbik7Ly8gcGV1dCBhdm9pciDDqXZvbHXDqSBzdWl2YW50IGNlIHF1aSBzJ2VzdCBwYXNzw6lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5tZXNzYWdlICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZS5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcyh1c2VyLnRva2VuKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YXMuZGVsZXRlT2sgPT09IHVuZGVmaW5lZCAmJiByZXNwb25zZS5lcnJvcnMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MoZGF0YXMuaWQsIHVzZXIudG9rZW4pOy8vIG9uIGFjdHVhbGlzZSBsZXMgZG9ubsOpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkxpbmtzLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZJbGx1c3RyYXRpb25zLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZRdWVzdGlvbnMuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3JtTGluay5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHNlbmRMaW5rRm9ybSh1c2VyLnRva2VuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHNlbmRJbGx1c3RyYXRpb25Gb3JtKHVzZXIudG9rZW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBzZW5kUXVlc3Rpb25Gb3JtKHVzZXIudG9rZW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2Q3Jhc2gsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTtcbmhlbGxvRGV2KCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuXFxuTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IHZvdXMgcG91dmV6IGxlIHRyb3V2ZXIgw6AgY2V0dGUgYWRyZXNzZSA6XFxuaHR0cHM6Ly9mb3JnZS5jaGFwcmlsLm9yZy9GYWJfQmxhYi9XaWtpTGVybmlcXG5cXG5Qb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZXNUb0lucHV0cyA9IChpbnB1dHNDb25mLCBteUZvcm0pID0+XG57XG4gICAgZm9yKGxldCBpIGluIG15Rm9ybS5lbGVtZW50cylcbiAgICB7XG4gICAgICAgIGlmKCFpc0VtcHR5KG15Rm9ybS5lbGVtZW50c1tpXS5pZCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpZElucHV0PW15Rm9ybS5lbGVtZW50c1tpXS5pZDtcbiAgICAgICAgICAgIGlmKGlucHV0c0NvbmZbaWRJbnB1dF0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0SFRNTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZElucHV0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gaW5wdXRzQ29uZltpZElucHV0XSlcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRIVE1MLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGlucHV0c0NvbmZbaWRJbnB1dF1bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFLDqWN1cMOocmUgdG91dGVzIGxlcyB2YWxldXJzIGRlIGNoYW1wcyBlbiBvbWV0dGFudCBsZXMgY2hlY2tib3ggbm9uIGNvY2jDqWVzLCBldGMuXG5leHBvcnQgY29uc3QgZ2V0RGF0YXNGcm9tSW5wdXRzID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBkYXRhcz17fTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICAgICBkYXRhc1tlbnRyaWVbMF1dPWVudHJpZVsxXTtcbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIFZpZGUgdG91cyBsZXMgY2hhbXBzIGQndW4gZm9ybXVsYWlyZSwgeSBjb21wcmlzIGhpZGRlbiwgY2hlY2tib3gsIGV0Yy5cbi8vIFJldm9pciBwb3VyIGxlcyBzZWxlY3RcbmV4cG9ydCBjb25zdCBlbXB5Rm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAge1xuICAgICAgICBpZihteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cImNoZWNrYm94XCIgfHwgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJyYWRpb1wiKVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udmFsdWU9XCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBWaWRlIGV0IGNhY2hlIGxlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBlbXB5QW5kSGlkZUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGVtcHlGb3JtKG15Rm9ybSk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIHLDqWN1cMOpcmFudCBsZXMgcGFyYW3DqHRyZXMgcGFzc8OpcyBwYXIgbCd1cmxcbmV4cG9ydCBjb25zdCBnZXRVcmxQYXJhbXMgPSAoKSA9Plxue1xuICAgIGlmKGlzRW1wdHkobG9jYXRpb24uc2VhcmNoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IGxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoXCImXCIpO1xuICAgIGlmKCFBcnJheS5pc0FycmF5KHBhcmFtZXRlcnMpIHx8IHBhcmFtZXRlcnMubGVuZ3RoPT09MClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICBsZXQgcGFyYW0sIGRhdGFzPXt9O1xuICAgIGZvcihsZXQgaSBpbiBwYXJhbWV0ZXJzKVxuICAgIHtcbiAgICAgICAgcGFyYW0gPSBwYXJhbWV0ZXJzW2ldLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgaWYocGFyYW0ubGVuZ3RoPT09MilcbiAgICAgICAgICAgIGRhdGFzW3BhcmFtWzBdXT1kZWNvZGVVUkkocGFyYW1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIC8vIG11bHRpcGxpZXIgcGFyIC0xLCBjYXIgYydlc3QgY2UgcXUnaWwgZmF1dCBcImFqb3V0ZXJcIiDDoCBsJ2hldXJlIFVUQyBwb3VyIHJldmVuaXIgZW4gaGV1cmUgbG9jYWxlIHF1aSBtJ2ludMOpcmVzc2UgZXQgbm9uIGwnaW52ZXJzZVxuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCkqLTE7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6IG91IGQndW4gZ3JvdXBlIGRlIHF1aXpzXG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpICYmICghaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSB8fCAhaXNFbXB0eShhbnN3ZXIuR3JvdXBJZCkpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkpXG4gICAgICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZGF0YXMuR3JvdXBJZD1hbnN3ZXIuR3JvdXBJZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBjJ2VzdCBsZSB0b2tlbiBxdWkgc2VydCDDoCB2w6lyaWZpZXIgbGUgc3RhdHV0IMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2UrXCIjc3Vic2NyaWJlXCIpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==