Bots Home
|
Create an App
wetbot-es6
Author:
onesinmiedo1
Description
Source Code
Launch Bot
Current Users
Created by:
Onesinmiedo1
/******/ (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 = "./js/app.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./js/app.js": /*!*******************!*\ !*** ./js/app.js ***! \*******************/ /*! no exports provided */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _notifier_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./notifier.js */ "./js/notifier.js"); /* harmony import */ var _tipper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tipper.js */ "./js/tipper.js"); /* harmony import */ var _messenger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./messenger.js */ "./js/messenger.js"); /* harmony import */ var _bot_manager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bot_manager.js */ "./js/bot_manager.js"); /* harmony import */ var _thanks_manager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./thanks_manager.js */ "./js/thanks_manager.js"); /* harmony import */ var _kerberos_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./kerberos.js */ "./js/kerberos.js"); var app = new _bot_manager_js__WEBPACK_IMPORTED_MODULE_3__["BotManager"](cb); app.add('kerberos', new _kerberos_js__WEBPACK_IMPORTED_MODULE_5__["Kerberos"](app, cb)); app.add('notifier', new _notifier_js__WEBPACK_IMPORTED_MODULE_0__["Notifier"](app, cb)); app.add('tipper', new _tipper_js__WEBPACK_IMPORTED_MODULE_1__["Tipper"](app, cb)); app.add('messenger', new _messenger_js__WEBPACK_IMPORTED_MODULE_2__["Messenger"](app, cb)); app.add('thanks', new _thanks_manager_js__WEBPACK_IMPORTED_MODULE_4__["ThanksManager"](app, cb)); /***/ }), /***/ "./js/black_list.js": /*!**************************!*\ !*** ./js/black_list.js ***! \**************************/ /*! exports provided: blackList */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "blackList", function() { return blackList; }); var blackList = { users: [], blackList: ['shit', 'whore', 'bitch', 'remove space'] }; /***/ }), /***/ "./js/bot.js": /*!*******************!*\ !*** ./js/bot.js ***! \*******************/ /*! exports provided: Bot */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Bot", function() { return Bot; }); /* harmony import */ var _stats_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stats.js */ "./js/stats.js"); /* harmony import */ var _status_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./status.js */ "./js/status.js"); 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; } /** * Base class for CB bots. */ var Bot = /*#__PURE__*/ function () { function Bot(app, cb) { _classCallCheck(this, Bot); this.backgroundColor = ''; this.color = '#000000'; this.newline = '\n'; this.coreCommands = ['run', 'stop', 'pause']; this.cb = cb; this.app = app; this.stats = new _stats_js__WEBPACK_IMPORTED_MODULE_0__["Stats"](app, cb); this.status = _status_js__WEBPACK_IMPORTED_MODULE_1__["status"].RUNNING; } _createClass(Bot, [{ key: "isCoreCommand", value: function isCoreCommand(command) { return this.coreCommands.includes(command); } }, { key: "hasMethod", value: function hasMethod(methodName) { return this[methodName] && typeof this[methodName] == 'function'; } }, { key: "isRunning", value: function isRunning() { return this.status == _status_js__WEBPACK_IMPORTED_MODULE_1__["status"].RUNNING; } }, { key: "pause", value: function pause(data) { this.status = _status_js__WEBPACK_IMPORTED_MODULE_1__["status"].PAUSED; this.onPause(data); } }, { key: "stop", value: function stop(data) { this.status = _status_js__WEBPACK_IMPORTED_MODULE_1__["status"].STOPPED; this.onStop(data); } }, { key: "run", value: function run(data) { this.status = _status_js__WEBPACK_IMPORTED_MODULE_1__["status"].RUNNING; this.onRun(data); } }, { key: "onPause", value: function onPause(data) { return; } }, { key: "onStop", value: function onStop(data) { return; } }, { key: "onRun", value: function onRun(data) { return; } /** * [onMessage description] * @param {object} message Info related to the message. * @return {[type]} [description] * * c: message color * m: the message text * user: username of message sender * f: message font * in_fanclub: is the user in the broadcasters fan club * has_tokens: does the user have at least 1 token * is_mod: is the user a moderator * tipped_recently: is the user a “dark blue”? * tipped_alot_recently: is the user a “purple”? * tipped_tons_recently: is the user a “dark purple”? * gender: “m” (male), “f” (female), “s” (trans), or “c” (couple) */ }, { key: "onMessage", value: function onMessage(message) { this.parseMessage(message); } }, { key: "parseMessage", value: function parseMessage(message) { var command = this.getCommand(message.m); if (command) { (this.isRunning() || this.isCoreCommand(command.options[0])) && typeof this.processCommand == 'function' && this.processCommand(command.options, message); message['X-Spam'] = true; } return command; } /** * [onTip description] * @param {object} tip Info related to the tip. * @return {[type]} [description] * * amount: amount of tip * message: message in tip * to_user: user who received tip * from_user: user who sent tip * from_user_in_fanclub: is the user in the broadcasters fan club * from_user_has_tokens: does the user have at least 1 token * from_user_is_mod: is the user a moderator * from_user_tipped_recently: is the user a “dark blue”? * from_user_tipped_alot_recently: is the user a “purple”? * from_user_tipped_tons_recently: is the user a “dark purple”? * from_user_gender: “m” (male), “f” (female), “s” (trans), or “c” (couple) */ }, { key: "onTip", value: function onTip(tip) { return; } /** * [onEnter description] * @param {object} user Info related to the user who enters the room. * @return {[type]} [description] * * user: user who entered the room * in_fanclub: is the user in the broadcaster’s fan club * has_tokens: does the user have at least 1 token * is_mod: is the user a moderator * tipped_recently: is the user a “dark blue”? * tipped_alot_recently: is the user a “purple”? * tipped_tons_recently: is the user a “dark purple”? * gender: “m” (male), “f” (female), “s” (trans), or “c” (couple) */ }, { key: "onEnter", value: function onEnter(user) { return; } /** * [onLeave description] * @param {object} user Info related to the user who leaves the room. * @return {[type]} [description] * * user: user who left the room * in_fanclub: is the user in the broadcaster’s fan club * has_tokens: does the user have at least 1 token * is_mod: is the user a moderator * tipped_recently: is the user a “dark blue”? * tipped_alot_recently: is the user a “purple”? * tipped_tons_recently: is the user a “dark purple”? * gender: “m” (male), “f” (female), “s” (trans), or “c” (couple) */ }, { key: "onLeave", value: function onLeave(user) { return; } /** * [onDrawPanel description] * @param {oject} user Info related to the user who enters the room. * @return {[type]} [description] * * user: user who entered the room * in_fanclub: is the user in the broadcaster’s fan club * has_tokens: does the user have at least 1 token * is_mod: is the user a moderator * tipped_recently: is the user a “dark blue”? * tipped_alot_recently: is the user a “purple”? * tipped_tons_recently: is the user a “dark purple”? * gender: “m” (male), “f” (female), “s” (trans), or “c” (couple) */ }, { key: "onDrawPanel", value: function onDrawPanel(user) { return; } }, { key: "getCommand", value: function getCommand(message) { var messageArray = message.replace(/\s+/g, ' ').trim().split(' '); if (this.alias && this.alias.includes(messageArray[0])) { return { command: messageArray[0], options: messageArray.slice(1) }; } return false; } }, { key: "checkPermission", value: function checkPermission(options, message) { return this.checkOption('*', message) || this.checkOption(options[0], message); } }, { key: "checkOption", value: function checkOption(option, message) { if (this.permissions[option]) { return message.is_mod && this.permissions[option].indexOf('m') >= 0 || message.user == this.cb.room_slug && this.permissions[option].indexOf('b') >= 0 || this.permissions[option].indexOf('a') >= 0; } } }]); return Bot; }(); // const config = { // description: '', // help : [ // { // access:'', // text:'', // } // ] // } /***/ }), /***/ "./js/bot_manager.js": /*!***************************!*\ !*** ./js/bot_manager.js ***! \***************************/ /*! exports provided: BotManager */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BotManager", function() { return BotManager; }); 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; } var BotManager = /*#__PURE__*/ function () { function BotManager(cb) { var _this = this; _classCallCheck(this, BotManager); this.cb = cb; this.bots = {}; this.start = Date.now(); this.cb.onMessage(function (message) { _this.onMessage(message); }); this.cb.onTip(function (tip) { _this.onTip(tip); }); this.cb.onEnter(function (user) { _this.onEnter(user); }); this.cb.onLeave(function (user) { _this.onLeave(user); }); this.cb.onDrawPanel(function (user) { _this.onDrawPanel(user); }); } _createClass(BotManager, [{ key: "add", value: function add(id, bot) { this.bots[id] = bot; } }, { key: "get", value: function get(id) { return this.bots[id]; } }, { key: "remove", value: function remove(id) { delete this.bots[id]; } }, { key: "onMessage", value: function onMessage(message) { var _this2 = this; Object.keys(this.bots).forEach(function (id) { // this.cb.log(`${this.bots[id].name} status: ${this.bots[id].status}`) typeof _this2.bots[id].onMessage == 'function' && _this2.bots[id].onMessage(message); }); } }, { key: "onTip", value: function onTip(tip) { var _this3 = this; Object.keys(this.bots).forEach(function (id) { _this3.bots[id].isRunning() && typeof _this3.bots[id].onTip == 'function' && _this3.bots[id].onTip(tip); }); } }, { key: "onEnter", value: function onEnter(user) { var _this4 = this; Object.keys(this.bots).forEach(function (id) { _this4.bots[id].isRunning() && typeof _this4.bots[id].onEnter == 'function' && _this4.bots[id].onEnter(user); }); } }, { key: "onLeave", value: function onLeave(user) { var _this5 = this; Object.keys(this.bots).forEach(function (id) { _this5.bots[id].isRunning() && typeof _this5.bots[id].onLeave == 'function' && _this5.bots[id].onLeave(user); }); } }, { key: "onDrawPanel", value: function onDrawPanel(user) { var _this6 = this; Object.keys(this.bots).forEach(function (id) { _this6.bots[id].isRunning() && typeof _this6.bots[id].onDrawPanel == 'function' && _this6.bots[id].onDrawPanel(user); }); } }]); return BotManager; }(); /***/ }), /***/ "./js/echo.js": /*!********************!*\ !*** ./js/echo.js ***! \********************/ /*! exports provided: Echo */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Echo", function() { return Echo; }); /* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./values.js */ "./js/values.js"); 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; } var Echo = /*#__PURE__*/ function () { function Echo() { _classCallCheck(this, Echo); } _createClass(Echo, null, [{ key: "formatLines", ///////////////////// // format messages // ///////////////////// value: function formatLines(text) { var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10; return "".concat(_values_js__WEBPACK_IMPORTED_MODULE_0__["unicodeChars"].topLeftCorner).concat(Echo.repeat(_values_js__WEBPACK_IMPORTED_MODULE_0__["unicodeChars"].dashChar, length), "\n\t\t ").concat(_values_js__WEBPACK_IMPORTED_MODULE_0__["unicodeChars"].vertDash, " ").concat(text, "\n\t\t ").concat(_values_js__WEBPACK_IMPORTED_MODULE_0__["unicodeChars"].bottomLeftCorner).concat(Echo.repeat(_values_js__WEBPACK_IMPORTED_MODULE_0__["unicodeChars"].dashChar, length)); } }, { key: "formatBracket", value: function formatBracket(text, char) { return "".concat(Echo.repeat(char, 4), "\n\t\t ").concat(Echo.formatPrefix(char), "\n\t\t ").concat(Echo.repeat(char, 4)); } }, { key: "formatPrefix", value: function formatPrefix(text, char) { var lines = text.split('\n'); return lines.map(function (line) { return "".concat(char, " ").concat(line); }).join('\n'); } }, { key: "repeat", value: function repeat(char, times) { var result = ''; while (times--) { result += char; } return result; } ////////////////// // send notices // ////////////////// }, { key: "send", value: function send(_ref) { var _ref2; var _ref$group = _ref.group, group = _ref$group === void 0 ? '' : _ref$group, _ref$user = _ref.user, user = _ref$user === void 0 ? '' : _ref$user, _ref$inverse = _ref.inverse, inverse = _ref$inverse === void 0 ? false : _ref$inverse, color = _ref.color, background = _ref.background, text = _ref.text, cb = _ref.cb; inverse && (_ref2 = [color, background], background = _ref2[0], color = _ref2[1], _ref2); cb.sendNotice(text, user, background, color, 'normal', group); } }, { key: "sendBold", value: function sendBold(_ref3) { var _ref4; var _ref3$group = _ref3.group, group = _ref3$group === void 0 ? '' : _ref3$group, _ref3$user = _ref3.user, user = _ref3$user === void 0 ? '' : _ref3$user, _ref3$inverse = _ref3.inverse, inverse = _ref3$inverse === void 0 ? false : _ref3$inverse, color = _ref3.color, background = _ref3.background, text = _ref3.text, cb = _ref3.cb; inverse && (_ref4 = [color, background], background = _ref4[0], color = _ref4[1], _ref4); cb.sendNotice(text, user, background, color, 'bold', group); } }]); return Echo; }(); /***/ }), /***/ "./js/kerberos.js": /*!************************!*\ !*** ./js/kerberos.js ***! \************************/ /*! exports provided: Kerberos */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Kerberos", function() { return Kerberos; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); /* harmony import */ var _echo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./echo.js */ "./js/echo.js"); /* harmony import */ var _black_list_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./black_list.js */ "./js/black_list.js"); function _typeof(obj) { 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); } 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; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var Kerberos = /*#__PURE__*/ function (_Bot) { _inherits(Kerberos, _Bot); function Kerberos(app, cb) { var _this; _classCallCheck(this, Kerberos); _this = _possibleConstructorReturn(this, _getPrototypeOf(Kerberos).call(this, app, cb)); _this.name = 'SPAM/abuse filter bot'; _this.description = 'A bot for handling insults, abusive language, SPAM'; _this.alias = ['!ker', '/ker']; _this.permissions = { 'add-user': 'bm', 'add-text': 'bm' }; _this.users = _this.parseBlacklist(_black_list_js__WEBPACK_IMPORTED_MODULE_2__["blackList"].users); _this.blacklist = _this.parseBlacklist(_black_list_js__WEBPACK_IMPORTED_MODULE_2__["blackList"].blackList); return _this; } _createClass(Kerberos, [{ key: "onMessage", value: function onMessage(message) { if (!this.parseMessage(message)) { (this.users.includes(message.user.toLowerCase()) || !this.isPrivileged(message) && this.blacklisted(message.m.toLowerCase()) && this.notifyAbuse(message.m, message.user)) && (message['X-Spam'] = true); } return message; } }, { key: "isPrivileged", value: function isPrivileged(message) { return this.cb.room_slug == message.user || message.is_mod; } }, { key: "processCommand", value: function processCommand(options, message) { var _this2 = this; if (!this.checkPermission(options, message)) { return; } // add-user if (options.length > 1 && options[0] == 'add-user') { options.slice(1).forEach(function (user) { !_this2.users.includes(user) && _this2.users.push(user) && _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].send({ user: message.user, text: "user ".concat(user, " has been added to the blacklist"), color: 'red', background: 'black', cb: _this2.cb }); }); } // add-text if (options.length > 1 && options[0] == 'add-text') { var start = message.m.indexOf('add-text') + 'add-text'.length, text = message.m.slice(start).trim(); !this.blacklist.includes(text) && this.blacklist.push(this.parse(text)) && _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].send({ user: message.user, text: "".concat(text, " has been added to the blacklist"), color: 'red', background: 'black', cb: this.cb }); } } }, { key: "blacklisted", value: function blacklisted(text) { return this.blacklist.some(function (element) { if (typeof element == 'string') return text.toLowerCase().includes(element); if (_typeof(element) == 'object') return text.toLowerCase().search(element); }); } }, { key: "parseBlacklist", value: function parseBlacklist(blacklist) { var _this3 = this; return blacklist.map(function (item) { return _this3.parse(item); }); } }, { key: "parse", value: function parse(text) { if (/^\/.*\/$/.test(text)) { return new RegExp(text.slice(1, -1)); } return text.toLowerCase(); } }, { key: "notifyAbuse", value: function notifyAbuse(message, user) { var cb = this.cb, text = "Message '".concat(message, "' \nfrom ").concat(user, " \nhas been silenced by kerberos."); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].send({ group: 'red', text: text, color: 'red', background: 'black', cb: cb }); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].send({ user: this.cb.room_slug, text: text, color: 'red', background: 'black', cb: cb }); } }]); return Kerberos; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/messenger.js": /*!*************************!*\ !*** ./js/messenger.js ***! \*************************/ /*! exports provided: Messenger */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Messenger", function() { return Messenger; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); function _typeof(obj) { 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); } 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; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var Messenger = /*#__PURE__*/ function (_Bot) { _inherits(Messenger, _Bot); function Messenger(app, cb) { var _this; _classCallCheck(this, Messenger); _this = _possibleConstructorReturn(this, _getPrototypeOf(Messenger).call(this, app, cb)); _this.name = 'Messenger bot'; return _this; } _createClass(Messenger, [{ key: "onMessage", value: function onMessage(msg) { var tipSum = this.app.get('tipper').stats.sumFromUser(msg.user), prefix = tipSum > 0 ? "[".concat(tipSum, "] ") : ''; msg.m = "".concat(prefix).concat(msg.m); } }]); return Messenger; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/notifier.js": /*!************************!*\ !*** ./js/notifier.js ***! \************************/ /*! exports provided: Notifier */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Notifier", function() { return Notifier; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); /* harmony import */ var _thanks_manager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./thanks_manager.js */ "./js/thanks_manager.js"); /* harmony import */ var _echo_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./echo.js */ "./js/echo.js"); function _typeof(obj) { 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); } 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; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * Notifier. */ var Notifier = /*#__PURE__*/ function (_Bot) { _inherits(Notifier, _Bot); function Notifier(app, cb) { var _this; var settings = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; _classCallCheck(this, Notifier); _this = _possibleConstructorReturn(this, _getPrototypeOf(Notifier).call(this, app, cb)); _this.name = 'Notifier bot'; _this.description = 'A bot for handling notifications'; _this.alias = ['!not', '/not']; _this.permissions = { '*': 'bm' }; _this.text = ''; settings.color || (_this.color = settings.color); settings.backgroundColor || (_this.backgroundColor = settings.backgroundColor); return _this; } _createClass(Notifier, [{ key: "processCommand", value: function processCommand(options, message) { if (!this.checkPermission(options, message)) { return; } this.text = options.join(' '); this.text = _echo_js__WEBPACK_IMPORTED_MODULE_2__["Echo"].formatLines(this.text); _echo_js__WEBPACK_IMPORTED_MODULE_2__["Echo"].send({ cb: this.cb, text: this.text }); } }, { key: "onEnter", value: function onEnter(user) { _echo_js__WEBPACK_IMPORTED_MODULE_2__["Echo"].send({ cb: this.cb, user: user.user, text: "hello ".concat(user.user, "!") }); } }]); return Notifier; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/stats.js": /*!*********************!*\ !*** ./js/stats.js ***! \*********************/ /*! exports provided: Stats */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Stats", function() { return Stats; }); 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; } var Stats = /*#__PURE__*/ function () { function Stats(app, cb) { _classCallCheck(this, Stats); this.name = 'Stats'; this.app = app; this.cb = cb; this.history = []; } /** * Add a tip entry to the history. * @param {object} tip Tip data. * @return {object} Data holding the changes. */ _createClass(Stats, [{ key: "addTip", value: function addTip(tip) { var oldData = { best: this.bestTipper(), highest: this.highestTip() }; this.history.push({ username: tip.from_user, amount: tip.amount, fan: tip.from_user_in_fanclub, time: Date.now() }); var newData = { best: this.bestTipper(), highest: this.highestTip() }, newBest = oldData.best.username == newData.best.username ? '' : newData.best, newHighest = oldData.highest.amount == newData.highest.amount ? '' : newData.highest; return { best: newBest, highest: newHighest }; } }, { key: "sum", value: function sum() { return this.history.reduce(function (accumulator, current) { return accumulator + current.amount; }, 0); } }, { key: "tokenRate", value: function tokenRate() { var minutes = (Date.now() - this.app.start) / (60 * 1000); return parseFloat((this.sum() / minutes).toFixed(2)); } }, { key: "highestByUser", value: function highestByUser() { return this.history.reduce(function (accumulator, current) { var found = accumulator.find(function (item) { return item.username == current.username; }); if (!found) { found = { username: current.username, amount: 0 }; accumulator.push(found); } found.amount = Math.max(found.amount, current.amount); return accumulator; }, []).sort(function (a, b) { return b.amount - a.amount; }); } }, { key: "highestTip", value: function highestTip() { return this.highestByUser()[0] || { username: '', amount: 0 }; } }, { key: "sumByUser", value: function sumByUser() { return this.history.reduce(function (accumulator, current) { var found = accumulator.find(function (item) { return item.username == current.username; }); if (!found) { found = { username: current.username, amount: 0 }; accumulator.push(found); } found.amount += current.amount; return accumulator; }, []).sort(function (a, b) { return b.amount - a.amount; }); } }, { key: "bestTipper", value: function bestTipper() { return this.sumByUser()[0] || { username: '', amount: 0 }; } }, { key: "sumFromUser", value: function sumFromUser(username) { return this.history.filter(function (item) { return username == item.username; }).reduce(function (accumulator, current) { return accumulator + current.amount; }, 0); } }, { key: "sumFromFans", value: function sumFromFans() { return this.history.filter(function (item) { return item.fan; }).reduce(function (accumulator, current) { return accumulator + current.amount; }, 0); } }, { key: "toString", value: function toString() { return this.history.reverse().map(function (item) { return "".concat(item.username, ": ").concat(item.amount, " tokens: ").concat(Stats.hrTime(item.time)); }).join('\n'); } }], [{ key: "hrTime", value: function hrTime(miliseconds) { var seconds = Math.floor(miliseconds / 1000); var h = Math.floor(seconds / 3600); var m = Math.floor(seconds % 3600 / 60); var s = seconds % 60; return (h > 0 ? h + 'hour' + (h > 1 ? 's ' : ' ') : '') + (s == 0 && m > 0 ? 'and ' : '') + (m > 0 ? m + 'minute' + (m > 1 ? 's ' : ' ') : '') + (s > 0 && h + m > 0 ? 'and ' : '') + (s > 0 ? s + 'second' + (s > 1 ? 's ' : ' ') : '') + 'ago'; } }]); return Stats; }(); /***/ }), /***/ "./js/status.js": /*!**********************!*\ !*** ./js/status.js ***! \**********************/ /*! exports provided: status */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "status", function() { return status; }); var status = { STOPPED: -1, PAUSED: 0, RUNNING: 1 }; /***/ }), /***/ "./js/thanks_manager.js": /*!******************************!*\ !*** ./js/thanks_manager.js ***! \******************************/ /*! exports provided: ThanksManager */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ThanksManager", function() { return ThanksManager; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); function _typeof(obj) { 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); } 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; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var ThanksManager = /*#__PURE__*/ function (_Bot) { _inherits(ThanksManager, _Bot); function ThanksManager(app, cb) { var _this; _classCallCheck(this, ThanksManager); _this = _possibleConstructorReturn(this, _getPrototypeOf(ThanksManager).call(this, app, cb)); _this.name = 'Thanks manager bot'; _this.thanks = { '1-10': ['Thanks $u, keep them comming ;)', 'I see you $u. Thanks for the tip'], '69': ['$t tokens uh? is that a suggestion?', '$t is my favorite number! how did you know, $u?', '$t is fun, don\'t you think? you like to be on top, $u? I do'], '300-': ['Fuck me $u, I\'m all yours, thank you so much!', 'Keep tipping like this and my pussy is yours forever $u'], '101-200': ['You\'re so generous, $u!', 'Love you, $u! $t tokens! <3 <3'], '1-100': ['Thank you $u!', 'So sweet of you, $u', 'Thanks $u!'], '201-300': ['$t tokens! that\'s insane $u!'], '1000-': ['Yes, yes, YESSSSSS $u! thank you!!!', 'Yeeeeeeha, $u! let me ride you like a cowgirl while you grab my boobs. Thanks a lot!!', 'Are you into anal sex, $u? because I am and as a gesture of gratitude I want you to destroy my ass so bad'], '5000-': ['OH MY GOD!! $t fucking tokens!! Fuck me until I beg you to stop... and then keep going! I love it!', '$t fucking tokens!!! OMG ...My pussy is yours $u, my ass is yours, my mouth is your. Use them as you please.'] }; _this.sortThanks(); return _this; } _createClass(ThanksManager, [{ key: "sortThanks", value: function sortThanks() { var _this2 = this; this.thanks = Object.keys(this.thanks).sort(function (a, b) { if (a.indexOf('-') < 0 && b.indexOf('-') < 0) return parseInt(a) - parseInt(b); if (a.indexOf('-') < 0 && b.indexOf('-') >= 0) return -1; if (a.indexOf('-') >= 0 && b.indexOf('-') < 0) return 1; if (a.indexOf('-') == 0 && b.indexOf('-') == 0) { return parseInt(a.split('-')[1]) - parseInt(b.split('-')[1]); } if (a.indexOf('-') == 0 && b.indexOf('-') > 0) { return parseInt(a.split('-')[1]) - parseInt(b.split('-')[1]); } if (a.indexOf('-') > 0 && b.indexOf('-') == 0) { return parseInt(a.split('-')[1]) - parseInt(b.split('-')[1]); } if (a.indexOf('-') > 0 && b.indexOf('-') > 0) { return parseInt(a.split('-')[0]) - parseInt(b.split('-')[0]); } }).map(function (item) { return { min: _this2.rewriteRange(item).split('-')[0], max: _this2.rewriteRange(item).split('-')[1] || _this2.rewriteRange(item).split('-')[0], msgs: _this2.thanks[item] }; }); } }, { key: "rewriteRange", value: function rewriteRange(range) { if (range.indexOf('-') == 0) return "1".concat(range); if (range.indexOf('-') == range.length - 1) return "".concat(range, "1000000"); return range; } }, { key: "getThanks", value: function getThanks(tip) { var candidates = this.getCandidates(tip.amount); return candidates[Math.floor(Math.random() * Math.floor(candidates.length))].replace('$u', tip.from_user).replace('$t', tip.amount); } }, { key: "getCandidates", value: function getCandidates(tipAmount) { var exact = this.thanks.filter(function (item) { return tipAmount == item.max && tipAmount == item.min; }); if (exact.length > 0) { return exact.map(function (item) { return item.msgs; }).reduce(function (accumulator, current) { return accumulator.concat(current); }, []); } return this.thanks.filter(function (item) { return tipAmount <= item.max && tipAmount >= item.min; }).map(function (item) { return item.msgs; }).reduce(function (accumulator, current) { return accumulator.concat(current); }, []); } }]); return ThanksManager; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/tipper.js": /*!**********************!*\ !*** ./js/tipper.js ***! \**********************/ /*! exports provided: Tipper */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tipper", function() { return Tipper; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); /* harmony import */ var _echo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./echo.js */ "./js/echo.js"); function _typeof(obj) { 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); } 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; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var Tipper = /*#__PURE__*/ function (_Bot) { _inherits(Tipper, _Bot); function Tipper(app, cb) { var _this; _classCallCheck(this, Tipper); _this = _possibleConstructorReturn(this, _getPrototypeOf(Tipper).call(this, app, cb)); _this.name = 'Tipper bot'; _this.description = 'A bot for handling tips'; _this.alias = ['!tipr', '/tipr']; _this.permissions = { 'king': 'bma', 'bomb': 'bma', 'rate': 'bma', 'list': 'bma', 'top5': 'bma', 'stop': 'b', 'run': 'b', 'pause': 'b' }; _this.color = '#b7ff00'; _this.backgroundColor = '#4800ff'; return _this; } _createClass(Tipper, [{ key: "onTip", value: function onTip(tip) { var changes = this.stats.addTip(tip); this.sendThanks(tip); this.sendChanges(changes); } }, { key: "sendChanges", value: function sendChanges(changes) { var cb = this.cb; if (changes.best != '') _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ cb: cb, text: "".concat(changes.best.username, " is my new KING"), color: 'yellow', background: 'black' }); if (changes.highest != '') _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ cb: cb, text: "".concat(changes.highest.username, " holds the HIGHEST tip with ").concat(changes.highest.amount, " tokens"), color: 'yellow', background: 'black' }); } }, { key: "sendThanks", value: function sendThanks(tip) { var cb = this.cb, thanks = this.app.get('thanks'), text = thanks.getThanks(tip); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ cb: cb, text: text, color: 'yellow', background: 'black' }); } }, { key: "processCommand", value: function processCommand(options, message) { if (!this.checkPermission(options, message)) { return; } // king if (options.length == 1 && options[0] == 'king') { var king = this.king(), text = king.username ? "".concat(king.username, " is my king tipper with ").concat(king.amount, " tokens") : "Noody has tipped yet"; _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: message.user, text: text, color: this.color, background: this.backgroundColor, cb: this.cb }); } // bomb if (options.length == 1 && options[0] == 'bomb') { var highest = this.highest(), _text = highest.username ? "".concat(highest.username, " gave the highest singe-tip with ").concat(highest.amount, " tokens") : "Nobody has tipped yet"; _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: message.user, text: _text, color: this.color, background: this.backgroundColor, cb: this.cb }); } //rate if (options.length == 1 && options[0] == 'rate') { var rate = this.tokenRate(), _text2 = !Number.isNaN(rate) ? "Token rate since the bot started:".concat(rate, " tokens/minute") : "Nobody has tipped yet"; _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: message.user, text: _text2, color: this.color, background: this.backgroundColor, cb: this.cb }); } //list if (options.length == 1 && options[0] == 'list') { var counter = 0; var _text3 = this.list().reduce(function (accumulator, current) { return accumulator + '\n' + "".concat(++counter, ". ").concat(current.username, " : ").concat(current.amount); }, '').trim('\n'); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: message.user, text: _text3, color: this.color, background: this.backgroundColor, cb: this.cb }); } //top5 if (options.length == 1 && options[0] == 'top5') { var _counter = 0; var _text4 = this.list(5).reduce(function (accumulator, current) { return accumulator + '\n' + "".concat(++_counter, ". ").concat(current.username, " : ").concat(current.amount); }, '').trim('\n'); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: message.user, text: _text4, color: this.color, background: this.backgroundColor, cb: this.cb }); } //stop if (options.length == 1 && options[0] == 'stop') { this.stop({ message: message }); } //run if (options.length == 1 && options[0] == 'run') { this.run({ message: message }); } //pause if (options.length == 1 && options[0] == 'pause') { this.pause({ message: message }); } } }, { key: "onStop", value: function onStop(data) { var text = "** ".concat(this.name, " status: STOPPED **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: data.user, text: text, color: 'red', background: 'white', cb: this.cb }); } }, { key: "onRun", value: function onRun(data) { var text = "** ".concat(this.name, " status: RUNNING **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: data.user, text: text, color: 'green', background: 'white', cb: this.cb }); } }, { key: "onPause", value: function onPause(data) { var text = "** ".concat(this.name, " status: PAUSED **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: data.user, text: text, color: 'orange', background: 'white', cb: this.cb }); } }, { key: "king", value: function king() { return this.stats.bestTipper(); } }, { key: "highest", value: function highest() { return this.stats.highestTip(); } }, { key: "tokenRate", value: function tokenRate() { return this.stats.tokenRate(); } }, { key: "list", value: function list() { var top = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return top ? this.stats.sumByUser().slice(0, top) : this.stats.sumByUser(); } }]); return Tipper; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/values.js": /*!**********************!*\ !*** ./js/values.js ***! \**********************/ /*! exports provided: unicodeChars */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unicodeChars", function() { return unicodeChars; }); var unicodeChars = { space: " ", dot: "\u22C5", // dot heart: "\u2665", // heart star: "\u2605", // filled star whiteStar: "\u2606", // white star square: "\u25FC", triangleRight: "\u25B6", dashChar: "\u2500", whiteHeart: "\u2661", arrow: "\u2192", triangleDown: "\u25BC", longDash: "\u2015", topLeftCorner: "\u250C", bottomLeftCorner: "\u2514", vertDash: "\u2502" }; /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vanMvYXBwLmpzIiwid2VicGFjazovLy8uL2pzL2JsYWNrX2xpc3QuanMiLCJ3ZWJwYWNrOi8vLy4vanMvYm90LmpzIiwid2VicGFjazovLy8uL2pzL2JvdF9tYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL2pzL2VjaG8uanMiLCJ3ZWJwYWNrOi8vLy4vanMva2VyYmVyb3MuanMiLCJ3ZWJwYWNrOi8vLy4vanMvbWVzc2VuZ2VyLmpzIiwid2VicGFjazovLy8uL2pzL25vdGlmaWVyLmpzIiwid2VicGFjazovLy8uL2pzL3N0YXRzLmpzIiwid2VicGFjazovLy8uL2pzL3N0YXR1cy5qcyIsIndlYnBhY2s6Ly8vLi9qcy90aGFua3NfbWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9qcy90aXBwZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvdmFsdWVzLmpzIl0sIm5hbWVzIjpbImFwcCIsIkJvdE1hbmFnZXIiLCJjYiIsImFkZCIsIktlcmJlcm9zIiwiTm90aWZpZXIiLCJUaXBwZXIiLCJNZXNzZW5nZXIiLCJUaGFua3NNYW5hZ2VyIiwiYmxhY2tMaXN0IiwidXNlcnMiLCJCb3QiLCJiYWNrZ3JvdW5kQ29sb3IiLCJjb2xvciIsIm5ld2xpbmUiLCJjb3JlQ29tbWFuZHMiLCJzdGF0cyIsIlN0YXRzIiwic3RhdHVzIiwiUlVOTklORyIsImNvbW1hbmQiLCJpbmNsdWRlcyIsIm1ldGhvZE5hbWUiLCJkYXRhIiwiUEFVU0VEIiwib25QYXVzZSIsIlNUT1BQRUQiLCJvblN0b3AiLCJvblJ1biIsIm1lc3NhZ2UiLCJwYXJzZU1lc3NhZ2UiLCJnZXRDb21tYW5kIiwibSIsImlzUnVubmluZyIsImlzQ29yZUNvbW1hbmQiLCJvcHRpb25zIiwicHJvY2Vzc0NvbW1hbmQiLCJ0aXAiLCJ1c2VyIiwibWVzc2FnZUFycmF5IiwicmVwbGFjZSIsInRyaW0iLCJzcGxpdCIsImFsaWFzIiwic2xpY2UiLCJjaGVja09wdGlvbiIsIm9wdGlvbiIsInBlcm1pc3Npb25zIiwiaXNfbW9kIiwiaW5kZXhPZiIsInJvb21fc2x1ZyIsImJvdHMiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJvbk1lc3NhZ2UiLCJvblRpcCIsIm9uRW50ZXIiLCJvbkxlYXZlIiwib25EcmF3UGFuZWwiLCJpZCIsImJvdCIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiRWNobyIsInRleHQiLCJsZW5ndGgiLCJ1bmljb2RlQ2hhcnMiLCJ0b3BMZWZ0Q29ybmVyIiwicmVwZWF0IiwiZGFzaENoYXIiLCJ2ZXJ0RGFzaCIsImJvdHRvbUxlZnRDb3JuZXIiLCJjaGFyIiwiZm9ybWF0UHJlZml4IiwibGluZXMiLCJtYXAiLCJsaW5lIiwiam9pbiIsInRpbWVzIiwicmVzdWx0IiwiZ3JvdXAiLCJpbnZlcnNlIiwiYmFja2dyb3VuZCIsInNlbmROb3RpY2UiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJwYXJzZUJsYWNrbGlzdCIsImJsYWNrbGlzdCIsInRvTG93ZXJDYXNlIiwiaXNQcml2aWxlZ2VkIiwiYmxhY2tsaXN0ZWQiLCJub3RpZnlBYnVzZSIsImNoZWNrUGVybWlzc2lvbiIsInB1c2giLCJzZW5kIiwicGFyc2UiLCJzb21lIiwiZWxlbWVudCIsInNlYXJjaCIsIml0ZW0iLCJ0ZXN0IiwiUmVnRXhwIiwibXNnIiwidGlwU3VtIiwiZ2V0Iiwic3VtRnJvbVVzZXIiLCJwcmVmaXgiLCJzZXR0aW5ncyIsImZvcm1hdExpbmVzIiwiaGlzdG9yeSIsIm9sZERhdGEiLCJiZXN0IiwiYmVzdFRpcHBlciIsImhpZ2hlc3QiLCJoaWdoZXN0VGlwIiwidXNlcm5hbWUiLCJmcm9tX3VzZXIiLCJhbW91bnQiLCJmYW4iLCJmcm9tX3VzZXJfaW5fZmFuY2x1YiIsInRpbWUiLCJuZXdEYXRhIiwibmV3QmVzdCIsIm5ld0hpZ2hlc3QiLCJyZWR1Y2UiLCJhY2N1bXVsYXRvciIsImN1cnJlbnQiLCJtaW51dGVzIiwicGFyc2VGbG9hdCIsInN1bSIsInRvRml4ZWQiLCJmb3VuZCIsImZpbmQiLCJNYXRoIiwibWF4Iiwic29ydCIsImEiLCJiIiwiaGlnaGVzdEJ5VXNlciIsInN1bUJ5VXNlciIsImZpbHRlciIsInJldmVyc2UiLCJoclRpbWUiLCJtaWxpc2Vjb25kcyIsInNlY29uZHMiLCJmbG9vciIsImgiLCJzIiwidGhhbmtzIiwic29ydFRoYW5rcyIsInBhcnNlSW50IiwibWluIiwicmV3cml0ZVJhbmdlIiwibXNncyIsInJhbmdlIiwiY2FuZGlkYXRlcyIsImdldENhbmRpZGF0ZXMiLCJyYW5kb20iLCJ0aXBBbW91bnQiLCJleGFjdCIsImNvbmNhdCIsImNoYW5nZXMiLCJhZGRUaXAiLCJzZW5kVGhhbmtzIiwic2VuZENoYW5nZXMiLCJzZW5kQm9sZCIsImdldFRoYW5rcyIsImtpbmciLCJyYXRlIiwidG9rZW5SYXRlIiwiTnVtYmVyIiwiaXNOYU4iLCJjb3VudGVyIiwibGlzdCIsInN0b3AiLCJydW4iLCJwYXVzZSIsInRvcCIsInNwYWNlIiwiZG90IiwiaGVhcnQiLCJzdGFyIiwid2hpdGVTdGFyIiwic3F1YXJlIiwidHJpYW5nbGVSaWdodCIsIndoaXRlSGVhcnQiLCJhcnJvdyIsInRyaWFuZ2xlRG93biIsImxvbmdEYXNoIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBMEMsZ0NBQWdDO0FBQzFFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQXdELGtCQUFrQjtBQUMxRTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBeUMsaUNBQWlDO0FBQzFFLHdIQUFnSCxtQkFBbUIsRUFB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QTtBQUFPLElBQU15RCxZQUFZLEdBQUc7QUFDcEJnSCxPQUFLLEVBQWMsR0FEQztBQUVwQkMsS0FBRyxFQUFnQixRQUZDO0FBRVM7QUFDN0JDLE9BQUssRUFBYyxRQUhDO0FBR1M7QUFDN0JDLE1BQUksRUFBZSxRQUpDO0FBSVM7QUFDN0JDLFdBQVMsRUFBVSxRQUxDO0FBS1M7QUFDN0JDLFFBQU0sRUFBYSxRQU5DO0FBT3BCQyxlQUFhLEVBQU0sUUFQQztBQVFwQm5ILFVBQVEsRUFBVyxRQVJDO0FBU3BCb0gsWUFBVSxFQUFTLFFBVEM7QUFVcEJDLE9BQUssRUFBYyxRQVZDO0FBV3BCQyxjQUFZLEVBQU8sUUFYQztBQVlwQkMsVUFBUSxFQUFXLFFBWkM7QUFhcEJ6SCxlQUFhLEVBQU0sUUFiQztBQWNwQkksa0JBQWdCLEVBQUcsUUFkQztBQWVwQkQsVUFBUSxFQUFXO0FBZkMsQ0FBckIsQyIsImZpbGUiOiJhcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL2pzL2FwcC5qc1wiKTtcbiIsImltcG9ydCB7Tm90aWZpZXJ9ICAgICAgZnJvbSAnLi9ub3RpZmllci5qcyc7XG5pbXBvcnQge1RpcHBlcn0gICAgICAgIGZyb20gJy4vdGlwcGVyLmpzJztcbmltcG9ydCB7TWVzc2VuZ2VyfSAgICAgZnJvbSAnLi9tZXNzZW5nZXIuanMnO1xuaW1wb3J0IHtCb3RNYW5hZ2VyfSAgICBmcm9tICcuL2JvdF9tYW5hZ2VyLmpzJztcbmltcG9ydCB7VGhhbmtzTWFuYWdlcn0gZnJvbSAnLi90aGFua3NfbWFuYWdlci5qcyc7XG5pbXBvcnQge0tlcmJlcm9zfSAgICAgIGZyb20gJy4va2VyYmVyb3MuanMnO1xuXG5jb25zdCBhcHAgPSBuZXcgQm90TWFuYWdlcihjYik7XG5hcHAuYWRkKCdrZXJiZXJvcycsIG5ldyBLZXJiZXJvcyhhcHAsIGNiKSk7XG5hcHAuYWRkKCdub3RpZmllcicsIG5ldyBOb3RpZmllcihhcHAsIGNiKSk7XG5hcHAuYWRkKCd0aXBwZXInLCBuZXcgVGlwcGVyKGFwcCwgY2IpKTtcbmFwcC5hZGQoJ21lc3NlbmdlcicsIG5ldyBNZXNzZW5nZXIoYXBwLCBjYikpO1xuYXBwLmFkZCgndGhhbmtzJywgbmV3IFRoYW5rc01hbmFnZXIoYXBwLCBjYikpOyIsImV4cG9ydCBjb25zdCBibGFja0xpc3QgPSB7XG5cdHVzZXJzOiBbXSxcblx0YmxhY2tMaXN0OiBbJ3NoaXQnLCAnd2hvcmUnLCAnYml0Y2gnLCAncmVtb3ZlIHNwYWNlJ11cbn07IiwiaW1wb3J0IHtTdGF0c30gZnJvbSAnLi9zdGF0cy5qcydcbmltcG9ydCB7c3RhdHVzfSBmcm9tICcuL3N0YXR1cy5qcyc7XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIENCIGJvdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCb3Qge1xuXHRiYWNrZ3JvdW5kQ29sb3IgPSAnJyA7XG5cdGNvbG9yICAgICAgICAgICA9ICcjMDAwMDAwJyA7XG5cdG5ld2xpbmUgICAgICAgICA9ICdcXG4nO1xuXHRjb3JlQ29tbWFuZHMgICAgPSBbJ3J1bicsJ3N0b3AnLCdwYXVzZSddO1xuXG5cdGNvbnN0cnVjdG9yKGFwcCwgY2IpIHtcblx0XHR0aGlzLmNiID0gY2I7XG5cdFx0dGhpcy5hcHAgPSBhcHA7XG5cdFx0dGhpcy5zdGF0cyA9IG5ldyBTdGF0cyhhcHAsIGNiKTtcblx0XHR0aGlzLnN0YXR1cyA9IHN0YXR1cy5SVU5OSU5HO1xuXHR9XG5cblx0aXNDb3JlQ29tbWFuZChjb21tYW5kKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29yZUNvbW1hbmRzLmluY2x1ZGVzKGNvbW1hbmQpO1xuXHR9XG5cblx0aGFzTWV0aG9kKG1ldGhvZE5hbWUpIHtcblx0XHRyZXR1cm4gdGhpc1ttZXRob2ROYW1lXSAmJiB0eXBlb2YgdGhpc1ttZXRob2ROYW1lXSA9PSAnZnVuY3Rpb24nO1xuXHR9XG5cblx0aXNSdW5uaW5nKCkge1xuXHRcdHJldHVybiB0aGlzLnN0YXR1cyA9PSBzdGF0dXMuUlVOTklORztcblx0fVxuXG5cdHBhdXNlKGRhdGEpIHtcblx0XHR0aGlzLnN0YXR1cyA9IHN0YXR1cy5QQVVTRUQ7XG5cdFx0dGhpcy5vblBhdXNlKGRhdGEpO1xuXHR9XG5cblx0c3RvcChkYXRhKSB7XG5cdFx0dGhpcy5zdGF0dXMgPSBzdGF0dXMuU1RPUFBFRDtcblx0XHR0aGlzLm9uU3RvcChkYXRhKTtcblx0fVxuXG5cdHJ1bihkYXRhKSB7XG5cdFx0dGhpcy5zdGF0dXMgPSBzdGF0dXMuUlVOTklORztcblx0XHR0aGlzLm9uUnVuKGRhdGEpO1xuXHR9XG5cblx0b25QYXVzZShkYXRhKSB7XG5cdFx0cmV0dXJuO1xuXHR9ICBcblxuXHRvblN0b3AoZGF0YSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdG9uUnVuKGRhdGEpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogW29uTWVzc2FnZSBkZXNjcmlwdGlvbl1cblx0ICogQHBhcmFtICB7b2JqZWN0fSBtZXNzYWdlIEluZm8gcmVsYXRlZCB0byB0aGUgbWVzc2FnZS5cblx0ICogQHJldHVybiB7W3R5cGVdfSAgICAgICAgIFtkZXNjcmlwdGlvbl1cblx0ICpcblx0ICogYzogbWVzc2FnZSBjb2xvclxuXHQgKiBtOiB0aGUgbWVzc2FnZSB0ZXh0XG5cdCAqIHVzZXI6IHVzZXJuYW1lIG9mIG1lc3NhZ2Ugc2VuZGVyXG5cdCAqIGY6IG1lc3NhZ2UgZm9udFxuXHQgKiBpbl9mYW5jbHViOiBpcyB0aGUgdXNlciBpbiB0aGUgYnJvYWRjYXN0ZXJzIGZhbiBjbHViXG5cdCAqIGhhc190b2tlbnM6IGRvZXMgdGhlIHVzZXIgaGF2ZSBhdCBsZWFzdCAxIHRva2VuXG5cdCAqIGlzX21vZDogaXMgdGhlIHVzZXIgYSBtb2RlcmF0b3Jcblx0ICogdGlwcGVkX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgYmx1ZeKAnT9cblx0ICogdGlwcGVkX2Fsb3RfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCccHVycGxl4oCdP1xuXHQgKiB0aXBwZWRfdG9uc19yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIHB1cnBsZeKAnT9cblx0ICogZ2VuZGVyOiDigJxt4oCdIChtYWxlKSwg4oCcZuKAnSAoZmVtYWxlKSwg4oCcc+KAnSAodHJhbnMpLCBvciDigJxj4oCdIChjb3VwbGUpXG5cdCAqL1xuXHRvbk1lc3NhZ2UobWVzc2FnZSkge1xuXHRcdHRoaXMucGFyc2VNZXNzYWdlKG1lc3NhZ2UpO1xuXHR9XG5cblx0cGFyc2VNZXNzYWdlKG1lc3NhZ2UpIHtcblx0XHRjb25zdCBjb21tYW5kID0gdGhpcy5nZXRDb21tYW5kKG1lc3NhZ2UubSk7XG5cdFx0aWYgKGNvbW1hbmQpIHtcblx0XHRcdCh0aGlzLmlzUnVubmluZygpIHx8IHRoaXMuaXNDb3JlQ29tbWFuZChjb21tYW5kLm9wdGlvbnNbMF0pKSAmJiAodHlwZW9mIHRoaXMucHJvY2Vzc0NvbW1hbmQgPT0gJ2Z1bmN0aW9uJykgJiYgdGhpcy5wcm9jZXNzQ29tbWFuZChjb21tYW5kLm9wdGlvbnMsIG1lc3NhZ2UpO1xuXHRcdFx0bWVzc2FnZVsnWC1TcGFtJ10gPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tbWFuZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBbb25UaXAgZGVzY3JpcHRpb25dXG5cdCAqIEBwYXJhbSAge29iamVjdH0gdGlwIEluZm8gcmVsYXRlZCB0byB0aGUgdGlwLiBcblx0ICogQHJldHVybiB7W3R5cGVdfSAgICAgW2Rlc2NyaXB0aW9uXVxuXHQgKiBcblx0ICogYW1vdW50OiBhbW91bnQgb2YgdGlwXG5cdCAqIG1lc3NhZ2U6IG1lc3NhZ2UgaW4gdGlwXG5cdCAqIHRvX3VzZXI6IHVzZXIgd2hvIHJlY2VpdmVkIHRpcFxuXHQgKiBmcm9tX3VzZXI6IHVzZXIgd2hvIHNlbnQgdGlwXG5cdCAqIGZyb21fdXNlcl9pbl9mYW5jbHViOiBpcyB0aGUgdXNlciBpbiB0aGUgYnJvYWRjYXN0ZXJzIGZhbiBjbHViXG5cdCAqIGZyb21fdXNlcl9oYXNfdG9rZW5zOiBkb2VzIHRoZSB1c2VyIGhhdmUgYXQgbGVhc3QgMSB0b2tlblxuXHQgKiBmcm9tX3VzZXJfaXNfbW9kOiBpcyB0aGUgdXNlciBhIG1vZGVyYXRvclxuXHQgKiBmcm9tX3VzZXJfdGlwcGVkX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgYmx1ZeKAnT9cblx0ICogZnJvbV91c2VyX3RpcHBlZF9hbG90X3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnHB1cnBsZeKAnT9cblx0ICogZnJvbV91c2VyX3RpcHBlZF90b25zX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgcHVycGxl4oCdP1xuXHQgKiBmcm9tX3VzZXJfZ2VuZGVyOiDigJxt4oCdIChtYWxlKSwg4oCcZuKAnSAoZmVtYWxlKSwg4oCcc+KAnSAodHJhbnMpLCBvciDigJxj4oCdIChjb3VwbGUpXG5cdCAqL1xuXHRvblRpcCh0aXApIHsgcmV0dXJuOyB9XG5cblx0LyoqXG5cdCAqIFtvbkVudGVyIGRlc2NyaXB0aW9uXVxuXHQgKiBAcGFyYW0gIHtvYmplY3R9IHVzZXIgSW5mbyByZWxhdGVkIHRvIHRoZSB1c2VyIHdobyBlbnRlcnMgdGhlIHJvb20uXG5cdCAqIEByZXR1cm4ge1t0eXBlXX0gICAgICBbZGVzY3JpcHRpb25dXG5cdCAqXG5cdCAqIHVzZXI6IHVzZXIgd2hvIGVudGVyZWQgdGhlIHJvb21cblx0ICogaW5fZmFuY2x1YjogaXMgdGhlIHVzZXIgaW4gdGhlIGJyb2FkY2FzdGVy4oCZcyBmYW4gY2x1YlxuXHQgKiBoYXNfdG9rZW5zOiBkb2VzIHRoZSB1c2VyIGhhdmUgYXQgbGVhc3QgMSB0b2tlblxuXHQgKiBpc19tb2Q6IGlzIHRoZSB1c2VyIGEgbW9kZXJhdG9yXG5cdCAqIHRpcHBlZF9yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIGJsdWXigJ0/XG5cdCAqIHRpcHBlZF9hbG90X3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnHB1cnBsZeKAnT9cblx0ICogdGlwcGVkX3RvbnNfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCcZGFyayBwdXJwbGXigJ0/XG5cdCAqIGdlbmRlcjog4oCcbeKAnSAobWFsZSksIOKAnGbigJ0gKGZlbWFsZSksIOKAnHPigJ0gKHRyYW5zKSwgb3Ig4oCcY+KAnSAoY291cGxlKVxuXHQgKi9cblx0b25FbnRlcih1c2VyKSB7IHJldHVybjsgfVxuXG5cdC8qKlxuXHQgKiBbb25MZWF2ZSBkZXNjcmlwdGlvbl1cblx0ICogQHBhcmFtICB7b2JqZWN0fSB1c2VyIEluZm8gcmVsYXRlZCB0byB0aGUgdXNlciB3aG8gbGVhdmVzIHRoZSByb29tLlxuXHQgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgW2Rlc2NyaXB0aW9uXVxuXHQgKiBcblx0ICogdXNlcjogdXNlciB3aG8gbGVmdCB0aGUgcm9vbVxuXHQgKiBpbl9mYW5jbHViOiBpcyB0aGUgdXNlciBpbiB0aGUgYnJvYWRjYXN0ZXLigJlzIGZhbiBjbHViXG5cdCAqIGhhc190b2tlbnM6IGRvZXMgdGhlIHVzZXIgaGF2ZSBhdCBsZWFzdCAxIHRva2VuXG5cdCAqIGlzX21vZDogaXMgdGhlIHVzZXIgYSBtb2RlcmF0b3Jcblx0ICogdGlwcGVkX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgYmx1ZeKAnT9cblx0ICogdGlwcGVkX2Fsb3RfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCccHVycGxl4oCdP1xuXHQgKiB0aXBwZWRfdG9uc19yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIHB1cnBsZeKAnT9cblx0ICogZ2VuZGVyOiDigJxt4oCdIChtYWxlKSwg4oCcZuKAnSAoZmVtYWxlKSwg4oCcc+KAnSAodHJhbnMpLCBvciDigJxj4oCdIChjb3VwbGUpXG5cdCAqL1xuXHRvbkxlYXZlKHVzZXIpIHsgcmV0dXJuOyB9XG5cblx0LyoqXG5cdCAqIFtvbkRyYXdQYW5lbCBkZXNjcmlwdGlvbl1cblx0ICogQHBhcmFtICB7b2plY3R9IHVzZXIgSW5mbyByZWxhdGVkIHRvIHRoZSB1c2VyIHdobyBlbnRlcnMgdGhlIHJvb20uXG5cdCAqIEByZXR1cm4ge1t0eXBlXX0gICAgICBbZGVzY3JpcHRpb25dXG5cdCAqXG5cdCAqIHVzZXI6IHVzZXIgd2hvIGVudGVyZWQgdGhlIHJvb21cblx0ICogaW5fZmFuY2x1YjogaXMgdGhlIHVzZXIgaW4gdGhlIGJyb2FkY2FzdGVy4oCZcyBmYW4gY2x1YlxuXHQgKiBoYXNfdG9rZW5zOiBkb2VzIHRoZSB1c2VyIGhhdmUgYXQgbGVhc3QgMSB0b2tlblxuXHQgKiBpc19tb2Q6IGlzIHRoZSB1c2VyIGEgbW9kZXJhdG9yXG5cdCAqIHRpcHBlZF9yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIGJsdWXigJ0/XG5cdCAqIHRpcHBlZF9hbG90X3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnHB1cnBsZeKAnT9cblx0ICogdGlwcGVkX3RvbnNfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCcZGFyayBwdXJwbGXigJ0/XG5cdCAqIGdlbmRlcjog4oCcbeKAnSAobWFsZSksIOKAnGbigJ0gKGZlbWFsZSksIOKAnHPigJ0gKHRyYW5zKSwgb3Ig4oCcY+KAnSAoY291cGxlKVxuXHQgKi9cblx0b25EcmF3UGFuZWwodXNlcikgeyByZXR1cm47IH1cblxuXHRnZXRDb21tYW5kKG1lc3NhZ2UpIHtcblx0XHRjb25zdCBtZXNzYWdlQXJyYXkgPSBtZXNzYWdlLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkuc3BsaXQoJyAnKTtcdFx0XG5cdFx0aWYgKHRoaXMuYWxpYXMgJiYgdGhpcy5hbGlhcy5pbmNsdWRlcyhtZXNzYWdlQXJyYXlbMF0pKSB7XG5cdFx0XHRyZXR1cm4ge2NvbW1hbmQ6bWVzc2FnZUFycmF5WzBdLCBvcHRpb25zOm1lc3NhZ2VBcnJheS5zbGljZSgxKX07XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGNoZWNrUGVybWlzc2lvbihvcHRpb25zLCBtZXNzYWdlKSB7XG5cdFx0cmV0dXJuIHRoaXMuY2hlY2tPcHRpb24oJyonLCBtZXNzYWdlKSB8fCB0aGlzLmNoZWNrT3B0aW9uKG9wdGlvbnNbMF0sIG1lc3NhZ2UpO1xuXHR9XG5cblx0Y2hlY2tPcHRpb24ob3B0aW9uLCBtZXNzYWdlKSB7XG5cdFx0aWYgKHRoaXMucGVybWlzc2lvbnNbb3B0aW9uXSkge1xuXHRcdFx0cmV0dXJuIChtZXNzYWdlLmlzX21vZCAmJiB0aGlzLnBlcm1pc3Npb25zW29wdGlvbl0uaW5kZXhPZignbScpID49IDApIHx8XG5cdFx0XHQgICAgICAgKG1lc3NhZ2UudXNlciA9PSB0aGlzLmNiLnJvb21fc2x1ZyAmJiB0aGlzLnBlcm1pc3Npb25zW29wdGlvbl0uaW5kZXhPZignYicpID49IDApIHx8XG5cdFx0XHQgICAgICAgKHRoaXMucGVybWlzc2lvbnNbb3B0aW9uXS5pbmRleE9mKCdhJykgPj0gMCk7XG5cdFx0fVxuXHR9XG59XG5cbi8vIGNvbnN0IGNvbmZpZyA9IHtcbi8vIFx0ZGVzY3JpcHRpb246ICcnLFxuLy8gXHRoZWxwIDogW1xuLy8gXHRcdHtcbi8vIFx0XHRcdGFjY2VzczonJyxcbi8vIFx0XHRcdHRleHQ6JycsXG4vLyBcdFx0fVxuLy8gXHRdXG4vLyB9IiwiZXhwb3J0IGNsYXNzIEJvdE1hbmFnZXIge1xuXHRjb25zdHJ1Y3RvcihjYikge1xuXHRcdHRoaXMuY2IgPSBjYjtcblx0XHR0aGlzLmJvdHMgPSB7fTtcblx0XHR0aGlzLnN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuXHRcdHRoaXMuY2Iub25NZXNzYWdlKChtZXNzYWdlKSA9PiB7XG5cdFx0XHR0aGlzLm9uTWVzc2FnZShtZXNzYWdlKTtcblx0XHR9KTtcblx0XHR0aGlzLmNiLm9uVGlwKCh0aXApID0+IHtcblx0XHRcdHRoaXMub25UaXAodGlwKTtcblx0XHR9KTtcblx0XHR0aGlzLmNiLm9uRW50ZXIoKHVzZXIpID0+IHtcblx0XHRcdHRoaXMub25FbnRlcih1c2VyKTtcblx0XHR9KTtcblx0XHR0aGlzLmNiLm9uTGVhdmUoKHVzZXIpID0+IHtcblx0XHRcdHRoaXMub25MZWF2ZSh1c2VyKTtcblx0XHR9KTtcblx0XHR0aGlzLmNiLm9uRHJhd1BhbmVsKCh1c2VyKSA9PiB7XG5cdFx0XHR0aGlzLm9uRHJhd1BhbmVsKHVzZXIpO1xuXHRcdH0pO1xuXHR9XG5cblx0YWRkKGlkLCBib3QpIHsgXG5cdFx0dGhpcy5ib3RzW2lkXSA9IGJvdDtcblx0fVxuXG5cdGdldChpZCkge1xuXHRcdHJldHVybiB0aGlzLmJvdHNbaWRdO1xuXHR9XG5cblx0cmVtb3ZlKGlkKSB7XG5cdFx0ZGVsZXRlIHRoaXMuYm90c1tpZF07XG5cdH1cblxuXHRvbk1lc3NhZ2UobWVzc2FnZSkge1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuYm90cykuZm9yRWFjaCgoaWQpID0+IHtcblx0XHRcdC8vIHRoaXMuY2IubG9nKGAke3RoaXMuYm90c1tpZF0ubmFtZX0gc3RhdHVzOiAke3RoaXMuYm90c1tpZF0uc3RhdHVzfWApXG5cdFx0XHQodHlwZW9mIHRoaXMuYm90c1tpZF0ub25NZXNzYWdlID09ICdmdW5jdGlvbicpICYmIHRoaXMuYm90c1tpZF0ub25NZXNzYWdlKG1lc3NhZ2UpO1xuXHRcdH0pO1xuXHR9XG5cblx0b25UaXAodGlwKSB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5ib3RzKS5mb3JFYWNoKChpZCkgPT4ge1xuXHRcdFx0dGhpcy5ib3RzW2lkXS5pc1J1bm5pbmcoKSAmJiAodHlwZW9mIHRoaXMuYm90c1tpZF0ub25UaXAgPT0gJ2Z1bmN0aW9uJykgJiYgdGhpcy5ib3RzW2lkXS5vblRpcCh0aXApO1xuXHRcdH0pO1xuXHR9XG5cblx0b25FbnRlcih1c2VyKSB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5ib3RzKS5mb3JFYWNoKChpZCkgPT4ge1xuXHRcdFx0dGhpcy5ib3RzW2lkXS5pc1J1bm5pbmcoKSAmJiAodHlwZW9mIHRoaXMuYm90c1tpZF0ub25FbnRlciA9PSAnZnVuY3Rpb24nKSAmJiB0aGlzLmJvdHNbaWRdLm9uRW50ZXIodXNlcik7XG5cdFx0fSk7XG5cdH1cblxuXHRvbkxlYXZlKHVzZXIpIHtcblx0XHRPYmplY3Qua2V5cyh0aGlzLmJvdHMpLmZvckVhY2goKGlkKSA9PiB7XG5cdFx0XHR0aGlzLmJvdHNbaWRdLmlzUnVubmluZygpICYmICh0eXBlb2YgdGhpcy5ib3RzW2lkXS5vbkxlYXZlID09ICdmdW5jdGlvbicpICYmIHRoaXMuYm90c1tpZF0ub25MZWF2ZSh1c2VyKTtcblx0XHR9KTtcblx0fVxuXG5cdG9uRHJhd1BhbmVsKHVzZXIpIHtcblx0XHRPYmplY3Qua2V5cyh0aGlzLmJvdHMpLmZvckVhY2goKGlkKSA9PiB7XG5cdFx0XHR0aGlzLmJvdHNbaWRdLmlzUnVubmluZygpICYmICh0eXBlb2YgdGhpcy5ib3RzW2lkXS5vbkRyYXdQYW5lbCA9PSAnZnVuY3Rpb24nKSAmJiB0aGlzLmJvdHNbaWRdLm9uRHJhd1BhbmVsKHVzZXIpO1xuXHRcdH0pO1xuXHR9XG59XG5cblxuXG4iLCJpbXBvcnQge3VuaWNvZGVDaGFyc30gZnJvbSAnLi92YWx1ZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgRWNobyB7XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIGZvcm1hdCBtZXNzYWdlcyAvL1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XG5cdHN0YXRpYyBmb3JtYXRMaW5lcyh0ZXh0LCBsZW5ndGg9MTApIHtcblx0XHRyZXR1cm4gYCR7dW5pY29kZUNoYXJzLnRvcExlZnRDb3JuZXJ9JHtFY2hvLnJlcGVhdCh1bmljb2RlQ2hhcnMuZGFzaENoYXIsIGxlbmd0aCl9XG5cdFx0ICAgICAgICAke3VuaWNvZGVDaGFycy52ZXJ0RGFzaH0gJHt0ZXh0fVxuXHRcdCAgICAgICAgJHt1bmljb2RlQ2hhcnMuYm90dG9tTGVmdENvcm5lcn0ke0VjaG8ucmVwZWF0KHVuaWNvZGVDaGFycy5kYXNoQ2hhciwgbGVuZ3RoKX1gO1xuXHR9XG5cblx0c3RhdGljIGZvcm1hdEJyYWNrZXQodGV4dCwgY2hhcikge1xuXHRcdHJldHVybiBgJHtFY2hvLnJlcGVhdChjaGFyLDQpfVxuXHRcdCAgICAgICAgJHtFY2hvLmZvcm1hdFByZWZpeChjaGFyKX1cblx0XHQgICAgICAgICR7RWNoby5yZXBlYXQoY2hhciw0KX1gO1xuXHR9XG5cblx0c3RhdGljIGZvcm1hdFByZWZpeCh0ZXh0LCBjaGFyKSB7XG5cdFx0bGV0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG5cdFx0cmV0dXJuIGxpbmVzLm1hcChsaW5lID0+IGAke2NoYXJ9ICR7bGluZX1gKS5qb2luKCdcXG4nKTtcblx0fVxuXG5cdHN0YXRpYyByZXBlYXQoY2hhciwgdGltZXMpIHtcblx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cdFx0d2hpbGUodGltZXMtLSkgcmVzdWx0ICs9IGNoYXI7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBzZW5kIG5vdGljZXMgLy9cblx0Ly8vLy8vLy8vLy8vLy8vLy8vXG5cblx0c3RhdGljIHNlbmQoe2dyb3VwPScnLCB1c2VyID0gJycsIGludmVyc2UgPSBmYWxzZSwgY29sb3IsIGJhY2tncm91bmQsIHRleHQsIGNifSkge1xuXHRcdGludmVyc2UgJiYgKFtiYWNrZ3JvdW5kLCBjb2xvcl0gPSBbY29sb3IsIGJhY2tncm91bmRdKTtcblx0XHRjYi5zZW5kTm90aWNlKHRleHQsIHVzZXIsIGJhY2tncm91bmQsIGNvbG9yLCAnbm9ybWFsJywgZ3JvdXApO1xuXHR9XG5cblx0c3RhdGljIHNlbmRCb2xkKHtncm91cD0nJywgdXNlciA9ICcnLCBpbnZlcnNlID0gZmFsc2UsIGNvbG9yLCBiYWNrZ3JvdW5kLCB0ZXh0LCBjYn0pIHtcblx0XHRpbnZlcnNlICYmIChbYmFja2dyb3VuZCwgY29sb3JdID0gW2NvbG9yLCBiYWNrZ3JvdW5kXSk7XG5cdFx0Y2Iuc2VuZE5vdGljZSh0ZXh0LCB1c2VyLCBiYWNrZ3JvdW5kLCBjb2xvciwgJ2JvbGQnLCBncm91cCk7XG5cdH1cblxufSIsImltcG9ydCB7Qm90fSAgZnJvbSBcIi4vYm90LmpzXCI7XG5pbXBvcnQge0VjaG99ICBmcm9tIFwiLi9lY2hvLmpzXCI7XG5pbXBvcnQge2JsYWNrTGlzdH0gZnJvbSAnLi9ibGFja19saXN0LmpzJztcblxuZXhwb3J0IGNsYXNzIEtlcmJlcm9zIGV4dGVuZHMgQm90IHtcblx0bmFtZSAgICAgICAgICAgID0gJ1NQQU0vYWJ1c2UgZmlsdGVyIGJvdCc7XG5cdGRlc2NyaXB0aW9uICAgICA9ICdBIGJvdCBmb3IgaGFuZGxpbmcgaW5zdWx0cywgYWJ1c2l2ZSBsYW5ndWFnZSwgU1BBTSc7XG5cdGFsaWFzICAgICAgICAgICA9IFsnIWtlcicsJy9rZXInXTtcblx0cGVybWlzc2lvbnMgICAgID0geydhZGQtdXNlcic6J2JtJywgJ2FkZC10ZXh0JzonYm0nfTtcblxuXHRjb25zdHJ1Y3RvcihhcHAsIGNiKSB7XG5cdFx0c3VwZXIoYXBwLCBjYik7XG5cdFx0dGhpcy51c2VycyAgICAgPSB0aGlzLnBhcnNlQmxhY2tsaXN0KGJsYWNrTGlzdC51c2Vycyk7XG5cdFx0dGhpcy5ibGFja2xpc3QgPSB0aGlzLnBhcnNlQmxhY2tsaXN0KGJsYWNrTGlzdC5ibGFja0xpc3QpO1xuXHR9XG5cblx0b25NZXNzYWdlKG1lc3NhZ2UpIHtcblx0XHRpZiAoIXRoaXMucGFyc2VNZXNzYWdlKG1lc3NhZ2UpKSB7XG5cdFx0XHQodGhpcy51c2Vycy5pbmNsdWRlcyhtZXNzYWdlLnVzZXIudG9Mb3dlckNhc2UoKSkgfHwgKCF0aGlzLmlzUHJpdmlsZWdlZChtZXNzYWdlKSAmJiB0aGlzLmJsYWNrbGlzdGVkKG1lc3NhZ2UubS50b0xvd2VyQ2FzZSgpKSAmJiB0aGlzLm5vdGlmeUFidXNlKG1lc3NhZ2UubSwgbWVzc2FnZS51c2VyKSkpICYmIChtZXNzYWdlWydYLVNwYW0nXSA9IHRydWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWVzc2FnZTtcblx0fVxuXG5cdGlzUHJpdmlsZWdlZChtZXNzYWdlKSB7XG5cdFx0cmV0dXJuIHRoaXMuY2Iucm9vbV9zbHVnID09IG1lc3NhZ2UudXNlciB8fCBtZXNzYWdlLmlzX21vZDsgXG5cdH1cblxuXHRwcm9jZXNzQ29tbWFuZChvcHRpb25zLCBtZXNzYWdlKSB7XG5cdFx0aWYgKCF0aGlzLmNoZWNrUGVybWlzc2lvbihvcHRpb25zLCBtZXNzYWdlKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGFkZC11c2VyXG5cdFx0aWYgKG9wdGlvbnMubGVuZ3RoID4gMSAmJiBvcHRpb25zWzBdID09ICdhZGQtdXNlcicpIHtcblx0XHRcdG9wdGlvbnMuc2xpY2UoMSkuZm9yRWFjaCgodXNlcikgPT4ge1xuXHRcdFx0XHQhdGhpcy51c2Vycy5pbmNsdWRlcyh1c2VyKSAmJiB0aGlzLnVzZXJzLnB1c2godXNlcikgJiYgRWNoby5zZW5kKHt1c2VyOiBtZXNzYWdlLnVzZXIsIHRleHQ6IGB1c2VyICR7dXNlcn0gaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGJsYWNrbGlzdGAsIGNvbG9yOiAncmVkJywgYmFja2dyb3VuZDogJ2JsYWNrJywgY2I6IHRoaXMuY2J9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBhZGQtdGV4dFxuXHRcdGlmIChvcHRpb25zLmxlbmd0aCA+IDEgJiYgb3B0aW9uc1swXSA9PSAnYWRkLXRleHQnKSB7XG5cdFx0XHRjb25zdCBzdGFydCA9IG1lc3NhZ2UubS5pbmRleE9mKCdhZGQtdGV4dCcpICsgJ2FkZC10ZXh0Jy5sZW5ndGgsXG5cdFx0XHQgICAgICB0ZXh0ICA9IG1lc3NhZ2UubS5zbGljZShzdGFydCkudHJpbSgpO1xuXHRcdFx0IXRoaXMuYmxhY2tsaXN0LmluY2x1ZGVzKHRleHQpICYmIHRoaXMuYmxhY2tsaXN0LnB1c2godGhpcy5wYXJzZSh0ZXh0KSkgJiYgRWNoby5zZW5kKHt1c2VyOiBtZXNzYWdlLnVzZXIsIHRleHQ6IGAke3RleHR9IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBibGFja2xpc3RgLCBjb2xvcjogJ3JlZCcsIGJhY2tncm91bmQ6ICdibGFjaycsIGNiOiB0aGlzLmNifSk7XG5cdFx0fVxuXHR9XG5cblx0YmxhY2tsaXN0ZWQodGV4dCkge1xuXHRcdHJldHVybiB0aGlzLmJsYWNrbGlzdC5zb21lKGVsZW1lbnQgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnKVxuXHRcdFx0XHRyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGVsZW1lbnQpO1xuXHRcdFx0aWYgKHR5cGVvZiBlbGVtZW50ID09ICdvYmplY3QnKVxuXHRcdFx0XHRyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpLnNlYXJjaChlbGVtZW50KTtcblx0XHR9KTtcblx0fVxuXG5cdHBhcnNlQmxhY2tsaXN0KGJsYWNrbGlzdCkge1xuXHRcdHJldHVybiBibGFja2xpc3QubWFwKGl0ZW0gPT4ge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2UoaXRlbSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwYXJzZSh0ZXh0KXtcblx0XHRpZiAoL15cXC8uKlxcLyQvLnRlc3QodGV4dCkpIHtcblx0XHRcdHJldHVybiBuZXcgUmVnRXhwKHRleHQuc2xpY2UoMSwtMSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpO1xuXHR9XG5cblx0bm90aWZ5QWJ1c2UobWVzc2FnZSwgdXNlcikge1xuXHRcdGNvbnN0IGNiID0gdGhpcy5jYixcblx0XHRcdCAgdGV4dCA9IGBNZXNzYWdlICcke21lc3NhZ2V9JyBcXG5mcm9tICR7dXNlcn0gXFxuaGFzIGJlZW4gc2lsZW5jZWQgYnkga2VyYmVyb3MuYDtcblx0XHRFY2hvLnNlbmQoe2dyb3VwOidyZWQnLCB0ZXh0LCBjb2xvcjogJ3JlZCcsIGJhY2tncm91bmQ6ICdibGFjaycsIGNifSk7XG5cdFx0RWNoby5zZW5kKHt1c2VyOiB0aGlzLmNiLnJvb21fc2x1ZywgdGV4dCwgY29sb3I6ICdyZWQnLCBiYWNrZ3JvdW5kOiAnYmxhY2snLCBjYn0pO1xuXHR9XG59IiwiaW1wb3J0ICB7Qm90fSBmcm9tIFwiLi9ib3QuanNcIjtcblxuZXhwb3J0IGNsYXNzIE1lc3NlbmdlciBleHRlbmRzIEJvdCB7XG4gICAgbmFtZSA9ICdNZXNzZW5nZXIgYm90JztcblxuXHRjb25zdHJ1Y3RvcihhcHAsIGNiKXtcblx0XHRzdXBlcihhcHAsY2IpO1xuXHR9XHRcblxuXHRvbk1lc3NhZ2UobXNnKSB7XG5cdFx0Y29uc3QgdGlwU3VtID0gdGhpcy5hcHAuZ2V0KCd0aXBwZXInKS5zdGF0cy5zdW1Gcm9tVXNlcihtc2cudXNlciksXG4gICAgICAgICAgICAgIHByZWZpeCA9IHRpcFN1bSA+IDAgPyBgWyR7dGlwU3VtfV0gYDonJztcbiAgICAgICAgbXNnLm0gPSBgJHtwcmVmaXh9JHttc2cubX1gO1xuXHR9XG59IiwiaW1wb3J0IHtCb3R9ICAgICAgICAgIGZyb20gJy4vYm90LmpzJztcbmltcG9ydCB7VGhhbmtzTWFuYWdlcn0gZnJvbSBcIi4vdGhhbmtzX21hbmFnZXIuanNcIjtcbmltcG9ydCB7RWNob30gICAgICAgIGZyb20gXCIuL2VjaG8uanNcIjtcblxuLyoqXG4gKiBOb3RpZmllci5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vdGlmaWVyIGV4dGVuZHMgQm90IHtcblx0bmFtZSAgICAgICAgICAgID0gJ05vdGlmaWVyIGJvdCc7XG5cdGRlc2NyaXB0aW9uICAgICA9ICdBIGJvdCBmb3IgaGFuZGxpbmcgbm90aWZpY2F0aW9ucyc7XG5cdGFsaWFzICAgICAgICAgICA9IFsnIW5vdCcsJy9ub3QnXTtcblx0cGVybWlzc2lvbnMgICAgID0geycqJzogJ2JtJ307XG5cdHRleHQgICAgICAgICAgICA9ICcnO1xuXHRcblx0Y29uc3RydWN0b3IoYXBwLCBjYiwgc2V0dGluZ3MgPSB7fSkge1xuXHRcdHN1cGVyKGFwcCwgY2IpO1xuXHRcdHNldHRpbmdzLmNvbG9yICAgICAgICAgICB8fCAodGhpcy5jb2xvciA9IHNldHRpbmdzLmNvbG9yKTtcblx0XHRzZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3IgfHwgKHRoaXMuYmFja2dyb3VuZENvbG9yID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yKTtcblx0fVxuXG5cdHByb2Nlc3NDb21tYW5kKG9wdGlvbnMsIG1lc3NhZ2UpIHtcblx0XHRpZiAoIXRoaXMuY2hlY2tQZXJtaXNzaW9uKG9wdGlvbnMsIG1lc3NhZ2UpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFxuXHRcdHRoaXMudGV4dCA9IG9wdGlvbnMuam9pbignICcpO1xuXHRcdHRoaXMudGV4dCA9IEVjaG8uZm9ybWF0TGluZXModGhpcy50ZXh0KTtcblx0XHRFY2hvLnNlbmQoe2NiOnRoaXMuY2IsIHRleHQ6IHRoaXMudGV4dH0pO1xuXHR9XG5cblx0b25FbnRlcih1c2VyKSB7XG5cdFx0RWNoby5zZW5kKHtjYjp0aGlzLmNiLCB1c2VyOnVzZXIudXNlciwgdGV4dDogYGhlbGxvICR7dXNlci51c2VyfSFgfSk7XG5cdH1cbn0iLCJleHBvcnQgY2xhc3MgU3RhdHMge1xuXHRuYW1lID0gJ1N0YXRzJztcblxuXHRjb25zdHJ1Y3RvcihhcHAsIGNiKSB7XG5cdFx0dGhpcy5hcHAgPSBhcHA7XG5cdFx0dGhpcy5jYiA9IGNiO1xuXHRcdHRoaXMuaGlzdG9yeSA9IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHRpcCBlbnRyeSB0byB0aGUgaGlzdG9yeS5cblx0ICogQHBhcmFtIHtvYmplY3R9IHRpcCBUaXAgZGF0YS5cblx0ICogQHJldHVybiB7b2JqZWN0fSBEYXRhIGhvbGRpbmcgdGhlIGNoYW5nZXMuXG5cdCAqL1xuXHRhZGRUaXAodGlwKSB7XG4gICAgICAgIGNvbnN0IG9sZERhdGEgPSB7YmVzdDogdGhpcy5iZXN0VGlwcGVyKCksIGhpZ2hlc3Q6dGhpcy5oaWdoZXN0VGlwKCl9O1xuXHRcdHRoaXMuaGlzdG9yeS5wdXNoKHtcblx0XHRcdHVzZXJuYW1lOiB0aXAuZnJvbV91c2VyLFxuXHRcdFx0YW1vdW50ICA6IHRpcC5hbW91bnQsXG5cdFx0XHRmYW4gICAgIDogdGlwLmZyb21fdXNlcl9pbl9mYW5jbHViLFxuXHRcdFx0dGltZSAgICA6IERhdGUubm93KClcblx0XHR9KTtcblxuICAgICAgICBjb25zdCBuZXdEYXRhID0ge2Jlc3Q6IHRoaXMuYmVzdFRpcHBlcigpLCBoaWdoZXN0OnRoaXMuaGlnaGVzdFRpcCgpfSxcbiAgICAgICAgICAgICAgbmV3QmVzdCA9IG9sZERhdGEuYmVzdC51c2VybmFtZSA9PSBuZXdEYXRhLmJlc3QudXNlcm5hbWUgPyAnJzogbmV3RGF0YS5iZXN0LFxuICAgICAgICAgICAgICBuZXdIaWdoZXN0ID0gb2xkRGF0YS5oaWdoZXN0LmFtb3VudCA9PSBuZXdEYXRhLmhpZ2hlc3QuYW1vdW50ID8gJyc6IG5ld0RhdGEuaGlnaGVzdDtcblxuXHRcdHJldHVybiB7YmVzdDogbmV3QmVzdCwgaGlnaGVzdDogbmV3SGlnaGVzdH07XG5cdH1cblxuXHRzdW0oKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGlzdG9yeS5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiB7XG5cdFx0XHRyZXR1cm4gYWNjdW11bGF0b3IgKyBjdXJyZW50LmFtb3VudDtcblx0XHR9LCAwKTtcblx0fVxuXG5cdHRva2VuUmF0ZSgpIHtcblx0XHRjb25zdCBtaW51dGVzID0gKERhdGUubm93KCkgLSB0aGlzLmFwcC5zdGFydCkvKDYwKjEwMDApO1xuXHRcdHJldHVybiBwYXJzZUZsb2F0KCh0aGlzLnN1bSgpL21pbnV0ZXMpLnRvRml4ZWQoMikpO1xuXHR9XG5cblx0aGlnaGVzdEJ5VXNlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5oaXN0b3J5LnJlZHVjZSgoYWNjdW11bGF0b3IsY3VycmVudCk9Pntcblx0XHRcdGxldCBmb3VuZCA9IGFjY3VtdWxhdG9yLmZpbmQoaXRlbSA9PiBpdGVtLnVzZXJuYW1lID09IGN1cnJlbnQudXNlcm5hbWUpO1xuXHRcdFx0aWYoIWZvdW5kKSB7IFxuXHRcdFx0XHRmb3VuZCA9IHt1c2VybmFtZTogY3VycmVudC51c2VybmFtZSwgYW1vdW50OiAwfTtcblx0XHRcdFx0YWNjdW11bGF0b3IucHVzaChmb3VuZCk7XG5cdFx0XHR9XG5cdFx0XHRmb3VuZC5hbW91bnQgPSBNYXRoLm1heChmb3VuZC5hbW91bnQsIGN1cnJlbnQuYW1vdW50KTtcblx0XHRcdHJldHVybiBhY2N1bXVsYXRvcjtcblx0XHR9LFtdKS5zb3J0KChhLCBiKSA9PiB7XG5cdFx0XHRyZXR1cm4gYi5hbW91bnQgLSBhLmFtb3VudDtcblx0XHR9KTtcblx0fVxuXG5cdGhpZ2hlc3RUaXAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGlnaGVzdEJ5VXNlcigpWzBdIHx8IHt1c2VybmFtZTogJycsIGFtb3VudDowfTtcblx0fVxuXG5cdHN1bUJ5VXNlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5oaXN0b3J5LnJlZHVjZSgoYWNjdW11bGF0b3IsY3VycmVudCk9Pntcblx0XHRcdGxldCBmb3VuZCA9IGFjY3VtdWxhdG9yLmZpbmQoaXRlbSA9PiBpdGVtLnVzZXJuYW1lID09IGN1cnJlbnQudXNlcm5hbWUpO1xuXHRcdFx0aWYoIWZvdW5kKSB7IFxuXHRcdFx0XHRmb3VuZCA9IHt1c2VybmFtZTogY3VycmVudC51c2VybmFtZSwgYW1vdW50OiAwfTtcblx0XHRcdFx0YWNjdW11bGF0b3IucHVzaChmb3VuZCk7XG5cdFx0XHR9XG5cdFx0XHRmb3VuZC5hbW91bnQgICArPSBjdXJyZW50LmFtb3VudDtcblx0XHRcdHJldHVybiBhY2N1bXVsYXRvcjtcblx0XHR9LFtdKS5zb3J0KChhLCBiKSA9PiB7XG5cdFx0XHRyZXR1cm4gYi5hbW91bnQgLSBhLmFtb3VudDtcblx0XHR9KTtcblx0fVxuXG5cdGJlc3RUaXBwZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc3VtQnlVc2VyKClbMF0gfHwge3VzZXJuYW1lOiAnJywgYW1vdW50OjB9O1xuXHR9XG5cblx0c3VtRnJvbVVzZXIodXNlcm5hbWUpIHtcblx0XHRyZXR1cm4gdGhpcy5oaXN0b3J5LmZpbHRlcihpdGVtID0+IHtcblx0XHRcdHJldHVybiB1c2VybmFtZSA9PSBpdGVtLnVzZXJuYW1lO1xuXHRcdH0pLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IHtcblx0XHRcdHJldHVybiBhY2N1bXVsYXRvciArIGN1cnJlbnQuYW1vdW50O1xuXHRcdH0sIDApO1xuXHR9XG5cblx0c3VtRnJvbUZhbnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGlzdG9yeS5maWx0ZXIoaXRlbSA9PiB7XG5cdFx0XHRyZXR1cm4gaXRlbS5mYW47XG5cdFx0fSkucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4ge1xuXHRcdFx0cmV0dXJuIGFjY3VtdWxhdG9yICsgY3VycmVudC5hbW91bnQ7XG5cdFx0fSwgMCk7XG5cdH1cblxuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gdGhpcy5oaXN0b3J5LnJldmVyc2UoKS5tYXAoKGl0ZW0pID0+IHtcblx0XHRcdHJldHVybiBgJHtpdGVtLnVzZXJuYW1lfTogJHtpdGVtLmFtb3VudH0gdG9rZW5zOiAke1N0YXRzLmhyVGltZShpdGVtLnRpbWUpfWA7XG5cdFx0fSkuam9pbignXFxuJyk7XG5cdH1cblxuXHRzdGF0aWMgaHJUaW1lKG1pbGlzZWNvbmRzKSB7XG5cdFx0Y29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IobWlsaXNlY29uZHMgLyAxMDAwKTtcblx0XHRjb25zdCBoID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gMzYwMCk7XG5cdFx0Y29uc3QgbSA9IE1hdGguZmxvb3IoKHNlY29uZHMgJSAzNjAwKSAvIDYwKTtcblx0XHRjb25zdCBzID0gc2Vjb25kcyAlIDYwOyBcblx0XHRyZXR1cm4gKGggPiAwID8gaCArICdob3VyJyArIChoID4gMSA/ICdzICcgOiAnICcpIDogJycpICsgKHMgPT0gMCAmJiBtID4gMCA/ICdhbmQgJyA6ICcnKSArXG4gICAgICAgICAgICAgICAobSA+IDAgPyBtICsgJ21pbnV0ZScgKyAobSA+IDEgPyAncyAnIDogJyAnKSA6ICcnKSArIChzID4gMCAmJiBoICsgbSA+IDAgPyAnYW5kICcgOiAnJykgK1xuICAgICAgICAgICAgICAgKHMgPiAwID8gcyArICdzZWNvbmQnICsgKHMgPiAxID8gJ3MgJyA6ICcgJykgOiAnJykgKyAnYWdvJztcblx0fVxufSIsImV4cG9ydCBjb25zdCBzdGF0dXMgPSB7XG5cdFNUT1BQRUQ6IC0xLFxuXHRQQVVTRUQ6IDAsXG5cdFJVTk5JTkc6IDEsXG59IiwiaW1wb3J0IHtCb3R9IGZyb20gXCIuL2JvdC5qc1wiO1xuZXhwb3J0IGNsYXNzIFRoYW5rc01hbmFnZXIgZXh0ZW5kcyBCb3Qge1xuXHRuYW1lID0gJ1RoYW5rcyBtYW5hZ2VyIGJvdCc7XG5cblx0Y29uc3RydWN0b3IoYXBwLCBjYikge1xuXHRcdHN1cGVyKGFwcCxjYik7XG5cdFx0dGhpcy50aGFua3MgPSB7XG5cdFx0XHQnMS0xMCcgOiBbXG5cdFx0XHRcdCdUaGFua3MgJHUsIGtlZXAgdGhlbSBjb21taW5nIDspJyxcblx0XHRcdFx0J0kgc2VlIHlvdSAkdS4gVGhhbmtzIGZvciB0aGUgdGlwJ1xuXHRcdFx0XSxcblx0XHRcdCc2OSc6W1xuXHRcdFx0XHQnJHQgdG9rZW5zIHVoPyBpcyB0aGF0IGEgc3VnZ2VzdGlvbj8nLFxuXHRcdFx0XHQnJHQgaXMgbXkgZmF2b3JpdGUgbnVtYmVyISBob3cgZGlkIHlvdSBrbm93LCAkdT8nLFxuXHRcdFx0XHQnJHQgaXMgZnVuLCBkb25cXCd0IHlvdSB0aGluaz8geW91IGxpa2UgdG8gYmUgb24gdG9wLCAkdT8gSSBkbydcblx0XHRcdF0sXG5cdFx0XHQnMzAwLSc6W1xuXHRcdFx0XHQnRnVjayBtZSAkdSwgSVxcJ20gYWxsIHlvdXJzLCB0aGFuayB5b3Ugc28gbXVjaCEnLFxuXHRcdFx0XHQnS2VlcCB0aXBwaW5nIGxpa2UgdGhpcyBhbmQgbXkgcHVzc3kgaXMgeW91cnMgZm9yZXZlciAkdSdcblx0XHRcdF0sXG5cdFx0XHQnMTAxLTIwMCc6W1xuXHRcdFx0XHQnWW91XFwncmUgc28gZ2VuZXJvdXMsICR1IScsXG5cdFx0XHRcdCdMb3ZlIHlvdSwgJHUhICR0IHRva2VucyEgPDMgPDMnXG5cdFx0XHRdLFxuXHRcdFx0JzEtMTAwJzogW1xuXHRcdFx0XHQnVGhhbmsgeW91ICR1IScsIFxuXHRcdFx0XHQnU28gc3dlZXQgb2YgeW91LCAkdScsXG5cdFx0XHRcdCdUaGFua3MgJHUhJ1xuXHRcdFx0XSxcblx0XHRcdCcyMDEtMzAwJzpbXG5cdFx0XHRcdCckdCB0b2tlbnMhIHRoYXRcXCdzIGluc2FuZSAkdSEnXG5cdFx0XHRdLFxuXHRcdFx0JzEwMDAtJyA6IFtcblx0XHRcdFx0J1llcywgeWVzLCBZRVNTU1NTUyAkdSEgdGhhbmsgeW91ISEhJyxcblx0XHRcdFx0J1llZWVlZWVoYSwgJHUhIGxldCBtZSByaWRlIHlvdSBsaWtlIGEgY293Z2lybCB3aGlsZSB5b3UgZ3JhYiBteSBib29icy4gVGhhbmtzIGEgbG90ISEnLFxuXHRcdFx0XHQnQXJlIHlvdSBpbnRvIGFuYWwgc2V4LCAkdT8gYmVjYXVzZSBJIGFtIGFuZCBhcyBhIGdlc3R1cmUgb2YgZ3JhdGl0dWRlIEkgd2FudCB5b3UgdG8gZGVzdHJveSBteSBhc3Mgc28gYmFkJyxcblx0XHRcdF0sXG5cdFx0XHQnNTAwMC0nOiBbXG5cdFx0XHRcdCdPSCBNWSBHT0QhISAkdCBmdWNraW5nIHRva2VucyEhIEZ1Y2sgbWUgdW50aWwgSSBiZWcgeW91IHRvIHN0b3AuLi4gYW5kIHRoZW4ga2VlcCBnb2luZyEgSSBsb3ZlIGl0IScsXG5cdFx0XHRcdCckdCBmdWNraW5nIHRva2VucyEhISBPTUcgLi4uTXkgcHVzc3kgaXMgeW91cnMgJHUsIG15IGFzcyBpcyB5b3VycywgbXkgbW91dGggaXMgeW91ci4gVXNlIHRoZW0gYXMgeW91IHBsZWFzZS4nXG5cdFx0XHRdXG5cblx0XHR9O1xuXHRcdHRoaXMuc29ydFRoYW5rcygpO1xuXHR9XG5cblx0c29ydFRoYW5rcygpIHtcblx0XHR0aGlzLnRoYW5rcyA9IE9iamVjdC5rZXlzKHRoaXMudGhhbmtzKS5zb3J0KChhLGIpID0+IHtcblx0XHRcdGlmKGEuaW5kZXhPZignLScpIDwgMCAmJiBiLmluZGV4T2YoJy0nKSA8IDApXG5cdFx0XHRcdHJldHVybiBwYXJzZUludChhKSAtIHBhcnNlSW50KGIpO1xuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPCAwICYmIGIuaW5kZXhPZignLScpID49IDApXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdGlmKGEuaW5kZXhPZignLScpID49IDAgJiYgYi5pbmRleE9mKCctJykgPCAwKVxuXHRcdFx0XHRyZXR1cm4gMTtcblxuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPT0gMCAmJiBiLmluZGV4T2YoJy0nKSA9PSAwKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUludChhLnNwbGl0KCctJylbMV0pIC0gcGFyc2VJbnQoYi5zcGxpdCgnLScpWzFdKTtcblx0XHRcdH1cblx0XHRcdGlmKGEuaW5kZXhPZignLScpID09IDAgJiYgYi5pbmRleE9mKCctJykgPiAwKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUludChhLnNwbGl0KCctJylbMV0pIC0gcGFyc2VJbnQoYi5zcGxpdCgnLScpWzFdKTtcdFx0XHRcdFxuXHRcdFx0fVxuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPiAwICYmIGIuaW5kZXhPZignLScpID09IDApIHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlSW50KGEuc3BsaXQoJy0nKVsxXSkgLSBwYXJzZUludChiLnNwbGl0KCctJylbMV0pO1xuXHRcdFx0fVxuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPiAwICYmIGIuaW5kZXhPZignLScpID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoYS5zcGxpdCgnLScpWzBdKSAtIHBhcnNlSW50KGIuc3BsaXQoJy0nKVswXSk7XG5cdFx0XHR9XG5cdFx0fSkubWFwKChpdGVtKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtaW46IHRoaXMucmV3cml0ZVJhbmdlKGl0ZW0pLnNwbGl0KCctJylbMF0sIFxuXHRcdFx0XHRtYXg6IHRoaXMucmV3cml0ZVJhbmdlKGl0ZW0pLnNwbGl0KCctJylbMV0gfHwgdGhpcy5yZXdyaXRlUmFuZ2UoaXRlbSkuc3BsaXQoJy0nKVswXSwgXG5cdFx0XHRcdG1zZ3M6IHRoaXMudGhhbmtzW2l0ZW1dXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cblx0cmV3cml0ZVJhbmdlKHJhbmdlKSB7XG5cdFx0aWYgKHJhbmdlLmluZGV4T2YoJy0nKT09MClcblx0XHRcdHJldHVybiBgMSR7cmFuZ2V9YDtcblxuXHRcdGlmKHJhbmdlLmluZGV4T2YoJy0nKT09KHJhbmdlLmxlbmd0aC0xKSlcblx0XHRcdHJldHVybiBgJHtyYW5nZX0xMDAwMDAwYDtcblxuXHRcdHJldHVybiByYW5nZTtcblx0fVxuXG5cdGdldFRoYW5rcyh0aXApIHtcblx0XHRjb25zdCBjYW5kaWRhdGVzID0gdGhpcy5nZXRDYW5kaWRhdGVzKHRpcC5hbW91bnQpO1xuXHRcdHJldHVybiBjYW5kaWRhdGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1hdGguZmxvb3IoY2FuZGlkYXRlcy5sZW5ndGgpKV0uXG5cdFx0XHRcdHJlcGxhY2UoJyR1JywgdGlwLmZyb21fdXNlcikuXG5cdFx0XHRcdHJlcGxhY2UoJyR0JywgdGlwLmFtb3VudCk7XG5cdH1cblxuXHRnZXRDYW5kaWRhdGVzKHRpcEFtb3VudCkge1xuXHRcdGxldCBleGFjdCA9IHRoaXMudGhhbmtzLmZpbHRlcihpdGVtID0+IHtcblx0XHRcdHJldHVybiB0aXBBbW91bnQgPT0gaXRlbS5tYXggJiYgdGlwQW1vdW50ID09IGl0ZW0ubWluOyBcblx0XHR9KTtcblx0XHRpZihleGFjdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gZXhhY3QubWFwKGl0ZW0gPT4ge1xuXHRcdFx0XHRyZXR1cm4gaXRlbS5tc2dzO1xuXHRcdFx0fSkucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IuY29uY2F0KGN1cnJlbnQpLFtdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy50aGFua3MuZmlsdGVyKGl0ZW0gPT4ge1xuXHRcdFx0cmV0dXJuIHRpcEFtb3VudCA8PSBpdGVtLm1heCAmJiB0aXBBbW91bnQgPj0gaXRlbS5taW47IFxuXHRcdH0pLm1hcChpdGVtID0+IHtcblx0XHRcdHJldHVybiBpdGVtLm1zZ3M7XG5cdFx0fSkucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IuY29uY2F0KGN1cnJlbnQpLFtdKTtcblx0fVxufSIsImltcG9ydCB7Qm90fSAgZnJvbSAnLi9ib3QuanMnO1xuaW1wb3J0IHtFY2hvfSBmcm9tIFwiLi9lY2hvLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUaXBwZXIgZXh0ZW5kcyBCb3R7XG4gICAgbmFtZSAgICAgICAgICAgID0gJ1RpcHBlciBib3QnO1xuICAgIGRlc2NyaXB0aW9uICAgICA9ICdBIGJvdCBmb3IgaGFuZGxpbmcgdGlwcyc7XG4gICAgYWxpYXMgICAgICAgICAgID0gWychdGlwcicsJy90aXByJ107XG4gICAgcGVybWlzc2lvbnMgICAgID0geydraW5nJzogJ2JtYScsXG4gICAgICAgICAgICAgICAgICAgICAgICdib21iJzogJ2JtYScsXG4gICAgICAgICAgICAgICAgICAgICAgICdyYXRlJzogJ2JtYScsXG4gICAgICAgICAgICAgICAgICAgICAgICdsaXN0JzogJ2JtYScsXG4gICAgICAgICAgICAgICAgICAgICAgICd0b3A1JzogJ2JtYScsXG4gICAgICAgICAgICAgICAgICAgICAgICdzdG9wJzonYicsXG4gICAgICAgICAgICAgICAgICAgICAgICdydW4nOidiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3BhdXNlJzonYid9O1xuICAgIGNvbG9yID0gJyNiN2ZmMDAnO1xuICAgIGJhY2tncm91bmRDb2xvciA9ICcjNDgwMGZmJ1xuXG5cdGNvbnN0cnVjdG9yKGFwcCwgY2IpIHtcblx0XHRzdXBlcihhcHAsIGNiKTtcblx0fVxuXG5cdG9uVGlwKHRpcCkge1xuICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5zdGF0cy5hZGRUaXAodGlwKTtcbiAgICAgICAgdGhpcy5zZW5kVGhhbmtzKHRpcCk7XG4gICAgICAgIHRoaXMuc2VuZENoYW5nZXMoY2hhbmdlcyk7XG5cdH1cblxuICAgIHNlbmRDaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgY29uc3QgY2IgPSB0aGlzLmNiO1xuICAgICAgICBpZiAoY2hhbmdlcy5iZXN0ICE9ICcnKVxuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7Y2IsIHRleHQ6IGAke2NoYW5nZXMuYmVzdC51c2VybmFtZX0gaXMgbXkgbmV3IEtJTkdgLCBjb2xvcjoneWVsbG93JywgYmFja2dyb3VuZDonYmxhY2snfSlcblxuICAgICAgICBpZiAoY2hhbmdlcy5oaWdoZXN0ICE9ICcnKVxuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7Y2IsIHRleHQ6IGAke2NoYW5nZXMuaGlnaGVzdC51c2VybmFtZX0gaG9sZHMgdGhlIEhJR0hFU1QgdGlwIHdpdGggJHtjaGFuZ2VzLmhpZ2hlc3QuYW1vdW50fSB0b2tlbnNgLCBjb2xvcjoneWVsbG93JywgYmFja2dyb3VuZDonYmxhY2snfSlcbiAgICB9XG5cblx0c2VuZFRoYW5rcyh0aXApIHtcblx0XHRjb25zdCBjYiA9IHRoaXMuY2IsXG4gICAgICAgICAgICAgIHRoYW5rcyA9IHRoaXMuYXBwLmdldCgndGhhbmtzJyksXG4gICAgICAgICAgICAgIHRleHQgPSB0aGFua3MuZ2V0VGhhbmtzKHRpcCk7XG5cbiAgICAgICAgRWNoby5zZW5kQm9sZCh7Y2IsIHRleHQsIGNvbG9yOid5ZWxsb3cnLCBiYWNrZ3JvdW5kOidibGFjayd9KVxuXHR9XG5cbiAgICBwcm9jZXNzQ29tbWFuZChvcHRpb25zLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGVja1Blcm1pc3Npb24ob3B0aW9ucywgbWVzc2FnZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGtpbmdcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAna2luZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGtpbmcgPSB0aGlzLmtpbmcoKSxcbiAgICAgICAgICAgICAgICAgIHRleHQgPSBraW5nLnVzZXJuYW1lID8gXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtraW5nLnVzZXJuYW1lfSBpcyBteSBraW5nIHRpcHBlciB3aXRoICR7a2luZy5hbW91bnR9IHRva2Vuc2AgOlxuICAgICAgICAgICAgICAgICAgICAgICAgYE5vb2R5IGhhcyB0aXBwZWQgeWV0YDtcbiAgICAgICAgICAgIEVjaG8uc2VuZEJvbGQoe3VzZXI6IG1lc3NhZ2UudXNlciwgdGV4dCwgY29sb3I6IHRoaXMuY29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYjogdGhpcy5jYn0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYm9tYlxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMSAmJiBvcHRpb25zWzBdID09ICdib21iJykge1xuICAgICAgICAgICAgY29uc3QgaGlnaGVzdCA9IHRoaXMuaGlnaGVzdCgpLFxuICAgICAgICAgICAgICAgICAgdGV4dCA9IGhpZ2hlc3QudXNlcm5hbWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7aGlnaGVzdC51c2VybmFtZX0gZ2F2ZSB0aGUgaGlnaGVzdCBzaW5nZS10aXAgd2l0aCAke2hpZ2hlc3QuYW1vdW50fSB0b2tlbnNgIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGBOb2JvZHkgaGFzIHRpcHBlZCB5ZXRgO1xuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogbWVzc2FnZS51c2VyLCB0ZXh0LCBjb2xvcjogdGhpcy5jb2xvciwgYmFja2dyb3VuZDogdGhpcy5iYWNrZ3JvdW5kQ29sb3IsIGNiOiB0aGlzLmNifSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL3JhdGVcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAncmF0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhdGUgPSB0aGlzLnRva2VuUmF0ZSgpLFxuICAgICAgICAgICAgICAgICAgdGV4dCA9ICFOdW1iZXIuaXNOYU4ocmF0ZSk/XG4gICAgICAgICAgICAgICAgICAgICAgICBgVG9rZW4gcmF0ZSBzaW5jZSB0aGUgYm90IHN0YXJ0ZWQ6JHtyYXRlfSB0b2tlbnMvbWludXRlYCA6XG4gICAgICAgICAgICAgICAgICAgICAgICBgTm9ib2R5IGhhcyB0aXBwZWQgeWV0YDtcbiAgICAgICAgICAgIEVjaG8uc2VuZEJvbGQoe3VzZXI6IG1lc3NhZ2UudXNlciwgdGV4dCwgY29sb3I6IHRoaXMuY29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYjogdGhpcy5jYn0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9saXN0XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PSAxICYmIG9wdGlvbnNbMF0gPT0gJ2xpc3QnKSB7XG4gICAgICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5saXN0KCkucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT57XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yICsgJ1xcbicgKyBgJHsrK2NvdW50ZXJ9LiAke2N1cnJlbnQudXNlcm5hbWV9IDogJHtjdXJyZW50LmFtb3VudH1gO1xuICAgICAgICAgICAgfSwnJykudHJpbSgnXFxuJyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIEVjaG8uc2VuZEJvbGQoe3VzZXI6IG1lc3NhZ2UudXNlciwgdGV4dCwgY29sb3I6IHRoaXMuY29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYjogdGhpcy5jYn0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy90b3A1XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PSAxICYmIG9wdGlvbnNbMF0gPT0gJ3RvcDUnKSB7XG4gICAgICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5saXN0KDUpLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+e1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvciArICdcXG4nICsgYCR7Kytjb3VudGVyfS4gJHtjdXJyZW50LnVzZXJuYW1lfSA6ICR7Y3VycmVudC5hbW91bnR9YDtcbiAgICAgICAgICAgIH0sJycpLnRyaW0oJ1xcbicpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBFY2hvLnNlbmRCb2xkKHt1c2VyOiBtZXNzYWdlLnVzZXIsIHRleHQsIGNvbG9yOiB0aGlzLmNvbG9yLCBiYWNrZ3JvdW5kOiB0aGlzLmJhY2tncm91bmRDb2xvciwgY2I6IHRoaXMuY2J9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vc3RvcFxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMSAmJiBvcHRpb25zWzBdID09ICdzdG9wJykge1xuICAgICAgICAgICAgdGhpcy5zdG9wKHttZXNzYWdlfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL3J1blxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMSAmJiBvcHRpb25zWzBdID09ICdydW4nKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bih7bWVzc2FnZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9wYXVzZVxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMSAmJiBvcHRpb25zWzBdID09ICdwYXVzZScpIHtcbiAgICAgICAgICAgIHRoaXMucGF1c2Uoe21lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uU3RvcChkYXRhKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBgKiogJHt0aGlzLm5hbWV9IHN0YXR1czogU1RPUFBFRCAqKmA7XG4gICAgICAgIEVjaG8uc2VuZEJvbGQoe3VzZXI6IGRhdGEudXNlciwgdGV4dCwgY29sb3I6ICdyZWQnLCBiYWNrZ3JvdW5kOid3aGl0ZScsIGNiOiB0aGlzLmNifSk7XG4gICAgICAgIFxuICAgIH1cblxuICAgIG9uUnVuKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGAqKiAke3RoaXMubmFtZX0gc3RhdHVzOiBSVU5OSU5HICoqYDtcbiAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogZGF0YS51c2VyLCB0ZXh0LCBjb2xvcjogJ2dyZWVuJywgYmFja2dyb3VuZDond2hpdGUnLCBjYjogdGhpcy5jYn0pO1xuICAgIH1cblxuICAgIG9uUGF1c2UoZGF0YSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gYCoqICR7dGhpcy5uYW1lfSBzdGF0dXM6IFBBVVNFRCAqKmA7XG4gICAgICAgIEVjaG8uc2VuZEJvbGQoe3VzZXI6IGRhdGEudXNlciwgdGV4dCwgY29sb3I6ICdvcmFuZ2UnLCBiYWNrZ3JvdW5kOid3aGl0ZScsIGNiOiB0aGlzLmNifSk7XG4gICAgfVxuXG4gICAga2luZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHMuYmVzdFRpcHBlcigpO1xuICAgIH1cblxuICAgIGhpZ2hlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRzLmhpZ2hlc3RUaXAoKTtcbiAgICB9XG5cbiAgICB0b2tlblJhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRzLnRva2VuUmF0ZSgpO1xuICAgIH1cblxuICAgIGxpc3QodG9wID0gMCkge1xuICAgICAgICByZXR1cm4gdG9wID8gdGhpcy5zdGF0cy5zdW1CeVVzZXIoKS5zbGljZSgwLHRvcCkgOiB0aGlzLnN0YXRzLnN1bUJ5VXNlcigpO1xuICAgIH1cbn0iLCJleHBvcnQgY29uc3QgdW5pY29kZUNoYXJzID0ge1xuICAgICAgICBzcGFjZSAgICAgICAgICAgIDogJ1xcdTAwMjAnLFxuICAgICAgICBkb3QgICAgICAgICAgICAgIDogJ1xcdTIyYzUnLCAvLyBkb3RcbiAgICAgICAgaGVhcnQgICAgICAgICAgICA6ICdcXHUyNjY1JywgLy8gaGVhcnRcbiAgICAgICAgc3RhciAgICAgICAgICAgICA6ICdcXHUyNjA1JywgLy8gZmlsbGVkIHN0YXJcbiAgICAgICAgd2hpdGVTdGFyICAgICAgICA6ICdcXHUyNjA2JywgLy8gd2hpdGUgc3RhclxuICAgICAgICBzcXVhcmUgICAgICAgICAgIDogJ1xcdTI1ZmMnLFxuICAgICAgICB0cmlhbmdsZVJpZ2h0ICAgIDogJ1xcdTI1YjYnLFxuICAgICAgICBkYXNoQ2hhciAgICAgICAgIDogJ1xcdTI1MDAnLFxuICAgICAgICB3aGl0ZUhlYXJ0ICAgICAgIDogJ1xcdTI2NjEnLFxuICAgICAgICBhcnJvdyAgICAgICAgICAgIDogJ1xcdTIxOTInLFxuICAgICAgICB0cmlhbmdsZURvd24gICAgIDogJ1xcdTI1YmMnLFxuICAgICAgICBsb25nRGFzaCAgICAgICAgIDogJ1xcdTIwMTUnLFxuICAgICAgICB0b3BMZWZ0Q29ybmVyICAgIDogJ1xcdTI1MGMnLFxuICAgICAgICBib3R0b21MZWZ0Q29ybmVyIDogJ1xcdTI1MTQnLFxuICAgICAgICB2ZXJ0RGFzaCAgICAgICAgIDogJ1xcdTI1MDInIFxuICAgIH07Il0sInNvdXJjZVJvb3QiOiIifQ==
© Copyright Chaturbate 2011- 2024. All Rights Reserved.