/******/ (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/homeUser.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 "@" ! 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: 10, freeAccountExpirationNotificationInDays: 5, accountExpirationFirstNotificationInDays: 14, accountExpirationSecondNotificationInDays: 5, inactiveAccountTimeToDeleteInDays: 180, // Questionnaires: nbQuestionsMin: 1, // minimum number of questions for the questionnaire to be publishable nbQuestionsMax: 2, // if 0 = not maximum nbChoicesMax: 10, nbNewQuestionnaires: 10, // for RSS, etc. hourGiveNewQuestionnaireBegin: 1, // in user local time hourGiveNewQuestionnaireEnd: 24, // idem numberNewQuestionnaireAtSameTime: 50, // for mass mailing minSearchQuestionnaires: 3, // 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: 400, illustrationsMiniaturesWidthMaxInPx: 200, // Links: nbLinksMin: 1, nbLinksMax: 1 }, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _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, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); /***/ }), /***/ "../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", getQuestionnaireRoutes: "/get", previewQuestionnaireRoutes: "/preview", publishedQuestionnaireRoutes: "/quiz/", saveAnswersRoute: "/answer/", getStatsQuestionnaires: "/stats/", searchQuestionnairesRoute: "/search", getRandomQuestionnairesRoute: "/getrandom", searchAdminQuestionnairesRoute: "/searchadmin", getListNextQuestionnaires: "/getlistnextquestionnaires/", regenerateHTML: "/htmlregenerated", // -- questions & choices : questionsRoute: "/question/", // -- tags : tagsSearchRoute: "/tags/search/", // -- answers : getQuestionnairesWithoutAnswer: "/withoutanswer/user/", getPreviousAnswers: "/user/answers/", getStatsAnswers: "/user/anwswers/stats/", getAdminStats: "/getadminstats/", // 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 vide 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 } }, nbQuestionsMin: 1, nbQuestionsMax: 0, nbChoicesMax: 10, nbTagsMin: 0, nbTagsMax: 0, // 0 = not max // JSON and HTML dir dirCacheQuestionnaires: "datas/questionnaires", dirCacheQuestions: "datas/questionnaires/questions", dirCacheUsersQuestionnaires: "datas/users/questionnaires", dirCacheTags: "datas/questionnaires/tags", dirHTMLQuestionnaire: "front/public/quiz", dirHTMLTags: "front/public/quizs", dirWebQuestionnaire: "quiz", //pour url page dirWebTags: "quizs", // idem nbRandomResults: 3 // limite les résultat du moteur de recherche quand demande de résultats au hasard }; /***/ }), /***/ "../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", subscribeRoute: "/signup", getGodfatherRoute: "/getgodfatherid", checkIfIsEmailfreeRoute: "/isemailfree", checkSubscribeTokenRoute: "/validation/", checkLoginRoute: "/checklogin/", connectionRoute: "/login", getLoginLinkRoute: "/getloginlink", connectionWithLinkRoute: "/checkloginlink", getUserInfos: "/get/", createUserRoute: "/create", validateUserRoute: "/validate/", updateUserInfos: "/modify/", searchUserRoute: "/search/", getGodChilds: "/getgodchilds/", checkNewLoginLinkRoute: "/confirmnewlogin/", checkDeleteLinkRoute: "/confirmdelete/", getPayments: "/payment/getforoneuser/", unsubscribeRoute: "/subscription/stop/", getAdminStats: "/getadminstats/", // 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 }, timeDifferenceMin: -720, timeDifferenceMax: 840, // JSON dir dirCacheUsers: "datas/users", dirCacheUsersAnswers: "datas/users/questionnaires/answers" }; /***/ }), /***/ "../lang sync recursive ^\\.\\/.*\\/answer$": /*!*************************************!*\ !*** ../lang sync ^\.\/.*\/answer$ ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var map = { "./fr/answer": "../lang/fr/answer.js" }; function webpackContext(req) { var id = webpackContextResolve(req); return __webpack_require__(id); } function webpackContextResolve(req) { if(!__webpack_require__.o(map, req)) { var e = new Error("Cannot find module '" + req + "'"); e.code = 'MODULE_NOT_FOUND'; throw e; } return map[req]; } webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/answer$"; /***/ }), /***/ "../lang sync recursive ^\\.\\/.*\\/general$": /*!**************************************!*\ !*** ../lang sync ^\.\/.*\/general$ ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var map = { "./fr/general": "../lang/fr/general.js" }; function webpackContext(req) { var id = webpackContextResolve(req); return __webpack_require__(id); } function webpackContextResolve(req) { if(!__webpack_require__.o(map, req)) { var e = new Error("Cannot find module '" + req + "'"); e.code = 'MODULE_NOT_FOUND'; throw e; } return map[req]; } webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; /***/ }), /***/ "../lang sync recursive ^\\.\\/.*\\/questionnaire$": /*!********************************************!*\ !*** ../lang sync ^\.\/.*\/questionnaire$ ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var map = { "./fr/questionnaire": "../lang/fr/questionnaire.js" }; function webpackContext(req) { var id = webpackContextResolve(req); return __webpack_require__(id); } function webpackContextResolve(req) { if(!__webpack_require__.o(map, req)) { var e = new Error("Cannot find module '" + req + "'"); e.code = 'MODULE_NOT_FOUND'; throw e; } return map[req]; } webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/questionnaire$"; /***/ }), /***/ "../lang sync recursive ^\\.\\/.*\\/user$": /*!***********************************!*\ !*** ../lang sync ^\.\/.*\/user$ ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var map = { "./fr/user": "../lang/fr/user.js" }; function webpackContext(req) { var id = webpackContextResolve(req); return __webpack_require__(id); } function webpackContextResolve(req) { if(!__webpack_require__.o(map, req)) { var e = new Error("Cannot find module '" + req + "'"); e.code = 'MODULE_NOT_FOUND'; throw e; } return map[req]; } webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; /***/ }), /***/ "../lang/fr/answer.js": /*!****************************!*\ !*** ../lang/fr/answer.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = { needNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu doit être fourni.", needIntegerNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.", needMinNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être inférieur à 1.", needMaxNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être aussi élevé.", needNumberCorrectResponses: "Le nombre de réponses correctes doit être fourni.", needIntegerNumberCorrectResponses: "Le nombre de réponses correctes doit être un nombre entier.", needMinNumberCorrectResponses: "Le nombre de réponses correctes ne peut être négatif.", needMaxNumberCorrectResponses: "Le nombre de réponses correctes ne peut être supérieur au nombre de questions.", needIntegerNumberSecondesResponse: "La durée de la réponse doit être un nombre entier de secondes.", needMinNumberSecondesResponse: "La durée de la réponse ne peut être négative.", checkResponsesOuputFail: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. C'est certain, vous ferez mieux la prochaine fois !", checkResponsesOuputMedium: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. C'est pas mal du tout !", checkResponsesOuputSuccess: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. Bravo ! Rien ne vous échappe !", wantToSaveResponses: "Si vous le souhaitez, vous pouvez sauvegarder votre résultat en vous connectant à votre compte.", responseSavedMessage: "Votre résultat a été enregistré. Accèder à tous vos quizs.", responseSavedError: "Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. Accèder à tous vos quizs.", noQuestionnaireWithoudAnswer: "Bravo ! Vous avez répondu à tous les quizs qui vous on été proposés !
Il y en a des nouveaux publiés régulièrement et qui vous seront proposés.
En attendant vous pouvez peut-être essayer de répondre de nouveau à certain quiz pour voir si vous vous souvenez des bonnes réponses ?", nbQuestionnaireWithoudAnswer: "Il y a #NB quizs qui vous ont été proposés et auxquels vous n'avez pas répondu. Voici les derniers :!", statsUser: "Vous avez enregistré NBANSWERS réponses à NBQUESTIONNAIRES questionnaires différents sur les NBTOTQUESTIONNAIRES proposés par le site.
En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.", previousAnswersTitle: "Bonjour #NOM, voici vos précédents résultats à ce quiz", previousAnswersStats: "En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant AVGCORRECTANSWERS % de bonnes réponses.", previousAnswersLine: "Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions en AVGDURATION secondes.", noPreviousAnswer: "On dirait que c'est la première fois que vous répondez à ce quiz. Bonne lecture !" }; /***/ }), /***/ "../lang/fr/general.js": /*!*****************************!*\ !*** ../lang/fr/general.js ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = { siteHTMLTitle: "WikiLerni : Wikipédia en questions", siteMetaDescription: "Avec WikiLerni, recevez chaque jour de nouveaux quizs pour tester vos connaissances et apprendre de nouvelles choses.", scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", serverErrorAdmin: "Bug de l'application :", neededParams: "Des paramètres nécessaires manquants sont manquants.", badUrl: "Tentative d'accès à une page n'existant pas :", notValidFormat: "Format non valide.", notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", notRequired: "Facultatif.", updateBtnTxt: "Modifier", addBtnTxt: "Ajouter", deleteBtnTxt: "Supprimer", addOkMessage: "Les données ont bien été enregistrées.", updateOkMessage: "La mise à jour à jour a bien été enregistrée.", deleteOkMessage: "La suppression a bien été enregistrée.", failAuth: "Erreur d'authentification.", failAuthHeader: "Absence de header Authorization.", failAuthToken: "Token invalide ou utilisateur non trouvé.", failAuthId: "Identifiant non valide : ", failAuthCron: "Tentative de lancement d'un cron sans le bon token.", previousPage: "Page précédente", nextPage: "Page suivante", alertNewWindow: "nouvelle fenêtre", btnLinkToQuestionnaire: "Aller au quiz !", statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." }; /***/ }), /***/ "../lang/fr/questionnaire.js": /*!***********************************!*\ !*** ../lang/fr/questionnaire.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = { needTitle: "Merci de fournir un titre à votre quiz.", needNotTooLongTitle: "Le titre du quiz ne doit pas compter plus de 255 caractères.", needUrl: "Merci de fournir l'url à votre quiz.", needUniqueUrl: "L'url du quiz doit être unique.", needIntroduction: "Merci de fournir un texte d'introduction à votre quiz.", needCorrectPublishingDate: "La date de publication fournie n'a pas un format valide.", needKnowIfIsPublished: "Il faut savoir si ce quiz est publié.", needLanguage: "Vous devez sélectionner la langue de ce quiz.", needEstimatedTime: "Merci de sélectionner une estimation de la durée de ce quiz.", notFound: "Aucun quiz n'a pas été trouvé.", searchResultTitle: "Résultat pour votre recherche", searchNoResult: "Aucun résultat n'a été trouvé pour votre recherche", searchWithResult: "Voici #NB quizs pour votre recherche :", questionnairesName: "quiz", publishedBy: "Quiz publié par", publishedAt: ", le", lastUpdated: "Dernière mise à jour, le ", estimatedTime: "Durée de lecture estimée : ", estimatedTimeOption: { short: "courte", medium: "moyenne", long: "longue" }, explanationBeforeTxt: "Extrait :", correctAnswerTxt: "Bonne réponse", wrongAnswerTxt: "Mauvaise réponse", btnSendResponse: "Testez vos réponses.", btnProposeSubscribe: "Je crée mon compte.", btnProposeConnection: "Je me connecte.", btnShowQuestionnaire: "Afficher le quiz !", btnShareQuizTxt: "Partager ce quiz sur ", nextQuestionnairesList: "Les #NB prochains quizs devant être publiés", needBeCompleted: "Quiz incomplet", nextDateWithoutQuestionnaire: "Prochaine date sans quiz programmé : ", haveBeenPublished: ":NB nouveaux questionnaires ont été publiés.", haveBeenRegenerated: "Les fichiers HTML de #NB1 questionnaires et #NB2 rubriques ont été regénérés." }; /***/ }), /***/ "../lang/fr/user.js": /*!**************************!*\ !*** ../lang/fr/user.js ***! \**************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = { notFound: "L'utilisateur n'a pas été trouvé.", needName: "Merci de choisir un nom d'utilisateur.", needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", needEmail: "Merci de saisir votre adresse e-mail.", needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", needPassWord: "Merci de fournir un mot de passe.", needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", passwordCopied: "Le mot de passe généré a été copié dans votre presse-papier. Vous pouvez le recopier (Ctrl+V) où vous le souhaitez.", needStatus: "Il manque le statut.", needLanguage: "Il manque le code langue.", needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", needSMTP: "Il manque le serveur SMTP.", needSMTPNotFound: "Il manque le serveur SMTP.", needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", godfatherNotFound: "Aucun utilisateur n'a été trouvé pour ce code parrain.", godfatherFound: "Votre parrain a bien été trouvé !", mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", mailValidationLinkSubject: "Merci de valider votre inscription", mailValidationLinkTxt: "Valider mon compte.", mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", mailValidationLinkSBodyHTML: "

Bonjour USER_NAME,

Pour valider votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.

", validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", validationMessageAdmin: "Le compte a bien été validé.", validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", mailWelcomeSubject: "Bienvenue !", mailWelcomeLinkTxt: "Me connecter à mon compte.", mailWelcomeBodyTxt: "Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois du site n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi les quizs du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nEncore merci et à bientôt.", mailWelcomeBodyHTML: "

Bonjour USER_NAME,

Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !

Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.

Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois du site n'arrivent en spam.

Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi les quizs du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.

Pour ce faire, utilisez le lien ci-dessous.

Encore merci et à bientôt.", mailThankGodfatherSubject: "Merci !", mailThankGodfatherLinkTxt: "Me connecter à mon compte.", mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", mailThankGodfatherBodyHTML: "

Bonjour USER_NAME,

Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

Merci et à bientôt !

", badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", alreadyConnected: "Vous êtes déjà connecté(e) au site !", needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", connectionOk: "Connexion réussie.", needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", badPassword: "Le mot de passe n'est pas le bon.", mailLoginLinkSubject: "Votre lien de connexion.", mailLoginLinkTxt: "Me connecter.", mailLoginLinkBodyTxt: "Bonjour USER_NAME,\n\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", mailLoginLinkBodyHTML: "

Bonjour USER_NAME,

Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

", mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", updatedOkMessage: "Vos informations ont bien été mises à jour.", updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas un format correct.", updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", mailUpdateLoginLinkTxt: "Valider.", mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\n\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", mailUpdateLoginBodyHTML: "

Bonjour USER_NAME,

Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder.

", mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", mailDeleteSubject: "Confirmer la suppression de votre compte.", mailDeleteLinkTxt: "Confirmer.", mailDeleteBodyTxt: "Bonjour USER_NAME,\n\nPour confirmer la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", mailDeleteBodyHTML: "

Bonjour USER_NAME,

Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder.

", mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", deleteOkMessage: "L'utilisateur a bien été supprimé.", deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", welcomeMessage: "Bienvenue #NAME !", byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !", infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.", infosAdminGodfather: "Cet utilisateur a été parrainé par ", infosAdminNbGodChilds: "Ses #NB filleuils : " }; /***/ }), /***/ "../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.
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.
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.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", 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é.
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.

Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

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 ? :-)

Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
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.

Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", 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 = { headLinks: [{ anchor: "Contact", attributes: { href: "/contact.html", rel: "nofollow" } }, { anchor: "Parcourir", attributes: { href: "/quizs/", id: "indexHeadLink", title: "Les derniers quizs" } }, { anchor: "Mon compte", attributes: { href: "/connexion.html", id: "accountHeadLink" } }, { anchor: "À propos", attributes: { href: "/a-propos.html" } }], footLinks: [{ anchor: "Blog", attributes: { href: "https://framasphere.org/people/7e54b7a0b53201389eef2a0000053625", title: "Blog WikiLerni sur diaspora*" } }, { 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: "CGV & CGU", attributes: { href: "/CGV-CGU.html", rel: "nofollow" } }], maxQuestionnairesSiteHomePage: 3, maxQuestionnairesByPage: 9, nbQuestionnairesUserHomePage: 3, userHomePage: "accueil.html", adminHomePage: "admin.html", managerHomePage: "gestion.html", subscribePage: "inscription.html", connectionPage: "connexion.html", validationLinkPage: "validation.html?t=", loginLinkPage: "login.html?t=", newLoginLinkPage: "newlogin.html?t=", deleteLinkPage: "aurevoir.html?t=", stopMailPage: "stop-mail.html?t=", accountPage: "compte.html", updateAccountPage: "mon-compte.html", questionnairesManagementPage: "gestion-quizs.html", usersManagementPage: "gestion-utilisateurs.html", aboutPage: "a-propos.html", illustrationDir: "/img/quizs/", siteSlogan: "Cultivons notre jardin !", homePageTxt: "Page d'accueil", homeTitle1: "De nature curieuse ?", homeP1: "Avec WikiLerni, vous apprenez chaque jour de nouvelles choses.
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.
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.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", homeBtnAboutTxt: "En savoir plus sur WikiLerni !", homeBtnSubscribeTxt: "Tester WikiLerni gratuitement.", 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é.
Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C'est toujours le contenu de l'article Wikipédia qui fait foi concernant les \"bonnes\" réponses. Mais les articles de Wikipédia peuvent évoluer, donc n'hésitez pas à me signaler une erreur.

Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

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 ? :-)

Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Grâce à ce compte, vous pourrez aussi recevoir régulièrement de nouveaux quizs pour continuer à \"cultiver votre jardin\".

Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.", newsListTitle: "Les dernières graines de savoir", tagsListTxt: "Parcourir les rubriques", mailRecipientTxt: "Message envoyé à :" }; /***/ }), /***/ "./src/homeUser.js": /*!*************************!*\ !*** ./src/homeUser.js ***! \*************************/ /*! no exports provided */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); /* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); /* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); /* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); /* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js"); /* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); /* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } // -- PAGE D'ACCUEIL DE L'UTILISATEUR /// Vérifier que l'utilisateur est bien connecté, a le bon statut et le rediriger vers le formulaire d'inscription si ce n'est pas le cas. /// Si c'est ok, on récupère ses infos et stats + les derniers quizs auxquels il a accès, mais n'a pas répondu. /// Un moteur de recherche permet d'obtenir d'autres quizs parmi ceux publiés. /// Pour l'affichage des listings de quiz, l'API retourne directement du html. /// Un menu permet à l'utilisateur d'accéder à la modification de ses infos, de son abonnement, etc. /// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement. // Fichier de configuration côté client : var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions utiles au script : // Dictionnaires : var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); var txtAnwers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/answer$")("./" + lang + "/answer"); var txtQuestionnaire = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire"); // Principaux éléments du DOM manipulés : var divMain = document.getElementById("main-content"); var divCrash = document.getElementById("crash"); var divMessage = document.getElementById("message"); var quizTitle = document.getElementById("quizsTitle"); var quizIntro = document.getElementById("quizsIntro"); var quizListing = document.getElementById("quizsList"); var quizPaginationPrevious = document.getElementById("previous"); var quizPaginationNext = document.getElementById("next"); var formSearch = document.getElementById("search"); var inputBegin = document.getElementById("begin"); var btnRandom = document.getElementById("random"); Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); var initialise = /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { var config, isConnected, user, xhrStats, xhrLastQuizs, sendSearch; 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_6__["getConfig"])(); case 3: config = _context.sent; if (config) { _context.next = 8; break; } Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divCrash, "p", txt.serverError, "", ["error"]); _context.next = 12; break; case 8: _context.next = 10; return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])(["user"], "/" + configFrontEnd.connectionPage, { message: txtUsers.needBeConnected, color: "error" }, window.location); case 10: isConnected = _context.sent; if (isConnected) { user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd); Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "h1", txtUsers.welcomeMessage.replace("#NAME", user.name)); divMain.style.display = "block"; if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) { Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false); Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message"); } // Initialisation du formulaire de recherche : Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formSearch); // Les stats : xhrStats = new XMLHttpRequest(); xhrStats.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getStatsAnswers + user.id); xhrStats.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE) { var response = JSON.parse(this.responseText); if (this.status === 200 && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response.nbAnswers) && response.nbAnswers !== 0) // pas de stats si aucune réponse ! { var mapText = { NBANSWERS: response.nbAnswers, NBQUESTIONNAIRES: response.nbQuestionnaires, NBTOTQUESTIONNAIRES: response.general.nbPublished, AVGDURATION: response.avgDuration, AVGCORRECTANSWERS: response.avgCorrectAnswers }; Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["replaceAll"])(txtAnwers.statsUser, mapText), "", "", "", false); } } }; xhrStats.setRequestHeader("Authorization", "Bearer " + user.token); xhrStats.send(); // Par défaut, on affiche des derniers quizs proposés sans réponse : xhrLastQuizs = new XMLHttpRequest(); xhrLastQuizs.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getQuestionnairesWithoutAnswer + "" + user.id + "/" + 0 + "/" + configFrontEnd.nbQuestionnairesUserHomePage + "/html"); xhrLastQuizs.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE) { var response = JSON.parse(this.responseText); if (this.status === 200) { if (response.nbTot === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtAnwers.noQuestionnaireWithoudAnswer, "", ["success"]);else if (response.html) { Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtAnwers.nbQuestionnaireWithoudAnswer.replace("#NB", response.questionnaires.length), "", ["info"]); quizListing.innerHTML = response.html; window.location.hash = ""; // sinon les hash s'enchaînent... window.location.assign("#quizsTitle"); } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]); // revoir si intérêt d'afficher quelque chose } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]); // idem } }; xhrLastQuizs.setRequestHeader("Authorization", "Bearer " + user.token); xhrLastQuizs.send(); // Traitement du lancement d'une recherche // La recherche peut être lancée via la bouton submit ou un lien de pagination sendSearch = function sendSearch() { var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "search"; quizTitle.innerHTML = txtQuestionnaire.searchResultTitle; quizListing.innerHTML = "" + ""; var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formSearch); var xhrSearch = new XMLHttpRequest(); if (type == "search") xhrSearch.open("POST", config.apiUrl + config.questionnaireRoutes + config.searchQuestionnairesRoute);else if (type == "random") xhrSearch.open("POST", config.apiUrl + config.questionnaireRoutes + "/getrandom"); // revoir : changer par la variable getRandomQuestionnairesRoute du fichier de config xhrSearch.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE) { var response = JSON.parse(this.responseText); if (this.status === 200 && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response.nbTot)) { if (response.nbTot === 0) { Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtQuestionnaire.notFound, "", ["info"]); window.location.hash = ""; // sinon les hash s'enchaînent... window.location.assign("#quizsTitle"); } else if (response.html) { Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtQuestionnaire.searchWithResult.replace("#NB", response.nbTot), "", ["success"]); quizListing.innerHTML = response.html; window.location.hash = ""; window.location.assign("#quizsTitle"); // Pagination nécessaire ? // on commence par vider... quizPaginationPrevious.innerHTML = ""; quizPaginationNext.innerHTML = ""; if (response.begin != 0) // peut retourner "0" et non 0 ! { Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizPaginationPrevious, "a", "<< " + txt.previousPage, "previousRes", ["button"], { href: "#search" }); // revoir, les "<<" pourraient être gérées par le CSS var previousPage = document.getElementById("previousRes"); // le retour à la page précédente peut se faire en cliquant sur le bouton ou via l'historique du navigateur var goBackRes = function goBackRes() { var newBegin = response.begin - configFrontEnd.nbQuestionnairesUserHomePage; if (newBegin < 0) // ne devrait pas être possible.. newBegin = 0; document.getElementById("begin").value = newBegin; sendSearch(); window.location.hash = ""; window.location.assign("#quizsTitle"); // pour remonter }; previousPage.addEventListener("click", function (e) { e.preventDefault(); goBackRes(); }); /* semble provoqué bug ??? window.onpopstate = function(e) { e.preventDefault(); goBackRes(); };*/ } if (response.end < response.nbTot - 1) // -1, car tableau commence à 0 ! { Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizPaginationNext, "a", txt.nextPage + " >>", "nextRes", ["button"], { href: "#search" }, false); var nextPage = document.getElementById("nextRes"); nextPage.addEventListener("click", function (e) { e.preventDefault(); document.getElementById("begin").value = response.end + 1; sendSearch(); window.location.hash = ""; // sinon les hash s'enchaînent... window.location.assign("#quizsTitle"); // pour remonter }); } } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]); } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]); } }; xhrSearch.setRequestHeader("Content-Type", "application/json"); xhrSearch.setRequestHeader("Authorization", "Bearer " + user.token); if (datas) { datas.output = "html"; xhrSearch.send(JSON.stringify(datas)); } }; btnRandom.addEventListener("click", function (e) { e.preventDefault(); document.getElementById("begin").value = 0; sendSearch("random"); }); formSearch.addEventListener("submit", function (e) { e.preventDefault(); document.getElementById("begin").value = 0; sendSearch(); }); } case 12: _context.next = 18; break; case 14: _context.prev = 14; _context.t0 = _context["catch"](0); console.error(_context.t0); Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divCrash, "p", txt.serverError, "", ["error"]); case 18: case "end": return _context.stop(); } } }, _callee, null, [[0, 14]]); })); 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/dom.js": /*!**************************!*\ !*** ./src/tools/dom.js ***! \**************************/ /*! exports provided: addElement */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); /* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); /* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } // Fonction associant les attributs fournis à un champ de formulaire var addElement = function addElement(eltParent, eltType) { var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { var newElement = document.createElement(eltType); if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? newElement.id = eltId; if (Array.isArray(eltClass) && eltClass.length != 0) { for (var i in eltClass) { newElement.classList.add(eltClass[i]); } } if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok { for (var attributName in eltAttributes) { newElement.setAttribute(attributName, eltAttributes[attributName]); } } if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. if (replace) eltParent.innerHTML = ""; eltParent.appendChild(newElement); } }; /***/ }), /***/ "./src/tools/everywhere.js": /*!*********************************!*\ !*** ./src/tools/everywhere.js ***! \*********************************/ /*! exports provided: helloDev, updateAccountLink */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); // Ce script fournit des fonctions utilisées sur toutes les pages du site var helloDev = function helloDev() { console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver 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/forms.js": /*!****************************!*\ !*** ./src/tools/forms.js ***! \****************************/ /*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; }); /* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); /* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } // Fonction associant les attributs fournis à un champ de formulaire var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) { for (var i in myForm.elements) { if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) { var idInput = myForm.elements[i].id; if (inputsConf[idInput] !== undefined) { var inputHTML = document.getElementById(idInput); for (var attribute in inputsConf[idInput]) { inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]); } } } } return true; }; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc. var getDatasFromInputs = function getDatasFromInputs(myForm) { var datas = {}; var formData = new FormData(myForm); var _iterator = _createForOfIteratorHelper(formData.entries()), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var entrie = _step.value; datas[entrie[0]] = entrie[1]; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return datas; }; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc. // Revoir pour les select var empyForm = function empyForm(myForm) { var formData = new FormData(myForm); var _iterator2 = _createForOfIteratorHelper(formData.entries()), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var entrie = _step2.value; if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = ""; } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return true; }; // Vide et cache le formulaire var empyAndHideForm = function empyAndHideForm(myForm) { empyForm(myForm); myForm.style.display = "none"; }; /***/ }), /***/ "./src/tools/users.js": /*!****************************!*\ !*** ./src/tools/users.js ***! \****************************/ /*! exports provided: getConfig, 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__, "getConfig", function() { return getConfig; }); /* 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"); // Récupère les données de configuration des utilisateurs // À terme, un fichier statique importable comme module devrait éviter une requête ajax var getConfig = /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: return _context.abrupt("return", new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); xhr.onload = function () { return resolve(JSON.parse(xhr.responseText)); }; xhr.onerror = function () { return reject(xhr.statusText); }; xhr.send(); })); case 1: case "end": return _context.stop(); } } }, _callee); })); return function getConfig() { return _ref.apply(this, arguments); }; }(); 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 _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { var status, urlRedirection, message, urlWanted, _args2 = arguments; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; urlRedirection = _args2.length > 1 ? _args2[1] : undefined; message = _args2.length > 2 ? _args2[2] : undefined; urlWanted = _args2.length > 3 ? _args2[3] : undefined; return _context2.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 _context2.stop(); } } }, _callee2); })); return function checkSession() { return _ref2.apply(this, arguments); }; }(); // Cette fonction sert à la précédente en cas de connexion non valide var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); }; /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9hbnN3ZXIkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvZ2VuZXJhbCQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9xdWVzdGlvbm5haXJlJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2Fuc3dlci5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3F1ZXN0aW9ubmFpcmUuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9ob21lVXNlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvY2xpZW50c3RvcmFnZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZG9tLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9ldmVyeXdoZXJlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9mb3Jtcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRSYW5kb21RdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInJlZ2VuZXJhdGVIVE1MIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwibmJSYW5kb21SZXN1bHRzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4IiwibmVlZE51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkSW50ZWdlck51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkTWluTnVtYmVyVXNlclJlc3BvbnNlcyIsIm5lZWRNYXhOdW1iZXJVc2VyUmVzcG9uc2VzIiwibmVlZE51bWJlckNvcnJlY3RSZXNwb25zZXMiLCJuZWVkSW50ZWdlck51bWJlckNvcnJlY3RSZXNwb25zZXMiLCJuZWVkTWluTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyIsIm5lZWRNYXhOdW1iZXJDb3JyZWN0UmVzcG9uc2VzIiwibmVlZEludGVnZXJOdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIiwibmVlZE1pbk51bWJlclNlY29uZGVzUmVzcG9uc2UiLCJjaGVja1Jlc3BvbnNlc091cHV0RmFpbCIsImNoZWNrUmVzcG9uc2VzT3VwdXRNZWRpdW0iLCJjaGVja1Jlc3BvbnNlc091cHV0U3VjY2VzcyIsIndhbnRUb1NhdmVSZXNwb25zZXMiLCJyZXNwb25zZVNhdmVkTWVzc2FnZSIsInJlc3BvbnNlU2F2ZWRFcnJvciIsIm5vUXVlc3Rpb25uYWlyZVdpdGhvdWRBbnN3ZXIiLCJuYlF1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyIiwic3RhdHNVc2VyIiwicHJldmlvdXNBbnN3ZXJzVGl0bGUiLCJwcmV2aW91c0Fuc3dlcnNTdGF0cyIsInByZXZpb3VzQW5zd2Vyc0xpbmUiLCJub1ByZXZpb3VzQW5zd2VyIiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYWxlcnROZXdXaW5kb3ciLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5lZWRUaXRsZSIsIm5lZWROb3RUb29Mb25nVGl0bGUiLCJuZWVkVXJsIiwibmVlZFVuaXF1ZVVybCIsIm5lZWRJbnRyb2R1Y3Rpb24iLCJuZWVkQ29ycmVjdFB1Ymxpc2hpbmdEYXRlIiwibmVlZEtub3dJZklzUHVibGlzaGVkIiwibmVlZExhbmd1YWdlIiwibmVlZEVzdGltYXRlZFRpbWUiLCJub3RGb3VuZCIsInNlYXJjaFJlc3VsdFRpdGxlIiwic2VhcmNoTm9SZXN1bHQiLCJzZWFyY2hXaXRoUmVzdWx0IiwicXVlc3Rpb25uYWlyZXNOYW1lIiwicHVibGlzaGVkQnkiLCJwdWJsaXNoZWRBdCIsImxhc3RVcGRhdGVkIiwiZXN0aW1hdGVkVGltZSIsImVzdGltYXRlZFRpbWVPcHRpb24iLCJzaG9ydCIsIm1lZGl1bSIsImxvbmciLCJleHBsYW5hdGlvbkJlZm9yZVR4dCIsImNvcnJlY3RBbnN3ZXJUeHQiLCJ3cm9uZ0Fuc3dlclR4dCIsImJ0blNlbmRSZXNwb25zZSIsImJ0blByb3Bvc2VTdWJzY3JpYmUiLCJidG5Qcm9wb3NlQ29ubmVjdGlvbiIsImJ0blNob3dRdWVzdGlvbm5haXJlIiwiYnRuU2hhcmVRdWl6VHh0IiwibmV4dFF1ZXN0aW9ubmFpcmVzTGlzdCIsIm5lZWRCZUNvbXBsZXRlZCIsIm5leHREYXRlV2l0aG91dFF1ZXN0aW9ubmFpcmUiLCJoYXZlQmVlblB1Ymxpc2hlZCIsImhhdmVCZWVuUmVnZW5lcmF0ZWQiLCJuZWVkTmFtZSIsIm5lZWROb3RUb29Mb25nTmFtZSIsIm5lZWRFbWFpbCIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWROb3RUb29Mb25nRW1haWwiLCJuZWVkUGFzc1dvcmQiLCJuZWVkTG9uZ1Bhc3NXb3JkIiwicGFzc3dvcmRDb3BpZWQiLCJuZWVkU3RhdHVzIiwibmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkVGltZURpZmZlcmVuY2UiLCJuZWVkTWluVGltZURpZmZlcmVuY2UiLCJuZWVkTWF4VGltZURpZmZlcmVuY2UiLCJuZWVkVUdDT2siLCJnb2RmYXRoZXJOb3RGb3VuZCIsImdvZGZhdGhlckZvdW5kIiwibWFpbFZhbGlkYXRpb25NZXNzYWdlIiwibWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1R4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJtYWlsV2VsY29tZVN1YmplY3QiLCJtYWlsV2VsY29tZUxpbmtUeHQiLCJtYWlsV2VsY29tZUJvZHlUeHQiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxUaGFua0dvZGZhdGhlckxpbmtUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJlbWFpbE5vdEZvdW5kIiwiYWxyZWFkeUNvbm5lY3RlZCIsIm5lZWRCZUNvbm5lY3RlZCIsImNvbm5lY3Rpb25PayIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsInRvb01hbnlMb2dpbkZhaWxzIiwiYmFkUGFzc3dvcmQiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtUeHQiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5MaW5rVHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUxpbmtUeHQiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwidGFnc0xpc3RUeHQiLCJtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZSIsInZhbGlkYXRpb25MaW5rUGFnZSIsImxvZ2luTGlua1BhZ2UiLCJuZXdMb2dpbkxpbmtQYWdlIiwiZGVsZXRlTGlua1BhZ2UiLCJzdG9wTWFpbFBhZ2UiLCJ1cGRhdGVBY2NvdW50UGFnZSIsImFib3V0UGFnZSIsImhvbWVQYWdlVHh0IiwiaG9tZUJ0bkFib3V0VHh0IiwiaG9tZUJ0blN1YnNjcmliZVR4dCIsIm5ld3NMaXN0VGl0bGUiLCJtYWlsUmVjaXBpZW50VHh0IiwiY29uZmlnRnJvbnRFbmQiLCJ0eHQiLCJ0eHRVc2VycyIsInR4dEFud2VycyIsInR4dFF1ZXN0aW9ubmFpcmUiLCJkaXZNYWluIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImRpdkNyYXNoIiwiZGl2TWVzc2FnZSIsInF1aXpUaXRsZSIsInF1aXpJbnRybyIsInF1aXpMaXN0aW5nIiwicXVpelBhZ2luYXRpb25QcmV2aW91cyIsInF1aXpQYWdpbmF0aW9uTmV4dCIsImZvcm1TZWFyY2giLCJpbnB1dEJlZ2luIiwiYnRuUmFuZG9tIiwiaGVsbG9EZXYiLCJpbml0aWFsaXNlIiwiZ2V0Q29uZmlnIiwiY29uZmlnIiwiYWRkRWxlbWVudCIsImNoZWNrU2Vzc2lvbiIsIm1lc3NhZ2UiLCJjb2xvciIsIndpbmRvdyIsImxvY2F0aW9uIiwiaXNDb25uZWN0ZWQiLCJ1c2VyIiwiZ2V0TG9jYWx5IiwidXBkYXRlQWNjb3VudExpbmsiLCJzdGF0dXMiLCJzdHlsZSIsImRpc3BsYXkiLCJyZW1vdmVMb2NhbHkiLCJzZXRBdHRyaWJ1dGVzVG9JbnB1dHMiLCJ4aHJTdGF0cyIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJuYkFuc3dlcnMiLCJtYXBUZXh0IiwiTkJBTlNXRVJTIiwiTkJRVUVTVElPTk5BSVJFUyIsIm5iUXVlc3Rpb25uYWlyZXMiLCJOQlRPVFFVRVNUSU9OTkFJUkVTIiwiZ2VuZXJhbCIsIm5iUHVibGlzaGVkIiwiQVZHRFVSQVRJT04iLCJhdmdEdXJhdGlvbiIsIkFWR0NPUlJFQ1RBTlNXRVJTIiwiYXZnQ29ycmVjdEFuc3dlcnMiLCJyZXBsYWNlQWxsIiwic2V0UmVxdWVzdEhlYWRlciIsInRva2VuIiwic2VuZCIsInhockxhc3RRdWl6cyIsIm5iVG90IiwiaHRtbCIsImlubmVySFRNTCIsImhhc2giLCJhc3NpZ24iLCJxdWl6cyIsInNlbmRTZWFyY2giLCJ0eXBlIiwiZGF0YXMiLCJnZXREYXRhc0Zyb21JbnB1dHMiLCJ4aHJTZWFyY2giLCJiZWdpbiIsImdvQmFja1JlcyIsIm5ld0JlZ2luIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsImVuZCIsIm91dHB1dCIsInN0cmluZ2lmeSIsImNvbnNvbGUiLCJlcnJvciIsInNhdmVMb2NhbHkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsIkFycmF5IiwiaXNBcnJheSIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsImxvZyIsImNvbmZpZ1RlbXBsYXRlIiwibGluayIsImhvbWVQYWdlIiwiaW5wdXRzQ29uZiIsIm15Rm9ybSIsImVsZW1lbnRzIiwiaWRJbnB1dCIsImlucHV0SFRNTCIsImF0dHJpYnV0ZSIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJlbnRyaWVzIiwiZW50cmllIiwiZW1weUZvcm0iLCJjaGVja2VkIiwiZW1weUFuZEhpZGVGb3JtIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ4aHIiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsImdldFRpbWVEaWZmZXJlbmNlIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJzZXRTZXNzaW9uIiwidXNlcklkIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJjaGVja0Fuc3dlckRhdGFzIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwibm93IiwiaXNWYWxpZCIsImxhbmd1YWdlIiwidGltZURpZmZlcmVuY2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFp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MUIsQ0FBWjtBQUNBM0IsK0JBQU8sQ0FBQyxLQUFELENBQVA7QUFDSDtBQUNKLHFCQWxDRCxNQW9DQTtBQUNJNUYsNEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQXlILGtDQUFZLENBQUNILGNBQUQsRUFBaUJqSSxPQUFqQixFQUEwQmtJLFNBQTFCLENBQVo7QUFDQTNCLDZCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBRSxxQkFBRyxDQUFDRSxPQUFKLEdBQWM7QUFBQSwyQkFBTUgsTUFBTSxDQUFDQyxHQUFHLENBQUNHLFVBQUwsQ0FBWjtBQUFBLG1CQUFkOztBQUNBSCxxQkFBRyxDQUFDbkUsSUFBSjtBQUNIO0FBQ0o7QUFDSixhQXRFTSxDQUZpQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFIOztBQUFBLGtCQUFadkMsWUFBWTtBQUFBO0FBQUE7QUFBQSxHQUFsQixDLENBMEVQOztBQUNBLElBQU1xSSxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDSCxjQUFELEVBQWlCakksT0FBakIsRUFBMEJrSSxTQUExQixFQUNyQjtBQUNJLE1BQUcsQ0FBQzlOLDJEQUFPLENBQUM0RixPQUFELENBQVgsRUFDSThELG9FQUFVLENBQUMsU0FBRCxFQUFZOUQsT0FBWixDQUFWO0FBQ0osTUFBRyxDQUFDNUYsMkRBQU8sQ0FBQzhOLFNBQUQsQ0FBWCxFQUNJcEUsb0VBQVUsQ0FBQyxLQUFELEVBQVFvRSxTQUFSLENBQVY7QUFDSixNQUFHLENBQUM5TiwyREFBTyxDQUFDNk4sY0FBRCxDQUFYLEVBQ0kvSCxNQUFNLENBQUNDLFFBQVAsQ0FBZ0J5QyxNQUFoQixDQUF1QnFGLGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvaG9tZVVzZXIuYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaG9tZVVzZXIuanNcIik7XG4iLCJjb25zdCB1c2VycyA9IHJlcXVpcmUoXCIuL3VzZXJzXCIpO1xuY29uc3QgcXVlc3Rpb25uYWlyZXMgPSByZXF1aXJlKFwiLi9xdWVzdGlvbm5haXJlc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgc2l0ZVVybDogXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIixcbiAgICBhZG1pbk5hbWU6IFwiRmFicmljZVwiLFxuICAgIGFkbWluRW1haWw6IFwiZGV2QHdpa2lsZXJuaS5jb21cIixcbiAgICBzZW5kZXJOYW1lOiBcIldpa2lMZXJuaSAobG9jYWwpXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwid2lraWxlcm5pXCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmkgKGxvY2FsKVwiLFxuICAgIGJlZ2luQ29kZUdvZGZhdGhlcjogXCJXTFwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMiwgLy8gaWYgMCA9IG5vdCBtYXhpbXVtXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYk5ld1F1ZXN0aW9ubmFpcmVzOiAxMCwvLyBmb3IgUlNTLCBldGMuXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW46MSwgLy8gaW4gdXNlciBsb2NhbCB0aW1lXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kOjI0LCAvLyBpZGVtXG4gICAgbnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWU6IDUwLCAvLyBmb3IgbWFzcyBtYWlsaW5nXG4gICAgbWluU2VhcmNoUXVlc3Rpb25uYWlyZXM6IDMsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDAsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNDAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAxLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIG5iUXVlc3Rpb25zTWluOiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01pbixcbiAgICBuYlF1ZXN0aW9uc01heDogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNYXgsXG4gICAgbmJDaG9pY2VzTWF4OiBxdWVzdGlvbm5haXJlcy5uYkNob2ljZXNNYXgsXG4gICAgcGFzc3dvcmRNaW5MZW5ndGg6IHVzZXJzLnBhc3N3b3JkLm1pbmxlbmd0aCxcbiAgICBkaXJDYWNoZVVzZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzQW5zd2VycyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ucyxcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlySFRNTFF1ZXN0aW9ubmFpcmUsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlyV2ViUXVlc3Rpb25uYWlyZVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57ICAgIFxuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBxdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWVzdGlvbm5haXJlXCIsXG4gICAgZ2V0UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvZ2V0XCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHNhdmVBbnN3ZXJzUm91dGU6IFwiL2Fuc3dlci9cIixcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIGdldFJhbmRvbVF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9nZXRyYW5kb21cIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgcmVnZW5lcmF0ZUhUTUw6IFwiL2h0bWxyZWdlbmVyYXRlZFwiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLC8vIGlkZW1cbiAgICBuYlJhbmRvbVJlc3VsdHMgOiAzLy8gbGltaXRlIGxlcyByw6lzdWx0YXQgZHUgbW90ZXVyIGRlIHJlY2hlcmNoZSBxdWFuZCBkZW1hbmRlIGRlIHLDqXN1bHRhdHMgYXUgaGFzYXJkXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIHN1YnNjcmliZVJvdXRlOiBcIi9zaWdudXBcIixcbiAgICBnZXRHb2RmYXRoZXJSb3V0ZTogXCIvZ2V0Z29kZmF0aGVyaWRcIixcbiAgICBjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZTogXCIvaXNlbWFpbGZyZWVcIixcbiAgICBjaGVja1N1YnNjcmliZVRva2VuUm91dGU6IFwiL3ZhbGlkYXRpb24vXCIsXG4gICAgY2hlY2tMb2dpblJvdXRlOiBcIi9jaGVja2xvZ2luL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBnZXRMb2dpbkxpbmtSb3V0ZTogXCIvZ2V0bG9naW5saW5rXCIsXG4gICAgY29ubmVjdGlvbldpdGhMaW5rUm91dGU6IFwiL2NoZWNrbG9naW5saW5rXCIsXG4gICAgZ2V0VXNlckluZm9zOiBcIi9nZXQvXCIsXG4gICAgY3JlYXRlVXNlclJvdXRlOiBcIi9jcmVhdGVcIixcbiAgICB2YWxpZGF0ZVVzZXJSb3V0ZTogXCIvdmFsaWRhdGUvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgc2VhcmNoVXNlclJvdXRlOiBcIi9zZWFyY2gvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsXG4gICAgY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZTogXCIvY29uZmlybW5ld2xvZ2luL1wiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLFxuICAgIGdldFBheW1lbnRzOiBcIi9wYXltZW50L2dldGZvcm9uZXVzZXIvXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRpbWVEaWZmZXJlbmNlTWluOiAtNzIwLFxuICAgIHRpbWVEaWZmZXJlbmNlTWF4Ojg0MCxcbiAgICAvLyBKU09OIGRpclxuICAgIGRpckNhY2hlVXNlcnMgOiBcImRhdGFzL3VzZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL2Fuc3dlcnNcIlxufTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9hbnN3ZXJcIjogXCIuLi9sYW5nL2ZyL2Fuc3dlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2Fuc3dlciRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvZ2VuZXJhbFwiOiBcIi4uL2xhbmcvZnIvZ2VuZXJhbC5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2dlbmVyYWwkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3F1ZXN0aW9ubmFpcmVcIjogXCIuLi9sYW5nL2ZyL3F1ZXN0aW9ubmFpcmUuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9xdWVzdGlvbm5haXJlJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbmVlZE51bWJlclVzZXJSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSBxdWVzdGlvbnMgYXV4cXVlbGxlcyBsJ3V0aWxpc2F0ZXVyIGEgcsOpcG9uZHUgZG9pdCDDqnRyZSBmb3VybmkuXCIsXG4gICAgbmVlZEludGVnZXJOdW1iZXJVc2VyUmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcXVlc3Rpb25zIGF1eHF1ZWxsZXMgbCd1dGlsaXNhdGV1ciBhIHLDqXBvbmR1IGRvaXQgw6p0cmUgdW4gbm9tYnJlIGVudGllci5cIixcbiAgICBuZWVkTWluTnVtYmVyVXNlclJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHF1ZXN0aW9ucyBhdXhxdWVsbGVzIGwndXRpbGlzYXRldXIgYSByw6lwb25kdSBuZSBwZXV0IMOqdHJlIGluZsOpcmlldXIgw6AgMS5cIixcbiAgICBuZWVkTWF4TnVtYmVyVXNlclJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHF1ZXN0aW9ucyBhdXhxdWVsbGVzIGwndXRpbGlzYXRldXIgYSByw6lwb25kdSBuZSBwZXV0IMOqdHJlIGF1c3NpIMOpbGV2w6kuXCIsXG4gICAgbmVlZE51bWJlckNvcnJlY3RSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSByw6lwb25zZXMgY29ycmVjdGVzIGRvaXQgw6p0cmUgZm91cm5pLlwiLFxuICAgIG5lZWRJbnRlZ2VyTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHLDqXBvbnNlcyBjb3JyZWN0ZXMgZG9pdCDDqnRyZSB1biBub21icmUgZW50aWVyLlwiLFxuICAgIG5lZWRNaW5OdW1iZXJDb3JyZWN0UmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcsOpcG9uc2VzIGNvcnJlY3RlcyBuZSBwZXV0IMOqdHJlIG7DqWdhdGlmLlwiLFxuICAgIG5lZWRNYXhOdW1iZXJDb3JyZWN0UmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcsOpcG9uc2VzIGNvcnJlY3RlcyBuZSBwZXV0IMOqdHJlIHN1cMOpcmlldXIgYXUgbm9tYnJlIGRlIHF1ZXN0aW9ucy5cIixcbiAgICBuZWVkSW50ZWdlck51bWJlclNlY29uZGVzUmVzcG9uc2UgOiBcIkxhIGR1csOpZSBkZSBsYSByw6lwb25zZSBkb2l0IMOqdHJlIHVuIG5vbWJyZSBlbnRpZXIgZGUgc2Vjb25kZXMuXCIsXG4gICAgbmVlZE1pbk51bWJlclNlY29uZGVzUmVzcG9uc2UgOiBcIkxhIGR1csOpZSBkZSBsYSByw6lwb25zZSBuZSBwZXV0IMOqdHJlIG7DqWdhdGl2ZS5cIixcbiAgICBjaGVja1Jlc3BvbnNlc091cHV0RmFpbCA6IFwiVm91cyBhdmV6IHLDqXBvbmR1IGVuIERVUkFUSU9OIHNlY29uZGVzIGV0IGF2ZXogTkJDT1JSRUNUQU5TV0VSUyBib25uZShzKSByw6lwb25zZShzKSBzdXIgTkJRVUVTVElPTlMgcXVlc3Rpb25zLiBDJ2VzdCBjZXJ0YWluLCB2b3VzIGZlcmV6IG1pZXV4IGxhIHByb2NoYWluZSBmb2lzICFcIixcbiAgICBjaGVja1Jlc3BvbnNlc091cHV0TWVkaXVtIDogXCJWb3VzIGF2ZXogcsOpcG9uZHUgZW4gRFVSQVRJT04gc2Vjb25kZXMgZXQgYXZleiBOQkNPUlJFQ1RBTlNXRVJTIGJvbm5lKHMpIHLDqXBvbnNlKHMpIHN1ciBOQlFVRVNUSU9OUyBxdWVzdGlvbnMuIEMnZXN0IHBhcyBtYWwgZHUgdG91dCAhXCIsXG4gICAgY2hlY2tSZXNwb25zZXNPdXB1dFN1Y2Nlc3MgOiBcIlZvdXMgYXZleiByw6lwb25kdSBlbiBEVVJBVElPTiBzZWNvbmRlcyBldCBhdmV6IE5CQ09SUkVDVEFOU1dFUlMgYm9ubmUocykgcsOpcG9uc2Uocykgc3VyIE5CUVVFU1RJT05TIHF1ZXN0aW9ucy4gQnJhdm8gISBSaWVuIG5lIHZvdXMgw6ljaGFwcGUgIVwiLFxuICAgIHdhbnRUb1NhdmVSZXNwb25zZXM6IFwiU2kgdm91cyBsZSBzb3VoYWl0ZXosIHZvdXMgcG91dmV6IHNhdXZlZ2FyZGVyIHZvdHJlIHLDqXN1bHRhdCBlbiB2b3VzIGNvbm5lY3RhbnQgw6Agdm90cmUgY29tcHRlLlwiLFxuICAgIHJlc3BvbnNlU2F2ZWRNZXNzYWdlIDogXCJWb3RyZSByw6lzdWx0YXQgYSDDqXTDqSBlbnJlZ2lzdHLDqS4gPGEgaHJlZj0nLyNVUkwnPkFjY8OoZGVyIMOgIHRvdXMgdm9zIHF1aXpzPC9hPi5cIixcbiAgICByZXNwb25zZVNhdmVkRXJyb3IgOiBcIkNlcGVuZGFudCB1bmUgZXJyZXVyIGEgw6l0w6kgcmVuY29udHLDqWUgZHVyYW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgdm90cmUgcsOpc3VsdGF0LiA8YSBocmVmPScvI1VSTCc+QWNjw6hkZXIgw6AgdG91cyB2b3MgcXVpenM8L2E+LlwiLFxuICAgIG5vUXVlc3Rpb25uYWlyZVdpdGhvdWRBbnN3ZXI6IFwiQnJhdm8gISBWb3VzIGF2ZXogcsOpcG9uZHUgw6AgdG91cyBsZXMgcXVpenMgcXVpIHZvdXMgb24gw6l0w6kgcHJvcG9zw6lzICE8YnI+SWwgeSBlbiBhIGRlcyBub3V2ZWF1eCBwdWJsacOpcyByw6lndWxpw6hyZW1lbnQgZXQgcXVpIHZvdXMgc2Vyb250IHByb3Bvc8Opcy48YnI+RW4gYXR0ZW5kYW50IHZvdXMgcG91dmV6IHBldXQtw6p0cmUgZXNzYXllciBkZSByw6lwb25kcmUgZGUgbm91dmVhdSDDoCBjZXJ0YWluIHF1aXogcG91ciB2b2lyIHNpIHZvdXMgdm91cyBzb3V2ZW5leiBkZXMgYm9ubmVzIHLDqXBvbnNlcyA/XCIsXG4gICAgbmJRdWVzdGlvbm5haXJlV2l0aG91ZEFuc3dlcjogXCJJbCB5IGEgI05CIHF1aXpzIHF1aSB2b3VzIG9udCDDqXTDqSBwcm9wb3PDqXMgZXQgYXV4cXVlbHMgdm91cyBuJ2F2ZXogcGFzIHLDqXBvbmR1LiBWb2ljaSBsZXMgZGVybmllcnMgOiFcIixcbiAgICBzdGF0c1VzZXI6IFwiVm91cyBhdmV6IGVucmVnaXN0csOpIE5CQU5TV0VSUyByw6lwb25zZXMgw6AgPGI+TkJRVUVTVElPTk5BSVJFUyBxdWVzdGlvbm5haXJlcyBkaWZmw6lyZW50czwvYj4gc3VyIGxlcyBOQlRPVFFVRVNUSU9OTkFJUkVTIHByb3Bvc8OpcyBwYXIgbGUgc2l0ZS48YnI+RW4gbW95ZW5uZSwgdm91cyBhdmV6IG1pcyBBVkdEVVJBVElPTiBzZWNvbmRlcyDDoCByw6lwb25kcmUgZXQgYXZleiA8Yj5jb3JyZWN0ZW1lbnQgcsOpcG9uZHUgw6AgQVZHQ09SUkVDVEFOU1dFUlMgJSBkZXMgcXVlc3Rpb25zPC9iPi5cIixcbiAgICBwcmV2aW91c0Fuc3dlcnNUaXRsZTogXCJCb25qb3VyICNOT00sIHZvaWNpIHZvcyBwcsOpY8OpZGVudHMgcsOpc3VsdGF0cyDDoCBjZSBxdWl6XCIsXG4gICAgcHJldmlvdXNBbnN3ZXJzU3RhdHM6IFwiRW4gbW95ZW5uZSwgdm91cyBhdmV6IHLDqXBvbmR1IMOgIGNlIHF1aXogZW4gQVZHRFVSQVRJT04gc2Vjb25kZXMsIGVuIGF5YW50IDxiPkFWR0NPUlJFQ1RBTlNXRVJTICUgZGUgYm9ubmVzIHLDqXBvbnNlczwvYj4uXCIsXG4gICAgcHJldmlvdXNBbnN3ZXJzTGluZTogXCJMZSBEQVRFQU5TV0VSLCB2b3VzIGF2ZXogcsOpcG9uZHUgY29ycmVjdGVtZW50IMOgIE5CQ09SUkVDVEFOU1dFUlMgcXVlc3Rpb25zIGVuIEFWR0RVUkFUSU9OIHNlY29uZGVzLlwiLFxuICAgIG5vUHJldmlvdXNBbnN3ZXI6IFwiT24gZGlyYWl0IHF1ZSBjJ2VzdCBsYSBwcmVtacOocmUgZm9pcyBxdWUgdm91cyByw6lwb25kZXogw6AgY2UgcXVpei4gQm9ubmUgbGVjdHVyZSAhXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogV2lraXDDqWRpYSBlbiBxdWVzdGlvbnNcIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJBdmVjIFdpa2lMZXJuaSwgcmVjZXZleiBjaGFxdWUgam91ciBkZSBub3V2ZWF1eCBxdWl6cyBwb3VyIHRlc3RlciB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3Nlcy5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGFsZXJ0TmV3V2luZG93OiBcIm5vdXZlbGxlIGZlbsOqdHJlXCIsXG4gICAgYnRuTGlua1RvUXVlc3Rpb25uYWlyZSA6IFwiQWxsZXIgYXUgcXVpeiAhXCIsXG4gICAgc3RhdHNBZG1pbiA6IFwiRHVyYW50IGxlcyBkZXJuacOocmVzIDI0aCA6IE5CX1VTRVJTXzI0SCBjb21wdGVzIG9udCDDqXTDqSBjcsOpw6lzLCBOQl9TVUJTQ1JJUFRJT05TXzI0SCB2YWxpZMOpcyBldCBOQl9VU0VSU19ERUxFVEVEXzI0SCBzdXBwcmltw6lzLiBOQl9BTlNXRVJTXzI0SCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5FbiB0b3V0LCBpbCB5IGEgOiBOQl9VU0VSU19UT1QgY29tcHRlcywgZG9udCBOQl9TVUJTQ1JJUFRJT05TX1RPVCB2YWxpZMOpcyBldCBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gY29tcHRlcyBwcsOpbWl1bS4gTkJfQU5TV0VSU19UT1QgcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+UGFybWkgbGVzIE5CX1VTRVJTX0RFTEVURURfVE9UIGNvbXB0ZXMgc3VwcHJpbcOpcywgTkJfVVNFUlNfREVMRVRFRF9WQUxJREVEIGF2YWllbnQgdmFsaWTDqSBsZXVyIGNvbXB0ZSBldCBOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0gYXZhaWVudCBzb3VzY3JpdCB1biBjb21wdGUgcHLDqW1pdW0uXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5lZWRUaXRsZTogXCJNZXJjaSBkZSBmb3VybmlyIHVuIHRpdHJlIMOgIHZvdHJlIHF1aXouXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdUaXRsZTogXCJMZSB0aXRyZSBkdSBxdWl6IG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFVybDogXCJNZXJjaSBkZSBmb3VybmlyIGwndXJsIMOgIHZvdHJlIHF1aXouXCIsXG4gICAgbmVlZFVuaXF1ZVVybDogXCJMJ3VybCBkdSBxdWl6IGRvaXQgw6p0cmUgdW5pcXVlLlwiLFxuICAgIG5lZWRJbnRyb2R1Y3Rpb246IFwiTWVyY2kgZGUgZm91cm5pciB1biB0ZXh0ZSBkJ2ludHJvZHVjdGlvbiDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWRDb3JyZWN0UHVibGlzaGluZ0RhdGU6IFwiTGEgZGF0ZSBkZSBwdWJsaWNhdGlvbiBmb3VybmllIG4nYSBwYXMgdW4gZm9ybWF0IHZhbGlkZS5cIixcbiAgICBuZWVkS25vd0lmSXNQdWJsaXNoZWQ6IFwiSWwgZmF1dCBzYXZvaXIgc2kgY2UgcXVpeiBlc3QgcHVibGnDqS5cIixcbiAgICBuZWVkTGFuZ3VhZ2U6IFwiVm91cyBkZXZleiBzw6lsZWN0aW9ubmVyIGxhIGxhbmd1ZSBkZSBjZSBxdWl6LlwiLFxuICAgIG5lZWRFc3RpbWF0ZWRUaW1lOiBcIk1lcmNpIGRlIHPDqWxlY3Rpb25uZXIgdW5lIGVzdGltYXRpb24gZGUgbGEgZHVyw6llIGRlIGNlIHF1aXouXCIsXG4gICAgbm90Rm91bmQgOiBcIkF1Y3VuIHF1aXogbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIHNlYXJjaFJlc3VsdFRpdGxlIDogXCJSw6lzdWx0YXQgcG91ciB2b3RyZSByZWNoZXJjaGVcIixcbiAgICBzZWFyY2hOb1Jlc3VsdCA6IFwiQXVjdW4gcsOpc3VsdGF0IG4nYSDDqXTDqSB0cm91dsOpIHBvdXIgdm90cmUgcmVjaGVyY2hlXCIsXG4gICAgc2VhcmNoV2l0aFJlc3VsdCA6IFwiVm9pY2kgI05CIHF1aXpzIHBvdXIgdm90cmUgcmVjaGVyY2hlIDpcIixcbiAgICBxdWVzdGlvbm5haXJlc05hbWU6IFwicXVpelwiLFxuICAgIHB1Ymxpc2hlZEJ5OiBcIlF1aXogcHVibGnDqSBwYXJcIixcbiAgICBwdWJsaXNoZWRBdDogXCIsIGxlXCIsXG4gICAgbGFzdFVwZGF0ZWQ6IFwiRGVybmnDqHJlIG1pc2Ugw6Agam91ciwgbGUgXCIsXG4gICAgZXN0aW1hdGVkVGltZTogXCJEdXLDqWUgZGUgbGVjdHVyZSBlc3RpbcOpZSA6IFwiLFxuICAgIGVzdGltYXRlZFRpbWVPcHRpb24gOlxuICAgIHtcbiAgICAgICAgc2hvcnQ6IFwiY291cnRlXCIsXG4gICAgICAgIG1lZGl1bTogXCJtb3llbm5lXCIsXG4gICAgICAgIGxvbmc6IFwibG9uZ3VlXCJcbiAgICB9LFxuICAgIGV4cGxhbmF0aW9uQmVmb3JlVHh0OiBcIkV4dHJhaXQgOlwiLFxuICAgIGNvcnJlY3RBbnN3ZXJUeHQ6IFwiQm9ubmUgcsOpcG9uc2VcIixcbiAgICB3cm9uZ0Fuc3dlclR4dDogXCJNYXV2YWlzZSByw6lwb25zZVwiLFxuICAgIGJ0blNlbmRSZXNwb25zZTogXCJUZXN0ZXogdm9zIHLDqXBvbnNlcy5cIixcbiAgICBidG5Qcm9wb3NlU3Vic2NyaWJlOiBcIkplIGNyw6llIG1vbiBjb21wdGUuXCIsXG4gICAgYnRuUHJvcG9zZUNvbm5lY3Rpb246IFwiSmUgbWUgY29ubmVjdGUuXCIsXG4gICAgYnRuU2hvd1F1ZXN0aW9ubmFpcmU6IFwiQWZmaWNoZXIgbGUgcXVpeiAhXCIsXG4gICAgYnRuU2hhcmVRdWl6VHh0OiBcIlBhcnRhZ2VyIGNlIHF1aXogc3VyIFwiLFxuICAgIG5leHRRdWVzdGlvbm5haXJlc0xpc3Q6IFwiTGVzICNOQiBwcm9jaGFpbnMgcXVpenMgZGV2YW50IMOqdHJlIHB1Ymxpw6lzXCIsXG4gICAgbmVlZEJlQ29tcGxldGVkOiBcIlF1aXogaW5jb21wbGV0XCIsXG4gICAgbmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZTogXCJQcm9jaGFpbmUgZGF0ZSBzYW5zIHF1aXogcHJvZ3JhbW3DqSA6IFwiLFxuICAgIGhhdmVCZWVuUHVibGlzaGVkIDogXCI6TkIgbm91dmVhdXggcXVlc3Rpb25uYWlyZXMgb250IMOpdMOpIHB1Ymxpw6lzLlwiLFxuICAgIGhhdmVCZWVuUmVnZW5lcmF0ZWQgOiBcIkxlcyBmaWNoaWVycyBIVE1MIGRlICNOQjEgcXVlc3Rpb25uYWlyZXMgZXQgI05CMiBydWJyaXF1ZXMgb250IMOpdMOpIHJlZ8OpbsOpcsOpcy5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbm90Rm91bmQ6IFwiTCd1dGlsaXNhdGV1ciBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZE5hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ci5cIixcbiAgICBuZWVkTm90VG9vTG9uZ05hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ciBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSA3MCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIG5lZWRVbmlxdWVFbWFpbDogXCJMJ2FkcmVzc2UgZS1tYWlsIHF1ZSB2b3VzIGF2ZXogc2Fpc2llIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBhciB1biBhdXRyZSB1dGlsaXNhdGV1ci4gU2kgdm91cyBhdmV6IGTDqWrDoCB1biBjb21wdGUsIDxhIGhyZWY9Jy8jVVJMJz5jbGlxdWV6LWljaSBwb3VyIHZvdXMgY29ubmVjdGVyPC9hPi5cIixcbiAgICBuZWVkTm90VG9vTG9uZ0VtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB1bmUgYWRyZXNzZSBlLW1haWwgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UuXCIsXG4gICAgbmVlZExvbmdQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UgZCdhdSBtb2lucyBNSU5fTEVOR1RIIGNhcmFjdMOocmVzLlwiLFxuICAgIHBhc3N3b3JkQ29waWVkOiBcIkxlIG1vdCBkZSBwYXNzZSBnw6luw6lyw6kgYSDDqXTDqSBjb3Bpw6kgZGFucyB2b3RyZSBwcmVzc2UtcGFwaWVyLiBWb3VzIHBvdXZleiBsZSByZWNvcGllciAoQ3RybCtWKSBvw7kgdm91cyBsZSBzb3VoYWl0ZXouXCIsXG4gICAgbmVlZFN0YXR1cyA6IFwiSWwgbWFucXVlIGxlIHN0YXR1dC5cIixcbiAgICBuZWVkTGFuZ3VhZ2UgOiBcIklsIG1hbnF1ZSBsZSBjb2RlIGxhbmd1ZS5cIixcbiAgICBuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUgOiBcIkxhIGRhdGUgZGUgZGVybmnDqHJlIGNvbm5leGlvbiBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgIG5lZWRTTVRQIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRTTVRQTm90Rm91bmQgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZEtub3dOZXdzbGV0dGVyT2sgOiBcIklsIGZhdXQgc2F2b2lyIHNpIGwndXRpbGlzYXRldXIgYWNjZXB0ZSBvdSByZWZ1c2UgZGUgcmVjZXZvaXIgbGEgbmV3c2xldHRlci5cIixcbiAgICBuZWVkVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgY29ubmHDrnRyZSBsZSBub21icmUgZGUgbWludXRlcyBkdSBkw6ljYWxhZ2UgaG9yYWlyZS5cIixcbiAgICBuZWVkTWluVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBlbmxldmVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDcyMC5cIixcbiAgICBuZWVkTWF4VGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBham91dGVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDg0MC5cIixcbiAgICBuZWVkVUdDT2sgOiBcIlZvdXMgZGV2ZXogYWNjZXB0ZXIgbGVzIENHVSBwb3VyIHBvdXZvaXIgY3LDqWVyIHZvdHJlIGNvbXB0ZS4gXCIsXG4gICAgZ29kZmF0aGVyTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgbidhIMOpdMOpIHRyb3V2w6kgcG91ciBjZSBjb2RlIHBhcnJhaW4uXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgcGFycmFpbiBhIGJpZW4gw6l0w6kgdHJvdXbDqSAhXCIsXG4gICAgbWFpbFZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGluc2NyaXB0aW9uIGVzdCBiaWVuIGVucmVnaXN0csOpZS5cXG5Qb3VyIGxhIGZpbmFsaXNlciwgbWVyY2kgZGUgY2xpcXVlciBkYW5zIGxlcyAyNEggc3VyIGxlIGxpZW4gZGUgY29uZmlybWF0aW9uIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rVHh0IDogXCJWYWxpZGVyIG1vbiBjb21wdGUuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aCA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIGRhbnMgbGVzIDI0aC48L3A+XCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgY29tcHRlIHZpZW50IGJpZW4gZCfDqnRyZSB2YWxpZMOpLiBNZXJjaSBldCBiaWVudmVudWUgITxicj5Wb3VzIHBvdXZleiBzYW5zIHRhcmRlciB2b3VzIGNvbm5lY3RlciBjaS1kZXNzb3VzIHBvdXIgYWNjw6lkZXIgw6Agdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlQWRtaW46IFwiTGUgY29tcHRlIGEgYmllbiDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW46IFwiQ2UgY29tcHRlIGEgZMOpasOgIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgbWFpbFdlbGNvbWVTdWJqZWN0IDogXCJCaWVudmVudWUgIVwiLFxuICAgIG1haWxXZWxjb21lTGlua1R4dCA6IFwiTWUgY29ubmVjdGVyIMOgIG1vbiBjb21wdGUuXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Wb3VzIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuIE1lcmNpIGV0IGJpZW52ZW51ZSAhXFxuXFxuU2kgdm91cyBhdmV6IGxhIG1vaW5kcmUgcXVlc3Rpb24gb3Ugc3VnZ2VzdGlvbiBjb25jZXJuYW50IE5PTV9TSVRFLCBuJ2jDqXNpdGV6IHBhcyDDoCBtZSBjb250YWN0ZXIgZW4gw6ljcml2YW50IMOgIEVNQUlMLlxcblxcbkplIHZvdXMgY29uc2VpbGxlIGQnYWlsbGV1cnMgZCdham91dGVyIEVNQUlMIMOgIHZvdHJlIGNhcm5ldCBkJ2FkcmVzc2VzIHBvdXIgw6l2aXRlciBxdWUgbGVzIHByb2NoYWlucyBlbnZvaXMgZHUgc2l0ZSBuJ2Fycml2ZW50IGVuIFxcXCJzcGFtXFxcIi5cXG5cXG5QYXIgYWlsbGV1cnMsIHBvdXIgZ8OpcmVyIHZvdHJlIGFib25uZW1lbnQsIGFjY8OpZGVyIMOgIHZvcyBpbmZvcm1hdGlvbnMgb3UgZW5jb3JlIGNoZXJjaGVyIHBsdXMgZmFjaWxlbWVudCBwYXJtaSBsZXMgcXVpenMgZHUgc2l0ZSwgdm91cyBwb3V2ZXogw6AgdG91dCBtb21lbnQgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlIHV0aWxpc2F0ZXVyLlxcblxcblBvdXIgY2UgZmFpcmUsIHV0aWxpc2V6IGxlIGxpZW4gc3VpdmFudCA6IExJTktfVVJMXFxuXFxuRW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0LlwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdXMgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+PGJyPlNpIHZvdXMgYXZleiBsYSBtb2luZHJlIHF1ZXN0aW9uIG91IHN1Z2dlc3Rpb24gY29uY2VybmFudCBOT01fU0lURSwgbidow6lzaXRleiBwYXMgw6AgbWUgY29udGFjdGVyIGVuIMOpY3JpdmFudCDDoCA8Yj5FTUFJTDwvYj4uPGJyPjxicj5KZSB2b3VzIGNvbnNlaWxsZSBkJ2FpbGxldXJzIGQnYWpvdXRlciA8Yj5FTUFJTDwvYj4gw6Agdm90cmUgY2FybmV0IGQnYWRyZXNzZXMgcG91ciDDqXZpdGVyIHF1ZSBsZXMgcHJvY2hhaW5zIGVudm9pcyBkdSBzaXRlIG4nYXJyaXZlbnQgZW4gPGk+c3BhbTwvaT4uPGJyPjxicj5QYXIgYWlsbGV1cnMsIHBvdXIgZ8OpcmVyIHZvdHJlIGFib25uZW1lbnQsIGFjY8OpZGVyIMOgIHZvcyBpbmZvcm1hdGlvbnMgb3UgZW5jb3JlIGNoZXJjaGVyIHBsdXMgZmFjaWxlbWVudCBwYXJtaSBsZXMgcXVpenMgZHUgc2l0ZSwgdm91cyBwb3V2ZXogw6AgdG91dCBtb21lbnQgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlIHV0aWxpc2F0ZXVyLjxicj48YnI+UG91ciBjZSBmYWlyZSwgdXRpbGlzZXogbGUgbGllbiBjaS1kZXNzb3VzLjxicj48YnI+RW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0LlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlclN1YmplY3QgOiBcIk1lcmNpICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIgw6AgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIGJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBuZSBzZW1ibGUgcGFzIHZhbGlkZSBvdSBiaWVuIGlsIGEgZXhwaXLDqS4gVm91cyBwb3V2ZXogZW4gcmVjZXZvaXIgdW4gbm91dmVhdSA8YSBocmVmPScjVVJMJz5lbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIGVtYWlsTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdHJvdXbDqSBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIGFscmVhZHlDb25uZWN0ZWQ6IFwiVm91cyDDqnRlcyBkw6lqw6AgY29ubmVjdMOpKGUpIGF1IHNpdGUgIVwiLFxuICAgIG5lZWRCZUNvbm5lY3RlZDogXCJWb3VzIGRldmV6IMOqdHJlIGNvbm5lY3TDqShlKSBwb3VyIGFjY8OpZGVyIMOgIGNldHRlIHBhZ2UuXCIsXG4gICAgY29ubmVjdGlvbk9rOiBcIkNvbm5leGlvbiByw6l1c3NpZS5cIixcbiAgICBuZWVkQ2hvb3NlTG9naW5XYXk6IFwiVm91cyBkZXZleiBzb2l0IHNhaXNpciB2b3RyZSBtb3QgZGUgcGFzc2UsIHNvaXQgY29jaGVyIGxhIGNhc2Ugdm91cyBwZXJtZXR0YW50IGRlIHJlY2V2b2lyIHVuIGxpZW4gZGUgY29ubmV4aW9uIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZFZhbGlkYXRpb25Ub0xvZ2luIDogXCJWb3VzIGRldmV6IGQnYWJvcmQgdmFsaWRlciB2b3RyZSBjb21wdGUgYXZhbnQgZGUgdm91cyBjb25uZWN0ZXIuIFBvdXIgY2UgZmFpcmUsIHVuIGxpZW4gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgdG9vTWFueUxvZ2luRmFpbHMgOiBcIlRyb3AgZGUgdGVudGF0aXZlcyBkZSBjb25uZXhpb24gaW5mcnVjdHVldXNlcyBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLiBWb3VzIGRldmV6IGF0dGVuZHJlIE1JTlVURVMgbWludXRlcyBwb3VyIGVzc2F5ZXIgZGUgbm91dmVhdS5cIixcbiAgICBiYWRQYXNzd29yZDogXCJMZSBtb3QgZGUgcGFzc2Ugbidlc3QgcGFzIGxlIGJvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rU3ViamVjdCA6IFwiVm90cmUgbGllbiBkZSBjb25uZXhpb24uXCIsXG4gICAgbWFpbExvZ2luTGlua1R4dCA6IFwiTWUgY29ubmVjdGVyLlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPlwiLFxuICAgIG1haWxMb2dpbkxpbmtNZXNzYWdlIDogXCJVbiBsaWVuIGRlIGNvbm5leGlvbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLiBOZSB0YXJkZXogcGFzIMOgIGwndXRpbGlzZXIsIGNhciBpbCBuJ2VzdCB2YWxhYmxlIHF1ZSBkdXJhbnQgXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJWb3MgaW5mb3JtYXRpb25zIG9udCBiaWVuIMOpdMOpIG1pc2VzIMOgIGpvdXIuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSBjYXIgZWxsZSBuJ2EgcGFzIHVuIGZvcm1hdCBjb3JyZWN0LlwiLFxuICAgIHVwZGF0ZWROZWVkVW5pcXVlRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgc2Fpc2llIChORVdfRU1BSUwpIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBvdXIgdW4gYXV0cmUgY29tcHRlLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpblN1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cy5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rVHh0IDogXCJWYWxpZGVyLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gY2ktZGVzc291cyBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2U6IFwiQ2VwZW5kYW50LCB2b3VzIGF2ZXogbW9kaWZpw6kgYXUgbW9pbnMgdW4gZGUgdm9zIGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24gKGVtYWlsIGV0L291IG1vdCBkZSBwYXNzZSkgZXQgPGI+dm91cyBkZXZleiBjbGlxdWVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlcyBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIChORVdfRU1BSUwpIHBvdXIgdmFsaWRlciBjZSBjaGFuZ2VtZW50PC9iPi4gRW4gYXR0ZW5kYW50LCBtZXJjaSBkZSBjb250aW51ZXIgw6AgdXRpbGlzZXIgdm9zIGFuY2llbnMgaWRlbnRpZmlhbnRzLlwiLFxuICAgIHVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlcjogXCJMJ3V0aWxpc2F0ZXVyIHF1ZSB2b3VzIHNvdWhhaXTDqSBtb2RpZmllciBuJ2V4aXN0ZSBwYXMvcGx1cyBvdSBuJ2EgcGFzIGVuY29yZSB2YWxpZMOpIHNvbiBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIDogXCJNYWlzIGxlIG5vdXZlYXUgY29kZSBwYXJyYWluIG4nYSBwdSDDqnRyZSByZXRlbnUsIGNhciBpbCBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBvdSDDoCBsJ3V0aWxpc2F0ZXVyIGx1aS1tw6ptZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2U6IFwiTGEgbWlzZSDDoCBqb3VyIGRlIHZvcyBpZGVudGlmaWFudHMgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICB1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQgOiBcIkwnaWRlbnRpZmlhbnQgZm91cm5pIHBvdXIgbGUgcGFycmFpbiBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIHV0aWxpc2F0ZXVyLlwiLFxuICAgIGNyZWF0aW9uT2tNZXNzYWdlOiBcIkxlIG5vdXZlbCB1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6kuXCIsXG4gICAgbWFpbERlbGV0ZVN1YmplY3QgOiBcIkNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtUeHQgOiBcIkNvbmZpcm1lci5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciBjb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIGNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gY2ktZGVzc291cyBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbERlbGV0ZUxpbmtNZXNzYWdlOiBcIlZvdHJlIGRlbWFuZGUgZGUgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS4gTWVyY2kgZGUgY2xpcXVlciBzYW5zIHRhcmRlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwgcG91ciBjb25maXJtZXIuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkwndXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZTogXCJUZW50YXRpdmUgZGUgc3VwcHJlc3Npb24gZCd1biB1dGlsaXNhdGV1ciBpbmV4aXN0YW50IDogXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtPa01lc3NhZ2U6IFwiVm90cmUgY29tcHRlIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuIE1lcmNpIGQnYXZvaXIgdXRpbGlzw6kgbm9zIHNlcnZpY2VzLlwiLFxuICAgIG1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBzdXBwcmVzc2lvbiBuJ2VzdCBwYXMgdmFsaWRlIG91IGFsb3JzIGlsIG4nZXN0IHBsdXMgdmFsYWJsZS5cIixcbiAgICBjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBub24gdmFsaWTDqXMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIGluYWN0aWZzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIHdlbGNvbWVNZXNzYWdlOiBcIkJpZW52ZW51ZSAjTkFNRSAhXCIsXG4gICAgYnllYnllTWVzc2FnZTogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBkw6ljb25uZXhpb24gcydlc3QgYmllbiBkw6lyb3Vsw6llLjxicj7DgCBiaWVudMO0dCAhXCIsXG4gICAgaW5mb3NVc2VyRm9yQWRtaW46IFwiQ2V0IHV0aWxpc2F0ZXVyIChpZDogSURfVVNFUikgYSA8Yj5jcsOpw6kgc29uIGNvbXB0ZSBsZSBEQVRFX0NSRUE8L2I+LCBsYSBkZXJuacOocmUgbWlzZSDDoCBqb3VyIGRhdGFudCBkdSBEQVRFX1VQREFURS48YnI+PGI+RGF0ZSBkZSBzYSBkZXJuacOocmUgY29ubmV4aW9uIDogREFURV9DT05ORUNUSU9OLjwvYj5cIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1aWxzIDogXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIixcblx0XCIuL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5odG1sXCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbiAgICB0YWdzTGlzdFR4dDogXCJQYXJjb3VyaXIgbGVzIHJ1YnJpcXVlcyA6XCIsXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJQYXJjb3VyaXJcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL3F1aXpzL1wiLCBpZDpcImluZGV4SGVhZExpbmtcIiwgdGl0bGU6XCJMZXMgZGVybmllcnMgcXVpenNcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5odG1sXCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9XG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJCbG9nXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcImh0dHBzOi8vZnJhbWFzcGhlcmUub3JnL3Blb3BsZS83ZTU0YjdhMGI1MzIwMTM4OWVlZjJhMDAwMDA1MzYyNVwiLCB0aXRsZTpcIkJsb2cgV2lraUxlcm5pIHN1ciBkaWFzcG9yYSpcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ0dWICYgQ0dVXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9DR1YtQ0dVLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9XG4gICAgXSxcbiAgICBtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZTogMyxcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogOSxcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMyxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICB2YWxpZGF0aW9uTGlua1BhZ2UgOiBcInZhbGlkYXRpb24uaHRtbD90PVwiLFxuICAgIGxvZ2luTGlua1BhZ2UgOiBcImxvZ2luLmh0bWw/dD1cIixcbiAgICBuZXdMb2dpbkxpbmtQYWdlIDogXCJuZXdsb2dpbi5odG1sP3Q9XCIsXG4gICAgZGVsZXRlTGlua1BhZ2UgOiBcImF1cmV2b2lyLmh0bWw/dD1cIixcbiAgICBzdG9wTWFpbFBhZ2UgOiBcInN0b3AtbWFpbC5odG1sP3Q9XCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICB1cGRhdGVBY2NvdW50UGFnZTogXCJtb24tY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIGFib3V0UGFnZTogXCJhLXByb3Bvcy5odG1sXCIsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVBhZ2VUeHQ6IFwiUGFnZSBkJ2FjY3VlaWxcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIkF2ZWMgV2lraUxlcm5pLCB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhIDxzcGFuIGNsYXNzPSdwb3N0c2NyaXB0dW0nPigqKTwvc3Bhbj4sIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c3BhbiBjbGFzcz0ncG9zdHNjcmlwdHVtJz4oKikgQmllbiBxdWUgcGFydGFnZWFudCBzZXMgdmFsZXVycywgV2lraUxlcm5pIGVzdCB1biBwcm9qZXQgaW5kw6lwZW5kYW50IGRlIGxhIGZvbmRhdGlvbiBXaWtpcMOpZGlhLjwvc3Bhbj5cIixcbiAgICBob21lQnRuQWJvdXRUeHQ6IFwiRW4gc2F2b2lyIHBsdXMgc3VyIFdpa2lMZXJuaSAhXCIsXG4gICAgaG9tZUJ0blN1YnNjcmliZVR4dDogXCJUZXN0ZXIgV2lraUxlcm5pIGdyYXR1aXRlbWVudC5cIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkxlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pXCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNJbnRybzogXCJMaXN0ZSBkZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaS5cIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmkgP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIkxlIHByaW5jaXBlIGVzdCBzaW1wbGUgOiB2b3VzIGNvbW1lbmNleiBwYXIgbGlyZSBsJ2FydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6kuPGJyPlB1aXMgdm91cyBhZmZpY2hlciBsZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGF2ZXogcmV0ZW51IGRlIHZvdHJlIGxlY3R1cmUuIFZvdXMgb2J0ZW5leiBhbG9ycyB2b3RyZSByw6lzdWx0YXQgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5TdWl2YW50IGxlcyBxdWVzdGlvbnMsIHVuZSBvdSBwbHVzaWV1cnMgcsOpcG9uc2VzIHBldXZlbnQgw6p0cmUgY29ycmVjdGVzIGV0IGRvaXZlbnQgZG9uYyDDqnRyZSBjb2Now6llcy4gPGI+Qydlc3QgdG91am91cnMgbGUgY29udGVudSBkZSBsJ2FydGljbGUgV2lraXDDqWRpYSBxdWkgZmFpdCBmb2kgY29uY2VybmFudCBsZXMgXFxcImJvbm5lc1xcXCIgcsOpcG9uc2VzPC9iPi4gTWFpcyBsZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBwZXV2ZW50IMOpdm9sdWVyLCBkb25jIG4naMOpc2l0ZXogcGFzIDxhIGhyZWY9Jy9jb250YWN0Lmh0bWwnPsOgIG1lIHNpZ25hbGVyIHVuZSBlcnJldXI8L2E+Ljxicj48YnI+VG91dGVzIGxlcyByw6lwb25zZXMgc2UgdHJvdXZlbnQgZGFucyBsJ2FydGljbGUgcHJvcG9zw6kgw6AgbGEgbGVjdHVyZS4gPGI+Vm91cyDDqnRlcyBpY2kgcG91ciBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3NlcywgbWFpcyBsaWJyZSDDoCB2b3VzIGQnZXNzYXllciBkJ3kgcsOpcG9uZHJlIGltbcOpZGlhdGVtZW50PC9iPi48YnI+PGJyPlF1YW5kIGxlIHN1amV0IHMneSBwcsOqdGUsIG5lIHZvdXMgw6l0b25uZXogcGFzIHNpIGNlcnRhaW5lcyBkZXMgcsOpcG9uc2VzIHByb3Bvc8OpZXMgcGV1dmVudCDDqnRyZSB1biBwZXUgZMOpY2Fsw6llcywgYWJzdXJkZXMuLi4gT24gcGV1dCBhcHByZW5kcmUgYXZlYyBsZSBzb3VyaXJlLCBub24gPyA6LSk8YnI+PGJyPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuIENlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSA8Yj50ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6PC9iPiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEdyw6JjZSDDoCBjZSBjb21wdGUsIHZvdXMgcG91cnJleiBhdXNzaSA8Yj5yZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVhdXggcXVpenM8L2I+IHBvdXIgY29udGludWVyIMOgIFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiLjxicj48YnI+TWFpcyA8Yj5sYSBjcsOpYXRpb24gZGUgY2UgY29tcHRlIGVzdCBmYWN1bHRhdGl2ZTwvYj4gZXQgPGEgaHJlZj0nL3F1aXpzLycgdGl0bGU9J0xlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyc+dm91cyBwb3V2ZXogcGFyY291cmlyIFdpa2lMZXJuaSBsaWJyZW1lbnQ8L2E+LlwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG4gICAgbmV3c0xpc3RUaXRsZTogXCJMZXMgZGVybmnDqHJlcyBncmFpbmVzIGRlIHNhdm9pclwiLFxuICAgIHRhZ3NMaXN0VHh0OiBcIlBhcmNvdXJpciBsZXMgcnVicmlxdWVzXCIsXG4gICAgbWFpbFJlY2lwaWVudFR4dDogXCJNZXNzYWdlIGVudm95w6kgw6AgOlwiLFxufTsiLCIvLyAtLSBQQUdFIEQnQUNDVUVJTCBERSBMJ1VUSUxJU0FURVVSXG5cbi8vLyBWw6lyaWZpZXIgcXVlIGwndXRpbGlzYXRldXIgZXN0IGJpZW4gY29ubmVjdMOpLCBhIGxlIGJvbiBzdGF0dXQgZXQgbGUgcmVkaXJpZ2VyIHZlcnMgbGUgZm9ybXVsYWlyZSBkJ2luc2NyaXB0aW9uIHNpIGNlIG4nZXN0IHBhcyBsZSBjYXMuXG4vLy8gU2kgYydlc3Qgb2ssIG9uIHLDqWN1cMOocmUgc2VzIGluZm9zIGV0IHN0YXRzICsgbGVzIGRlcm5pZXJzIHF1aXpzIGF1eHF1ZWxzIGlsIGEgYWNjw6hzLCBtYWlzIG4nYSBwYXMgcsOpcG9uZHUuXG4vLy8gVW4gbW90ZXVyIGRlIHJlY2hlcmNoZSBwZXJtZXQgZCdvYnRlbmlyIGQnYXV0cmVzIHF1aXpzIHBhcm1pIGNldXggcHVibGnDqXMuXG4vLy8gUG91ciBsJ2FmZmljaGFnZSBkZXMgbGlzdGluZ3MgZGUgcXVpeiwgbCdBUEkgcmV0b3VybmUgZGlyZWN0ZW1lbnQgZHUgaHRtbC5cbi8vLyBVbiBtZW51IHBlcm1ldCDDoCBsJ3V0aWxpc2F0ZXVyIGQnYWNjw6lkZXIgw6AgbGEgbW9kaWZpY2F0aW9uIGRlIHNlcyBpbmZvcywgZGUgc29uIGFib25uZW1lbnQsIGV0Yy5cbi8vLyBVbiBtZXNzYWdlIHZlbmFudCBkJ3VuZSBhdXRyZSBwYWdlIHBldXQgYXVzc2kgw6p0cmUgw6AgYWZmaWNoZXIgbG9ycyBkdSBwcmVtaWVyIGNoYXJnZW1lbnQuXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBjw7R0w6kgY2xpZW50IDpcbmltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHRoZW1lIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcbmNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG4vLyBGb25jdGlvbnMgdXRpbGVzIGF1IHNjcmlwdCA6XG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2LCB1cGRhdGVBY2NvdW50TGluayB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGdldERhdGFzRnJvbUlucHV0cywgc2V0QXR0cmlidXRlc1RvSW5wdXRzIH0gZnJvbSBcIi4vdG9vbHMvZm9ybXMuanNcIjtcbmltcG9ydCB7IGlzRW1wdHksIHJlcGxhY2VBbGwgfSBmcm9tIFwiLi4vLi4vdG9vbHMvbWFpblwiO1xuaW1wb3J0IHsgY2hlY2tTZXNzaW9uLCBnZXRDb25maWcgfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuY29uc3QgdHh0QW53ZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9hbnN3ZXJcIik7XG5jb25zdCB0eHRRdWVzdGlvbm5haXJlID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9xdWVzdGlvbm5haXJlXCIpO1xuXG4vLyBQcmluY2lwYXV4IMOpbMOpbWVudHMgZHUgRE9NIG1hbmlwdWzDqXMgOlxuY29uc3QgZGl2TWFpbj0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYWluLWNvbnRlbnRcIik7XG5jb25zdCBkaXZDcmFzaD0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjcmFzaFwiKTtcbmNvbnN0IGRpdk1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1lc3NhZ2VcIik7XG5jb25zdCBxdWl6VGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1aXpzVGl0bGVcIik7XG5jb25zdCBxdWl6SW50cm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1aXpzSW50cm9cIik7XG5jb25zdCBxdWl6TGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVpenNMaXN0XCIpO1xuY29uc3QgcXVpelBhZ2luYXRpb25QcmV2aW91cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHJldmlvdXNcIik7XG5jb25zdCBxdWl6UGFnaW5hdGlvbk5leHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5leHRcIik7XG5jb25zdCBmb3JtU2VhcmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWFyY2hcIik7XG5jb25zdCBpbnB1dEJlZ2luID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiZWdpblwiKTtcbmNvbnN0IGJ0blJhbmRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmFuZG9tXCIpO1xuXG5oZWxsb0RldigpO1xuXG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldENvbmZpZygpO1xuICAgICAgICBpZighY29uZmlnKVxuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZDcmFzaCwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIFNpIGwndXRpbGlzYXRldXIgbidlc3QgcGFzIGNvbm5lY3TDqSwgcGFzIGxhIHBlaW5lIGQnYWxsZXIgKyBsb2luIDpcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkPWF3YWl0IGNoZWNrU2Vzc2lvbihbXCJ1c2VyXCJdLCBcIi9cIitjb25maWdGcm9udEVuZC5jb25uZWN0aW9uUGFnZSwgeyBtZXNzYWdlOiB0eHRVc2Vycy5uZWVkQmVDb25uZWN0ZWQsIGNvbG9yOlwiZXJyb3JcIiB9LCB3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUFjY291bnRMaW5rKHVzZXIuc3RhdHVzLCBjb25maWdGcm9udEVuZCk7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcImgxXCIsIHR4dFVzZXJzLndlbGNvbWVNZXNzYWdlLnJlcGxhY2UoXCIjTkFNRVwiLCB1c2VyLm5hbWUpKTtcbiAgICAgICAgICAgICAgICBkaXZNYWluLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KGdldExvY2FseShcIm1lc3NhZ2VcIikpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5tZXNzYWdlLCBcIlwiLCBbZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5jb2xvcl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibWVzc2FnZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbGlzYXRpb24gZHUgZm9ybXVsYWlyZSBkZSByZWNoZXJjaGUgOlxuICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWcsIGZvcm1TZWFyY2gpOyAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gTGVzIHN0YXRzIDogICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCB4aHJTdGF0cyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoclN0YXRzLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZy5nZXRTdGF0c0Fuc3dlcnMrdXNlci5pZCk7XG4gICAgICAgICAgICAgICAgeGhyU3RhdHMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiAhaXNFbXB0eShyZXNwb25zZS5uYkFuc3dlcnMpICYmIHJlc3BvbnNlLm5iQW5zd2VycyE9PTApLy8gcGFzIGRlIHN0YXRzIHNpIGF1Y3VuZSByw6lwb25zZSAhXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CQU5TV0VSUyA6IHJlc3BvbnNlLm5iQW5zd2VycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQlFVRVNUSU9OTkFJUkVTIDogcmVzcG9uc2UubmJRdWVzdGlvbm5haXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQlRPVFFVRVNUSU9OTkFJUkVTIDogcmVzcG9uc2UuZ2VuZXJhbC5uYlB1Ymxpc2hlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkdEVVJBVElPTiA6IHJlc3BvbnNlLmF2Z0R1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWR0NPUlJFQ1RBTlNXRVJTIDogcmVzcG9uc2UuYXZnQ29ycmVjdEFuc3dlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIHJlcGxhY2VBbGwodHh0QW53ZXJzLnN0YXRzVXNlciwgbWFwVGV4dCksIFwiXCIsIFwiXCIsIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHJTdGF0cy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTsgXG4gICAgICAgICAgICAgICAgeGhyU3RhdHMuc2VuZCgpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFBhciBkw6lmYXV0LCBvbiBhZmZpY2hlIGRlcyBkZXJuaWVycyBxdWl6cyBwcm9wb3PDqXMgc2FucyByw6lwb25zZSA6XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyTGFzdFF1aXpzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyTGFzdFF1aXpzLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZy5nZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIrXCJcIit1c2VyLmlkK1wiL1wiKzArXCIvXCIrY29uZmlnRnJvbnRFbmQubmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZStcIi9odG1sXCIpO1xuICAgICAgICAgICAgICAgIHhockxhc3RRdWl6cy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLm5iVG90PT09MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6SW50cm8sIFwicFwiLCB0eHRBbndlcnMubm9RdWVzdGlvbm5haXJlV2l0aG91ZEFuc3dlciwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihyZXNwb25zZS5odG1sKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6SW50cm8sIFwicFwiLCB0eHRBbndlcnMubmJRdWVzdGlvbm5haXJlV2l0aG91ZEFuc3dlci5yZXBsYWNlKFwiI05CXCIsIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCksIFwiXCIsIFtcImluZm9cIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWl6TGlzdGluZy5pbm5lckhUTUw9cmVzcG9uc2UuaHRtbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2g9XCJcIjsvLyBzaW5vbiBsZXMgaGFzaCBzJ2VuY2hhw65uZW50Li4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVpenNUaXRsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpzLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7Ly8gcmV2b2lyIHNpIGludMOpcsOqdCBkJ2FmZmljaGVyIHF1ZWxxdWUgY2hvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpzLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7IC8vIGlkZW1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHJMYXN0UXVpenMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyTGFzdFF1aXpzLnNlbmQoKTtcblxuICAgICAgICAgICAgICAgIC8vIFRyYWl0ZW1lbnQgZHUgbGFuY2VtZW50IGQndW5lIHJlY2hlcmNoZVxuICAgICAgICAgICAgICAgIC8vIExhIHJlY2hlcmNoZSBwZXV0IMOqdHJlIGxhbmPDqWUgdmlhIGxhIGJvdXRvbiBzdWJtaXQgb3UgdW4gbGllbiBkZSBwYWdpbmF0aW9uXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VuZFNlYXJjaCA9ICh0eXBlPVwic2VhcmNoXCIpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBxdWl6VGl0bGUuaW5uZXJIVE1MPXR4dFF1ZXN0aW9ubmFpcmUuc2VhcmNoUmVzdWx0VGl0bGU7XG4gICAgICAgICAgICAgICAgICAgIHF1aXpMaXN0aW5nLmlubmVySFRNTD1cIlwiK1wiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybVNlYXJjaCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclNlYXJjaCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZih0eXBlPT1cInNlYXJjaFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoLm9wZW4oXCJQT1NUXCIsIGNvbmZpZy5hcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLnNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHR5cGU9PVwicmFuZG9tXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2gub3BlbihcIlBPU1RcIiwgY29uZmlnLmFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytcIi9nZXRyYW5kb21cIik7Ly8gcmV2b2lyIDogY2hhbmdlciBwYXIgbGEgdmFyaWFibGUgZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSBkdSBmaWNoaWVyIGRlIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2gub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmICFpc0VtcHR5KHJlc3BvbnNlLm5iVG90KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLm5iVG90PT09MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6SW50cm8sIFwicFwiLCB0eHRRdWVzdGlvbm5haXJlLm5vdEZvdW5kLCBcIlwiLCBbXCJpbmZvXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoPVwiXCI7Ly8gc2lub24gbGVzIGhhc2ggcydlbmNoYcOubmVudC4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNxdWl6c1RpdGxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocmVzcG9uc2UuaHRtbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6SW50cm8sIFwicFwiLCB0eHRRdWVzdGlvbm5haXJlLnNlYXJjaFdpdGhSZXN1bHQucmVwbGFjZShcIiNOQlwiLCByZXNwb25zZS5uYlRvdCkgLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aXpMaXN0aW5nLmlubmVySFRNTD1yZXNwb25zZS5odG1sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2g9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVpenNUaXRsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhZ2luYXRpb24gbsOpY2Vzc2FpcmUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gY29tbWVuY2UgcGFyIHZpZGVyLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWl6UGFnaW5hdGlvblByZXZpb3VzLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpelBhZ2luYXRpb25OZXh0LmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuYmVnaW4gIT0gMCkvLyBwZXV0IHJldG91cm5lciBcIjBcIiBldCBub24gMCAhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6UGFnaW5hdGlvblByZXZpb3VzLCBcImFcIiwgXCI8PCBcIit0eHQucHJldmlvdXNQYWdlICwgXCJwcmV2aW91c1Jlc1wiLCBbXCJidXR0b25cIl0sIHsgaHJlZjogXCIjc2VhcmNoXCIgfSk7IC8vIHJldm9pciwgbGVzIFwiPDxcIiBwb3VycmFpZW50IMOqdHJlIGfDqXLDqWVzIHBhciBsZSBDU1NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1BhZ2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwcmV2aW91c1Jlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZSByZXRvdXIgw6AgbGEgcGFnZSBwcsOpY8OpZGVudGUgcGV1dCBzZSBmYWlyZSBlbiBjbGlxdWFudCBzdXIgbGUgYm91dG9uIG91IHZpYSBsJ2hpc3RvcmlxdWUgZHUgbmF2aWdhdGV1clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvQmFja1JlcyA9ICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3QmVnaW49cmVzcG9uc2UuYmVnaW4tY29uZmlnRnJvbnRFbmQubmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV3QmVnaW48MCkgLy8gbmUgZGV2cmFpdCBwYXMgw6p0cmUgcG9zc2libGUuLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QmVnaW49MDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiZWdpblwiKS52YWx1ZT1uZXdCZWdpbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFNlYXJjaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI3F1aXpzVGl0bGVcIik7Ly8gcG91ciByZW1vbnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1BhZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvQmFja1JlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbWJsZSBwcm92b3F1w6kgYnVnID8/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29CYWNrUmVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuZW5kIDwgKHJlc3BvbnNlLm5iVG90LTEpKS8vIC0xLCBjYXIgdGFibGVhdSBjb21tZW5jZSDDoCAwICFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpQYWdpbmF0aW9uTmV4dCwgXCJhXCIsIHR4dC5uZXh0UGFnZSsgXCIgPj5cIiwgXCJuZXh0UmVzXCIsIFtcImJ1dHRvblwiXSwgeyBocmVmOiBcIiNzZWFyY2hcIiB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFBhZ2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJuZXh0UmVzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJlZ2luXCIpLnZhbHVlPXJlc3BvbnNlLmVuZCsxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kU2VhcmNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoPVwiXCI7Ly8gc2lub24gbGVzIGhhc2ggcydlbmNoYcOubmVudC4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI3F1aXpzVGl0bGVcIik7IC8vIHBvdXIgcmVtb250ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpzLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6cywgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMub3V0cHV0PVwiaHRtbFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJ0blJhbmRvbS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiZWdpblwiKS52YWx1ZT0wO1xuICAgICAgICAgICAgICAgICAgICBzZW5kU2VhcmNoKFwicmFuZG9tXCIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGZvcm1TZWFyY2guYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJlZ2luXCIpLnZhbHVlPTA7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRTZWFyY2goKTtcbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2Q3Jhc2gsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuXFxuTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IHZvdXMgcG91dmV6IGxlIHRyb3V2ZXIgc2kgR2l0bGFiIDpcXG5odHRwczovL2dpdGxhYi5jb20vbGVmYWJsYWIvd2lraWxlcm5pXFxuXFxuUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY2NvdW50TGluayA9IChzdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKSA9Plxue1xuICAgIGNvbnN0IGxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50SGVhZExpbmtcIik7XG4gICAgY29uc3QgaG9tZVBhZ2U9c3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICBsaW5rLmhyZWY9XCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMgPSAoaW5wdXRzQ29uZiwgbXlGb3JtKSA9Plxue1xuICAgIGZvcihsZXQgaSBpbiBteUZvcm0uZWxlbWVudHMpXG4gICAge1xuICAgICAgICBpZighaXNFbXB0eShteUZvcm0uZWxlbWVudHNbaV0uaWQpKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgaWRJbnB1dD1teUZvcm0uZWxlbWVudHNbaV0uaWQ7XG4gICAgICAgICAgICBpZihpbnB1dHNDb25mW2lkSW5wdXRdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBpbnB1dEhUTUw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRJbnB1dCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIGlucHV0c0NvbmZbaWRJbnB1dF0pXG4gICAgICAgICAgICAgICAgICAgIGlucHV0SFRNTC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBpbnB1dHNDb25mW2lkSW5wdXRdW2F0dHJpYnV0ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBSw6ljdXDDqHJlIHRvdXRlcyBsZXMgdmFsZXVycyBkZSBjaGFtcHMgZW4gb21ldHRhbnQgbGVzIGNoZWNrYm94IG5vbiBjb2Now6llcywgZXRjLlxuZXhwb3J0IGNvbnN0IGdldERhdGFzRnJvbUlucHV0cyA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZGF0YXM9e307XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAgICAgZGF0YXNbZW50cmllWzBdXT1lbnRyaWVbMV07XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBWaWRlIHRvdXMgbGVzIGNoYW1wcyBkJ3VuIGZvcm11bGFpcmUsIHkgY29tcHJpcyBoaWRkZW4sIGNoZWNrYm94LCBldGMuXG4vLyBSZXZvaXIgcG91ciBsZXMgc2VsZWN0XG5leHBvcnQgY29uc3QgZW1weUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgIHtcbiAgICAgICAgaWYobXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJjaGVja2JveFwiIHx8IG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwicmFkaW9cIilcbiAgICAgICAgICAgIG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLmNoZWNrZWQ9ZmFsc2U7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnZhbHVlPVwiXCI7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLy8gVmlkZSBldCBjYWNoZSBsZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgZW1weUFuZEhpZGVGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBlbXB5Rm9ybShteUZvcm0pO1xuICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xufSIsImltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHNpdGVVcmwsIHRoZW1lIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgLy8gbXVsdGlwbGllciBwYXIgLTEsIGNhciBjJ2VzdCBjZSBxdSdpbCBmYXV0IFwiYWpvdXRlclwiIMOgIGwnaGV1cmUgVVRDIHBvdXIgcmV2ZW5pciBlbiBoZXVyZSBsb2NhbGUgcXVpIG0naW50w6lyZXNzZSBldCBub24gbCdpbnZlcnNlXG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSotMTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGMnZXN0IGxlIHRva2VuIHF1aSBzZXJ0IMOgIHbDqXJpZmllciBsZSBzdGF0dXQgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZS5hY2NvdW50UGFnZStcIiNzdWJzY3JpYmVcIik7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9