Greasy Fork is available in English.

网页清洁工

清洁 B 站、虎牙

// ==UserScript==
// @name         网页清洁工
// @namespace    非主流小明
// @version      0.0.1
// @author       非主流小明
// @description  清洁 B 站、虎牙
// @license      MIT
// @icon         https://www.bilibili.com/favicon.ico
// @defaulticon  https://avatars.githubusercontent.com/u/114138419?s=200&v=4
// @homepage     https://greasyfork.org/zh-CN/users/816325-非主流小明
// @homepageURL  https://github.com/nicepkg/nice-scripts/tree/master/packages/site-cleaner
// @website      https://space.bilibili.com/83540912
// @source       https://github.com/nicepkg/nice-scripts/tree/master/packages/site-cleaner
// @supportURL   https://github.com/nicepkg/nice-scripts/issues
// @match        *://www.bilibili.com/*
// @match        *://www.huya.com/*
// @match        *://stackoverflow.com/*
// @match        *://www.baidu.com/*
// @match        *://image.baidu.com/*
// @match        *://www.google.com/*
// @match        *://*.csdn.net/*
// @match        *://*.zhihu.com/*
// @match        *://m.baidu.com/*
// @match        *://baijiahao.baidu.com/*
// @match        *://baike.baidu.com/*
// @grant        GM_addElement
// @grant        GM_addStyle
// @grant        GM_addValueChangeListener
// @grant        GM_cookie
// @grant        GM_deleteValue
// @grant        GM_download
// @grant        GM_getResourceText
// @grant        GM_getResourceURL
// @grant        GM_getTab
// @grant        GM_getTabs
// @grant        GM_getValue
// @grant        GM_info
// @grant        GM_listValues
// @grant        GM_log
// @grant        GM_notification
// @grant        GM_openInTab
// @grant        GM_registerMenuCommand
// @grant        GM_removeValueChangeListener
// @grant        GM_saveTab
// @grant        GM_setClipboard
// @grant        GM_setValue
// @grant        GM_unregisterMenuCommand
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @run-at       document-start
// @noframes
// ==/UserScript==

