您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
移除政治相关条幅或替换为社会主义核心价值观、今日诗词,替换政治相关 Logo 为原版 Logo,去除政治相关通知,让技术远离政治。
当前为
/******/ (() => { // webpackBootstrap /******/ "use strict"; var __webpack_exports__ = {}; ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/junit/Junit.ts 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); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Junit = /*#__PURE__*/function () { function Junit() { _classCallCheck(this, Junit); } _createClass(Junit, null, [{ key: "replace", value: function replace() { if (location.href === 'https://junit.org/junit5/') { $(this.selectors.junitAbout).prevAll().remove(); $(this.selectors.junitLogo).attr('src', this.junitLogoUrl); $(this.selectors.junitFavicon).attr('href', this.junitLogoUrl); } } }]); return Junit; }(); _defineProperty(Junit, "selectors", { junitAbout: '#about', junitLogo: 'img[src="/junit5/assets/img/junit5-logo.png"]', junitFavicon: 'link[rel="icon"]' }); _defineProperty(Junit, "junitLogoUrl", 'https://raw.iqiq.io/duanluan/tampermonkey-scripts/main/core-socialist-values/src/junit/imgs/junit5-logo.png'); ;// CONCATENATED MODULE: ./utils/src/gm/Store.ts function Store_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Store_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 Store_createClass(Constructor, protoProps, staticProps) { if (protoProps) Store_defineProperties(Constructor.prototype, protoProps); if (staticProps) Store_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } /** * 存储 */ var Store = /*#__PURE__*/function () { function Store() { Store_classCallCheck(this, Store); } Store_createClass(Store, null, [{ key: "get", value: /** * 获取 * @param key 键 */ function get(key) { // @ts-ignore return GM_getValue(key); } /** * 设置 * @param key 键 * @param value 值 */ }, { key: "set", value: function set(key, value) { // @ts-ignore GM_setValue(key, value); } }]); return Store; }(); ;// CONCATENATED MODULE: ./utils/src/gm/enum/HttpDataType.ts var HttpDataType; (function (HttpDataType) { HttpDataType["JSON"] = "JSON"; })(HttpDataType || (HttpDataType = {})); ;// CONCATENATED MODULE: ./utils/src/gm/Http.ts function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { Http_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function Http_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function Http_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Http_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 Http_createClass(Constructor, protoProps, staticProps) { if (protoProps) Http_defineProperties(Constructor.prototype, protoProps); if (staticProps) Http_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } var Http = /*#__PURE__*/function () { function Http() { Http_classCallCheck(this, Http); } Http_createClass(Http, null, [{ key: "get", value: function get(option) { option['method'] = 'GET'; // 同步时返回 Promise if (option.synchronous) { return new Promise(function (resolve, reject) { // @ts-ignore GM_xmlhttpRequest(_objectSpread(_objectSpread({}, option), {}, { onload: function onload(response) { resolve(option.dataType === HttpDataType.JSON ? JSON.parse(response.responseText) : response.responseText); }, onerror: function onerror(error) { reject(error); } })); }); } else { var onload1 = function onload1(details) { var response; if (option.dataType === HttpDataType.JSON) { response = JSON.parse(details.responseText); } else { response = details.response; } option.onload(response); }; // @ts-ignore GM_xmlhttpRequest(_objectSpread(_objectSpread({}, option), {}, { onload: onload1 })); } } }]); return Http; }(); ;// CONCATENATED MODULE: ./utils/src/gm/MenuCmd.ts function MenuCmd_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function MenuCmd_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 MenuCmd_createClass(Constructor, protoProps, staticProps) { if (protoProps) MenuCmd_defineProperties(Constructor.prototype, protoProps); if (staticProps) MenuCmd_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } /** * 选项菜单 */ var MenuCmd = /*#__PURE__*/function () { function MenuCmd() { MenuCmd_classCallCheck(this, MenuCmd); } MenuCmd_createClass(MenuCmd, null, [{ key: "register", value: /** * 注册 * @param name 名称 * @param fn 点击菜单时执行的函数 */ function register(name, fn) { // @ts-ignore return GM_registerMenuCommand(name, fn); } /** * 注销 * @param menuCmdId 注册时返回的 ID */ }, { key: "unregister", value: function unregister(menuCmdId) { // @ts-ignore GM_unregisterMenuCommand(menuCmdId); } }]); return MenuCmd; }(); ;// CONCATENATED MODULE: ./core-socialist-values/src/common/Options.ts function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function Options_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Options_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 Options_createClass(Constructor, protoProps, staticProps) { if (protoProps) Options_defineProperties(Constructor.prototype, protoProps); if (staticProps) Options_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Options_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Options = /*#__PURE__*/function () { function Options() { Options_classCallCheck(this, Options); } Options_createClass(Options, null, [{ key: "registerBoolOption", value: /** * 选项 Key */ /** * 选项 * @private */ /** * 注册 bool 类型的选项 * @param option 选项 */ function registerBoolOption(option) { var _this = this; var val = option.value, valIsBool = typeof val === 'boolean'; if (!valIsBool) { return; } // 注册选项 var currentMenuCmdId = MenuCmd.register((val ? '☑️ ' : '🔲 ') + option.label, function () { // 点击值取反 option.value = !option.value; Store.set(option.name, JSON.stringify(option)); // 取消注册 MenuCmd.unregister(currentMenuCmdId); // 重新注册 _this.registerBoolOption(option); // 刷新页面 window.location.reload(); }); // 保存选项 ID option.menuCmdId = currentMenuCmdId; Store.set(option.name, JSON.stringify(option)); } /** * 注册所有选项 */ }, { key: "registerAll", value: function registerAll() { MenuCmd.register('更多设置', function () { window.open('https://greasyfork.org/scripts/440854', '_blank'); }); var _iterator = _createForOfIteratorHelper(this.options), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var option = _step.value; // TODO 【调试】不保留选项的值,每次都从 Store 中获取 // Store.set(option.name, null); var storeOption = null; try { storeOption = JSON.parse(Store.get(option.name)); } catch (e) { // FIXME 一段时间后可删除 try catch console.warn('旧的选项值非 JSON 格式'); storeOption = option; } // 如果选项不存在 || 版本不一致 时重置选项 if (storeOption === null || !storeOption['version'] || storeOption['version'] < option.version) { Store.set(option.name, JSON.stringify(option)); storeOption = option; } this.registerBoolOption(storeOption); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } /** * 在页面中加载选项 */ }, { key: "loadInGreasyfork", value: function loadInGreasyfork() { var _this2 = this; if (location.host !== 'greasyfork.org' || location.href.indexOf('/scripts/440854') == -1) { return; } var selector = { scriptLinks: '#script-links', scriptOptions: '#script-options', scriptContent: '#script-content' }; var $body = $('body'), $scriptLinks = $(selector.scriptLinks), $scriptContent = $(selector.scriptContent); // 添加脚本设置的选项卡 $scriptLinks.children('li:eq(0)').after("<li><a href=\"javascript:;\" id=\"script-options\">\u811A\u672C\u8BBE\u7F6E</a></li>"); $body.on('click', selector.scriptOptions, function () { var $scriptOptions = $(selector.scriptOptions); // 点击脚本设置的菜单样式 var $currentLi = $scriptLinks.children('li.current'); $currentLi.html("<a href=\"".concat(location.href, "\">").concat($currentLi.text(), "</a>")); $currentLi.removeClass('current'); $scriptOptions.parent().addClass('current'); // 添加脚本设置的内容 var scriptContent = ''; var _iterator2 = _createForOfIteratorHelper(_this2.options), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var option = _step2.value; var storeOption = JSON.parse(Store.get(option.name)), optionName = storeOption.name, optionVal = storeOption.value; scriptContent += "<h3>".concat(option.label, "</h3>"); switch (optionName) { case Options.Keys.removeBar: scriptContent += "<label><input type=\"checkbox\" id=\"script-options-".concat(optionName, "\" ").concat(optionVal ? 'checked' : '', "> \u662F\u5426\u9690\u85CF\u6761\u5E45\uFF08\u52FE\u9009\u540E\u5C06\u9690\u85CF\u6761\u5E45\u800C\u4E0D\u662F\u66FF\u6362\u5176\u5185\u5BB9\uFF09</label>"); break; case Options.Keys.jinrishici: scriptContent += "<label><input type=\"checkbox\" id=\"script-options-".concat(optionName, "-enabled\" ").concat(optionVal ? 'checked' : '', "> \u542F\u7528<a href=\"https://www.jinrishici.com\" target = \"_blank\">\u4ECA\u65E5\u8BD7\u8BCD</a>\uFF08\u4ECD\u9700\u53D6\u6D88\u52FE\u9009\u201C\u662F\u5426\u9690\u85CF\u6761\u5E45\u201D\u624D\u80FD\u751F\u6548\uFF09</label>"); break; } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } $scriptContent.html(scriptContent); // region 添加脚本设置的事件 // 是否隐藏条幅 var optionSelector = '#script-options-' + Options.Keys.removeBar; $body.on('change', optionSelector, function () { var removeBarOption = JSON.parse(Store.get(Options.Keys.removeBar)); removeBarOption.value = !removeBarOption.value; // 重新注册菜单 MenuCmd.unregister(removeBarOption.menuCmdId); _this2.registerBoolOption(removeBarOption); }); // 启用今日诗词 optionSelector = '#script-options-' + Options.Keys.jinrishici + '-enabled'; $body.on('change', optionSelector, function () { var jinrishiciOption = JSON.parse(Store.get(Options.Keys.jinrishici)); jinrishiciOption.value = !jinrishiciOption.value; // 重新注册菜单 MenuCmd.unregister(jinrishiciOption.menuCmdId); _this2.registerBoolOption(jinrishiciOption); }); // endregion }); } }]); return Options; }(); Options_defineProperty(Options, "Keys", { removeBar: 'removeBar', jinrishici: 'jinrishici' }); Options_defineProperty(Options, "options", [{ label: '隐藏条幅', name: Options.Keys.removeBar, version: 1, value: false, menuCmdId: null }, { label: '今日诗词', name: Options.Keys.jinrishici, version: 1, value: false, menuCmdId: null, token: '' }]); ;// CONCATENATED MODULE: ./core-socialist-values/src/common/Bar.ts function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return generator._invoke = function (innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; }(innerFn, self, context), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; this._invoke = function (method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); }; } function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (undefined === method) { if (context.delegate = null, "throw" === context.method) { if (delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method)) return ContinueSentinel; context.method = "throw", context.arg = new TypeError("The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, define(Gp, "constructor", GeneratorFunctionPrototype), define(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (object) { var keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function Bar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Bar_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 Bar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bar_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Bar_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Bar = /*#__PURE__*/function () { function Bar() { Bar_classCallCheck(this, Bar); } Bar_createClass(Bar, null, [{ key: "replace", value: /** * 替换条幅的选择器 */ /** * 替换后的条幅去除空格换行后的文本 * @private */ /** * 是否启用今日诗词 * @private */ /** * 今日诗词内容 * @private */ /** * 替换条幅 * @param options { * barSelector: string, // 条幅选择器 * isObserveBar: boolean, // 是否监听条幅变化 * hideBarSelector: string, // 隐藏条幅选择器 * isObserveHideBar: boolean, // 是否监听隐藏条幅变化 * followUpObserveSelector?: string, // 后续监听选择器 * csvCallback?: Function // 替换后回调 * } */ function replace(options) { var _this = this; if (!$(options.barSelector).text().match(/ukraine|乌克兰|black|黑人/i)) { return; } // 如果移除横幅 if (JSON.parse(Store.get(Options.Keys.removeBar)).value) { // 隐藏横幅 $(options.hideBarSelector).hide(); if (options.isObserveHideBar) { var i = 0; // 隐藏条幅首次加载:监听条幅变化,变化后再次执行 var observer = new MutationObserver(function () { $(options.hideBarSelector).hide(); // 替换两次后结束监听 if (i >= 1) { observer.disconnect(); } i++; }); observer.observe($(options.hideBarSelector)[0], { childList: true, subtree: true }); } return; } this.storeJinrishiciVal = JSON.parse(Store.get(Options.Keys.jinrishici)).value; if (this.storeJinrishiciVal) { this.getJinrishici().then(function (data) { _this.jinrishiciContent = data; _this.replaceObserver(options); }); } else { this.replaceObserver(options); } } /** * 替换条幅监听 * @param options * @private */ }, { key: "replaceObserver", value: function replaceObserver(options) { var _this2 = this; // 首次替换横幅 this.replaceBar(options.barSelector, options.csvCallback, options.jinrishiciCallback); if (!options.isObserveBar) { return; } var i = 0; // 条幅首次加载:监听条幅变化,变化后再次执行 var observer = new MutationObserver(function () { _this2.replaceBar(options.barSelector, options.csvCallback, options.jinrishiciCallback); // 替换两次后结束监听 if (i >= 1) { observer.disconnect(); } i++; }); observer.observe($(options.barSelector)[0], { childList: true }); if (options.followUpObserveSelector) { // 后续变化 new MutationObserver(function () { _this2.replaceBar(options.barSelector, options.csvCallback, options.jinrishiciCallback); }).observe($(options.followUpObserveSelector)[0], { childList: true }); } } /** * 实际替换条幅 * @param selector 条幅选择器 * @param csvCallback 替换后回调 * @param jinrishiciCallback 替换为今日诗词后回调 * @private */ }, { key: "replaceBar", value: function replaceBar(selector, csvCallback, jinrishiciCallback) { if ($($(selector)[0]).text().replace(/\s+/g, "") === Bar.txt) { return; } if (this.storeJinrishiciVal) { $(selector).css({ 'minHeight': '30px', 'lineHeight': '30px' }); $(selector).html("\n <div class=\"csv_bar\">\n ".concat(this.jinrishiciContent, "\n </div>")); if (jinrishiciCallback) { jinrishiciCallback(); } return; } $(selector).css({ 'minHeight': '40px' }); $(selector).html("\n <div class=\"csv_bar\">\n <ul class='csv_bar_ul'><li>\u5BCC\u5F3A</li><li>\u6C11\u4E3B</li><li>\u6587\u660E</li><li>\u548C\u8C10</li><li>\u81EA\u7531</li><li>\u5E73\u7B49</li><li>\u516C\u6B63</li><li>\u6CD5\u6CBB</li><li>\u7231\u56FD</li><li>\u656C\u4E1A</li><li>\u8BDA\u4FE1</li><li>\u53CB\u5584</li></ul><br>\n <ul class='csv_bar_ul'><li>Prosperity</li><li>Democracy</li><li>Civility</li><li>Harmony</li><li>Freedom</li><li>Equality</li><li>Justice</li><li>Rule of law</li><li>Patriotism</li><li>Dedication</li><li>Integrity</li><li>Friendship</li>\n </ul>\n </div>"); // 避免出现多个导致样式添加失败 var $bar = $(this.replaceBarSelector.bar); if ($bar.length == 2) { $bar.eq(0).remove(); } var barUlSelector = this.replaceBarSelector.barUl; $(barUlSelector).css({ 'display': 'inline-block', 'listStyle': 'none', 'margin': 0, 'padding': 0, 'width': 'auto' }); $(barUlSelector + ' li').css({ 'color': '#DE2910', 'fontWeight': 'bold', 'fontFamily': 'KaiTi', 'float': 'left', 'paddingRight': '10px', 'min-width': '80px', 'textAlign': 'center' }); $(barUlSelector + ':first').css('verticalAlign', 'bottom'); $(barUlSelector + ':first li').css('fontSize', '18px'); $(barUlSelector + ':eq(1) li').css('fontSize', '13px'); if (csvCallback) { csvCallback(); } } /** * 获取今日诗词 * @private */ }, { key: "getJinrishici", value: function () { var _getJinrishici = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { var jinrishiciOption, response; return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: jinrishiciOption = JSON.parse(Store.get(Options.Keys.jinrishici)); if (jinrishiciOption.value) { _context.next = 3; break; } return _context.abrupt("return"); case 3: _context.next = 5; return Http.get({ url: 'https://v2.jinrishici.com/one.json', dataType: HttpDataType.JSON, // headers: { // 'X-User-Token': jinrishiciOption.token, // }, synchronous: true }); case 5: response = _context.sent; // @ts-ignore if (!response || response.status !== 'success') { console.error('今日诗词获取失败', response); } // // 存储 Token // if (jinrishiciOption.token !== response.data.token) { // jinrishiciOption.token = response.data.token; // Store.set(Options.Keys.jinrishici, JSON.stringify(jinrishiciOption)); // } // @ts-ignore return _context.abrupt("return", response.data.content + ' —— ' + response.data.origin.author + '《' + response.data.origin.title + '》'); case 8: case "end": return _context.stop(); } } }, _callee); })); function getJinrishici() { return _getJinrishici.apply(this, arguments); } return getJinrishici; }() }]); return Bar; }(); Bar_defineProperty(Bar, "replaceBarSelector", { bar: '.csv_bar', barUl: '.csv_bar .csv_bar_ul' }); Bar_defineProperty(Bar, "txt", '富强民主文明和谐自由平等公正法治爱国敬业诚信友善ProsperityDemocracyCivilityHarmonyFreedomEqualityJusticeRuleoflawPatriotismDedicationIntegrityFriendship'); Bar_defineProperty(Bar, "storeJinrishiciVal", false); Bar_defineProperty(Bar, "jinrishiciContent", ''); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/react/React.ts function React_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function React_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 React_createClass(Constructor, protoProps, staticProps) { if (protoProps) React_defineProperties(Constructor.prototype, protoProps); if (staticProps) React_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function React_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var React = /*#__PURE__*/function () { function React() { React_classCallCheck(this, React); } React_createClass(React, null, [{ key: "replace", value: function replace() { if (location.host === 'reactjs.org') { Bar.replace({ barSelector: this.selectors.bar, isObserveBar: true, hideBarSelector: this.selectors.hideBar, isObserveHideBar: false, followUpObserveSelector: this.selectors.followUpObserveElement }); } } }]); return React; }(); React_defineProperty(React, "selectors", { bar: '.css-lpiycv', hideBar: '.css-1loxuh3', followUpObserveElement: '#gatsby-focus-wrapper' }); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/angular/Angular.ts function Angular_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Angular_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 Angular_createClass(Constructor, protoProps, staticProps) { if (protoProps) Angular_defineProperties(Constructor.prototype, protoProps); if (staticProps) Angular_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Angular_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Angular = /*#__PURE__*/function () { function Angular() { Angular_classCallCheck(this, Angular); } Angular_createClass(Angular, null, [{ key: "replace", value: function replace() { if (location.host === 'angular.io') { // 不存在是否关闭通知的本地存储时 if (!localStorage.getItem('aio-notification/war-ukraine')) { // 如果通知中存在关键词 var $bar = $(this.selectors.bar); if ($bar.length > 0 && $bar.text().toLowerCase().indexOf('ukraine') != -1) { // 点击关闭通知 $(this.selectors.dismissNotificationBtn)[0].click(); } } } } }]); return Angular; }(); Angular_defineProperty(Angular, "selectors", { bar: '.mat-toolbar-row.notification-container', dismissNotificationBtn: 'button[aria-label="Dismiss notification"]' }); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/codecept/Codecept.ts function Codecept_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Codecept_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 Codecept_createClass(Constructor, protoProps, staticProps) { if (protoProps) Codecept_defineProperties(Constructor.prototype, protoProps); if (staticProps) Codecept_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Codecept_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Codecept = /*#__PURE__*/function () { function Codecept() { Codecept_classCallCheck(this, Codecept); } Codecept_createClass(Codecept, null, [{ key: "replace", value: function replace() { var _this = this; if (location.host === 'codecept.io') { Bar.replace({ barSelector: this.selectors.bar, isObserveBar: false, hideBarSelector: this.selectors.hideBar, isObserveHideBar: false, jinrishiciCallback: function jinrishiciCallback() { $(_this.selectors.bar).css('color', '#edf2f7'); } }); } } }]); return Codecept; }(); Codecept_defineProperty(Codecept, "selectors", { bar: '.sub-bar .message', hideBar: '.sub-bar' }); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/github/Github.ts function Github_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Github_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 Github_createClass(Constructor, protoProps, staticProps) { if (protoProps) Github_defineProperties(Constructor.prototype, protoProps); if (staticProps) Github_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Github_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Github = /*#__PURE__*/function () { function Github() { Github_classCallCheck(this, Github); } Github_createClass(Github, null, [{ key: "replace", value: function replace() { if (location.href === 'https://github.com/') { var $notice = $(this.selectors.notice); if ($notice.length > 0 && $notice.text().toLowerCase().indexOf('ukraine') != -1) { $notice.remove(); } } } }]); return Github; }(); Github_defineProperty(Github, "selectors", { notice: '.border.js-notice' }); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/nest/Nest.ts function Nest_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Nest_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 Nest_createClass(Constructor, protoProps, staticProps) { if (protoProps) Nest_defineProperties(Constructor.prototype, protoProps); if (staticProps) Nest_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Nest_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Nest_Codecept = /*#__PURE__*/function () { function Codecept() { Nest_classCallCheck(this, Codecept); } Nest_createClass(Codecept, null, [{ key: "replace", value: function replace() { var _this = this; if (location.host === 'docs.nestjs.com') { Bar.replace({ barSelector: this.selectors.bar, isObserveBar: false, hideBarSelector: this.selectors.bar, isObserveHideBar: false, csvCallback: function csvCallback() { $(_this.selectors.bar).css('padding', '0'); }, jinrishiciCallback: function jinrishiciCallback() { $(_this.selectors.bar).css('color', '#fff'); } }); } } }]); return Codecept; }(); Nest_defineProperty(Nest_Codecept, "selectors", { bar: '.top-bar' }); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/ember/Ember.ts function Ember_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Ember_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 Ember_createClass(Constructor, protoProps, staticProps) { if (protoProps) Ember_defineProperties(Constructor.prototype, protoProps); if (staticProps) Ember_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Ember_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Ember = /*#__PURE__*/function () { function Ember() { Ember_classCallCheck(this, Ember); } Ember_createClass(Ember, null, [{ key: "replace", value: function replace() { var _this = this; if (location.host === 'emberjs.com') { Bar.replace({ barSelector: this.selectors.bar, isObserveBar: false, hideBarSelector: this.selectors.bar, isObserveHideBar: false, jinrishiciCallback: function jinrishiciCallback() { $(_this.selectors.bar).css('color', '#fff'); } }); $(this.selectors.bar).css({ 'backgroundColor': '#1c1e24', 'padding': 0 }); } } }]); return Ember; }(); Ember_defineProperty(Ember, "selectors", { bar: '.callout-banner' }); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/electron/Electron.ts function Electron_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Electron_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 Electron_createClass(Constructor, protoProps, staticProps) { if (protoProps) Electron_defineProperties(Constructor.prototype, protoProps); if (staticProps) Electron_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Electron_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Electron = /*#__PURE__*/function () { function Electron() { Electron_classCallCheck(this, Electron); } Electron_createClass(Electron, null, [{ key: "replace", value: function replace() { if (location.host === 'www.electronjs.org') { Bar.replace({ barSelector: this.selectors.bar, isObserveBar: false, hideBarSelector: this.selectors.bar, isObserveHideBar: false, csvCallback: function csvCallback() { $(Bar.replaceBarSelector.barUl + ':eq(0)').css('height', '25px'); $(Bar.replaceBarSelector.barUl + ':eq(1)').css('height', '20px'); } }); $(this.selectors.bar).css({ 'padding': 0 }); } } }]); return Electron; }(); Electron_defineProperty(Electron, "selectors", { bar: '.announcement-banner' }); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/jenkins/Jenkins.ts function Jenkins_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Jenkins_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 Jenkins_createClass(Constructor, protoProps, staticProps) { if (protoProps) Jenkins_defineProperties(Constructor.prototype, protoProps); if (staticProps) Jenkins_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Jenkins_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Jenkins_Angular = /*#__PURE__*/function () { function Angular() { Jenkins_classCallCheck(this, Angular); } Jenkins_createClass(Angular, null, [{ key: "replace", value: function replace() { if (location.host === 'www.jenkins.io') { // 替换图标 $(this.selectors.logo).replaceWith("<img src=\"/images/logos/jenkins/Jenkins.svg\">"); // 删除通知 $(this.selectors.pageTitle).nextAll("p").each(function (i, el) { var $el = $(el); if ($el.text().toLowerCase().indexOf('ukraine') != -1) { $el.remove(); } }); $(this.selectors.pageTitle).parent().append('<br><br><br>'); } } }]); return Angular; }(); Jenkins_defineProperty(Jenkins_Angular, "selectors", { logo: 'img[src="/images/logos/jenkins/Jenkins-stop-the-war.svg"]', pageTitle: '.page-title' }); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/svelte/Svelte.ts function Svelte_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Svelte_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 Svelte_createClass(Constructor, protoProps, staticProps) { if (protoProps) Svelte_defineProperties(Constructor.prototype, protoProps); if (staticProps) Svelte_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Svelte_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Svelte = /*#__PURE__*/function () { function Svelte() { Svelte_classCallCheck(this, Svelte); } Svelte_createClass(Svelte, null, [{ key: "replace", value: function replace() { var _this = this; if (location.host === 'svelte.dev') { var $navSpot = $(this.selectors.navSpot); var i = 0; // 监听条幅变化,变化后再次执行 var observer = new MutationObserver(function () { if ($navSpot.length > 0) { // 替换 Logo $navSpot.attr('style', _this.svelteLogoStyle); // 替换两次后结束监听 if (i >= 1) { observer.disconnect(); } i++; } }); observer.observe($(this.selectors.observing)[0], { childList: true }); // 底部横幅 Bar.replace({ barSelector: this.selectors.bar, isObserveBar: true, hideBarSelector: this.selectors.bar, isObserveHideBar: true, csvCallback: function csvCallback() { $(_this.selectors.bar).css({ 'backgroundColor': '#1c1e24', 'paddingTop': '20px' }); } }); } } }]); return Svelte; }(); Svelte_defineProperty(Svelte, "selectors", { navSpot: '.nav-spot', bar: '.ukr', barHeight: ':root', barHeightAttrName: '--ukr-footer-height', observing: '#main' }); Svelte_defineProperty(Svelte, "svelteLogoStyle", 'background-image: url(https://svelte.dev/svelte-logo-horizontal.svg)'); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/sveltematerialui/SvelteMaterialUi.ts function SvelteMaterialUi_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function SvelteMaterialUi_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 SvelteMaterialUi_createClass(Constructor, protoProps, staticProps) { if (protoProps) SvelteMaterialUi_defineProperties(Constructor.prototype, protoProps); if (staticProps) SvelteMaterialUi_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function SvelteMaterialUi_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var SvelteMaterialUi = /*#__PURE__*/function () { function SvelteMaterialUi() { SvelteMaterialUi_classCallCheck(this, SvelteMaterialUi); } SvelteMaterialUi_createClass(SvelteMaterialUi, null, [{ key: "replace", value: function replace() { if (location.host === 'sveltematerialui.com') { $(this.selectors.bar).attr('class', ''); } } }]); return SvelteMaterialUi; }(); SvelteMaterialUi_defineProperty(SvelteMaterialUi, "selectors", { bar: '.ukraine' }); ;// CONCATENATED MODULE: ./core-socialist-values/src/websites/syncthing/Syncthing.ts function Syncthing_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function Syncthing_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 Syncthing_createClass(Constructor, protoProps, staticProps) { if (protoProps) Syncthing_defineProperties(Constructor.prototype, protoProps); if (staticProps) Syncthing_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function Syncthing_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Syncthing = /*#__PURE__*/function () { function Syncthing() { Syncthing_classCallCheck(this, Syncthing); } Syncthing_createClass(Syncthing, null, [{ key: "replace", value: function replace() { var _this = this; if (location.host === 'syncthing.net') { Bar.replace({ barSelector: this.selectors.bar, isObserveBar: false, hideBarSelector: this.selectors.bar, isObserveHideBar: false, csvCallback: function csvCallback() { $(_this.selectors.bar).css('textAlign', 'center'); } }); } } }]); return Syncthing; }(); Syncthing_defineProperty(Syncthing, "selectors", { bar: '.alert' }); ;// CONCATENATED MODULE: ./core-socialist-values/src/main.ts // ==UserScript== // @name 技术远离政治 // @namespace http://tampermonkey.net/ // @version 1.3.0 // @description 移除政治相关条幅或替换为社会主义核心价值观、今日诗词,替换政治相关 Logo 为原版 Logo,去除政治相关通知,让技术远离政治。 // @author duanluan // @copyright 2022, duanluan (https://github.com/duanluan) // @license Apache-2.0; https://www.apache.org/licenses/LICENSE-2.0.txt // @match *://reactjs.org/* // @match *://angular.io/* // @match *://junit.org/* // @match *://codecept.io/* // @match *://github.com/* // @match *://docs.nestjs.com/* // @match *://emberjs.com/* // @match *://www.electronjs.org/* // @match *://www.jenkins.io/* // @match *://svelte.dev/* // @match *://sveltematerialui.com/* // @match *://syncthing.net/* // @match *://greasyfork.org/* // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.slim.min.js // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_xmlhttpRequest // ==/UserScript== // ==OpenUserJS== // @author duanluan // ==/OpenUserJS== (function () { 'use strict'; Options.registerAll(); Options.loadInGreasyfork(); React.replace(); Angular.replace(); Junit.replace(); Codecept.replace(); Github.replace(); Nest_Codecept.replace(); Ember.replace(); Electron.replace(); Jenkins_Angular.replace(); Svelte.replace(); SvelteMaterialUi.replace(); Syncthing.replace(); })(); /******/ })() ; //# sourceMappingURL=data:application/json;charset=utf-8;base64,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Ozs7Ozt5QkFka0I2Qyx3QkFFQTtFQUNqQjFDLEdBQUcsRUFBRTtBQURZOzs7O0FDSnJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQyxZQUFNO0VBQ0w7O0VBRUE3RSxtQkFBQTtFQUNBQSx3QkFBQTtFQUVBd0YsYUFBQTtFQUNBRyxlQUFBO0VBQ0FwSSxhQUFBO0VBQ0EwSSxnQkFBQTtFQUNBQyxjQUFBO0VBQ0FzQixxQkFBQTtFQUNBbkIsYUFBQTtFQUNBQyxnQkFBQTtFQUNBbUIsdUJBQUE7RUFDQVYsY0FBQTtFQUNBTyx3QkFBQTtFQUNBQyxpQkFBQTtBQUNELENBbEJELEkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vY29yZS1zb2NpYWxpc3QtdmFsdWVzL3NyYy93ZWJzaXRlcy9qdW5pdC9KdW5pdC50cyIsIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vdXRpbHMvc3JjL2dtL1N0b3JlLnRzIiwid2VicGFjazovL3RhbXBlcm1vbmtleS1zY3JpcHQtdXRpbHMvLi91dGlscy9zcmMvZ20vZW51bS9IdHRwRGF0YVR5cGUudHMiLCJ3ZWJwYWNrOi8vdGFtcGVybW9ua2V5LXNjcmlwdC11dGlscy8uL3V0aWxzL3NyYy9nbS9IdHRwLnRzIiwid2VicGFjazovL3RhbXBlcm1vbmtleS1zY3JpcHQtdXRpbHMvLi91dGlscy9zcmMvZ20vTWVudUNtZC50cyIsIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vY29yZS1zb2NpYWxpc3QtdmFsdWVzL3NyYy9jb21tb24vT3B0aW9ucy50cyIsIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vY29yZS1zb2NpYWxpc3QtdmFsdWVzL3NyYy9jb21tb24vQmFyLnRzIiwid2VicGFjazovL3RhbXBlcm1vbmtleS1zY3JpcHQtdXRpbHMvLi9jb3JlLXNvY2lhbGlzdC12YWx1ZXMvc3JjL3dlYnNpdGVzL3JlYWN0L1JlYWN0LnRzIiwid2VicGFjazovL3RhbXBlcm1vbmtleS1zY3JpcHQtdXRpbHMvLi9jb3JlLXNvY2lhbGlzdC12YWx1ZXMvc3JjL3dlYnNpdGVzL2FuZ3VsYXIvQW5ndWxhci50cyIsIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vY29yZS1zb2NpYWxpc3QtdmFsdWVzL3NyYy93ZWJzaXRlcy9jb2RlY2VwdC9Db2RlY2VwdC50cyIsIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vY29yZS1zb2NpYWxpc3QtdmFsdWVzL3NyYy93ZWJzaXRlcy9naXRodWIvR2l0aHViLnRzIiwid2VicGFjazovL3RhbXBlcm1vbmtleS1zY3JpcHQtdXRpbHMvLi9jb3JlLXNvY2lhbGlzdC12YWx1ZXMvc3JjL3dlYnNpdGVzL25lc3QvTmVzdC50cyIsIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vY29yZS1zb2NpYWxpc3QtdmFsdWVzL3NyYy93ZWJzaXRlcy9lbWJlci9FbWJlci50cyIsIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vY29yZS1zb2NpYWxpc3QtdmFsdWVzL3NyYy93ZWJzaXRlcy9lbGVjdHJvbi9FbGVjdHJvbi50cyIsIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vY29yZS1zb2NpYWxpc3QtdmFsdWVzL3NyYy93ZWJzaXRlcy9qZW5raW5zL0plbmtpbnMudHMiLCJ3ZWJwYWNrOi8vdGFtcGVybW9ua2V5LXNjcmlwdC11dGlscy8uL2NvcmUtc29jaWFsaXN0LXZhbHVlcy9zcmMvd2Vic2l0ZXMvc3ZlbHRlL1N2ZWx0ZS50cyIsIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vY29yZS1zb2NpYWxpc3QtdmFsdWVzL3NyYy93ZWJzaXRlcy9zdmVsdGVtYXRlcmlhbHVpL1N2ZWx0ZU1hdGVyaWFsVWkudHMiLCJ3ZWJwYWNrOi8vdGFtcGVybW9ua2V5LXNjcmlwdC11dGlscy8uL2NvcmUtc29jaWFsaXN0LXZhbHVlcy9zcmMvd2Vic2l0ZXMvc3luY3RoaW5nL1N5bmN0aGluZy50cyIsIndlYnBhY2s6Ly90YW1wZXJtb25rZXktc2NyaXB0LXV0aWxzLy4vY29yZS1zb2NpYWxpc3QtdmFsdWVzL3NyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIEp1bml0IHtcblxuICBwcml2YXRlIHN0YXRpYyBzZWxlY3RvcnMgPSB7XG4gICAganVuaXRBYm91dDogJyNhYm91dCcsXG4gICAganVuaXRMb2dvOiAnaW1nW3NyYz1cIi9qdW5pdDUvYXNzZXRzL2ltZy9qdW5pdDUtbG9nby5wbmdcIl0nLFxuICAgIGp1bml0RmF2aWNvbjogJ2xpbmtbcmVsPVwiaWNvblwiXScsXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBqdW5pdExvZ29VcmwgPSAnaHR0cHM6Ly9yYXcuaXFpcS5pby9kdWFubHVhbi90YW1wZXJtb25rZXktc2NyaXB0cy9tYWluL2NvcmUtc29jaWFsaXN0LXZhbHVlcy9zcmMvanVuaXQvaW1ncy9qdW5pdDUtbG9nby5wbmcnXG5cbiAgc3RhdGljIHJlcGxhY2UoKSB7XG4gICAgaWYgKGxvY2F0aW9uLmhyZWYgPT09ICdodHRwczovL2p1bml0Lm9yZy9qdW5pdDUvJykge1xuICAgICAgJCh0aGlzLnNlbGVjdG9ycy5qdW5pdEFib3V0KS5wcmV2QWxsKCkucmVtb3ZlKCk7XG4gICAgICAkKHRoaXMuc2VsZWN0b3JzLmp1bml0TG9nbykuYXR0cignc3JjJywgdGhpcy5qdW5pdExvZ29VcmwpO1xuICAgICAgJCh0aGlzLnNlbGVjdG9ycy5qdW5pdEZhdmljb24pLmF0dHIoJ2hyZWYnLCB0aGlzLmp1bml0TG9nb1VybCk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIOWtmOWCqFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdG9yZSB7XG5cbiAgLyoqXG4gICAqIOiOt+WPllxuICAgKiBAcGFyYW0ga2V5IOmUrlxuICAgKi9cbiAgc3RhdGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBHTV9nZXRWYWx1ZShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9rlxuICAgKiBAcGFyYW0ga2V5IOmUrlxuICAgKiBAcGFyYW0gdmFsdWUg5YC8XG4gICAqL1xuICBzdGF0aWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIEdNX3NldFZhbHVlKGtleSwgdmFsdWUpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBIdHRwRGF0YVR5cGUge1xuICBKU09OID0gXCJKU09OXCJcbn1cbiIsImltcG9ydCB7SHR0cERhdGFUeXBlfSBmcm9tIFwiLi9lbnVtL0h0dHBEYXRhVHlwZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIdHRwIHtcblxuICBzdGF0aWMgZ2V0KG9wdGlvbjogeyB1cmw6IHN0cmluZywgZGF0YVR5cGU/OiBIdHRwRGF0YVR5cGUsIHN5bmNocm9ub3VzPzogYm9vbGVhbiwgb25sb2FkPzogRnVuY3Rpb24gfSkge1xuICAgIG9wdGlvblsnbWV0aG9kJ10gPSAnR0VUJztcblxuICAgIC8vIOWQjOatpeaXtui/lOWbniBQcm9taXNlXG4gICAgaWYgKG9wdGlvbi5zeW5jaHJvbm91cykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7XG4gICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgIG9ubG9hZDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKG9wdGlvbi5kYXRhVHlwZSA9PT0gSHR0cERhdGFUeXBlLkpTT04gPyBKU09OLnBhcnNlKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCkgOiByZXNwb25zZS5yZXNwb25zZVRleHQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25lcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvbmxvYWQxID0gZnVuY3Rpb24gKGRldGFpbHMpIHtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICBpZiAob3B0aW9uLmRhdGFUeXBlID09PSBIdHRwRGF0YVR5cGUuSlNPTikge1xuICAgICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShkZXRhaWxzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzcG9uc2UgPSBkZXRhaWxzLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbi5vbmxvYWQocmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgR01feG1saHR0cFJlcXVlc3Qoey4uLm9wdGlvbiwgb25sb2FkOiBvbmxvYWQxfSk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIOmAiemhueiPnOWNlVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZW51Q21kIHtcblxuICAvKipcbiAgICog5rOo5YaMXG4gICAqIEBwYXJhbSBuYW1lIOWQjeensFxuICAgKiBAcGFyYW0gZm4g54K55Ye76I+c5Y2V5pe25omn6KGM55qE5Ye95pWwXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXIobmFtZTogc3RyaW5nLCBmbjogRnVuY3Rpb24pOiBudW1iZXIge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gR01fcmVnaXN0ZXJNZW51Q29tbWFuZChuYW1lLCBmbik7XG4gIH1cblxuICAvKipcbiAgICog5rOo6ZSAXG4gICAqIEBwYXJhbSBtZW51Q21kSWQg5rOo5YaM5pe26L+U5Zue55qEIElEXG4gICAqL1xuICBzdGF0aWMgdW5yZWdpc3RlcihtZW51Q21kSWQ6IG51bWJlcikge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBHTV91bnJlZ2lzdGVyTWVudUNvbW1hbmQobWVudUNtZElkKTtcbiAgfVxufVxuIiwiaW1wb3J0IFN0b3JlIGZyb20gXCIuLi8uLi8uLi91dGlscy9zcmMvZ20vU3RvcmVcIjtcbmltcG9ydCBNZW51Q21kIGZyb20gXCIuLi8uLi8uLi91dGlscy9zcmMvZ20vTWVudUNtZFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPcHRpb25zIHtcbiAgLyoqXG4gICAqIOmAiemhuSBLZXlcbiAgICovXG4gIHN0YXRpYyBLZXlzID0ge1xuICAgIHJlbW92ZUJhcjogJ3JlbW92ZUJhcicsXG4gICAgamlucmlzaGljaTogJ2ppbnJpc2hpY2knLFxuICB9XG5cbiAgLyoqXG4gICAqIOmAiemhuVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgb3B0aW9ucyA9IFtcbiAgICB7bGFiZWw6ICfpmpDol4/mnaHluYUnLCBuYW1lOiBPcHRpb25zLktleXMucmVtb3ZlQmFyLCB2ZXJzaW9uOiAxLCB2YWx1ZTogZmFsc2UsIG1lbnVDbWRJZDogbnVsbH0sXG4gICAge2xhYmVsOiAn5LuK5pel6K+X6K+NJywgbmFtZTogT3B0aW9ucy5LZXlzLmppbnJpc2hpY2ksIHZlcnNpb246IDEsIHZhbHVlOiBmYWxzZSwgbWVudUNtZElkOiBudWxsLCB0b2tlbjogJyd9XG4gIF07XG5cbiAgLyoqXG4gICAqIOazqOWGjCBib29sIOexu+Wei+eahOmAiemhuVxuICAgKiBAcGFyYW0gb3B0aW9uIOmAiemhuVxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyQm9vbE9wdGlvbihvcHRpb246IGFueSkge1xuICAgIGNvbnN0IHZhbCA9IG9wdGlvbi52YWx1ZSwgdmFsSXNCb29sID0gKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJyk7XG5cbiAgICBpZiAoIXZhbElzQm9vbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDms6jlhozpgInpoblcbiAgICBjb25zdCBjdXJyZW50TWVudUNtZElkID0gTWVudUNtZC5yZWdpc3RlcigodmFsID8gJ+KYke+4jyAnIDogJ/CflLIgJykgKyBvcHRpb24ubGFiZWwsICgpID0+IHtcbiAgICAgIC8vIOeCueWHu+WAvOWPluWPjVxuICAgICAgb3B0aW9uLnZhbHVlID0gIW9wdGlvbi52YWx1ZTtcbiAgICAgIFN0b3JlLnNldChvcHRpb24ubmFtZSwgSlNPTi5zdHJpbmdpZnkob3B0aW9uKSk7XG5cbiAgICAgIC8vIOWPlua2iOazqOWGjFxuICAgICAgTWVudUNtZC51bnJlZ2lzdGVyKGN1cnJlbnRNZW51Q21kSWQpO1xuICAgICAgLy8g6YeN5paw5rOo5YaMXG4gICAgICB0aGlzLnJlZ2lzdGVyQm9vbE9wdGlvbihvcHRpb24pO1xuICAgICAgLy8g5Yi35paw6aG16Z2iXG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfSk7XG5cbiAgICAvLyDkv53lrZjpgInpobkgSURcbiAgICBvcHRpb24ubWVudUNtZElkID0gY3VycmVudE1lbnVDbWRJZDtcbiAgICBTdG9yZS5zZXQob3B0aW9uLm5hbWUsIEpTT04uc3RyaW5naWZ5KG9wdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOaJgOaciemAiemhuVxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyQWxsKCkge1xuICAgIE1lbnVDbWQucmVnaXN0ZXIoJ+abtOWkmuiuvue9ricsICgpID0+IHtcbiAgICAgIHdpbmRvdy5vcGVuKCdodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvNDQwODU0JywgJ19ibGFuaycpO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5vcHRpb25zKSB7XG4gICAgICAvLyBUT0RPIOOAkOiwg+ivleOAkeS4jeS/neeVmemAiemhueeahOWAvO+8jOavj+asoemDveS7jiBTdG9yZSDkuK3ojrflj5ZcbiAgICAgIC8vIFN0b3JlLnNldChvcHRpb24ubmFtZSwgbnVsbCk7XG5cbiAgICAgIGxldCBzdG9yZU9wdGlvbiA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBzdG9yZU9wdGlvbiA9IEpTT04ucGFyc2UoU3RvcmUuZ2V0KG9wdGlvbi5uYW1lKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIEZJWE1FIOS4gOauteaXtumXtOWQjuWPr+WIoOmZpCB0cnkgY2F0Y2hcbiAgICAgICAgY29uc29sZS53YXJuKCfml6fnmoTpgInpobnlgLzpnZ4gSlNPTiDmoLzlvI8nKTtcbiAgICAgICAgc3RvcmVPcHRpb24gPSBvcHRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIOWmguaenOmAiemhueS4jeWtmOWcqCB8fCDniYjmnKzkuI3kuIDoh7Qg5pe26YeN572u6YCJ6aG5XG4gICAgICBpZiAoc3RvcmVPcHRpb24gPT09IG51bGwgfHwgIXN0b3JlT3B0aW9uWyd2ZXJzaW9uJ10gfHwgc3RvcmVPcHRpb25bJ3ZlcnNpb24nXSA8IG9wdGlvbi52ZXJzaW9uKSB7XG4gICAgICAgIFN0b3JlLnNldChvcHRpb24ubmFtZSwgSlNPTi5zdHJpbmdpZnkob3B0aW9uKSk7XG4gICAgICAgIHN0b3JlT3B0aW9uID0gb3B0aW9uO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWdpc3RlckJvb2xPcHRpb24oc3RvcmVPcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlnKjpobXpnaLkuK3liqDovb3pgInpoblcbiAgICovXG4gIHN0YXRpYyBsb2FkSW5HcmVhc3lmb3JrKCkge1xuICAgIGlmIChsb2NhdGlvbi5ob3N0ICE9PSAnZ3JlYXN5Zm9yay5vcmcnIHx8IGxvY2F0aW9uLmhyZWYuaW5kZXhPZignL3NjcmlwdHMvNDQwODU0JykgPT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0b3IgPSB7XG4gICAgICBzY3JpcHRMaW5rczogJyNzY3JpcHQtbGlua3MnLFxuICAgICAgc2NyaXB0T3B0aW9uczogJyNzY3JpcHQtb3B0aW9ucycsXG4gICAgICBzY3JpcHRDb250ZW50OiAnI3NjcmlwdC1jb250ZW50JyxcbiAgICB9XG4gICAgY29uc3QgJGJvZHkgPSAkKCdib2R5JyksICRzY3JpcHRMaW5rcyA9ICQoc2VsZWN0b3Iuc2NyaXB0TGlua3MpLCAkc2NyaXB0Q29udGVudCA9ICQoc2VsZWN0b3Iuc2NyaXB0Q29udGVudCk7XG5cbiAgICAvLyDmt7vliqDohJrmnKzorr7nva7nmoTpgInpobnljaFcbiAgICAkc2NyaXB0TGlua3MuY2hpbGRyZW4oJ2xpOmVxKDApJykuYWZ0ZXIoYDxsaT48YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgaWQ9XCJzY3JpcHQtb3B0aW9uc1wiPuiEmuacrOiuvue9rjwvYT48L2xpPmApXG4gICAgJGJvZHkub24oJ2NsaWNrJywgc2VsZWN0b3Iuc2NyaXB0T3B0aW9ucywgKCkgPT4ge1xuICAgICAgY29uc3QgJHNjcmlwdE9wdGlvbnMgPSAkKHNlbGVjdG9yLnNjcmlwdE9wdGlvbnMpO1xuICAgICAgLy8g54K55Ye76ISa5pys6K6+572u55qE6I+c5Y2V5qC35byPXG4gICAgICBjb25zdCAkY3VycmVudExpID0gJHNjcmlwdExpbmtzLmNoaWxkcmVuKCdsaS5jdXJyZW50Jyk7XG4gICAgICAkY3VycmVudExpLmh0bWwoYDxhIGhyZWY9XCIke2xvY2F0aW9uLmhyZWZ9XCI+JHskY3VycmVudExpLnRleHQoKX08L2E+YCk7XG4gICAgICAkY3VycmVudExpLnJlbW92ZUNsYXNzKCdjdXJyZW50Jyk7XG4gICAgICAkc2NyaXB0T3B0aW9ucy5wYXJlbnQoKS5hZGRDbGFzcygnY3VycmVudCcpO1xuXG4gICAgICAvLyDmt7vliqDohJrmnKzorr7nva7nmoTlhoXlrrlcbiAgICAgIGxldCBzY3JpcHRDb250ZW50ID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc3RvcmVPcHRpb24gPSBKU09OLnBhcnNlKFN0b3JlLmdldChvcHRpb24ubmFtZSkpLCBvcHRpb25OYW1lID0gc3RvcmVPcHRpb24ubmFtZSwgb3B0aW9uVmFsID0gc3RvcmVPcHRpb24udmFsdWU7XG5cbiAgICAgICAgc2NyaXB0Q29udGVudCArPSBgPGgzPiR7b3B0aW9uLmxhYmVsfTwvaDM+YDtcbiAgICAgICAgc3dpdGNoIChvcHRpb25OYW1lKSB7XG4gICAgICAgICAgY2FzZSBPcHRpb25zLktleXMucmVtb3ZlQmFyOlxuICAgICAgICAgICAgc2NyaXB0Q29udGVudCArPSBgPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNjcmlwdC1vcHRpb25zLSR7b3B0aW9uTmFtZX1cIiAke29wdGlvblZhbCA/ICdjaGVja2VkJyA6ICcnfT4g5piv5ZCm6ZqQ6JeP5p2h5bmF77yI5Yu+6YCJ5ZCO5bCG6ZqQ6JeP5p2h5bmF6ICM5LiN5piv5pu/5o2i5YW25YaF5a6577yJPC9sYWJlbD5gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBPcHRpb25zLktleXMuamlucmlzaGljaTpcbiAgICAgICAgICAgIHNjcmlwdENvbnRlbnQgKz0gYDxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJzY3JpcHQtb3B0aW9ucy0ke29wdGlvbk5hbWV9LWVuYWJsZWRcIiAke29wdGlvblZhbCA/ICdjaGVja2VkJyA6ICcnfT4g5ZCv55SoPGEgaHJlZj1cImh0dHBzOi8vd3d3LmppbnJpc2hpY2kuY29tXCIgdGFyZ2V0ID0gXCJfYmxhbmtcIj7ku4rml6Xor5for408L2E+77yI5LuN6ZyA5Y+W5raI5Yu+6YCJ4oCc5piv5ZCm6ZqQ6JeP5p2h5bmF4oCd5omN6IO955Sf5pWI77yJPC9sYWJlbD5gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICRzY3JpcHRDb250ZW50Lmh0bWwoc2NyaXB0Q29udGVudCk7XG5cbiAgICAgIC8vIHJlZ2lvbiDmt7vliqDohJrmnKzorr7nva7nmoTkuovku7ZcbiAgICAgIC8vIOaYr+WQpumakOiXj+adoeW5hVxuICAgICAgbGV0IG9wdGlvblNlbGVjdG9yID0gJyNzY3JpcHQtb3B0aW9ucy0nICsgT3B0aW9ucy5LZXlzLnJlbW92ZUJhcjtcbiAgICAgICRib2R5Lm9uKCdjaGFuZ2UnLCBvcHRpb25TZWxlY3RvciwgKCkgPT4ge1xuICAgICAgICBjb25zdCByZW1vdmVCYXJPcHRpb24gPSBKU09OLnBhcnNlKFN0b3JlLmdldChPcHRpb25zLktleXMucmVtb3ZlQmFyKSk7XG4gICAgICAgIHJlbW92ZUJhck9wdGlvbi52YWx1ZSA9ICFyZW1vdmVCYXJPcHRpb24udmFsdWU7XG4gICAgICAgIC8vIOmHjeaWsOazqOWGjOiPnOWNlVxuICAgICAgICBNZW51Q21kLnVucmVnaXN0ZXIocmVtb3ZlQmFyT3B0aW9uLm1lbnVDbWRJZCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJCb29sT3B0aW9uKHJlbW92ZUJhck9wdGlvbik7XG4gICAgICB9KTtcblxuICAgICAgLy8g5ZCv55So5LuK5pel6K+X6K+NXG4gICAgICBvcHRpb25TZWxlY3RvciA9ICcjc2NyaXB0LW9wdGlvbnMtJyArIE9wdGlvbnMuS2V5cy5qaW5yaXNoaWNpICsgJy1lbmFibGVkJztcbiAgICAgICRib2R5Lm9uKCdjaGFuZ2UnLCBvcHRpb25TZWxlY3RvciwgKCkgPT4ge1xuICAgICAgICBjb25zdCBqaW5yaXNoaWNpT3B0aW9uID0gSlNPTi5wYXJzZShTdG9yZS5nZXQoT3B0aW9ucy5LZXlzLmppbnJpc2hpY2kpKTtcbiAgICAgICAgamlucmlzaGljaU9wdGlvbi52YWx1ZSA9ICFqaW5yaXNoaWNpT3B0aW9uLnZhbHVlO1xuICAgICAgICAvLyDph43mlrDms6jlhozoj5zljZVcbiAgICAgICAgTWVudUNtZC51bnJlZ2lzdGVyKGppbnJpc2hpY2lPcHRpb24ubWVudUNtZElkKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckJvb2xPcHRpb24oamlucmlzaGljaU9wdGlvbik7XG4gICAgICB9KTtcbiAgICAgIC8vIGVuZHJlZ2lvblxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3NyYy9nbS9TdG9yZVwiO1xuaW1wb3J0IEh0dHAgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3NyYy9nbS9IdHRwXCI7XG5pbXBvcnQgT3B0aW9ucyBmcm9tIFwiLi9PcHRpb25zXCI7XG5pbXBvcnQge0h0dHBEYXRhVHlwZX0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3NyYy9nbS9lbnVtL0h0dHBEYXRhVHlwZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXIge1xuXG4gIC8qKlxuICAgKiDmm7/mjaLmnaHluYXnmoTpgInmi6nlmahcbiAgICovXG4gIHN0YXRpYyByZXBsYWNlQmFyU2VsZWN0b3IgPSB7XG4gICAgYmFyOiAnLmNzdl9iYXInLFxuICAgIGJhclVsOiAnLmNzdl9iYXIgLmNzdl9iYXJfdWwnLFxuICB9O1xuICAvKipcbiAgICog5pu/5o2i5ZCO55qE5p2h5bmF5Y676Zmk56m65qC85o2i6KGM5ZCO55qE5paH5pysXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB0eHQgPSAn5a+M5by65rCR5Li75paH5piO5ZKM6LCQ6Ieq55Sx5bmz562J5YWs5q2j5rOV5rK754ix5Zu95pWs5Lia6K+a5L+h5Y+L5ZaEUHJvc3Blcml0eURlbW9jcmFjeUNpdmlsaXR5SGFybW9ueUZyZWVkb21FcXVhbGl0eUp1c3RpY2VSdWxlb2ZsYXdQYXRyaW90aXNtRGVkaWNhdGlvbkludGVncml0eUZyaWVuZHNoaXAnO1xuICAvKipcbiAgICog5piv5ZCm5ZCv55So5LuK5pel6K+X6K+NXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBzdG9yZUppbnJpc2hpY2lWYWwgPSBmYWxzZTtcbiAgLyoqXG4gICAqIOS7iuaXpeivl+ivjeWGheWuuVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgamlucmlzaGljaUNvbnRlbnQgPSAnJztcblxuICAvKipcbiAgICog5pu/5o2i5p2h5bmFXG4gICAqIEBwYXJhbSBvcHRpb25zIHtcbiAgICogICBiYXJTZWxlY3Rvcjogc3RyaW5nLCAgICAgICAgICAgICAgLy8g5p2h5bmF6YCJ5oup5ZmoXG4gICAqICAgaXNPYnNlcnZlQmFyOiBib29sZWFuLCAgICAgICAgICAgIC8vIOaYr+WQpuebkeWQrOadoeW5heWPmOWMllxuICAgKiAgIGhpZGVCYXJTZWxlY3Rvcjogc3RyaW5nLCAgICAgICAgICAvLyDpmpDol4/mnaHluYXpgInmi6nlmahcbiAgICogICBpc09ic2VydmVIaWRlQmFyOiBib29sZWFuLCAgICAgICAgLy8g5piv5ZCm55uR5ZCs6ZqQ6JeP5p2h5bmF5Y+Y5YyWXG4gICAqICAgZm9sbG93VXBPYnNlcnZlU2VsZWN0b3I/OiBzdHJpbmcsIC8vIOWQjue7reebkeWQrOmAieaLqeWZqFxuICAgKiAgIGNzdkNhbGxiYWNrPzogRnVuY3Rpb24gICAgICAgIC8vIOabv+aNouWQjuWbnuiwg1xuICAgKiB9XG4gICAqL1xuICBzdGF0aWMgcmVwbGFjZShvcHRpb25zOiB7IGJhclNlbGVjdG9yOiBzdHJpbmcsIGlzT2JzZXJ2ZUJhcjogYm9vbGVhbiwgaGlkZUJhclNlbGVjdG9yOiBzdHJpbmcsIGlzT2JzZXJ2ZUhpZGVCYXI6IGJvb2xlYW4sIGZvbGxvd1VwT2JzZXJ2ZVNlbGVjdG9yPzogc3RyaW5nLCBjc3ZDYWxsYmFjaz86IEZ1bmN0aW9uLCBqaW5yaXNoaWNpQ2FsbGJhY2s/OiBGdW5jdGlvbiB9KSB7XG4gICAgaWYgKCEkKG9wdGlvbnMuYmFyU2VsZWN0b3IpLnRleHQoKS5tYXRjaCgvdWtyYWluZXzkuYzlhYvlhbB8YmxhY2t86buR5Lq6L2kpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c56e76Zmk5qiq5bmFXG4gICAgaWYgKEpTT04ucGFyc2UoU3RvcmUuZ2V0KE9wdGlvbnMuS2V5cy5yZW1vdmVCYXIpKS52YWx1ZSkge1xuICAgICAgLy8g6ZqQ6JeP5qiq5bmFXG4gICAgICAkKG9wdGlvbnMuaGlkZUJhclNlbGVjdG9yKS5oaWRlKCk7XG4gICAgICBpZiAob3B0aW9ucy5pc09ic2VydmVIaWRlQmFyKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgLy8g6ZqQ6JeP5p2h5bmF6aaW5qyh5Yqg6L2977ya55uR5ZCs5p2h5bmF5Y+Y5YyW77yM5Y+Y5YyW5ZCO5YaN5qyh5omn6KGMXG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICQob3B0aW9ucy5oaWRlQmFyU2VsZWN0b3IpLmhpZGUoKTtcbiAgICAgICAgICAvLyDmm7/mjaLkuKTmrKHlkI7nu5PmnZ/nm5HlkKxcbiAgICAgICAgICBpZiAoaSA+PSAxKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGkrKztcbiAgICAgICAgfSk7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoJChvcHRpb25zLmhpZGVCYXJTZWxlY3RvcilbMF0sIHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3JlSmlucmlzaGljaVZhbCA9IEpTT04ucGFyc2UoU3RvcmUuZ2V0KE9wdGlvbnMuS2V5cy5qaW5yaXNoaWNpKSkudmFsdWU7XG4gICAgaWYgKHRoaXMuc3RvcmVKaW5yaXNoaWNpVmFsKSB7XG4gICAgICB0aGlzLmdldEppbnJpc2hpY2koKS50aGVuKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5qaW5yaXNoaWNpQ29udGVudCA9IGRhdGE7XG4gICAgICAgIHRoaXMucmVwbGFjZU9ic2VydmVyKG9wdGlvbnMpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVwbGFjZU9ic2VydmVyKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmm7/mjaLmnaHluYXnm5HlkKxcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlcGxhY2VPYnNlcnZlcihvcHRpb25zOiB7IGJhclNlbGVjdG9yOiBzdHJpbmcsIGlzT2JzZXJ2ZUJhcjogYm9vbGVhbiwgaGlkZUJhclNlbGVjdG9yOiBzdHJpbmcsIGlzT2JzZXJ2ZUhpZGVCYXI6IGJvb2xlYW4sIGZvbGxvd1VwT2JzZXJ2ZVNlbGVjdG9yPzogc3RyaW5nLCBjc3ZDYWxsYmFjaz86IEZ1bmN0aW9uLCBqaW5yaXNoaWNpQ2FsbGJhY2s/OiBGdW5jdGlvbiB9KSB7XG4gICAgLy8g6aaW5qyh5pu/5o2i5qiq5bmFXG4gICAgdGhpcy5yZXBsYWNlQmFyKG9wdGlvbnMuYmFyU2VsZWN0b3IsIG9wdGlvbnMuY3N2Q2FsbGJhY2ssIG9wdGlvbnMuamlucmlzaGljaUNhbGxiYWNrKTtcbiAgICBpZiAoIW9wdGlvbnMuaXNPYnNlcnZlQmFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBpID0gMDtcbiAgICAvLyDmnaHluYXpppbmrKHliqDovb3vvJrnm5HlkKzmnaHluYXlj5jljJbvvIzlj5jljJblkI7lho3mrKHmiafooYxcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgIHRoaXMucmVwbGFjZUJhcihvcHRpb25zLmJhclNlbGVjdG9yLCBvcHRpb25zLmNzdkNhbGxiYWNrLCBvcHRpb25zLmppbnJpc2hpY2lDYWxsYmFjayk7XG4gICAgICAvLyDmm7/mjaLkuKTmrKHlkI7nu5PmnZ/nm5HlkKxcbiAgICAgIGlmIChpID49IDEpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoJChvcHRpb25zLmJhclNlbGVjdG9yKVswXSwge2NoaWxkTGlzdDogdHJ1ZX0pO1xuXG4gICAgaWYgKG9wdGlvbnMuZm9sbG93VXBPYnNlcnZlU2VsZWN0b3IpIHtcbiAgICAgIC8vIOWQjue7reWPmOWMllxuICAgICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlcGxhY2VCYXIob3B0aW9ucy5iYXJTZWxlY3Rvciwgb3B0aW9ucy5jc3ZDYWxsYmFjaywgb3B0aW9ucy5qaW5yaXNoaWNpQ2FsbGJhY2spO1xuICAgICAgfSkub2JzZXJ2ZSgkKG9wdGlvbnMuZm9sbG93VXBPYnNlcnZlU2VsZWN0b3IpWzBdLCB7Y2hpbGRMaXN0OiB0cnVlfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWunumZheabv+aNouadoeW5hVxuICAgKiBAcGFyYW0gc2VsZWN0b3Ig5p2h5bmF6YCJ5oup5ZmoXG4gICAqIEBwYXJhbSBjc3ZDYWxsYmFjayDmm7/mjaLlkI7lm57osINcbiAgICogQHBhcmFtIGppbnJpc2hpY2lDYWxsYmFjayDmm7/mjaLkuLrku4rml6Xor5for43lkI7lm57osINcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlcGxhY2VCYXIoc2VsZWN0b3I6IHN0cmluZywgY3N2Q2FsbGJhY2s/OiBGdW5jdGlvbiwgamlucmlzaGljaUNhbGxiYWNrPzogRnVuY3Rpb24pIHtcbiAgICBpZiAoJCgkKHNlbGVjdG9yKVswXSkudGV4dCgpLnJlcGxhY2UoL1xccysvZywgXCJcIikgPT09IEJhci50eHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdG9yZUppbnJpc2hpY2lWYWwpIHtcbiAgICAgICQoc2VsZWN0b3IpLmNzcyh7J21pbkhlaWdodCc6ICczMHB4JywgJ2xpbmVIZWlnaHQnOiAnMzBweCd9KTtcbiAgICAgICQoc2VsZWN0b3IpLmh0bWwoYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3N2X2JhclwiPlxuICAgICAgICAgICR7dGhpcy5qaW5yaXNoaWNpQ29udGVudH1cbiAgICAgICAgPC9kaXY+YFxuICAgICAgKTtcbiAgICAgIGlmIChqaW5yaXNoaWNpQ2FsbGJhY2spIHtcbiAgICAgICAgamlucmlzaGljaUNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgJChzZWxlY3RvcikuY3NzKHsnbWluSGVpZ2h0JzogJzQwcHgnfSk7XG4gICAgJChzZWxlY3RvcikuaHRtbChgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjc3ZfYmFyXCI+XG4gICAgICAgICAgPHVsIGNsYXNzPSdjc3ZfYmFyX3VsJz48bGk+5a+M5by6PC9saT48bGk+5rCR5Li7PC9saT48bGk+5paH5piOPC9saT48bGk+5ZKM6LCQPC9saT48bGk+6Ieq55SxPC9saT48bGk+5bmz562JPC9saT48bGk+5YWs5q2jPC9saT48bGk+5rOV5rK7PC9saT48bGk+54ix5Zu9PC9saT48bGk+5pWs5LiaPC9saT48bGk+6K+a5L+hPC9saT48bGk+5Y+L5ZaEPC9saT48L3VsPjxicj5cbiAgICAgICAgICA8dWwgY2xhc3M9J2Nzdl9iYXJfdWwnPjxsaT5Qcm9zcGVyaXR5PC9saT48bGk+RGVtb2NyYWN5PC9saT48bGk+Q2l2aWxpdHk8L2xpPjxsaT5IYXJtb255PC9saT48bGk+RnJlZWRvbTwvbGk+PGxpPkVxdWFsaXR5PC9saT48bGk+SnVzdGljZTwvbGk+PGxpPlJ1bGUgb2YgbGF3PC9saT48bGk+UGF0cmlvdGlzbTwvbGk+PGxpPkRlZGljYXRpb248L2xpPjxsaT5JbnRlZ3JpdHk8L2xpPjxsaT5GcmllbmRzaGlwPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5gXG4gICAgKTtcblxuICAgIC8vIOmBv+WFjeWHuueOsOWkmuS4quWvvOiHtOagt+W8j+a3u+WKoOWksei0pVxuICAgIGNvbnN0ICRiYXIgPSAkKHRoaXMucmVwbGFjZUJhclNlbGVjdG9yLmJhcik7XG4gICAgaWYgKCRiYXIubGVuZ3RoID09IDIpIHtcbiAgICAgICRiYXIuZXEoMCkucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFyVWxTZWxlY3RvciA9IHRoaXMucmVwbGFjZUJhclNlbGVjdG9yLmJhclVsO1xuICAgICQoYmFyVWxTZWxlY3RvcikuY3NzKHsnZGlzcGxheSc6ICdpbmxpbmUtYmxvY2snLCAnbGlzdFN0eWxlJzogJ25vbmUnLCAnbWFyZ2luJzogMCwgJ3BhZGRpbmcnOiAwLCAnd2lkdGgnOiAnYXV0byd9KTtcbiAgICAkKGJhclVsU2VsZWN0b3IgKyAnIGxpJykuY3NzKHsnY29sb3InOiAnI0RFMjkxMCcsICdmb250V2VpZ2h0JzogJ2JvbGQnLCAnZm9udEZhbWlseSc6ICdLYWlUaScsICdmbG9hdCc6ICdsZWZ0JywgJ3BhZGRpbmdSaWdodCc6ICcxMHB4JywgJ21pbi13aWR0aCc6ICc4MHB4JywgJ3RleHRBbGlnbic6ICdjZW50ZXInfSk7XG4gICAgJChiYXJVbFNlbGVjdG9yICsgJzpmaXJzdCcpLmNzcygndmVydGljYWxBbGlnbicsICdib3R0b20nKTtcbiAgICAkKGJhclVsU2VsZWN0b3IgKyAnOmZpcnN0IGxpJykuY3NzKCdmb250U2l6ZScsICcxOHB4Jyk7XG4gICAgJChiYXJVbFNlbGVjdG9yICsgJzplcSgxKSBsaScpLmNzcygnZm9udFNpemUnLCAnMTNweCcpO1xuXG4gICAgaWYgKGNzdkNhbGxiYWNrKSB7XG4gICAgICBjc3ZDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bku4rml6Xor5for41cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRKaW5yaXNoaWNpKCkge1xuICAgIGxldCBqaW5yaXNoaWNpT3B0aW9uID0gSlNPTi5wYXJzZShTdG9yZS5nZXQoT3B0aW9ucy5LZXlzLmppbnJpc2hpY2kpKTtcbiAgICBpZiAoIWppbnJpc2hpY2lPcHRpb24udmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBIdHRwLmdldCh7XG4gICAgICB1cmw6ICdodHRwczovL3YyLmppbnJpc2hpY2kuY29tL29uZS5qc29uJyxcbiAgICAgIGRhdGFUeXBlOiBIdHRwRGF0YVR5cGUuSlNPTixcbiAgICAgIC8vIGhlYWRlcnM6IHtcbiAgICAgIC8vICAgJ1gtVXNlci1Ub2tlbic6IGppbnJpc2hpY2lPcHRpb24udG9rZW4sXG4gICAgICAvLyB9LFxuICAgICAgc3luY2hyb25vdXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoIXJlc3BvbnNlIHx8IHJlc3BvbnNlLnN0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfku4rml6Xor5for43ojrflj5blpLHotKUnLCByZXNwb25zZSk7XG4gICAgfVxuICAgIC8vIC8vIOWtmOWCqCBUb2tlblxuICAgIC8vIGlmIChqaW5yaXNoaWNpT3B0aW9uLnRva2VuICE9PSByZXNwb25zZS5kYXRhLnRva2VuKSB7XG4gICAgLy8gICBqaW5yaXNoaWNpT3B0aW9uLnRva2VuID0gcmVzcG9uc2UuZGF0YS50b2tlbjtcbiAgICAvLyAgIFN0b3JlLnNldChPcHRpb25zLktleXMuamlucmlzaGljaSwgSlNPTi5zdHJpbmdpZnkoamlucmlzaGljaU9wdGlvbikpO1xuICAgIC8vIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuY29udGVudCArICcg4oCU4oCUICcgKyByZXNwb25zZS5kYXRhLm9yaWdpbi5hdXRob3IgKyAn44CKJyArIHJlc3BvbnNlLmRhdGEub3JpZ2luLnRpdGxlICsgJ+OAiyc7XG4gIH1cbn1cbiIsImltcG9ydCBCYXIgZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVhY3Qge1xuXG4gIHByaXZhdGUgc3RhdGljIHNlbGVjdG9ycyA9IHtcbiAgICBiYXI6ICcuY3NzLWxwaXljdicsXG4gICAgaGlkZUJhcjogJy5jc3MtMWxveHVoMycsXG4gICAgZm9sbG93VXBPYnNlcnZlRWxlbWVudDogJyNnYXRzYnktZm9jdXMtd3JhcHBlcicsXG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZSgpIHtcbiAgICBpZiAobG9jYXRpb24uaG9zdCA9PT0gJ3JlYWN0anMub3JnJykge1xuICAgICAgQmFyLnJlcGxhY2Uoe2JhclNlbGVjdG9yOiB0aGlzLnNlbGVjdG9ycy5iYXIsIGlzT2JzZXJ2ZUJhcjogdHJ1ZSwgaGlkZUJhclNlbGVjdG9yOiB0aGlzLnNlbGVjdG9ycy5oaWRlQmFyLCBpc09ic2VydmVIaWRlQmFyOiBmYWxzZSwgZm9sbG93VXBPYnNlcnZlU2VsZWN0b3I6IHRoaXMuc2VsZWN0b3JzLmZvbGxvd1VwT2JzZXJ2ZUVsZW1lbnR9KTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEFuZ3VsYXIge1xuXG4gIHByaXZhdGUgc3RhdGljIHNlbGVjdG9ycyA9IHtcbiAgICBiYXI6ICcubWF0LXRvb2xiYXItcm93Lm5vdGlmaWNhdGlvbi1jb250YWluZXInLFxuICAgIGRpc21pc3NOb3RpZmljYXRpb25CdG46ICdidXR0b25bYXJpYS1sYWJlbD1cIkRpc21pc3Mgbm90aWZpY2F0aW9uXCJdJyxcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlKCkge1xuICAgIGlmIChsb2NhdGlvbi5ob3N0ID09PSAnYW5ndWxhci5pbycpIHtcbiAgICAgIC8vIOS4jeWtmOWcqOaYr+WQpuWFs+mXremAmuefpeeahOacrOWcsOWtmOWCqOaXtlxuICAgICAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYWlvLW5vdGlmaWNhdGlvbi93YXItdWtyYWluZScpKSB7XG4gICAgICAgIC8vIOWmguaenOmAmuefpeS4reWtmOWcqOWFs+mUruivjVxuICAgICAgICBjb25zdCAkYmFyID0gJCh0aGlzLnNlbGVjdG9ycy5iYXIpO1xuICAgICAgICBpZiAoJGJhci5sZW5ndGggPiAwICYmICRiYXIudGV4dCgpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigndWtyYWluZScpICE9IC0xKSB7XG4gICAgICAgICAgLy8g54K55Ye75YWz6Zet6YCa55+lXG4gICAgICAgICAgJCh0aGlzLnNlbGVjdG9ycy5kaXNtaXNzTm90aWZpY2F0aW9uQnRuKVswXS5jbGljaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IEJhciBmcm9tIFwiLi4vLi4vY29tbW9uL0JhclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2RlY2VwdCB7XG5cbiAgc3RhdGljIHNlbGVjdG9ycyA9IHtcbiAgICBiYXI6ICcuc3ViLWJhciAubWVzc2FnZScsXG4gICAgaGlkZUJhcjogJy5zdWItYmFyJyxcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlKCkge1xuICAgIGlmIChsb2NhdGlvbi5ob3N0ID09PSAnY29kZWNlcHQuaW8nKSB7XG4gICAgICBCYXIucmVwbGFjZSh7XG4gICAgICAgIGJhclNlbGVjdG9yOiB0aGlzLnNlbGVjdG9ycy5iYXIsIGlzT2JzZXJ2ZUJhcjogZmFsc2UsIGhpZGVCYXJTZWxlY3RvcjogdGhpcy5zZWxlY3RvcnMuaGlkZUJhciwgaXNPYnNlcnZlSGlkZUJhcjogZmFsc2UsIGppbnJpc2hpY2lDYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICQodGhpcy5zZWxlY3RvcnMuYmFyKS5jc3MoJ2NvbG9yJywgJyNlZGYyZjcnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBHaXRodWIge1xuXG4gIHN0YXRpYyBzZWxlY3RvcnMgPSB7XG4gICAgbm90aWNlOiAnLmJvcmRlci5qcy1ub3RpY2UnXG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZSgpIHtcbiAgICBpZiAobG9jYXRpb24uaHJlZiA9PT0gJ2h0dHBzOi8vZ2l0aHViLmNvbS8nKSB7XG4gICAgICBjb25zdCAkbm90aWNlID0gJCh0aGlzLnNlbGVjdG9ycy5ub3RpY2UpO1xuICAgICAgaWYgKCRub3RpY2UubGVuZ3RoID4gMCAmJiAkbm90aWNlLnRleHQoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3VrcmFpbmUnKSAhPSAtMSkge1xuICAgICAgICAkbm90aWNlLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IEJhciBmcm9tIFwiLi4vLi4vY29tbW9uL0JhclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2RlY2VwdCB7XG5cbiAgc3RhdGljIHNlbGVjdG9ycyA9IHtcbiAgICBiYXI6ICcudG9wLWJhcicsXG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZSgpIHtcbiAgICBpZiAobG9jYXRpb24uaG9zdCA9PT0gJ2RvY3MubmVzdGpzLmNvbScpIHtcbiAgICAgIEJhci5yZXBsYWNlKHtcbiAgICAgICAgYmFyU2VsZWN0b3I6IHRoaXMuc2VsZWN0b3JzLmJhciwgaXNPYnNlcnZlQmFyOiBmYWxzZSwgaGlkZUJhclNlbGVjdG9yOiB0aGlzLnNlbGVjdG9ycy5iYXIsIGlzT2JzZXJ2ZUhpZGVCYXI6IGZhbHNlLCBjc3ZDYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICQodGhpcy5zZWxlY3RvcnMuYmFyKS5jc3MoJ3BhZGRpbmcnLCAnMCcpO1xuICAgICAgICB9LCBqaW5yaXNoaWNpQ2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAkKHRoaXMuc2VsZWN0b3JzLmJhcikuY3NzKCdjb2xvcicsICcjZmZmJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IEJhciBmcm9tIFwiLi4vLi4vY29tbW9uL0JhclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbWJlciB7XG5cbiAgc3RhdGljIHNlbGVjdG9ycyA9IHtcbiAgICBiYXI6ICcuY2FsbG91dC1iYW5uZXInLFxuICB9XG5cbiAgc3RhdGljIHJlcGxhY2UoKSB7XG4gICAgaWYgKGxvY2F0aW9uLmhvc3QgPT09ICdlbWJlcmpzLmNvbScpIHtcbiAgICAgIEJhci5yZXBsYWNlKHtcbiAgICAgICAgYmFyU2VsZWN0b3I6IHRoaXMuc2VsZWN0b3JzLmJhciwgaXNPYnNlcnZlQmFyOiBmYWxzZSwgaGlkZUJhclNlbGVjdG9yOiB0aGlzLnNlbGVjdG9ycy5iYXIsIGlzT2JzZXJ2ZUhpZGVCYXI6IGZhbHNlLCBqaW5yaXNoaWNpQ2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAkKHRoaXMuc2VsZWN0b3JzLmJhcikuY3NzKCdjb2xvcicsICcjZmZmJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgJCh0aGlzLnNlbGVjdG9ycy5iYXIpLmNzcyh7J2JhY2tncm91bmRDb2xvcic6ICcjMWMxZTI0JywgJ3BhZGRpbmcnOiAwfSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgQmFyIGZyb20gXCIuLi8uLi9jb21tb24vQmFyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVsZWN0cm9uIHtcblxuICBzdGF0aWMgc2VsZWN0b3JzID0ge1xuICAgIGJhcjogJy5hbm5vdW5jZW1lbnQtYmFubmVyJyxcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlKCkge1xuICAgIGlmIChsb2NhdGlvbi5ob3N0ID09PSAnd3d3LmVsZWN0cm9uanMub3JnJykge1xuICAgICAgQmFyLnJlcGxhY2Uoe1xuICAgICAgICBiYXJTZWxlY3RvcjogdGhpcy5zZWxlY3RvcnMuYmFyLCBpc09ic2VydmVCYXI6IGZhbHNlLCBoaWRlQmFyU2VsZWN0b3I6IHRoaXMuc2VsZWN0b3JzLmJhciwgaXNPYnNlcnZlSGlkZUJhcjogZmFsc2UsIGNzdkNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgJChCYXIucmVwbGFjZUJhclNlbGVjdG9yLmJhclVsICsgJzplcSgwKScpLmNzcygnaGVpZ2h0JywgJzI1cHgnKTtcbiAgICAgICAgICAkKEJhci5yZXBsYWNlQmFyU2VsZWN0b3IuYmFyVWwgKyAnOmVxKDEpJykuY3NzKCdoZWlnaHQnLCAnMjBweCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgICQodGhpcy5zZWxlY3RvcnMuYmFyKS5jc3MoeydwYWRkaW5nJzogMH0pO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQW5ndWxhciB7XG5cbiAgc3RhdGljIHNlbGVjdG9ycyA9IHtcbiAgICBsb2dvOiAnaW1nW3NyYz1cIi9pbWFnZXMvbG9nb3MvamVua2lucy9KZW5raW5zLXN0b3AtdGhlLXdhci5zdmdcIl0nLFxuICAgIHBhZ2VUaXRsZTogJy5wYWdlLXRpdGxlJ1xuICB9XG5cbiAgc3RhdGljIHJlcGxhY2UoKSB7XG4gICAgaWYgKGxvY2F0aW9uLmhvc3QgPT09ICd3d3cuamVua2lucy5pbycpIHtcbiAgICAgIC8vIOabv+aNouWbvuagh1xuICAgICAgJCh0aGlzLnNlbGVjdG9ycy5sb2dvKS5yZXBsYWNlV2l0aChgPGltZyBzcmM9XCIvaW1hZ2VzL2xvZ29zL2plbmtpbnMvSmVua2lucy5zdmdcIj5gKTtcblxuICAgICAgLy8g5Yig6Zmk6YCa55+lXG4gICAgICAkKHRoaXMuc2VsZWN0b3JzLnBhZ2VUaXRsZSkubmV4dEFsbChcInBcIikuZWFjaCgoaSwgZWwpID0+IHtcbiAgICAgICAgY29uc3QgJGVsID0gJChlbCk7XG4gICAgICAgIGlmICgkZWwudGV4dCgpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigndWtyYWluZScpICE9IC0xKSB7XG4gICAgICAgICAgJGVsLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgICQodGhpcy5zZWxlY3RvcnMucGFnZVRpdGxlKS5wYXJlbnQoKS5hcHBlbmQoJzxicj48YnI+PGJyPicpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IEJhciBmcm9tIFwiLi4vLi4vY29tbW9uL0JhclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdmVsdGUge1xuXG4gIHByaXZhdGUgc3RhdGljIHNlbGVjdG9ycyA9IHtcbiAgICBuYXZTcG90OiAnLm5hdi1zcG90JyxcbiAgICBiYXI6ICcudWtyJyxcbiAgICBiYXJIZWlnaHQ6ICc6cm9vdCcsXG4gICAgYmFySGVpZ2h0QXR0ck5hbWU6ICctLXVrci1mb290ZXItaGVpZ2h0JyxcbiAgICBvYnNlcnZpbmc6ICcjbWFpbicsXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdmVsdGVMb2dvU3R5bGUgPSAnYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHBzOi8vc3ZlbHRlLmRldi9zdmVsdGUtbG9nby1ob3Jpem9udGFsLnN2ZyknO1xuXG4gIHN0YXRpYyByZXBsYWNlKCkge1xuICAgIGlmIChsb2NhdGlvbi5ob3N0ID09PSAnc3ZlbHRlLmRldicpIHtcbiAgICAgIGNvbnN0ICRuYXZTcG90ID0gJCh0aGlzLnNlbGVjdG9ycy5uYXZTcG90KTtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIC8vIOebkeWQrOadoeW5heWPmOWMlu+8jOWPmOWMluWQjuWGjeasoeaJp+ihjFxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIGlmICgkbmF2U3BvdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8g5pu/5o2iIExvZ29cbiAgICAgICAgICAkbmF2U3BvdC5hdHRyKCdzdHlsZScsIHRoaXMuc3ZlbHRlTG9nb1N0eWxlKTtcbiAgICAgICAgICAvLyDmm7/mjaLkuKTmrKHlkI7nu5PmnZ/nm5HlkKxcbiAgICAgICAgICBpZiAoaSA+PSAxKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKCQodGhpcy5zZWxlY3RvcnMub2JzZXJ2aW5nKVswXSwge2NoaWxkTGlzdDogdHJ1ZX0pO1xuXG4gICAgICAvLyDlupXpg6jmqKrluYVcbiAgICAgIEJhci5yZXBsYWNlKHtcbiAgICAgICAgYmFyU2VsZWN0b3I6IHRoaXMuc2VsZWN0b3JzLmJhciwgaXNPYnNlcnZlQmFyOiB0cnVlLCBoaWRlQmFyU2VsZWN0b3I6IHRoaXMuc2VsZWN0b3JzLmJhciwgaXNPYnNlcnZlSGlkZUJhcjogdHJ1ZSwgY3N2Q2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAkKHRoaXMuc2VsZWN0b3JzLmJhcikuY3NzKHsnYmFja2dyb3VuZENvbG9yJzogJyMxYzFlMjQnLCAncGFkZGluZ1RvcCc6ICcyMHB4J30pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFN2ZWx0ZU1hdGVyaWFsVWkge1xuXG4gIHN0YXRpYyBzZWxlY3RvcnMgPSB7XG4gICAgYmFyOiAnLnVrcmFpbmUnLFxuICB9XG5cbiAgc3RhdGljIHJlcGxhY2UoKSB7XG4gICAgaWYgKGxvY2F0aW9uLmhvc3QgPT09ICdzdmVsdGVtYXRlcmlhbHVpLmNvbScpIHtcbiAgICAgICQodGhpcy5zZWxlY3RvcnMuYmFyKS5hdHRyKCdjbGFzcycsICcnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBCYXIgZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY3RoaW5nIHtcblxuICBzdGF0aWMgc2VsZWN0b3JzID0ge1xuICAgIGJhcjogJy5hbGVydCcsXG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZSgpIHtcbiAgICBpZiAobG9jYXRpb24uaG9zdCA9PT0gJ3N5bmN0aGluZy5uZXQnKSB7XG4gICAgICBCYXIucmVwbGFjZSh7XG4gICAgICAgIGJhclNlbGVjdG9yOiB0aGlzLnNlbGVjdG9ycy5iYXIsIGlzT2JzZXJ2ZUJhcjogZmFsc2UsIGhpZGVCYXJTZWxlY3RvcjogdGhpcy5zZWxlY3RvcnMuYmFyLCBpc09ic2VydmVIaWRlQmFyOiBmYWxzZSwgY3N2Q2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAkKHRoaXMuc2VsZWN0b3JzLmJhcikuY3NzKCd0ZXh0QWxpZ24nLCAnY2VudGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gPT1Vc2VyU2NyaXB0PT1cbi8vIEBuYW1lICAgICAgICAg5oqA5pyv6L+c56a75pS/5rK7XG4vLyBAbmFtZXNwYWNlICAgIGh0dHA6Ly90YW1wZXJtb25rZXkubmV0L1xuLy8gQHZlcnNpb24gICAgICAxLjMuMFxuLy8gQGRlc2NyaXB0aW9uICDnp7vpmaTmlL/msrvnm7jlhbPmnaHluYXmiJbmm7/mjaLkuLrnpL7kvJrkuLvkuYnmoLjlv4Pku7flgLzop4LjgIHku4rml6Xor5for43vvIzmm7/mjaLmlL/msrvnm7jlhbMgTG9nbyDkuLrljp/niYggTG9nb++8jOWOu+mZpOaUv+ayu+ebuOWFs+mAmuefpe+8jOiuqeaKgOacr+i/nOemu+aUv+ayu+OAglxuLy8gQGF1dGhvciAgICAgICBkdWFubHVhblxuLy8gQGNvcHlyaWdodCAgICAyMDIyLCBkdWFubHVhbiAoaHR0cHM6Ly9naXRodWIuY29tL2R1YW5sdWFuKVxuLy8gQGxpY2Vuc2UgICAgICBBcGFjaGUtMi4wOyBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dFxuLy8gQG1hdGNoICAgICAgICAqOi8vcmVhY3Rqcy5vcmcvKlxuLy8gQG1hdGNoICAgICAgICAqOi8vYW5ndWxhci5pby8qXG4vLyBAbWF0Y2ggICAgICAgICo6Ly9qdW5pdC5vcmcvKlxuLy8gQG1hdGNoICAgICAgICAqOi8vY29kZWNlcHQuaW8vKlxuLy8gQG1hdGNoICAgICAgICAqOi8vZ2l0aHViLmNvbS8qXG4vLyBAbWF0Y2ggICAgICAgICo6Ly9kb2NzLm5lc3Rqcy5jb20vKlxuLy8gQG1hdGNoICAgICAgICAqOi8vZW1iZXJqcy5jb20vKlxuLy8gQG1hdGNoICAgICAgICAqOi8vd3d3LmVsZWN0cm9uanMub3JnLypcbi8vIEBtYXRjaCAgICAgICAgKjovL3d3dy5qZW5raW5zLmlvLypcbi8vIEBtYXRjaCAgICAgICAgKjovL3N2ZWx0ZS5kZXYvKlxuLy8gQG1hdGNoICAgICAgICAqOi8vc3ZlbHRlbWF0ZXJpYWx1aS5jb20vKlxuLy8gQG1hdGNoICAgICAgICAqOi8vc3luY3RoaW5nLm5ldC8qXG4vLyBAbWF0Y2ggICAgICAgICo6Ly9ncmVhc3lmb3JrLm9yZy8qXG4vLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmJvb3RjZG4ubmV0L2FqYXgvbGlicy9qcXVlcnkvMy42LjAvanF1ZXJ5LnNsaW0ubWluLmpzXG4vLyBAZ3JhbnQgICAgICAgIEdNX2dldFZhbHVlXG4vLyBAZ3JhbnQgICAgICAgIEdNX3NldFZhbHVlXG4vLyBAZ3JhbnQgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmRcbi8vIEBncmFudCAgICAgICAgR01fdW5yZWdpc3Rlck1lbnVDb21tYW5kXG4vLyBAZ3JhbnQgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0XG4vLyA9PS9Vc2VyU2NyaXB0PT1cblxuLy8gPT1PcGVuVXNlckpTPT1cbi8vIEBhdXRob3IgZHVhbmx1YW5cbi8vID09L09wZW5Vc2VySlM9PVxuXG5pbXBvcnQgSnVuaXQgZnJvbSBcIi4vd2Vic2l0ZXMvanVuaXQvSnVuaXRcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwiLi93ZWJzaXRlcy9yZWFjdC9SZWFjdFwiO1xuaW1wb3J0IEFuZ3VsYXIgZnJvbSBcIi4vd2Vic2l0ZXMvYW5ndWxhci9Bbmd1bGFyXCI7XG5pbXBvcnQgQ29kZWNlcHQgZnJvbSBcIi4vd2Vic2l0ZXMvY29kZWNlcHQvQ29kZWNlcHRcIjtcbmltcG9ydCBHaXRodWIgZnJvbSBcIi4vd2Vic2l0ZXMvZ2l0aHViL0dpdGh1YlwiO1xuaW1wb3J0IE5lc3QgZnJvbSBcIi4vd2Vic2l0ZXMvbmVzdC9OZXN0XCI7XG5pbXBvcnQgRW1iZXIgZnJvbSBcIi4vd2Vic2l0ZXMvZW1iZXIvRW1iZXJcIjtcbmltcG9ydCBFbGVjdHJvbiBmcm9tIFwiLi93ZWJzaXRlcy9lbGVjdHJvbi9FbGVjdHJvblwiO1xuaW1wb3J0IEplbmtpbnMgZnJvbSBcIi4vd2Vic2l0ZXMvamVua2lucy9KZW5raW5zXCI7XG5pbXBvcnQgU3ZlbHRlIGZyb20gXCIuL3dlYnNpdGVzL3N2ZWx0ZS9TdmVsdGVcIjtcbmltcG9ydCBPcHRpb25zIGZyb20gXCIuL2NvbW1vbi9PcHRpb25zXCI7XG5pbXBvcnQgU3ZlbHRlTWF0ZXJpYWxVaSBmcm9tIFwiLi93ZWJzaXRlcy9zdmVsdGVtYXRlcmlhbHVpL1N2ZWx0ZU1hdGVyaWFsVWlcIjtcbmltcG9ydCBTeW5jdGhpbmcgZnJvbSBcIi4vd2Vic2l0ZXMvc3luY3RoaW5nL1N5bmN0aGluZ1wiO1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgT3B0aW9ucy5yZWdpc3RlckFsbCgpO1xuICBPcHRpb25zLmxvYWRJbkdyZWFzeWZvcmsoKTtcblxuICBSZWFjdC5yZXBsYWNlKCk7XG4gIEFuZ3VsYXIucmVwbGFjZSgpO1xuICBKdW5pdC5yZXBsYWNlKCk7XG4gIENvZGVjZXB0LnJlcGxhY2UoKTtcbiAgR2l0aHViLnJlcGxhY2UoKTtcbiAgTmVzdC5yZXBsYWNlKCk7XG4gIEVtYmVyLnJlcGxhY2UoKTtcbiAgRWxlY3Ryb24ucmVwbGFjZSgpO1xuICBKZW5raW5zLnJlcGxhY2UoKTtcbiAgU3ZlbHRlLnJlcGxhY2UoKTtcbiAgU3ZlbHRlTWF0ZXJpYWxVaS5yZXBsYWNlKCk7XG4gIFN5bmN0aGluZy5yZXBsYWNlKCk7XG59KSgpO1xuIl0sIm5hbWVzIjpbIkp1bml0IiwibG9jYXRpb24iLCJocmVmIiwiJCIsInNlbGVjdG9ycyIsImp1bml0QWJvdXQiLCJwcmV2QWxsIiwicmVtb3ZlIiwianVuaXRMb2dvIiwiYXR0ciIsImp1bml0TG9nb1VybCIsImp1bml0RmF2aWNvbiIsIlN0b3JlIiwia2V5IiwiR01fZ2V0VmFsdWUiLCJ2YWx1ZSIsIkdNX3NldFZhbHVlIiwiSHR0cERhdGFUeXBlIiwiSHR0cCIsIm9wdGlvbiIsInN5bmNocm9ub3VzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJHTV94bWxodHRwUmVxdWVzdCIsIm9ubG9hZCIsInJlc3BvbnNlIiwiZGF0YVR5cGUiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJvbmVycm9yIiwiZXJyb3IiLCJvbmxvYWQxIiwiZGV0YWlscyIsIk1lbnVDbWQiLCJuYW1lIiwiZm4iLCJHTV9yZWdpc3Rlck1lbnVDb21tYW5kIiwibWVudUNtZElkIiwiR01fdW5yZWdpc3Rlck1lbnVDb21tYW5kIiwiT3B0aW9ucyIsInZhbCIsInZhbElzQm9vbCIsImN1cnJlbnRNZW51Q21kSWQiLCJyZWdpc3RlciIsImxhYmVsIiwic2V0Iiwic3RyaW5naWZ5IiwidW5yZWdpc3RlciIsInJlZ2lzdGVyQm9vbE9wdGlvbiIsIndpbmRvdyIsInJlbG9hZCIsIm9wZW4iLCJvcHRpb25zIiwic3RvcmVPcHRpb24iLCJnZXQiLCJlIiwiY29uc29sZSIsIndhcm4iLCJ2ZXJzaW9uIiwiaG9zdCIsImluZGV4T2YiLCJzZWxlY3RvciIsInNjcmlwdExpbmtzIiwic2NyaXB0T3B0aW9ucyIsInNjcmlwdENvbnRlbnQiLCIkYm9keSIsIiRzY3JpcHRMaW5rcyIsIiRzY3JpcHRDb250ZW50IiwiY2hpbGRyZW4iLCJhZnRlciIsIm9uIiwiJHNjcmlwdE9wdGlvbnMiLCIkY3VycmVudExpIiwiaHRtbCIsInRleHQiLCJyZW1vdmVDbGFzcyIsInBhcmVudCIsImFkZENsYXNzIiwib3B0aW9uTmFtZSIsIm9wdGlvblZhbCIsIktleXMiLCJyZW1vdmVCYXIiLCJqaW5yaXNoaWNpIiwib3B0aW9uU2VsZWN0b3IiLCJyZW1vdmVCYXJPcHRpb24iLCJqaW5yaXNoaWNpT3B0aW9uIiwidG9rZW4iLCJCYXIiLCJiYXJTZWxlY3RvciIsIm1hdGNoIiwiaGlkZUJhclNlbGVjdG9yIiwiaGlkZSIsImlzT2JzZXJ2ZUhpZGVCYXIiLCJpIiwib2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwiZGlzY29ubmVjdCIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwic3RvcmVKaW5yaXNoaWNpVmFsIiwiZ2V0SmlucmlzaGljaSIsInRoZW4iLCJkYXRhIiwiamlucmlzaGljaUNvbnRlbnQiLCJyZXBsYWNlT2JzZXJ2ZXIiLCJyZXBsYWNlQmFyIiwiY3N2Q2FsbGJhY2siLCJqaW5yaXNoaWNpQ2FsbGJhY2siLCJpc09ic2VydmVCYXIiLCJmb2xsb3dVcE9ic2VydmVTZWxlY3RvciIsInJlcGxhY2UiLCJ0eHQiLCJjc3MiLCIkYmFyIiwicmVwbGFjZUJhclNlbGVjdG9yIiwiYmFyIiwibGVuZ3RoIiwiZXEiLCJiYXJVbFNlbGVjdG9yIiwiYmFyVWwiLCJ1cmwiLCJzdGF0dXMiLCJjb250ZW50Iiwib3JpZ2luIiwiYXV0aG9yIiwidGl0bGUiLCJSZWFjdCIsImhpZGVCYXIiLCJmb2xsb3dVcE9ic2VydmVFbGVtZW50IiwiQW5ndWxhciIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJ0b0xvd2VyQ2FzZSIsImRpc21pc3NOb3RpZmljYXRpb25CdG4iLCJjbGljayIsIkNvZGVjZXB0IiwiR2l0aHViIiwiJG5vdGljZSIsIm5vdGljZSIsIkVtYmVyIiwiRWxlY3Ryb24iLCJsb2dvIiwicmVwbGFjZVdpdGgiLCJwYWdlVGl0bGUiLCJuZXh0QWxsIiwiZWFjaCIsImVsIiwiJGVsIiwiYXBwZW5kIiwiU3ZlbHRlIiwiJG5hdlNwb3QiLCJuYXZTcG90Iiwic3ZlbHRlTG9nb1N0eWxlIiwib2JzZXJ2aW5nIiwiYmFySGVpZ2h0IiwiYmFySGVpZ2h0QXR0ck5hbWUiLCJTdmVsdGVNYXRlcmlhbFVpIiwiU3luY3RoaW5nIiwiTmVzdCIsIkplbmtpbnMiLCJyZWdpc3RlckFsbCIsImxvYWRJbkdyZWFzeWZvcmsiXSwic291cmNlUm9vdCI6IiJ9