1143 lines
134 KiB
JavaScript
1143 lines
134 KiB
JavaScript
/******/ (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/paymentPage.js");
|
||
/******/ })
|
||
/************************************************************************/
|
||
/******/ ({
|
||
|
||
/***/ "../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: 15,
|
||
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
|
||
numberNewQuestionnaireAtSameTime: 50,
|
||
// for mass 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: 2,
|
||
nbQuestionnairesByGroupMax: 0,
|
||
// Illustrations:
|
||
nbIllustrationsMin: 0,
|
||
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: 1
|
||
}, _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/matomo.js":
|
||
/*!***************************!*\
|
||
!*** ../config/matomo.js ***!
|
||
\***************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
// Si non utilisé, supprimer l'appel des JS front-end puis recompiler.
|
||
// Revoir comment réorganiser cela sous-forme de module indépendant.
|
||
module.exports = {
|
||
// Stats Matomo :
|
||
matomo: {
|
||
url: "https://stats.le-fab-lab.com/",
|
||
siteId: "5"
|
||
}
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../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",
|
||
saveAnswersRoute: "/answer/",
|
||
searchAdminQuestionnairesRoute: "/searchadmin",
|
||
searchQuestionnairesRoute: "/search",
|
||
// -- questions & choices :
|
||
questionsRoute: "/question/",
|
||
// -- tags :
|
||
tagsSearchRoute: "/tags/search/",
|
||
// -- answers :
|
||
getAdminStats: "/getadminstats/",
|
||
getPreviousAnswers: "/user/answers/",
|
||
getQuestionnairesWithoutAnswer: "/withoutanswer/user/",
|
||
getStatsAnswers: "/user/anwswers/stats/",
|
||
// 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
|
||
},
|
||
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/quizs/gp",
|
||
dirHTMLQuestionnaires: "front/public/quiz",
|
||
dirHTMLTags: "front/public/quizs",
|
||
// Idem mais pour urls :
|
||
dirWebGroups: "quizs/gp",
|
||
dirWebQuestionnaires: "quiz",
|
||
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/",
|
||
searchUserRoute: "/search/",
|
||
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"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../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;
|
||
}
|
||
}]);
|
||
|
||
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 mises à jour WikiLerni"
|
||
}
|
||
}, {
|
||
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é à :",
|
||
|
||
/* Page d'accueil */
|
||
homePageTxt: "Page d'accueil",
|
||
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 <span class='postscriptum'>(*)</span>, le logiciel et le contenu partagé sur WikiLerni <a href=\"/credits.html\" title=\"En savoir plus\">sont libres</a>.<br>Sur WikiLerni, pas de publicité, ni de commercialisation de vos données.<br>Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.",
|
||
homeBtnAboutTxt: "En savoir plus sur WikiLerni ?",
|
||
homeBtnSubscribeTxt: "Tester WikiLerni gratuitement.",
|
||
|
||
/* 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 les quizs WikiLerni.",
|
||
newsListTitle: "<h3>1 article Wikipédia + 1 quiz = 1 WikiLerni</h3><p>WikiLerni, ce sont plusieurs quizs publiés chaque semaine, chacun associé à un article Wikipédia.<br>Sans publicité, ni commerce de vos données, <b>vous apprenez de nouvelles choses en toute liberté</b>.</p><blockquote>Aristote : « L’homme a naturellement la passion de connaître… »</blockquote>",
|
||
|
||
/* Page quizs */
|
||
quizElementLinksIntro: "Source(s)",
|
||
quizElementSubcriptionFormTitle: "Recevez les prochains WikiLerni",
|
||
explanationTitle: "Vous découvrez WikiLerni ?",
|
||
explanationTxt: "<p>Le principe est simple : <b>vous commencez par lire l'article Wikipédia dont le lien vous est proposé</b>.<br>Puis vous <b>afficher le quiz pour vérifier ce que vous avez retenu de votre lecture</b>.</p><p>Suivant les questions, <b>une ou plusieurs réponses peuvent être correctes</b> et doivent donc être cochées.<br>C'est toujours <b>le contenu de l'article Wikipédia qui fait foi</b> concernant les \"bonnes\" réponses.<br>Mais les articles de Wikipédia peuvent évoluer, donc n'hésitez pas <a href='/contact.html'>à me signaler une erreur</a>.</p><h3>Pas le temps de lire l'article Wikipédia ?</h3><p>Il est vrai que certains sont longs ! :-)<br>Dans ce cas, <b>essayez simplement de répondre avec vos connaissances actuelles</b>.<br>Il n'est pas nécessaire de répondre à toutes les questions pour obtenir les réponses.<br>Après validation, vous verrez apparaître les bonnes réponses + un extrait de l'article Wikipédia.<br>Vous pouvez ainsi <b>apprendre de nouvelles choses en quelques minutes</b>.</p><p>Une autre possibilité est d'afficher le quiz avant d'aller chercher les réponses dans l'article Wikipédia... Elles y sont toutes !</p><p><b>Il n'y a pas de bonne façon de faire</b>, et dans tous les cas <b>vous apprenez des choses sur des sujets très variés, ce qui est le but de WikiLerni</b>.</p><p>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 ? :)</p><p>Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. Ce compte vous permettra de <b>tester de nouveau ce quiz</b> pour vérifier ce que vous en avez retenu après plusieurs jours, semaines, mois... Grâce à ce compte, vous pourrez aussi <b>recevoir régulièrement de nouveaux quizs</b> pour continuer à \"cultiver votre jardin\".</p>",
|
||
questionnaireLicenceTxt: "Ce quiz <a href=\"/credits.html\">est libre</a>, mais il n'est pas gratuit. Vous pouvez <a href=\"/participer-financement.html\">participer à son financement en cliquant ici</a>.",
|
||
|
||
/* Autres */
|
||
illustrationDir: "/img/quizs/",
|
||
twitterAccount: "WikiLerni",
|
||
maxQuestionnairesByPage: 12,
|
||
maxQuestionnairesSiteHomePage: 3,
|
||
nbQuestionnairesUserHomePage: 3
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/paymentPage.js":
|
||
/*!****************************!*\
|
||
!*** ./src/paymentPage.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_everywhere_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
|
||
/* harmony import */ var _tools_matomo_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/matomo.js */ "./src/tools/matomo.js");
|
||
/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js");
|
||
/* harmony import */ var _tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/webportage.js */ "./src/tools/webportage.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 DE LA PAGE DU FINANCEMENT PARTICIPATIF (SANS DEVOIR ÊTRE CONNECTÉ)
|
||
/// Permet d'afficher les boutons de paiement WP suivant le choix de l'utilisateur.
|
||
/// Matomo est également activé si l'internaute n'est pas connecté.
|
||
// Fichier de configuration tirés du backend :
|
||
|
||
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"); // Fonctions utiles au script :
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["helloDev"])();
|
||
|
||
var initialise = /*#__PURE__*/function () {
|
||
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
||
var isConnected, user, CGV, abo9, abo18, abo36, abo54, divWPBtns;
|
||
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_4__["checkSession"])();
|
||
|
||
case 3:
|
||
isConnected = _context.sent;
|
||
|
||
if (isConnected) {
|
||
// on change le lien du compte en haut :
|
||
user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
|
||
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["updateAccountLink"])(user.status, configTemplate);
|
||
} else Object(_tools_matomo_js__WEBPACK_IMPORTED_MODULE_3__["loadMatomo"])(); // Les boutons de paiement WP :
|
||
|
||
|
||
CGV = document.getElementById("CGVOk");
|
||
abo9 = document.getElementById("abo9");
|
||
abo18 = document.getElementById("abo18");
|
||
abo36 = document.getElementById("abo36");
|
||
abo54 = document.getElementById("abo54");
|
||
divWPBtns = document.getElementById("WPBtns");
|
||
divWPBtns.style.display = "none";
|
||
abo9.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__["unCheckAllOthers"])("abo9");
|
||
});
|
||
abo18.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__["unCheckAllOthers"])("abo18");
|
||
});
|
||
abo36.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__["unCheckAllOthers"])("abo36");
|
||
});
|
||
abo54.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__["unCheckAllOthers"])("abo54");
|
||
});
|
||
CGV.addEventListener("change", function (e) {
|
||
if (CGV.checked === true) {
|
||
divWPBtns.style.display = "block";
|
||
if (abo9.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__["showBtnPayment"])("btn9");else if (abo18.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__["showBtnPayment"])("btn18");else if (abo36.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__["showBtnPayment"])("btn36");else if (abo54.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__["showBtnPayment"])("btn54");else {
|
||
divWPBtns.style.display = "none";
|
||
CGV.checked = false;
|
||
}
|
||
} else divWPBtns.style.display = "none";
|
||
});
|
||
_context.next = 22;
|
||
break;
|
||
|
||
case 19:
|
||
_context.prev = 19;
|
||
_context.t0 = _context["catch"](0);
|
||
console.error(_context.t0);
|
||
|
||
case 22:
|
||
case "end":
|
||
return _context.stop();
|
||
}
|
||
}
|
||
}, _callee, null, [[0, 19]]);
|
||
}));
|
||
|
||
return function initialise() {
|
||
return _ref.apply(this, arguments);
|
||
};
|
||
}();
|
||
|
||
initialise();
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./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/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 si Gitlab :\nhttps://gitlab.com/lefablab/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/matomo.js":
|
||
/*!*****************************!*\
|
||
!*** ./src/tools/matomo.js ***!
|
||
\*****************************/
|
||
/*! exports provided: loadMatomo */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadMatomo", function() { return loadMatomo; });
|
||
/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/matomo.js */ "../config/matomo.js");
|
||
/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_matomo_js__WEBPACK_IMPORTED_MODULE_0__);
|
||
// Fonction chargeant le code matomo
|
||
|
||
var loadMatomo = function loadMatomo() {
|
||
// chargement de matomo
|
||
var _paq = window._paq = window._paq || []; //ajout cnil :
|
||
|
||
|
||
_paq.push([function () {
|
||
var self = this;
|
||
|
||
function getOriginalVisitorCookieTimeout() {
|
||
var now = new Date(),
|
||
nowTs = Math.round(now.getTime() / 1000),
|
||
visitorInfo = self.getVisitorInfo();
|
||
var createTs = parseInt(visitorInfo[2]);
|
||
var cookieTimeout = 33696000; // 13 mois en secondes
|
||
|
||
var originalTimeout = createTs + cookieTimeout - nowTs;
|
||
return originalTimeout;
|
||
}
|
||
|
||
this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());
|
||
}]); //--fin ajout cnil
|
||
|
||
|
||
_paq.push(['trackPageView']);
|
||
|
||
_paq.push(['enableLinkTracking']);
|
||
|
||
(function () {
|
||
var u = _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__["matomo"].url;
|
||
|
||
_paq.push(['setTrackerUrl', u + 'matomo.php']);
|
||
|
||
_paq.push(['setSiteId', _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__["matomo"].siteId]);
|
||
|
||
var d = document,
|
||
g = d.createElement('script'),
|
||
s = d.getElementsByTagName('script')[0];
|
||
g.type = 'text/javascript';
|
||
g.async = true;
|
||
g.src = u + 'matomo.js';
|
||
s.parentNode.insertBefore(g, s);
|
||
})();
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/users.js":
|
||
/*!****************************!*\
|
||
!*** ./src/tools/users.js ***!
|
||
\****************************/
|
||
/*! exports provided: getTimeDifference, getPassword, 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__, "getPassword", function() { return getPassword; });
|
||
/* 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;
|
||
}; // On enlève volontairement les 0/O pour éviter les confusions !
|
||
// Et mieux vaut aussi débuter et finir par une lettre simple.
|
||
|
||
var getPassword = 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;
|
||
}; // 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
|
||
// 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.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) {
|
||
datas.duration = answer.duration;
|
||
datas.nbCorrectAnswers = answer.nbCorrectAnswers;
|
||
datas.QuestionnaireId = answer.QuestionnaireId;
|
||
datas.nbQuestions = answer.nbQuestions;
|
||
}
|
||
}
|
||
|
||
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);
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/webportage.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/tools/webportage.js ***!
|
||
\*********************************/
|
||
/*! exports provided: unCheckAllOthers, showBtnPayment */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unCheckAllOthers", function() { return unCheckAllOthers; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showBtnPayment", function() { return showBtnPayment; });
|
||
var checkBoxes = {
|
||
"CGV": document.getElementById("CGVOk"),
|
||
"abo9": document.getElementById("abo9"),
|
||
"abo18": document.getElementById("abo18"),
|
||
"abo36": document.getElementById("abo36"),
|
||
"abo54": document.getElementById("abo54")
|
||
};
|
||
var divWPBtns = document.getElementById("WPBtns"); // Lorsque l'on sélectionne un montant, les autres options + les CGV sont désélectionnés
|
||
|
||
var unCheckAllOthers = function unCheckAllOthers(choice) {
|
||
for (var id in checkBoxes) {
|
||
if (id !== choice) checkBoxes[id].checked = false;
|
||
divWPBtns.style.display = "none";
|
||
}
|
||
};
|
||
var btns = {
|
||
"btn9": document.getElementById("WPBtn9"),
|
||
"btn18": document.getElementById("WPBtn18"),
|
||
"btn36": document.getElementById("WPBtn36"),
|
||
"btn54": document.getElementById("WPBtn54")
|
||
}; // Affiche le bon bouton de paiement et cache les autres
|
||
|
||
var showBtnPayment = function showBtnPayment(choice) {
|
||
for (var id in btns) {
|
||
if (id !== choice) btns[id].style.display = "none";else btns[id].style.display = "block";
|
||
}
|
||
};
|
||
|
||
/***/ })
|
||
|
||
/******/ });
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL21hdG9tby5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mvd2lraWxlcm5pL2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGF5bWVudFBhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL21hdG9tby5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3dlYnBvcnRhZ2UuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJkZWZhdWx0UmVjZWlwdERheXMiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiZmllbGROZXdRdWVzdGlvbm5haXJlcyIsIm5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWluIiwibmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNYXgiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZXMiLCJkaXJXZWJRdWVzdGlvbm5haXJlcyIsIm1hdG9tbyIsInVybCIsInNpdGVJZCIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFJhbmRvbVF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwicHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzIiwicmVnZW5lcmF0ZUhUTUwiLCJzYXZlQW5zd2Vyc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0QWRtaW5TdGF0cyIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlciIsImdldFN0YXRzQW5zd2VycyIsIlF1ZXN0aW9ubmFpcmUiLCJ0aXRsZSIsIm1heGxlbmd0aCIsInJlcXVpcmVkIiwic2x1ZyIsImludHJvZHVjdGlvbiIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiUXVlc3Rpb24iLCJ0ZXh0IiwicmFuayIsIm1pbiIsImRlZmF1bHRWYWx1ZSIsIkNob2ljZSIsInNlYXJjaCIsInNlYXJjaEdyb3VwcyIsImRpckNhY2hlR3JvdXBzIiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTEdyb3VwcyIsImRpckhUTUxUYWdzIiwiZGlyV2ViR3JvdXBzIiwiZGlyV2ViVGFncyIsIm5iUmFuZG9tUmVzdWx0cyIsIm5iVGFnc01pbiIsIm5iVGFnc01heCIsInVzZXJSb3V0ZXMiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwiY3JlYXRlVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJnZXRMb2dpbkxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwiZ2V0VXNlckluZm9zIiwic2VhcmNoVXNlclJvdXRlIiwic3Vic2NyaWJlUm91dGUiLCJ1bnN1YnNjcmliZVJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwidmFsaWRhdGVVc2VyUm91dGUiLCJuYW1lIiwiZW1haWwiLCJuZXdQYXNzd29yZCIsImNvZGVHb2RmYXRoZXIiLCJjZ3VPayIsInZhbHVlIiwidGltZURpZmZlcmVuY2VNaW4iLCJ0aW1lRGlmZmVyZW5jZU1heCIsImRpckNhY2hlVXNlcnNXaXRob3V0QW5zd2VycyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwidGFnc0xpc3RUeHQiLCJhYm91dFBhZ2UiLCJjZ3VQYWdlIiwiZGVsZXRlTGlua1BhZ2UiLCJsb2dpbkxpbmtQYWdlIiwibmV3TG9naW5MaW5rUGFnZSIsInN0b3BNYWlsUGFnZSIsInVwZGF0ZUFjY291bnRQYWdlIiwidXNlckhvbWVQYWdlVHh0IiwidmFsaWRhdGlvbkxpbmtQYWdlIiwibWFpbFJlY2lwaWVudFR4dCIsImhvbWVQYWdlVHh0IiwiaG9tZUJ0bkFib3V0VHh0IiwiaG9tZUJ0blN1YnNjcmliZVR4dCIsIm5ld3NMaXN0VGl0bGUiLCJxdWl6RWxlbWVudExpbmtzSW50cm8iLCJxdWl6RWxlbWVudFN1YmNyaXB0aW9uRm9ybVRpdGxlIiwicXVlc3Rpb25uYWlyZUxpY2VuY2VUeHQiLCJ0d2l0dGVyQWNjb3VudCIsIm1heFF1ZXN0aW9ubmFpcmVzU2l0ZUhvbWVQYWdlIiwiY29uZmlnVGVtcGxhdGUiLCJoZWxsb0RldiIsImluaXRpYWxpc2UiLCJjaGVja1Nlc3Npb24iLCJpc0Nvbm5lY3RlZCIsInVzZXIiLCJnZXRMb2NhbHkiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsImxvYWRNYXRvbW8iLCJDR1YiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiYWJvOSIsImFibzE4IiwiYWJvMzYiLCJhYm81NCIsImRpdldQQnRucyIsInN0eWxlIiwiZGlzcGxheSIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwidW5DaGVja0FsbE90aGVycyIsImNoZWNrZWQiLCJzaG93QnRuUGF5bWVudCIsImNvbnNvbGUiLCJlcnJvciIsInNhdmVMb2NhbHkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJqc29uIiwicGFyc2UiLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImxvZyIsImxpbmsiLCJob21lUGFnZSIsIl9wYXEiLCJ3aW5kb3ciLCJwdXNoIiwic2VsZiIsImdldE9yaWdpbmFsVmlzaXRvckNvb2tpZVRpbWVvdXQiLCJub3ciLCJub3dUcyIsInJvdW5kIiwiZ2V0VGltZSIsInZpc2l0b3JJbmZvIiwiZ2V0VmlzaXRvckluZm8iLCJjcmVhdGVUcyIsInBhcnNlSW50IiwiY29va2llVGltZW91dCIsIm9yaWdpbmFsVGltZW91dCIsInNldFZpc2l0b3JDb29raWVUaW1lb3V0IiwidSIsImQiLCJnIiwiY3JlYXRlRWxlbWVudCIsInMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInR5cGUiLCJhc3luYyIsInNyYyIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJnZXRUaW1lRGlmZmVyZW5jZSIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0IiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwiaSIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJ0b2tlbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImRhdGFzIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsInVybFJlZGlyZWN0aW9uIiwibWVzc2FnZSIsInVybFdhbnRlZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25sb2FkIiwicmVzcG9uc2UiLCJyZXNwb25zZVRleHQiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ0aW1lRGlmZmVyZW5jZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsImxvY2F0aW9uIiwiaW5kZXhPZiIsImFzc2lnbiIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Iiwic2VuZCIsImNoZWNrQm94ZXMiLCJjaG9pY2UiLCJidG5zIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbEZBLElBQU1BLEtBQUssR0FBR0MsbUJBQU8sQ0FBQyxtQ0FBRCxDQUFyQjs7QUFDQSxJQUFNQyxjQUFjLEdBQUdELG1CQUFPLENBQUMscURBQUQsQ0FBOUI7O0FBRUFFLE1BQU0sQ0FBQ0MsT0FBUDtBQUVJQyxRQUFNLEVBQUUsMkJBRlo7QUFHSUMsU0FB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ZWdLLFVBQWYsRUFDQTtBQUNJLFFBQUdoSyxFQUFFLEtBQUdpSyxNQUFSLEVBQ0lELFVBQVUsQ0FBQ2hLLEVBQUQsQ0FBVixDQUFlbUUsT0FBZixHQUF1QixLQUF2QjtBQUNKTixhQUFTLENBQUNDLEtBQVYsQ0FBZ0JDLE9BQWhCLEdBQXdCLE1BQXhCO0FBQ0g7QUFDSixDQVJNO0FBV1AsSUFBTW1HLElBQUksR0FDVjtBQUNJLFVBQVMzRyxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsUUFBeEIsQ0FEYjtBQUVJLFdBQVVELFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixTQUF4QixDQUZkO0FBR0ksV0FBVUQsUUFBUSxDQUFDQyxjQUFULENBQXdCLFNBQXhCLENBSGQ7QUFJSSxXQUFVRCxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsU0FBeEI7QUFKZCxDQURBLEMsQ0FRQTs7QUFDTyxJQUFNWSxjQUFjLEdBQUcsU0FBakJBLGNBQWlCLENBQUM2RixNQUFELEVBQzlCO0FBQ0ksT0FBSyxJQUFJakssRUFBVCxJQUFla0ssSUFBZixFQUNBO0FBQ0ksUUFBR2xLLEVBQUUsS0FBR2lLLE1BQVIsRUFDSUMsSUFBSSxDQUFDbEssRUFBRCxDQUFKLENBQVM4RCxLQUFULENBQWVDLE9BQWYsR0FBdUIsTUFBdkIsQ0FESixLQUdJbUcsSUFBSSxDQUFDbEssRUFBRCxDQUFKLENBQVM4RCxLQUFULENBQWVDLE9BQWYsR0FBdUIsT0FBdkI7QUFDUDtBQUNKLENBVE0sQyIsImZpbGUiOiIuL0pTL3BheW1lbnRQYWdlLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3BheW1lbnRQYWdlLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmkgKGxvY2FsKVwiLFxuICAgIHNlbmRlckVtYWlsOiBcImJvbmpvdXJAd2lraWxlcm5pLmNvbVwiLFxuICAgIGFkbWluTGFuZzogXCJmclwiLFxuICAgIHRoZW1lOiBcIndpa2lsZXJuaVwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pIChsb2NhbClcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwiV0xcIiwgLy8gY2FzZS1zZW5zaXRpdmUgYW5kIGNhbid0IGNvbnRhaW4gXCJAXCIgIVxuICAgIGRlZmF1bHRSZWNlaXB0RGF5czogXCIxNDdcIiwgLy8gUGFyIGTDqWZhdXQsIHF1ZWwocykgam91cihzKSBkZSBsYSBzZW1haW5lLCBsJ3V0aWxpc2F0ZXVyIHJlw6dvaXQtaWwgcXVlbHF1ZSBjaG9zZSA/ICgxPWRpbWFuY2hlLCAyPWx1bmRpLi4uIDc9c2FtZWRpKVxuICAgIGNyb25UaW1pbmdBbGVydEluU2Vjb25kZTogMTIwLCAvLyBmb3IgbG9nc1xuICAgIHJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGU6IDMsIC8vIGlkZW1cbiAgICB0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VyczogXCI0OGhcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3plaXQvbXNcbiAgICB0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VyczogXCIyNGhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXM6IFwiMTgwIGRheXNcIixcbiAgICB0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VyczogXCIxaFwiLC8vIGZvciBlbWFpbCAmIHBhc3N3b3JkIGNoYW5naW5nXG4gICAgdG9rZW5EZWxldGVVc2VyVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXM6IFwiNyBkYXlzXCIsIC8vIHRva2VuIHNlbmQgd2l0aCBzdWJzY3JpcHRpb24ncyBlbWFpbHNcbiAgICBmcmVlQWNjb3VudFRpbWluZ0luRGF5czogMTUsXG4gICAgZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzOiAzLFxuICAgIGFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXM6IDEwLFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiAzLFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDIsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTIsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjcsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyMSwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIGZpZWxkTmV3UXVlc3Rpb25uYWlyZXMgOiBcInB1Ymxpc2hpbmdBdFwiLCAvLyBmaWVsZCB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbGlzdCBvZiB0aGUgbGFzdCBxdWVzdGlvbm5haXJlcywgY2FuIGJlIFwiY3JlYXRlZEF0XCIsIFwidXBkYXRlZEF0XCIgb3IgXCJwdWJsaXNoaW5nQXRcIlxuICAgIC8vIEdyb3VwcyA6XG4gICAgbmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNaW46IDIsXG4gICAgbmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNYXg6IDAsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDAsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNTAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAxLFxuICAgIC8vIFF1ZXN0aW9ucyAmIHJlc3BvbnNlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVzXG59OyIsIi8vIFNpIG5vbiB1dGlsaXPDqSwgc3VwcHJpbWVyIGwnYXBwZWwgZGVzIEpTIGZyb250LWVuZCBwdWlzIHJlY29tcGlsZXIuXG4vLyBSZXZvaXIgY29tbWVudCByw6lvcmdhbmlzZXIgY2VsYSBzb3VzLWZvcm1lIGRlIG1vZHVsZSBpbmTDqXBlbmRhbnQuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gU3RhdHMgTWF0b21vIDpcbiAgICBtYXRvbW86IHsgdXJsOiBcImh0dHBzOi8vc3RhdHMubGUtZmFiLWxhYi5jb20vXCIsIHNpdGVJZDogXCI1XCIgfSxcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLC8vIGxhIGJhc2Ugw6AgbGFxdWVsbGUgcydham91dGUgbGVzIHJvdXRlcyBzdWl2YW50ZXNcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIGdldFJhbmRvbVF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9nZXRyYW5kb21cIixcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHJlZ2VuZXJhdGVIVE1MOiBcIi9odG1scmVnZW5lcmF0ZWRcIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICBnZXRQcmV2aW91c0Fuc3dlcnM6IFwiL3VzZXIvYW5zd2Vycy9cIixcbiAgICBnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXI6IFwiL3dpdGhvdXRhbnN3ZXIvdXNlci9cIixcbiAgICBnZXRTdGF0c0Fuc3dlcnMgOiBcIi91c2VyL2Fud3N3ZXJzL3N0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIGxhaXNzw6kgdmlkZSBkYW5zIGxlIGZvcm11bGFpcmVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzZWFyY2hHcm91cHM6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIC8vIEVtcGxhY2VtZW50IGRlcyBmaWNoaWVycyBKU09OIGfDqW7DqXLDqXMgOlxuICAgIGRpckNhY2hlR3JvdXBzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9ncm91cHNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9xdWVzdGlvbnNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIixcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgLy8gRW1wbGFjZW1lbnQgZGVzIGZpY2hpZXJzIEhUTUwgZ8OpbsOpcsOpcyA6XG4gICAgZGlySFRNTEdyb3VwcyA6IFwiZnJvbnQvcHVibGljL3F1aXpzL2dwXCIsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmVzIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICAvLyBJZGVtIG1haXMgcG91ciB1cmxzIDpcbiAgICBkaXJXZWJHcm91cHMgOiBcInF1aXpzL2dwXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZXMgOiBcInF1aXpcIixcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6cy9cIixcbiAgICAvLyBsaW1pdGUgZGVzIHLDqXN1bHRhdCBkdSBtb3RldXIgZGUgcmVjaGVyY2hlLCBxdWFuZCBkZW1hbmRlIGRlIHLDqXN1bHRhdHMgYXUgaGFzYXJkIDpcbiAgICBuYlJhbmRvbVJlc3VsdHMgOiAzLFxuICAgIC8qIFZhbGV1cnMgZW4gZmFpdCBkw6lmaW5pZXMgZGFucyBpbnN0YW5jZS5qcyBkb25jIMOgIHN1cHByaW1lciBxdWFuZCBwbHVzIHV0aWxpc8OpZXMgYWlsbGV1cnMgOiAqL1xuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLCAgIFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsICAgIFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLCAgICAgICAgXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNlYXJjaDogeyBtaW5sZW5ndGg6IDEsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNXaXRob3V0QW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvd2l0aG91dFwiXG59O1xuIiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIixcblx0XCIuL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5odG1sXCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbiAgICB0YWdzTGlzdFR4dDogXCJQYXJjb3VyaXIgbGVzIHJ1YnJpcXVlcyA6XCIsXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBsaWVucyBkZSBsJ2ludGVyZmFjZVxuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIlBhcmNvdXJpclwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvcXVpenMvXCIsIGlkOlwiaW5kZXhIZWFkTGlua1wiLCB0aXRsZTpcIkxlcyBkZXJuacOocmVzIG1pc2VzIMOgIGpvdXIgV2lraUxlcm5pXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaHRtbFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiwgdGl0bGU6XCJBY2PDqWRlciBvdSBjcsOpZXogdm90cmUgY29tcHRlIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIsIHRpdGxlOlwiRW4gc2F2b2lyICsgc3VyIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIsIHRpdGxlOlwiUGFnZSBkJ2FjY3VlaWxcIiB9IH1cbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkJsb2dcIiwgYXR0cmlidXRlczogeyBocmVmOlwiaHR0cHM6Ly9mcmFtYXNwaGVyZS5vcmcvcGVvcGxlLzdlNTRiN2EwYjUzMjAxMzg5ZWVmMmEwMDAwMDUzNjI1XCIsIHRpdGxlOlwiTGUgYmxvZyBXaWtpTGVybmkgc3VyIGRpYXNwb3JhKlwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiLCB0aXRsZTpcIlF1aSBhIGNyw6nDqSBXaWtpTGVybmkgPyBRdWVscyBzb250IHZvcyBkcm9pdHMgP1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIsIHRpdGxlOlwiVm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcyBzdXIgV2lraUxlcm5pXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDR1YgJiBDR1VcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL0NHVi1DR1UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH1cbiAgICBdLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgYWJvdXRQYWdlOiBcImEtcHJvcG9zLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlOiBcImFkbWluLmh0bWxcIixcbiAgICBjZ3VQYWdlOiBcIkNHVi1DR1UuaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGRlbGV0ZUxpbmtQYWdlIDogXCJhdXJldm9pci5odG1sP3Q9XCIsXG4gICAgbG9naW5MaW5rUGFnZSA6IFwibG9naW4uaHRtbD90PVwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgbmV3TG9naW5MaW5rUGFnZSA6IFwibmV3bG9naW4uaHRtbD90PVwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsICAgIFxuICAgIHN0b3BNYWlsUGFnZSA6IFwic3RvcC1tYWlsLmh0bWw/dD1cIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgdXBkYXRlQWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIHVzZXJIb21lUGFnZVR4dCA6IFwiTWEgcGFnZSBkJ2FjY3VlaWwuXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgdmFsaWRhdGlvbkxpbmtQYWdlIDogXCJ2YWxpZGF0aW9uLmh0bWw/dD1cIixcbiAgICAvKiBUZXh0ZXMgKGfDqW7DqXJhbCkgKi9cbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG4gICAgbWFpbFJlY2lwaWVudFR4dDogXCJNZXNzYWdlIGVudm95w6kgw6AgOlwiLFxuICAgIC8qIFBhZ2UgZCdhY2N1ZWlsICovXG4gICAgaG9tZVBhZ2VUeHQ6IFwiUGFnZSBkJ2FjY3VlaWxcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIkF2ZWMgV2lraUxlcm5pLCB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhIDxzcGFuIGNsYXNzPSdwb3N0c2NyaXB0dW0nPigqKTwvc3Bhbj4sIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSA8YSBocmVmPVxcXCIvY3JlZGl0cy5odG1sXFxcIiB0aXRsZT1cXFwiRW4gc2F2b2lyIHBsdXNcXFwiPnNvbnQgbGlicmVzPC9hPi48YnI+U3VyIFdpa2lMZXJuaSwgcGFzIGRlIHB1YmxpY2l0w6ksIG5pIGRlIGNvbW1lcmNpYWxpc2F0aW9uIGRlIHZvcyBkb25uw6llcy48YnI+Vm91cyBwb3V2ZXogdmVuaXIgeSBcXFwiY3VsdGl2ZXIgdm90cmUgamFyZGluXFxcIiBlbiB0b3V0ZSB0cmFucXVpbGxpdMOpLlwiLFxuICAgIGhvbWVCdG5BYm91dFR4dDogXCJFbiBzYXZvaXIgcGx1cyBzdXIgV2lraUxlcm5pID9cIixcbiAgICBob21lQnRuU3Vic2NyaWJlVHh0OiBcIlRlc3RlciBXaWtpTGVybmkgZ3JhdHVpdGVtZW50LlwiLFxuICAgIC8qIFBhZ2UgZGVybmnDqHJlcyBwdWJsaWNhdGlvbnMuLi4gKi8gICBcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkN1bHR1cmUgZ8OpbsOpcmFsZSAtIGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIldpa2lMZXJuaSA6IHRlc3RleiB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGF2ZWMgbGVzIHF1aXpzIFdpa2lMZXJuaS5cIixcbiAgICBuZXdzTGlzdFRpdGxlOiBcIjxoMz4xIGFydGljbGUgV2lraXDDqWRpYSArIDEgcXVpeiA9IDEgV2lraUxlcm5pPC9oMz48cD5XaWtpTGVybmksIGNlIHNvbnQgcGx1c2lldXJzIHF1aXpzIHB1Ymxpw6lzIGNoYXF1ZSBzZW1haW5lLCBjaGFjdW4gYXNzb2Npw6kgw6AgdW4gYXJ0aWNsZSBXaWtpcMOpZGlhLjxicj5TYW5zIHB1YmxpY2l0w6ksIG5pIGNvbW1lcmNlIGRlIHZvcyBkb25uw6llcywgPGI+dm91cyBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGVuIHRvdXRlIGxpYmVydMOpPC9iPi48L3A+PGJsb2NrcXVvdGU+QXJpc3RvdGXigK86IMKr4oCvTOKAmWhvbW1lIGEgbmF0dXJlbGxlbWVudCBsYSBwYXNzaW9uIGRlIGNvbm5hw650cmXigKbigK/CuzwvYmxvY2txdW90ZT5cIixcbiAgICAvKiBQYWdlIHF1aXpzICovXG4gICAgcXVpekVsZW1lbnRMaW5rc0ludHJvOiBcIlNvdXJjZShzKVwiLFxuICAgIHF1aXpFbGVtZW50U3ViY3JpcHRpb25Gb3JtVGl0bGU6IFwiUmVjZXZleiBsZXMgcHJvY2hhaW5zIFdpa2lMZXJuaVwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiPHA+TGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IDxiPnZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqTwvYj4uPGJyPlB1aXMgdm91cyA8Yj5hZmZpY2hlciBsZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGF2ZXogcmV0ZW51IGRlIHZvdHJlIGxlY3R1cmU8L2I+LjwvcD48cD5TdWl2YW50IGxlcyBxdWVzdGlvbnMsIDxiPnVuZSBvdSBwbHVzaWV1cnMgcsOpcG9uc2VzIHBldXZlbnQgw6p0cmUgY29ycmVjdGVzPC9iPiBldCBkb2l2ZW50IGRvbmMgw6p0cmUgY29jaMOpZXMuPGJyPkMnZXN0IHRvdWpvdXJzIDxiPmxlIGNvbnRlbnUgZGUgbCdhcnRpY2xlIFdpa2lww6lkaWEgcXVpIGZhaXQgZm9pPC9iPiBjb25jZXJuYW50IGxlcyBcXFwiYm9ubmVzXFxcIiByw6lwb25zZXMuPGJyPk1haXMgbGVzIGFydGljbGVzIGRlIFdpa2lww6lkaWEgcGV1dmVudCDDqXZvbHVlciwgZG9uYyBuJ2jDqXNpdGV6IHBhcyA8YSBocmVmPScvY29udGFjdC5odG1sJz7DoCBtZSBzaWduYWxlciB1bmUgZXJyZXVyPC9hPi48L3A+PGgzPlBhcyBsZSB0ZW1wcyBkZSBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhID88L2gzPjxwPklsIGVzdCB2cmFpIHF1ZSBjZXJ0YWlucyBzb250IGxvbmdzICEgOi0pPGJyPkRhbnMgY2UgY2FzLCA8Yj5lc3NheWV6IHNpbXBsZW1lbnQgZGUgcsOpcG9uZHJlIGF2ZWMgdm9zIGNvbm5haXNzYW5jZXMgYWN0dWVsbGVzPC9iPi48YnI+SWwgbidlc3QgcGFzIG7DqWNlc3NhaXJlIGRlIHLDqXBvbmRyZSDDoCB0b3V0ZXMgbGVzIHF1ZXN0aW9ucyBwb3VyIG9idGVuaXIgbGVzIHLDqXBvbnNlcy48YnI+QXByw6hzIHZhbGlkYXRpb24sIHZvdXMgdmVycmV6IGFwcGFyYcOudHJlIGxlcyBib25uZXMgcsOpcG9uc2VzICsgdW4gZXh0cmFpdCBkZSBsJ2FydGljbGUgV2lraXDDqWRpYS48YnI+Vm91cyBwb3V2ZXogYWluc2kgPGI+YXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXMgZW4gcXVlbHF1ZXMgbWludXRlczwvYj4uPC9wPjxwPlVuZSBhdXRyZSBwb3NzaWJpbGl0w6kgZXN0IGQnYWZmaWNoZXIgbGUgcXVpeiBhdmFudCBkJ2FsbGVyIGNoZXJjaGVyIGxlcyByw6lwb25zZXMgZGFucyBsJ2FydGljbGUgV2lraXDDqWRpYS4uLiBFbGxlcyB5IHNvbnQgdG91dGVzICE8L3A+PHA+PGI+SWwgbid5IGEgcGFzIGRlIGJvbm5lIGZhw6dvbiBkZSBmYWlyZTwvYj4sIGV0IGRhbnMgdG91cyBsZXMgY2FzIDxiPnZvdXMgYXBwcmVuZXogZGVzIGNob3NlcyBzdXIgZGVzIHN1amV0cyB0csOocyB2YXJpw6lzLCBjZSBxdWkgZXN0IGxlIGJ1dCBkZSBXaWtpTGVybmk8L2I+LjwvcD48cD5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOik8L3A+PHA+VW5lIGZvaXMgdm90cmUgcsOpc3VsdGF0IG9idGVudSwgaWwgdm91cyBzZXJhIHByb3Bvc8OpIGRlIGNyw6llciB1biBjb21wdGUgcG91ciBsZSBzYXV2ZWdhcmRlci4gQ2UgY29tcHRlIHZvdXMgcGVybWV0dHJhIGRlIDxiPnRlc3RlciBkZSBub3V2ZWF1IGNlIHF1aXo8L2I+IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IGFwcsOocyBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEdyw6JjZSDDoCBjZSBjb21wdGUsIHZvdXMgcG91cnJleiBhdXNzaSA8Yj5yZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVhdXggcXVpenM8L2I+IHBvdXIgY29udGludWVyIMOgIFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiLjwvcD5cIixcbiAgICBxdWVzdGlvbm5haXJlTGljZW5jZVR4dDogXCJDZSBxdWl6IDxhIGhyZWY9XFxcIi9jcmVkaXRzLmh0bWxcXFwiPmVzdCBsaWJyZTwvYT4sIG1haXMgaWwgbidlc3QgcGFzIGdyYXR1aXQuIFZvdXMgcG91dmV6IDxhIGhyZWY9XFxcIi9wYXJ0aWNpcGVyLWZpbmFuY2VtZW50Lmh0bWxcXFwiPnBhcnRpY2lwZXIgw6Agc29uIGZpbmFuY2VtZW50IGVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgLyogQXV0cmVzICovXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHR3aXR0ZXJBY2NvdW50OiBcIldpa2lMZXJuaVwiLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMixcbiAgICBtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZTogMyxcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMyxcbn07IiwiLy8gLS0gR0VTVElPTiBERSBMQSBQQUdFIERVIEZJTkFOQ0VNRU5UIFBBUlRJQ0lQQVRJRiAoU0FOUyBERVZPSVIgw4pUUkUgQ09OTkVDVMOJKVxuXG4vLy8gUGVybWV0IGQnYWZmaWNoZXIgbGVzIGJvdXRvbnMgZGUgcGFpZW1lbnQgV1Agc3VpdmFudCBsZSBjaG9peCBkZSBsJ3V0aWxpc2F0ZXVyLlxuLy8vIE1hdG9tbyBlc3Qgw6lnYWxlbWVudCBhY3RpdsOpIHNpIGwnaW50ZXJuYXV0ZSBuJ2VzdCBwYXMgY29ubmVjdMOpLlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gdGlyw6lzIGR1IGJhY2tlbmQgOlxuaW1wb3J0IHsgYXZhaWxhYmxlTGFuZ3MsIHRoZW1lIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEZvbmN0aW9ucyB1dGlsZXMgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2LCB1cGRhdGVBY2NvdW50TGluayB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGxvYWRNYXRvbW8gfSBmcm9tIFwiLi90b29scy9tYXRvbW8uanNcIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5pbXBvcnQgeyBzaG93QnRuUGF5bWVudCwgdW5DaGVja0FsbE90aGVycyB9IGZyb20gXCIuL3Rvb2xzL3dlYnBvcnRhZ2UuanNcIjtcblxuaGVsbG9EZXYoKTtcblxuY29uc3QgaW5pdGlhbGlzZSA9IGFzeW5jICgpID0+XG57XG4gICAgdHJ5XG4gICAge1xuICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oKTtcbiAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIG9uIGNoYW5nZSBsZSBsaWVuIGR1IGNvbXB0ZSBlbiBoYXV0IDpcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIHVwZGF0ZUFjY291bnRMaW5rKHVzZXIuc3RhdHVzLCBjb25maWdUZW1wbGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbG9hZE1hdG9tbygpO1xuXG4gICAgICAgIC8vIExlcyBib3V0b25zIGRlIHBhaWVtZW50IFdQIDogICAgICAgIFxuICAgICAgICBjb25zdCBDR1Y9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJDR1ZPa1wiKTtcbiAgICAgICAgY29uc3QgYWJvOT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFibzlcIik7XG4gICAgICAgIGNvbnN0IGFibzE4PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvMThcIik7XG4gICAgICAgIGNvbnN0IGFibzM2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvMzZcIik7XG4gICAgICAgIGNvbnN0IGFibzU0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvNTRcIik7XG4gICAgICAgIGNvbnN0IGRpdldQQnRucz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIldQQnRuc1wiKTtcbiAgICAgICAgZGl2V1BCdG5zLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgIGFibzkuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICB1bkNoZWNrQWxsT3RoZXJzKFwiYWJvOVwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFibzE4LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdW5DaGVja0FsbE90aGVycyhcImFibzE4XCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgYWJvMzYuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICB1bkNoZWNrQWxsT3RoZXJzKFwiYWJvMzZcIik7XG4gICAgICAgIH0pO1xuICAgICAgICBhYm81NC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHVuQ2hlY2tBbGxPdGhlcnMoXCJhYm81NFwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIENHVi5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKENHVi5jaGVja2VkPT09dHJ1ZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkaXZXUEJ0bnMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgaWYoYWJvOS5jaGVja2VkPT09dHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgc2hvd0J0blBheW1lbnQoXCJidG45XCIpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYoYWJvMTguY2hlY2tlZD09PXRydWUpXG4gICAgICAgICAgICAgICAgICAgIHNob3dCdG5QYXltZW50KFwiYnRuMThcIik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZihhYm8zNi5jaGVja2VkPT09dHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgc2hvd0J0blBheW1lbnQoXCJidG4zNlwiKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmKGFibzU0LmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICBzaG93QnRuUGF5bWVudChcImJ0bjU0XCIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRpdldQQnRucy5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICBDR1YuY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZGl2V1BCdG5zLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcblxcbkxlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCB2b3VzIHBvdXZleiBsZSB0cm91dmVyIHNpIEdpdGxhYiA6XFxuaHR0cHM6Ly9naXRsYWIuY29tL2xlZmFibGFiL3dpa2lsZXJuaVxcblxcblBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBtYXRvbW8gfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL21hdG9tby5qc1wiO1xuXG4vLyBGb25jdGlvbiBjaGFyZ2VhbnQgbGUgY29kZSBtYXRvbW9cbmV4cG9ydCBjb25zdCBsb2FkTWF0b21vID0gKCkgPT5cbntcbiAgICAvLyBjaGFyZ2VtZW50IGRlIG1hdG9tb1xuICAgIHZhciBfcGFxID0gd2luZG93Ll9wYXEgPSB3aW5kb3cuX3BhcSB8fCBbXTtcbiAgICAvL2Fqb3V0IGNuaWwgIDpcbiAgICBfcGFxLnB1c2goW2Z1bmN0aW9uKClcbiAgICB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgZnVuY3Rpb24gZ2V0T3JpZ2luYWxWaXNpdG9yQ29va2llVGltZW91dCgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgbm93VHMgPSBNYXRoLnJvdW5kKG5vdy5nZXRUaW1lKCkgLyAxMDAwKSxcbiAgICAgICAgICAgIHZpc2l0b3JJbmZvID0gc2VsZi5nZXRWaXNpdG9ySW5mbygpO1xuICAgICAgICAgICAgdmFyIGNyZWF0ZVRzID0gcGFyc2VJbnQodmlzaXRvckluZm9bMl0pO1xuICAgICAgICAgICAgdmFyIGNvb2tpZVRpbWVvdXQgPSAzMzY5NjAwMDsgLy8gMTMgbW9pcyBlbiBzZWNvbmRlc1xuICAgICAgICAgICAgdmFyIG9yaWdpbmFsVGltZW91dCA9IGNyZWF0ZVRzICsgY29va2llVGltZW91dCAtIG5vd1RzO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsVGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZpc2l0b3JDb29raWVUaW1lb3V0KCBnZXRPcmlnaW5hbFZpc2l0b3JDb29raWVUaW1lb3V0KCkgKTtcbiAgICB9XSk7XG4gICAgLy8tLWZpbiBham91dCBjbmlsXG4gICAgX3BhcS5wdXNoKFsndHJhY2tQYWdlVmlldyddKTtcbiAgICBfcGFxLnB1c2goWydlbmFibGVMaW5rVHJhY2tpbmcnXSk7XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdT1tYXRvbW8udXJsO1xuICAgICAgICBfcGFxLnB1c2goWydzZXRUcmFja2VyVXJsJywgdSsnbWF0b21vLnBocCddKTtcbiAgICAgICAgX3BhcS5wdXNoKFsnc2V0U2l0ZUlkJywgbWF0b21vLnNpdGVJZF0pO1xuICAgICAgICB2YXIgZD1kb2N1bWVudCwgZz1kLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpLCBzPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICAgICAgICBnLnR5cGU9J3RleHQvamF2YXNjcmlwdCc7IGcuYXN5bmM9dHJ1ZTsgZy5zcmM9dSsnbWF0b21vLmpzJzsgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLHMpO1xuICAgIH0pKCk7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIC8vIG11bHRpcGxpZXIgcGFyIC0xLCBjYXIgYydlc3QgY2UgcXUnaWwgZmF1dCBcImFqb3V0ZXJcIiDDoCBsJ2hldXJlIFVUQyBwb3VyIHJldmVuaXIgZW4gaGV1cmUgbG9jYWxlIHF1aSBtJ2ludMOpcmVzc2UgZXQgbm9uIGwnaW52ZXJzZVxuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCkqLTE7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXpcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBjJ2VzdCBsZSB0b2tlbiBxdWkgc2VydCDDoCB2w6lyaWZpZXIgbGUgc3RhdHV0IMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2UrXCIjc3Vic2NyaWJlXCIpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59IiwiY29uc3QgY2hlY2tCb3hlcz1cbntcbiAgICBcIkNHVlwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJDR1ZPa1wiKSxcbiAgICBcImFibzlcIiA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvOVwiKSxcbiAgICBcImFibzE4XCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFibzE4XCIpLFxuICAgIFwiYWJvMzZcIiA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvMzZcIiksXG4gICAgXCJhYm81NFwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm81NFwiKVxufVxuY29uc3QgZGl2V1BCdG5zPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BCdG5zXCIpO1xuXG4vLyBMb3JzcXVlIGwnb24gc8OpbGVjdGlvbm5lIHVuIG1vbnRhbnQsIGxlcyBhdXRyZXMgb3B0aW9ucyArIGxlcyBDR1Ygc29udCBkw6lzw6lsZWN0aW9ubsOpc1xuZXhwb3J0IGNvbnN0IHVuQ2hlY2tBbGxPdGhlcnMgPSAoY2hvaWNlKSA9Plxue1xuICAgIGZvciAobGV0IGlkIGluIGNoZWNrQm94ZXMpXG4gICAge1xuICAgICAgICBpZihpZCE9PWNob2ljZSlcbiAgICAgICAgICAgIGNoZWNrQm94ZXNbaWRdLmNoZWNrZWQ9ZmFsc2U7XG4gICAgICAgIGRpdldQQnRucy5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgIH1cbn1cblxuXG5jb25zdCBidG5zPVxue1xuICAgIFwiYnRuOVwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJXUEJ0bjlcIiksXG4gICAgXCJidG4xOFwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJXUEJ0bjE4XCIpLFxuICAgIFwiYnRuMzZcIiA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BCdG4zNlwiKSxcbiAgICBcImJ0bjU0XCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIldQQnRuNTRcIilcbn1cblxuLy8gQWZmaWNoZSBsZSBib24gYm91dG9uIGRlIHBhaWVtZW50IGV0IGNhY2hlIGxlcyBhdXRyZXNcbmV4cG9ydCBjb25zdCBzaG93QnRuUGF5bWVudCA9IChjaG9pY2UpID0+XG57XG4gICAgZm9yIChsZXQgaWQgaW4gYnRucylcbiAgICB7XG4gICAgICAgIGlmKGlkIT09Y2hvaWNlKVxuICAgICAgICAgICAgYnRuc1tpZF0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYnRuc1tpZF0uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgfVxufSJdLCJzb3VyY2VSb290IjoiIn0=
|