(function () {
  'use strict';

  const isMatchSite = (matcher, siteUrl = window.location.href) => {
    const siteMatch = typeof matcher === "string" || matcher instanceof RegExp ? [matcher] : matcher;
    if (!siteMatch)
      return true;
    return siteMatch.some((site) => siteUrl.match(site));
  };
  const insertCss = (css, options) => {
    const { win = window, keepStyle = false } = options || {};
    let style;
    const createStyle = () => {
      style = win.document.createElement("style");
      style.innerHTML = css;
      style.type = "text/css";
      win.document.head.appendChild(style);
    };
    createStyle();
    let observer;
    if (keepStyle) {
      observer = new MutationObserver((mutationsList) => {
        for (const mutation of mutationsList) {
          if (mutation.removedNodes.length && Array.from(mutation.removedNodes).includes(style)) {
            createStyle();
          }
        }
      });
      observer.observe(win.document.head, {
        childList: true
      });
    }
    return () => {
      style.remove();
      observer == null ? void 0 : observer.disconnect();
    };
  };
  const hasOwn = (obj, key) => {
    return Object.prototype.hasOwnProperty.call(obj, key);
  };
  const $doms = (selector, win = window) => Array.from(win.document.querySelectorAll(selector) || []);
  const noop = () => {
  };
  const DEFAULT_GM_API_NAMESPACE = "__NICE_SCRIPTS_GM_API__";
  const initGMApi = (gmApi, namespace = DEFAULT_GM_API_NAMESPACE) => {
    if (!gmApi.unsafeWindow) {
      throw new Error("initGMApi unsafeWindow is required");
    }
    if (!self.document.__UNSAFE_WINDOW__) {
      self.document.__UNSAFE_WINDOW__ = gmApi.unsafeWindow;
    }
    const win = self.document.__UNSAFE_WINDOW__;
    if (!(win == null ? void 0 : win[namespace])) {
      win[namespace] = gmApi;
      return;
    }
    Object.entries(gmApi).forEach(([key, value]) => {
      if ((!win[namespace])[key]) {
        win[namespace][key] = value;
      }
    });
  };
  const getGMApi = (namespace = DEFAULT_GM_API_NAMESPACE) => {
    const win = self.document.__UNSAFE_WINDOW__;
    if (!(win == null ? void 0 : win[namespace])) {
      console.warn("GM API is not initialized");
    }
    return (win == null ? void 0 : win[namespace]) || {};
  };
  const getUnsafeWindow = (defaultWindow = window, namespace = DEFAULT_GM_API_NAMESPACE) => {
    return getGMApi(namespace).unsafeWindow || defaultWindow;
  };
  const watchElementDisplay = (selector, callback, options) => {
    var _a;
    const { win = getUnsafeWindow() } = options || {};
    if (!(win == null ? void 0 : win.__OBSERVER_CONFIG__)) {
      win.__OBSERVER_CONFIG__ = {};
    }
    const defaultConfig = {
      queue: /* @__PURE__ */ new Map(),
      observer: void 0,
      dispose: void 0
    };
    win.__OBSERVER_CONFIG__ ?? (win.__OBSERVER_CONFIG__ = {
      watchElementDisplay: defaultConfig
    });
    (_a = win.__OBSERVER_CONFIG__).watchElementDisplay ?? (_a.watchElementDisplay = defaultConfig);
    const queue = win.__OBSERVER_CONFIG__.watchElementDisplay.queue;
    if (!queue.get(selector)) {
      queue.set(selector, /* @__PURE__ */ new Set());
    }
    queue.get(selector).add(callback);
    if (win.__OBSERVER_CONFIG__.watchElementDisplay.observer)
      return noop;
    win.__OBSERVER_CONFIG__.watchElementDisplay.observer = new MutationObserver((mutationsList) => {
      var _a2, _b;
      const queue2 = (_b = (_a2 = win.__OBSERVER_CONFIG__) == null ? void 0 : _a2.watchElementDisplay) == null ? void 0 : _b.queue;
      if (!(queue2 == null ? void 0 : queue2.size))
        return;
      const addedElements = /* @__PURE__ */ new Set();
      for (const mutation of mutationsList) {
        if (mutation.type === "childList" && mutation.addedNodes.length > 0) {
          mutation.addedNodes.forEach((node) => {
            if (node instanceof HTMLElement) {
              addedElements.add(node);
            }
          });
        }
      }
      for (const [selector2, callbacks] of queue2.entries()) {
        for (const el of addedElements) {
          if (el.matches(selector2)) {
            callbacks.forEach((callback2) => callback2(el));
          } else {
            const targetElement = el.querySelector(selector2);
            if (targetElement) {
              callbacks.forEach((callback2) => callback2(targetElement));
            }
          }
        }
      }
    });
    win.__OBSERVER_CONFIG__.watchElementDisplay.observer.observe(document, {
      childList: true,
      subtree: true
    });
    return () => {
      var _a2, _b, _c, _d, _e;
      (_a2 = queue.get(selector)) == null ? void 0 : _a2.delete(callback);
      if (!((_b = queue.get(selector)) == null ? void 0 : _b.size)) {
        queue.delete(selector);
      }
      if (!queue.size && win.__OBSERVER_CONFIG__) {
        (_e = (_d = (_c = win.__OBSERVER_CONFIG__.watchElementDisplay) == null ? void 0 : _c.observer) == null ? void 0 : _d.disconnect) == null ? void 0 : _e.call(_d);
        win.__OBSERVER_CONFIG__.watchElementDisplay = void 0;
      }
    };
  };
  const hideElCssMap = {
    "display-none": `{
    display: none !important;
  }`,
    "zero-size": `{
    width: 0 !important;
    height: 0 !important;
    padding: 0 !important;
    opacity: 0 !important;
    overflow: hidden !important;
    visibility: hidden !important;
    cursor: none !important;
    pointer-events: none !important;
  }`,
    "visibility-hidden": `{
    visibility: hidden !important;
    opacity: 0 !important;
    cursor: none !important;
    pointer-events: none !important;
  }`
  };
  const hideEl = (options) => {
    const { selector, type = "display-none", keepStyle = true, win = window } = options;
    const els = $doms(selector);
    const removeEls = () => {
      els.forEach((el) => {
        el.remove();
      });
    };
    if (els.length) {
      switch (type) {
        case "remove-once":
          removeEls();
          break;
        case "remove-realtime":
          removeEls();
          return watchElementDisplay(selector, (el) => {
            var _a;
            (_a = el == null ? void 0 : el.remove) == null ? void 0 : _a.call(el);
          });
        case "display-none":
        case "zero-size":
        case "visibility-hidden":
        default:
          return insertCss(`
        ${selector} ${hideElCssMap[type || "display-none"]}}`, {
            keepStyle,
            win
          });
      }
    }
    return noop;
  };
  const hideEls = (configs) => {
    const disposes = [];
    configs.forEach((config) => {
      if (!config)
        return;
      const { siteMatch, type, selectors, keepStyle = true, win = window } = config;
      if (!isMatchSite(siteMatch))
        return;
      let css = "";
      selectors.forEach((selector) => {
        if (!selector)
          return;
        const shouldInsertCss = hideElCssMap[type];
        if (shouldInsertCss) {
          css += `
          ${selector} ${shouldInsertCss}
        `;
          return;
        }
        disposes.push(hideEl({
          selector,
          type,
          keepStyle,
          win
        }));
      });
      if (css)
        disposes.push(insertCss(css, {
          keepStyle,
          win
        }));
    });
    return () => {
      disposes.forEach((dispose) => {
        dispose();
      });
    };
  };
  const JSM_APP_CONFIG_CHANGE_ARRAY_EVENT_NAME = "jsm-app-config-array-change";
  const JSM_GM_API_NAMESPACE = "__JSM_GM_API__";
  const JSM_APP_CONFIGS = "__JSM_APP_CONFIGS__";
  var RoutePaths;
  (function(RoutePaths2) {
    RoutePaths2["ScriptsSettingsList"] = "/scripts-settings-list";
    RoutePaths2["ScriptsMarket"] = "/scripts-market";
    RoutePaths2["SiteNavigation"] = "/site-navigation";
    RoutePaths2["NotFound"] = "/404";
  })(RoutePaths || (RoutePaths = {}));
  class GMStorage {
    constructor(namespace = DEFAULT_GM_API_NAMESPACE) {
      this.setItem = (key, value) => {
        var _a, _b;
        return (_b = (_a = this.gmApi).GM_setValue) == null ? void 0 : _b.call(_a, key, value);
      };
      this.getItem = (key, defaultValue) => {
        var _a, _b;
        return ((_b = (_a = this.gmApi) == null ? void 0 : _a.GM_getValue) == null ? void 0 : _b.call(_a, key, defaultValue)) ?? defaultValue ?? null;
      };
      this.removeItem = (key) => {
        var _a, _b;
        (_b = (_a = this.gmApi) == null ? void 0 : _a.GM_deleteValue) == null ? void 0 : _b.call(_a, key);
      };
      this.key = (index) => {
        var _a, _b;
        const keys = ((_b = (_a = this.gmApi) == null ? void 0 : _a.GM_listValues) == null ? void 0 : _b.call(_a)) || [];
        return index < keys.length ? keys[index] : null;
      };
      this.clear = () => {
        var _a, _b;
        const keys = ((_b = (_a = this.gmApi) == null ? void 0 : _a.GM_listValues) == null ? void 0 : _b.call(_a)) || [];
        keys.forEach((key) => {
          var _a2, _b2;
          (_b2 = (_a2 = this.gmApi) == null ? void 0 : _a2.GM_deleteValue) == null ? void 0 : _b2.call(_a2, key);
        });
      };
      this.namespace = namespace;
    }
    get gmApi() {
      return getGMApi(this.namespace);
    }
    // Get the number of stored items
    get length() {
      var _a, _b, _c;
      return ((_c = (_b = (_a = this.gmApi) == null ? void 0 : _a.GM_listValues) == null ? void 0 : _b.call(_a)) == null ? void 0 : _c.length) || 0;
    }
  }
  const getJsmUnsafeWindow = () => {
    return getUnsafeWindow(window, JSM_GM_API_NAMESPACE);
  };
  const jsmGmStorage = new GMStorage(JSM_GM_API_NAMESPACE);
  const getJsmAppConfigsFromWindow = () => {
    if (!document[JSM_APP_CONFIGS]) {
      document[JSM_APP_CONFIGS] = [];
    }
    return document[JSM_APP_CONFIGS];
  };
  const emitUpdateApp = () => {
    getJsmUnsafeWindow().dispatchEvent(new Event(JSM_APP_CONFIG_CHANGE_ARRAY_EVENT_NAME));
  };
  const createAppStorageKey = (namespace) => {
    return namespace;
  };
  const createPageStorageKey = (options) => {
    if (hasOwn(options, "prefix")) {
      return options.prefix + "/" + options.pageId;
    } else {
      return options.namespace + "/" + options.pageId;
    }
  };
  const createFormStorageKey = (options) => {
    if (hasOwn(options, "prefix")) {
      return options.prefix + "/" + options.formId;
    } else {
      return options.namespace + "/" + options.pageId + "/" + options.formId;
    }
  };
  const createFieldStorageKey = (options) => {
    if (hasOwn(options, "prefix")) {
      return options.prefix + "/" + options.fieldName;
    } else {
      return options.namespace + "/" + options.pageId + "/" + options.formId + "/" + options.fieldName;
    }
  };
  const updateAppStorageKey = (app, options) => {
    app.namespace = createAppStorageKey(options.namespace);
    if (options.deep) {
      updatePagesStorageKey(app.pages || [], {
        ...options,
        namespace: app.namespace
      });
    }
    return app.namespace;
  };
  const updatePageStorageKey = (page, options) => {
    page.__storageKeyPrefix__ = createPageStorageKey({
      ...options,
      pageId: page.id
    });
    if (options.deep) {
      updateFormsStorageKey(page.forms || [], {
        ...options,
        pageId: page.id
      });
    }
    return page.__storageKeyPrefix__;
  };
  const updateFormStorageKey = (form, options) => {
    form.__storageKeyPrefix__ = createFormStorageKey({
      ...options,
      formId: form.id
    });
    if (options.deep) {
      updateFieldsStorageKey(form.fields || [], {
        ...options,
        formId: form.id
      });
    }
    return form.__storageKeyPrefix__;
  };
  const updateFieldStorageKey = (field, options) => {
    field.__storageKeyPrefix__ = createFieldStorageKey({
      ...options,
      fieldName: field.name
    });
    return field.__storageKeyPrefix__;
  };
  const updateFieldsStorageKey = (fields, options) => {
    fields.forEach((field) => {
      return updateFieldStorageKey(field, options);
    });
  };
  const updateFormsStorageKey = (forms, options) => {
    forms.forEach((form) => {
      updateFormStorageKey(form, options);
      if (options.deep) {
        updateFieldsStorageKey(form.fields || [], {
          ...options,
          formId: form.id
        });
      }
    });
  };
  const updatePagesStorageKey = (pages, options) => {
    pages.forEach((page) => {
      updatePageStorageKey(page, options);
      if (options.deep) {
        updateFormsStorageKey(page.forms || [], {
          ...options,
          pageId: page.id
        });
      }
    });
  };
  const getFormDefaultValues = ({ initialValues, fields }) => {
    const _defaultValues = { ...initialValues };
    fields.forEach((field) => {
      if (["switch", "checkbox", "radio", "checkbox-group", "radio-group"].includes(field.type)) {
        _defaultValues[field.name] = field.defaultChecked ?? (initialValues == null ? void 0 : initialValues[field.name]);
      } else {
        _defaultValues[field.name] = field.defaultValue ?? (initialValues == null ? void 0 : initialValues[field.name]);
      }
    });
    return _defaultValues;
  };
  class JsmForm {
    constructor(form, options) {
      this.updateStoragePrefixKey = (options2) => {
        return updateFormStorageKey(this.data, {
          deep: true,
          ...options2
        });
      };
      this.deepUpdateChildrenStorageKey = () => {
        updateFieldsStorageKey(this.data.fields || [], {
          prefix: this.data.__storageKeyPrefix__ || ""
        });
      };
      this.storageKey = () => {
        return this.data.__storageKeyPrefix__;
      };
      this.findFieldByName = (fieldName) => {
        return this.data.fields.find((field) => field.name === fieldName) || null;
      };
      this.getDefaultValueByFieldName = (fieldName) => {
        const defaultValues = getFormDefaultValues({
          fields: this.data.fields,
          initialValues: this.data.initialValues
        });
        return defaultValues[fieldName] ?? void 0;
      };
      this.addField = (field) => {
        updateFieldStorageKey(field, {
          prefix: this.data.__storageKeyPrefix__ || ""
        });
        this.data.fields.push(field);
        emitUpdateApp();
        return JsmForm.createFieldController(field.__storageKeyPrefix__, this.getDefaultValueByFieldName(field.name));
      };
      this.deleteFieldByName = (fieldName) => {
        this.data.fields.splice(this.data.fields.findIndex((field) => field.name === fieldName), 1);
        emitUpdateApp();
      };
      this.updateFieldByName = (fieldName, updater) => {
        const field = this.findFieldByName(fieldName);
        let finalField = field;
        if (field) {
          const newField = typeof updater === "function" ? updater(field) : updater;
          finalField = newField;
          this.data.fields.splice(this.data.fields.findIndex((field2) => field2.name === fieldName), 1, newField);
        }
        if (!finalField)
          return JsmForm.createFieldController();
        updateFieldStorageKey(finalField, {
          prefix: this.data.__storageKeyPrefix__ || ""
        });
        emitUpdateApp();
        return JsmForm.createFieldController(finalField.__storageKeyPrefix__, this.getDefaultValueByFieldName(finalField.name));
      };
      const { updateStoragePrefixKey = false, deepUpdateChildrenStorageKey = true } = options || {};
      this.data = form instanceof JsmForm ? form.data : form;
      updateStoragePrefixKey && this.updateStoragePrefixKey(updateStoragePrefixKey);
      const isDeep = hasOwn(updateStoragePrefixKey, "deep") ? updateStoragePrefixKey.deep !== false : true;
      if (deepUpdateChildrenStorageKey && !isDeep) {
        deepUpdateChildrenStorageKey && this.deepUpdateChildrenStorageKey();
      }
    }
  }
  JsmForm.createFieldController = (fieldStorageKey, defaultValue) => {
    return [
      () => {
        if (fieldStorageKey) {
          return jsmGmStorage.getItem(fieldStorageKey, defaultValue);
        }
        return null;
      },
      (value) => {
        if (fieldStorageKey) {
          jsmGmStorage.setItem(fieldStorageKey, value);
        }
      }
    ];
  };
  class JsmPage {
    constructor(page, options) {
      this.updateStoragePrefixKey = (options2) => {
        return updatePageStorageKey(this.data, {
          deep: true,
          ...options2
        });
      };
      this.deepUpdateChildrenStorageKey = () => {
        updateFormsStorageKey(this.data.forms || [], {
          prefix: this.data.__storageKeyPrefix__ || "",
          deep: true
        });
      };
      this.storageKey = () => {
        return this.data.__storageKeyPrefix__;
      };
      this.findFormById = (formId) => {
        var _a, _b;
        if (!((_a = this.data.forms) == null ? void 0 : _a.length))
          return null;
        const form = (_b = this.data.forms) == null ? void 0 : _b.find((form2) => form2.id === formId);
        return form ? new JsmForm(form, {
          deepUpdateChildrenStorageKey: false
        }) : null;
      };
      this.addForm = (form) => {
        const newForm = new JsmForm(form, {
          updateStoragePrefixKey: {
            prefix: this.data.__storageKeyPrefix__ || ""
          }
        });
        const currentForm = this.findFormById(newForm.data.id);
        if (currentForm) {
          return currentForm;
        }
        if (!this.data.forms) {
          this.data.forms = [];
        }
        this.data.forms.push(newForm.data);
        emitUpdateApp();
        return newForm;
      };
      this.deleteFormById = (formId) => {
        var _a, _b;
        if (!((_a = this.data.forms) == null ? void 0 : _a.length))
          return;
        this.data.forms.splice((_b = this.data.forms) == null ? void 0 : _b.findIndex((form) => form.id === formId), 1);
        emitUpdateApp();
      };
      this.updateFormById = (formId, updater) => {
        var _a;
        if (!((_a = this.data.forms) == null ? void 0 : _a.length))
          return null;
        const form = this.findFormById(formId);
        let finalForm = form;
        if (form) {
          const newFormData = updater instanceof JsmForm ? updater.data : typeof updater === "function" ? updater(form.data) : updater;
          finalForm = new JsmForm(newFormData, {
            updateStoragePrefixKey: {
              prefix: this.data.__storageKeyPrefix__ || ""
            }
          });
          this.data.forms.splice(this.data.forms.findIndex((form2) => form2.id === formId), 1, finalForm.data);
        }
        if (!finalForm)
          return null;
        emitUpdateApp();
        return finalForm;
      };
      this.findFieldByName = (fieldName, formId) => {
        var _a;
        if (!((_a = this.data.forms) == null ? void 0 : _a.length))
          return null;
        const jsmForm = this.findFormById(formId || this.data.forms[0].id);
        return (jsmForm == null ? void 0 : jsmForm.findFieldByName(fieldName)) || null;
      };
      this.addField = (field, formId) => {
        var _a;
        if (!((_a = this.data.forms) == null ? void 0 : _a.length)) {
          console.warn("addField: No form found", { field, formId });
          return JsmForm.createFieldController();
        }
        const jsmForm = this.findFormById(formId || this.data.forms[0].id);
        if (!jsmForm) {
          console.warn("addField: No form found", { field, formId });
          return JsmForm.createFieldController();
        }
        return jsmForm.addField(field);
      };
      this.deleteField = (fieldName, formId) => {
        var _a;
        if (!((_a = this.data.forms) == null ? void 0 : _a.length)) {
          return;
        }
        const jsmForm = this.findFormById(formId || this.data.forms[0].id);
        return jsmForm == null ? void 0 : jsmForm.deleteFieldByName(fieldName);
      };
      this.updateFieldByName = (fieldName, updater, formId) => {
        var _a;
        if (!((_a = this.data.forms) == null ? void 0 : _a.length)) {
          console.warn("updateFieldByName: No form found", {
            fieldName,
            formId
          });
          return JsmForm.createFieldController();
        }
        const jsmForm = this.findFormById(formId || this.data.forms[0].id);
        if (!jsmForm) {
          console.warn("updateFieldByName: No form found", {
            fieldName,
            formId
          });
          return JsmForm.createFieldController();
        }
        return jsmForm.updateFieldByName(fieldName, updater);
      };
      const { updateStoragePrefixKey = false, deepUpdateChildrenStorageKey = true } = options || {};
      this.data = page instanceof JsmPage ? page.data : page;
      updateStoragePrefixKey && this.updateStoragePrefixKey(updateStoragePrefixKey);
      const isDeep = hasOwn(updateStoragePrefixKey, "deep") ? updateStoragePrefixKey.deep !== false : true;
      if (deepUpdateChildrenStorageKey && !isDeep) {
        deepUpdateChildrenStorageKey && this.deepUpdateChildrenStorageKey();
      }
    }
  }
  function getDefaultExportFromCjs(x) {
    return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
  }
  var eventemitter3 = { exports: {} };
  (function(module) {
    var has = Object.prototype.hasOwnProperty, prefix = "~";
    function Events() {
    }
    if (Object.create) {
      Events.prototype = /* @__PURE__ */ Object.create(null);
      if (!new Events().__proto__)
        prefix = false;
    }
    function EE(fn, context, once) {
      this.fn = fn;
      this.context = context;
      this.once = once || false;
    }
    function addListener(emitter, event, fn, context, once) {
      if (typeof fn !== "function") {
        throw new TypeError("The listener must be a function");
      }
      var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
      if (!emitter._events[evt])
        emitter._events[evt] = listener, emitter._eventsCount++;
      else if (!emitter._events[evt].fn)
        emitter._events[evt].push(listener);
      else
        emitter._events[evt] = [emitter._events[evt], listener];
      return emitter;
    }
    function clearEvent(emitter, evt) {
      if (--emitter._eventsCount === 0)
        emitter._events = new Events();
      else
        delete emitter._events[evt];
    }
    function EventEmitter2() {
      this._events = new Events();
      this._eventsCount = 0;
    }
    EventEmitter2.prototype.eventNames = function eventNames() {
      var names = [], events, name;
      if (this._eventsCount === 0)
        return names;
      for (name in events = this._events) {
        if (has.call(events, name))
          names.push(prefix ? name.slice(1) : name);
      }
      if (Object.getOwnPropertySymbols) {
        return names.concat(Object.getOwnPropertySymbols(events));
      }
      return names;
    };
    EventEmitter2.prototype.listeners = function listeners(event) {
      var evt = prefix ? prefix + event : event, handlers = this._events[evt];
      if (!handlers)
        return [];
      if (handlers.fn)
        return [handlers.fn];
      for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
        ee[i] = handlers[i].fn;
      }
      return ee;
    };
    EventEmitter2.prototype.listenerCount = function listenerCount(event) {
      var evt = prefix ? prefix + event : event, listeners = this._events[evt];
      if (!listeners)
        return 0;
      if (listeners.fn)
        return 1;
      return listeners.length;
    };
    EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
      var evt = prefix ? prefix + event : event;
      if (!this._events[evt])
        return false;
      var listeners = this._events[evt], len = arguments.length, args, i;
      if (listeners.fn) {
        if (listeners.once)
          this.removeListener(event, listeners.fn, void 0, true);
        switch (len) {
          case 1:
            return listeners.fn.call(listeners.context), true;
          case 2:
            return listeners.fn.call(listeners.context, a1), true;
          case 3:
            return listeners.fn.call(listeners.context, a1, a2), true;
          case 4:
            return listeners.fn.call(listeners.context, a1, a2, a3), true;
          case 5:
            return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
          case 6:
            return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
        }
        for (i = 1, args = new Array(len - 1); i < len; i++) {
          args[i - 1] = arguments[i];
        }
        listeners.fn.apply(listeners.context, args);
      } else {
        var length = listeners.length, j;
        for (i = 0; i < length; i++) {
          if (listeners[i].once)
            this.removeListener(event, listeners[i].fn, void 0, true);
          switch (len) {
            case 1:
              listeners[i].fn.call(listeners[i].context);
              break;
            case 2:
              listeners[i].fn.call(listeners[i].context, a1);
              break;
            case 3:
              listeners[i].fn.call(listeners[i].context, a1, a2);
              break;
            case 4:
              listeners[i].fn.call(listeners[i].context, a1, a2, a3);
              break;
            default:
              if (!args)
                for (j = 1, args = new Array(len - 1); j < len; j++) {
                  args[j - 1] = arguments[j];
                }
              listeners[i].fn.apply(listeners[i].context, args);
          }
        }
      }
      return true;
    };
    EventEmitter2.prototype.on = function on(event, fn, context) {
      return addListener(this, event, fn, context, false);
    };
    EventEmitter2.prototype.once = function once(event, fn, context) {
      return addListener(this, event, fn, context, true);
    };
    EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {
      var evt = prefix ? prefix + event : event;
      if (!this._events[evt])
        return this;
      if (!fn) {
        clearEvent(this, evt);
        return this;
      }
      var listeners = this._events[evt];
      if (listeners.fn) {
        if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
          clearEvent(this, evt);
        }
      } else {
        for (var i = 0, events = [], length = listeners.length; i < length; i++) {
          if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
            events.push(listeners[i]);
          }
        }
        if (events.length)
          this._events[evt] = events.length === 1 ? events[0] : events;
        else
          clearEvent(this, evt);
      }
      return this;
    };
    EventEmitter2.prototype.removeAllListeners = function removeAllListeners(event) {
      var evt;
      if (event) {
        evt = prefix ? prefix + event : event;
        if (this._events[evt])
          clearEvent(this, evt);
      } else {
        this._events = new Events();
        this._eventsCount = 0;
      }
      return this;
    };
    EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
    EventEmitter2.prototype.addListener = EventEmitter2.prototype.on;
    EventEmitter2.prefixed = prefix;
    EventEmitter2.EventEmitter = EventEmitter2;
    {
      module.exports = EventEmitter2;
    }
  })(eventemitter3);
  var eventemitter3Exports = eventemitter3.exports;
  const EventEmitter = /* @__PURE__ */ getDefaultExportFromCjs(eventemitter3Exports);
  class Jsm extends EventEmitter {
    constructor(appConfig, options) {
      super();
      this.deepUpdateChildrenStorageKey = () => {
        updatePagesStorageKey(this.data.pages, {
          namespace: this.data.namespace,
          deep: true
        });
      };
      this.updateStoragePrefixKey = (options2) => {
        return updateAppStorageKey(this.data, {
          deep: true,
          ...options2
        });
      };
      this.init = () => {
        var _a;
        if ((_a = getJsmAppConfigsFromWindow()) == null ? void 0 : _a.find((config) => config.namespace === this.data.namespace)) {
          console.warn(`Jsm: namespace "${this.data.namespace}" already exists.`);
          return;
        }
        getJsmAppConfigsFromWindow().push(this.data);
        emitUpdateApp();
      };
      this.storageKey = () => {
        return createAppStorageKey(this.data.namespace);
      };
      this.goToPage = (pageId) => {
        this.emit("goToPage", pageId);
      };
      this.findPageById = (pageId) => {
        const page = this.data.pages.find((page2) => page2.id === pageId);
        return page ? new JsmPage(page, {
          deepUpdateChildrenStorageKey: false
        }) : null;
      };
      this.addPage = (page) => {
        const newPage = new JsmPage(page, {
          updateStoragePrefixKey: {
            namespace: this.data.namespace
          }
        });
        const currentPage = this.findPageById(newPage.data.id);
        if (currentPage) {
          return currentPage;
        }
        this.data.pages.push(newPage.data);
        emitUpdateApp();
        return newPage;
      };
      this.deletePageById = (pageId) => {
        this.data.pages.splice(this.data.pages.findIndex((page) => page.id === pageId), 1);
        emitUpdateApp();
      };
      this.updatePageById = (pageId, updater) => {
        const page = this.findPageById(pageId);
        let finalPage = page;
        if (page) {
          const newPageData = updater instanceof JsmPage ? updater.data : typeof updater === "function" ? updater(page.data) : updater;
          finalPage = new JsmPage(newPageData, {
            updateStoragePrefixKey: {
              namespace: this.data.namespace
            }
          });
          this.data.pages.splice(this.data.pages.findIndex((page2) => page2.id === pageId), 1, finalPage.data);
        }
        if (!finalPage)
          return null;
        emitUpdateApp();
        return finalPage;
      };
      const { updateStoragePrefixKey = false, deepUpdateChildrenStorageKey = true } = options || {};
      if (appConfig.namespace.includes("/")) {
        throw new Error(`Jsm: namespace "${appConfig.namespace}" should not include "/"`);
      }
      this.data = { ...appConfig, emitter: this };
      updateStoragePrefixKey && this.updateStoragePrefixKey(updateStoragePrefixKey);
      const isDeep = hasOwn(updateStoragePrefixKey, "deep") ? updateStoragePrefixKey.deep !== false : true;
      if (deepUpdateChildrenStorageKey && !isDeep) {
        deepUpdateChildrenStorageKey && this.deepUpdateChildrenStorageKey();
      }
    }
  }
  var _GM = /* @__PURE__ */ (() => typeof GM != "undefined" ? GM : void 0)();
  var _GM_addElement = /* @__PURE__ */ (() => typeof GM_addElement != "undefined" ? GM_addElement : void 0)();
  var _GM_addStyle = /* @__PURE__ */ (() => typeof GM_addStyle != "undefined" ? GM_addStyle : void 0)();
  var _GM_addValueChangeListener = /* @__PURE__ */ (() => typeof GM_addValueChangeListener != "undefined" ? GM_addValueChangeListener : void 0)();
  var _GM_cookie = /* @__PURE__ */ (() => typeof GM_cookie != "undefined" ? GM_cookie : void 0)();
  var _GM_deleteValue = /* @__PURE__ */ (() => typeof GM_deleteValue != "undefined" ? GM_deleteValue : void 0)();
  var _GM_download = /* @__PURE__ */ (() => typeof GM_download != "undefined" ? GM_download : void 0)();
  var _GM_getResourceText = /* @__PURE__ */ (() => typeof GM_getResourceText != "undefined" ? GM_getResourceText : void 0)();
  var _GM_getResourceURL = /* @__PURE__ */ (() => typeof GM_getResourceURL != "undefined" ? GM_getResourceURL : void 0)();
  var _GM_getTab = /* @__PURE__ */ (() => typeof GM_getTab != "undefined" ? GM_getTab : void 0)();
  var _GM_getTabs = /* @__PURE__ */ (() => typeof GM_getTabs != "undefined" ? GM_getTabs : void 0)();
  var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
  var _GM_info = /* @__PURE__ */ (() => typeof GM_info != "undefined" ? GM_info : void 0)();
  var _GM_listValues = /* @__PURE__ */ (() => typeof GM_listValues != "undefined" ? GM_listValues : void 0)();
  var _GM_log = /* @__PURE__ */ (() => typeof GM_log != "undefined" ? GM_log : void 0)();
  var _GM_notification = /* @__PURE__ */ (() => typeof GM_notification != "undefined" ? GM_notification : void 0)();
  var _GM_openInTab = /* @__PURE__ */ (() => typeof GM_openInTab != "undefined" ? GM_openInTab : void 0)();
  var _GM_registerMenuCommand = /* @__PURE__ */ (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : void 0)();
  var _GM_removeValueChangeListener = /* @__PURE__ */ (() => typeof GM_removeValueChangeListener != "undefined" ? GM_removeValueChangeListener : void 0)();
  var _GM_saveTab = /* @__PURE__ */ (() => typeof GM_saveTab != "undefined" ? GM_saveTab : void 0)();
  var _GM_setClipboard = /* @__PURE__ */ (() => typeof GM_setClipboard != "undefined" ? GM_setClipboard : void 0)();
  var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
  var _GM_unregisterMenuCommand = /* @__PURE__ */ (() => typeof GM_unregisterMenuCommand != "undefined" ? GM_unregisterMenuCommand : void 0)();
  var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)();
  var _GM_webRequest = /* @__PURE__ */ (() => typeof GM_webRequest != "undefined" ? GM_webRequest : void 0)();
  var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)();
  var _monkeyWindow = /* @__PURE__ */ (() => window)();
  const GMApi = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
    __proto__: null,
    GM: _GM,
    GM_addElement: _GM_addElement,
    GM_addStyle: _GM_addStyle,
    GM_addValueChangeListener: _GM_addValueChangeListener,
    GM_cookie: _GM_cookie,
    GM_deleteValue: _GM_deleteValue,
    GM_download: _GM_download,
    GM_getResourceText: _GM_getResourceText,
    GM_getResourceURL: _GM_getResourceURL,
    GM_getTab: _GM_getTab,
    GM_getTabs: _GM_getTabs,
    GM_getValue: _GM_getValue,
    GM_info: _GM_info,
    GM_listValues: _GM_listValues,
    GM_log: _GM_log,
    GM_notification: _GM_notification,
    GM_openInTab: _GM_openInTab,
    GM_registerMenuCommand: _GM_registerMenuCommand,
    GM_removeValueChangeListener: _GM_removeValueChangeListener,
    GM_saveTab: _GM_saveTab,
    GM_setClipboard: _GM_setClipboard,
    GM_setValue: _GM_setValue,
    GM_unregisterMenuCommand: _GM_unregisterMenuCommand,
    GM_webRequest: _GM_webRequest,
    GM_xmlhttpRequest: _GM_xmlhttpRequest,
    monkeyWindow: _monkeyWindow,
    unsafeWindow: _unsafeWindow
  }, Symbol.toStringTag, { value: "Module" }));
  const jsm = new Jsm({
    namespace: _GM_info.script.namespace + "-" + _GM_info.script.name,
    name: _GM_info.script.name,
    author: _GM_info.script.author,
    authorAvatarUrl: "https://i1.hdslb.com/bfs/face/0cda8249c100d380c505e13494aa87f7c1acde5f.jpg@120w_120h_1c.webp",
    description: _GM_info.script.description,
    iconUrl: _GM_info.script.icon,
    pages: []
  });
  const cleanMobileBaidu = () => {
    const siteMatch = ["m.baidu.com", "www.baidu.com"];
    const imageSiteMatch = ["image.baidu.com", "m.baidu.com"];
    const baijiaSiteMatch = ["baijiahao.baidu.com"];
    const baikeSiteMatch = ["baike.baidu.com"];
    const cleanBaiduSettingPage = new JsmPage({
      id: "clean-mobile-baidu-setting",
      title: "百度手机版去广告设置",
      forms: [
        {
          id: "clean-mobile-baidu-setting-form",
          siteMatchers: [
            siteMatch,
            imageSiteMatch,
            baijiaSiteMatch,
            baikeSiteMatch
          ],
          fields: []
        }
      ]
    });
    jsm.addPage(cleanBaiduSettingPage);
    const [getCleanTextSearchAd] = cleanBaiduSettingPage.addField({
      type: "switch",
      name: "去除文字搜索页面广告",
      defaultChecked: true
    });
    const [getCleanImageSearchAd] = cleanBaiduSettingPage.addField({
      type: "switch",
      name: "去除图片搜索页面广告",
      defaultChecked: true
    });
    const [getCleanBaijiaAd] = cleanBaiduSettingPage.addField({
      type: "switch",
      name: "去除百家号广告",
      defaultChecked: true
    });
    const [getCleanBaikeAd] = cleanBaiduSettingPage.addField({
      type: "switch",
      name: "去除百科广告",
      defaultChecked: true
    });
    hideEls([
      getCleanTextSearchAd() && {
        siteMatch,
        type: "zero-size",
        selectors: [".ec_wise_ad", ".short-mini-wrapper"]
      },
      getCleanTextSearchAd() && {
        siteMatch,
        type: "display-none",
        selectors: [
          "#header > #navs+script+div",
          ".tab-news-content",
          ".square-enterance",
          ".tab_news",
          "#bottom",
          ".callicon-wrap",
          ".his-no-rec",
          ".rw-list-container .c-line-clamp1",
          ".c-atom-afterclick-recomm-wrap .c-line-clamp1",
          "#copyright + div",
          "#page-copyright",
          ".sfc-video-page-info-bottom-line",
          ".sfc-video-page-info-bottom-line + div",
          ".sfc-video-page-info-bottom-line + div + div"
        ]
      },
      getCleanImageSearchAd() && {
        siteMatch: imageSiteMatch,
        type: "display-none",
        selectors: [
          ".sfc-image-content-ad-xg-cell",
          ".icon-download",
          ".icon-download + div"
        ]
      },
      getCleanBaijiaAd() && {
        siteMatch: baijiaSiteMatch,
        type: "display-none",
        selectors: [
          ".newHeadDeflectorContainer",
          "#searchwordSdk + div",
          "#bdrainrwDragButton",
          "#wise-invoke-interact-bar",
          ".invokeAppBtnWrapper",
          "#content_wrapper  .horizontal",
          ".newFollowSuper"
        ]
      },
      getCleanBaikeAd() && {
        siteMatch: baikeSiteMatch,
        type: "display-none",
        selectors: [".BK-after-content-wrapper", '[class*="lemma-attention"]']
      }
    ]);
    if (isMatchSite(siteMatch) && getCleanTextSearchAd()) {
      watchElementDisplay(".result", (el) => {
        var _a, _b;
        if ((_b = (_a = el.querySelector(".se_st_footer")) == null ? void 0 : _a.innerText) == null ? void 0 : _b.match("百度APP内打开")) {
          el.remove();
        }
      });
    }
    insertCss(
      `
  body {
    background-color: #fff;
    min-height: 100vh;
  }
  `,
      {
        keepStyle: true
      }
    );
  };
  const cleanPCBaidu = () => {
    const siteMatch = ["www.baidu.com"];
    const imageSiteMatch = ["image.baidu.com"];
    const cleanBaiduSettingPage = new JsmPage({
      id: "clean-pc-baidu-setting",
      title: "百度电脑版去广告设置",
      forms: [
        {
          id: "clean-pc-baidu-setting-form",
          siteMatchers: [siteMatch, imageSiteMatch],
          fields: []
        }
      ]
    });
    jsm.addPage(cleanBaiduSettingPage);
    const [getCleanTextSearchAd] = cleanBaiduSettingPage.addField({
      type: "switch",
      name: "去除文字搜索页面广告",
      defaultChecked: true
    });
    const [getCleanImageSearchAd] = cleanBaiduSettingPage.addField({
      type: "switch",
      name: "去除图片搜索页面广告",
      defaultChecked: true
    });
    hideEls([
      getCleanTextSearchAd() && {
        siteMatch,
        type: "zero-size",
        selectors: ["[data-placeid]"]
      },
      getCleanTextSearchAd() && {
        siteMatch,
        type: "display-none",
        selectors: [
          "#s_main",
          ".tenon_pc_material",
          "#content_right",
          "#foot",
          "#searchTag"
        ]
      },
      getCleanImageSearchAd() && {
        siteMatch: imageSiteMatch,
        type: "display-none",
        selectors: [".newfcImgli"]
      }
    ]);
    if (isMatchSite(siteMatch) && getCleanTextSearchAd()) {
      watchElementDisplay(".result", (el) => {
        var _a, _b;
        if ((_b = (_a = el.querySelector(".se_st_footer")) == null ? void 0 : _a.innerText) == null ? void 0 : _b.match("广告")) {
          el.remove();
        }
      });
    }
  };
  const cleanPCBilibili = () => {
    const siteMatch = ["www.bilibili.com"];
    const cleanBilibiliSettingPage = new JsmPage({
      id: "clean-pc-bilibili-setting",
      title: "B站电脑版去广告设置",
      forms: [
        {
          id: "clean-pc-bilibili-setting-form",
          siteMatchers: [siteMatch],
          fields: []
        }
      ]
    });
    jsm.addPage(cleanBilibiliSettingPage);
    const [getCleanCommonAd] = cleanBilibiliSettingPage.addField({
      type: "switch",
      name: "去除B站普通广告",
      defaultChecked: true
    });
    hideEls([
      getCleanCommonAd() && {
        siteMatch,
        type: "display-none",
        selectors: [
          ".floor-single-card",
          ".bili-header__bar li.v-popover-wrap:last-child",
          "[data-loc-id]",
          ".left-loc-entry",
          ".vip-wrap",
          ".storage-box",
          ".international-footer"
        ]
      }
    ]);
    if (isMatchSite(siteMatch) && getCleanCommonAd()) {
      watchElementDisplay(".bili-video-card", (el) => {
        var _a;
        if (el == null ? void 0 : el.querySelector(".bili-video-card__info--ad")) {
          el.remove();
          if ((_a = el.parentElement) == null ? void 0 : _a.classList.contains("feed-card")) {
            el.parentElement.remove();
          }
        }
      });
    }
  };
  const cleanPCCsdn = () => {
    const siteMatch = [/\.csdn\.net/];
    const cleanCsdnSettingPage = new JsmPage({
      id: "clean-pc-csdn-setting",
      title: "CSDN电脑版去广告设置",
      forms: [
        {
          id: "clean-pc-csdn-setting-form",
          siteMatchers: [siteMatch],
          fields: []
        }
      ]
    });
    jsm.addPage(cleanCsdnSettingPage);
    const [getCleanCommonAd] = cleanCsdnSettingPage.addField({
      type: "switch",
      name: "去除CSDN普通广告",
      defaultChecked: true
    });
    hideEls([
      getCleanCommonAd() && {
        siteMatch,
        type: "display-none",
        selectors: [
          "#asideWriteGuide",
          "#csdn-toolbar-write",
          ".toolbar-btns.onlyUser",
          ".toolbar-menus.csdn-toolbar-fl",
          ".csdn-toolbar-creative-mp",
          ".programmer1Box",
          ".csdn-side-toolbar",
          ".left-toolbox",
          ".aside-content",
          "#asideHotArticle",
          "#asideCategory",
          "#asideNewComments",
          "#asideNewNps",
          "#asideArchive",
          ".passport-login-container",
          "#treeSkill",
          ".more-toolbox-new",
          ".recommend-box",
          "#recommendNps"
        ]
      },
      getCleanCommonAd() && {
        siteMatch,
        type: "zero-size",
        selectors: [".kind_person", "#asideSearchArticle", "#asideArchive"]
      }
    ]);
  };
  const cleanPCGoogle = () => {
    const siteMatch = ["www.google.com"];
    const cleanGoogleSettingPage = new JsmPage({
      id: "clean-pc-google-setting",
      title: "谷歌电脑版去广告设置",
      forms: [
        {
          id: "clean-pc-google-setting-form",
          siteMatchers: [siteMatch],
          fields: []
        }
      ]
    });
    jsm.addPage(cleanGoogleSettingPage);
    const [getCleanCommonAd] = cleanGoogleSettingPage.addField({
      type: "switch",
      name: "去除谷歌普通广告",
      defaultChecked: true
    });
    hideEls([
      getCleanCommonAd() && {
        siteMatch,
        type: "display-none",
        selectors: [
          '[aria-label="Ads"]',
          "#tvcap",
          '[data-id^="Carousel"]',
          "#atvcap"
        ]
      }
    ]);
  };
  const cleanPCHuya = () => {
    const siteMatch = ["www.huya.com"];
    const cleanHuyaSettingPage = new JsmPage({
      id: "clean-pc-huya-setting",
      title: "虎牙电脑版去广告设置",
      forms: [
        {
          id: "clean-pc-huya-setting-form",
          siteMatchers: [siteMatch],
          fields: []
        }
      ]
    });
    jsm.addPage(cleanHuyaSettingPage);
    const [getCleanCommonAd] = cleanHuyaSettingPage.addField({
      type: "switch",
      name: "去除虎牙普通广告",
      defaultChecked: true
    });
    hideEls([
      getCleanCommonAd() && {
        siteMatch,
        type: "display-none",
        selectors: [
          ".hy-nav-item-youliao",
          'div[class*="helperbar-root"]',
          ".mod-sidebar .sidebar-banner",
          ".sidebar-bottom",
          ".hy-nav-item-game",
          ".hy-nav-item-cloudGame",
          'div[class*="NavKaiBo"]',
          'div[class*="NavDownload"]',
          ".room-gg-chat",
          ".room-gg-top",
          ".gamePromote-bd",
          ".player-app-qrcode",
          ".room-youlike",
          ".room-moments",
          ".jump-to-phone",
          ".room-gamePromote",
          ".illegal-report",
          ".share-entrance",
          ".room-gg-1",
          '[class*="Ad--"]',
          '[class*="taskTips--"]',
          '[class*="GuangG--"]',
          '[class*="game-filter-tips--"]',
          '.chat-wrap-panel.wrap-ext [class*="popup"]',
          ".room-footer",
          ".danmu-report-tips",
          ".xxSlider",
          ".list-adx",
          ".liveList-header-r",
          ".hy-nav-item-match",
          ".huya-footer",
          ".mod-news-section",
          "a.third-clickstat",
          ".mod-index-recommend",
          "#player-download-guide-tip",
          ".player-banner-gift",
          "#player-marquee-wrap",
          ".room-business-game"
        ]
      }
    ]);
  };
  const cleanPCStackoverflow = () => {
    const siteMatch = ["stackoverflow.com"];
    const cleanStackoverflowSettingPage = new JsmPage({
      id: "clean-pc-stackoverflow-setting",
      title: "Stackoverflow电脑版去广告设置",
      forms: [
        {
          id: "clean-pc-stackoverflow-setting-form",
          siteMatchers: [siteMatch],
          fields: []
        }
      ]
    });
    jsm.addPage(cleanStackoverflowSettingPage);
    const [getCleanCommonAd] = cleanStackoverflowSettingPage.addField({
      type: "switch",
      name: "去除Stackoverflow普通广告",
      defaultChecked: true
    });
    hideEls([
      getCleanCommonAd() && {
        siteMatch,
        type: "display-none",
        selectors: [
          ".js-zone-container",
          ".show-votes",
          "#left-sidebar",
          ".js-dismissable-hero",
          "#footer",
          ".s-navigation",
          ".js-consent-banner"
        ]
      }
    ]);
  };
  const cleanPCZhihu = () => {
    const siteMatch = [/\.zhihu\.com/];
    const cleanZhihuSettingPage = new JsmPage({
      id: "clean-pc-zhihu-setting",
      title: "知乎电脑版去广告设置",
      forms: [
        {
          id: "clean-pc-zhihu-setting-form",
          siteMatchers: [siteMatch],
          fields: []
        }
      ]
    });
    jsm.addPage(cleanZhihuSettingPage);
    const [getCleanCommonAd] = cleanZhihuSettingPage.addField({
      type: "switch",
      name: "去除知乎普通广告",
      defaultChecked: true
    });
    hideEls([
      getCleanCommonAd() && {
        siteMatch,
        type: "display-none",
        selectors: [
          ".Business-Card-PcRightBanner-link",
          '[data-za-detail-view-path-module="RightSideBar"] div.Card:nth-child(2)',
          "footer",
          ".GlobalSideBar-serviceItem",
          ".GlobalSideBar-help-centerItem",
          ".GlobalSideBar-copyrightItem"
        ]
      }
    ]);
    if (isMatchSite(siteMatch) && getCleanCommonAd()) {
      watchElementDisplay(".Banner-link", (el) => {
        var _a;
        if ((_a = el.parentElement) == null ? void 0 : _a.classList.contains("Pc-card")) {
          el.parentElement.remove();
        }
        el.remove();
      });
    }
  };
  const onEarliestPageLoad = (callback, win = window) => {
    let isLoad = false;
    const load = () => {
      if (isLoad) {
        return;
      }
      isLoad = true;
      callback();
    };
    win.document.addEventListener("DOMContentLoaded", load);
    win.addEventListener("load", load);
  };
  initGMApi(GMApi);
  onEarliestPageLoad(() => {
    cleanPCBilibili();
    cleanPCHuya();
    cleanPCStackoverflow();
    cleanPCBaidu();
    cleanMobileBaidu();
    cleanPCGoogle();
    cleanPCCsdn();
    cleanPCZhihu();
    jsm.init();
  });

})();