Full Code of nicolargo/glances for AI

develop 830cacd0ca6f cached
434 files
6.1 MB
1.6M tokens
3995 symbols
1 requests
Download .txt
Showing preview only (6,502K chars total). Download the full file or copy to clipboard to get everything.
Repository: nicolargo/glances
Branch: develop
Commit: 830cacd0ca6f
Files: 434
Total size: 6.1 MB

Directory structure:
gitextract_f5ze888j/

├── .cgcignore
├── .claude/
│   ├── settings.json
│   └── skills/
│       ├── debug.md
│       ├── docker.md
│       ├── lint.md
│       ├── new-export.md
│       ├── new-plugin.md
│       ├── review.md
│       ├── test.md
│       └── webui.md
├── .coveragerc
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── build.yml
│       ├── build_docker.yml
│       ├── ci.yml
│       ├── cyber.yml
│       ├── inactive_issues.yml
│       ├── needs_contributor.yml
│       ├── quality.yml
│       ├── test.yml
│       └── webui.yml
├── .gitignore
├── .mailmap
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── .reuse/
│   └── dep5
├── AUTHORS
├── CLAUDE.md
├── CODE-OF-CONDUCT.md
├── CONTRIBUTING.md
├── COPYING
├── LICENSES/
│   └── LGPL-3.0-only.txt
├── MANIFEST.in
├── Makefile
├── NEWS.rst
├── README-pypi.rst
├── README.rst
├── SECURITY.md
├── all-requirements.txt
├── appveyor.yml
├── conf/
│   ├── empty.conf
│   ├── fetch-templates/
│   │   ├── short.jinja
│   │   └── with-logo.jinja
│   ├── glances-grafana-flux.json
│   ├── glances-grafana-influxql.json
│   └── glances.conf
├── dev-requirements.txt
├── docker-bin.sh
├── docker-compose/
│   ├── docker-compose.yml
│   └── glances.conf
├── docker-files/
│   ├── README.md
│   ├── alpine.Dockerfile
│   ├── docker-logger.json
│   └── ubuntu.Dockerfile
├── docker-requirements.txt
├── docs/
│   ├── Makefile
│   ├── README.txt
│   ├── _static/
│   │   ├── glances-architecture.excalidraw
│   │   └── glances-pyinstrument.html
│   ├── _templates/
│   │   └── links.html
│   ├── aoa/
│   │   ├── actions.rst
│   │   ├── amps.rst
│   │   ├── cloud.rst
│   │   ├── connections.rst
│   │   ├── containers.rst
│   │   ├── cpu.rst
│   │   ├── diskio.rst
│   │   ├── events.rst
│   │   ├── folders.rst
│   │   ├── fs.rst
│   │   ├── gpu.rst
│   │   ├── hddtemp.rst
│   │   ├── header.rst
│   │   ├── index.rst
│   │   ├── irq.rst
│   │   ├── load.rst
│   │   ├── memory.rst
│   │   ├── network.rst
│   │   ├── npu.rst
│   │   ├── ports.rst
│   │   ├── ps.rst
│   │   ├── quicklook.rst
│   │   ├── raid.rst
│   │   ├── sensors.rst
│   │   ├── smart.rst
│   │   ├── vms.rst
│   │   └── wifi.rst
│   ├── api/
│   │   ├── mcp.rst
│   │   ├── openapi.json
│   │   ├── python.rst
│   │   └── restful.rst
│   ├── build.sh
│   ├── cmds.rst
│   ├── conf.py
│   ├── config.rst
│   ├── dev/
│   │   └── README.txt
│   ├── docker.rst
│   ├── faq.rst
│   ├── fetch.rst
│   ├── glances.rst
│   ├── gw/
│   │   ├── cassandra.rst
│   │   ├── couchdb.rst
│   │   ├── csv.rst
│   │   ├── duckdb.rst
│   │   ├── elastic.rst
│   │   ├── graph.rst
│   │   ├── graphite.rst
│   │   ├── index.rst
│   │   ├── influxdb.rst
│   │   ├── json.rst
│   │   ├── kafka.rst
│   │   ├── mongodb.rst
│   │   ├── mqtt.rst
│   │   ├── nats.rst
│   │   ├── opentsdb.rst
│   │   ├── prometheus.rst
│   │   ├── rabbitmq.rst
│   │   ├── restful.rst
│   │   ├── riemann.rst
│   │   ├── statsd.rst
│   │   ├── timescaledb.rst
│   │   └── zeromq.rst
│   ├── index.rst
│   ├── install.rst
│   ├── make.bat
│   ├── man/
│   │   └── glances.1
│   ├── objects.inv
│   ├── quickstart.rst
│   └── support.rst
├── generate_openapi.py
├── generate_webui_conf.py
├── glances/
│   ├── README.txt
│   ├── __init__.py
│   ├── __main__.py
│   ├── actions.py
│   ├── amps/
│   │   ├── __init__.py
│   │   ├── amp.py
│   │   ├── default/
│   │   │   └── __init__.py
│   │   ├── nginx/
│   │   │   └── __init__.py
│   │   ├── systemd/
│   │   │   └── __init__.py
│   │   └── systemv/
│   │       └── __init__.py
│   ├── amps_list.py
│   ├── api.py
│   ├── attribute.py
│   ├── client.py
│   ├── client_browser.py
│   ├── config.py
│   ├── cpu_percent.py
│   ├── event.py
│   ├── events_list.py
│   ├── exports/
│   │   ├── README.rst
│   │   ├── __init__.py
│   │   ├── export.py
│   │   ├── export_asyncio.py
│   │   ├── glances_cassandra/
│   │   │   └── __init__.py
│   │   ├── glances_couchdb/
│   │   │   └── __init__.py
│   │   ├── glances_csv/
│   │   │   └── __init__.py
│   │   ├── glances_duckdb/
│   │   │   └── __init__.py
│   │   ├── glances_elasticsearch/
│   │   │   └── __init__.py
│   │   ├── glances_graph/
│   │   │   └── __init__.py
│   │   ├── glances_graphite/
│   │   │   └── __init__.py
│   │   ├── glances_influxdb/
│   │   │   └── __init__.py
│   │   ├── glances_influxdb2/
│   │   │   └── __init__.py
│   │   ├── glances_influxdb3/
│   │   │   └── __init__.py
│   │   ├── glances_json/
│   │   │   └── __init__.py
│   │   ├── glances_kafka/
│   │   │   └── __init__.py
│   │   ├── glances_mongodb/
│   │   │   └── __init__.py
│   │   ├── glances_mqtt/
│   │   │   └── __init__.py
│   │   ├── glances_nats/
│   │   │   └── __init__.py
│   │   ├── glances_opentsdb/
│   │   │   └── __init__.py
│   │   ├── glances_prometheus/
│   │   │   └── __init__.py
│   │   ├── glances_rabbitmq/
│   │   │   └── __init__.py
│   │   ├── glances_restful/
│   │   │   └── __init__.py
│   │   ├── glances_riemann/
│   │   │   └── __init__.py
│   │   ├── glances_statsd/
│   │   │   └── __init__.py
│   │   ├── glances_timescaledb/
│   │   │   └── __init__.py
│   │   └── glances_zeromq/
│   │       └── __init__.py
│   ├── filter.py
│   ├── folder_list.py
│   ├── globals.py
│   ├── history.py
│   ├── jwt_utils.py
│   ├── logger.py
│   ├── main.py
│   ├── outdated.py
│   ├── outputs/
│   │   ├── __init__.py
│   │   ├── glances_bars.py
│   │   ├── glances_colors.py
│   │   ├── glances_curses.py
│   │   ├── glances_curses_browser.py
│   │   ├── glances_json_serializer.py
│   │   ├── glances_mcp.py
│   │   ├── glances_restful_api.py
│   │   ├── glances_sparklines.py
│   │   ├── glances_stdout.py
│   │   ├── glances_stdout_api_doc.py
│   │   ├── glances_stdout_api_restful_doc.py
│   │   ├── glances_stdout_csv.py
│   │   ├── glances_stdout_fetch.py
│   │   ├── glances_stdout_issue.py
│   │   ├── glances_stdout_json.py
│   │   ├── glances_unicode.py
│   │   └── static/
│   │       ├── .prettierrc.js
│   │       ├── README.md
│   │       ├── css/
│   │       │   ├── custom.scss
│   │       │   └── style.scss
│   │       ├── eslint.config.mjs
│   │       ├── js/
│   │       │   ├── App.vue
│   │       │   ├── Browser.vue
│   │       │   ├── app.js
│   │       │   ├── browser.js
│   │       │   ├── components/
│   │       │   │   ├── help.vue
│   │       │   │   ├── plugin-alert.vue
│   │       │   │   ├── plugin-amps.vue
│   │       │   │   ├── plugin-cloud.vue
│   │       │   │   ├── plugin-connections.vue
│   │       │   │   ├── plugin-containers.vue
│   │       │   │   ├── plugin-cpu.vue
│   │       │   │   ├── plugin-diskio.vue
│   │       │   │   ├── plugin-folders.vue
│   │       │   │   ├── plugin-fs.vue
│   │       │   │   ├── plugin-gpu.vue
│   │       │   │   ├── plugin-hostname.vue
│   │       │   │   ├── plugin-ip.vue
│   │       │   │   ├── plugin-irq.vue
│   │       │   │   ├── plugin-load.vue
│   │       │   │   ├── plugin-mem.vue
│   │       │   │   ├── plugin-memswap.vue
│   │       │   │   ├── plugin-network.vue
│   │       │   │   ├── plugin-now.vue
│   │       │   │   ├── plugin-npu.vue
│   │       │   │   ├── plugin-percpu.vue
│   │       │   │   ├── plugin-ports.vue
│   │       │   │   ├── plugin-process.vue
│   │       │   │   ├── plugin-processcount.vue
│   │       │   │   ├── plugin-processlist.vue
│   │       │   │   ├── plugin-quicklook.vue
│   │       │   │   ├── plugin-raid.vue
│   │       │   │   ├── plugin-sensors.vue
│   │       │   │   ├── plugin-smart.vue
│   │       │   │   ├── plugin-system.vue
│   │       │   │   ├── plugin-uptime.vue
│   │       │   │   ├── plugin-vms.vue
│   │       │   │   └── plugin-wifi.vue
│   │       │   ├── filters.js
│   │       │   ├── services.js
│   │       │   ├── store.js
│   │       │   └── uiconfig.json
│   │       ├── package.json
│   │       ├── public/
│   │       │   ├── browser.js
│   │       │   └── glances.js
│   │       ├── templates/
│   │       │   ├── browser.html
│   │       │   └── index.html
│   │       └── webpack.config.js
│   ├── password.py
│   ├── password_list.py
│   ├── plugins/
│   │   ├── README.rst
│   │   ├── __init__.py
│   │   ├── alert/
│   │   │   └── __init__.py
│   │   ├── amps/
│   │   │   └── __init__.py
│   │   ├── cloud/
│   │   │   └── __init__.py
│   │   ├── connections/
│   │   │   └── __init__.py
│   │   ├── containers/
│   │   │   ├── __init__.py
│   │   │   └── engines/
│   │   │       ├── __init__.py
│   │   │       ├── docker.py
│   │   │       ├── lxd.py
│   │   │       └── podman.py
│   │   ├── core/
│   │   │   └── __init__.py
│   │   ├── cpu/
│   │   │   └── __init__.py
│   │   ├── diskio/
│   │   │   └── __init__.py
│   │   ├── folders/
│   │   │   └── __init__.py
│   │   ├── fs/
│   │   │   ├── __init__.py
│   │   │   └── zfs.py
│   │   ├── gpu/
│   │   │   ├── __init__.py
│   │   │   └── cards/
│   │   │       ├── __init__.py
│   │   │       ├── amd.py
│   │   │       ├── intel.py
│   │   │       └── nvidia.py
│   │   ├── help/
│   │   │   └── __init__.py
│   │   ├── ip/
│   │   │   └── __init__.py
│   │   ├── irq/
│   │   │   └── __init__.py
│   │   ├── load/
│   │   │   └── __init__.py
│   │   ├── mem/
│   │   │   └── __init__.py
│   │   ├── memswap/
│   │   │   └── __init__.py
│   │   ├── network/
│   │   │   └── __init__.py
│   │   ├── now/
│   │   │   └── __init__.py
│   │   ├── npu/
│   │   │   ├── __init__.py
│   │   │   └── cards/
│   │   │       ├── __init__.py
│   │   │       ├── amd.py
│   │   │       ├── intel.py
│   │   │       ├── npu.py
│   │   │       └── rockchip.py
│   │   ├── percpu/
│   │   │   └── __init__.py
│   │   ├── plugin/
│   │   │   ├── __init__.py
│   │   │   ├── dag.py
│   │   │   └── model.py
│   │   ├── ports/
│   │   │   └── __init__.py
│   │   ├── processcount/
│   │   │   └── __init__.py
│   │   ├── processlist/
│   │   │   └── __init__.py
│   │   ├── programlist/
│   │   │   └── __init__.py
│   │   ├── psutilversion/
│   │   │   └── __init__.py
│   │   ├── quicklook/
│   │   │   └── __init__.py
│   │   ├── raid/
│   │   │   └── __init__.py
│   │   ├── sensors/
│   │   │   ├── __init__.py
│   │   │   └── sensor/
│   │   │       ├── __init__.py
│   │   │       ├── glances_batpercent.py
│   │   │       └── glances_hddtemp.py
│   │   ├── smart/
│   │   │   └── __init__.py
│   │   ├── system/
│   │   │   └── __init__.py
│   │   ├── uptime/
│   │   │   └── __init__.py
│   │   ├── version/
│   │   │   └── __init__.py
│   │   ├── vms/
│   │   │   ├── __init__.py
│   │   │   └── engines/
│   │   │       ├── __init__.py
│   │   │       ├── multipass.py
│   │   │       └── virsh.py
│   │   └── wifi/
│   │       └── __init__.py
│   ├── ports_list.py
│   ├── processes.py
│   ├── programs.py
│   ├── secure.py
│   ├── server.py
│   ├── servers_list.py
│   ├── servers_list_dynamic.py
│   ├── servers_list_static.py
│   ├── snmp.py
│   ├── standalone.py
│   ├── stats.py
│   ├── stats_client.py
│   ├── stats_client_snmp.py
│   ├── stats_server.py
│   ├── stats_streamer.py
│   ├── thresholds.py
│   ├── timer.py
│   ├── web_list.py
│   └── webserver.py
├── glances.ipynb
├── pyproject.toml
├── renovate.json
├── requirements.txt
├── run-venv.py
├── run.py
├── snap/
│   ├── local/
│   │   └── launchers/
│   │       └── glances-launch
│   └── snapcraft.yaml
├── sonar-project.properties
├── tests/
│   ├── HOW_TO_TEST_MCP.md
│   ├── conftest.py
│   ├── test_actions_sanitize.py
│   ├── test_api.py
│   ├── test_browser_restful.py
│   ├── test_browser_tui.py
│   ├── test_core.py
│   ├── test_duckdb_sanitize.py
│   ├── test_export_csv.sh
│   ├── test_export_duckdb.sh
│   ├── test_export_influxdb_v1.sh
│   ├── test_export_influxdb_v3.sh
│   ├── test_export_json.sh
│   ├── test_export_nats.sh
│   ├── test_export_prometheus.sh
│   ├── test_export_timescaledb.sh
│   ├── test_json_serializer.py
│   ├── test_mcp.py
│   ├── test_memoryleak.py
│   ├── test_perf.py
│   ├── test_plugin_cpu.py
│   ├── test_plugin_diskio.py
│   ├── test_plugin_fs.py
│   ├── test_plugin_load.py
│   ├── test_plugin_mem.py
│   ├── test_plugin_memswap.py
│   ├── test_plugin_network.py
│   ├── test_plugin_processcount.py
│   ├── test_plugin_sensors.py
│   ├── test_restful.py
│   ├── test_webui.py
│   └── test_xmlrpc.py
├── tests-data/
│   ├── issues/
│   │   ├── CVE-2026-32633/
│   │   │   └── glances.conf
│   │   ├── issue2849.py
│   │   ├── issue2851.py
│   │   ├── issue3027.py
│   │   ├── issue3290.py
│   │   ├── issue3319.py
│   │   ├── issue3322-homepage/
│   │   │   ├── README.txt
│   │   │   └── run-homepage.sh
│   │   ├── issue3333-homeassistant/
│   │   │   ├── README.txt
│   │   │   └── run-homeassistant.sh
│   │   ├── issue3341-NATS/
│   │   │   ├── pub.py
│   │   │   └── sub.py
│   │   ├── issue3434/
│   │   │   └── docker-compose.yml
│   │   └── issue869.py
│   ├── plugins/
│   │   ├── fs/
│   │   │   └── zfs/
│   │   │       └── arcstats
│   │   ├── gpu/
│   │   │   └── amd/
│   │   │       └── sys/
│   │   │           ├── class/
│   │   │           │   └── drm/
│   │   │           │       └── card0/
│   │   │           │           └── device/
│   │   │           │               ├── device
│   │   │           │               ├── gpu_busy_percent
│   │   │           │               ├── hwmon/
│   │   │           │               │   └── hwmon0/
│   │   │           │               │       ├── in1_input
│   │   │           │               │       └── temp1_input
│   │   │           │               ├── mem_info_gtt_total
│   │   │           │               ├── mem_info_gtt_used
│   │   │           │               ├── mem_info_vram_total
│   │   │           │               ├── mem_info_vram_used
│   │   │           │               ├── pp_dpm_mclk
│   │   │           │               ├── pp_dpm_sclk
│   │   │           │               └── revision
│   │   │           └── kernel/
│   │   │               └── debug/
│   │   │                   └── dri/
│   │   │                       └── 0/
│   │   │                           └── amdgpu_pm_info
│   │   └── npu/
│   │       ├── amd/
│   │       │   └── sys/
│   │       │       ├── bus/
│   │       │       │   └── pci/
│   │       │       │       └── drivers/
│   │       │       │           └── amdxdna/
│   │       │       │               └── 0000_c4_00.1/
│   │       │       │                   ├── accel/
│   │       │       │                   │   └── accel0/
│   │       │       │                   │       └── dev
│   │       │       │                   ├── device
│   │       │       │                   └── vendor
│   │       │       └── class/
│   │       │           └── devfreq/
│   │       │               └── amdxdna/
│   │       │                   ├── cur_freq
│   │       │                   ├── max_freq
│   │       │                   └── min_freq
│   │       ├── intel/
│   │       │   └── sys/
│   │       │       └── class/
│   │       │           └── accel/
│   │       │               └── accel0/
│   │       │                   └── device/
│   │       │                       ├── device
│   │       │                       ├── hwmon/
│   │       │                       │   └── hwmon2/
│   │       │                       │       ├── power1_input
│   │       │                       │       └── temp1_input
│   │       │                       ├── npu_current_frequency_mhz
│   │       │                       ├── npu_max_frequency_mhz
│   │       │                       └── vendor
│   │       └── rockchip/
│   │           ├── proc/
│   │           │   └── device-tree/
│   │           │       └── model
│   │           └── sys/
│   │               ├── class/
│   │               │   └── devfreq/
│   │               │       └── fdab0000.npu/
│   │               │           ├── cur_freq
│   │               │           ├── max_freq
│   │               │           └── min_freq
│   │               └── kernel/
│   │                   └── debug/
│   │                       └── rknpu/
│   │                           ├── load
│   │                           ├── mm
│   │                           └── version
│   └── tools/
│       ├── csvcheck.py
│       ├── duckdbcheck.py
│       └── find-duplicate-lines.sh
├── tox.ini
└── uninstall.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .cgcignore
================================================
/.git/
/.venv/
/.venv-uv/
/docker-compose/
/docker-files/
/docs/
/snap/
/tests/
/tests-data/


================================================
FILE: .claude/settings.json
================================================
{
  "skills": {
    "test": {
      "description": "Run the appropriate test suite based on changed files",
      "path": "skills/test.md"
    },
    "lint": {
      "description": "Format and lint the codebase with Ruff",
      "path": "skills/lint.md"
    },
    "new-plugin": {
      "description": "Scaffold a new Glances monitoring plugin",
      "path": "skills/new-plugin.md"
    },
    "new-export": {
      "description": "Scaffold a new Glances export module",
      "path": "skills/new-export.md"
    },
    "review": {
      "description": "Review code changes against project guidelines",
      "path": "skills/review.md"
    },
    "debug": {
      "description": "Diagnose and fix a Glances bug",
      "path": "skills/debug.md"
    },
    "webui": {
      "description": "Build and work with the Vue.js WebUI",
      "path": "skills/webui.md"
    },
    "docker": {
      "description": "Build and run Glances Docker images",
      "path": "skills/docker.md"
    }
  }
}


================================================
FILE: .claude/skills/debug.md
================================================
# Skill: Debug a Glances Issue

Help diagnose and fix a bug in Glances.

## Instructions

1. **Understand the issue**: Ask for or identify:
   - Error message or traceback
   - Glances version and OS
   - How to reproduce (standalone, web server, client/server, Docker?)
   - Relevant config section from `glances.conf`

2. **Locate the code path**: Based on the mode and plugin involved:
   - Standalone TUI: `glances/standalone.py` → `glances/outputs/glances_curses.py`
   - Web server: `glances/webserver.py` → `glances/outputs/glances_restful_api.py`
   - Client/server: `glances/client.py` / `glances/server.py`
   - Plugin issue: `glances/plugins/<name>/__init__.py`
   - Export issue: `glances/exports/glances_<name>/__init__.py`
   - Process list: `glances/processes.py`
   - Configuration: `glances/config.py`

3. **Run Glances in debug mode** to get detailed logs:
   ```bash
   .venv-uv/bin/uv run python -m glances -d 2>&1 | tail -100
   ```

4. **Reproduce with tests** when possible:
   ```bash
   .venv-uv/bin/uv run pytest tests/test_core.py -v -k "test_name" 2>&1
   ```

5. **Fix and verify**:
   - Apply surgical, atomic edits
   - Run the relevant test suite
   - Run `make format && make lint`
   - Verify no regressions with `make test-core`

## Common pitfalls

- **psutil version differences**: Some psutil APIs behave differently across OS — always check `glances/globals.py` for platform flags (`LINUX`, `MACOS`, `WINDOWS`, `BSD`)
- **Plugin update cycle**: Stats are `None` on first call — handle gracefully
- **Snap confinement**: `PermissionError` at `open()`, not at `read()` — wrap the right call
- **Docker socket access**: Requires mounting `/var/run/docker.sock` and proper permissions


================================================
FILE: .claude/skills/docker.md
================================================
# Skill: Build and Run Docker Images

Build, run, and troubleshoot Glances Docker images locally.

## Instructions

### Build images
```bash
make docker                    # Build all images (Alpine + Ubuntu, full + minimal)
make docker-alpine-full        # Alpine full image
make docker-alpine-minimal     # Alpine minimal image
make docker-ubuntu-full        # Ubuntu full image
make docker-ubuntu-minimal     # Ubuntu minimal image
```

Requires Docker Buildx (`apt install docker-buildx` on Ubuntu).

### Run containers
```bash
make run-docker-alpine-full    # Run Alpine full in console mode
make run-docker-ubuntu-full    # Run Ubuntu full in console mode
```

Default run options: `--rm --pid host --network host` with Docker/Podman socket mounts.

### Security scan
```bash
make trivy-docker              # Run Trivy on all local images
```

### Dockerfiles
Located in `docker-files/`:
- `alpine.Dockerfile` — multi-stage: `minimal` and `full` targets
- `ubuntu.Dockerfile` — multi-stage: `minimal` and `full` targets

### Key considerations
- Prefer `SYS_PTRACE` capability over `privileged: true`
- Mount Docker socket read-only: `-v /var/run/docker.sock:/var/run/docker.sock:ro`
- For Kubernetes: use DaemonSet (one pod per node) for system monitoring
- CI builds Docker images on `develop` branch and tags only (see `.github/workflows/build_docker.yml`)

### Troubleshooting
- **Socket permission errors**: Ensure the user is in the `docker` group or use Podman
- **Multi-arch builds**: CI uses QEMU for cross-platform (ARM64) — local builds are native only by default
- **Build timeouts**: Multi-arch builds can take 20-40 min; CI timeout is 60 min


================================================
FILE: .claude/skills/lint.md
================================================
# Skill: Lint and Format

Run code formatting and linting on the Glances codebase.

## Instructions

1. Run formatting first, then linting:
   ```bash
   make format && make lint
   ```
2. If there are remaining issues that `--fix` could not resolve, list them and suggest manual fixes.
3. Optionally, if the user asks for a full check, run all pre-commit hooks:
   ```bash
   make pre-commit
   ```

## Tools used

- **Ruff** for both formatting and linting (configured in `pyproject.toml`)
- **Pre-commit hooks** include: ruff, gitleaks (secret detection), shellcheck, and others

## Notes

- The virtualenv must already exist (`.venv-uv/`). If not, run `make venv-dev` first.
- Never change ruff configuration without explicit approval — linting rules are shared across all contributors.


================================================
FILE: .claude/skills/new-export.md
================================================
# Skill: Create a New Export Module

Scaffold a new Glances export module following project conventions.

## Instructions

Ask the user for:
1. **Export name** (lowercase, e.g., `clickhouse`)
2. **Target system** (database, message queue, file format, etc.)
3. **Required Python library** (e.g., `clickhouse-driver`)

Then create the export following this structure:

### File structure

```
glances/exports/glances_<name>/
    __init__.py    # Export implementation
```

No registration needed — exports are auto-discovered.

### Template

The export `__init__.py` must follow this pattern:

```python
#
# This file is part of Glances.
#
# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>
#
# SPDX-License-Identifier: LGPL-3.0-only
#

"""<Name> interface class."""

from glances.exports.export import GlancesExport
from glances.logger import logger


class Export(GlancesExport):
    """This class manages the <Name> export module."""

    def __init__(self, config=None, args=None):
        """Init the export module."""
        super().__init__(config=config, args=args)

        # Load config from [<name>] section in glances.conf
        self.host = self.config.get_value(self.export_name, 'host', default='localhost')
        self.port = self.config.get_int_value(self.export_name, 'port', default=9000)

        # Init the connection
        self.client = self._init_connection()

        # Set export_enable to True if connection succeeded
        self.export_enable = self.client is not None

    def _init_connection(self):
        """Connect to the target system. Return the connection object or None."""
        try:
            # Initialize your client here
            client = None
            logger.info(f"Connected to {self.export_name} ({self.host}:{self.port})")
            return client
        except Exception as e:
            logger.critical(f"Cannot connect to {self.export_name} ({self.host}:{self.port}): {e}")
            return None

    def export(self, name, columns, points):
        """Export the stats to the target system.

        Args:
            name: Plugin name (e.g., 'cpu', 'mem')
            columns: List of field names
            points: List of field values (same order as columns)
        """
        if not self.export_enable:
            return

        # Build and send data
        data = dict(zip(columns, points))
        try:
            # Send data to target system
            logger.debug(f"Export {name} to {self.export_name}")
        except Exception as e:
            logger.error(f"Cannot export {name} to {self.export_name}: {e}")
```

### Key conventions

- Directory: `glances/exports/glances_<name>/`
- Class must be named `Export` (exactly)
- Inherit from `GlancesExport`
- Configuration is loaded from `[<name>]` section in `glances.conf`
- `export_enable` must be set to `True` when the connection is established
- The `export(name, columns, points)` method is called for each plugin at each refresh cycle
- Use `self.export_name` to get the export module name (auto-derived)
- Mark sensitive config keys (passwords, tokens) so they are filtered from the API

### After creation

1. Add the dependency to `pyproject.toml` under the appropriate optional group
2. Add a `[<name>]` section in `conf/glances.conf` with all config keys (commented out)
3. Add an export test script: `tests/test_export_<name>.sh`
4. Run `make test` to verify no regressions


================================================
FILE: .claude/skills/new-plugin.md
================================================
# Skill: Create a New Plugin

Scaffold a new Glances monitoring plugin following project conventions.

## Instructions

Ask the user for:
1. **Plugin name** (lowercase, e.g., `battery`)
2. **What it monitors** (brief description)
3. **Data source** (psutil, sysfs, external library, etc.)

Then create the plugin following this structure:

### File structure

```
glances/plugins/<name>/
    __init__.py    # Plugin implementation
```

No registration needed — plugins are auto-discovered.

### Template

The plugin `__init__.py` must follow this pattern:

```python
#
# This file is part of Glances.
#
# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>
#
# SPDX-License-Identifier: LGPL-3.0-only
#

"""<Name> plugin."""

from glances.plugins.plugin.model import GlancesPluginModel

# Fields description
# https://github.com/nicolargo/glances/wiki/How-to-create-a-new-plugin-%3F
fields_description = {
    'field_name': {
        'description': 'Human-readable description.',
        'unit': 'percent',  # percent, number, bytes, seconds, etc.
    },
}

class <Name>Plugin(GlancesPluginModel):
    """Glances <name> plugin."""

    def __init__(self, args=None, config=None):
        """Init the plugin."""
        super().__init__(
            args=args,
            config=config,
            fields_description=fields_description,
        )

    @GlancesPluginModel._check_decorator
    @GlancesPluginModel._log_result_decorator
    def update(self):
        """Update the stats."""
        if self.input_method == 'local':
            stats = {}
            # Collect stats here (e.g., from psutil)
        else:
            stats = self.get_init_value()
        self.stats = stats
        return self.stats
```

### Key conventions

- Class name: `<Name>Plugin` (CamelCase with `Plugin` suffix)
- The `update()` method must use `@GlancesPluginModel._check_decorator` and `@GlancesPluginModel._log_result_decorator`
- `fields_description` declares metadata for each stat field (unit, thresholds, rates, alerts)
- Use `self.input_method == 'local'` to distinguish local vs SNMP/remote collection
- Optional: add `items_history_list` for time-series history support
- Optional: add `snmp_oid` dict for SNMP support
- If the plugin depends on another plugin, declare it in `glances/plugins/plugin/dag.py`

### After creation

1. Create a test file: `tests/test_plugin_<name>.py`
2. Run `make test-plugins` to verify
3. Add configuration section in `conf/glances.conf` if needed


================================================
FILE: .claude/skills/review.md
================================================
# Skill: Review Code Changes

Review the current changes (staged or unstaged) against Glances project guidelines.

## Instructions

1. Get the diff to review:
   - If the user provides a PR number, fetch it with `gh pr diff <number>`
   - Otherwise, use `git diff` (unstaged) and `git diff --cached` (staged)
   - If a branch is specified, use `git diff <base>...<branch>`

2. Check each item on this checklist:

### Correctness
- [ ] No dead code introduced (unused functions, imports, variables)
- [ ] Exception handling wraps the right operation (e.g., `open()` not `read()` for Snap confinement)
- [ ] No silent exception swallowing (`except: pass` or bare `except`)
- [ ] No O(n²) patterns where O(n) is possible (linear search in a loop → use dict/set)
- [ ] No `list.pop(0)` for queues → suggest `collections.deque(maxlen=N)`

### Security
- [ ] No credentials/secrets exposed in plain text
- [ ] No new endpoints without considering auth implications
- [ ] Sensitive config keys filtered from API responses
- [ ] No command injection, XSS, or SQL injection vectors

### Compatibility
- [ ] Default behaviour unchanged (or breaking change explicitly documented)
- [ ] Cross-platform considerations (Linux/macOS/Windows)
- [ ] Configuration keys documented in `conf/glances.conf`

### Style
- [ ] Code passes `make format && make lint`
- [ ] No unnecessary comments, docstrings, or type annotations on unchanged code
- [ ] Plugin/export conventions followed (class naming, auto-discovery, fields_description)

3. Report findings grouped by severity:
   - **Blocking** — must fix before merge
   - **Suggestion** — improvement, not required
   - **Nit** — style/cosmetic, optional

4. Use the tone from CLAUDE.md: acknowledge quality, label problems as "blocking concern", invite collaboration.


================================================
FILE: .claude/skills/test.md
================================================
# Skill: Run Tests

Run the appropriate Glances test suite based on the current changes or user request.

## Instructions

1. First, check which files have been modified using `git diff --name-only` (staged + unstaged).
2. Determine which test suite(s) to run based on the changed files:
   - Changes in `glances/plugins/` → `make test-plugins` and/or specific `pytest tests/test_plugin_<name>.py`
   - Changes in `glances/outputs/glances_restful_api.py` or `glances/outputs/glances_mcp.py` → `make test-restful`
   - Changes in `glances/outputs/static/` → `make test-webui`
   - Changes in `glances/exports/` → `make test-exports` (requires Docker)
   - Changes in `glances/client.py` or `glances/server.py` → `make test-xmlrpc`
   - Changes in core files (`glances/*.py`) → `make test-core`
   - If unsure or broad changes → `make test` (runs all tests)
3. If the user specifies a test target (e.g., "run core tests"), use that directly.
4. Run the tests using the Makefile targets. The virtualenv must already exist (`.venv-uv/`).
5. If tests fail, analyze the output and suggest fixes.

## Available test commands

```bash
make test              # All tests
make test-core         # Core unit tests
make test-plugins      # Plugin tests
make test-api          # API unit tests
make test-restful      # REST API tests
make test-webui        # WebUI tests (Selenium)
make test-xmlrpc       # XML-RPC tests
make test-exports      # All export integration tests (needs Docker)
make test-perf         # Performance tests
make test-memoryleak   # Memory leak tests

# Single test file or specific test:
.venv-uv/bin/uv run pytest tests/test_core.py
.venv-uv/bin/uv run pytest tests/test_core.py::TestGlances::test_000_update
```


================================================
FILE: .claude/skills/webui.md
================================================
# Skill: Build and Work with the WebUI

Build, update, or troubleshoot the Glances Vue.js WebUI.

## Instructions

### Build the WebUI
```bash
make webui
```
This runs `npm ci && npm run build` in `glances/outputs/static/`.

### Development workflow
1. Source files are in `glances/outputs/static/`
2. Built output goes to `glances/outputs/static/public/`
3. Stack: Vue.js + Bootstrap 5 + SCSS

### Audit and update dependencies
```bash
make webui-audit          # Run npm audit
make webui-audit-fix      # Fix audit issues and rebuild
make webui-update         # Update all JS dependencies and rebuild
```

### Run with WebUI
```bash
make run-webserver        # Start Glances web server on port 61208
```
Then open http://localhost:61208 in a browser.

### Design principles (from CLAUDE.md)
- Strict typographic consistency across all plugins
- Pixel-perfect sparkline alignment (CSS grid, fixed row heights)
- Footer = vertical alert list (up to 10 entries)
- No gauges — prefer sparklines with inline current value

### Troubleshooting
- If `npm ci` fails, check Node.js version (LTS required, currently 24.x in CI)
- If build artifacts are stale, delete `glances/outputs/static/public/` and rebuild
- The CI builds WebUI on `develop` branch only (see `.github/workflows/webui.yml`)


================================================
FILE: .coveragerc
================================================
[report]

include =
    *glances*

omit =
    glances/outputs/*
    glances/exports/*
    glances/compat.py
    glances/autodiscover.py
    glances/client_browser.py
    glances/config.py
    glances/history.py
    glances/monitored_list.py
    glances/outdated.py
    glances/password*.py
    glances/snmp.py
    glances/static_list.py

exclude_lines =
    pragma: no cover
    if PY3:
    if __name__ == .__main__.:
    if sys.platform.startswith
    except ImportError:
    raise NotImplementedError
    if WINDOWS
    if MACOS
    if BSD


================================================
FILE: .dockerignore
================================================
# Ignore everything
*

# Include only code files
!/glances/**/*.py

# Include WebUI files (remove when webui moved to seperate package)
!/glances/outputs/static

# Include Requirements files
!/all-requirements.txt
!/docker-requirements.txt

# Include Config file
!/docker-compose/glances.conf
!/docker-files/docker-logger.json

# Include Binary file
!/docker-bin.sh

# Include TOML file
!/pyproject.toml


================================================
FILE: .gitattributes
================================================
glances/outputs/static/public/* -diff linguist-vendored


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: nicolargo


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---
**Check the bug**
Before filling this bug report, please search if a similar issue already exists.
In this case, just add a comment on this existing issue.

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Start Glances with the following options '...'
2. Press the key '....'
3. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Environement (please complete the following information)**
 - Operating System (lsb_release -a or OS name/version): `To be completed with result of: lsb_release -a`
 - Glances & psutil versions: `To be completed with result of: glances -V`
 - How do you install Glances (Pypi package, script, package manager, source): `To be completed`
 - Glances test: ` To be completed with result of: glances --issue`

**Additional context**
Add any other context about the problem here.

You can also [pastebin](https://pastebin.com/):

* the Glances configuration file (https://glances.readthedocs.io/en/latest/config.html#location)
* the Glances log file (https://glances.readthedocs.io/en/latest/config.html#logging)


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
Before filling this issue, please read the manual (https://glances.readthedocs.io/en/latest/) and search if the bug do not already exists in the database (https://github.com/nicolargo/glances/issues).

For any questions concerning installation or use, please open a discussion (https://github.com/nicolargo/glances/discussions), not an issue.

#### Description

For a bug: Describe the bug and list the steps you used when the issue occurred.

For an enhancement or new feature: Describe your needs.

#### Versions

* Glances & psutil versions: `To be completed with result of: glances -V`
* Operating System: `To be completed with result of: lsb_release -a`
* How do you install Glances (Pypi package, script, package manager, source): `To be completed`
* Glances test (only available with Glances 3.1.7 or higher):

 ```
 To be completed with result of: glances --issue
 ```

#### Configuration and log file

You can also [pastebin](https://pastebin.com/):

* the Glances configuration file (https://glances.readthedocs.io/en/latest/config.html#location)
* the Glances log file (https://glances.readthedocs.io/en/latest/config.html#logging)


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
#### Description

Please describe the goal of this pull request.

For any questions concerning installation or use, please open a discussion (https://github.com/nicolargo/glances/discussions), not an issue.

#### Resume

* Bug fix: yes/no
* New feature: yes/no
* Fixed tickets: comma-separated list of tickets fixed by the PR, if any


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      actions:
        patterns:
          - "*"
  - package-ecosystem: "npm"
    directory: "/glances/outputs/static"
    schedule:
      interval: "weekly"
    groups:
      npm:
        patterns:
          - "*"


================================================
FILE: .github/workflows/build.yml
================================================
# This pipeline aims at building Glances Pypi packages

name: build

on:
  workflow_call:

jobs:

  build:
    name: Build distribution 📦
    if: github.event_name == 'push'
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
      - name: Set up Python
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
        with:
          python-version: "3.14"
      - name: Install pypa/build
        run: >-
          python3 -m
          pip install
          build
          --user
      - name: Build a binary wheel and a source tarball
        run: python3 -m build
      - name: Store the distribution packages
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
        with:
          name: python-package-distributions
          path: dist/

  pypi:
    name: Publish Python 🐍 distribution 📦 to PyPI
    if: startsWith(github.ref, 'refs/tags')
    needs:
      - build
    runs-on: ubuntu-latest
    timeout-minutes: 5
    environment:
      name: pypi
      url: https://pypi.org/p/glances
    permissions:
      attestations: write
      id-token: write
    steps:
      - name: Download all the dists
        uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
        with:
          name: python-package-distributions
          path: dist/
      - name: Publish distribution 📦 to PyPI
        uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # release/v1
        with:
          skip-existing: true
          attestations: false
          print-hash: true

  pypi_test:
    name: Publish Python 🐍 distribution 📦 to TestPyPI
    if: github.ref == 'refs/heads/develop'
    needs:
      - build
    runs-on: ubuntu-latest
    timeout-minutes: 5
    environment:
      name: testpypi
      url: https://pypi.org/p/glances
    permissions:
      attestations: write
      id-token: write
    steps:
      - name: Download all the dists
        uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
        with:
          name: python-package-distributions
          path: dist/
      - name: Publish distribution 📦 to TestPyPI
        uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # release/v1
        with:
          repository-url: https://test.pypi.org/legacy/
          skip-existing: true
          attestations: false


================================================
FILE: .github/workflows/build_docker.yml
================================================
# This pipeline aims at building Glances Docker images

name: build_docker

env:
  DEFAULT_DOCKER_IMAGE: nicolargo/glances
  PUSH_BRANCH: ${{ 'refs/heads/develop' == github.ref || startsWith(github.ref, 'refs/tags/v') }}
  # Alpine image platform: https://hub.docker.com/_/alpine
  # linux/arm/v6,linux/arm/v7 do not work (timeout during the build)
  DOCKER_PLATFORMS: linux/amd64,linux/arm64/v8
  # Ubuntu image platforms list: https://hub.docker.com/_/ubuntu
  # linux/arm/v7 do not work (Cargo/Rust not available)
  DOCKER_PLATFORMS_UBUNTU: linux/amd64,linux/arm64/v8

on:
  workflow_call:
    secrets:
      DOCKER_USERNAME:
        description: 'Docker Hub username'
        required: true
      DOCKER_TOKEN:
        description: 'Docker Hub token'
        required: true

jobs:

  create_docker_images_list:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    permissions: {}
    outputs:
      tags: ${{ steps.config.outputs.tags }}
    steps:
      - name: Determine image tags
        id: config
        shell: bash
        run: |
          if [[ $GITHUB_REF == refs/tags/* ]]; then
            VERSION=${GITHUB_REF#refs/tags/v}
            TAG_ARRAY="[{ \"target\": \"minimal\", \"tag\": \"${VERSION}\" },"
            TAG_ARRAY="$TAG_ARRAY { \"target\": \"minimal\", \"tag\": \"latest\" },"
            TAG_ARRAY="$TAG_ARRAY { \"target\": \"full\", \"tag\": \"${VERSION}-full\" },"
            TAG_ARRAY="$TAG_ARRAY { \"target\": \"full\", \"tag\": \"latest-full\" }]"
          elif [[ $GITHUB_REF == refs/heads/develop ]]; then
            TAG_ARRAY="[{ \"target\": \"dev\", \"tag\": \"dev\" }]"
          else
            TAG_ARRAY="[]"
          fi

          echo "Tags to build: $TAG_ARRAY"
          echo "tags=$TAG_ARRAY" >> $GITHUB_OUTPUT

  build_docker_images:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    permissions:
      contents: read
    needs:
      - create_docker_images_list
    if: needs.create_docker_images_list.outputs.tags != '[]'
    strategy:
      fail-fast: false
      matrix:
        os: ['alpine', 'ubuntu']
        tag: ${{ fromJson(needs.create_docker_images_list.outputs.tags) }}
    steps:
      - name: Checkout
        uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5

      - name: Retrieve Repository Docker metadata
        id: docker_meta
        uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5
        with:
          images: ${{ env.DEFAULT_DOCKER_IMAGE }}
          labels: |
            org.opencontainers.image.url=https://nicolargo.github.io/glances/

      - name: Set up QEMU
        uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
        with:
          platforms: all

      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
        with:
          version: latest

      - name: Login to DockerHub
        uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
        if: ${{ env.PUSH_BRANCH == 'true' }}
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_TOKEN }}

      - name: Build and push image
        uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
        with:
          push: ${{ env.PUSH_BRANCH == 'true' }}
          tags: "${{ env.DEFAULT_DOCKER_IMAGE }}:${{ matrix.os != 'alpine' && format('{0}-', matrix.os) || '' }}${{ matrix.tag.tag }}"
          build-args: |
            CHANGING_ARG=${{ github.sha }}
          context: .
          file: "docker-files/${{ matrix.os }}.Dockerfile"
          platforms: ${{ matrix.os != 'ubuntu' && env.DOCKER_PLATFORMS || env.DOCKER_PLATFORMS_UBUNTU }}
          target: ${{ matrix.tag.target }}
          labels: ${{ steps.docker_meta.outputs.labels }}
          # GHA default behaviour overwrites last build cache. Causes alpine and ubuntu cache to overwrite each other.
          # Use `scope` with the os name to prevent that
          cache-from: 'type=gha,scope=${{ matrix.os }}'
          cache-to: 'type=gha,mode=max,scope=${{ matrix.os }}'


================================================
FILE: .github/workflows/ci.yml
================================================
name: ci

on:
    pull_request:
      branches: [ develop ]
    push:
      branches: [ master, develop ]
      tags:
        - v*

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
    quality:
      permissions:
        actions: read
        contents: read
        security-events: write
      uses: ./.github/workflows/quality.yml
    test:
      permissions:
        contents: read
      uses: ./.github/workflows/test.yml
      needs: [quality]
    webui:
      if: github.ref == 'refs/heads/develop'
      permissions:
        contents: write
      uses: ./.github/workflows/webui.yml
      needs: [quality, test]
    build:
      if: github.event_name != 'pull_request'
      permissions:
        contents: read
        attestations: write
        id-token: write
      uses: ./.github/workflows/build.yml
      needs: [quality, test, webui]
    build_docker:
      if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/tags/'))
      permissions:
        contents: read
      uses: ./.github/workflows/build_docker.yml
      secrets:
        DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
        DOCKER_TOKEN: ${{ secrets.DOCKER_TOKEN }}
      needs: [quality, test, webui]
    cyber:
      if: github.ref == 'refs/heads/develop'
      permissions:
        contents: read
        security-events: write
      uses: ./.github/workflows/cyber.yml
      needs: [quality, test]


================================================
FILE: .github/workflows/cyber.yml
================================================
name: cyber

on:
    workflow_call:

jobs:
  trivy:
    name: Trivy scan
    continue-on-error: true
    timeout-minutes: 15

    runs-on: ubuntu-latest

    permissions:
      contents: read
      security-events: write

    steps:
      - name: Checkout code
        uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5

      - name: Run Trivy vulnerability scanner in repo mode
        uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # master
        with:
          scan-type: 'fs'
          ignore-unfixed: true
          format: 'sarif'
          output: 'trivy-results.sarif'
          severity: 'CRITICAL'

      - name: Upload Trivy scan results to GitHub Security tab
        uses: github/codeql-action/upload-sarif@820e3160e279568db735cee8ed8f8e77a6da7818 # v3
        with:
          sarif_file: 'trivy-results.sarif'


================================================
FILE: .github/workflows/inactive_issues.yml
================================================
name: Label inactive issues
on:
  schedule:
    - cron: "30 1 * * *"

permissions: {}

jobs:
  close-issues:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    permissions:
      issues: write
      pull-requests: write
    steps:
      - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10
        with:
          days-before-issue-stale: 90
          days-before-issue-close: -1
          stale-issue-label: "inactive"
          stale-issue-message: "This issue is stale because it has been open for 3 months with no activity."
          close-issue-message: "This issue was closed because it has been inactive for 30 days since being marked as stale."
          days-before-pr-stale: -1
          days-before-pr-close: -1
          repo-token: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/needs_contributor.yml
================================================
name: Add a message when needs contributor tag is used
on:
  issues:
    types:
      - labeled

permissions: {}

jobs:
  add-comment:
    if: github.event.label.name == 'needs contributor'
    runs-on: ubuntu-latest
    timeout-minutes: 5
    permissions:
      issues: write
    steps:
      - name: Add comment
        run: gh issue comment "$NUMBER" --body "$BODY"
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GH_REPO: ${{ github.repository }}
          NUMBER: ${{ github.event.issue.number }}
          BODY: >
            This issue is available for anyone to work on.
            **Make sure to reference this issue in your pull request.**
            :sparkles: Thank you for your contribution ! :sparkles:


================================================
FILE: .github/workflows/quality.yml
================================================
name: quality

on:
  workflow_call:

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    timeout-minutes: 15
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ 'javascript', 'python' ]
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
        # Learn more:
        # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed

    steps:
    - name: Checkout repository
      uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@820e3160e279568db735cee8ed8f8e77a6da7818 # v3
      with:
        languages: ${{ matrix.language }}
        # If you wish to specify custom queries, you can do so here or in a config file.
        # By default, queries listed here will override any specified in a config file.
        # Prefix the list here with "+" to use these queries and those in the config file.
        # queries: ./path/to/local/query, your-org/your-repo/queries@main

    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    - name: Autobuild
      uses: github/codeql-action/autobuild@820e3160e279568db735cee8ed8f8e77a6da7818 # v3

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 https://git.io/JvXDl

    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
    #    and modify them (or add more) to build your code if your project
    #    uses a compiled language

    #- run: |
    #   make bootstrap
    #   make release

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@820e3160e279568db735cee8ed8f8e77a6da7818 # v3


================================================
FILE: .github/workflows/test.yml
================================================
# Run unitary test

name: test

on:
  workflow_call:

jobs:

  source-code-checks:
    runs-on: ubuntu-24.04
    timeout-minutes: 5

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5

      # - name: Check formatting with Ruff
      #   uses: chartboost/ruff-action@e18ae971ccee1b2d7bbef113930f00c670b78da4 # v1
      #   with:
      #     args: 'format --check'

      - name: Check linting with Ruff
        uses: chartboost/ruff-action@e18ae971ccee1b2d7bbef113930f00c670b78da4 # v1
        with:
          args: 'check'

      # - name: Static type check
      #   run: |
      #     echo "Skipping static type check for the moment, too much error...";
      #     # pip install pyright
      #     # pyright glances


  test-linux:

    needs: source-code-checks
    # https://github.com/actions/runner-images?tab=readme-ov-file#available-images
    runs-on: ubuntu-24.04
    timeout-minutes: 15
    strategy:
      matrix:
        # Python EOL version are note tested
        # Multiple Python version only tested for Linux
        python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]

    permissions:
      contents: read

    steps:

      - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
        with:
          python-version: ${{ matrix.python-version }}
          cache: 'pip'

      - name: Install dependencies
        run: |
          if [ -f dev-requirements.txt ]; then python -m pip install -r dev-requirements.txt; fi
          if [ -f requirements.txt ]; then python -m pip install -r requirements.txt; fi

      - name: Unitary tests
        run: |
          python -m pytest ./tests/test_core.py

  test-windows:

    needs: source-code-checks
    # https://github.com/actions/runner-images?tab=readme-ov-file#available-images
    runs-on: windows-2025
    timeout-minutes: 15
    strategy:
      matrix:
        # Windows-curses not available for Python 3.14 for the moment
        # See https://github.com/zephyrproject-rtos/windows-curses/issues/76
        python-version: ["3.13"]

    permissions:
      contents: read

    steps:

    - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5

    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
      with:
        python-version: ${{ matrix.python-version }}
        cache: 'pip'

    - name: Install dependencies
      run: |
        if (Test-Path -PathType Leaf "dev-requirements.txt") { python -m pip install -r dev-requirements.txt }
        if (Test-Path -PathType Leaf "requirements.txt") { python -m pip install -r requirements.txt }
        pip install .

    - name: Unitary tests
      run: |
        python -m pytest ./tests/test_core.py

  test-macos:

    needs: source-code-checks
    # https://github.com/actions/runner-images?tab=readme-ov-file#available-images
    runs-on: macos-15
    timeout-minutes: 15
    strategy:
      matrix:
        # Only test the latest stable version
        python-version: ["3.14"]

    permissions:
      contents: read

    steps:

      - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
        with:
          python-version: ${{ matrix.python-version }}
          cache: 'pip'

      - name: Install dependencies
        run: |
          if [ -f dev-requirements.txt ]; then python -m pip install -r dev-requirements.txt; fi
          if [ -f requirements.txt ]; then python -m pip install -r requirements.txt; fi

      - name: Unitary tests
        run: |
          python -m pytest ./tests/test_core.py

  # test-freebsd:

  #   needs: source-code-checks
  #   runs-on: ubuntu-latest
  #   strategy:
  #     matrix:
  #       # Only test the latest stable version
  #       python-version: ["3.14"]
  #   steps:

  #     - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5

  #     - name: Set up Python ${{ matrix.python-version }}
  #       uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
  #       with:
  #         python-version: ${{ matrix.python-version }}
  #         cache: 'pip'

  #     - name: Install dependencies
  #       uses: vmactions/freebsd-vm@v1
  #       with:
  #         usesh: true
  #         run: |
  #           pkg install -y python3 gcc devel/py-pip
  #           python3 --version
  #           if [ -f dev-requirements.txt ]; then python3 -m pip install -r dev-requirements.txt; fi
  #           if [ -f requirements.txt ]; then python3 -m pip install -r requirements.txt; fi

  #     - name: Unitary tests
  #       uses: vmactions/freebsd-vm@v1
  #       with:
  #         usesh: true
  #         run: |
  #           python3 -m pytest ./tests/test_core.py


================================================
FILE: .github/workflows/webui.yml
================================================
name: webui

on:
  workflow_call:

jobs:
  build:
    # continue-on-error: true
    timeout-minutes: 10

    runs-on: ubuntu-latest

    permissions:
      contents: write

    strategy:
      matrix:
        # Use LTS version only
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
        node-version: [24.x]

    steps:
    - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
    - name: Glances will be build with Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
        cache-dependency-path: ./glances/outputs/static/package-lock.json
    - name: Build Glances WebUI
      working-directory: ./glances/outputs/static
      run: |
        npm ci
        npm run build
    - name: Commit and push WebUI
      env:
        CI_COMMIT_MESSAGE: Continuous Integration Build Artifacts
        CI_COMMIT_AUTHOR: Continuous Integration
      run: |
        git config --global user.name "${{ env.CI_COMMIT_AUTHOR }}"
        git config --global user.email "glances@nicolargo.com"
        git add glances/outputs/static
        /bin/bash -c "git commit -m '${{ env.CI_COMMIT_MESSAGE }}' || true"
        git push


================================================
FILE: .gitignore
================================================
*~
*.py[co]

# Packages
*.egg
*.egg-info
dist
build

# Eclipse and other IDE
.idea
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
.ipynb_checkpoints/

# External tool builders
.externalToolBuilders/
*yarn.lock

# Locally stored "Eclipse launch configurations"
*.launch

# CDT-specific
.cproject

# PDT-specific
.buildpath

# ctags
.tags*

# Sphinx
_build

# Tox
.tox/

# web ui
node_modules/
bower_components/

# visual stdio code
.vscode/
.vs/

# Snap packaging specific
/snap/.snapcraft/
/parts/
/stage/
/prime/

/*.snap
/*_source.tar.bz2

# Virtual env
.venv-uv/
.venv/
uv.lock
.python-version

# Test
.coverage
tests-data/issues/*/config/

# Local SSL certificates
glances.local*.pem

# Claudio
.claude/settings.local.json


================================================
FILE: .mailmap
================================================
Nicolas Hennion <nicolashennion@gmail.com> Nicolargo <nicolas@nicolargo.com>
Nicolas Hennion <nicolashennion@gmail.com> Nicolas Hennion <nicolas@nicolargo.com>
Nicolas Hennion <nicolashennion@gmail.com> nicolargo <nicolas@nicolargo.com>
Nicolas Hennion <nicolashennion@gmail.com> nicolargo <nicolashennion@gmail.com>
Nicolas Hennion <nicolashennion@gmail.com> nicolargo <nicolargo@nicolargo-boulot.(none)>
Nicolas Hennion <nicolashennion@gmail.com> nicolargo <nicolargo@nicolargo-fujitsu.(none)>
Nicolas Hennion <nicolashennion@gmail.com> Nicolargo <nicolashennion@gmail.com>
Nicolas Hennion <nicolashennion@gmail.com> nicolargo <nicolargo@lifebook.(none)>
Alessio Sergi <al3hex@gmail.com> asergi <al3hex@gmail.com>
Nicolas Hart <contact@nclshart.net> nclsHart <contact@nclshart.net>
Nicolas Hart <contact@nclshart.net> Nicolas Hart <n.hart@hexanet.fr>
Floran Brutel <f.brutel@hexanet.fr> Floran Brutel <contact@floran.fr>
Brandon Philips <brandon@ifup.org> Brandon Philips <brandon.philips@rackspace.com>


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: https://github.com/gitleaks/gitleaks
    rev: v8.24.2
    hooks:
      - id: gitleaks
        name: "🔒 security · Detect hardcoded secrets"

  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.15.4
    hooks:
    - id: ruff-format
      name: "🐍 python · Formatter with Ruff"
      types_or: [ python, pyi ]
      args: [ --target-version, py310, --config, './pyproject.toml' ]
    - id: ruff-check
      name: "🐍 python · Linter with Ruff"
      types_or: [ python, pyi ]
      args: [ --fix, --target-version, py310, --config, './pyproject.toml' ]

  # - repo: https://github.com/RobertCraigie/pyright-python
  #   rev: v1.1.391
  #   hooks:
  #     - id: pyright
  #       name: "🐍 python · Check types"

  # - repo: https://github.com/biomejs/pre-commit
  #   rev: "v2.3.7"
  #   hooks:
  #     - id: biome-check
  #       name: "🟨 javascript · Lint, format, and safe fixes with Biome"

  - repo: https://github.com/python-jsonschema/check-jsonschema
    rev: 0.35.0
    hooks:
      - id: check-github-workflows
        name: "🐙 github-actions · Validate gh workflow files"
        args: ["--verbose"]

  - repo: https://github.com/shellcheck-py/shellcheck-py
    rev: v0.11.0.1
    hooks:
      - id: shellcheck
        name: "🐚 shell · Lint shell scripts"

  - repo: https://github.com/openstack/bashate
    rev: 2.1.1
    hooks:
      - id: bashate
        name: "🐚 shell · Check shell script code style"
        entry: bashate --error E* --ignore=E006

  # - repo: https://github.com/mrtazz/checkmake.git
  #   rev: 0.2.2
  #   hooks:
  #     - id: checkmake
  #       name: "🐮 Makefile · Lint Makefile"

  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v6.0.0
    hooks:
      - id: check-executables-have-shebangs
        name: "📁 filesystem/⚙️ exec · Verify shebang presence"
      - id: check-shebang-scripts-are-executable
        name: "📁 filesystem/⚙️ exec · Verify script permissions"
      - id: check-case-conflict
        name: "📁 filesystem/📝 names · Check case sensitivity"
      - id: destroyed-symlinks
        name: "📁 filesystem/🔗 symlink · Detect broken symlinks"
      - id: check-merge-conflict
        name: "🌳 git · Detect conflict markers"
      - id: forbid-new-submodules
        name: "🌳 git · Prevent submodule creation"
      # - id: no-commit-to-branch
      #   name: "🌳 git · Protect main branches"
      #   args: ["--branch", "main", "--branch", "master"]
      - id: check-added-large-files
        name: "🌳 git · Block large file commits"
        args: ['--maxkb=5000']
      - id: check-ast
        name: "🐍 python/🔍 quality · Validate Python AST"
      - id: check-docstring-first
        name: "🐍 python/📝 style · Enforce docstring at top"
      - id: check-json
        name: "📄 formats/json · Validate JSON files"
      - id: check-toml
        name: "📄 formats/toml · Validate TOML files"
      - id: check-yaml
        name: "📄 formats/yaml · Validate YAML syntax"
      - id: debug-statements
        name: "🐍 python/🪲 debug · Detect debug statements"
      - id: detect-private-key
        name: "🔐 security · Detect private keys"
      - id: mixed-line-ending
        name: "📄 text/↩️ newline · Normalize line endings"
      - id: requirements-txt-fixer
        name: "🐍 python/📦 deps · Sort requirements.txt"

  - repo: local
    hooks:
      - id: find-duplicate-lines
        name: "❗️local script · Find duplicate lines at the end of file"
        entry: bash tests-data/tools/find-duplicate-lines.sh
        language: system
        types: [python]
        pass_filenames: false


================================================
FILE: .readthedocs.yaml
================================================
# Read the Docs configuration file for Glances projects

# Required
version: 2

# Set the OS, Python version and other tools you might need
build:
  os: ubuntu-22.04
  tools:
    python: "3.12"
    # You can also specify other tool versions:
    # nodejs: "20"
    # rust: "1.70"
    # golang: "1.20"

# Build documentation in the "docs/" directory with Sphinx
sphinx:
  configuration: docs/conf.py
  # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs
  # builder: "dirhtml"
  # Fail on all warnings to avoid broken references
  # fail_on_warning: true

# Optionally build your docs in additional formats such as PDF and ePub
# formats:
#   - pdf
#   - epub

# Optional but recommended, declare the Python requirements required
# to build your documentation
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
python:
  install:
    - requirements: dev-requirements.txt

================================================
FILE: .reuse/dep5
================================================
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: Glances
Upstream-Contact: Nicolas Hennion <nicolashennion@gmail.com>
Source: https://github.com/nicolargo/glances

# Sample paragraph, commented out:
#
# Files: src/*
# Copyright: $YEAR $NAME <$CONTACT>
# License: ...


================================================
FILE: AUTHORS
================================================
==========
Developers
==========

Nicolas Hennion (aka) Nicolargo
http://blog.nicolargo.com
https://twitter.com/nicolargo
https://github.com/nicolargo
nicolashennion@gmail.com
PGP Fingerprint: A0D9 628F 5A83 A879 48EA  B1FE BA43 C11F 2C8B 4347
PGP Public key:  gpg --keyserver pgp.mit.edu --recv-keys 0xba43c11f2c8b4347

RazCrimson (maintainer of the Glances project)
https://github.com/RazCrimson

Ariel Otibili (aka) ariel-anieli (for the huge work on code quality)
https://github.com/ariel-anieli

Alessio Sergi (aka) Al3hex (thanks you for the great job on this project)
https://twitter.com/al3hex
https://github.com/asergi

Floran Brutel (aka) notFloran (maintainer of the Web User Interface)
https://github.com/notFloran

fr4nc0is (maintainer of the Web User Interface)
https://github.com/fr4nc0is

Brandon Philips (aka) Philips
http://ifup.org/
https://github.com/philips

Jon Renner (aka) Jrenner
https://github.com/jrenner

Maxime Desbrus (aka) Desbma
https://github.com/desbma

Nicolas Hart (aka) NclsHart (for the Web user interface)
https://github.com/nclsHart

Sylvain Mouquet (aka) SylvainMouquet (for the Web user interface)
http://github.com/sylvainmouquet

Erik Eriksson (aka) Molobrakos (for the MQTT plugin and various PR)
https://www.linkedin.com/in/error-errorsson/

=========
Packagers
=========

林博仁(Buo-ren Lin) Lin-Buo-Ren for the Snap package
https://lin-buo-ren.github.io/
https://snapcraft.io/glances/releases

Daniel Echeverry and Sebastien Badia for the Debian package
https://tracker.debian.org/pkg/glances

Philip Lacroix and Nicolas Kovacs for the Slackware (SlackBuild) package

gasol.wu@gmail.com for the FreeBSD port

Frederic Aoustin (https://github.com/fraoustin) and Nicolas Bourges (installer) for the Windows port

Aljaž Srebrnič for the MacPorts package
http://www.macports.org/ports.php?by=name&substr=glances

John Kirkham for the conda package (at conda-forge)
https://github.com/conda-forge/glances-feedstock

Rui Chen for the Homebrew package
https://chenrui.dev/
https://formulae.brew.sh/formula/glances


================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md — Glances Maintainer Context

> Auto-loaded by Claude Code at the start of every session.
> Describes my role, principles, constraints, and working patterns
> specific to the Glances project.

---

## Role and posture

I am maintainer of **Glances** (`nicolargo/glances`), a cross-platform
open-source system monitoring tool used by **thousands of users** in production.
This implies:

- Prioritising **non-regression** above all else: any change that breaks existing
  behaviour has a real cost for real users.
- Being **conservative about default behaviour**: most users run Glances without
  any custom configuration, on a private network, for personal use. Every change
  to a default must be evaluated against this dominant use case.
- Being **innovative in refactoring** to preserve readability, security, and
  long-term maintainability — provided changes are incremental and reversible.
- Treating every technical decision as an **explicit trade-off** between
  security, usability, and backward compatibility.

---

## Tech stack

| Layer | Technology |
| --- | --- |
| Backend | Python, psutil, FastAPI (REST API), curses (TUI) |
| Frontend | Vue.js, Bootstrap 5, SCSS |
| Export plugins | InfluxDB, MongoDB, MQTT, DuckDB, and others |
| Infrastructure | GitHub Actions, Helm/Kubernetes, Snap (snapcraft) |
| LLM abstraction | LiteLLM (multi-provider) |
| GPU/NPU monitoring | pynvml, sysfs/debugfs |

---

## Development Setup

```bash
make install-uv          # Install UV in .venv-uv/
make venv-dev            # Create virtualenv with all deps + dev tools + pre-commit hooks
```

---

## Common Commands

### Tests

```bash
make test                # All tests (via pytest)
make test-core           # Core unit tests (tests/test_core.py)
make test-plugins        # Plugin tests (tests/test_plugin_*.py)
make test-restful        # REST API tests
make test-webui          # Selenium WebUI tests
make test-exports        # All export integration tests (shell scripts, need Docker)

# Single test file or specific test:
.venv-uv/bin/uv run pytest tests/test_core.py
.venv-uv/bin/uv run pytest tests/test_core.py::TestGlances::test_000_update
```

### Linting & Formatting

```bash
make format              # Ruff format
make lint                # Ruff check --fix
make pre-commit          # All pre-commit hooks (ruff, gitleaks, shellcheck, etc.)
```

### WebUI

```bash
make webui               # npm ci && npm run build (outputs to glances/outputs/static/public/)
```

### Running Glances

```bash
.venv-uv/bin/uv run python -m glances                       # Standalone TUI
.venv-uv/bin/uv run python -m glances -w                    # Web server (default port 61208)
.venv-uv/bin/uv run python -m glances -C conf/glances.conf  # With specific config
```

## Architecture

### Modes (selected in `glances/main.py` → dispatched in `glances/__init__.py`)

- **Standalone** — curses TUI (`glances/standalone.py`)
- **Client/Server** — XML-RPC remote monitoring (`glances/client.py`, `glances/server.py`)
- **Web server** — FastAPI REST API + Vue.js WebUI + optional MCP (`glances/webserver.py`)

### Stats Engine (`glances/stats.py`)

Central orchestrator that dynamically discovers and loads all plugins and
exports. Exposes `get<PluginName>()` magic methods. Runs plugin updates
concurrently.

### Plugin System (`glances/plugins/`)

- **Base class:** `GlancesPluginModel` in `glances/plugins/plugin/model.py`
- **Convention:** each plugin lives in `glances/plugins/<name>/__init__.py`,
  exports a class inheriting from `GlancesPluginModel`
- **Interface:** `update()` fetches data (typically from psutil), stores in
  `self.stats`; `fields_description` dict declares field metadata (unit,
  thresholds, rates, alerts)
- **Dependency DAG:** `glances/plugins/plugin/dag.py` — declares inter-plugin
  dependencies (e.g. `cpu` depends on `core`), used by the REST API to resolve
  fetch order
- **Auto-discovery:** plugins are discovered automatically — no central
  registration needed; just add a new directory under `glances/plugins/`
- **~39 plugins:** cpu, mem, memswap, network, diskio, fs, containers, gpu,
  sensors, processlist, alert, etc.

### Export System (`glances/exports/`)

- **Base class:** `GlancesExport` in `glances/exports/export.py`
- **Convention:** each exporter in `glances/exports/glances_<name>/__init__.py`,
  class named `Export`
- **Auto-discovery:** same pattern as plugins — no central registration needed
- **Non-exportable plugins** (hardcoded filter): alert, help, plugin,
  psutilversion, quicklook, version
- **~26 exporters:** CSV, JSON, InfluxDB (v1/v2/v3), Prometheus, Elasticsearch,
  Kafka, MQTT, etc.

### REST API (`glances/outputs/glances_restful_api.py`)

FastAPI app with Basic + JWT auth, CORS, optional TLS, DNS rebinding
protection. Endpoints under `/api/<plugin>` for stats, `/api/<plugin>/history`
for time-series.

All new configuration keys must be declared and loaded in
`GlancesRestfulApi.load_config()`. Advanced options use config-file keys only
(no CLI flag) — follow the `cors_origins` pattern.

### MCP Server (`glances/outputs/glances_mcp.py`)

FastMCP-based, mounted as ASGI in the FastAPI app. Provides resources (plugin
stats, limits, history) and prompts (system health, alerts analysis).

### Process Manager (`glances/processes.py`)

Complex module (~31 KB) managing the process list with threading, sorting, and
filtering. Used by the `processlist` plugin.

### Configuration (`glances/config.py`)

INI format, searched in `~/.config/glances/`, `/etc/glances/`, and bundled
`conf/`. Per-plugin sections with thresholds and options. Sensitive keys
(passwords, tokens, API keys) are filtered from public API responses.

---

## Code principles

### No dead code

Never merge code that is not used anywhere in the codebase, regardless of its
quality. Every PR must either fix a bug, introduce an actively integrated
feature, or replace existing code. Dead code burdens reviews, confuses future
contributors, and misleads static analysis tools.

### Surgical edits

Prefer targeted, atomic changes over full rewrites. Validate — visually or
functionally — after each atomic change. Never bundle multiple distinct logical
fixes into a single edit block.

### Exception handling for Snap confinement

Wrap the `open()` call inside `try/except`, not just the `read()`. Snap's strict
confinement blocks host file access at the open stage, not the read stage.

### Kubernetes workloads

Use a **DaemonSet** (one pod per node) for system-level monitoring.
Prefer `SYS_PTRACE` over `privileged: true`.

---

## Security

### General philosophy

Glances runs unauthenticated by default — this is intentional and documented.
The majority of users deploy it on private networks for personal use. Security
mitigations must:

1. **Not change the default behaviour** — unless the vulnerability is critical
   and exploitable without any user action.
2. **Add a startup warning** when running in an exposed configuration (non-
   loopback bind, no authentication). Visible, but non-fatal.
3. **Provide optional configuration keys** for advanced deployments — commented
   out by default so behaviour is unchanged.
4. **Document risks and hardening recommendations** in the official docs.

### Pattern for a new optional protection

```ini
# [outputs] in glances.conf
# Commented out by default = unchanged behaviour (backward compatibility guaranteed)
# Uncomment and configure to enable the protection
# webui_allowed_hosts=localhost,127.0.0.1,myserver.example.com
```

### Sensitive endpoints

- `/api/4/config` and `/api/4/args` — never expose credentials in plain text
  (InfluxDB passwords, MongoDB tokens, MQTT passphrases, SSL key paths, etc.)
  for unauthenticated access. Use the conditional `as_dict_secure()` method,
  applied when `self.args.password` is `False`.
- CORS: `allow_origins=["*"]` + `allow_credentials=True` is invalid per the
  CORS spec and reflected by Starlette. Default: `allow_credentials=False`.
- DNS rebinding: `TrustedHostMiddleware` via `webui_allowed_hosts` (optional).
  The MCP endpoint is already protected via `mcp_allowed_hosts` +
  `TransportSecuritySettings` in `glances/outputs/glances_mcp.py`.

### Security documents

Security reports and internal remediation plans are **confidential internal
documents**. Always deliver them as downloadable files — never as inline text
in a conversation.

---

## Contribution management (PRs and Issues)

### Dead code rule

Systematically reject any PR that introduces unused code. Offer the contributor
a path forward:
- complete the PR with the actual integration, or
- split it into two PRs linked by a tracking issue.

Never close a PR without offering a resolution path.

### Tone with contributors

- Always acknowledge the quality of the code, even when rejecting the PR.
- Label the problem as a "blocking concern", not a judgement.
- End with an explicit invitation to keep collaborating.
- Key phrase: *"I'm not closing the PR — I just want to make sure we get this
  right together."*
- Language: **English** for all public messages and PR comments.

### Before merging a PR
- [ ] The code is actively used (no dead code)
- [ ] Existing tests pass
- [ ] New behaviour is covered by tests
- [ ] New configuration keys are documented
- [ ] Breaking changes are identified and documented
- [ ] The PR targets the correct branch
- [ ] Code should be formated and linted (make lint && make format)

### GitHub Issues

Always deliver GitHub issues as a **downloadable `.md` file** — never as inline
text in the conversation. Expected structure:
- Summary / symptom
- Technical analysis (with file and line references)
- Proposed fix — diff or pseudo-code
- Test checklist
- Impact and severity
- Breaking changes if any

### Responses to security reports

Same structure as issues, with the addition of:
- Maintainer's position on the default behaviour (justified)
- What will be done / what will not be done (and why)
- Timeline
- Thanks to the reporter

---

## Expected output formats

| Deliverable | Format |
| --- | --- |
| GitHub issue | Downloadable `.md` file — never inline |
| Security alert response | Downloadable `.md` file, marked confidential if internal |
| Audit report (architecture, security) | Downloadable `.md` file |
| Changelog entry | `.rst` file following the `NEWS.rst` format |
| UI prototype | Self-contained single-file `.html` |
| Helm Chart | `.tgz` archive or structured directory |

---

## Safe refactoring — two-phase strategy

For any medium-to-high-risk refactoring, always apply the **two-phase approach**:

**Phase 1** — Introduce the new mechanism alongside the old one, with the old
as fallback. No behaviour changes for existing users.

**Phase 2** — Deprecate the old mechanism over one or two releases, then remove
it.

This ensures no existing deployment is broken during the transition, while
allowing the new mechanism to be validated on a real user base before the old
one is deleted.

Applied example: plugin dependency DAG — keep the hardcoded dict as fallback,
add class-attribute discovery, deprecate the dict over two releases.

---

## UI / TUI

### Web UI
Stack: Vue.js + Bootstrap 5 + SCSS.

Design principles:
- Strict typographic consistency across all plugins (size, weight, opacity,
  letter-spacing).
- Pixel-perfect sparkline alignment (CSS grid, fixed row heights).
- Footer = vertical alert list (up to 10 entries), not a single horizontal row.
- No gauges — prefer sparklines with an inline current value.

### TUI (curses)
- 256-colour system with automatic fallback for limited terminals.
- Lightweight hierarchical separators for information density.

---

## CI/CD — GitHub Actions

In `build_docker.yml`, the trigger condition combines branch exclusion and event
type — a dynamic matrix with zero entries causes a silent failure without this
guard:

```yaml
if: >
  github.event_name != 'pull_request' &&
  (github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/tags/'))
```

The `master` branch does not trigger a Docker build (empty matrix = silent
failure without this condition).

---

## Communication

| Context | Language |
| --- | --- |
| Working exchanges | French or English |
| Issues, PRs, contributor messages | English |
| Public documentation | English |
| Internal reports (security, audit) | English |

Request style: terse, numbered, precise. Respond in the same register.


================================================
FILE: CODE-OF-CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
education, socioeconomic status, nationality, personal appearance, race,
religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
  advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
  address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at nicolashennion@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Glances

Looking to contribute something to Glances ? **Here's how you can help.**

Please take a moment to review this document in order to make the contribution
process easy and effective for everyone involved.

Following these guidelines helps to communicate that you respect the time of
the developers managing and developing this open source project. In return,
they should reciprocate that respect in addressing your issue or assessing
patches and features.

## Using the issue tracker

The [issue tracker](https://github.com/nicolargo/glances/issues) is
the preferred channel for [bug reports](#bug-reports), [features requests](#feature-requests)
and [submitting pull requests](#pull-requests), but please respect the following
restrictions:

* Please **do not** use the issue tracker for personal support requests. An
  official Q&A exist. [Use it](https://groups.google.com/forum/?hl=en#!forum/glances-users)!

* Please **do not** derail or troll issues. Keep the discussion on topic and
  respect the opinions of others.

## Bug reports

A bug is a _demonstrable problem_ that is caused by the code in the repository.
Good bug reports are extremely helpful, so thanks!

Guidelines for bug reports:

0. **Use the GitHub issue search** &mdash; check if the issue has already been
   reported.

1. **Check if the issue has been fixed** &mdash; try to reproduce it using the
   latest `master` or `develop` branch in the repository.

2. **Isolate the problem** &mdash; ideally create a simple test bed.

3. **Give us your test environment** &mdash; Operating system name and version
   Glances version...

Example:

> Short and descriptive example bug report title.
>
> Glances and psutil version used (glances -V).
>
> Operating system description (name and version).
>
> A summary of the issue and the OS environment in which it occurs. If
> suitable, include the steps required to reproduce the bug.
>
> 1. This is the first step
> 2. This is the second step
> 3. Further steps, etc.
>
> Screenshot (if useful)
>
> Any other information you want to share that is relevant to the issue being
> reported. This might include the lines of code that you have identified as
> causing the bug, and potential solutions (and your opinions on their
> merits).
>
> You can also run Glances in debug mode (-d) and paste/bin the glances.conf file (<https://glances.readthedocs.io/en/latest/config.html>).
>
> Glances 3.2.0 or higher have also a --issue option to run a simple test. Please use it and copy/paste the output.

## Feature requests

Feature requests are welcome. But take a moment to find out whether your idea
fits with the scope and aims of the project. It's up to _you* to make a strong
case to convince the project's developers of the merits of this feature. Please
provide as much detail and context as possible.

## Pull requests

Good pull requests—patches, improvements, new features—are a fantastic
help. They should remain focused in scope and avoid containing unrelated
commits.

**Please ask first** before embarking on any significant pull request (e.g.
implementing features, refactoring code, porting to a different language),
otherwise you risk spending a lot of time working on something that the
project's developers might not want to merge into the project.

First of all, all pull request should be done on the `develop` branch.

Glances uses PEP8 compatible code, so use a PEP validator before submitting
your pull request. Also uses the unitaries tests scripts (unitest-all.py).

Similarly, when contributing to Glances's documentation, you should edit the
documentation source files in
[the `/doc/` and `/man/` directories of the `develop` branch](https://github.com/nicolargo/glances/tree/develop/docs) and generate
the documentation outputs files by reading the [README](https://github.com/nicolargo/glances/tree/develop/docs/README.txt) file.

Adhering to the following process is the best way to get your work
included in the project:

1. [Fork](https://help.github.com/fork-a-repo/) the project, clone your fork,
   and configure the remotes:

   ```bash
   # Clone your fork of the repo into the current directory
   git clone https://github.com/<your-username>/glances.git
   # Navigate to the newly cloned directory
   cd glances
   # Assign the original repo to a remote called "upstream"
   git remote add upstream https://github.com/nicolargo/glances.git
   ```

2. Get the latest changes from upstream:

   ```bash
   git checkout develop
   git pull upstream develop
   ```

3. Create a new topic branch (off the main project development branch) to
   contain your feature, change, or fix (best way is to call it issue#xxx):

   ```bash
   git checkout -b <topic-branch-name>
   ```

4. It's coding time !
   Please respect the following coding convention: [Elements of Python Style](https://github.com/amontalenti/elements-of-python-style)

5. Test you code using the Makefile:

   * make format ==> Format your code thanks to the Ruff linter
   * make run ==> Run Glances
   * make run-webserver ==> Run a Glances Web Server
   * make test ==> Run unit tests
   * make docs ==> Update docs
   * make webui ==> Compile a new Web UI

6. Commit your changes in logical chunks. Please adhere to these [git commit
   message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
   or your code is unlikely be merged into the main project. Use Git's
   [interactive rebase](https://help.github.com/articles/interactive-rebase)
   feature to tidy up your commits before making them public.

7. Locally merge (or rebase) the upstream development branch into your topic branch:

   ```bash
   git pull [--rebase] upstream develop
   ```

8. Push your topic branch up to your fork:

   ```bash
   git push origin <topic-branch-name>
   ```

9. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/)
    with a clear title and description against the `develop` branch.

**IMPORTANT**: By submitting a patch, you agree to allow the project owners to
license your work under the terms of the [LGPLv3](COPYING) (if it
includes code changes).


================================================
FILE: COPYING
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007

Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below.

0. Additional Definitions.

As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License.

"The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below.

An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library.

A "Combined Work" is a work produced by combining or linking an Application with the Library.  The particular version of the Library with which the Combined Work was made is also called the "Linked Version".

The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version.

The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work.

1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL.

2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version:

     a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or

     b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy.

3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from a header file that is part of the Library.  You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following:

     a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License.

     b) Accompany the object code with a copy of the GNU GPL and this license document.

4. Combined Works.
You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following:

     a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License.

     b) Accompany the Combined Work with a copy of the GNU GPL and this license document.

     c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document.

     d) Do one of the following:

           0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.

          1) Use a suitable shared library mechanism for linking with the Library.  A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version.

     e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.)

5. Combined Libraries.
You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following:

     a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License.

     b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.

6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation.

If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library.

GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

0. Definitions.

“This License” refers to version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.

A “covered work” means either the unmodified Program or a work based on the Program.

To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

1. Source Code.
The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

2. Basic Permissions.
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.

4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

     a) The work must carry prominent notices stating that you modified it, and giving a relevant date.

     b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.

     c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.

     d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.

A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

     a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.

     b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.

     c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.

     d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.

     e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.

A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.

A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.

“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.

If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).

The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.

Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.

7. Additional Terms.
“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

     a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or

     b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or

     c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or

     d) Limiting the use for publicity purposes of names of licensors or authors of the material; or

     e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or

     f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.

All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

8. Termination.
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

11. Patents.
A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.

A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

     <one line to give the program's name and a brief idea of what it does.>
     Copyright (C) <year>  <name of author>

     This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

     You should have received a copy of the GNU General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

     <program>  Copyright (C) <year>  <name of author>
     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
     This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.


================================================
FILE: LICENSES/LGPL-3.0-only.txt
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007

Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below.

0. Additional Definitions.

As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License.

"The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below.

An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library.

A "Combined Work" is a work produced by combining or linking an Application with the Library.  The particular version of the Library with which the Combined Work was made is also called the "Linked Version".

The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version.

The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work.

1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL.

2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version:

     a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or

     b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy.

3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from a header file that is part of the Library.  You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following:

     a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License.

     b) Accompany the object code with a copy of the GNU GPL and this license document.

4. Combined Works.
You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following:

     a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License.

     b) Accompany the Combined Work with a copy of the GNU GPL and this license document.

     c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document.

     d) Do one of the following:

           0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.

          1) Use a suitable shared library mechanism for linking with the Library.  A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version.

     e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.)

5. Combined Libraries.
You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following:

     a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License.

     b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.

6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation.

If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library.

GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

0. Definitions.

“This License” refers to version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.

A “covered work” means either the unmodified Program or a work based on the Program.

To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

1. Source Code.
The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

2. Basic Permissions.
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.

4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

     a) The work must carry prominent notices stating that you modified it, and giving a relevant date.

     b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.

     c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.

     d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.

A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

     a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.

     b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.

     c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.

     d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.

     e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.

A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.

A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.

“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.

If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).

The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.

Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.

7. Additional Terms.
“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

     a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or

     b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or

     c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or

     d) Limiting the use for publicity purposes of names of licensors or authors of the material; or

     e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or

     f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.

All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

8. Termination.
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

11. Patents.
A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.

A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

     <one line to give the program's name and a brief idea of what it does.>
     Copyright (C) <year>  <name of author>

     This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

     You should have received a copy of the GNU General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

     <program>  Copyright (C) <year>  <name of author>
     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
     This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.


================================================
FILE: MANIFEST.in
================================================
include AUTHORS
include CONTRIBUTING.md
include COPYING
include NEWS.rst
include README.rst
include README-pypi.rst
include SECURITY.md
include conf/glances.conf
include conf/fetch-templates/*.jinja
include requirements.txt
include all-requirements.txt
recursive-include docs *
recursive-include glances *.py
recursive-include glances/outputs/static *


================================================
FILE: Makefile
================================================
PORT     	  ?= 8008
CONF     	  := conf/glances.conf
LASTTAG  	   = $(shell git describe --tags --abbrev=0)

IMAGES_TYPES      := full minimal
DISTROS           := alpine ubuntu
alpine_images     := $(IMAGES_TYPES:%=docker-alpine-%)
ubuntu_images     := $(IMAGES_TYPES:%=docker-ubuntu-%)
DOCKER_IMAGES     := $(alpine_images) $(ubuntu_images)
DOCKER_RUNTIMES   := $(DOCKER_IMAGES:%=run-%)
UNIT_TESTS        := test-core test-restful test-xmlrpc
DOCKER_BUILD      := docker buildx build
DOCKER_RUN        := docker run
PODMAN_SOCK       ?= /run/user/$(shell id -u)/podman/podman.sock
DOCKER_SOCK       ?= /var/run/docker.sock
DOCKER_SOCKS      := -v $(PODMAN_SOCK):$(PODMAN_SOCK):ro -v $(DOCKER_SOCK):$(DOCKER_SOCK):ro
DOCKER_OPTS       := --rm -e TZ="${TZ}" -e GLANCES_OPT="" --pid host --network host
UV_RUN		   	  := .venv-uv/bin/uv

# if the command is only `make`, the default tasks will be the printing of the help.
.DEFAULT_GOAL := help

.PHONY: help test docs docs-server venv requirements profiling docker all clean all test

help: ## List all make commands available
	@grep -E '^[\.a-zA-Z_%-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
	awk -F ":" '{print $1}' | \
	grep -v % | sed 's/\\//g' | sort | \
	awk 'BEGIN {FS = ":[^:]*?##"}; {printf "\033[1;34mmake %-50s\033[0m %s\n", $$1, $$2}'

# ===================================================================
# Virtualenv
# ===================================================================

# install-uv: ## Instructions to install the UV tool
# 	@echo "Install the UV tool (https://astral.sh/uv/)"
# 	@echo "Please install the UV tool manually"
# 	@echo "For example with: curl -LsSf https://astral.sh/uv/install.sh | sh"
# 	@echo "Or via a package manager of your distribution"
# 	@echo "For example for Snap: snap install astral-uv"

install-uv: ## Install UV tool in a specific virtualenv
	python3 -m venv .venv-uv
	.venv-uv/bin/pip install uv

upgrade-uv: ## Upgrade the UV tool
	.venv-uv/bin/pip install --upgrade pip
	.venv-uv/bin/pip install --upgrade uv

venv: ## Create the virtualenv with all dependencies
	$(UV_RUN) sync --all-extras --no-group dev

venv-upgrade venv-switch-to-full: ## Upgrade the virtualenv with all dependencies
	$(UV_RUN) sync --upgrade --all-extras

venv-min: ## Create the virtualenv with minimal dependencies
	$(UV_RUN) sync

venv-upgrade-min venv-switch-to-min: ## Upgrade the virtualenv with minimal dependencies
	$(UV_RUN) sync --upgrade

venv-clean: ## Remove the virtualenv
	rm -rf .venv

venv-dev: ## Create the virtualenv with dev dependencies
	$(UV_RUN) sync --dev --all-extras
	$(UV_RUN) run pre-commit install --hook-type pre-commit

# ===================================================================
# Requirements
#
# Note: the --no-hashes option should be used because pip (in CI) has
# issues with hashes.
# ===================================================================

requirements-min: ## Generate the requirements.txt files (minimal dependencies)
	$(UV_RUN) export --no-emit-workspace --no-hashes --no-group dev --output-file requirements.txt

requirements-all: ## Generate the all-requirements.txt files (all dependencies)
	$(UV_RUN) export --no-emit-workspace --no-hashes --all-extras --no-group dev --output-file all-requirements.txt

requirements-docker: ## Generate the docker-requirements.txt files (Docker specific dependencies)
	$(UV_RUN) export --no-emit-workspace --no-hashes --no-group dev --extra containers --extra web --extra mcp --output-file docker-requirements.txt

requirements-dev: ## Generate the dev-requirements.txt files (dev dependencies)
	$(UV_RUN) export --no-hashes --only-dev --output-file dev-requirements.txt

requirements: requirements-min requirements-all requirements-dev requirements-docker  ## Generate all the requirements files

requirements-upgrade: venv-upgrade requirements  ## Upgrade the virtualenv and regenerate all the requirements files

# ===================================================================
# Tests
# ===================================================================

test: ## Run All unit tests
	$(UV_RUN) run pytest

test-core: ## Run Core unit tests
	$(UV_RUN) run pytest tests/test_core.py

test-plugins: ## Run Plugins unit tests
	$(UV_RUN) run pytest tests/test_plugin_*.py

test-api: ## Run API unit tests
	$(UV_RUN) run pytest tests/test_api.py

test-memoryleak: ## Run Memory-leak unit tests
	$(UV_RUN) run pytest tests/test_memoryleak.py

test-perf: ## Run Perf unit tests
	$(UV_RUN) run pytest tests/test_perf.py

test-restful: ## Run Restful API unit tests
	$(UV_RUN) run pytest tests/test_restful.py

test-webui: ## Run WebUI unit tests
	$(UV_RUN) run pytest tests/test_webui.py

test-xmlrpc: ## Run XMLRPC API unit tests
	$(UV_RUN) run pytest tests/test_xmlrpc.py

test-with-upgrade: venv-upgrade test ## Upgrade deps and run unit tests

test-export-csv: ## Run interface tests with CSV
	/bin/bash ./tests/test_export_csv.sh

test-export-json: ## Run interface tests with JSON
	/bin/bash ./tests/test_export_json.sh

test-export-influxdb-v1: ## Run interface tests with InfluxDB version 1 (Legacy)
	/bin/bash ./tests/test_export_influxdb_v1.sh

test-export-influxdb-v3: ## Run interface tests with InfluxDB version 3 (Core)
	/bin/bash ./tests/test_export_influxdb_v3.sh

test-export-timescaledb: ## Run interface tests with TimescaleDB
	/bin/bash ./tests/test_export_timescaledb.sh

test-export-nats: ## Run interface tests with NATS
	/bin/bash ./tests/test_export_nats.sh

test-exports: ## Tests all exports
	@for f in ./tests/test_export_*.sh; do /bin/bash "$$f"; done

# ===================================================================
# Linters, profilers and cyber security
# ===================================================================

pre-commit: ## Run pre-commit hooks
	$(UV_RUN) run pre-commit run --all-files

find-duplicate-lines: ## Search for duplicate lines in files
	/bin/bash tests-data/tools/find-duplicate-lines.sh

format: ## Format the code
	$(UV_RUN) run ruff format .

lint: ## Lint the code.
	$(UV_RUN) run ruff check . --fix

lint-readme: ## Lint the main README.rst file
	$(UV_RUN) run rstcheck README.rst
	$(UV_RUN) run rstcheck README-pypi.rst

codespell: ## Run codespell to fix common misspellings in text files
	$(UV_RUN) run codespell -S .git,./docs/_build,./Glances.egg-info,./venv*,./glances/outputs,*.svg -L hart,bu,te,statics -w

semgrep: ## Run semgrep to find bugs and enforce code standards
	$(UV_RUN) run semgrep scan --config=auto

profiling-%: SLEEP = 3
profiling-%: TIMES = 30
profiling-%: OUT_DIR = docs/_static

define DISPLAY-BANNER
@echo "Start Glances for $(TIMES) iterations (more or less 1 mins, please do not exit !)"
sleep $(SLEEP)
endef

profiling-gprof: CPROF = glances.cprof
profiling-gprof: ## Callgraph profiling (need "apt install graphviz")
	$(DISPLAY-BANNER)
	$(UV_RUN) run python -m cProfile -o $(CPROF) run-venv.py -C $(CONF) --stop-after $(TIMES)
	$(UV_RUN) run gprof2dot -f pstats $(CPROF) | dot -Tsvg -o $(OUT_DIR)/glances-cgraph.svg
	rm -f $(CPROF)

profiling-pyinstrument: ## PyInstrument profiling
	$(DISPLAY-BANNER)
	$(UV_RUN) add pyinstrument
	$(UV_RUN) run pyinstrument -r html -o $(OUT_DIR)/glances-pyinstrument.html -m glances -C $(CONF) --stop-after $(TIMES)

profiling-pyspy: ## Flame profiling
	$(DISPLAY-BANNER)
	$(UV_RUN) run py-spy record -o $(OUT_DIR)/glances-flame.svg -d 60 -s -- .venv/bin/python -m glances -C $(CONF) --stop-after $(TIMES)

profiling: profiling-gprof profiling-pyinstrument profiling-pyspy ## Profiling of the Glances software

trace-malloc: ## Trace the malloc() calls
	@echo "Malloc test is running, please wait ~30 secondes..."
	$(UV_RUN) run python -m glances -C $(CONF) --trace-malloc --stop-after 15 --quiet

memory-leak: ## Profile memory leaks
	$(UV_RUN) run python -m glances -C $(CONF) --memory-leak

memory-profiling: TIMES = 2400
memory-profiling: PROFILE = mprofile_*.dat
memory-profiling: OUT_DIR = docs/_static
memory-profiling: ## Profile memory usage
	@echo "It's a very long test (~4 hours)..."
	rm -f $(PROFILE)
	@echo "1/2 - Start memory profiling with the history option enable"
	$(UV_RUN) run mprof run -T 1 -C run-venv.py -C $(CONF) --stop-after $(TIMES) --quiet
	$(UV_RUN) run mprof plot --output $(OUT_DIR)/glances-memory-profiling-with-history.png
	rm -f $(PROFILE)
	@echo "2/2 - Start memory profiling with the history option disable"
	$(UV_RUN) run mprof run -T 1 -C run-venv.py -C $(CONF) --disable-history --stop-after $(TIMES) --quiet
	$(UV_RUN) run mprof plot --output $(OUT_DIR)/glances-memory-profiling-without-history.png
	rm -f $(PROFILE)

# Trivy installation: https://aquasecurity.github.io/trivy/latest/getting-started/installation/
trivy: ## Run Trivy to find vulnerabilities
	$(UV_RUN) run trivy fs ./glances/

bandit: ## Run Bandit to find vulnerabilities
	$(UV_RUN) run bandit glances -r

# ===================================================================
# Docs
# ===================================================================

docs: ## Create the documentation
	$(UV_RUN) run python -m glances -C $(CONF) --api-doc > ./docs/api/python.rst
	$(UV_RUN) run python ./generate_openapi.py
	$(UV_RUN) run python -m glances -C $(CONF) --api-restful-doc > ./docs/api/restful.rst
	cd docs && ./build.sh && cd ..

docs-server: docs ## Start a Web server to serve the documentation
	(sleep 2 && sensible-browser "http://localhost:$(PORT)") &
	cd docs/_build/html/ && .venv-uv/bin/uvrun python -m http.server $(PORT)

docs-jupyter:  ## Start Jupyter Notebook
	$(UV_RUN) run --with jupyter jupyter lab

release-note: ## Generate release note
	git --no-pager log $(LASTTAG)..HEAD --pretty=format:"* %s"
	@echo "\n"
	git --no-pager shortlog -s -n $(LASTTAG)..HEAD

install: ## Open a Web Browser to the installation procedure
	sensible-browser "https://github.com/nicolargo/glances#installation"

# ===================================================================
# WebUI
# Follow ./glances/outputs/static/README.md for more information
# ===================================================================

webui webui%: DIR = glances/outputs/static/

webui-gen-config: ## Generate the Web UI config file
	$(UV_RUN) run python ./generate_webui_conf.py > ./glances/outputs/static/js/uiconfig.json

webui: webui-gen-config ## Build the Web UI
	cd $(DIR) && npm ci && npm run build

webui-audit: ## Audit the Web UI
	cd $(DIR) && npm audit

webui-audit-fix: webui-gen-config ## Fix audit the Web UI
	cd $(DIR) && npm ci && npm audit fix && npm run build

webui-update: webui-gen-config ## Update JS dependencies
	cd $(DIR) && npm update --save && npm ci && npm run build

# ===================================================================
# Packaging
# ===================================================================

flatpak: venv-upgrade ## Generate FlatPack JSON file
	git clone https://github.com/flatpak/flatpak-builder-tools.git
	$(UV_RUN) run python ./flatpak-builder-tools/pip/flatpak-pip-generator glances
	rm -rf ./flatpak-builder-tools
	@echo "Now follow: https://github.com/flathub/flathub/wiki/App-Submission"

# Snap package is automatically build on the Snapcraft.io platform
# https://snapcraft.io/glances
# But you can try an offline build with the following command
snapcraft:
	snapcraft

# ===================================================================
# Docker
# Need Docker Buildx package (apt install docker-buildx on Ubuntu)
# ===================================================================

define MAKE_DOCKER_BUILD_RULES
$($(DISTRO)_images): docker-$(DISTRO)-%: docker-files/$(DISTRO).Dockerfile
	$(DOCKER_BUILD) --target $$* -f $$< -t glances:local-$(DISTRO)-$$* .
endef

$(foreach DISTRO,$(DISTROS),$(eval $(MAKE_DOCKER_BUILD_RULES)))

docker: docker-alpine docker-ubuntu ## Generate local docker images

docker-alpine: $(alpine_images) ## Generate local docker images (Alpine)
docker-ubuntu: $(ubuntu_images) ## Generate local docker images (Ubuntu)

docker-alpine-full: ## Generate local docker image (Alpine full)
docker-alpine-minimal: ## Generate local docker image (Alpine minimal)
docker-alpine-dev: ## Generate local docker image (Alpine dev)
docker-ubuntu-full: ## Generate local docker image (Ubuntu full)
docker-ubuntu-minimal: ## Generate local docker image (Ubuntu minimal)
docker-ubuntu-dev: ## Generate local docker image (Ubuntu dev)

trivy-docker: ## Run Trivy to find vulnerabilities in Docker images
	$(UV_RUN) run trivy image glances:local-alpine-full
	$(UV_RUN) run trivy image glances:local-alpine-minimal
	$(UV_RUN) run trivy image glances:local-ubuntu-full
	$(UV_RUN) run trivy image glances:local-ubuntu-minimal

# ===================================================================
# Run
# ===================================================================

run: ## Start Glances in console mode (also called standalone)
	$(UV_RUN) run python -m glances -C $(CONF)

run-debug: ## Start Glances in debug console mode (also called standalone)
	$(UV_RUN) run python -m glances -C $(CONF) -d

run-local-conf: ## Start Glances in console mode with the system conf file
	$(UV_RUN) run python -m glances

run-local-conf-hide-public: ## Start Glances in console mode with the system conf file and hide public information
	$(UV_RUN) run python -m glances --hide-public-info

run-like-htop: ## Start Glances with the same features than Htop
	$(UV_RUN) run python -m glances --disable-plugin network,ports,wifi,connections,diskio,fs,irq,folders,raid,smart,sensors,vms,containers,ip,amps --disable-left-sidebar

run-fetch: ## Start Glances in fetch mode
	$(UV_RUN) run python -m glances --fetch

$(DOCKER_RUNTIMES): run-docker-%:
	$(DOCKER_RUN) $(DOCKER_OPTS) $(DOCKER_SOCKS) -it glances:local-$*

run-docker-alpine-minimal: ## Start Glances Alpine Docker minimal in console mode
run-docker-alpine-full: ## Start Glances Alpine Docker full in console mode
run-docker-alpine-dev: ## Start Glances Alpine Docker dev in console mode
run-docker-ubuntu-minimal: ## Start Glances Ubuntu Docker minimal in console mode
run-docker-ubuntu-full: ## Start Glances Ubuntu Docker full in console mode
run-docker-ubuntu-dev: ## Start Glances Ubuntu Docker dev in console mode

generate-ssl: ## Generate local and sel signed SSL certificates for dev (need mkcert)
	mkcert glances.local localhost 120.0.0.1 0.0.0.0

run-webserver: ## Start Glances in Web server mode
	$(UV_RUN) run python -m glances -C $(CONF) -w

run-webserver-mcp: ## Start Glances in Web server mode with MCP
	$(UV_RUN) run python -m glances -C $(CONF) -w --enable-mcp

run-webserver-local-conf: ## Start Glances in Web server mode with the system conf file
	$(UV_RUN) run python -m glances -w

run-webserver-mcp-local-conf: ## Start Glances in Web server mode with MCP and the system conf file
	$(UV_RUN) run python -m glances -w --enable-mcp

run-webserver-local-conf-hide-public: ## Start Glances in Web server mode with the system conf file and hide public info
	$(UV_RUN) run python -m glances -w --hide-public-info

run-webui: run-webserver  ## Start Glances in Web server mode

run-restapiserver: ## Start Glances in REST API server mode
	$(UV_RUN) run python -m glances -C $(CONF) -w --disable-webui

run-server: ## Start Glances in server mode (RPC)
	$(UV_RUN) run python -m glances -C $(CONF) -s

run-client: ## Start Glances in client mode (RPC)
	$(UV_RUN) run python -m glances -C $(CONF) -c localhost

run-browser: ## Start Glances in browser mode (RPC)
	$(UV_RUN) run python -m glances -C $(CONF) --browser

run-web-browser: ## Start Web Central Browser
	$(UV_RUN) run python -m glances -C $(CONF) -w --browser

run-issue: ## Start Glances in issue mode
	$(UV_RUN) run python -m glances -C $(CONF) --issue

run-multipass: ## Install and start Glances in a VM (only available on Ubuntu with multipass already installed)
	multipass launch -n glances-on-lts lts
	multipass exec glances-on-lts -- sudo snap install glances
	multipass exec glances-on-lts -- glances
	multipass stop glances-on-lts
	multipass delete glances-on-lts

show-version: ## Show Glances version number
	$(UV_RUN) run python -m glances -C $(CONF) -V


================================================
FILE: NEWS.rst
================================================
==============================================================================
                                Glances ChangeLog
==============================================================================

=============
Version 4.5.2
=============

Bug corrected:

* System display error on "little" terminal #3469

Security patches:

* Default CORS Configuration Allows Cross-Origin Credential Theft - Correct CVE-2026-32610
* Incomplete Secrets Redaction: /api/v4/args Endpoint Leaks Password Hash and SNMP Credentials - Correct CVE-2026-32609
* REST/WebUI Lacks Host Validation and Remains Exposed to DNS Rebinding - Correct CVE-2026-32632
* Unauthenticated API Exposure / Add warning message on startup - Correct CVE-2026-32596
* SQL Injection in DuckDB Export via Unparameterized DDL Statements - Correct CVE-2026-32611
* Command Injection via Process Names in Action Command Templates - Correct CVE-2026-32608
* Central Browser Autodiscovery Leaks Reusable Credentials to Zeroconf-Spoofed Servers - Correct CVE-2026-32634
* Browser API Exposes Reusable Downstream Credentials via  - Correct CVE-2026-32633

Breaking changes: This release addresses 8 security vulnerabilities (see below).
Several of the mitigations change observable behaviour. Users who run Glances in
web server or API mode (``-w`` / ``--enable-webserver``) should read the items below before upgrading.

* [CVE-2026-32632] Host header validation is now enforced on the
  built-in web server. Requests whose ``Host`` header does not match
  ``localhost`` or ``127.0.0.1`` will be rejected with HTTP 400 by
  default. Users accessing Glances through a reverse proxy, a custom
  hostname, or a non-loopback IP address must declare the allowed
  values with the new ``allowed_hosts`` key in the ``[outputs]``
  section of ``glances.conf`` (comma-separated list). This was
  already required for the MCP server since 4.5.1; it now also
  applies to the main REST/WebUI server.

* [CVE-2026-32610] The default CORS policy is now restrictive.
  Previously, the server replied with ``Access-Control-Allow-Origin: *``
  which allowed any web page to issue credentialed cross-origin requests
  against the API. The wildcard is removed. Users running third-party
  web dashboards or custom front-ends on a different origin must
  explicitly list allowed origins with the ``cors_origins`` key in the
  ``[outputs]`` section of ``glances.conf``.

* [CVE-2026-32609] Sensitive fields are now redacted on unauthenticated
  API responses. The ``/api/4/args`` and ``/api/4/config`` endpoints no
  longer return password hashes, SSL key paths, or SNMP community
  strings to callers that have not authenticated. Scripts and
  integrations that relied on reading these values from the API must
  now authenticate (token or password) to receive them.

* [CVE-2026-32633, CVE-2026-32634] The Browser (multi-server mode)
  no longer forwards configured credentials to remote Glances servers,
  whether discovered via Zeroconf or listed in the ``[serverlist]``
  section. Credentials are only sent after the user explicitly logs in
  to an individual server. Automated setups that relied on transparent
  credential propagation must switch to per-server authentication.

* [CVE-2026-32596] A WARNING is now printed to stdout at startup when
  the REST API is running without authentication (no ``--password`` and
  no API token configured). This is an informational message; the
  unauthenticated mode itself is unchanged and remains the default for
  private-network deployments. Startup scripts or monitoring pipelines
  that treat any stderr/stdout output as a failure may need to be
  updated.

* [CVE-2026-32611] The DuckDB export module now uses parameterized DDL
  statements. Table names derived from plugin or metric names are
  sanitized before use. Existing DuckDB databases whose table names
  contained characters that were previously interpolated verbatim may
  need to be recreated.

* [CVE-2026-32608] Process names used in ``[action]`` command templates
  are now shell-escaped before substitution. Templates that relied on
  unescaped special characters in process names to construct compound
  shell expressions will no longer behave as before.

Thanks to @psyberck for the UI patch and @DhiyaneshGeek / @restriction for CVEs reports.


=============
Version 4.5.1
=============

Bug corrected:

* DiskIO plugin crashes Glances on OpenBSD (regression from 4.5.0.5) #3452
* DiskIO plugin does not handle empty args in msg_curse() #3429
* Filesystem plugin KeyError on /etc/hostname in get_view() #3470
* Sensors show/hide by alias name not working #3439
* SMART plugin non-uniform key types cause TypeError with InfluxDB2 export #3449
* WebUI displays incorrect temperature values in Fahrenheit mode #3450
* AMD GPU plugin PermissionError on /usr/share/libdrm/amdgpu.ids crashes Glances at startup (Snap) #3456
* NVIDIA GPU not detected under Snap strict confinement #3292
* MCP server rejects external host connections due to DNS rebinding protection #3467
* --enable-history flag silently ignored #3416

Enhancements:

* Intel GPU monitoring support added to GPU plugin #994
* Docker container health status and alerts #3402
* Add libvirt client to Docker image for VM monitoring #3436
* Add DeviceName key to SMART plugin device stats #3457
* All plugins now expose min/max/mean statistics since startup #3462
* Improved CPU plugin display on macOS (graceful handling of unavailable fields) #3464

Security patches:

* Unauthenticated Configuration Secrets Exposure - Correct CVE-2026-30928
* SQL Injection via Process Names in TimescaleDB Export - Correct CVE-2026-30930

Code quality:

* JSON serializer hardened with comprehensive type normalization #3454
* Reduce cyclomatic complexity of split_esc() in globals #3461
* Add plugin tests to Makefile #3446
* Fix code block formatting in documentation #3447

Thanks to all the contributors for this version: @YamiYukiSenpai, @amzon-ex,
@axodentally, @fpusan, @janusn, @kleinmatic, @lcheylus, @lubomir-moric, @mark-rahal,
@mikemhenry, @Ambika-Patidar, @AbdelhamidKhald, @Julietmgbole,
@sdoshi2061, @cjlindem, @theamanrawat

===============
Version 4.5.0.5
===============

Bugs corrected:

* Regression in the process selection with Glances 4.5.0 #3444
* [Docker image] Basic Auth no longer works in browser after adding Bearer token support #3434
* Error fetching ip with urlopen_auth() - extra function argument #3438

===============
Version 4.5.0.4
===============

Continious integration:

* Remove cassandra-driver dependency because it breaks build on Docker Alpine image

===============
Version 4.5.0.2
===============

Bugs corrected:

* NPU plugin makes Glances 4.5.0.1 crashing on start #3425
* Glances 4.5.0.1 not reporting docker container details #3426

===============
Version 4.5.0.1
===============

Bugs corrected:

* Docker image for Glances release 4.5.0 failed to start if no [outputs] section in the glances.conf file #3424

=============
Version 4.5.0
=============

Enhancements:

* NPU Monitoring #2694
* Implement API Token for the ResfulAPI server #1995
* ZFS Monitoring #873
* NVME support #3355
* Add export to DuckDB database #3205
* Add CPU core number field to processlist #3411
* Add support for escape ':' in alias name #3345

Bugs corrected:

* CPU Speed / Max Speed wrong in WebUI #3134
* TIME+ in Web UI Shows Incorrect Large Values #3401
* ERROR: Exception in ASGI application KeyErro used #3409
* InfluxDB Exports for AMPs can mismatch types for result field #3419
* Fix quicklook in case psutil.cpu_freq().max=0.0 #3379
* Get amdgpu name from amdgpu.id #3376
* Fetch option is not compliant with client/server mode #3352
* Glances won't start when using snmp discovery with parameter -c #3354
* Avoid empty space when Quicklook plugin is displayed #3413

Continious integration and documentation:

* Reduce code complexity #2801
* Docker GPU not showing up #3393
* Potential fix for code scanning alert no. 47: Clear-text logging of sensitive information #3418
* Test: Add comprehensive unit tests for core plugins #3422
* README: Syntax fix (missing space) #3420
* fix(security): resolve B701 (Jinja2) and B113 (timeout) vulnerabilities #3383
* Update license specification to SPDX format #3381
* Make a simple Jupyter notebook for the Glances API #3350
* Improve Docker build pipeline #3336

Thanks to all contributors and bug reporters !

Special thanks to:

- ffleischer
- drake7707
- Ambika-Patidar

=============
Version 4.4.1
=============

Bug corrected:

* Restful API issue after a while (stats are no more updated) #3333

=============
Version 4.4.0
=============

Breaking changes:

* A new Python API is now available to use Glances as a Python lib in your hown development #3237
* In the process list, the long command line is now truncated by default. Use the arrow keys to show the full command line. SHIFT + arrow keys are used to switch between column sorts (TUI).
* Prometheus export format is now more user friendly (see detail in #3283)

Enhancements:

* Make a Glances API in order to use Glances as a Python lib #3237
* Add a new --fetch (neofetch like) option to display a snapshot of the current system status #3281
* Show used port in container section #2054
* Show long command line with arrow key #1553
* Sensors plugin refresh by default every 10 seconds
* Do not call update if a call is done to a specific plugin through the API #3033
* [UI] Process virtual memory display can be disable by configuration #3299
* Choose between used or available in the mem plugin #3288
* [Experimental] Add export to DuckDB database #3205
* Add Disk I/O Latency stats #1070
* Filter fields to export #3258
* Remove .keys() from loops over dicts #3253
* Remove iterator helpers #3252

Bug corrected:

* [MACOS] Glances not showing Processes on MacOS #3100
* Last dev build broke Homepage API calls ? only 1 widget still working #3322
* Cloud plugin always generate communication with 169.254.169.254, even if the plugin is disabled #3316
* API response delay (3+ minutes) when VMs are running #3317
* [WINDOWS] Glances do not display CPU stat correctly #3155
* Glances hangs if network device (NFS) is no available #3290
* Fix prometheus export format #3283
* Issue #3279 zfs cache and memory math issues #3289
* [MACOS]  Glances crashes when I try to filter #3266
* Glances hang when killing process with muliple CTRL-C #3264
* Issues after disabling system and processcount plugins #3248
* Headers missing from predefined fields in TUI browser machine list #3250
* Add another check for the famous Netifaces issue - Related to #3219
* Key error 'type' in server_list_static.py (load_server_list) #3247

Continious integration and documentation:

* Glances now use uv for the dev environment #3025
* Glances is compatible with Python 3.14 #3319
* Glances provides requirements files with specific versions for each release
* Requirements files are now generated dynamically with the make requirements or requirements-upgrade target
* Add duplicate line check in pre-commit (strange behavor with some VScode extension)
* Solve issue with multiprocessing exception with Snap package
* Add a test script for identify CPU consumption of sensor plugin
* Refactor port to take into account netifaces2
* Correct issue with Chrome driver in WebUI unit test
* Upgrade export test with InfluxDB 1.12
* Fix typo of --export-process-filter help message #3314
* In the outdated feature, catch error message if Pypi server not reachable
* Add unit test for auto_unit
* Label error in docs #3286
* Put WebUI conf generator in a dedicated script
* Refactor the Makefile to generate WebUI config file for all webui targets
* Update sensors documentation #3275
* Update docker compose env quote #3273
* Update docker-compose.yml #3249
* Update API doc generation
* Update README with nice icons #3236
* Add documentation for WebUI test

Thanks to all contributors and bug reporters !

Special thanks to:
- Adi
- Bennett Kanuka
- Tim Potter
- Ariel Otilibili
-	Boris Okassa
-	Lawrence
-	Shohei YOSHIDA
-	jmwallach
-	korn3r

=============
Version 4.3.3
=============

Bug corrected:

* Something in 4.3.2 broke the home assistant add-on for Glances #3238

Thanks to the FastAPI and Home Assistant community for the support.

=============
Version 4.3.2
=============

Enhancements:

* Add stats about running VMS (qemu/libvirt/kvm support through virsh) #1531
* Add support for InfluxDB 3 Core #3182
* (postgre)SQL export support / TimeScaleDB #2814
* CSV column name now include the plugin name - Related to #2394
* Make all results from amps plugins exportable #2394
* Make --stdout (csv and json) compliant with client/server mode #3235
* API history endpoints shows times without timezone #3218
* FR: Sort Sensors my name in proper number order #3132
* In the FS module, do not display threshold for volume mounted in 'ro' (read-only) #3143
* Add a new field in the process list to identifie Zombie process #3178
* Update plugin containers display and order #3186
* Implement a basic memory cache with TTL for API call (set to ~1 second) #3202
* Add container inactive_file & limit to InfluxDB2 export #3206

Bug corrected:

* [GPU] AMD Plugin: Operation not permitted #3125
* Container memory stats not displayed #3142
* [WEBUI] Irix mode (per core instead of per CPU percentage) not togglable #3158
* Related to iteritems, itervalues, and iterkeys are not more needed in Python 3 #3181
* Glances Central Browser should use name instead of IP adress for redirection #3103
* Glances breaks if Podman container is started while it is running #3199

Continious integration and documentation:

* Add a new option --print-completion to generate shell tab completion - #3111
* Improve Restful API documentation embeded in FastAPI #2632
* Upgrade JS libs #3147
* Improve unittest for CSV export #3150
* Improve unittest for InfluxDB plugin #3149
* Code refactoring - Rename plugin class to <Plugin name>Plugin instead of PluginModel #3169
* Refactor code to limit the complexity of update_views method in plugins #3171

Thanks to all contributors and bug reporters !

Special thanks to:
- Ariel Otilibili
- kenrmayfield

=============
Version 4.3.1
=============

Enhancements:

* [WebUI] Top processes extended stats and processes filter in Web server mode #410
* I'd like a feature to make the forground color for colored background white #3119
* -disable-bg in ~/.config/glances.conf #3113
* Entry point in the API to get extended process stats #3095
* Replace netifaces by netifaces-plus dependencies #3053
* Replace docker by containers in glances-grafana-flux.json #3118

Bug corrected:

* default_config_dir: Fix config path to include glances/ directory #3106
* Cannot set warning/critical temperature for a specific sensor needs test #3102
* Try to reduce latency between stat's update and view - #3086
* Error on Cloud plugin initialisation make TUI crash #3085

Continious integration:

* Add Selenium to test WebUI #3044

Thanks to all contributors and bug reporters !

Special thanks to:
- Alexander Kuznetsov
- Jonathan Chemla
- mizulike

===============
Version 4.3.0.8
===============

Bug corrected:

* IP plugin broken with Netifaces2 #3076
* WebUI if is notresponsive on mobile #3059 (second run)

===============
Version 4.3.0.7
===============

Bug corrected:

* WebUI if is notresponsive on mobile #3059

===============
Version 4.3.0.6
===============

Bug corrected:

*  Browser mode do not working with the sensors plugin #3069
*  netifaces is deprecated, use netifaces-plus or netifaces2 #3055

Continuous integration and documentation:

* Update alpine Docker tag to v3.21 #3061

===============
Version 4.3.0.5
===============

Bug corrected:

*  WebUI errors in 4.3.0.4 on iPad Air (and Browser with low resolution) #3057

===============
Version 4.3.0.4
===============

Continuous integration and documentation:

* Pin Python version in Ubuntu image to 3.12

===============
Version 4.3.0.3
===============

Continuous integration and documentation:

* Pin Alpine image to 3.20 (3.21 is not compliant with Netifaces) Related to #3053

===============
Version 4.3.0.2
===============

Enhancements:

* Revert "Replace netifaces by netifaces-plus" #3053 because it break build on Alpine Image

===============
Version 4.3.0.1
===============

Enhancements:

* Replace netifaces by netifaces-plus #3053

Bug corrected:

* CONTAINERS section missing in 4.3.0 WebUI #3052

===============
Version 4.3.0
===============

Enhancements:

* Web Based Glances Central Browser #1121
* Ability to specify hide or show for smart plugin #2996
* Thread mode ('j' hotkey) is not taken into accound in the WebUI #3019
* [WEBUI] Clear old alert messages in the WebUI #3042
* Raise an (Alert) Event for a group of sensors #3049
* Allow processlist columns to be selected in config file #1524
* Allow containers columns to be selected in config file #2722
* [WebUI] Unecessary space between Processcount and processlist #3032
* Add comparable NVML_LIB check for Windows #3000
* Change the default path for graph export to /tmp/glances
* Improve CCS of WebUI #3024

Bug corrected:

* Thresholds not displayed in the WebUI for the DiskIO plugin #1498
* FS module alias configuration do not taken into account everytime #3010
* Unexpected behaviour while running glances in docker with --export influxdb2 #2904
* Correct issue when key name contains space - Related to #2983
* Issue with ports plugin (for URL request) #3008
* Network problem when no bitrate available #3014
* SyntaxError: f-string: unmatched '[' in server list (on the DEVELOP branch only) #3018
* Uptime for Docker containers not working #3021
* WebUI doesn't display valid time for process list #2902
* Bug In the Web-UI, Timestamps for 'Warning or critical alerts' are showing incorrect month #3023
* Correct display issue on Containers plugin in WebUI #3028

Continuous integration and documentation:

* Bumped minimal Python version to 3.9 #3005
* Make the glances/outputs/static/js/uiconfig.json generated automaticaly from the make webui task
* Update unit-test for Glances Central Browser
* Add unit-test for new entry point in the API (plugin/item/key)
* Add a target to start Glances with Htop features
* Try new build and publish to Pypi CI actions

Thanks to all contributors and bug reporters !

Special thanks to:

* Ariel Otilibili for code quality improvements #2801

===============
Version 4.2.1
===============

Enhancements:

* [WEBUI] Came back to default Black Theme / Reduce font size #2993
* Improve hide_zero option #2958

Bug corrected:

* Possible memory leak #2976
* Docker/Podman shoud not flood log file with ERROR if containers list can not be retreived #2994
* Using "-w" option gives error: NameError: name 'Any' is not defined #2992
* Non blocking error message when Glances starts from a container (alpine-dev image) #2991

Continuous integration and documentation:

* Migrate from setup.py to pyproject.yml #2956
* Make pyproject.toml's version dynamic #2990

Thanks to all contributors and bug reporters !

Special thanks to:

* @branchvincent for pyproject migration

===============
Version 4.2.0
===============

Enhancements:

* [WEBUI] Migration to bootstrap 5 #2914
* New Ubuntu Multipass VM orchestartor plugin #2252
* Show only active Disk I/O (and network interface) #2929
* Make the central client UI configurable (example: GPU status) #1289
* Please make py-orjson optional: it pulls in dependency on Rust #2930
* Use defusedxml lib #2979
* Do not display Unknown information in the cloud plugin #2485
* Filter Docker containers - #2962
* Add retain to availability topic in MQTT plugin #2974
* Make fields labelled in Green easier to see #2882

Bug corrected:

* In TUI, when processes are filtered, column are not aligned #2980
* Can't kill process. Standalone, Ubuntu 24.04 #2942
* Internal Server Error #2943
* Timezone for warning/errors is incorrect #2901
* Error while initializing the containers plugin ('type' object is not subscriptable) #2922
* url_prefix do not work in Glances < 4.2.0 - Correct issue with mount #2912
* Raid plugin breaks with inactive raid0 arrays #2908
* Crash when terminal is resized #2872
* Check if server name is not null in the Glances browser - Related to #2861
* Only display VMs with a running status (in the Vms plugin)

Continuous integration and documentation:

* Incomplete pipx install to allow webui + containers #2955
* Stick FastAPI version to 0.82.0 or higher (latest is better) - Related to #2926
* api/4/vms returns a dict, thus breaking make test-restful #2918
* Migration to Alpine 3.20 and Python 3.12 for Alpine Docker

Improve code quality (thanks to Ariel Otilibili !):

* Merge pull request #2959 from ariel-anieli/plugins-port-alerts
* Merge pull request #2957 from ariel-anieli/plugin-port-msg
* Merge pull request #2954 from ariel-anieli/makefile
* Merge pull request #2941 from ariel-anieli/refactor-alert
* Merge pull request #2950 from ariel-anieli/revert-commit-01823df9
* Merge pull request #2932 from ariel-anieli/refactorize-display-plugin
* Merge pull request #2924 from ariel-anieli/makefile
* Merge pull request #2919 from ariel-anieli/refactor-plugin-model-msg-curse
* Merge pull request #2917 from ariel-anieli/makefile
* Merge pull request #2915 from ariel-anieli/refactor-process-thread
* Merge pull request #2913 from ariel-anieli/makefile
* Merge pull request #2910 from ariel-anieli/makefile
* Merge pull request #2900 from ariel-anieli/issue-2801-catch-key
* Merge pull request #2907 from ariel-anieli/refactorize-makefile
* Merge pull request #2891 from ariel-anieli/issue-2801-plugin-msg-curse
* Merge pull request #2884 from ariel-anieli/issue-2801-plugin-update

Thanks to all contributors and bug reporters !

Special thanks to:

* Ariel Otilibili, he has made an incredible work to improve Glances code quality !
* RazCrimson, thanks for all your contributions !
* Bharath Vignesh J K
* Neveda
* ey-jo

===============
Version 4.1.2
===============

Bug corrected:

* AttributeError: 'CpuPercent' object has no attribute 'cpu_percent' #2859

===============
Version 4.1.1
===============

Bug corrected:

* Sensors data is not exported using InfluxDB2 exporter #2856

===============
Version 4.1.0
===============

Enhancements:

* Call process_iter.clear_cache() (PsUtil 6+) when Glances user force a refresh (F5 or CTRL-R) #2753
* PsUtil 6+ no longer check PID reused #2755
* Add support for automatically hiding network interfaces that are down or that don't have any IP addresses #2799

Bug corrected:

* API: Network module is disabled but appears in endpoint "all" #2815
* API is not compatible with requests containing special/encoding char #2820
* 'j' hot key crashes Glances #2831
* Raspberry PI - CPU info is not correct #2616
* Graph export is broken if there is no graph section in Glances configuration file #2839
* Glances API status check returns Error 405 - Method Not Allowed #2841
* Rootless podman containers cause glances to fail with KeyError #2827
* --export-process-filter Filter using complete command #2824
* Exception when Glances is ran with limited plugin list #2822
* Disable separator option do not work #2823

Continuous integration and documentation:

* test test_107_fs_plugin_method fails on aarch64-linux #2819

Thanks to all contributors and bug reporters !

Special thanks to:

* Bharath Vignesh J K
* RazCrimson
* Vadim Small

===============
Version 4.0.8
===============

* Make CORS option configurable security webui #2812
* When Glances is installed via venv, default configuration file is not used documentation packaging #2803
* GET /1272f6e9e8f9d6bfd6de.png results in 404 bug webui #2781 by Emporea was closed May 25, 2024
* Screen frequently flickers when outputting to local display bug needs test #2490
* Retire ujson
Download .txt
gitextract_f5ze888j/

├── .cgcignore
├── .claude/
│   ├── settings.json
│   └── skills/
│       ├── debug.md
│       ├── docker.md
│       ├── lint.md
│       ├── new-export.md
│       ├── new-plugin.md
│       ├── review.md
│       ├── test.md
│       └── webui.md
├── .coveragerc
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── build.yml
│       ├── build_docker.yml
│       ├── ci.yml
│       ├── cyber.yml
│       ├── inactive_issues.yml
│       ├── needs_contributor.yml
│       ├── quality.yml
│       ├── test.yml
│       └── webui.yml
├── .gitignore
├── .mailmap
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── .reuse/
│   └── dep5
├── AUTHORS
├── CLAUDE.md
├── CODE-OF-CONDUCT.md
├── CONTRIBUTING.md
├── COPYING
├── LICENSES/
│   └── LGPL-3.0-only.txt
├── MANIFEST.in
├── Makefile
├── NEWS.rst
├── README-pypi.rst
├── README.rst
├── SECURITY.md
├── all-requirements.txt
├── appveyor.yml
├── conf/
│   ├── empty.conf
│   ├── fetch-templates/
│   │   ├── short.jinja
│   │   └── with-logo.jinja
│   ├── glances-grafana-flux.json
│   ├── glances-grafana-influxql.json
│   └── glances.conf
├── dev-requirements.txt
├── docker-bin.sh
├── docker-compose/
│   ├── docker-compose.yml
│   └── glances.conf
├── docker-files/
│   ├── README.md
│   ├── alpine.Dockerfile
│   ├── docker-logger.json
│   └── ubuntu.Dockerfile
├── docker-requirements.txt
├── docs/
│   ├── Makefile
│   ├── README.txt
│   ├── _static/
│   │   ├── glances-architecture.excalidraw
│   │   └── glances-pyinstrument.html
│   ├── _templates/
│   │   └── links.html
│   ├── aoa/
│   │   ├── actions.rst
│   │   ├── amps.rst
│   │   ├── cloud.rst
│   │   ├── connections.rst
│   │   ├── containers.rst
│   │   ├── cpu.rst
│   │   ├── diskio.rst
│   │   ├── events.rst
│   │   ├── folders.rst
│   │   ├── fs.rst
│   │   ├── gpu.rst
│   │   ├── hddtemp.rst
│   │   ├── header.rst
│   │   ├── index.rst
│   │   ├── irq.rst
│   │   ├── load.rst
│   │   ├── memory.rst
│   │   ├── network.rst
│   │   ├── npu.rst
│   │   ├── ports.rst
│   │   ├── ps.rst
│   │   ├── quicklook.rst
│   │   ├── raid.rst
│   │   ├── sensors.rst
│   │   ├── smart.rst
│   │   ├── vms.rst
│   │   └── wifi.rst
│   ├── api/
│   │   ├── mcp.rst
│   │   ├── openapi.json
│   │   ├── python.rst
│   │   └── restful.rst
│   ├── build.sh
│   ├── cmds.rst
│   ├── conf.py
│   ├── config.rst
│   ├── dev/
│   │   └── README.txt
│   ├── docker.rst
│   ├── faq.rst
│   ├── fetch.rst
│   ├── glances.rst
│   ├── gw/
│   │   ├── cassandra.rst
│   │   ├── couchdb.rst
│   │   ├── csv.rst
│   │   ├── duckdb.rst
│   │   ├── elastic.rst
│   │   ├── graph.rst
│   │   ├── graphite.rst
│   │   ├── index.rst
│   │   ├── influxdb.rst
│   │   ├── json.rst
│   │   ├── kafka.rst
│   │   ├── mongodb.rst
│   │   ├── mqtt.rst
│   │   ├── nats.rst
│   │   ├── opentsdb.rst
│   │   ├── prometheus.rst
│   │   ├── rabbitmq.rst
│   │   ├── restful.rst
│   │   ├── riemann.rst
│   │   ├── statsd.rst
│   │   ├── timescaledb.rst
│   │   └── zeromq.rst
│   ├── index.rst
│   ├── install.rst
│   ├── make.bat
│   ├── man/
│   │   └── glances.1
│   ├── objects.inv
│   ├── quickstart.rst
│   └── support.rst
├── generate_openapi.py
├── generate_webui_conf.py
├── glances/
│   ├── README.txt
│   ├── __init__.py
│   ├── __main__.py
│   ├── actions.py
│   ├── amps/
│   │   ├── __init__.py
│   │   ├── amp.py
│   │   ├── default/
│   │   │   └── __init__.py
│   │   ├── nginx/
│   │   │   └── __init__.py
│   │   ├── systemd/
│   │   │   └── __init__.py
│   │   └── systemv/
│   │       └── __init__.py
│   ├── amps_list.py
│   ├── api.py
│   ├── attribute.py
│   ├── client.py
│   ├── client_browser.py
│   ├── config.py
│   ├── cpu_percent.py
│   ├── event.py
│   ├── events_list.py
│   ├── exports/
│   │   ├── README.rst
│   │   ├── __init__.py
│   │   ├── export.py
│   │   ├── export_asyncio.py
│   │   ├── glances_cassandra/
│   │   │   └── __init__.py
│   │   ├── glances_couchdb/
│   │   │   └── __init__.py
│   │   ├── glances_csv/
│   │   │   └── __init__.py
│   │   ├── glances_duckdb/
│   │   │   └── __init__.py
│   │   ├── glances_elasticsearch/
│   │   │   └── __init__.py
│   │   ├── glances_graph/
│   │   │   └── __init__.py
│   │   ├── glances_graphite/
│   │   │   └── __init__.py
│   │   ├── glances_influxdb/
│   │   │   └── __init__.py
│   │   ├── glances_influxdb2/
│   │   │   └── __init__.py
│   │   ├── glances_influxdb3/
│   │   │   └── __init__.py
│   │   ├── glances_json/
│   │   │   └── __init__.py
│   │   ├── glances_kafka/
│   │   │   └── __init__.py
│   │   ├── glances_mongodb/
│   │   │   └── __init__.py
│   │   ├── glances_mqtt/
│   │   │   └── __init__.py
│   │   ├── glances_nats/
│   │   │   └── __init__.py
│   │   ├── glances_opentsdb/
│   │   │   └── __init__.py
│   │   ├── glances_prometheus/
│   │   │   └── __init__.py
│   │   ├── glances_rabbitmq/
│   │   │   └── __init__.py
│   │   ├── glances_restful/
│   │   │   └── __init__.py
│   │   ├── glances_riemann/
│   │   │   └── __init__.py
│   │   ├── glances_statsd/
│   │   │   └── __init__.py
│   │   ├── glances_timescaledb/
│   │   │   └── __init__.py
│   │   └── glances_zeromq/
│   │       └── __init__.py
│   ├── filter.py
│   ├── folder_list.py
│   ├── globals.py
│   ├── history.py
│   ├── jwt_utils.py
│   ├── logger.py
│   ├── main.py
│   ├── outdated.py
│   ├── outputs/
│   │   ├── __init__.py
│   │   ├── glances_bars.py
│   │   ├── glances_colors.py
│   │   ├── glances_curses.py
│   │   ├── glances_curses_browser.py
│   │   ├── glances_json_serializer.py
│   │   ├── glances_mcp.py
│   │   ├── glances_restful_api.py
│   │   ├── glances_sparklines.py
│   │   ├── glances_stdout.py
│   │   ├── glances_stdout_api_doc.py
│   │   ├── glances_stdout_api_restful_doc.py
│   │   ├── glances_stdout_csv.py
│   │   ├── glances_stdout_fetch.py
│   │   ├── glances_stdout_issue.py
│   │   ├── glances_stdout_json.py
│   │   ├── glances_unicode.py
│   │   └── static/
│   │       ├── .prettierrc.js
│   │       ├── README.md
│   │       ├── css/
│   │       │   ├── custom.scss
│   │       │   └── style.scss
│   │       ├── eslint.config.mjs
│   │       ├── js/
│   │       │   ├── App.vue
│   │       │   ├── Browser.vue
│   │       │   ├── app.js
│   │       │   ├── browser.js
│   │       │   ├── components/
│   │       │   │   ├── help.vue
│   │       │   │   ├── plugin-alert.vue
│   │       │   │   ├── plugin-amps.vue
│   │       │   │   ├── plugin-cloud.vue
│   │       │   │   ├── plugin-connections.vue
│   │       │   │   ├── plugin-containers.vue
│   │       │   │   ├── plugin-cpu.vue
│   │       │   │   ├── plugin-diskio.vue
│   │       │   │   ├── plugin-folders.vue
│   │       │   │   ├── plugin-fs.vue
│   │       │   │   ├── plugin-gpu.vue
│   │       │   │   ├── plugin-hostname.vue
│   │       │   │   ├── plugin-ip.vue
│   │       │   │   ├── plugin-irq.vue
│   │       │   │   ├── plugin-load.vue
│   │       │   │   ├── plugin-mem.vue
│   │       │   │   ├── plugin-memswap.vue
│   │       │   │   ├── plugin-network.vue
│   │       │   │   ├── plugin-now.vue
│   │       │   │   ├── plugin-npu.vue
│   │       │   │   ├── plugin-percpu.vue
│   │       │   │   ├── plugin-ports.vue
│   │       │   │   ├── plugin-process.vue
│   │       │   │   ├── plugin-processcount.vue
│   │       │   │   ├── plugin-processlist.vue
│   │       │   │   ├── plugin-quicklook.vue
│   │       │   │   ├── plugin-raid.vue
│   │       │   │   ├── plugin-sensors.vue
│   │       │   │   ├── plugin-smart.vue
│   │       │   │   ├── plugin-system.vue
│   │       │   │   ├── plugin-uptime.vue
│   │       │   │   ├── plugin-vms.vue
│   │       │   │   └── plugin-wifi.vue
│   │       │   ├── filters.js
│   │       │   ├── services.js
│   │       │   ├── store.js
│   │       │   └── uiconfig.json
│   │       ├── package.json
│   │       ├── public/
│   │       │   ├── browser.js
│   │       │   └── glances.js
│   │       ├── templates/
│   │       │   ├── browser.html
│   │       │   └── index.html
│   │       └── webpack.config.js
│   ├── password.py
│   ├── password_list.py
│   ├── plugins/
│   │   ├── README.rst
│   │   ├── __init__.py
│   │   ├── alert/
│   │   │   └── __init__.py
│   │   ├── amps/
│   │   │   └── __init__.py
│   │   ├── cloud/
│   │   │   └── __init__.py
│   │   ├── connections/
│   │   │   └── __init__.py
│   │   ├── containers/
│   │   │   ├── __init__.py
│   │   │   └── engines/
│   │   │       ├── __init__.py
│   │   │       ├── docker.py
│   │   │       ├── lxd.py
│   │   │       └── podman.py
│   │   ├── core/
│   │   │   └── __init__.py
│   │   ├── cpu/
│   │   │   └── __init__.py
│   │   ├── diskio/
│   │   │   └── __init__.py
│   │   ├── folders/
│   │   │   └── __init__.py
│   │   ├── fs/
│   │   │   ├── __init__.py
│   │   │   └── zfs.py
│   │   ├── gpu/
│   │   │   ├── __init__.py
│   │   │   └── cards/
│   │   │       ├── __init__.py
│   │   │       ├── amd.py
│   │   │       ├── intel.py
│   │   │       └── nvidia.py
│   │   ├── help/
│   │   │   └── __init__.py
│   │   ├── ip/
│   │   │   └── __init__.py
│   │   ├── irq/
│   │   │   └── __init__.py
│   │   ├── load/
│   │   │   └── __init__.py
│   │   ├── mem/
│   │   │   └── __init__.py
│   │   ├── memswap/
│   │   │   └── __init__.py
│   │   ├── network/
│   │   │   └── __init__.py
│   │   ├── now/
│   │   │   └── __init__.py
│   │   ├── npu/
│   │   │   ├── __init__.py
│   │   │   └── cards/
│   │   │       ├── __init__.py
│   │   │       ├── amd.py
│   │   │       ├── intel.py
│   │   │       ├── npu.py
│   │   │       └── rockchip.py
│   │   ├── percpu/
│   │   │   └── __init__.py
│   │   ├── plugin/
│   │   │   ├── __init__.py
│   │   │   ├── dag.py
│   │   │   └── model.py
│   │   ├── ports/
│   │   │   └── __init__.py
│   │   ├── processcount/
│   │   │   └── __init__.py
│   │   ├── processlist/
│   │   │   └── __init__.py
│   │   ├── programlist/
│   │   │   └── __init__.py
│   │   ├── psutilversion/
│   │   │   └── __init__.py
│   │   ├── quicklook/
│   │   │   └── __init__.py
│   │   ├── raid/
│   │   │   └── __init__.py
│   │   ├── sensors/
│   │   │   ├── __init__.py
│   │   │   └── sensor/
│   │   │       ├── __init__.py
│   │   │       ├── glances_batpercent.py
│   │   │       └── glances_hddtemp.py
│   │   ├── smart/
│   │   │   └── __init__.py
│   │   ├── system/
│   │   │   └── __init__.py
│   │   ├── uptime/
│   │   │   └── __init__.py
│   │   ├── version/
│   │   │   └── __init__.py
│   │   ├── vms/
│   │   │   ├── __init__.py
│   │   │   └── engines/
│   │   │       ├── __init__.py
│   │   │       ├── multipass.py
│   │   │       └── virsh.py
│   │   └── wifi/
│   │       └── __init__.py
│   ├── ports_list.py
│   ├── processes.py
│   ├── programs.py
│   ├── secure.py
│   ├── server.py
│   ├── servers_list.py
│   ├── servers_list_dynamic.py
│   ├── servers_list_static.py
│   ├── snmp.py
│   ├── standalone.py
│   ├── stats.py
│   ├── stats_client.py
│   ├── stats_client_snmp.py
│   ├── stats_server.py
│   ├── stats_streamer.py
│   ├── thresholds.py
│   ├── timer.py
│   ├── web_list.py
│   └── webserver.py
├── glances.ipynb
├── pyproject.toml
├── renovate.json
├── requirements.txt
├── run-venv.py
├── run.py
├── snap/
│   ├── local/
│   │   └── launchers/
│   │       └── glances-launch
│   └── snapcraft.yaml
├── sonar-project.properties
├── tests/
│   ├── HOW_TO_TEST_MCP.md
│   ├── conftest.py
│   ├── test_actions_sanitize.py
│   ├── test_api.py
│   ├── test_browser_restful.py
│   ├── test_browser_tui.py
│   ├── test_core.py
│   ├── test_duckdb_sanitize.py
│   ├── test_export_csv.sh
│   ├── test_export_duckdb.sh
│   ├── test_export_influxdb_v1.sh
│   ├── test_export_influxdb_v3.sh
│   ├── test_export_json.sh
│   ├── test_export_nats.sh
│   ├── test_export_prometheus.sh
│   ├── test_export_timescaledb.sh
│   ├── test_json_serializer.py
│   ├── test_mcp.py
│   ├── test_memoryleak.py
│   ├── test_perf.py
│   ├── test_plugin_cpu.py
│   ├── test_plugin_diskio.py
│   ├── test_plugin_fs.py
│   ├── test_plugin_load.py
│   ├── test_plugin_mem.py
│   ├── test_plugin_memswap.py
│   ├── test_plugin_network.py
│   ├── test_plugin_processcount.py
│   ├── test_plugin_sensors.py
│   ├── test_restful.py
│   ├── test_webui.py
│   └── test_xmlrpc.py
├── tests-data/
│   ├── issues/
│   │   ├── CVE-2026-32633/
│   │   │   └── glances.conf
│   │   ├── issue2849.py
│   │   ├── issue2851.py
│   │   ├── issue3027.py
│   │   ├── issue3290.py
│   │   ├── issue3319.py
│   │   ├── issue3322-homepage/
│   │   │   ├── README.txt
│   │   │   └── run-homepage.sh
│   │   ├── issue3333-homeassistant/
│   │   │   ├── README.txt
│   │   │   └── run-homeassistant.sh
│   │   ├── issue3341-NATS/
│   │   │   ├── pub.py
│   │   │   └── sub.py
│   │   ├── issue3434/
│   │   │   └── docker-compose.yml
│   │   └── issue869.py
│   ├── plugins/
│   │   ├── fs/
│   │   │   └── zfs/
│   │   │       └── arcstats
│   │   ├── gpu/
│   │   │   └── amd/
│   │   │       └── sys/
│   │   │           ├── class/
│   │   │           │   └── drm/
│   │   │           │       └── card0/
│   │   │           │           └── device/
│   │   │           │               ├── device
│   │   │           │               ├── gpu_busy_percent
│   │   │           │               ├── hwmon/
│   │   │           │               │   └── hwmon0/
│   │   │           │               │       ├── in1_input
│   │   │           │               │       └── temp1_input
│   │   │           │               ├── mem_info_gtt_total
│   │   │           │               ├── mem_info_gtt_used
│   │   │           │               ├── mem_info_vram_total
│   │   │           │               ├── mem_info_vram_used
│   │   │           │               ├── pp_dpm_mclk
│   │   │           │               ├── pp_dpm_sclk
│   │   │           │               └── revision
│   │   │           └── kernel/
│   │   │               └── debug/
│   │   │                   └── dri/
│   │   │                       └── 0/
│   │   │                           └── amdgpu_pm_info
│   │   └── npu/
│   │       ├── amd/
│   │       │   └── sys/
│   │       │       ├── bus/
│   │       │       │   └── pci/
│   │       │       │       └── drivers/
│   │       │       │           └── amdxdna/
│   │       │       │               └── 0000_c4_00.1/
│   │       │       │                   ├── accel/
│   │       │       │                   │   └── accel0/
│   │       │       │                   │       └── dev
│   │       │       │                   ├── device
│   │       │       │                   └── vendor
│   │       │       └── class/
│   │       │           └── devfreq/
│   │       │               └── amdxdna/
│   │       │                   ├── cur_freq
│   │       │                   ├── max_freq
│   │       │                   └── min_freq
│   │       ├── intel/
│   │       │   └── sys/
│   │       │       └── class/
│   │       │           └── accel/
│   │       │               └── accel0/
│   │       │                   └── device/
│   │       │                       ├── device
│   │       │                       ├── hwmon/
│   │       │                       │   └── hwmon2/
│   │       │                       │       ├── power1_input
│   │       │                       │       └── temp1_input
│   │       │                       ├── npu_current_frequency_mhz
│   │       │                       ├── npu_max_frequency_mhz
│   │       │                       └── vendor
│   │       └── rockchip/
│   │           ├── proc/
│   │           │   └── device-tree/
│   │           │       └── model
│   │           └── sys/
│   │               ├── class/
│   │               │   └── devfreq/
│   │               │       └── fdab0000.npu/
│   │               │           ├── cur_freq
│   │               │           ├── max_freq
│   │               │           └── min_freq
│   │               └── kernel/
│   │                   └── debug/
│   │                       └── rknpu/
│   │                           ├── load
│   │                           ├── mm
│   │                           └── version
│   └── tools/
│       ├── csvcheck.py
│       ├── duckdbcheck.py
│       └── find-duplicate-lines.sh
├── tox.ini
└── uninstall.sh
Download .txt
Showing preview only (343K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3995 symbols across 174 files)

FILE: glances/__init__.py
  function __signal_handler (line 56) | def __signal_handler(sig, frame):
  function end (line 63) | def end():
  function start_main_loop (line 78) | def start_main_loop(args, start_duration):
  function check_memleak (line 84) | def check_memleak(args, mode):
  function setup_server_mode (line 98) | def setup_server_mode(args, mode):
  function maybe_trace_memleak (line 107) | def maybe_trace_memleak(args, snapshot_begin):
  function start (line 125) | def start(config, args):
  function main (line 161) | def main():

FILE: glances/actions.py
  function _sanitize_mustache_dict (line 28) | def _sanitize_mustache_dict(mustache_dict):
  class GlancesActions (line 49) | class GlancesActions:
    method __init__ (line 52) | def __init__(self, args=None):
    method get (line 67) | def get(self, stat_name):
    method set (line 74) | def set(self, stat_name, criticality):
    method run (line 78) | def run(self, stat_name, criticality, commands, repeat, mustache_dict=...

FILE: glances/amps/amp.py
  class GlancesAmp (line 29) | class GlancesAmp:
    method __init__ (line 38) | def __init__(self, name=None, args=None):
    method load_config (line 58) | def load_config(self, config):
    method get (line 106) | def get(self, key):
    method enable (line 112) | def enable(self):
    method regex (line 119) | def regex(self):
    method refresh (line 123) | def refresh(self):
    method one_line (line 127) | def one_line(self):
    method time_until_refresh (line 134) | def time_until_refresh(self):
    method should_update (line 138) | def should_update(self):
    method set_count (line 151) | def set_count(self, count):
    method count (line 155) | def count(self):
    method count_min (line 159) | def count_min(self):
    method count_max (line 163) | def count_max(self):
    method set_result (line 167) | def set_result(self, result, separator=''):
    method result (line 177) | def result(self):
    method update_wrapper (line 184) | def update_wrapper(self, process_list):

FILE: glances/amps/default/__init__.py
  class Amp (line 32) | class Amp(GlancesAmp):
    method __init__ (line 41) | def __init__(self, name=None, args=None):
    method update (line 46) | def update(self, process_list):

FILE: glances/amps/nginx/__init__.py
  class Amp (line 52) | class Amp(GlancesAmp):
    method update (line 65) | def update(self, process_list):

FILE: glances/amps/systemd/__init__.py
  class Amp (line 44) | class Amp(GlancesAmp):
    method update (line 57) | def update(self, process_list):

FILE: glances/amps/systemv/__init__.py
  class Amp (line 41) | class Amp(GlancesAmp):
    method update (line 54) | def update(self, process_list):

FILE: glances/amps_list.py
  class AmpsList (line 20) | class AmpsList:
    method __init__ (line 33) | def __init__(self, args, config):
    method load_configs (line 41) | def load_configs(self):
    method __str__ (line 75) | def __str__(self):
    method __repr__ (line 78) | def __repr__(self):
    method __getitem__ (line 81) | def __getitem__(self, item):
    method __len__ (line 84) | def __len__(self):
    method update (line 87) | def update(self):
    method _build_amps_list (line 123) | def _build_amps_list(self, amp_value, processlist):
    method getList (line 142) | def getList(self):
    method get (line 146) | def get(self):
    method set (line 150) | def set(self, new_dict):

FILE: glances/api.py
  class GlancesAPI (line 21) | class GlancesAPI:
    method __init__ (line 24) | def __init__(self, config=None, args=None):
    method __getattr__ (line 39) | def __getattr__(self, item):
    method plugins (line 51) | def plugins(self):
    method auto_unit (line 55) | def auto_unit(self, number, low_precision=False, min_symbol='K', none_...
    method bar (line 70) | def bar(self, value, size=18, bar_char='■', empty_char='□', pre_char='...
    method top_process (line 91) | def top_process(self, limit=3, sorted_by='cpu_percent', sorted_by_seco...

FILE: glances/attribute.py
  class GlancesAttribute (line 22) | class GlancesAttribute:
    method __init__ (line 23) | def __init__(self, name, description='', history_max_size=None):
    method __repr__ (line 38) | def __repr__(self):
    method __str__ (line 41) | def __str__(self):
    method name (line 49) | def name(self):
    method name (line 53) | def name(self, new_name):
    method description (line 61) | def description(self):
    method description (line 65) | def description(self, new_description):
    method value (line 73) | def value(self):
    method value (line 79) | def value(self, new_value):
    method history (line 92) | def history(self):
    method history (line 96) | def history(self, new_history):
    method history (line 100) | def history(self):
    method history_reset (line 103) | def history_reset(self):
    method history_add (line 106) | def history_add(self, value):
    method history_size (line 113) | def history_size(self):
    method history_len (line 117) | def history_len(self):
    method history_value (line 121) | def history_value(self, pos=1):
    method history_raw (line 128) | def history_raw(self, nb=0):
    method history_json (line 132) | def history_json(self, nb=0):
    method history_mean (line 136) | def history_mean(self, nb=5):

FILE: glances/client.py
  class GlancesClientTransport (line 31) | class GlancesClientTransport(xmlrpc.xmlrpc_client.Transport):
    method set_timeout (line 34) | def set_timeout(self, timeout):
  class GlancesClient (line 38) | class GlancesClient:
    method __init__ (line 41) | def __init__(self, config=None, args=None, timeout=7, return_to_browse...
    method quiet (line 75) | def quiet(self):
    method log_and_exit (line 78) | def log_and_exit(self, msg=''):
    method client_mode (line 87) | def client_mode(self):
    method client_mode (line 92) | def client_mode(self, mode):
    method _login_glances (line 100) | def _login_glances(self):
    method _login_snmp (line 140) | def _login_snmp(self):
    method login (line 155) | def login(self):
    method update (line 201) | def update(self):
    method update_glances (line 212) | def update_glances(self):
    method update_snmp (line 233) | def update_snmp(self):
    method serve_forever (line 250) | def serve_forever(self):
    method end (line 294) | def end(self):

FILE: glances/client_browser.py
  class GlancesClientBrowser (line 19) | class GlancesClientBrowser:
    method __init__ (line 22) | def __init__(self, config=None, args=None):
    method __display_server (line 33) | def __display_server(self, server):
    method __serve_forever (line 112) | def __serve_forever(self):
    method serve_forever (line 126) | def serve_forever(self):
    method set_in_selected (line 137) | def set_in_selected(self, key, value):
    method end (line 141) | def end(self):

FILE: glances/config.py
  function user_config_dir (line 34) | def user_config_dir():
  function user_cache_dir (line 53) | def user_cache_dir():
  function system_config_dir (line 70) | def system_config_dir():
  function default_config_dir (line 91) | def default_config_dir():
  function in_virtualenv (line 113) | def in_virtualenv():
  function get_base_prefix_compat (line 118) | def get_base_prefix_compat():
  class Config (line 124) | class Config:
    method __init__ (line 131) | def __init__(self, config_dir=None):
    method config_file_paths (line 147) | def config_file_paths(self):
    method read (line 181) | def read(self):
    method sections_set_default (line 201) | def sections_set_default(self):
    method loaded_config_file (line 289) | def loaded_config_file(self):
    method as_dict (line 293) | def as_dict(self):
    method as_dict_secure (line 302) | def as_dict_secure(self):
    method sections (line 318) | def sections(self):
    method items (line 322) | def items(self, section):
    method has_section (line 326) | def has_section(self, section):
    method set_default_cwc (line 330) | def set_default_cwc(self, section, option_header=None, cwc=['50', '70'...
    method set_default (line 340) | def set_default(self, section, option, default):
    method get_value (line 345) | def get_value(self, section, option, default=None):
    method get_list_value (line 370) | def get_list_value(self, section, option, default=None, separator=','):
    method get_int_value (line 377) | def get_int_value(self, section, option, default=0):
    method get_float_value (line 384) | def get_float_value(self, section, option, default=0.0):
    method get_bool_value (line 391) | def get_bool_value(self, section, option, default=True):

FILE: glances/cpu_percent.py
  class CpuInfo (line 195) | class CpuInfo(TypedDict):
  class PerCpuPercentInfo (line 201) | class PerCpuPercentInfo(TypedDict):
  class CpuPercent (line 219) | class CpuPercent:
    method __init__ (line 222) | def __init__(self, cached_timer_cpu: int = 2):
    method get_key (line 242) | def get_key(self):
    method get_info (line 246) | def get_info(self) -> CpuInfo:
    method __get_cpu_name (line 269) | def __get_cpu_name() -> str:
    method get_cpu (line 294) | def get_cpu(self) -> float:
    method _compute_cpu (line 305) | def _compute_cpu() -> float:
    method get_percpu (line 308) | def get_percpu(self) -> list[PerCpuPercentInfo]:
    method _compute_percpu (line 318) | def _compute_percpu(self) -> list[PerCpuPercentInfo]:

FILE: glances/event.py
  class GlancesEvent (line 47) | class GlancesEvent:
    method __post_init__ (line 62) | def __post_init__(self):
    method is_ongoing (line 65) | def is_ongoing(self):
    method is_finished (line 69) | def is_finished(self):
    method update (line 73) | def update(

FILE: glances/events_list.py
  function build_global_message (line 147) | def build_global_message():
  class GlancesEventsList (line 163) | class GlancesEventsList:
    method __init__ (line 169) | def __init__(self, max_events=10, min_duration=6, min_interval=6):
    method set_max_events (line 188) | def set_max_events(self, max_events):
    method set_min_duration (line 192) | def set_min_duration(self, min_duration):
    method set_min_interval (line 196) | def set_min_interval(self, min_interval):
    method get (line 200) | def get(self):
    method len (line 204) | def len(self):
    method __event_exist (line 208) | def __event_exist(self, event_time, event_type):
    method get_event_sort_key (line 221) | def get_event_sort_key(self, event_type):
    method set_process_sort (line 235) | def set_process_sort(self, event_type):
    method reset_process_sort (line 240) | def reset_process_sort(self):
    method add (line 245) | def add(self, event_state, event_type, event_value, proc_list=None, pr...
    method _create_event (line 277) | def _create_event(self, event_time, event_state, event_type, event_val...
    method _update_event (line 313) | def _update_event(
    method _close_event (line 337) | def _close_event(self, event_time, event_index):
    method clean (line 350) | def clean(self, critical=False):

FILE: glances/exports/export.py
  class GlancesExport (line 21) | class GlancesExport:
    method __init__ (line 34) | def __init__(self, config=None, args=None):
    method _log_result_decorator (line 62) | def _log_result_decorator(fct):
    method exit (line 76) | def exit(self):
    method load_common_conf (line 80) | def load_common_conf(self):
    method load_conf (line 98) | def load_conf(self, section, mandatories=["host", "port"], options=None):
    method get_item_key (line 135) | def get_item_key(self, item):
    method parse_tags (line 146) | def parse_tags(self, tags):
    method normalize_for_influxdb (line 163) | def normalize_for_influxdb(self, name, columns, points):
    method is_excluded (line 238) | def is_excluded(self, field):
    method plugins_to_export (line 242) | def plugins_to_export(self, stats):
    method last_exported_list (line 250) | def last_exported_list(self):
    method init_fields (line 254) | def init_fields(self, stats):
    method update (line 263) | def update(self, stats):
    method build_export (line 297) | def build_export(self, stats):
    method export (line 344) | def export(self, name, columns, points):

FILE: glances/exports/export_asyncio.py
  class GlancesExportAsyncio (line 23) | class GlancesExportAsyncio(GlancesExport):
    method __init__ (line 35) | def __init__(self, config=None, args=None):
    method _run_event_loop (line 67) | def _run_event_loop(self):
    method _async_init (line 88) | async def _async_init(self):
    method _async_exit (line 99) | async def _async_exit(self):
    method _async_export (line 110) | async def _async_export(self, name, columns, points):
    method exit (line 122) | def exit(self):
    method export (line 143) | def export(self, name, columns, points):

FILE: glances/exports/glances_cassandra/__init__.py
  class Export (line 24) | class Export(GlancesExport):
    method __init__ (line 27) | def __init__(self, config=None, args=None):
    method init (line 53) | def init(self):
    method export (line 103) | def export(self, name, columns, points):
    method exit (line 118) | def exit(self):

FILE: glances/exports/glances_couchdb/__init__.py
  class Export (line 28) | class Export(GlancesExport):
    method __init__ (line 31) | def __init__(self, config=None, args=None):
    method init (line 44) | def init(self):
    method export (line 72) | def export(self, name, columns, points):

FILE: glances/exports/glances_csv/__init__.py
  class Export (line 20) | class Export(GlancesExport):
    method __init__ (line 23) | def __init__(self, config=None, args=None):
    method exit (line 63) | def exit(self):
    method update (line 68) | def update(self, stats):
    method export (line 111) | def export(self, name, columns, points):
  function open_csv_file (line 116) | def open_csv_file(file_name, file_mode):

FILE: glances/exports/glances_duckdb/__init__.py
  function _quote_identifier (line 22) | def _quote_identifier(name):
  class Export (line 44) | class Export(GlancesExport):
    method __init__ (line 47) | def __init__(self, config=None, args=None):
    method init (line 73) | def init(self):
    method normalize (line 88) | def normalize(self, value):
    method update (line 94) | def update(self, stats):
    method export (line 162) | def export(self, plugin, creation_list, values_list):
    method exit (line 194) | def exit(self):

FILE: glances/exports/glances_elasticsearch/__init__.py
  class Export (line 20) | class Export(GlancesExport):
    method __init__ (line 23) | def __init__(self, config=None, args=None):
    method init (line 40) | def init(self):
    method export (line 59) | def export(self, name, columns, points):

FILE: glances/exports/glances_graph/__init__.py
  class Export (line 25) | class Export(GlancesExport):
    method __init__ (line 28) | def __init__(self, config=None, args=None):
    method exit (line 69) | def exit(self):
    method update (line 73) | def update(self, stats):
    method export (line 92) | def export(self, title, data):

FILE: glances/exports/glances_graphite/__init__.py
  class Export (line 20) | class Export(GlancesExport):
    method __init__ (line 23) | def __init__(self, config=None, args=None):
    method init (line 50) | def init(self):
    method export (line 82) | def export(self, name, columns, points):
  function normalize (line 98) | def normalize(name):

FILE: glances/exports/glances_influxdb/__init__.py
  class Export (line 21) | class Export(GlancesExport):
    method __init__ (line 24) | def __init__(self, config=None, args=None):
    method init (line 54) | def init(self):
    method export (line 88) | def export(self, name, columns, points):

FILE: glances/exports/glances_influxdb2/__init__.py
  class Export (line 20) | class Export(GlancesExport):
    method __init__ (line 23) | def __init__(self, config=None, args=None):
    method init (line 66) | def init(self):
    method export (line 100) | def export(self, name, columns, points):

FILE: glances/exports/glances_influxdb3/__init__.py
  class Export (line 20) | class Export(GlancesExport):
    method __init__ (line 23) | def __init__(self, config=None, args=None):
    method init (line 54) | def init(self):
    method export (line 80) | def export(self, name, columns, points):

FILE: glances/exports/glances_json/__init__.py
  class Export (line 10) | class Export(GlancesExport):
    method __init__ (line 13) | def __init__(self, config=None, args=None):
    method exit (line 35) | def exit(self):
    method export (line 40) | def export(self, name, columns, points):

FILE: glances/exports/glances_kafka/__init__.py
  class Export (line 20) | class Export(GlancesExport):
    method __init__ (line 23) | def __init__(self, config=None, args=None):
    method init (line 44) | def init(self):
    method export (line 66) | def export(self, name, columns, points):
    method exit (line 88) | def exit(self):

FILE: glances/exports/glances_mongodb/__init__.py
  class Export (line 20) | class Export(GlancesExport):
    method __init__ (line 23) | def __init__(self, config=None, args=None):
    method init (line 42) | def init(self):
    method database (line 60) | def database(self):
    method export (line 64) | def export(self, name, columns, points):

FILE: glances/exports/glances_mqtt/__init__.py
  class Export (line 24) | class Export(GlancesExport):
    method __init__ (line 27) | def __init__(self, config=None, args=None):
    method init (line 63) | def init(self):
    method export (line 111) | def export(self, name, columns, points):

FILE: glances/exports/glances_nats/__init__.py
  class Export (line 20) | class Export(GlancesExportAsyncio):
    method __init__ (line 23) | def __init__(self, config=None, args=None):
    method _async_init (line 54) | async def _async_init(self):
    method _error_callback (line 84) | async def _error_callback(self, e):
    method _disconnected_callback (line 88) | async def _disconnected_callback(self):
    method _reconnected_callback (line 93) | async def _reconnected_callback(self):
    method _async_exit (line 98) | async def _async_exit(self):
    method _async_export (line 109) | async def _async_export(self, name, columns, points):

FILE: glances/exports/glances_opentsdb/__init__.py
  class Export (line 20) | class Export(GlancesExport):
    method __init__ (line 23) | def __init__(self, config=None, args=None):
    method init (line 46) | def init(self):
    method export (line 59) | def export(self, name, columns, points):
    method exit (line 73) | def exit(self):

FILE: glances/exports/glances_prometheus/__init__.py
  class Export (line 21) | class Export(GlancesExport):
    method __init__ (line 26) | def __init__(self, config=None, args=None):
    method init (line 52) | def init(self):
    method update (line 62) | def update(self, stats):
    method export (line 66) | def export(self, name, columns, points):

FILE: glances/exports/glances_rabbitmq/__init__.py
  class Export (line 23) | class Export(GlancesExport):
    method __init__ (line 26) | def __init__(self, config=None, args=None):
    method init (line 52) | def init(self):
    method export (line 74) | def export(self, name, columns, points):

FILE: glances/exports/glances_restful/__init__.py
  class Export (line 18) | class Export(GlancesExport):
    method __init__ (line 22) | def __init__(self, config=None, args=None):
    method init (line 42) | def init(self):
    method export (line 51) | def export(self, name, columns, points):

FILE: glances/exports/glances_riemann/__init__.py
  class Export (line 21) | class Export(GlancesExport):
    method __init__ (line 24) | def __init__(self, config=None, args=None):
    method init (line 45) | def init(self):
    method export (line 55) | def export(self, name, columns, points):

FILE: glances/exports/glances_statsd/__init__.py
  class Export (line 19) | class Export(GlancesExport):
    method __init__ (line 22) | def __init__(self, config=None, args=None):
    method init (line 44) | def init(self):
    method export (line 51) | def export(self, name, columns, points):
  function normalize (line 65) | def normalize(name):

FILE: glances/exports/glances_timescaledb/__init__.py
  class Export (line 35) | class Export(GlancesExport):
    method __init__ (line 38) | def __init__(self, config=None, args=None):
    method init (line 64) | def init(self):
    method normalize (line 81) | def normalize(self, value):
    method update (line 90) | def update(self, stats):
    method export (line 167) | def export(self, plugin, creation_list, segmented_by, values_list):
    method exit (line 223) | def exit(self):

FILE: glances/exports/glances_zeromq/__init__.py
  class Export (line 20) | class Export(GlancesExport):
    method __init__ (line 23) | def __init__(self, config=None, args=None):
    method init (line 42) | def init(self):
    method exit (line 61) | def exit(self):
    method export (line 68) | def export(self, name, columns, points):

FILE: glances/filter.py
  class GlancesFilterList (line 14) | class GlancesFilterList:
    method __init__ (line 29) | def __init__(self):
    method filter (line 33) | def filter(self):
    method filter (line 38) | def filter(self, value):
    method _add_filter (line 43) | def _add_filter(self, filter_input):
    method is_filtered (line 49) | def is_filtered(self, process):
  class GlancesFilter (line 57) | class GlancesFilter:
    method __init__ (line 78) | def __init__(self):
    method filter_input (line 90) | def filter_input(self):
    method filter (line 95) | def filter(self):
    method filter (line 100) | def filter(self, value):
    method filter_re (line 137) | def filter_re(self):
    method filter_key (line 142) | def filter_key(self):
    method is_filtered (line 146) | def is_filtered(self, process):
    method _is_process_filtered (line 162) | def _is_process_filtered(self, process, key=None):

FILE: glances/folder_list.py
  class FolderList (line 16) | class FolderList:
    method __init__ (line 36) | def __init__(self, config):
    method __set_folder_list (line 53) | def __set_folder_list(self, section):
    method __str__ (line 88) | def __str__(self):
    method __repr__ (line 91) | def __repr__(self):
    method __getitem__ (line 94) | def __getitem__(self, item):
    method __len__ (line 97) | def __len__(self):
    method __get__ (line 100) | def __get__(self, item, key):
    method update (line 113) | def update(self, key='path'):
    method get (line 143) | def get(self):
    method set (line 147) | def set(self, new_list):
    method getAll (line 151) | def getAll(self):
    method setAll (line 155) | def setAll(self, new_list):
    method path (line 159) | def path(self, item):
    method careful (line 163) | def careful(self, item):
    method warning (line 167) | def warning(self, item):
    method critical (line 171) | def critical(self, item):

FILE: glances/globals.py
  function _json_default (line 60) | def _json_default(v: Any) -> Any:
  function printandflush (line 114) | def printandflush(string):
  function to_ascii (line 119) | def to_ascii(s):
  function listitems (line 127) | def listitems(d):
  function listkeys (line 131) | def listkeys(d):
  function listvalues (line 135) | def listvalues(d):
  function u (line 139) | def u(s, errors='replace'):
  function b (line 145) | def b(s, errors='replace'):
  function nativestr (line 151) | def nativestr(s, errors='replace'):
  function system_exec (line 159) | def system_exec(command):
  function subsample (line 168) | def subsample(data, sampling):
  function time_series_subsample (line 181) | def time_series_subsample(data, sampling):
  function to_fahrenheit (line 198) | def to_fahrenheit(celsius):
  function is_admin (line 203) | def is_admin():
  function key_exist_value_not_none (line 229) | def key_exist_value_not_none(k, d):
  function key_exist_value_not_none_not_v (line 236) | def key_exist_value_not_none_not_v(k, d, value='', length=None):
  function disable (line 245) | def disable(class_name, var):
  function enable (line 251) | def enable(class_name, var):
  function safe_makedirs (line 257) | def safe_makedirs(path):
  function get_time_diffs (line 269) | def get_time_diffs(ref, now):
  function get_first_true_val (line 280) | def get_first_true_val(conds):
  function maybe_add_plural (line 284) | def maybe_add_plural(count):
  function build_str_when_more_than_seven_days (line 288) | def build_str_when_more_than_seven_days(day_diff, unit):
  function pretty_date (line 296) | def pretty_date(ref, now=None):
  function urlopen_auth (line 354) | def urlopen_auth(url, username, password, timeout=3):
  function json_dumps (line 365) | def json_dumps(data) -> bytes:
  function json_loads (line 378) | def json_loads(data: str | bytes | bytearray) -> dict | list:
  function list_to_dict (line 383) | def list_to_dict(data):
  function dictlist (line 390) | def dictlist(data, item):
  function dictlist_json_dumps (line 408) | def dictlist_json_dumps(data, item):
  function dictlist_first_key_value (line 415) | def dictlist_first_key_value(data: list[dict], key, value) -> dict | None:
  function auto_unit (line 424) | def auto_unit(number, low_precision=False, min_symbol='K', none_symbol='...
  function string_value_to_float (line 483) | def string_value_to_float(s):
  function file_exists (line 519) | def file_exists(filename):
  function folder_size (line 524) | def folder_size(path, errno=0):
  function _get_ttl_hash (line 550) | def _get_ttl_hash(ttl):
  function weak_lru_cache (line 560) | def weak_lru_cache(maxsize=1, typed=False, ttl=None):
  function namedtuple_to_dict (line 582) | def namedtuple_to_dict(data):
  function list_of_namedtuple_to_list_of_dict (line 587) | def list_of_namedtuple_to_list_of_dict(data):
  function replace_special_chars (line 592) | def replace_special_chars(input_string, by=' '):
  function atoi (line 598) | def atoi(text):
  function natural_keys (line 602) | def natural_keys(text):
  function exit_after (line 607) | def exit_after(seconds, default=None):
  function _validate_split_esc_params (line 647) | def _validate_split_esc_params(input_string, sep, maxsplit, esc):
  function _skip_whitespace (line 663) | def _skip_whitespace(input_string, i):
  function split_esc (line 671) | def split_esc(input_string, sep=None, maxsplit=-1, esc='\\'):
  function get_ip_address (line 740) | def get_ip_address(ipv6=False):
  function get_default_gateway (line 762) | def get_default_gateway(ipv6=False):

FILE: glances/history.py
  class GlancesHistory (line 14) | class GlancesHistory:
    method __init__ (line 19) | def __init__(self):
    method add (line 25) | def add(self, key, value, description='', history_max_size=None):
    method reset (line 31) | def reset(self):
    method get (line 36) | def get(self, nb=0):
    method get_json (line 40) | def get_json(self, nb=0):

FILE: glances/jwt_utils.py
  class JWTHandler (line 26) | class JWTHandler:
    method __init__ (line 32) | def __init__(self, secret_key: str | None = None, expire_minutes: int ...
    method is_available (line 51) | def is_available(self) -> bool:
    method expire_minutes (line 56) | def expire_minutes(self) -> int:
    method create_access_token (line 60) | def create_access_token(self, username: str) -> str:
    method verify_token (line 84) | def verify_token(self, token: str) -> str | None:

FILE: glances/logger.py
  function glances_logger (line 73) | def glances_logger(env_key='LOG_CFG'):

FILE: glances/main.py
  class GlancesMain (line 31) | class GlancesMain:
    method __init__ (line 106) | def __init__(self):
    method init_glances (line 110) | def init_glances(self):
    method version_msg (line 173) | def version_msg(self):
    method init_args (line 181) | def init_args(self):
    method init_debug (line 701) | def init_debug(self, args):
    method init_refresh_rate (line 708) | def init_refresh_rate(self, args):
    method init_plugins (line 721) | def init_plugins(self, args):
    method init_client_server (line 767) | def init_client_server(self, args):
    method init_ui_mode (line 821) | def init_ui_mode(self, args):
    method parse_args (line 872) | def parse_args(self):
    method check_mode_compatibility (line 876) | def check_mode_compatibility(self):
    method is_standalone (line 893) | def is_standalone(self):
    method is_client (line 897) | def is_client(self):
    method is_client_browser (line 901) | def is_client_browser(self):
    method is_server (line 905) | def is_server(self):
    method is_webserver (line 909) | def is_webserver(self):
    method get_config (line 913) | def get_config(self):
    method get_args (line 917) | def get_args(self):
    method get_mode (line 921) | def get_mode(self):
    method __get_username (line 925) | def __get_username(self, description=''):
    method __get_password (line 929) | def __get_password(self, description='', confirm=False, clear=False, u...

FILE: glances/outdated.py
  class Outdated (line 33) | class Outdated:
    method __init__ (line 39) | def __init__(self, args, config):
    method load_config (line 62) | def load_config(self, config):
    method installed_version (line 74) | def installed_version(self):
    method latest_version (line 77) | def latest_version(self):
    method refresh_date (line 80) | def refresh_date(self):
    method get_pypi_version (line 83) | def get_pypi_version(self):
    method is_outdated (line 105) | def is_outdated(self):
    method _load_cache (line 114) | def _load_cache(self):
    method _save_cache (line 136) | def _save_cache(self):
    method _update_pypi_version (line 148) | def _update_pypi_version(self):

FILE: glances/outputs/glances_bars.py
  class Bar (line 14) | class Bar:
    method __init__ (line 27) | def __init__(
    method size (line 70) | def size(self, with_decoration=False):
    method percent (line 77) | def percent(self):
    method percent (line 81) | def percent(self, value):
    method pre_char (line 87) | def pre_char(self):
    method post_char (line 91) | def post_char(self):
    method get (line 94) | def get(self, overlay: str = None):
    method __str__ (line 124) | def __str__(self):

FILE: glances/outputs/glances_colors.py
  class GlancesColors (line 22) | class GlancesColors:
    method __init__ (line 27) | def __init__(self, args) -> None:
    method __repr__ (line 59) | def __repr__(self) -> dict:
    method __define_colors (line 62) | def __define_colors(self) -> None:
    method __define_bw (line 124) | def __define_bw(self) -> None:
    method get (line 143) | def get(self) -> dict:

FILE: glances/outputs/glances_curses.py
  class _GlancesCurses (line 35) | class _GlancesCurses:
    method __init__ (line 136) | def __init__(self, config=None, args=None):
    method load_config (line 209) | def load_config(self, config):
    method _right_sidebar (line 222) | def _right_sidebar(self):
    method _init_history (line 232) | def _init_history(self):
    method _init_curses_cursor (line 237) | def _init_curses_cursor(self):
    method set_cursor (line 246) | def set_cursor(self, value):
    method get_key (line 259) | def get_key(self, window):
    method catch_actions_from_hotkey (line 262) | def catch_actions_from_hotkey(self, hotkey):
    method catch_other_actions_maybe_return_to_browser (line 271) | def catch_other_actions_maybe_return_to_browser(self, return_to_browser):
    method __catch_key (line 289) | def __catch_key(self, return_to_browser=False):
    method _handle_switch (line 305) | def _handle_switch(self, hotkey):
    method _handle_sort_key (line 324) | def _handle_sort_key(self, hotkey):
    method _handle_enter (line 327) | def _handle_enter(self):
    method _handle_quicklook (line 330) | def _handle_quicklook(self):
    method _handle_top_menu (line 337) | def _handle_top_menu(self):
    method _handle_process_extended (line 344) | def _handle_process_extended(self):
    method _handle_erase_filter (line 352) | def _handle_erase_filter(self):
    method _handle_fs_stats (line 355) | def _handle_fs_stats(self):
    method _handle_increase_nice (line 359) | def _handle_increase_nice(self):
    method _handle_decrease_nice (line 362) | def _handle_decrease_nice(self):
    method _handle_kill_process (line 365) | def _handle_kill_process(self):
    method _handle_process_name_left (line 368) | def _handle_process_name_left(self):
    method _handle_process_name_right (line 372) | def _handle_process_name_right(self):
    method _handle_clean_logs (line 375) | def _handle_clean_logs(self):
    method _handle_clean_critical_logs (line 378) | def _handle_clean_critical_logs(self):
    method _handle_disable_process (line 381) | def _handle_disable_process(self):
    method _handle_diskio_iops (line 388) | def _handle_diskio_iops(self):
    method _handle_diskio_latency (line 394) | def _handle_diskio_latency(self):
    method _handle_sort_left (line 400) | def _handle_sort_left(self):
    method _handle_sort_right (line 404) | def _handle_sort_right(self):
    method _handle_cursor_up (line 408) | def _handle_cursor_up(self):
    method _handle_cursor_down (line 412) | def _handle_cursor_down(self):
    method _handle_quit (line 416) | def _handle_quit(self, return_to_browser):
    method _handle_refresh (line 426) | def _handle_refresh(self):
    method loop_position (line 429) | def loop_position(self):
    method disable_top (line 436) | def disable_top(self):
    method enable_top (line 441) | def enable_top(self):
    method disable_fullquicklook (line 446) | def disable_fullquicklook(self):
    method enable_fullquicklook (line 451) | def enable_fullquicklook(self):
    method end (line 457) | def end(self):
    method init_line_column (line 473) | def init_line_column(self):
    method init_line (line 478) | def init_line(self):
    method init_column (line 483) | def init_column(self):
    method new_line (line 488) | def new_line(self, separator=False):
    method new_column (line 492) | def new_column(self):
    method separator_line (line 496) | def separator_line(self, color='SEPARATOR'):
    method __get_stat_display (line 514) | def __get_stat_display(self, stats, layer):
    method display (line 549) | def display(self, stats, cs_status=None):
    method nice_increase (line 656) | def nice_increase(self, process):
    method nice_decrease (line 659) | def nice_decrease(self, process):
    method kill (line 662) | def kill(self, process):
    method __display_header (line 692) | def __display_header(self, stat_display):
    method __display_top (line 727) | def __display_top(self, stat_display, stats):
    method __display_left (line 816) | def __display_left(self, stat_display):
    method __display_right (line 834) | def __display_right(self, stat_display):
    method display_popup (line 871) | def display_popup(
    method setup_upper_left_pos (line 991) | def setup_upper_left_pos(self, plugin_stats):
    method get_next_x_and_x_max (line 1008) | def get_next_x_and_x_max(self, m, x, x_max):
    method display_stats_with_current_size (line 1024) | def display_stats_with_current_size(self, m, y, x):
    method display_stats (line 1035) | def display_stats(self, plugin_stats, init, helper):
    method display_plugin (line 1070) | def display_plugin(self, plugin_stats, display_optional=True, display_...
    method clear (line 1112) | def clear(self):
    method erase (line 1120) | def erase(self):
    method refresh (line 1128) | def refresh(self):
    method flush (line 1132) | def flush(self, stats, cs_status=None):
    method update (line 1146) | def update(self, stats, duration=3, cs_status=None, return_to_browser=...
    method wait (line 1208) | def wait(self, delay=100):
    method get_stats_display_width (line 1212) | def get_stats_display_width(self, curse_msg, without_option=False):
    method get_stats_display_height (line 1244) | def get_stats_display_height(self, curse_msg):
  class GlancesCursesStandalone (line 1258) | class GlancesCursesStandalone(_GlancesCurses):
  class GlancesCursesClient (line 1265) | class GlancesCursesClient(_GlancesCurses):
  class GlancesTextbox (line 1273) | class GlancesTextbox(Textbox):
    method __init__ (line 1274) | def __init__(self, *args, **kwargs):
    method do_command (line 1277) | def do_command(self, ch):
  class GlancesTextboxYesNo (line 1285) | class GlancesTextboxYesNo(Textbox):
    method __init__ (line 1286) | def __init__(self, *args, **kwargs):
    method do_command (line 1289) | def do_command(self, ch):

FILE: glances/outputs/glances_curses_browser.py
  class GlancesCursesBrowser (line 20) | class GlancesCursesBrowser(_GlancesCurses):
    method __init__ (line 23) | def __init__(self, args=None):
    method active_server (line 57) | def active_server(self):
    method active_server (line 62) | def active_server(self, index):
    method cursor (line 67) | def cursor(self):
    method cursor (line 72) | def cursor(self, position):
    method get_pagelines (line 76) | def get_pagelines(self, stats):
    method _get_status_count (line 83) | def _get_status_count(self, stats):
    method _get_stats (line 95) | def _get_stats(self, stats):
    method cursor_up (line 108) | def cursor_up(self, stats):
    method cursor_down (line 120) | def cursor_down(self, stats):
    method cursor_pageup (line 132) | def cursor_pageup(self, stats):
    method cursor_pagedown (line 140) | def cursor_pagedown(self, stats):
    method __catch_key (line 148) | def __catch_key(self, stats):
    method update (line 201) | def update(self, stats, duration=3, cs_status=None, return_to_browser=...
    method flush (line 231) | def flush(self, stats):
    method display (line 239) | def display(self, stats, cs_status=None):
    method __display_header (line 261) | def __display_header(self, stats, x, y, screen_x, screen_y):
    method __build_column_def (line 290) | def __build_column_def(self, current_page):
    method __display_table_header (line 301) | def __display_table_header(self, column_def, x, y, screen_x, screen_y):
    method __get_cell_decoration (line 327) | def __get_cell_decoration(self, server_stat, k):
    method __display_server_row (line 337) | def __display_server_row(self, server_stat, column_def, x, y, screen_x...
    method __display_server_list (line 356) | def __display_server_list(self, stats, x, y, screen_x, screen_y):

FILE: glances/outputs/glances_json_serializer.py
  class PluginSerializationError (line 18) | class PluginSerializationError:
    method __init__ (line 21) | def __init__(self, plugin_name: str, error_message: str):
    method to_dict (line 25) | def to_dict(self) -> dict[str, Any]:
  class GlancesJSONSerializer (line 33) | class GlancesJSONSerializer:
    method __init__ (line 36) | def __init__(self, include_errors: bool = True, include_metadata: bool...
    method normalize_value (line 47) | def normalize_value(self, value: Any) -> Any:
    method serialize_plugin_data (line 72) | def serialize_plugin_data(self, plugin_name: str, raw_data: Any) -> di...
    method serialize_plugins (line 102) | def serialize_plugins(self, stats: Any, plugin_list: list[str] | None ...
    method _get_plugin_data (line 138) | def _get_plugin_data(self, stats: Any, plugin_name: str) -> Any:
    method to_json_string (line 157) | def to_json_string(self, data: Any) -> str:
    method serialize_to_string (line 168) | def serialize_to_string(self, stats: Any, plugin_list: list[str] | Non...

FILE: glances/outputs/glances_mcp.py
  class GlancesMcpServer (line 29) | class GlancesMcpServer:
    method __init__ (line 58) | def __init__(self, stats, args, config):
    method set_stats (line 98) | def set_stats(self, stats):
    method get_asgi_app (line 106) | def get_asgi_app(self, mount_path: str = MCP_DEFAULT_PATH):
    method _load_config (line 133) | def _load_config(self, config):
    method _build_transport_security (line 148) | def _build_transport_security(self):
    method _get_stats (line 167) | def _get_stats(self):
    method _serialize (line 175) | def _serialize(self, data) -> str:
    method _setup_resources (line 187) | def _setup_resources(self):
    method _setup_prompts (line 290) | def _setup_prompts(self):

FILE: glances/outputs/glances_restful_api.py
  class GlancesMcpAuthMiddleware (line 74) | class GlancesMcpAuthMiddleware:
    method __init__ (line 84) | def __init__(self, app, api_instance, mcp_path: str = "/mcp") -> None:
    method __call__ (line 90) | async def __call__(self, scope, receive, send) -> None:
    method _get_auth_header (line 118) | def _get_auth_header(self, scope) -> str:
    method _is_authenticated (line 125) | def _is_authenticated(self, scope) -> bool:
    method _send_401 (line 153) | async def _send_401(scope, receive, send) -> None:
  class GlancesJSONResponse (line 170) | class GlancesJSONResponse(JSONResponse):
    method render (line 177) | def render(self, content: Any) -> bytes:
  class GlancesUvicornServer (line 181) | class GlancesUvicornServer(uvicorn.Server):
    method install_signal_handlers (line 182) | def install_signal_handlers(self):
    method run_in_thread (line 186) | def run_in_thread(self, timeout=3):
  class GlancesRestfulApi (line 222) | class GlancesRestfulApi:
    method __init__ (line 227) | def __init__(self, config=None, args=None):
    method load_config (line 371) | def load_config(self, config):
    method is_ssl (line 411) | def is_ssl(self):
    method __update_stats (line 415) | def __update_stats(self, plugins_list_to_update=None):
    method __update_servers_list (line 423) | def __update_servers_list(self):
    method authentication (line 429) | def authentication(
    method _logo (line 477) | def _logo(self):
    method _token_router (line 487) | def _token_router(self) -> APIRouter:
    method _router (line 495) | def _router(self) -> APIRouter:
    method start (line 622) | def start(self, stats: GlancesStats) -> None:
    method _start_uvicorn (line 644) | def _start_uvicorn(self):
    method end (line 664) | def end(self):
    method _index (line 670) | def _index(self, request: Request):
    method _browser (line 683) | def _browser(self, request: Request):
    method _api_status (line 693) | def _api_status(self):
    method _events_clear_warning (line 704) | def _events_clear_warning(self):
    method _events_clear_all (line 714) | def _events_clear_all(self):
    method _api_token (line 724) | async def _api_token(self, request: Request):
    method _api_help (line 798) | def _api_help(self):
    method _api_plugins (line 810) | def _api_plugins(self):
    method _sanitize_server (line 848) | def _sanitize_server(server):
    method _api_servers_list (line 855) | def _api_servers_list(self):
    method _api_all (line 868) | def _api_all(self):
    method _api_all_limits (line 889) | def _api_all_limits(self):
    method _api_all_views (line 905) | def _api_all_views(self):
    method _api (line 921) | def _api(self, plugin: str):
    method _check_if_plugin_available (line 942) | def _check_if_plugin_available(self, plugin: str) -> None:
    method _api_top (line 950) | def _api_top(self, plugin: str, nb: int = 0):
    method _api_history (line 976) | def _api_history(self, plugin: str, nb: int = 0):
    method _api_limits (line 998) | def _api_limits(self, plugin: str):
    method _api_views (line 1016) | def _api_views(self, plugin: str):
    method _api_item (line 1037) | def _api_item(self, plugin: str, item: str):
    method _api_key (line 1062) | def _api_key(self, plugin: str, item: str, key: str):
    method _api_item_views (line 1087) | def _api_item_views(self, plugin: str, item: str):
    method _api_key_views (line 1111) | def _api_key_views(self, plugin: str, item: str, key: str):
    method _api_item_history (line 1135) | def _api_item_history(self, plugin: str, item: str, nb: int = 0):
    method _api_item_description (line 1157) | def _api_item_description(self, plugin: str, item: str):
    method _api_item_unit (line 1177) | def _api_item_unit(self, plugin: str, item: str):
    method _api_value (line 1195) | def _api_value(self, plugin: str, item: str, value: str | int | float):
    method _api_config (line 1219) | def _api_config(self):
    method _api_config_section (line 1234) | def _api_config_section(self, section: str):
    method _api_config_section_item (line 1254) | def _api_config_section_item(self, section: str, item: str):
    method _sanitize_args (line 1297) | def _sanitize_args(self):
    method _api_args (line 1314) | def _api_args(self):
    method _api_args_item (line 1328) | def _api_args_item(self, item: str):
    method _api_set_extended_processes (line 1346) | def _api_set_extended_processes(self, pid: str):
    method _api_disable_extended_processes (line 1363) | def _api_disable_extended_processes(self):
    method _api_get_extended_processes (line 1375) | def _api_get_extended_processes(self):
    method _api_get_processes (line 1390) | def _api_get_processes(self, pid: str):

FILE: glances/outputs/glances_sparklines.py
  class Sparkline (line 31) | class Sparkline:
    method __init__ (line 34) | def __init__(self, size, pre_char='[', post_char=']', unit_char='%', d...
    method available (line 49) | def available(self):
    method size (line 53) | def size(self, with_decoration=False):
    method percents (line 62) | def percents(self):
    method percents (line 66) | def percents(self, value):
    method pre_char (line 70) | def pre_char(self):
    method post_char (line 74) | def post_char(self):
    method get (line 77) | def get(self, overwrite=''):
    method __str__ (line 89) | def __str__(self):

FILE: glances/outputs/glances_stdout.py
  class GlancesStdout (line 17) | class GlancesStdout:
    method __init__ (line 20) | def __init__(self, config=None, args=None):
    method build_list (line 28) | def build_list(self):
    method end (line 48) | def end(self):
    method update (line 51) | def update(self, stats, duration=3, cs_status=None, return_to_browser=...

FILE: glances/outputs/glances_stdout_api_doc.py
  function printtab (line 28) | def printtab(s, indent='    '):
  function print_tldr (line 32) | def print_tldr(gl):
  function print_init_api (line 68) | def print_init_api(gl):
  function print_plugins_list (line 82) | def print_plugins_list(gl):
  function print_plugin (line 96) | def print_plugin(gl, plugin):
  function print_plugins (line 144) | def print_plugins(gl):
  function print_auto_unit (line 150) | def print_auto_unit(gl):
  function print_bar (line 183) | def print_bar(gl):
  function print_top_process (line 217) | def print_top_process(gl):
  class GlancesStdoutApiDoc (line 253) | class GlancesStdoutApiDoc:
    method __init__ (line 256) | def __init__(self, config=None, args=None):
    method end (line 260) | def end(self):
    method update (line 263) | def update(self, stats, duration=1):

FILE: glances/outputs/glances_stdout_api_restful_doc.py
  function indent_stat (line 269) | def indent_stat(stat, indent='    '):
  function print_api_status (line 277) | def print_api_status():
  function print_plugins_list (line 292) | def print_plugins_list(stat):
  function print_plugin_stats (line 304) | def print_plugin_stats(plugin, stat):
  function print_plugin_description (line 317) | def print_plugin_description(plugin, stat):
  function print_plugin_item_value (line 374) | def print_plugin_item_value(plugin, stat, stat_export):
  function print_all (line 404) | def print_all():
  function print_processes (line 418) | def print_processes():
  function print_top (line 439) | def print_top(stats):
  function print_fields_info (line 455) | def print_fields_info(stats):
  function print_history (line 478) | def print_history(stats):
  function print_limits (line 509) | def print_limits(stats):
  function print_plugin_post_events (line 526) | def print_plugin_post_events():
  class GlancesStdoutApiRestfulDoc (line 541) | class GlancesStdoutApiRestfulDoc:
    method __init__ (line 544) | def __init__(self, config=None, args=None):
    method end (line 549) | def end(self):
    method update (line 552) | def update(self, stats, duration=1):

FILE: glances/outputs/glances_stdout_csv.py
  class GlancesStdoutCsv (line 16) | class GlancesStdoutCsv:
    method __init__ (line 22) | def __init__(self, config=None, args=None):
    method build_list (line 33) | def build_list(self):
    method end (line 47) | def end(self):
    method build_header (line 50) | def build_header(self, plugin, attribute, stat):
    method build_data (line 70) | def build_data(self, plugin, attribute, stat):
    method update (line 90) | def update(self, stats, duration=3, cs_status=None, return_to_browser=...

FILE: glances/outputs/glances_stdout_fetch.py
  class GlancesStdoutFetch (line 58) | class GlancesStdoutFetch:
    method __init__ (line 61) | def __init__(self, config=None, args=None):
    method end (line 67) | def end(self):
    method update (line 70) | def update(self, stats, duration=3, cs_status=None, return_to_browser=...

FILE: glances/outputs/glances_stdout_issue.py
  class colors (line 26) | class colors:
    method disable (line 33) | def disable(self):
  class GlancesStdoutIssue (line 41) | class GlancesStdoutIssue:
    method __init__ (line 44) | def __init__(self, config=None, args=None):
    method end (line 49) | def end(self):
    method print_version (line 52) | def print_version(self):
    method print_issue (line 60) | def print_issue(self, plugin, result, message):
    method update (line 65) | def update(self, stats, duration=3):

FILE: glances/outputs/glances_stdout_json.py
  class GlancesStdoutJson (line 19) | class GlancesStdoutJson:
    method __init__ (line 25) | def __init__(self, config: Any | None = None, args: Any | None = None):
    method _init_plugins_list (line 34) | def _init_plugins_list(self) -> None:
    method _init_serializer (line 42) | def _init_serializer(self) -> None:
    method plugins_list (line 51) | def plugins_list(self) -> list[str]:
    method serializer (line 56) | def serializer(self) -> GlancesJSONSerializer | None:
    method build_list (line 60) | def build_list(self) -> list[str]:
    method end (line 93) | def end(self) -> None:
    method update (line 97) | def update(
    method _serialize_stats (line 116) | def _serialize_stats(self, stats: Any) -> str:
    method _output_json (line 141) | def _output_json(self, json_output: str) -> bool:
    method _wait_duration (line 163) | def _wait_duration(self, duration: int) -> None:

FILE: glances/outputs/glances_unicode.py
  function unicode_message (line 24) | def unicode_message(key, args=None):

FILE: glances/outputs/static/js/filters.js
  function bits (line 4) | function bits(bits, low_precision) {
  function bytes (line 9) | function bytes(bytes, low_precision) {
  function exclamation (line 57) | function exclamation(input) {
  function leftPad (line 64) | function leftPad(value, length, chars) {
  function limitTo (line 70) | function limitTo(value, limit) {
  function minSize (line 77) | function minSize(input, max, begin = true) {
  function nl2br (line 89) | function nl2br(input) {
  function number (line 106) | function number(value, options) {
  function timemillis (line 118) | function timemillis(array) {
  function timedelta (line 126) | function timedelta(value) {
  function dictToString (line 140) | function dictToString(dict) {

FILE: glances/outputs/static/js/services.js
  class GlancesHelperService (line 24) | class GlancesHelperService {
    method setLimits (line 28) | setLimits(limits) {
    method getLimit (line 32) | getLimit(pluginName, limitName) {
    method getAlert (line 41) | getAlert(pluginName, limitNamePrefix, current, maximum, log) {
    method getAlertLog (line 64) | getAlertLog(pluginName, limitNamePrefix, current, maximum) {
  class GlancesStatsService (line 71) | class GlancesStatsService {
    method init (line 74) | init(REFRESH_TIME = 60) {
    method getData (line 119) | getData() {
  class GlancesFavicoService (line 126) | class GlancesFavicoService {
    method constructor (line 127) | constructor() {
    method badge (line 132) | badge(nb) {
    method reset (line 135) | reset() {

FILE: glances/outputs/static/public/browser.js
  method 1392 (line 1) | 1392(t,e,r){"use strict";r.d(e,{A:()=>s});var n=r(1601),i=r.n(n),o=r(631...
  method 1304 (line 1) | 1304(t,e,r){"use strict";r.d(e,{A:()=>s});var n=r(1601),i=r.n(n),o=r(631...
  method 6314 (line 1) | 6314(t){"use strict";t.exports=function(t){var e=[];return e.toString=fu...
  method 1601 (line 1) | 1601(t){"use strict";t.exports=function(t){return t[1]}}
  method 4744 (line 1) | 4744(t){"use strict";var e=function(t){return function(t){return!!t&&"ob...
  method 5413 (line 1) | 5413(t,e){"use strict";var r;Object.defineProperty(e,"__esModule",{value...
  method 2834 (line 1) | 2834(t){"use strict";t.exports=t=>{if("string"!=typeof t)throw new TypeE...
  method 8682 (line 1) | 8682(t,e){"use strict";
  method 2543 (line 8) | 2543(t,e,r){var n;
  method 9466 (line 16) | 9466(t,e){var r,n,i;n=[],void 0===(i="function"==typeof(r=function(){ret...
  method 8633 (line 16) | 8633(t){var e=String,r=function(){return{isColorSupported:!1,reset:e,bol...
  method 396 (line 16) | 396(t,e,r){"use strict";let n=r(7793);class i extends n{constructor(t){s...
  method 9371 (line 16) | 9371(t,e,r){"use strict";let n=r(3152);class i extends n{constructor(t){...
  method 7793 (line 16) | 7793(t,e,r){"use strict";let n,i,o,a,s=r(9371),l=r(5238),c=r(3152),{isCl...
  method 3614 (line 16) | 3614(t,e,r){"use strict";let n=r(8633),i=r(9746);class o extends Error{c...
  method 5238 (line 16) | 5238(t,e,r){"use strict";let n=r(3152);class i extends n{get variable(){...
  method 145 (line 16) | 145(t,e,r){"use strict";let n,i,o=r(7793);class a extends o{constructor(...
  method 3438 (line 16) | 3438(t,e,r){"use strict";let n=r(396),i=r(9371),o=r(5238),a=r(1106),s=r(...
  method 1106 (line 16) | 1106(t,e,r){"use strict";let{nanoid:n}=r(5042),{isAbsolute:i,resolve:o}=...
  method 6966 (line 16) | 6966(t,e,r){"use strict";let n=r(7793),i=r(145),o=r(3604),a=r(9577),s=r(...
  method 1752 (line 16) | 1752(t){"use strict";let e={comma:t=>e.split(t,[","],!0),space:t=>e.spli...
  method 3604 (line 16) | 3604(t,e,r){"use strict";let{dirname:n,relative:i,resolve:o,sep:a}=r(197...
  method 4211 (line 16) | 4211(t,e,r){"use strict";let n=r(3604),i=r(9577);const o=r(3717);let a=r...
  method 3152 (line 16) | 3152(t,e,r){"use strict";let n=r(3614),i=r(7668),o=r(3303),{isClean:a,my...
  method 9577 (line 16) | 9577(t,e,r){"use strict";let n=r(7793),i=r(1106),o=r(8339);function a(t,...
  method 8339 (line 16) | 8339(t,e,r){"use strict";let n=r(396),i=r(9371),o=r(5238),a=r(5644),s=r(...
  method 2895 (line 16) | 2895(t,e,r){"use strict";let n=r(396),i=r(9371),o=r(7793),a=r(3614),s=r(...
  method 3878 (line 16) | 3878(t,e,r){"use strict";let{existsSync:n,readFileSync:i}=r(9977),{dirna...
  method 6846 (line 16) | 6846(t,e,r){"use strict";let n=r(145),i=r(6966),o=r(4211),a=r(5644);clas...
  method 3717 (line 16) | 3717(t,e,r){"use strict";let n=r(38);class i{get content(){return this.c...
  method 5644 (line 16) | 5644(t,e,r){"use strict";let n,i,o=r(7793);class a extends o{constructor...
  method 1534 (line 16) | 1534(t,e,r){"use strict";let n=r(7793),i=r(1752);class o extends n{get s...
  method 7668 (line 16) | 7668(t){"use strict";const e={after:"\n",beforeClose:"\n",beforeComment:...
  method 3303 (line 16) | 3303(t,e,r){"use strict";let n=r(7668);function i(t,e){new n(e).stringif...
  method 4151 (line 16) | 4151(t){"use strict";t.exports.isClean=Symbol("isClean"),t.exports.my=Sy...
  method 5781 (line 16) | 5781(t){"use strict";const e="'".charCodeAt(0),r='"'.charCodeAt(0),n="\\...
  method 6156 (line 16) | 6156(t){"use strict";let e={};t.exports=function(t){e[t]||(e[t]=!0,"unde...
  method 38 (line 16) | 38(t){"use strict";class e{constructor(t,e={}){if(this.type="warning",th...
  method 4728 (line 16) | 4728(t,e,r){const n=r(8331),i=r(2834),{isPlainObject:o}=r(8682),a=r(4744...
  method 1019 (line 16) | 1019(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),...
  method 9079 (line 16) | 9079(t,e,r){"use strict";var n=this&&this.__assign||function(){return n=...
  method 9004 (line 16) | 9004(t,e,r){"use strict";var n=this&&this.__createBinding||(Object.creat...
  method 8018 (line 16) | 8018(t,e){"use strict";var r;Object.defineProperty(e,"__esModule",{value...
  method 4116 (line 16) | 4116(t,e,r){"use strict";var n=this&&this.__importDefault||function(t){r...
  method 9321 (line 16) | 9321(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),...
  method 1073 (line 16) | 1073(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),...
  method 6479 (line 16) | 6479(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),...
  method 2030 (line 16) | 2030(t,e){"use strict";function r(t){for(var e=1;e<t.length;e++)t[e][0]+...
  method 808 (line 16) | 808(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0})...
  method 4128 (line 16) | 4128(t,e,r){"use strict";var n=this&&this.__createBinding||(Object.creat...
  method 430 (line 16) | 430(t,e,r){"use strict";var n,i=this&&this.__extends||(n=function(t,e){r...
  method 2772 (line 16) | 2772(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 5936 (line 16) | 5936(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 1941 (line 16) | 1941(t,e,r){"use strict";var n=this&&this.__createBinding||(Object.creat...
  method 1974 (line 16) | 1974(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 568 (line 16) | 568(t,e){"use strict";function r(t){if(t.prev&&(t.prev.next=t.next),t.ne...
  method 1161 (line 16) | 1161(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 9124 (line 16) | 9124(t,e,r){"use strict";var n=this&&this.__importDefault||function(t){r...
  method 2851 (line 16) | 2851(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 5072 (line 16) | 5072(t){"use strict";var e=[];function r(t){for(var r=-1,n=0;n<e.length;...
  method 7659 (line 16) | 7659(t){"use strict";var e={};t.exports=function(t,r){var n=function(t){...
  method 540 (line 16) | 540(t){"use strict";t.exports=function(t){var e=document.createElement("...
  method 5056 (line 16) | 5056(t,e,r){"use strict";t.exports=function(t){var e=r.nc;e&&t.setAttrib...
  method 7825 (line 16) | 7825(t){"use strict";t.exports=function(t){if("undefined"==typeof docume...
  method 1113 (line 16) | 1113(t){"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleShee...
  method 6262 (line 16) | 6262(t,e){"use strict";e.A=(t,e)=>{const r=t.__vccOpts||t;for(const[t,n]...
  method 9746 (line 16) | 9746(){}
  method 9977 (line 16) | 9977(){}
  method 197 (line 16) | 197(){}
  method 1866 (line 16) | 1866(){}
  method 2739 (line 16) | 2739(){}
  method 5979 (line 16) | 5979(t,e){"use strict";var r;Object.defineProperty(e,"__esModule",{value...
  method 9299 (line 16) | 9299(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 642 (line 16) | 642(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0})...
  method 1838 (line 16) | 1838(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 4865 (line 16) | 4865(t,e){"use strict";var r;Object.defineProperty(e,"__esModule",{value...
  method 275 (line 16) | 275(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e...
  method 5042 (line 16) | 5042(t){t.exports={nanoid:(t=21)=>{let e="",r=0|t;for(;r--;)e+="useandom...
  method 292 (line 16) | 292(t,e,r){"use strict";var n,i=this&&this.__createBinding||(Object.crea...
  method 1766 (line 16) | 1766(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 8331 (line 16) | 8331(t,e,r){"use strict";var n,i=this&&this.__createBinding||(Object.cre...
  function r (line 16) | function r(n){var i=e[n];if(void 0!==i)return i.exports;var o=e[n]={id:n...
  function K (line 16) | function K(t){return t?(t.nodeName||"").toLowerCase():null}
  function H (line 16) | function H(t){if(null==t)return window;if("[object Window]"!==t.toString...
  function U (line 16) | function U(t){return t instanceof H(t).Element||t instanceof Element}
  function Y (line 16) | function Y(t){return t instanceof H(t).HTMLElement||t instanceof HTMLEle...
  function J (line 16) | function J(t){return"undefined"!=typeof ShadowRoot&&(t instanceof H(t).S...
  function q (line 16) | function q(t){return t.split("-")[0]}
  function $ (line 16) | function $(){var t=navigator.userAgentData;return null!=t&&t.brands&&Arr...
  function tt (line 16) | function tt(){return!/^((?!chrome|android).)*safari/i.test($())}
  function et (line 16) | function et(t,e,r){void 0===e&&(e=!1),void 0===r&&(r=!1);var n=t.getBoun...
  function rt (line 16) | function rt(t){var e=et(t),r=t.offsetWidth,n=t.offsetHeight;return Math....
  function nt (line 16) | function nt(t,e){var r=e.getRootNode&&e.getRootNode();if(t.contains(e))r...
  function it (line 16) | function it(t){return H(t).getComputedStyle(t)}
  function ot (line 16) | function ot(t){return["table","td","th"].indexOf(K(t))>=0}
  function at (line 16) | function at(t){return((U(t)?t.ownerDocument:t.document)||window.document...
  function st (line 16) | function st(t){return"html"===K(t)?t:t.assignedSlot||t.parentNode||(J(t)...
  function lt (line 16) | function lt(t){return Y(t)&&"fixed"!==it(t).position?t.offsetParent:null}
  function ct (line 16) | function ct(t){for(var e=H(t),r=lt(t);r&&ot(r)&&"static"===it(r).positio...
  function ut (line 16) | function ut(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}
  function pt (line 16) | function pt(t,e,r){return V(t,z(e,r))}
  function dt (line 16) | function dt(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}
  function mt (line 16) | function mt(t,e){return e.reduce(function(e,r){return e[r]=t,e},{})}
  function ht (line 16) | function ht(t){return t.split("-")[1]}
  function At (line 16) | function At(t){var e,r=t.popper,n=t.popperRect,i=t.placement,o=t.variati...
  function wt (line 16) | function wt(t){return t.replace(/left|right|bottom|top/g,function(t){ret...
  function Ct (line 16) | function Ct(t){return t.replace(/start|end/g,function(t){return _t[t]})}
  function It (line 16) | function It(t){var e=H(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pa...
  function kt (line 16) | function kt(t){return et(at(t)).left+It(t).scrollLeft}
  function Et (line 16) | function Et(t){var e=it(t),r=e.overflow,n=e.overflowX,i=e.overflowY;retu...
  function Bt (line 16) | function Bt(t){return["html","body","#document"].indexOf(K(t))>=0?t.owne...
  function St (line 16) | function St(t,e){var r;void 0===e&&(e=[]);var n=Bt(t),i=n===(null==(r=t....
  function Dt (line 16) | function Dt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.w...
  function Ot (line 16) | function Ot(t,e,r){return e===B?Dt(function(t,e){var r=H(t),n=at(t),i=r....
  function Tt (line 16) | function Tt(t,e,r,n){var i="clippingParents"===e?function(t){var e=St(st...
  function Ft (line 16) | function Ft(t){var e,r=t.reference,n=t.element,i=t.placement,o=i?q(i):nu...
  function Nt (line 16) | function Nt(t,e){void 0===e&&(e={});var r=e,n=r.placement,i=void 0===n?t...
  function Mt (line 16) | function Mt(t,e,r){return void 0===r&&(r={x:0,y:0}),{top:t.top-e.height-...
  function Rt (line 16) | function Rt(t){return[y,x,v,w].some(function(e){return t[e]>=0})}
  function Wt (line 16) | function Wt(t,e,r){void 0===r&&(r=!1);var n,i,o=Y(e),a=Y(e)&&function(t)...
  function Kt (line 16) | function Kt(t){var e=new Map,r=new Set,n=[];function i(t){r.add(t.name),...
  function Ut (line 16) | function Ut(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]...
  function Yt (line 16) | function Yt(t){void 0===t&&(t={});var e=t,r=e.defaultModifiers,n=void 0=...
  method set (line 22) | set(t,e,r){Vt.has(t)||Vt.set(t,new Map);const n=Vt.get(t);n.has(e)||0===...
  method remove (line 22) | remove(t,e){if(!Vt.has(t))return;const r=Vt.get(t);r.delete(e),0===r.siz...
  function _e (line 22) | function _e(t,e){return e&&`${e}::${ve++}`||t.uidEvent||ve++}
  function Ce (line 22) | function Ce(t){const e=_e(t);return t.uidEvent=e,ye[e]=ye[e]||{},ye[e]}
  function Ie (line 22) | function Ie(t,e,r=null){return Object.values(t).find(t=>t.callable===e&&...
  function ke (line 22) | function ke(t,e,r){const n="string"==typeof e,i=n?r:e||r;let o=De(t);ret...
  function Ee (line 22) | function Ee(t,e,r,n,i){if("string"!=typeof e||!t)return;let[o,a,s]=ke(e,...
  function Be (line 22) | function Be(t,e,r,n,i){const o=Ie(e[r],n,i);o&&(t.removeEventListener(r,...
  function Se (line 22) | function Se(t,e,r,n){const i=e[r]||{};for(const[o,a]of Object.entries(i)...
  function De (line 22) | function De(t){return t=t.replace(Ae,""),xe[t]||t}
  method on (line 22) | on(t,e,r,n){Ee(t,e,r,n,!1)}
  method one (line 22) | one(t,e,r,n){Ee(t,e,r,n,!0)}
  method off (line 22) | off(t,e,r,n){if("string"!=typeof e||!t)return;const[i,o,a]=ke(e,r,n),s=a...
  method trigger (line 22) | trigger(t,e,r){if("string"!=typeof e||!t)return null;const n=ce();let i=...
  function Te (line 22) | function Te(t,e={}){for(const[r,n]of Object.entries(e))try{t[r]=n}catch(...
  function Fe (line 22) | function Fe(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Num...
  function Ne (line 22) | function Ne(t){return t.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}
  method setDataAttribute (line 22) | setDataAttribute(t,e,r){t.setAttribute(`data-bs-${Ne(e)}`,r)}
  method removeDataAttribute (line 22) | removeDataAttribute(t,e){t.removeAttribute(`data-bs-${Ne(e)}`)}
  method getDataAttributes (line 22) | getDataAttributes(t){if(!t)return{};const e={},r=Object.keys(t.dataset)....
  class Me (line 22) | class Me{static get Default(){return{}}static get DefaultType(){return{}...
    method Default (line 22) | static get Default(){return{}}
    method DefaultType (line 22) | static get DefaultType(){return{}}
    method NAME (line 22) | static get NAME(){throw new Error('You have to implement the static me...
    method _getConfig (line 22) | _getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerg...
    method _configAfterMerge (line 22) | _configAfterMerge(t){return t}
    method _mergeConfigObj (line 22) | _mergeConfigObj(t,e){const r=re(e)?je.getDataAttribute(e,"config"):{};...
    method _typeCheckConfig (line 22) | _typeCheckConfig(t,e=this.constructor.DefaultType){for(const[r,n]of Ob...
  class Re (line 22) | class Re extends Me{constructor(t,e){super(),(t=ne(t))&&(this._element=t...
    method constructor (line 22) | constructor(t,e){super(),(t=ne(t))&&(this._element=t,this._config=this...
    method dispose (line 22) | dispose(){zt.remove(this._element,this.constructor.DATA_KEY),Oe.off(th...
    method _queueCallback (line 22) | _queueCallback(t,e,r=!0){fe(t,e,r)}
    method _getConfig (line 22) | _getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._c...
    method getInstance (line 22) | static getInstance(t){return zt.get(ne(t),this.DATA_KEY)}
    method getOrCreateInstance (line 22) | static getOrCreateInstance(t,e={}){return this.getInstance(t)||new thi...
    method VERSION (line 22) | static get VERSION(){return"5.3.8"}
    method DATA_KEY (line 22) | static get DATA_KEY(){return`bs.${this.NAME}`}
    method EVENT_KEY (line 22) | static get EVENT_KEY(){return`.${this.DATA_KEY}`}
    method eventName (line 22) | static eventName(t){return`${t}${this.EVENT_KEY}`}
  method parents (line 22) | parents(t,e){const r=[];let n=t.parentNode.closest(e);for(;n;)r.push(n),...
  method prev (line 22) | prev(t,e){let r=t.previousElementSibling;for(;r;){if(r.matches(e))return...
  method next (line 22) | next(t,e){let r=t.nextElementSibling;for(;r;){if(r.matches(e))return[r];...
  method focusableChildren (line 22) | focusableChildren(t){const e=["a","button","input","textarea","select","...
  method getSelectorFromElement (line 22) | getSelectorFromElement(t){const e=Le(t);return e&&Qe.findOne(e)?e:null}
  method getElementFromSelector (line 22) | getElementFromSelector(t){const e=Le(t);return e?Qe.findOne(e):null}
  method getMultipleElementsFromSelector (line 22) | getMultipleElementsFromSelector(t){const e=Le(t);return e?Qe.find(e):[]}
  class He (line 22) | class He extends Re{static get NAME(){return"alert"}close(){if(Oe.trigge...
    method NAME (line 22) | static get NAME(){return"alert"}
    method close (line 22) | close(){if(Oe.trigger(this._element,We).defaultPrevented)return;this._...
    method _destroyElement (line 22) | _destroyElement(){this._element.remove(),Oe.trigger(this._element,Ke),...
    method jQueryInterface (line 22) | static jQueryInterface(t){return this.each(function(){const e=He.getOr...
  class Ye (line 22) | class Ye extends Re{static get NAME(){return"button"}toggle(){this._elem...
    method NAME (line 22) | static get NAME(){return"button"}
    method toggle (line 22) | toggle(){this._element.setAttribute("aria-pressed",this._element.class...
    method jQueryInterface (line 22) | static jQueryInterface(t){return this.each(function(){const e=Ye.getOr...
  class er (line 22) | class er extends Me{constructor(t,e){super(),this._element=t,t&&er.isSup...
    method constructor (line 22) | constructor(t,e){super(),this._element=t,t&&er.isSupported()&&(this._c...
    method Default (line 22) | static get Default(){return $e}
    method DefaultType (line 22) | static get DefaultType(){return tr}
    method NAME (line 22) | static get NAME(){return"swipe"}
    method dispose (line 22) | dispose(){Oe.off(this._element,Je)}
    method _start (line 22) | _start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&...
    method _end (line 22) | _end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this....
    method _move (line 22) | _move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].cli...
    method _handleSwipe (line 22) | _handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=...
    method _initEvents (line 22) | _initEvents(){this._supportPointerEvents?(Oe.on(this._element,ze,t=>th...
    method _eventIsPointerPenTouch (line 22) | _eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"==...
    method isSupported (line 22) | static isSupported(){return"ontouchstart"in document.documentElement||...
  class kr (line 22) | class kr extends Re{constructor(t,e){super(t,e),this._interval=null,this...
    method constructor (line 22) | constructor(t,e){super(t,e),this._interval=null,this._activeElement=nu...
    method Default (line 22) | static get Default(){return Cr}
    method DefaultType (line 22) | static get DefaultType(){return Ir}
    method NAME (line 22) | static get NAME(){return"carousel"}
    method next (line 22) | next(){this._slide(ar)}
    method nextWhenVisible (line 22) | nextWhenVisible(){!document.hidden&&ie(this._element)&&this.next()}
    method prev (line 22) | prev(){this._slide(sr)}
    method pause (line 22) | pause(){this._isSliding&&ee(this._element),this._clearInterval()}
    method cycle (line 22) | cycle(){this._clearInterval(),this._updateInterval(),this._interval=se...
    method _maybeEnableCycle (line 22) | _maybeEnableCycle(){this._config.ride&&(this._isSliding?Oe.one(this._e...
    method to (line 22) | to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._is...
    method dispose (line 22) | dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}
    method _configAfterMerge (line 22) | _configAfterMerge(t){return t.defaultInterval=t.interval,t}
    method _addEventListeners (line 22) | _addEventListeners(){this._config.keyboard&&Oe.on(this._element,dr,t=>...
    method _addTouchEventListeners (line 22) | _addTouchEventListeners(){for(const t of Qe.find(".carousel-item img",...
    method _keydown (line 22) | _keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e...
    method _getItemIndex (line 22) | _getItemIndex(t){return this._getItems().indexOf(t)}
    method _setActiveIndicatorElement (line 22) | _setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const...
    method _updateInterval (line 22) | _updateInterval(){const t=this._activeElement||this._getActive();if(!t...
    method _slide (line 22) | _slide(t,e=null){if(this._isSliding)return;const r=this._getActive(),n...
    method _isAnimated (line 22) | _isAnimated(){return this._element.classList.contains("slide")}
    method _getActive (line 22) | _getActive(){return Qe.findOne(wr,this._element)}
    method _getItems (line 22) | _getItems(){return Qe.find(xr,this._element)}
    method _clearInterval (line 22) | _clearInterval(){this._interval&&(clearInterval(this._interval),this._...
    method _directionToOrder (line 22) | _directionToOrder(t){return pe()?t===lr?sr:ar:t===lr?ar:sr}
    method _orderToDirection (line 22) | _orderToDirection(t){return pe()?t===sr?lr:cr:t===sr?cr:lr}
    method jQueryInterface (line 22) | static jQueryInterface(t){return this.each(function(){const e=kr.getOr...
  class Gr (line 22) | class Gr extends Re{constructor(t,e){super(t,e),this._isTransitioning=!1...
    method constructor (line 22) | constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArra...
    method Default (line 22) | static get Default(){return Lr}
    method DefaultType (line 22) | static get DefaultType(){return Qr}
    method NAME (line 22) | static get NAME(){return"collapse"}
    method toggle (line 22) | toggle(){this._isShown()?this.hide():this.show()}
    method show (line 22) | show(){if(this._isTransitioning||this._isShown())return;let t=[];if(th...
    method hide (line 22) | hide(){if(this._isTransitioning||!this._isShown())return;if(Oe.trigger...
    method _isShown (line 22) | _isShown(t=this._element){return t.classList.contains(Fr)}
    method _configAfterMerge (line 22) | _configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=ne(t.p...
    method _getDimension (line 22) | _getDimension(){return this._element.classList.contains("collapse-hori...
    method _initializeChildren (line 22) | _initializeChildren(){if(!this._config.parent)return;const t=this._get...
    method _getFirstLevelChildren (line 22) | _getFirstLevelChildren(t){const e=Qe.find(Mr,this._config.parent);retu...
    method _addAriaAndCollapsedClass (line 22) | _addAriaAndCollapsedClass(t,e){if(t.length)for(const r of t)r.classLis...
    method jQueryInterface (line 22) | static jQueryInterface(t){const e={};return"string"==typeof t&&/show|h...
  class dn (line 22) | class dn extends Re{constructor(t,e){super(t,e),this._popper=null,this._...
    method constructor (line 22) | constructor(t,e){super(t,e),this._popper=null,this._parent=this._eleme...
    method Default (line 22) | static get Default(){return un}
    method DefaultType (line 22) | static get DefaultType(){return pn}
    method NAME (line 22) | static get NAME(){return Pr}
    method toggle (line 22) | toggle(){return this._isShown()?this.hide():this.show()}
    method show (line 22) | show(){if(oe(this._element)||this._isShown())return;const t={relatedTa...
    method hide (line 22) | hide(){if(oe(this._element)||!this._isShown())return;const t={relatedT...
    method dispose (line 22) | dispose(){this._popper&&this._popper.destroy(),super.dispose()}
    method update (line 22) | update(){this._inNavbar=this._detectNavbar(),this._popper&&this._poppe...
    method _completeHide (line 22) | _completeHide(t){if(!Oe.trigger(this._element,Yr,t).defaultPrevented){...
    method _getConfig (line 22) | _getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!r...
    method _createPopper (line 22) | _createPopper(){let t=this._element;"parent"===this._config.reference?...
    method _isShown (line 22) | _isShown(){return this._menu.classList.contains($r)}
    method _getPlacement (line 22) | _getPlacement(){const t=this._parent;if(t.classList.contains("dropend"...
    method _detectNavbar (line 22) | _detectNavbar(){return null!==this._element.closest(".navbar")}
    method _getOffset (line 22) | _getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.s...
    method _getPopperConfig (line 22) | _getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[...
    method _selectMenuItem (line 22) | _selectMenuItem({key:t,target:e}){const r=Qe.find(".dropdown-menu .dro...
    method jQueryInterface (line 22) | static jQueryInterface(t){return this.each(function(){const e=dn.getOr...
    method clearMenus (line 22) | static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)...
    method dataApiKeydownHandler (line 22) | static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.targe...
  class bn (line 22) | class bn extends Me{constructor(t){super(),this._config=this._getConfig(...
    method constructor (line 22) | constructor(t){super(),this._config=this._getConfig(t),this._isAppende...
    method Default (line 22) | static get Default(){return gn}
    method DefaultType (line 22) | static get DefaultType(){return An}
    method NAME (line 22) | static get NAME(){return mn}
    method show (line 22) | show(t){if(!this._config.isVisible)return void me(t);this._append();co...
    method hide (line 22) | hide(t){this._config.isVisible?(this._getElement().classList.remove(fn...
    method dispose (line 22) | dispose(){this._isAppended&&(Oe.off(this._element,hn),this._element.re...
    method _getElement (line 22) | _getElement(){if(!this._element){const t=document.createElement("div")...
    method _configAfterMerge (line 22) | _configAfterMerge(t){return t.rootElement=ne(t.rootElement),t}
    method _append (line 22) | _append(){if(this._isAppended)return;const t=this._getElement();this._...
    method _emulateAnimation (line 22) | _emulateAnimation(t){fe(t,this._getElement(),this._config.isAnimated)}
  class In (line 22) | class In extends Me{constructor(t){super(),this._config=this._getConfig(...
    method constructor (line 22) | constructor(t){super(),this._config=this._getConfig(t),this._isActive=...
    method Default (line 22) | static get Default(){return _n}
    method DefaultType (line 22) | static get DefaultType(){return Cn}
    method NAME (line 22) | static get NAME(){return"focustrap"}
    method activate (line 22) | activate(){this._isActive||(this._config.autofocus&&this._config.trapE...
    method deactivate (line 22) | deactivate(){this._isActive&&(this._isActive=!1,Oe.off(document,yn))}
    method _handleFocusin (line 22) | _handleFocusin(t){const{trapElement:e}=this._config;if(t.target===docu...
    method _handleKeydown (line 22) | _handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey...
  class Dn (line 22) | class Dn{constructor(){this._element=document.body}getWidth(){const t=do...
    method constructor (line 22) | constructor(){this._element=document.body}
    method getWidth (line 22) | getWidth(){const t=document.documentElement.clientWidth;return Math.ab...
    method hide (line 22) | hide(){const t=this.getWidth();this._disableOverFlow(),this._setElemen...
    method reset (line 22) | reset(){this._resetElementAttributes(this._element,"overflow"),this._r...
    method isOverflowing (line 22) | isOverflowing(){return this.getWidth()>0}
    method _disableOverFlow (line 22) | _disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"...
    method _setElementAttributes (line 22) | _setElementAttributes(t,e,r){const n=this.getWidth();this._applyManipu...
    method _saveInitialAttribute (line 22) | _saveInitialAttribute(t,e){const r=t.style.getPropertyValue(e);r&&je.s...
    method _resetElementAttributes (line 22) | _resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{con...
    method _applyManipulationCallback (line 22) | _applyManipulationCallback(t,e){if(re(t))e(t);else for(const r of Qe.f...
  class Jn (line 22) | class Jn extends Re{constructor(t,e){super(t,e),this._dialog=Qe.findOne(...
    method constructor (line 22) | constructor(t,e){super(t,e),this._dialog=Qe.findOne(".modal-dialog",th...
    method Default (line 22) | static get Default(){return Un}
    method DefaultType (line 22) | static get DefaultType(){return Yn}
    method NAME (line 22) | static get NAME(){return"modal"}
    method toggle (line 22) | toggle(t){return this._isShown?this.hide():this.show(t)}
    method show (line 22) | show(t){if(this._isShown||this._isTransitioning)return;Oe.trigger(this...
    method hide (line 22) | hide(){if(!this._isShown||this._isTransitioning)return;Oe.trigger(this...
    method dispose (line 22) | dispose(){Oe.off(window,On),Oe.off(this._dialog,On),this._backdrop.dis...
    method handleUpdate (line 22) | handleUpdate(){this._adjustDialog()}
    method _initializeBackDrop (line 22) | _initializeBackDrop(){return new bn({isVisible:Boolean(this._config.ba...
    method _initializeFocusTrap (line 22) | _initializeFocusTrap(){return new In({trapElement:this._element})}
    method _showElement (line 22) | _showElement(t){document.body.contains(this._element)||document.body.a...
    method _addEventListeners (line 22) | _addEventListeners(){Oe.on(this._element,Gn,t=>{"Escape"===t.key&&(thi...
    method _hideModal (line 22) | _hideModal(){this._element.style.display="none",this._element.setAttri...
    method _isAnimated (line 22) | _isAnimated(){return this._element.classList.contains("fade")}
    method _triggerBackdropTransition (line 22) | _triggerBackdropTransition(){if(Oe.trigger(this._element,Fn).defaultPr...
    method _adjustDialog (line 22) | _adjustDialog(){const t=this._element.scrollHeight>document.documentEl...
    method _resetAdjustments (line 22) | _resetAdjustments(){this._element.style.paddingLeft="",this._element.s...
    method jQueryInterface (line 22) | static jQueryInterface(t,e){return this.each(function(){const r=Jn.get...
  class pi (line 22) | class pi extends Re{constructor(t,e){super(t,e),this._isShown=!1,this._b...
    method constructor (line 22) | constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._init...
    method Default (line 22) | static get Default(){return ci}
    method DefaultType (line 22) | static get DefaultType(){return ui}
    method NAME (line 22) | static get NAME(){return"offcanvas"}
    method toggle (line 22) | toggle(t){return this._isShown?this.hide():this.show(t)}
    method show (line 22) | show(t){if(this._isShown)return;if(Oe.trigger(this._element,ei,{relate...
    method hide (line 22) | hide(){if(!this._isShown)return;if(Oe.trigger(this._element,ni).defaul...
    method dispose (line 22) | dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super....
    method _initializeBackDrop (line 22) | _initializeBackDrop(){const t=Boolean(this._config.backdrop);return ne...
    method _initializeFocusTrap (line 22) | _initializeFocusTrap(){return new In({trapElement:this._element})}
    method _addEventListeners (line 22) | _addEventListeners(){Oe.on(this._element,li,t=>{"Escape"===t.key&&(thi...
    method jQueryInterface (line 22) | static jQueryInterface(t){return this.each(function(){const e=pi.getOr...
  class yi (line 22) | class yi extends Me{constructor(t){super(),this._config=this._getConfig(...
    method constructor (line 22) | constructor(t){super(),this._config=this._getConfig(t)}
    method Default (line 22) | static get Default(){return gi}
    method DefaultType (line 22) | static get DefaultType(){return Ai}
    method NAME (line 22) | static get NAME(){return"TemplateFactory"}
    method getContent (line 22) | getContent(){return Object.values(this._config.content).map(t=>this._r...
    method hasContent (line 22) | hasContent(){return this.getContent().length>0}
    method changeContent (line 22) | changeContent(t){return this._checkContent(t),this._config.content={.....
    method toHtml (line 22) | toHtml(){const t=document.createElement("div");t.innerHTML=this._maybe...
    method _typeCheckConfig (line 22) | _typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.con...
    method _checkContent (line 22) | _checkContent(t){for(const[e,r]of Object.entries(t))super._typeCheckCo...
    method _setContent (line 22) | _setContent(t,e,r){const n=Qe.findOne(r,t);n&&((e=this._resolvePossibl...
    method _maybeSanitize (line 22) | _maybeSanitize(t){return this._config.sanitize?function(t,e,r){if(!t.l...
    method _resolvePossibleFunction (line 22) | _resolvePossibleFunction(t){return me(t,[void 0,this])}
    method _putElementInTemplate (line 22) | _putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",...
  class Ti (line 22) | class Ti extends Re{constructor(t,e){super(t,e),this._isEnabled=!0,this....
    method constructor (line 22) | constructor(t,e){super(t,e),this._isEnabled=!0,this._timeout=0,this._i...
    method Default (line 22) | static get Default(){return Di}
    method DefaultType (line 22) | static get DefaultType(){return Oi}
    method NAME (line 22) | static get NAME(){return"tooltip"}
    method enable (line 22) | enable(){this._isEnabled=!0}
    method disable (line 22) | disable(){this._isEnabled=!1}
    method toggleEnabled (line 22) | toggleEnabled(){this._isEnabled=!this._isEnabled}
    method toggle (line 22) | toggle(){this._isEnabled&&(this._isShown()?this._leave():this._enter())}
    method dispose (line 22) | dispose(){clearTimeout(this._timeout),Oe.off(this._element.closest(Ci)...
    method show (line 22) | show(){if("none"===this._element.style.display)throw new Error("Please...
    method hide (line 22) | hide(){if(!this._isShown())return;if(Oe.trigger(this._element,this.con...
    method update (line 22) | update(){this._popper&&this._popper.update()}
    method _isWithContent (line 22) | _isWithContent(){return Boolean(this._getTitle())}
    method _getTipElement (line 22) | _getTipElement(){return this.tip||(this.tip=this._createTipElement(thi...
    method _createTipElement (line 22) | _createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!...
    method setContent (line 22) | setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper...
    method _getTemplateFactory (line 22) | _getTemplateFactory(t){return this._templateFactory?this._templateFact...
    method _getContentForTemplate (line 22) | _getContentForTemplate(){return{[_i]:this._getTitle()}}
    method _getTitle (line 22) | _getTitle(){return this._resolvePossibleFunction(this._config.title)||...
    method _initializeOnDelegatedTarget (line 22) | _initializeOnDelegatedTarget(t){return this.constructor.getOrCreateIns...
    method _isAnimated (line 22) | _isAnimated(){return this._config.animation||this.tip&&this.tip.classL...
    method _isShown (line 22) | _isShown(){return this.tip&&this.tip.classList.contains(wi)}
    method _createPopper (line 22) | _createPopper(t){const e=me(this._config.placement,[this,t,this._eleme...
    method _getOffset (line 22) | _getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.s...
    method _resolvePossibleFunction (line 22) | _resolvePossibleFunction(t){return me(t,[this._element,this._element])}
    method _getPopperConfig (line 22) | _getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",optio...
    method _setListeners (line 22) | _setListeners(){const t=this._config.trigger.split(" ");for(const e of...
    method _fixTitle (line 22) | _fixTitle(){const t=this._element.getAttribute("title");t&&(this._elem...
    method _enter (line 22) | _enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._is...
    method _leave (line 22) | _leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTim...
    method _setTimeout (line 22) | _setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(...
    method _isWithActiveTrigger (line 22) | _isWithActiveTrigger(){return Object.values(this._activeTrigger).inclu...
    method _getConfig (line 22) | _getConfig(t){const e=je.getDataAttributes(this._element);for(const t ...
    method _configAfterMerge (line 22) | _configAfterMerge(t){return t.container=!1===t.container?document.body...
    method _getDelegateConfig (line 22) | _getDelegateConfig(){const t={};for(const[e,r]of Object.entries(this._...
    method _disposePopper (line 22) | _disposePopper(){this._popper&&(this._popper.destroy(),this._popper=nu...
    method jQueryInterface (line 22) | static jQueryInterface(t){return this.each(function(){const e=Ti.getOr...
  class Ri (line 22) | class Ri extends Ti{static get Default(){return ji}static get DefaultTyp...
    method Default (line 22) | static get Default(){return ji}
    method DefaultType (line 22) | static get DefaultType(){return Mi}
    method NAME (line 22) | static get NAME(){return"popover"}
    method _isWithContent (line 22) | _isWithContent(){return this._getTitle()||this._getContent()}
    method _getContentForTemplate (line 22) | _getContentForTemplate(){return{[Fi]:this._getTitle(),[Ni]:this._getCo...
    method _getContent (line 22) | _getContent(){return this._resolvePossibleFunction(this._config.content)}
    method jQueryInterface (line 22) | static jQueryInterface(t){return this.each(function(){const e=Ri.getOr...
  class Zi (line 22) | class Zi extends Re{constructor(t,e){super(t,e),this._targetLinks=new Ma...
    method constructor (line 22) | constructor(t,e){super(t,e),this._targetLinks=new Map,this._observable...
    method Default (line 22) | static get Default(){return Yi}
    method DefaultType (line 22) | static get DefaultType(){return Ji}
    method NAME (line 22) | static get NAME(){return"scrollspy"}
    method refresh (line 22) | refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmo...
    method dispose (line 22) | dispose(){this._observer.disconnect(),super.dispose()}
    method _configAfterMerge (line 22) | _configAfterMerge(t){return t.target=ne(t.target)||document.body,t.roo...
    method _maybeEnableSmoothScroll (line 22) | _maybeEnableSmoothScroll(){this._config.smoothScroll&&(Oe.off(this._co...
    method _getNewObserver (line 22) | _getNewObserver(){const t={root:this._rootElement,threshold:this._conf...
    method _observerCallback (line 22) | _observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}...
    method _initializeTargetsAndObservables (line 22) | _initializeTargetsAndObservables(){this._targetLinks=new Map,this._obs...
    method _process (line 22) | _process(t){this._activeTarget!==t&&(this._clearActiveClass(this._conf...
    method _activateParents (line 22) | _activateParents(t){if(t.classList.contains("dropdown-item"))Qe.findOn...
    method _clearActiveClass (line 22) | _clearActiveClass(t){t.classList.remove(Wi);const e=Qe.find(`${Ki}.${W...
    method jQueryInterface (line 22) | static jQueryInterface(t){return this.each(function(){const e=Zi.getOr...
  class bo (line 22) | class bo extends Re{constructor(t){super(t),this._parent=this._element.c...
    method constructor (line 22) | constructor(t){super(t),this._parent=this._element.closest('.list-grou...
    method NAME (line 22) | static get NAME(){return"tab"}
    method show (line 22) | show(){const t=this._element;if(this._elemIsActive(t))return;const e=t...
    method _activate (line 22) | _activate(t,e){if(!t)return;t.classList.add(co),this._activate(Qe.getE...
    method _deactivate (line 22) | _deactivate(t,e){if(!t)return;t.classList.remove(co),t.blur(),this._de...
    method _keydown (line 22) | _keydown(t){if(![no,io,oo,ao,so,lo].includes(t.key))return;t.stopPropa...
    method _getChildren (line 22) | _getChildren(){return Qe.find(go,this._parent)}
    method _getActiveElem (line 22) | _getActiveElem(){return this._getChildren().find(t=>this._elemIsActive...
    method _setInitialAttributes (line 22) | _setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tab...
    method _setInitialAttributesOnChild (line 22) | _setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=thi...
    method _setInitialAttributesOnTargetPanel (line 22) | _setInitialAttributesOnTargetPanel(t){const e=Qe.getElementFromSelecto...
    method _toggleDropDown (line 22) | _toggleDropDown(t,e){const r=this._getOuterElement(t);if(!r.classList....
    method _setAttributeIfNotExists (line 22) | _setAttributeIfNotExists(t,e,r){t.hasAttribute(e)||t.setAttribute(e,r)}
    method _elemIsActive (line 22) | _elemIsActive(t){return t.classList.contains(co)}
    method _getInnerElement (line 22) | _getInnerElement(t){return t.matches(go)?t:Qe.findOne(go,t)}
    method _getOuterElement (line 22) | _getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}
    method jQueryInterface (line 22) | static jQueryInterface(t){return this.each(function(){const e=bo.getOr...
  class Fo (line 22) | class Fo extends Re{constructor(t,e){super(t,e),this._timeout=null,this....
    method constructor (line 22) | constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteracti...
    method Default (line 22) | static get Default(){return To}
    method DefaultType (line 22) | static get DefaultType(){return Oo}
    method NAME (line 22) | static get NAME(){return"toast"}
    method show (line 22) | show(){if(Oe.trigger(this._element,ko).defaultPrevented)return;this._c...
    method hide (line 22) | hide(){if(!this.isShown())return;if(Oe.trigger(this._element,Co).defau...
    method dispose (line 22) | dispose(){this._clearTimeout(),this.isShown()&&this._element.classList...
    method isShown (line 22) | isShown(){return this._element.classList.contains(So)}
    method _maybeScheduleHide (line 22) | _maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction...
    method _onInteraction (line 22) | _onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this...
    method _setListeners (line 22) | _setListeners(){Oe.on(this._element,vo,t=>this._onInteraction(t,!0)),O...
    method _clearTimeout (line 22) | _clearTimeout(){clearTimeout(this._timeout),this._timeout=null}
    method jQueryInterface (line 22) | static jQueryInterface(t){return this.each(function(){const e=Fo.getOr...
  function No (line 28) | function No(t){const e=Object.create(null);for(const r of t.split(","))e...
  function ba (line 28) | function ba(t){if(Uo(t)){const e={};for(let r=0;r<t.length;r++){const n=...
  function wa (line 28) | function wa(t){const e={};return t.replace(xa,"").split(ya).forEach(t=>{...
  function _a (line 28) | function _a(t){let e="";if(Vo(t))e=t;else if(Uo(t))for(let r=0;r<t.lengt...
  function ka (line 28) | function ka(t){return!!t||""===t}
  function Ea (line 28) | function Ea(t,e){if(t===e)return!0;let r=Zo(t),n=Zo(e);if(r||n)return!(!...
  class Na (line 28) | class Na{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,th...
    method constructor (line 28) | constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effe...
    method active (line 28) | get active(){return this._active}
    method pause (line 28) | pause(){if(this._active){let t,e;if(this._isPaused=!0,this.scopes)for(...
    method resume (line 28) | resume(){if(this._active&&this._isPaused){let t,e;if(this._isPaused=!1...
    method run (line 28) | run(t){if(this._active){const e=Ta;try{return Ta=this,t()}finally{Ta=e...
    method on (line 28) | on(){1===++this._on&&(this.prevScope=Ta,Ta=this)}
    method off (line 28) | off(){this._on>0&&0===--this._on&&(Ta=this.prevScope,this.prevScope=vo...
    method stop (line 28) | stop(t){if(this._active){let e,r;for(this._active=!1,e=0,r=this.effect...
  class Ma (line 28) | class Ma{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,...
    method constructor (line 28) | constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.fl...
    method pause (line 28) | pause(){this.flags|=64}
    method resume (line 28) | resume(){64&this.flags&&(this.flags&=-65,ja.has(this)&&(ja.delete(this...
    method notify (line 28) | notify(){2&this.flags&&!(32&this.flags)||8&this.flags||Ga(this)}
    method run (line 28) | run(){if(!(1&this.flags))return this.fn();this.flags|=2,$a(this),Ka(th...
    method stop (line 28) | stop(){if(1&this.flags){for(let t=this.deps;t;t=t.nextDep)Ja(t);this.d...
    method trigger (line 28) | trigger(){64&this.flags?ja.add(this):this.scheduler?this.scheduler():t...
    method runIfDirty (line 28) | runIfDirty(){Ua(this)&&this.run()}
    method dirty (line 28) | get dirty(){return Ua(this)}
  function Ga (line 28) | function Ga(t,e=!1){if(t.flags|=8,e)return t.next=La,void(La=t);t.next=R...
  function Pa (line 28) | function Pa(){Qa++}
  function Wa (line 28) | function Wa(){if(--Qa>0)return;if(La){let t=La;for(La=void 0;t;){const e...
  function Ka (line 28) | function Ka(t){for(let e=t.deps;e;e=e.nextDep)e.version=-1,e.prevActiveL...
  function Ha (line 28) | function Ha(t){let e,r=t.depsTail,n=r;for(;n;){const t=n.prevDep;-1===n....
  function Ua (line 28) | function Ua(t){for(let e=t.deps;e;e=e.nextDep)if(e.dep.version!==e.versi...
  function Ya (line 28) | function Ya(t){if(4&t.flags&&!(16&t.flags))return;if(t.flags&=-17,t.glob...
  function Ja (line 28) | function Ja(t,e=!1){const{dep:r,prevSub:n,nextSub:i}=t;if(n&&(n.nextSub=...
  function Za (line 28) | function Za(t){const{prevDep:e,nextDep:r}=t;e&&(e.nextDep=r,t.prevDep=vo...
  function za (line 28) | function za(){Va.push(qa),qa=!1}
  function Xa (line 28) | function Xa(){const t=Va.pop();qa=void 0===t||t}
  function $a (line 28) | function $a(t){const{cleanup:e}=t;if(t.cleanup=void 0,e){const t=Fa;Fa=v...
  class es (line 28) | class es{constructor(t,e){this.sub=t,this.dep=e,this.version=e.version,t...
    method constructor (line 28) | constructor(t,e){this.sub=t,this.dep=e,this.version=e.version,this.nex...
  class rs (line 28) | class rs{constructor(t){this.computed=t,this.version=0,this.activeLink=v...
    method constructor (line 28) | constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,t...
    method track (line 28) | track(t){if(!Fa||!qa||Fa===this.computed)return;let e=this.activeLink;...
    method trigger (line 28) | trigger(t){this.version++,ts++,this.notify(t)}
    method notify (line 28) | notify(t){Pa();try{0;for(let t=this.subs;t;t=t.prevSub)t.sub.notify()&...
  function ns (line 28) | function ns(t){if(t.dep.sc++,4&t.sub.flags){const e=t.dep.computed;if(e&...
  function ls (line 28) | function ls(t,e,r){if(qa&&Fa){let e=is.get(t);e||is.set(t,e=new Map);let...
  function cs (line 28) | function cs(t,e,r,n,i,o){const a=is.get(t);if(!a)return void ts++;const ...
  function us (line 28) | function us(t){const e=qs(t);return e===t?e:(ls(e,0,ss),Js(t)?e:e.map(Vs))}
  function ps (line 28) | function ps(t){return ls(t=qs(t),0,ss),t}
  function ds (line 28) | function ds(t,e){return Ys(t)?Us(t)?zs(Vs(e)):zs(e):Vs(e)}
  method [Symbol.iterator] (line 28) | [Symbol.iterator](){return fs(this,Symbol.iterator,t=>ds(this,t))}
  method concat (line 28) | concat(...t){return us(this).concat(...t.map(t=>Uo(t)?us(t):t))}
  method entries (line 28) | entries(){return fs(this,"entries",t=>(t[1]=ds(this,t[1]),t))}
  method every (line 28) | every(t,e){return gs(this,"every",t,e,void 0,arguments)}
  method filter (line 28) | filter(t,e){return gs(this,"filter",t,e,t=>t.map(t=>ds(this,t)),arguments)}
  method find (line 28) | find(t,e){return gs(this,"find",t,e,t=>ds(this,t),arguments)}
  method findIndex (line 28) | findIndex(t,e){return gs(this,"findIndex",t,e,void 0,arguments)}
  method findLast (line 28) | findLast(t,e){return gs(this,"findLast",t,e,t=>ds(this,t),arguments)}
  method findLastIndex (line 28) | findLastIndex(t,e){return gs(this,"findLastIndex",t,e,void 0,arguments)}
  method forEach (line 28) | forEach(t,e){return gs(this,"forEach",t,e,void 0,arguments)}
  method includes (line 28) | includes(...t){return bs(this,"includes",t)}
  method indexOf (line 28) | indexOf(...t){return bs(this,"indexOf",t)}
  method join (line 28) | join(t){return us(this).join(t)}
  method lastIndexOf (line 28) | lastIndexOf(...t){return bs(this,"lastIndexOf",t)}
  method map (line 28) | map(t,e){return gs(this,"map",t,e,void 0,arguments)}
  method pop (line 28) | pop(){return ys(this,"pop")}
  method push (line 28) | push(...t){return ys(this,"push",t)}
  method reduce (line 28) | reduce(t,...e){return As(this,"reduce",t,e)}
  method reduceRight (line 28) | reduceRight(t,...e){return As(this,"reduceRight",t,e)}
  method shift (line 28) | shift(){return ys(this,"shift")}
  method some (line 28) | some(t,e){return gs(this,"some",t,e,void 0,arguments)}
  method splice (line 28) | splice(...t){return ys(this,"splice",t)}
  method toReversed (line 28) | toReversed(){return us(this).toReversed()}
  method toSorted (line 28) | toSorted(t){return us(this).toSorted(t)}
  method toSpliced (line 28) | toSpliced(...t){return us(this).toSpliced(...t)}
  method unshift (line 28) | unshift(...t){return ys(this,"unshift",t)}
  method values (line 28) | values(){return fs(this,"values",t=>ds(this,t))}
  function fs (line 28) | function fs(t,e,r){const n=ps(t),i=n[e]();return n===t||Js(t)||(i._next=...
  function gs (line 28) | function gs(t,e,r,n,i,o){const a=ps(t),s=a!==t&&!Js(t),l=a[e];if(l!==hs[...
  function As (line 28) | function As(t,e,r,n){const i=ps(t),o=i!==t&&!Js(t);let a=r,s=!1;i!==t&&(...
  function bs (line 28) | function bs(t,e,r){const n=qs(t);ls(n,0,ss);const i=n[e](...r);return-1!...
  function ys (line 28) | function ys(t,e,r=[]){za(),Pa();const n=qs(t)[e].apply(t,r);return Wa(),...
  function ws (line 28) | function ws(t){zo(t)||(t=String(t));const e=qs(this);return ls(e,0,t),e....
  class _s (line 28) | class _s{constructor(t=!1,e=!1){this._isReadonly=t,this._isShallow=e}get...
    method constructor (line 28) | constructor(t=!1,e=!1){this._isReadonly=t,this._isShallow=e}
    method get (line 28) | get(t,e,r){if("__v_skip"===e)return t.__v_skip;const n=this._isReadonl...
  class Cs (line 28) | class Cs extends _s{constructor(t=!1){super(!1,t)}set(t,e,r,n){let i=t[e...
    method constructor (line 28) | constructor(t=!1){super(!1,t)}
    method set (line 28) | set(t,e,r,n){let i=t[e];const o=Uo(t)&&na(e);if(!this._isShallow){cons...
    method deleteProperty (line 28) | deleteProperty(t,e){const r=Ho(t,e),n=(t[e],Reflect.deleteProperty(t,e...
    method has (line 28) | has(t,e){const r=Reflect.has(t,e);return zo(e)&&xs.has(e)||ls(t,0,e),r}
    method ownKeys (line 28) | ownKeys(t){return ls(t,0,Uo(t)?"length":os),Reflect.ownKeys(t)}
  class Is (line 28) | class Is extends _s{constructor(t=!1){super(!0,t)}set(t,e){return!0}dele...
    method constructor (line 28) | constructor(t=!1){super(!0,t)}
    method set (line 28) | set(t,e){return!0}
    method deleteProperty (line 28) | deleteProperty(t,e){return!0}
  function Os (line 28) | function Os(t){return function(...e){return"delete"!==t&&("clear"===t?vo...
  function Ts (line 28) | function Ts(t,e){const r={get(r){const n=this.__v_raw,i=qs(n),o=qs(r);t|...
  function Fs (line 28) | function Fs(t,e){const r=Ts(t,e);return(e,n,i)=>"__v_isReactive"===n?!t:...
  function Ps (line 28) | function Ps(t){return t.__v_skip||!Object.isExtensible(t)?0:function(t){...
  function Ws (line 28) | function Ws(t){return Ys(t)?t:Hs(t,!1,ks,Ns,Rs)}
  function Ks (line 28) | function Ks(t){return Hs(t,!0,Es,Ms,Qs)}
  function Hs (line 28) | function Hs(t,e,r,n,i){if(!Xo(t))return t;if(t.__v_raw&&(!e||!t.__v_isRe...
  function Us (line 28) | function Us(t){return Ys(t)?Us(t.__v_raw):!(!t||!t.__v_isReactive)}
  function Ys (line 28) | function Ys(t){return!(!t||!t.__v_isReadonly)}
  function Js (line 28) | function Js(t){return!(!t||!t.__v_isShallow)}
  function Zs (line 28) | function Zs(t){return!!t&&!!t.__v_raw}
  function qs (line 28) | function qs(t){const e=t&&t.__v_raw;return e?qs(e):t}
  function Xs (line 28) | function Xs(t){return!!t&&!0===t.__v_isRef}
  function $s (line 28) | function $s(t){return Xs(t)?t.value:t}
  function el (line 28) | function el(t){return Us(t)?t:new Proxy(t,tl)}
  class rl (line 28) | class rl{constructor(t,e,r){this.fn=t,this.setter=e,this._value=void 0,t...
    method constructor (line 28) | constructor(t,e,r){this.fn=t,this.setter=e,this._value=void 0,this.dep...
    method notify (line 28) | notify(){if(this.flags|=16,!(8&this.flags||Fa===this))return Ga(this,!...
    method value (line 28) | get value(){const t=this.dep.track();return Ya(this),t&&(t.version=thi...
    method value (line 28) | set value(t){this.setter&&this.setter(t)}
  function al (line 28) | function al(t,e,r=jo){const{immediate:n,deep:i,once:o,scheduler:a,augmen...
  function sl (line 28) | function sl(t,e=1/0,r){if(e<=0||!Xo(t)||t.__v_skip)return t;if(((r=r||ne...
  function ll (line 28) | function ll(t,e,r,n){try{return n?t(...n):t()}catch(t){ul(t,e,r)}}
  function cl (line 28) | function cl(t,e,r,n){if(qo(t)){const i=ll(t,e,r,n);return i&&$o(i)&&i.ca...
  function ul (line 28) | function ul(t,e,r,n=!0){e&&e.vnode;const{errorHandler:i,throwUnhandledEr...
  function bl (line 28) | function bl(t){const e=Al||gl;return t?e.then(this?t.bind(this):t):e}
  function yl (line 28) | function yl(t){if(!(1&t.flags)){const e=Cl(t),r=pl[pl.length-1];!r||!(2&...
  function vl (line 28) | function vl(){Al||(Al=gl.then(Il))}
  function xl (line 28) | function xl(t){Uo(t)?ml.push(...t):fl&&-1===t.id?fl.splice(hl+1,0,t):1&t...
  function wl (line 28) | function wl(t,e,r=dl+1){for(0;r<pl.length;r++){const e=pl[r];if(e&&2&e.f...
  function _l (line 28) | function _l(t){if(ml.length){const t=[...new Set(ml)].sort((t,e)=>Cl(t)-...
  function Il (line 28) | function Il(t){try{for(dl=0;dl<pl.length;dl++){const t=pl[dl];!t||8&t.fl...
  function Bl (line 28) | function Bl(t){const e=kl;return kl=t,El=t&&t.type.__scopeId||null,e}
  function Sl (line 28) | function Sl(t,e=kl,r){if(!e)return t;if(t._n)return t;const n=(...r)=>{n...
  function Dl (line 28) | function Dl(t,e){if(null===kl)return t;const r=dp(kl),n=t.dirs||(t.dirs=...
  function Ol (line 28) | function Ol(t,e,r,n){const i=t.dirs,o=e&&e.dirs;for(let a=0;a<i.length;a...
  function Tl (line 28) | function Tl(t,e,r=!1){const n=Xu();if(n||Rc){let i=Rc?Rc._context.provid...
  function Nl (line 28) | function Nl(t,e,r){return jl(t,e,r)}
  function jl (line 28) | function jl(t,e,r=jo){const{immediate:n,deep:i,flush:o,once:a}=r;const s...
  function Ml (line 28) | function Ml(t,e,r){const n=this.proxy,i=Vo(t)?t.includes(".")?Rl(n,t):()...
  function Rl (line 28) | function Rl(t,e){const r=e.split(".");return()=>{let e=t;for(let t=0;t<r...
  function Wl (line 28) | function Wl(t,e){6&t.shapeFlag&&t.component?(t.transition=e,Wl(t.compone...
  function Kl (line 28) | function Kl(t){t.ids=[t.ids[0]+t.ids[2]+++"-",0,0]}
  function Hl (line 28) | function Hl(t,e){let r;return!(!(r=Object.getOwnPropertyDescriptor(t,e))...
  function Yl (line 28) | function Yl(t,e,r,n,i=!1){if(Uo(t))return void t.forEach((t,o)=>Yl(t,e&&...
  function Jl (line 28) | function Jl(t){const e=Ul.get(t);e&&(e.flags|=8,Ul.delete(t))}
  function Vl (line 28) | function Vl(t,e){return Uo(t)?t.some(t=>Vl(t,e)):Vo(t)?t.split(",").incl...
  function zl (line 28) | function zl(t,e){$l(t,"a",e)}
  function Xl (line 28) | function Xl(t,e){$l(t,"da",e)}
  function $l (line 28) | function $l(t,e,r=zu){const n=t.__wdc||(t.__wdc=()=>{let e=r;for(;e;){if...
  function tc (line 28) | function tc(t,e,r,n){const i=nc(e,t,n,!0);uc(()=>{Wo(n[e],i)},r)}
  function ec (line 28) | function ec(t){t.shapeFlag&=-257,t.shapeFlag&=-513}
  function rc (line 28) | function rc(t){return 128&t.shapeFlag?t.ssContent:t}
  function nc (line 28) | function nc(t,e,r=zu,n=!1){if(r){const i=r[t]||(r[t]=[]),o=e.__weh||(e._...
  function fc (line 28) | function fc(t,e=zu){nc("ec",t,e)}
  function gc (line 28) | function gc(t,e,r,n){let i;const o=r&&r[n],a=Uo(t);if(a||Vo(t)){let r=!1...
  method get (line 28) | get({_:t},e){if("__v_skip"===e)return!0;const{ctx:r,setupState:n,data:i,...
  method set (line 28) | set({_:t},e,r){const{data:n,setupState:i,ctx:o}=t;return yc(i,e)?(i[e]=r...
  method has (line 28) | has({_:{data:t,setupState:e,accessCache:r,ctx:n,appContext:i,props:o,typ...
  method defineProperty (line 28) | defineProperty(t,e,r){return null!=r.get?t._.accessCache[e]=0:Ho(r,"valu...
  function xc (line 28) | function xc(t){return Uo(t)?t.reduce((t,e)=>(t[e]=null,t),{}):t}
  function _c (line 28) | function _c(t){const e=kc(t),r=t.proxy,n=t.ctx;wc=!1,e.beforeCreate&&Cc(...
  function Cc (line 28) | function Cc(t,e,r){cl(Uo(t)?t.map(t=>t.bind(e.proxy)):t.bind(e.proxy),e,r)}
  function Ic (line 28) | function Ic(t,e,r,n){let i=n.includes(".")?Rl(r,n):()=>r[n];if(Vo(t)){co...
  function kc (line 28) | function kc(t){const e=t.type,{mixins:r,extends:n}=e,{mixins:i,optionsCa...
  function Ec (line 28) | function Ec(t,e,r,n=!1){const{mixins:i,extends:o}=e;o&&Ec(t,o,r,!0),i&&i...
  function Sc (line 28) | function Sc(t,e){return e?t?function(){return Po(qo(t)?t.call(this,this)...
  function Dc (line 28) | function Dc(t){if(Uo(t)){const e={};for(let r=0;r<t.length;r++)e[t[r]]=t...
  function Oc (line 28) | function Oc(t,e){return t?[...new Set([].concat(t,e))]:e}
  function Tc (line 28) | function Tc(t,e){return t?Po(Object.create(null),t,e):e}
  function Fc (line 28) | function Fc(t,e){return t?Uo(t)&&Uo(e)?[...new Set([...t,...e])]:Po(Obje...
  function Nc (line 28) | function Nc(){return{app:null,config:{isNativeTag:Lo,performance:!1,glob...
  function Mc (line 28) | function Mc(t,e){return function(r,n=null){qo(r)||(r=Po({},r)),null==n||...
  function Qc (line 28) | function Qc(t,e,...r){if(t.isUnmounted)return;const n=t.vnode.props||jo;...
  function Pc (line 28) | function Pc(t,e,r=!1){const n=r?Gc:e.emitsCache,i=n.get(t);if(void 0!==i...
  function Wc (line 28) | function Wc(t,e){return!(!t||!Qo(e))&&(e=e.slice(2).replace(/Once$/,""),...
  function Kc (line 28) | function Kc(t){const{type:e,vnode:r,proxy:n,withProxy:i,propsOptions:[o]...
  function Yc (line 28) | function Yc(t,e,r){const n=Object.keys(e);if(n.length!==Object.keys(t).l...
  function Jc (line 28) | function Jc(t,e,r){const n=t[r],i=e[r];return"style"===r&&Xo(n)&&Xo(i)?!...
  function Zc (line 28) | function Zc({vnode:t,parent:e},r){for(;e;){const n=e.subTree;if(n.suspen...
  function Xc (line 28) | function Xc(t,e,r,n=!1){const i={},o=Vc();t.propsDefaults=Object.create(...
  function $c (line 28) | function $c(t,e,r,n){const[i,o]=t.propsOptions;let a,s=!1;if(e)for(let l...
  function tu (line 28) | function tu(t,e,r,n,i,o){const a=t[r];if(null!=a){const t=Ho(a,"default"...
  function ru (line 28) | function ru(t,e,r=!1){const n=r?eu:e.propsCache,i=n.get(t);if(i)return i...
  function nu (line 28) | function nu(t){return"$"!==t[0]&&!ia(t)}
  function pu (line 28) | function pu(t,e){Aa().__VUE__=!0;const{insert:r,remove:n,patchProp:i,cre...
  function du (line 28) | function du({type:t,props:e},r){return"svg"===r&&"foreignObject"===t||"m...
  function mu (line 28) | function mu({effect:t,job:e},r){r?(t.flags|=32,e.flags|=4):(t.flags&=-33...
  function fu (line 28) | function fu(t,e){return(!t||t&&!t.pendingBranch)&&e&&!e.persisted}
  function hu (line 28) | function hu(t,e,r=!1){const n=t.children,i=e.children;if(Uo(n)&&Uo(i))fo...
  function gu (line 28) | function gu(t){const e=t.subTree.component;if(e)return e.asyncDep&&!e.as...
  function Au (line 28) | function Au(t){if(t)for(let e=0;e<t.length;e++)t[e].flags|=8}
  function bu (line 28) | function bu(t){if(t.placeholder)return t.placeholder;const e=t.component...
  function vu (line 28) | function vu(t,e){e&&e.pendingBranch?Uo(t)?e.effects.push(...t):e.effects...
  function Eu (line 28) | function Eu(t=!1){Iu.push(ku=t?null:[])}
  function Bu (line 28) | function Bu(){Iu.pop(),ku=Iu[Iu.length-1]||null}
  function Du (line 28) | function Du(t,e=!1){Su+=t,t<0&&ku&&e&&(ku.hasOnce=!0)}
  function Ou (line 28) | function Ou(t){return t.dynamicChildren=Su>0?ku||Mo:null,Bu(),Su>0&&ku&&...
  function Tu (line 28) | function Tu(t,e,r,n,i,o){return Ou(Lu(t,e,r,n,i,o,!0))}
  function Fu (line 28) | function Fu(t,e,r,n,i){return Ou(Qu(t,e,r,n,i,!0))}
  function Nu (line 28) | function Nu(t){return!!t&&!0===t.__v_isVNode}
  function ju (line 28) | function ju(t,e){return t.type===e.type&&t.key===e.key}
  function Lu (line 28) | function Lu(t,e=null,r=null,n=0,i=null,o=(t===xu?0:1),a=!1,s=!1){const l...
  function Gu (line 28) | function Gu(t,e=null,r=null,n=0,i=null,o=!1){if(t&&t!==hc||(t=_u),Nu(t))...
  function Pu (line 28) | function Pu(t,e,r=!1,n=!1){const{props:i,ref:o,patchFlag:a,children:s,tr...
  function Wu (line 28) | function Wu(t=" ",e=0){return Qu(wu,null,t,e)}
  function Ku (line 28) | function Ku(t="",e=!1){return e?(Eu(),Fu(_u,null,t)):Qu(_u,null,t)}
  function Hu (line 28) | function Hu(t){return null==t||"boolean"==typeof t?Qu(_u):Uo(t)?Qu(xu,nu...
  function Uu (line 28) | function Uu(t){return null===t.el&&-1!==t.patchFlag||t.memo?t:Pu(t)}
  function Yu (line 28) | function Yu(t,e){let r=0;const{shapeFlag:n}=t;if(null==e)e=null;else if(...
  function Ju (line 28) | function Ju(t,e,r,n=null){cl(t,e,7,[r,n])}
  function Vu (line 28) | function Vu(t,e,r){const n=t.type,i=(e?e.appContext:t.appContext)||Zu,o=...
  function np (line 28) | function np(t){return 4&t.vnode.shapeFlag}
  function sp (line 28) | function sp(t,e=!1,r=!1){e&&tp(e);const{props:n,children:i}=t.vnode,o=np...
  function lp (line 28) | function lp(t,e,r){qo(e)?t.type.__ssrInlineRender?t.ssrRender=e:t.render...
  function cp (line 28) | function cp(t,e,r){const n=t.type;if(!t.render){if(!e&&ip&&!n.render){co...
  function pp (line 28) | function pp(t){const e=e=>{t.exposed=e||{}};return{attrs:new Proxy(t.att...
  function dp (line 28) | function dp(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(...
  function mp (line 28) | function mp(t,e=!0){return qo(t)?t.displayName||t.name:t.name||e&&t.__name}
  function fp (line 28) | function fp(t){return qo(t)&&"__vccOpts"in t}
  method setScopeId (line 34) | setScopeId(t,e){t.setAttribute(e,"")}
  method insertStaticContent (line 34) | insertStaticContent(t,e,r,n,i,o){const a=r?r.previousSibling:e.lastChild...
  method beforeMount (line 34) | beforeMount(t,{value:e},{transition:r}){t[Cp]="none"===t.style.display?"...
  method mounted (line 34) | mounted(t,{value:e},{transition:r}){r&&e&&r.enter(t)}
  method updated (line 34) | updated(t,{value:e,oldValue:r},{transition:n}){!e!=!r&&(n?e?(n.beforeEnt...
  method beforeUnmount (line 34) | beforeUnmount(t,{value:e}){Ep(t,e)}
  function Ep (line 34) | function Ep(t,e){t.style.display=e?t[Cp]:"none",t[Ip]=!e}
  function Op (line 34) | function Op(t,e,r){if(Uo(r))r.forEach(r=>Op(t,e,r));else if(null==r&&(r=...
  function jp (line 34) | function jp(t,e,r,n,i,o=Ia(e)){n&&e.startsWith("xlink:")?null==r?t.remov...
  function Mp (line 34) | function Mp(t,e,r,n,i){if("innerHTML"===e||"textContent"===e)return void...
  function Rp (line 34) | function Rp(t,e,r,n){t.addEventListener(e,r,n)}
  function Qp (line 34) | function Qp(t,e,r,n,i=null){const o=t[Lp]||(t[Lp]={}),a=o[e];if(n&&a)a.v...
  function Jp (line 34) | function Jp(){return Yp||(Yp=function(t){return pu(t)}(Up))}
  function qp (line 34) | function qp(t){return t instanceof SVGElement?"svg":"function"==typeof M...
  function Vp (line 34) | function Vp(t){if(Vo(t)){return document.querySelector(t)}return t}
  method serversListLoaded (line 34) | serversListLoaded(){return void 0!==this.servers}
  method created (line 34) | created(){this.updateServersList()}
  method mounted (line 34) | mounted(){const t=window.__GLANCES__||{},e=isFinite(t["refresh-time"])?p...
  method unmounted (line 34) | unmounted(){clearInterval(this.interval)}
  method updateServersList (line 34) | updateServersList(){fetch("api/4/serverslist",{method:"GET"}).then(t=>t....
  method goToGlances (line 34) | goToGlances(t){"rpc"===t.protocol?alert("You just click on a Glances RPC...
  method getDecoration (line 34) | getDecoration(t,e){if(void 0!==t[e+"_decoration"])return t[e+"_decoratio...
  function pd (line 34) | function pd(t,e){return dd(t=8*Math.round(t),e)+"b"}
  function dd (line 34) | function dd(t,e){if(e=e||!1,isNaN(parseFloat(t))||!isFinite(t)||0==t)ret...
  function md (line 34) | function md(t){return void 0===t||""===t?"?":t}
  function fd (line 34) | function fd(t,e,r){return e=e||0,r=r||" ",String(t).padStart(e,r)}
  function hd (line 34) | function hd(t,e){return"function"!=typeof t.slice&&(t=String(t)),t.slice...
  function gd (line 34) | function gd(t,e,r=!0){return e=e||8,t.length>e?r?t.substring(0,e-1)+"_":...
  function Ad (line 34) | function Ad(t){if(void 0===t)return t;var e=function(t){var e=document.c...
  function bd (line 34) | function bd(t,e){return void 0===t||isNaN(t)?"-":new Intl.NumberFormat("...
  function yd (line 34) | function yd(t){for(var e=0,r=0;r<t.length;r++)e+=1e3*t[r];return e}
  function vd (line 34) | function vd(t){var e=yd(t),r=new Date(e),n=Math.floor((r-new Date(r.getU...
  function xd (line 34) | function xd(t){return Object.entries(t).map(([t,e])=>`${t}: ${e}`).join(...

FILE: glances/outputs/static/public/glances.js
  method 1392 (line 1) | 1392(t,e,r){"use strict";r.d(e,{A:()=>a});var n=r(1601),i=r.n(n),o=r(631...
  method 1304 (line 1) | 1304(t,e,r){"use strict";r.d(e,{A:()=>a});var n=r(1601),i=r.n(n),o=r(631...
  method 6314 (line 1) | 6314(t){"use strict";t.exports=function(t){var e=[];return e.toString=fu...
  method 1601 (line 1) | 1601(t){"use strict";t.exports=function(t){return t[1]}}
  method 4744 (line 1) | 4744(t){"use strict";var e=function(t){return function(t){return!!t&&"ob...
  method 5413 (line 1) | 5413(t,e){"use strict";var r;Object.defineProperty(e,"__esModule",{value...
  method 2834 (line 1) | 2834(t){"use strict";t.exports=t=>{if("string"!=typeof t)throw new TypeE...
  method 4644 (line 1) | 4644(t,e){var r,n;
  method 8682 (line 7) | 8682(t,e){"use strict";
  method 2543 (line 14) | 2543(t,e,r){var n;
  method 9466 (line 22) | 9466(t,e){var r,n,i;n=[],void 0===(i="function"==typeof(r=function(){ret...
  method 8633 (line 22) | 8633(t){var e=String,r=function(){return{isColorSupported:!1,reset:e,bol...
  method 396 (line 22) | 396(t,e,r){"use strict";let n=r(7793);class i extends n{constructor(t){s...
  method 9371 (line 22) | 9371(t,e,r){"use strict";let n=r(3152);class i extends n{constructor(t){...
  method 7793 (line 22) | 7793(t,e,r){"use strict";let n,i,o,s,a=r(9371),l=r(5238),c=r(3152),{isCl...
  method 3614 (line 22) | 3614(t,e,r){"use strict";let n=r(8633),i=r(9746);class o extends Error{c...
  method 5238 (line 22) | 5238(t,e,r){"use strict";let n=r(3152);class i extends n{get variable(){...
  method 145 (line 22) | 145(t,e,r){"use strict";let n,i,o=r(7793);class s extends o{constructor(...
  method 3438 (line 22) | 3438(t,e,r){"use strict";let n=r(396),i=r(9371),o=r(5238),s=r(1106),a=r(...
  method 1106 (line 22) | 1106(t,e,r){"use strict";let{nanoid:n}=r(5042),{isAbsolute:i,resolve:o}=...
  method 6966 (line 22) | 6966(t,e,r){"use strict";let n=r(7793),i=r(145),o=r(3604),s=r(9577),a=r(...
  method 1752 (line 22) | 1752(t){"use strict";let e={comma:t=>e.split(t,[","],!0),space:t=>e.spli...
  method 3604 (line 22) | 3604(t,e,r){"use strict";let{dirname:n,relative:i,resolve:o,sep:s}=r(197...
  method 4211 (line 22) | 4211(t,e,r){"use strict";let n=r(3604),i=r(9577);const o=r(3717);let s=r...
  method 3152 (line 22) | 3152(t,e,r){"use strict";let n=r(3614),i=r(7668),o=r(3303),{isClean:s,my...
  method 9577 (line 22) | 9577(t,e,r){"use strict";let n=r(7793),i=r(1106),o=r(8339);function s(t,...
  method 8339 (line 22) | 8339(t,e,r){"use strict";let n=r(396),i=r(9371),o=r(5238),s=r(5644),a=r(...
  method 2895 (line 22) | 2895(t,e,r){"use strict";let n=r(396),i=r(9371),o=r(7793),s=r(3614),a=r(...
  method 3878 (line 22) | 3878(t,e,r){"use strict";let{existsSync:n,readFileSync:i}=r(9977),{dirna...
  method 6846 (line 22) | 6846(t,e,r){"use strict";let n=r(145),i=r(6966),o=r(4211),s=r(5644);clas...
  method 3717 (line 22) | 3717(t,e,r){"use strict";let n=r(38);class i{get content(){return this.c...
  method 5644 (line 22) | 5644(t,e,r){"use strict";let n,i,o=r(7793);class s extends o{constructor...
  method 1534 (line 22) | 1534(t,e,r){"use strict";let n=r(7793),i=r(1752);class o extends n{get s...
  method 7668 (line 22) | 7668(t){"use strict";const e={after:"\n",beforeClose:"\n",beforeComment:...
  method 3303 (line 22) | 3303(t,e,r){"use strict";let n=r(7668);function i(t,e){new n(e).stringif...
  method 4151 (line 22) | 4151(t){"use strict";t.exports.isClean=Symbol("isClean"),t.exports.my=Sy...
  method 5781 (line 22) | 5781(t){"use strict";const e="'".charCodeAt(0),r='"'.charCodeAt(0),n="\\...
  method 6156 (line 22) | 6156(t){"use strict";let e={};t.exports=function(t){e[t]||(e[t]=!0,"unde...
  method 38 (line 22) | 38(t){"use strict";class e{constructor(t,e={}){if(this.type="warning",th...
  method 4728 (line 22) | 4728(t,e,r){const n=r(8331),i=r(2834),{isPlainObject:o}=r(8682),s=r(4744...
  method 1019 (line 22) | 1019(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),...
  method 9079 (line 22) | 9079(t,e,r){"use strict";var n=this&&this.__assign||function(){return n=...
  method 9004 (line 22) | 9004(t,e,r){"use strict";var n=this&&this.__createBinding||(Object.creat...
  method 8018 (line 22) | 8018(t,e){"use strict";var r;Object.defineProperty(e,"__esModule",{value...
  method 4116 (line 22) | 4116(t,e,r){"use strict";var n=this&&this.__importDefault||function(t){r...
  method 9321 (line 22) | 9321(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),...
  method 1073 (line 22) | 1073(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),...
  method 6479 (line 22) | 6479(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),...
  method 2030 (line 22) | 2030(t,e){"use strict";function r(t){for(var e=1;e<t.length;e++)t[e][0]+...
  method 808 (line 22) | 808(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0})...
  method 4128 (line 22) | 4128(t,e,r){"use strict";var n=this&&this.__createBinding||(Object.creat...
  method 430 (line 22) | 430(t,e,r){"use strict";var n,i=this&&this.__extends||(n=function(t,e){r...
  method 2772 (line 22) | 2772(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 5936 (line 22) | 5936(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 1941 (line 22) | 1941(t,e,r){"use strict";var n=this&&this.__createBinding||(Object.creat...
  method 1974 (line 22) | 1974(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 568 (line 22) | 568(t,e){"use strict";function r(t){if(t.prev&&(t.prev.next=t.next),t.ne...
  method 1161 (line 22) | 1161(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 9124 (line 22) | 9124(t,e,r){"use strict";var n=this&&this.__importDefault||function(t){r...
  method 2851 (line 22) | 2851(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 5072 (line 22) | 5072(t){"use strict";var e=[];function r(t){for(var r=-1,n=0;n<e.length;...
  method 7659 (line 22) | 7659(t){"use strict";var e={};t.exports=function(t,r){var n=function(t){...
  method 540 (line 22) | 540(t){"use strict";t.exports=function(t){var e=document.createElement("...
  method 5056 (line 22) | 5056(t,e,r){"use strict";t.exports=function(t){var e=r.nc;e&&t.setAttrib...
  method 7825 (line 22) | 7825(t){"use strict";t.exports=function(t){if("undefined"==typeof docume...
  method 1113 (line 22) | 1113(t){"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleShee...
  method 6262 (line 22) | 6262(t,e){"use strict";e.A=(t,e)=>{const r=t.__vccOpts||t;for(const[t,n]...
  method 9746 (line 22) | 9746(){}
  method 9977 (line 22) | 9977(){}
  method 197 (line 22) | 197(){}
  method 1866 (line 22) | 1866(){}
  method 2739 (line 22) | 2739(){}
  method 5979 (line 22) | 5979(t,e){"use strict";var r;Object.defineProperty(e,"__esModule",{value...
  method 9299 (line 22) | 9299(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 642 (line 22) | 642(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0})...
  method 1838 (line 22) | 1838(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 4865 (line 22) | 4865(t,e){"use strict";var r;Object.defineProperty(e,"__esModule",{value...
  method 275 (line 22) | 275(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e...
  method 5042 (line 22) | 5042(t){t.exports={nanoid:(t=21)=>{let e="",r=0|t;for(;r--;)e+="useandom...
  method 292 (line 22) | 292(t,e,r){"use strict";var n,i=this&&this.__createBinding||(Object.crea...
  method 1766 (line 22) | 1766(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}...
  method 8331 (line 22) | 8331(t,e,r){"use strict";var n,i=this&&this.__createBinding||(Object.cre...
  function r (line 22) | function r(n){var i=e[n];if(void 0!==i)return i.exports;var o=e[n]={id:n...
  function U (line 22) | function U(t){return t?(t.nodeName||"").toLowerCase():null}
  function K (line 22) | function K(t){if(null==t)return window;if("[object Window]"!==t.toString...
  function H (line 22) | function H(t){return t instanceof K(t).Element||t instanceof Element}
  function Y (line 22) | function Y(t){return t instanceof K(t).HTMLElement||t instanceof HTMLEle...
  function J (line 22) | function J(t){return"undefined"!=typeof ShadowRoot&&(t instanceof K(t).S...
  function Z (line 22) | function Z(t){return t.split("-")[0]}
  function $ (line 22) | function $(){var t=navigator.userAgentData;return null!=t&&t.brands&&Arr...
  function tt (line 22) | function tt(){return!/^((?!chrome|android).)*safari/i.test($())}
  function et (line 22) | function et(t,e,r){void 0===e&&(e=!1),void 0===r&&(r=!1);var n=t.getBoun...
  function rt (line 22) | function rt(t){var e=et(t),r=t.offsetWidth,n=t.offsetHeight;return Math....
  function nt (line 22) | function nt(t,e){var r=e.getRootNode&&e.getRootNode();if(t.contains(e))r...
  function it (line 22) | function it(t){return K(t).getComputedStyle(t)}
  function ot (line 22) | function ot(t){return["table","td","th"].indexOf(U(t))>=0}
  function st (line 22) | function st(t){return((H(t)?t.ownerDocument:t.document)||window.document...
  function at (line 22) | function at(t){return"html"===U(t)?t:t.assignedSlot||t.parentNode||(J(t)...
  function lt (line 22) | function lt(t){return Y(t)&&"fixed"!==it(t).position?t.offsetParent:null}
  function ct (line 22) | function ct(t){for(var e=K(t),r=lt(t);r&&ot(r)&&"static"===it(r).positio...
  function ut (line 22) | function ut(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}
  function dt (line 22) | function dt(t,e,r){return V(t,z(e,r))}
  function pt (line 22) | function pt(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}
  function mt (line 22) | function mt(t,e){return e.reduce(function(e,r){return e[r]=t,e},{})}
  function gt (line 22) | function gt(t){return t.split("-")[1]}
  function bt (line 22) | function bt(t){var e,r=t.popper,n=t.popperRect,i=t.placement,o=t.variati...
  function wt (line 22) | function wt(t){return t.replace(/left|right|bottom|top/g,function(t){ret...
  function kt (line 22) | function kt(t){return t.replace(/start|end/g,function(t){return _t[t]})}
  function Ct (line 22) | function Ct(t){var e=K(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pa...
  function It (line 22) | function It(t){return et(st(t)).left+Ct(t).scrollLeft}
  function St (line 22) | function St(t){var e=it(t),r=e.overflow,n=e.overflowX,i=e.overflowY;retu...
  function Et (line 22) | function Et(t){return["html","body","#document"].indexOf(U(t))>=0?t.owne...
  function Dt (line 22) | function Dt(t,e){var r;void 0===e&&(e=[]);var n=Et(t),i=n===(null==(r=t....
  function Bt (line 22) | function Bt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.w...
  function Ot (line 22) | function Ot(t,e,r){return e===E?Bt(function(t,e){var r=K(t),n=st(t),i=r....
  function Tt (line 22) | function Tt(t,e,r,n){var i="clippingParents"===e?function(t){var e=Dt(at...
  function Nt (line 22) | function Nt(t){var e,r=t.reference,n=t.element,i=t.placement,o=i?Z(i):nu...
  function Ft (line 22) | function Ft(t,e){void 0===e&&(e={});var r=e,n=r.placement,i=void 0===n?t...
  function jt (line 22) | function jt(t,e,r){return void 0===r&&(r={x:0,y:0}),{top:t.top-e.height-...
  function Pt (line 22) | function Pt(t){return[y,x,v,w].some(function(e){return t[e]>=0})}
  function Wt (line 22) | function Wt(t,e,r){void 0===r&&(r=!1);var n,i,o=Y(e),s=Y(e)&&function(t)...
  function Ut (line 22) | function Ut(t){var e=new Map,r=new Set,n=[];function i(t){r.add(t.name),...
  function Ht (line 22) | function Ht(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]...
  function Yt (line 22) | function Yt(t){void 0===t&&(t={});var e=t,r=e.defaultModifiers,n=void 0=...
  method set (line 28) | set(t,e,r){Vt.has(t)||Vt.set(t,new Map);const n=Vt.get(t);n.has(e)||0===...
  method remove (line 28) | remove(t,e){if(!Vt.has(t))return;const r=Vt.get(t);r.delete(e),0===r.siz...
  function _e (line 28) | function _e(t,e){return e&&`${e}::${ve++}`||t.uidEvent||ve++}
  function ke (line 28) | function ke(t){const e=_e(t);return t.uidEvent=e,ye[e]=ye[e]||{},ye[e]}
  function Ce (line 28) | function Ce(t,e,r=null){return Object.values(t).find(t=>t.callable===e&&...
  function Ie (line 28) | function Ie(t,e,r){const n="string"==typeof e,i=n?r:e||r;let o=Be(t);ret...
  function Se (line 28) | function Se(t,e,r,n,i){if("string"!=typeof e||!t)return;let[o,s,a]=Ie(e,...
  function Ee (line 28) | function Ee(t,e,r,n,i){const o=Ce(e[r],n,i);o&&(t.removeEventListener(r,...
  function De (line 28) | function De(t,e,r,n){const i=e[r]||{};for(const[o,s]of Object.entries(i)...
  function Be (line 28) | function Be(t){return t=t.replace(be,""),xe[t]||t}
  method on (line 28) | on(t,e,r,n){Se(t,e,r,n,!1)}
  method one (line 28) | one(t,e,r,n){Se(t,e,r,n,!0)}
  method off (line 28) | off(t,e,r,n){if("string"!=typeof e||!t)return;const[i,o,s]=Ie(e,r,n),a=s...
  method trigger (line 28) | trigger(t,e,r){if("string"!=typeof e||!t)return null;const n=ce();let i=...
  function Te (line 28) | function Te(t,e={}){for(const[r,n]of Object.entries(e))try{t[r]=n}catch(...
  function Ne (line 28) | function Ne(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Num...
  function Fe (line 28) | function Fe(t){return t.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}
  method setDataAttribute (line 28) | setDataAttribute(t,e,r){t.setAttribute(`data-bs-${Fe(e)}`,r)}
  method removeDataAttribute (line 28) | removeDataAttribute(t,e){t.removeAttribute(`data-bs-${Fe(e)}`)}
  method getDataAttributes (line 28) | getDataAttributes(t){if(!t)return{};const e={},r=Object.keys(t.dataset)....
  class je (line 28) | class je{static get Default(){return{}}static get DefaultType(){return{}...
    method Default (line 28) | static get Default(){return{}}
    method DefaultType (line 28) | static get DefaultType(){return{}}
    method NAME (line 28) | static get NAME(){throw new Error('You have to implement the static me...
    method _getConfig (line 28) | _getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerg...
    method _configAfterMerge (line 28) | _configAfterMerge(t){return t}
    method _mergeConfigObj (line 28) | _mergeConfigObj(t,e){const r=re(e)?Me.getDataAttribute(e,"config"):{};...
    method _typeCheckConfig (line 28) | _typeCheckConfig(t,e=this.constructor.DefaultType){for(const[r,n]of Ob...
  class Pe (line 28) | class Pe extends je{constructor(t,e){super(),(t=ne(t))&&(this._element=t...
    method constructor (line 28) | constructor(t,e){super(),(t=ne(t))&&(this._element=t,this._config=this...
    method dispose (line 28) | dispose(){zt.remove(this._element,this.constructor.DATA_KEY),Oe.off(th...
    method _queueCallback (line 28) | _queueCallback(t,e,r=!0){he(t,e,r)}
    method _getConfig (line 28) | _getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._c...
    method getInstance (line 28) | static getInstance(t){return zt.get(ne(t),this.DATA_KEY)}
    method getOrCreateInstance (line 28) | static getOrCreateInstance(t,e={}){return this.getInstance(t)||new thi...
    method VERSION (line 28) | static get VERSION(){return"5.3.8"}
    method DATA_KEY (line 28) | static get DATA_KEY(){return`bs.${this.NAME}`}
    method EVENT_KEY (line 28) | static get EVENT_KEY(){return`.${this.DATA_KEY}`}
    method eventName (line 28) | static eventName(t){return`${t}${this.EVENT_KEY}`}
  method parents (line 28) | parents(t,e){const r=[];let n=t.parentNode.closest(e);for(;n;)r.push(n),...
  method prev (line 28) | prev(t,e){let r=t.previousElementSibling;for(;r;){if(r.matches(e))return...
  method next (line 28) | next(t,e){let r=t.nextElementSibling;for(;r;){if(r.matches(e))return[r];...
  method focusableChildren (line 28) | focusableChildren(t){const e=["a","button","input","textarea","select","...
  method getSelectorFromElement (line 28) | getSelectorFromElement(t){const e=Re(t);return e&&Le.findOne(e)?e:null}
  method getElementFromSelector (line 28) | getElementFromSelector(t){const e=Re(t);return e?Le.findOne(e):null}
  method getMultipleElementsFromSelector (line 28) | getMultipleElementsFromSelector(t){const e=Re(t);return e?Le.find(e):[]}
  class Ke (line 28) | class Ke extends Pe{static get NAME(){return"alert"}close(){if(Oe.trigge...
    method NAME (line 28) | static get NAME(){return"alert"}
    method close (line 28) | close(){if(Oe.trigger(this._element,We).defaultPrevented)return;this._...
    method _destroyElement (line 28) | _destroyElement(){this._element.remove(),Oe.trigger(this._element,Ue),...
    method jQueryInterface (line 28) | static jQueryInterface(t){return this.each(function(){const e=Ke.getOr...
  class Ye (line 28) | class Ye extends Pe{static get NAME(){return"button"}toggle(){this._elem...
    method NAME (line 28) | static get NAME(){return"button"}
    method toggle (line 28) | toggle(){this._element.setAttribute("aria-pressed",this._element.class...
    method jQueryInterface (line 28) | static jQueryInterface(t){return this.each(function(){const e=Ye.getOr...
  class er (line 28) | class er extends je{constructor(t,e){super(),this._element=t,t&&er.isSup...
    method constructor (line 28) | constructor(t,e){super(),this._element=t,t&&er.isSupported()&&(this._c...
    method Default (line 28) | static get Default(){return $e}
    method DefaultType (line 28) | static get DefaultType(){return tr}
    method NAME (line 28) | static get NAME(){return"swipe"}
    method dispose (line 28) | dispose(){Oe.off(this._element,Je)}
    method _start (line 28) | _start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&...
    method _end (line 28) | _end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this....
    method _move (line 28) | _move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].cli...
    method _handleSwipe (line 28) | _handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=...
    method _initEvents (line 28) | _initEvents(){this._supportPointerEvents?(Oe.on(this._element,ze,t=>th...
    method _eventIsPointerPenTouch (line 28) | _eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"==...
    method isSupported (line 28) | static isSupported(){return"ontouchstart"in document.documentElement||...
  class Ir (line 28) | class Ir extends Pe{constructor(t,e){super(t,e),this._interval=null,this...
    method constructor (line 28) | constructor(t,e){super(t,e),this._interval=null,this._activeElement=nu...
    method Default (line 28) | static get Default(){return kr}
    method DefaultType (line 28) | static get DefaultType(){return Cr}
    method NAME (line 28) | static get NAME(){return"carousel"}
    method next (line 28) | next(){this._slide(sr)}
    method nextWhenVisible (line 28) | nextWhenVisible(){!document.hidden&&ie(this._element)&&this.next()}
    method prev (line 28) | prev(){this._slide(ar)}
    method pause (line 28) | pause(){this._isSliding&&ee(this._element),this._clearInterval()}
    method cycle (line 28) | cycle(){this._clearInterval(),this._updateInterval(),this._interval=se...
    method _maybeEnableCycle (line 28) | _maybeEnableCycle(){this._config.ride&&(this._isSliding?Oe.one(this._e...
    method to (line 28) | to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._is...
    method dispose (line 28) | dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}
    method _configAfterMerge (line 28) | _configAfterMerge(t){return t.defaultInterval=t.interval,t}
    method _addEventListeners (line 28) | _addEventListeners(){this._config.keyboard&&Oe.on(this._element,pr,t=>...
    method _addTouchEventListeners (line 28) | _addTouchEventListeners(){for(const t of Le.find(".carousel-item img",...
    method _keydown (line 28) | _keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e...
    method _getItemIndex (line 28) | _getItemIndex(t){return this._getItems().indexOf(t)}
    method _setActiveIndicatorElement (line 28) | _setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const...
    method _updateInterval (line 28) | _updateInterval(){const t=this._activeElement||this._getActive();if(!t...
    method _slide (line 28) | _slide(t,e=null){if(this._isSliding)return;const r=this._getActive(),n...
    method _isAnimated (line 28) | _isAnimated(){return this._element.classList.contains("slide")}
    method _getActive (line 28) | _getActive(){return Le.findOne(wr,this._element)}
    method _getItems (line 28) | _getItems(){return Le.find(xr,this._element)}
    method _clearInterval (line 28) | _clearInterval(){this._interval&&(clearInterval(this._interval),this._...
    method _directionToOrder (line 28) | _directionToOrder(t){return de()?t===lr?ar:sr:t===lr?sr:ar}
    method _orderToDirection (line 28) | _orderToDirection(t){return de()?t===ar?lr:cr:t===ar?cr:lr}
    method jQueryInterface (line 28) | static jQueryInterface(t){return this.each(function(){const e=Ir.getOr...
  class Qr (line 28) | class Qr extends Pe{constructor(t,e){super(t,e),this._isTransitioning=!1...
    method constructor (line 28) | constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArra...
    method Default (line 28) | static get Default(){return Rr}
    method DefaultType (line 28) | static get DefaultType(){return Lr}
    method NAME (line 28) | static get NAME(){return"collapse"}
    method toggle (line 28) | toggle(){this._isShown()?this.hide():this.show()}
    method show (line 28) | show(){if(this._isTransitioning||this._isShown())return;let t=[];if(th...
    method hide (line 28) | hide(){if(this._isTransitioning||!this._isShown())return;if(Oe.trigger...
    method _isShown (line 28) | _isShown(t=this._element){return t.classList.contains(Nr)}
    method _configAfterMerge (line 28) | _configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=ne(t.p...
    method _getDimension (line 28) | _getDimension(){return this._element.classList.contains("collapse-hori...
    method _initializeChildren (line 28) | _initializeChildren(){if(!this._config.parent)return;const t=this._get...
    method _getFirstLevelChildren (line 28) | _getFirstLevelChildren(t){const e=Le.find(jr,this._config.parent);retu...
    method _addAriaAndCollapsedClass (line 28) | _addAriaAndCollapsedClass(t,e){if(t.length)for(const r of t)r.classLis...
    method jQueryInterface (line 28) | static jQueryInterface(t){const e={};return"string"==typeof t&&/show|h...
  class pn (line 28) | class pn extends Pe{constructor(t,e){super(t,e),this._popper=null,this._...
    method constructor (line 28) | constructor(t,e){super(t,e),this._popper=null,this._parent=this._eleme...
    method Default (line 28) | static get Default(){return un}
    method DefaultType (line 28) | static get DefaultType(){return dn}
    method NAME (line 28) | static get NAME(){return Gr}
    method toggle (line 28) | toggle(){return this._isShown()?this.hide():this.show()}
    method show (line 28) | show(){if(oe(this._element)||this._isShown())return;const t={relatedTa...
    method hide (line 28) | hide(){if(oe(this._element)||!this._isShown())return;const t={relatedT...
    method dispose (line 28) | dispose(){this._popper&&this._popper.destroy(),super.dispose()}
    method update (line 28) | update(){this._inNavbar=this._detectNavbar(),this._popper&&this._poppe...
    method _completeHide (line 28) | _completeHide(t){if(!Oe.trigger(this._element,Yr,t).defaultPrevented){...
    method _getConfig (line 28) | _getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!r...
    method _createPopper (line 28) | _createPopper(){let t=this._element;"parent"===this._config.reference?...
    method _isShown (line 28) | _isShown(){return this._menu.classList.contains($r)}
    method _getPlacement (line 28) | _getPlacement(){const t=this._parent;if(t.classList.contains("dropend"...
    method _detectNavbar (line 28) | _detectNavbar(){return null!==this._element.closest(".navbar")}
    method _getOffset (line 28) | _getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.s...
    method _getPopperConfig (line 28) | _getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[...
    method _selectMenuItem (line 28) | _selectMenuItem({key:t,target:e}){const r=Le.find(".dropdown-menu .dro...
    method jQueryInterface (line 28) | static jQueryInterface(t){return this.each(function(){const e=pn.getOr...
    method clearMenus (line 28) | static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)...
    method dataApiKeydownHandler (line 28) | static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.targe...
  class An (line 28) | class An extends je{constructor(t){super(),this._config=this._getConfig(...
    method constructor (line 28) | constructor(t){super(),this._config=this._getConfig(t),this._isAppende...
    method Default (line 28) | static get Default(){return fn}
    method DefaultType (line 28) | static get DefaultType(){return bn}
    method NAME (line 28) | static get NAME(){return mn}
    method show (line 28) | show(t){if(!this._config.isVisible)return void me(t);this._append();co...
    method hide (line 28) | hide(t){this._config.isVisible?(this._getElement().classList.remove(hn...
    method dispose (line 28) | dispose(){this._isAppended&&(Oe.off(this._element,gn),this._element.re...
    method _getElement (line 28) | _getElement(){if(!this._element){const t=document.createElement("div")...
    method _configAfterMerge (line 28) | _configAfterMerge(t){return t.rootElement=ne(t.rootElement),t}
    method _append (line 28) | _append(){if(this._isAppended)return;const t=this._getElement();this._...
    method _emulateAnimation (line 28) | _emulateAnimation(t){he(t,this._getElement(),this._config.isAnimated)}
  class Cn (line 28) | class Cn extends je{constructor(t){super(),this._config=this._getConfig(...
    method constructor (line 28) | constructor(t){super(),this._config=this._getConfig(t),this._isActive=...
    method Default (line 28) | static get Default(){return _n}
    method DefaultType (line 28) | static get DefaultType(){return kn}
    method NAME (line 28) | static get NAME(){return"focustrap"}
    method activate (line 28) | activate(){this._isActive||(this._config.autofocus&&this._config.trapE...
    method deactivate (line 28) | deactivate(){this._isActive&&(this._isActive=!1,Oe.off(document,yn))}
    method _handleFocusin (line 28) | _handleFocusin(t){const{trapElement:e}=this._config;if(t.target===docu...
    method _handleKeydown (line 28) | _handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey...
  class Bn (line 28) | class Bn{constructor(){this._element=document.body}getWidth(){const t=do...
    method constructor (line 28) | constructor(){this._element=document.body}
    method getWidth (line 28) | getWidth(){const t=document.documentElement.clientWidth;return Math.ab...
    method hide (line 28) | hide(){const t=this.getWidth();this._disableOverFlow(),this._setElemen...
    method reset (line 28) | reset(){this._resetElementAttributes(this._element,"overflow"),this._r...
    method isOverflowing (line 28) | isOverflowing(){return this.getWidth()>0}
    method _disableOverFlow (line 28) | _disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"...
    method _setElementAttributes (line 28) | _setElementAttributes(t,e,r){const n=this.getWidth();this._applyManipu...
    method _saveInitialAttribute (line 28) | _saveInitialAttribute(t,e){const r=t.style.getPropertyValue(e);r&&Me.s...
    method _resetElementAttributes (line 28) | _resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{con...
    method _applyManipulationCallback (line 28) | _applyManipulationCallback(t,e){if(re(t))e(t);else for(const r of Le.f...
  class Jn (line 28) | class Jn extends Pe{constructor(t,e){super(t,e),this._dialog=Le.findOne(...
    method constructor (line 28) | constructor(t,e){super(t,e),this._dialog=Le.findOne(".modal-dialog",th...
    method Default (line 28) | static get Default(){return Hn}
    method DefaultType (line 28) | static get DefaultType(){return Yn}
    method NAME (line 28) | static get NAME(){return"modal"}
    method toggle (line 28) | toggle(t){return this._isShown?this.hide():this.show(t)}
    method show (line 28) | show(t){if(this._isShown||this._isTransitioning)return;Oe.trigger(this...
    method hide (line 28) | hide(){if(!this._isShown||this._isTransitioning)return;Oe.trigger(this...
    method dispose (line 28) | dispose(){Oe.off(window,On),Oe.off(this._dialog,On),this._backdrop.dis...
    method handleUpdate (line 28) | handleUpdate(){this._adjustDialog()}
    method _initializeBackDrop (line 28) | _initializeBackDrop(){return new An({isVisible:Boolean(this._config.ba...
    method _initializeFocusTrap (line 28) | _initializeFocusTrap(){return new Cn({trapElement:this._element})}
    method _showElement (line 28) | _showElement(t){document.body.contains(this._element)||document.body.a...
    method _addEventListeners (line 28) | _addEventListeners(){Oe.on(this._element,Qn,t=>{"Escape"===t.key&&(thi...
    method _hideModal (line 28) | _hideModal(){this._element.style.display="none",this._element.setAttri...
    method _isAnimated (line 28) | _isAnimated(){return this._element.classList.contains("fade")}
    method _triggerBackdropTransition (line 28) | _triggerBackdropTransition(){if(Oe.trigger(this._element,Nn).defaultPr...
    method _adjustDialog (line 28) | _adjustDialog(){const t=this._element.scrollHeight>document.documentEl...
    method _resetAdjustments (line 28) | _resetAdjustments(){this._element.style.paddingLeft="",this._element.s...
    method jQueryInterface (line 28) | static jQueryInterface(t,e){return this.each(function(){const r=Jn.get...
  class di (line 28) | class di extends Pe{constructor(t,e){super(t,e),this._isShown=!1,this._b...
    method constructor (line 28) | constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._init...
    method Default (line 28) | static get Default(){return ci}
    method DefaultType (line 28) | static get DefaultType(){return ui}
    method NAME (line 28) | static get NAME(){return"offcanvas"}
    method toggle (line 28) | toggle(t){return this._isShown?this.hide():this.show(t)}
    method show (line 28) | show(t){if(this._isShown)return;if(Oe.trigger(this._element,ei,{relate...
    method hide (line 28) | hide(){if(!this._isShown)return;if(Oe.trigger(this._element,ni).defaul...
    method dispose (line 28) | dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super....
    method _initializeBackDrop (line 28) | _initializeBackDrop(){const t=Boolean(this._config.backdrop);return ne...
    method _initializeFocusTrap (line 28) | _initializeFocusTrap(){return new Cn({trapElement:this._element})}
    method _addEventListeners (line 28) | _addEventListeners(){Oe.on(this._element,li,t=>{"Escape"===t.key&&(thi...
    method jQueryInterface (line 28) | static jQueryInterface(t){return this.each(function(){const e=di.getOr...
  class yi (line 28) | class yi extends je{constructor(t){super(),this._config=this._getConfig(...
    method constructor (line 28) | constructor(t){super(),this._config=this._getConfig(t)}
    method Default (line 28) | static get Default(){return fi}
    method DefaultType (line 28) | static get DefaultType(){return bi}
    method NAME (line 28) | static get NAME(){return"TemplateFactory"}
    method getContent (line 28) | getContent(){return Object.values(this._config.content).map(t=>this._r...
    method hasContent (line 28) | hasContent(){return this.getContent().length>0}
    method changeContent (line 28) | changeContent(t){return this._checkContent(t),this._config.content={.....
    method toHtml (line 28) | toHtml(){const t=document.createElement("div");t.innerHTML=this._maybe...
    method _typeCheckConfig (line 28) | _typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.con...
    method _checkContent (line 28) | _checkContent(t){for(const[e,r]of Object.entries(t))super._typeCheckCo...
    method _setContent (line 28) | _setContent(t,e,r){const n=Le.findOne(r,t);n&&((e=this._resolvePossibl...
    method _maybeSanitize (line 28) | _maybeSanitize(t){return this._config.sanitize?function(t,e,r){if(!t.l...
    method _resolvePossibleFunction (line 28) | _resolvePossibleFunction(t){return me(t,[void 0,this])}
    method _putElementInTemplate (line 28) | _putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",...
  class Ti (line 28) | class Ti extends Pe{constructor(t,e){super(t,e),this._isEnabled=!0,this....
    method constructor (line 28) | constructor(t,e){super(t,e),this._isEnabled=!0,this._timeout=0,this._i...
    method Default (line 28) | static get Default(){return Bi}
    method DefaultType (line 28) | static get DefaultType(){return Oi}
    method NAME (line 28) | static get NAME(){return"tooltip"}
    method enable (line 28) | enable(){this._isEnabled=!0}
    method disable (line 28) | disable(){this._isEnabled=!1}
    method toggleEnabled (line 28) | toggleEnabled(){this._isEnabled=!this._isEnabled}
    method toggle (line 28) | toggle(){this._isEnabled&&(this._isShown()?this._leave():this._enter())}
    method dispose (line 28) | dispose(){clearTimeout(this._timeout),Oe.off(this._element.closest(ki)...
    method show (line 28) | show(){if("none"===this._element.style.display)throw new Error("Please...
    method hide (line 28) | hide(){if(!this._isShown())return;if(Oe.trigger(this._element,this.con...
    method update (line 28) | update(){this._popper&&this._popper.update()}
    method _isWithContent (line 28) | _isWithContent(){return Boolean(this._getTitle())}
    method _getTipElement (line 28) | _getTipElement(){return this.tip||(this.tip=this._createTipElement(thi...
    method _createTipElement (line 28) | _createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!...
    method setContent (line 28) | setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper...
    method _getTemplateFactory (line 28) | _getTemplateFactory(t){return this._templateFactory?this._templateFact...
    method _getContentForTemplate (line 28) | _getContentForTemplate(){return{[_i]:this._getTitle()}}
    method _getTitle (line 28) | _getTitle(){return this._resolvePossibleFunction(this._config.title)||...
    method _initializeOnDelegatedTarget (line 28) | _initializeOnDelegatedTarget(t){return this.constructor.getOrCreateIns...
    method _isAnimated (line 28) | _isAnimated(){return this._config.animation||this.tip&&this.tip.classL...
    method _isShown (line 28) | _isShown(){return this.tip&&this.tip.classList.contains(wi)}
    method _createPopper (line 28) | _createPopper(t){const e=me(this._config.placement,[this,t,this._eleme...
    method _getOffset (line 28) | _getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.s...
    method _resolvePossibleFunction (line 28) | _resolvePossibleFunction(t){return me(t,[this._element,this._element])}
    method _getPopperConfig (line 28) | _getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",optio...
    method _setListeners (line 28) | _setListeners(){const t=this._config.trigger.split(" ");for(const e of...
    method _fixTitle (line 28) | _fixTitle(){const t=this._element.getAttribute("title");t&&(this._elem...
    method _enter (line 28) | _enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._is...
    method _leave (line 28) | _leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTim...
    method _setTimeout (line 28) | _setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(...
    method _isWithActiveTrigger (line 28) | _isWithActiveTrigger(){return Object.values(this._activeTrigger).inclu...
    method _getConfig (line 28) | _getConfig(t){const e=Me.getDataAttributes(this._element);for(const t ...
    method _configAfterMerge (line 28) | _configAfterMerge(t){return t.container=!1===t.container?document.body...
    method _getDelegateConfig (line 28) | _getDelegateConfig(){const t={};for(const[e,r]of Object.entries(this._...
    method _disposePopper (line 28) | _disposePopper(){this._popper&&(this._popper.destroy(),this._popper=nu...
    method jQueryInterface (line 28) | static jQueryInterface(t){return this.each(function(){const e=Ti.getOr...
  class Pi (line 28) | class Pi extends Ti{static get Default(){return Mi}static get DefaultTyp...
    method Default (line 28) | static get Default(){return Mi}
    method DefaultType (line 28) | static get DefaultType(){return ji}
    method NAME (line 28) | static get NAME(){return"popover"}
    method _isWithContent (line 28) | _isWithContent(){return this._getTitle()||this._getContent()}
    method _getContentForTemplate (line 28) | _getContentForTemplate(){return{[Ni]:this._getTitle(),[Fi]:this._getCo...
    method _getContent (line 28) | _getContent(){return this._resolvePossibleFunction(this._config.content)}
    method jQueryInterface (line 28) | static jQueryInterface(t){return this.each(function(){const e=Pi.getOr...
  class qi (line 28) | class qi extends Pe{constructor(t,e){super(t,e),this._targetLinks=new Ma...
    method constructor (line 28) | constructor(t,e){super(t,e),this._targetLinks=new Map,this._observable...
    method Default (line 28) | static get Default(){return Yi}
    method DefaultType (line 28) | static get DefaultType(){return Ji}
    method NAME (line 28) | static get NAME(){return"scrollspy"}
    method refresh (line 28) | refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmo...
    method dispose (line 28) | dispose(){this._observer.disconnect(),super.dispose()}
    method _configAfterMerge (line 28) | _configAfterMerge(t){return t.target=ne(t.target)||document.body,t.roo...
    method _maybeEnableSmoothScroll (line 28) | _maybeEnableSmoothScroll(){this._config.smoothScroll&&(Oe.off(this._co...
    method _getNewObserver (line 28) | _getNewObserver(){const t={root:this._rootElement,threshold:this._conf...
    method _observerCallback (line 28) | _observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}...
    method _initializeTargetsAndObservables (line 28) | _initializeTargetsAndObservables(){this._targetLinks=new Map,this._obs...
    method _process (line 28) | _process(t){this._activeTarget!==t&&(this._clearActiveClass(this._conf...
    method _activateParents (line 28) | _activateParents(t){if(t.classList.contains("dropdown-item"))Le.findOn...
    method _clearActiveClass (line 28) | _clearActiveClass(t){t.classList.remove(Wi);const e=Le.find(`${Ui}.${W...
    method jQueryInterface (line 28) | static jQueryInterface(t){return this.each(function(){const e=qi.getOr...
  class Ao (line 28) | class Ao extends Pe{constructor(t){super(t),this._parent=this._element.c...
    method constructor (line 28) | constructor(t){super(t),this._parent=this._element.closest('.list-grou...
    method NAME (line 28) | static get NAME(){return"tab"}
    method show (line 28) | show(){const t=this._element;if(this._elemIsActive(t))return;const e=t...
    method _activate (line 28) | _activate(t,e){if(!t)return;t.classList.add(co),this._activate(Le.getE...
    method _deactivate (line 28) | _deactivate(t,e){if(!t)return;t.classList.remove(co),t.blur(),this._de...
    method _keydown (line 28) | _keydown(t){if(![no,io,oo,so,ao,lo].includes(t.key))return;t.stopPropa...
    method _getChildren (line 28) | _getChildren(){return Le.find(fo,this._parent)}
    method _getActiveElem (line 28) | _getActiveElem(){return this._getChildren().find(t=>this._elemIsActive...
    method _setInitialAttributes (line 28) | _setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tab...
    method _setInitialAttributesOnChild (line 28) | _setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=thi...
    method _setInitialAttributesOnTargetPanel (line 28) | _setInitialAttributesOnTargetPanel(t){const e=Le.getElementFromSelecto...
    method _toggleDropDown (line 28) | _toggleDropDown(t,e){const r=this._getOuterElement(t);if(!r.classList....
    method _setAttributeIfNotExists (line 28) | _setAttributeIfNotExists(t,e,r){t.hasAttribute(e)||t.setAttribute(e,r)}
    method _elemIsActive (line 28) | _elemIsActive(t){return t.classList.contains(co)}
    method _getInnerElement (line 28) | _getInnerElement(t){return t.matches(fo)?t:Le.findOne(fo,t)}
    method _getOuterElement (line 28) | _getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}
    method jQueryInterface (line 28) | static jQueryInterface(t){return this.each(function(){const e=Ao.getOr...
  class No (line 28) | class No extends Pe{constructor(t,e){super(t,e),this._timeout=null,this....
    method constructor (line 28) | constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteracti...
    method Default (line 28) | static get Default(){return To}
    method DefaultType (line 28) | static get DefaultType(){return Oo}
    method NAME (line 28) | static get NAME(){return"toast"}
    method show (line 28) | show(){if(Oe.trigger(this._element,Io).defaultPrevented)return;this._c...
    method hide (line 28) | hide(){if(!this.isShown())return;if(Oe.trigger(this._element,ko).defau...
    method dispose (line 28) | dispose(){this._clearTimeout(),this.isShown()&&this._element.classList...
    method isShown (line 28) | isShown(){return this._element.classList.contains(Do)}
    method _maybeScheduleHide (line 28) | _maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction...
    method _onInteraction (line 28) | _onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this...
    method _setListeners (line 28) | _setListeners(){Oe.on(this._element,vo,t=>this._onInteraction(t,!0)),O...
    method _clearTimeout (line 28) | _clearTimeout(){clearTimeout(this._timeout),this._timeout=null}
    method jQueryInterface (line 28) | static jQueryInterface(t){return this.each(function(){const e=No.getOr...
  function Fo (line 34) | function Fo(t){const e=Object.create(null);for(const r of t.split(","))e...
  function As (line 34) | function As(t){if(Ho(t)){const e={};for(let r=0;r<t.length;r++){const n=...
  function ws (line 34) | function ws(t){const e={};return t.replace(xs,"").split(ys).forEach(t=>{...
  function _s (line 34) | function _s(t){let e="";if(Vo(t))e=t;else if(Ho(t))for(let r=0;r<t.lengt...
  function Is (line 34) | function Is(t){return!!t||""===t}
  function Ss (line 34) | function Ss(t,e){if(t===e)return!0;let r=qo(t),n=qo(e);if(r||n)return!(!...
  class Fs (line 34) | class Fs{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,th...
    method constructor (line 34) | constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effe...
    method active (line 34) | get active(){return this._active}
    method pause (line 34) | pause(){if(this._active){let t,e;if(this._isPaused=!0,this.scopes)for(...
    method resume (line 34) | resume(){if(this._active&&this._isPaused){let t,e;if(this._isPaused=!1...
    method run (line 34) | run(t){if(this._active){const e=Ts;try{return Ts=this,t()}finally{Ts=e...
    method on (line 34) | on(){1===++this._on&&(this.prevScope=Ts,Ts=this)}
    method off (line 34) | off(){this._on>0&&0===--this._on&&(Ts=this.prevScope,this.prevScope=vo...
    method stop (line 34) | stop(t){if(this._active){let e,r;for(this._active=!1,e=0,r=this.effect...
  class js (line 34) | class js{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,...
    method constructor (line 34) | constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.fl...
    method pause (line 34) | pause(){this.flags|=64}
    method resume (line 34) | resume(){64&this.flags&&(this.flags&=-65,Ms.has(this)&&(Ms.delete(this...
    method notify (line 34) | notify(){2&this.flags&&!(32&this.flags)||8&this.flags||Qs(this)}
    method run (line 34) | run(){if(!(1&this.flags))return this.fn();this.flags|=2,$s(this),Us(th...
    method stop (line 34) | stop(){if(1&this.flags){for(let t=this.deps;t;t=t.nextDep)Js(t);this.d...
    method trigger (line 34) | trigger(){64&this.flags?Ms.add(this):this.scheduler?this.scheduler():t...
    method runIfDirty (line 34) | runIfDirty(){Hs(this)&&this.run()}
    method dirty (line 34) | get dirty(){return Hs(this)}
  function Qs (line 34) | function Qs(t,e=!1){if(t.flags|=8,e)return t.next=Rs,void(Rs=t);t.next=P...
  function Gs (line 34) | function Gs(){Ls++}
  function Ws (line 34) | function Ws(){if(--Ls>0)return;if(Rs){let t=Rs;for(Rs=void 0;t;){const e...
  function Us (line 34) | function Us(t){for(let e=t.deps;e;e=e.nextDep)e.version=-1,e.prevActiveL...
  function Ks (line 34) | function Ks(t){let e,r=t.depsTail,n=r;for(;n;){const t=n.prevDep;-1===n....
  function Hs (line 34) | function Hs(t){for(let e=t.deps;e;e=e.nextDep)if(e.dep.version!==e.versi...
  function Ys (line 34) | function Ys(t){if(4&t.flags&&!(16&t.flags))return;if(t.flags&=-17,t.glob...
  function Js (line 34) | function Js(t,e=!1){const{dep:r,prevSub:n,nextSub:i}=t;if(n&&(n.nextSub=...
  function qs (line 34) | function qs(t){const{prevDep:e,nextDep:r}=t;e&&(e.nextDep=r,t.prevDep=vo...
  function zs (line 34) | function zs(){Vs.push(Zs),Zs=!1}
  function Xs (line 34) | function Xs(){const t=Vs.pop();Zs=void 0===t||t}
  function $s (line 34) | function $s(t){const{cleanup:e}=t;if(t.cleanup=void 0,e){const t=Ns;Ns=v...
  class ea (line 34) | class ea{constructor(t,e){this.sub=t,this.dep=e,this.version=e.version,t...
    method constructor (line 34) | constructor(t,e){this.sub=t,this.dep=e,this.version=e.version,this.nex...
  class ra (line 34) | class ra{constructor(t){this.computed=t,this.version=0,this.activeLink=v...
    method constructor (line 34) | constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,t...
    method track (line 34) | track(t){if(!Ns||!Zs||Ns===this.computed)return;let e=this.activeLink;...
    method trigger (line 34) | trigger(t){this.version++,ta++,this.notify(t)}
    method notify (line 34) | notify(t){Gs();try{0;for(let t=this.subs;t;t=t.prevSub)t.sub.notify()&...
  function na (line 34) | function na(t){if(t.dep.sc++,4&t.sub.flags){const e=t.dep.computed;if(e&...
  function la (line 34) | function la(t,e,r){if(Zs&&Ns){let e=ia.get(t);e||ia.set(t,e=new Map);let...
  function ca (line 34) | function ca(t,e,r,n,i,o){const s=ia.get(t);if(!s)return void ta++;const ...
  function ua (line 34) | function ua(t){const e=Za(t);return e===t?e:(la(e,0,aa),Ja(t)?e:e.map(Va))}
  function da (line 34) | function da(t){return la(t=Za(t),0,aa),t}
  function pa (line 34) | function pa(t,e){return Ya(t)?Ha(t)?za(Va(e)):za(e):Va(e)}
  method [Symbol.iterator] (line 34) | [Symbol.iterator](){return ha(this,Symbol.iterator,t=>pa(this,t))}
  method concat (line 34) | concat(...t){return ua(this).concat(...t.map(t=>Ho(t)?ua(t):t))}
  method entries (line 34) | entries(){return ha(this,"entries",t=>(t[1]=pa(this,t[1]),t))}
  method every (line 34) | every(t,e){return fa(this,"every",t,e,void 0,arguments)}
  method filter (line 34) | filter(t,e){return fa(this,"filter",t,e,t=>t.map(t=>pa(this,t)),arguments)}
  method find (line 34) | find(t,e){return fa(this,"find",t,e,t=>pa(this,t),arguments)}
  method findIndex (line 34) | findIndex(t,e){return fa(this,"findIndex",t,e,void 0,arguments)}
  method findLast (line 34) | findLast(t,e){return fa(this,"findLast",t,e,t=>pa(this,t),arguments)}
  method findLastIndex (line 34) | findLastIndex(t,e){return fa(this,"findLastIndex",t,e,void 0,arguments)}
  method forEach (line 34) | forEach(t,e){return fa(this,"forEach",t,e,void 0,arguments)}
  method includes (line 34) | includes(...t){return Aa(this,"includes",t)}
  method indexOf (line 34) | indexOf(...t){return Aa(this,"indexOf",t)}
  method join (line 34) | join(t){return ua(this).join(t)}
  method lastIndexOf (line 34) | lastIndexOf(...t){return Aa(this,"lastIndexOf",t)}
  method map (line 34) | map(t,e){return fa(this,"map",t,e,void 0,arguments)}
  method pop (line 34) | pop(){return ya(this,"pop")}
  method push (line 34) | push(...t){return ya(this,"push",t)}
  method reduce (line 34) | reduce(t,...e){return ba(this,"reduce",t,e)}
  method reduceRight (line 34) | reduceRight(t,...e){return ba(this,"reduceRight",t,e)}
  method shift (line 34) | shift(){return ya(this,"shift")}
  method some (line 34) | some(t,e){return fa(this,"some",t,e,void 0,arguments)}
  method splice (line 34) | splice(...t){return ya(this,"splice",t)}
  method toReversed (line 34) | toReversed(){return ua(this).toReversed()}
  method toSorted (line 34) | toSorted(t){return ua(this).toSorted(t)}
  method toSpliced (line 34) | toSpliced(...t){return ua(this).toSpliced(...t)}
  method unshift (line 34) | unshift(...t){return ya(this,"unshift",t)}
  method values (line 34) | values(){return ha(this,"values",t=>pa(this,t))}
  function ha (line 34) | function ha(t,e,r){const n=da(t),i=n[e]();return n===t||Ja(t)||(i._next=...
  function fa (line 34) | function fa(t,e,r,n,i,o){const s=da(t),a=s!==t&&!Ja(t),l=s[e];if(l!==ga[...
  function ba (line 34) | function ba(t,e,r,n){const i=da(t),o=i!==t&&!Ja(t);let s=r,a=!1;i!==t&&(...
  function Aa (line 34) | function Aa(t,e,r){const n=Za(t);la(n,0,aa);const i=n[e](...r);return-1!...
  function ya (line 34) | function ya(t,e,r=[]){zs(),Gs();const n=Za(t)[e].apply(t,r);return Ws(),...
  function wa (line 34) | function wa(t){zo(t)||(t=String(t));const e=Za(this);return la(e,0,t),e....
  class _a (line 34) | class _a{constructor(t=!1,e=!1){this._isReadonly=t,this._isShallow=e}get...
    method constructor (line 34) | constructor(t=!1,e=!1){this._isReadonly=t,this._isShallow=e}
    method get (line 34) | get(t,e,r){if("__v_skip"===e)return t.__v_skip;const n=this._isReadonl...
  class ka (line 34) | class ka extends _a{constructor(t=!1){super(!1,t)}set(t,e,r,n){let i=t[e...
    method constructor (line 34) | constructor(t=!1){super(!1,t)}
    method set (line 34) | set(t,e,r,n){let i=t[e];const o=Ho(t)&&ns(e);if(!this._isShallow){cons...
    method deleteProperty (line 34) | deleteProperty(t,e){const r=Ko(t,e),n=(t[e],Reflect.deleteProperty(t,e...
    method has (line 34) | has(t,e){const r=Reflect.has(t,e);return zo(e)&&xa.has(e)||la(t,0,e),r}
    method ownKeys (line 34) | ownKeys(t){return la(t,0,Ho(t)?"length":oa),Reflect.ownKeys(t)}
  class Ca (line 34) | class Ca extends _a{constructor(t=!1){super(!0,t)}set(t,e){return!0}dele...
    method constructor (line 34) | constructor(t=!1){super(!0,t)}
    method set (line 34) | set(t,e){return!0}
    method deleteProperty (line 34) | deleteProperty(t,e){return!0}
  function Oa (line 34) | function Oa(t){return function(...e){return"delete"!==t&&("clear"===t?vo...
  function Ta (line 34) | function Ta(t,e){const r={get(r){const n=this.__v_raw,i=Za(n),o=Za(r);t|...
  function Na (line 34) | function Na(t,e){const r=Ta(t,e);return(e,n,i)=>"__v_isReactive"===n?!t:...
  function Ga (line 34) | function Ga(t){return t.__v_skip||!Object.isExtensible(t)?0:function(t){...
  function Wa (line 34) | function Wa(t){return Ya(t)?t:Ka(t,!1,Ia,Fa,Pa)}
  function Ua (line 34) | function Ua(t){return Ka(t,!0,Sa,ja,La)}
  function Ka (line 34) | function Ka(t,e,r,n,i){if(!Xo(t))return t;if(t.__v_raw&&(!e||!t.__v_isRe...
  function Ha (line 34) | function Ha(t){return Ya(t)?Ha(t.__v_raw):!(!t||!t.__v_isReactive)}
  function Ya (line 34) | function Ya(t){return!(!t||!t.__v_isReadonly)}
  function Ja (line 34) | function Ja(t){return!(!t||!t.__v_isShallow)}
  function qa (line 34) | function qa(t){return!!t&&!!t.__v_raw}
  function Za (line 34) | function Za(t){const e=t&&t.__v_raw;return e?Za(e):t}
  function Xa (line 34) | function Xa(t){return!!t&&!0===t.__v_isRef}
  function $a (line 34) | function $a(t){return Xa(t)?t.value:t}
  function el (line 34) | function el(t){return Ha(t)?t:new Proxy(t,tl)}
  class rl (line 34) | class rl{constructor(t,e,r){this.fn=t,this.setter=e,this._value=void 0,t...
    method constructor (line 34) | constructor(t,e,r){this.fn=t,this.setter=e,this._value=void 0,this.dep...
    method notify (line 34) | notify(){if(this.flags|=16,!(8&this.flags||Ns===this))return Qs(this,!...
    method value (line 34) | get value(){const t=this.dep.track();return Ys(this),t&&(t.version=thi...
    method value (line 34) | set value(t){this.setter&&this.setter(t)}
  function sl (line 34) | function sl(t,e,r=Mo){const{immediate:n,deep:i,once:o,scheduler:s,augmen...
  function al (line 34) | function al(t,e=1/0,r){if(e<=0||!Xo(t)||t.__v_skip)return t;if(((r=r||ne...
  function ll (line 34) | function ll(t,e,r,n){try{return n?t(...n):t()}catch(t){ul(t,e,r)}}
  function cl (line 34) | function cl(t,e,r,n){if(Zo(t)){const i=ll(t,e,r,n);return i&&$o(i)&&i.ca...
  function ul (line 34) | function ul(t,e,r,n=!0){e&&e.vnode;const{errorHandler:i,throwUnhandledEr...
  function Al (line 34) | function Al(t){const e=bl||fl;return t?e.then(this?t.bind(this):t):e}
  function yl (line 34) | function yl(t){if(!(1&t.flags)){const e=kl(t),r=dl[dl.length-1];!r||!(2&...
  function vl (line 34) | function vl(){bl||(bl=fl.then(Cl))}
  function xl (line 34) | function xl(t){Ho(t)?ml.push(...t):hl&&-1===t.id?hl.splice(gl+1,0,t):1&t...
  function wl (line 34) | function wl(t,e,r=pl+1){for(0;r<dl.length;r++){const e=dl[r];if(e&&2&e.f...
  function _l (line 34) | function _l(t){if(ml.length){const t=[...new Set(ml)].sort((t,e)=>kl(t)-...
  function Cl (line 34) | function Cl(t){try{for(pl=0;pl<dl.length;pl++){const t=dl[pl];!t||8&t.fl...
  function El (line 34) | function El(t){const e=Il;return Il=t,Sl=t&&t.type.__scopeId||null,e}
  function Dl (line 34) | function Dl(t,e=Il,r){if(!e)return t;if(t._n)return t;const n=(...r)=>{n...
  function Bl (line 34) | function Bl(t,e){if(null===Il)return t;const r=bd(Il),n=t.dirs||(t.dirs=...
  function Ol (line 34) | function Ol(t,e,r,n){const i=t.dirs,o=e&&e.dirs;for(let s=0;s<i.length;s...
  function Tl (line 34) | function Tl(t,e,r=!1){const n=nd();if(n||Gc){let i=Gc?Gc._context.provid...
  function Fl (line 34) | function Fl(t,e,r){return Ml(t,e,r)}
  function Ml (line 34) | function Ml(t,e,r=Mo){const{immediate:n,deep:i,flush:o,once:s}=r;const a...
  function jl (line 34) | function jl(t,e,r){const n=this.proxy,i=Vo(t)?t.includes(".")?Pl(n,t):()...
  function Pl (line 34) | function Pl(t,e){const r=e.split(".");return()=>{let e=t;for(let t=0;t<r...
  function Wl (line 34) | function Wl(t,e){6&t.shapeFlag&&t.component?(t.transition=e,Wl(t.compone...
  function Ul (line 34) | function Ul(t){t.ids=[t.ids[0]+t.ids[2]+++"-",0,0]}
  function Kl (line 34) | function Kl(t,e){let r;return!(!(r=Object.getOwnPropertyDescriptor(t,e))...
  function Yl (line 34) | function Yl(t,e,r,n,i=!1){if(Ho(t))return void t.forEach((t,o)=>Yl(t,e&&...
  function Jl (line 34) | function Jl(t){const e=Hl.get(t);e&&(e.flags|=8,Hl.delete(t))}
  function Vl (line 34) | function Vl(t,e){return Ho(t)?t.some(t=>Vl(t,e)):Vo(t)?t.split(",").incl...
  function zl (line 34) | function zl(t,e){$l(t,"a",e)}
  function Xl (line 34) | function Xl(t,e){$l(t,"da",e)}
  function $l (line 34) | function $l(t,e,r=rd){const n=t.__wdc||(t.__wdc=()=>{let e=r;for(;e;){if...
  function tc (line 34) | function tc(t,e,r,n){const i=nc(e,t,n,!0);uc(()=>{Wo(n[e],i)},r)}
  function ec (line 34) | function ec(t){t.shapeFlag&=-257,t.shapeFlag&=-513}
  function rc (line 34) | function rc(t){return 128&t.shapeFlag?t.ssContent:t}
  function nc (line 34) | function nc(t,e,r=rd,n=!1){if(r){const i=r[t]||(r[t]=[]),o=e.__weh||(e._...
  function hc (line 34) | function hc(t,e=rd){nc("ec",t,e)}
  function fc (line 34) | function fc(t,e){return Ac(gc,t,!0,e)||t}
  function Ac (line 34) | function Ac(t,e,r=!0,n=!1){const i=Il||rd;if(i){const r=i.type;if(t===gc...
  function yc (line 34) | function yc(t,e){return t&&(t[e]||t[as(e)]||t[us(as(e))])}
  function vc (line 34) | function vc(t,e,r,n){let i;const o=r&&r[n],s=Ho(t);if(s||Vo(t)){let r=!1...
  method get (line 34) | get({_:t},e){if("__v_skip"===e)return!0;const{ctx:r,setupState:n,data:i,...
  method set (line 34) | set({_:t},e,r){const{data:n,setupState:i,ctx:o}=t;return _c(i,e)?(i[e]=r...
  method has (line 34) | has({_:{data:t,setupState:e,accessCache:r,ctx:n,appContext:i,props:o,typ...
  method defineProperty (line 34) | defineProperty(t,e,r){return null!=r.get?t._.accessCache[e]=0:Ko(r,"valu...
  function Cc (line 34) | function Cc(t){return Ho(t)?t.reduce((t,e)=>(t[e]=null,t),{}):t}
  function Sc (line 34) | function Sc(t){const e=Bc(t),r=t.proxy,n=t.ctx;Ic=!1,e.beforeCreate&&Ec(...
  function Ec (line 34) | function Ec(t,e,r){cl(Ho(t)?t.map(t=>t.bind(e.proxy)):t.bind(e.proxy),e,r)}
  function Dc (line 34) | function Dc(t,e,r,n){let i=n.includes(".")?Pl(r,n):()=>r[n];if(Vo(t)){co...
  function Bc (line 34) | function Bc(t){const e=t.type,{mixins:r,extends:n}=e,{mixins:i,optionsCa...
  function Oc (line 34) | function Oc(t,e,r,n=!1){const{mixins:i,extends:o}=e;o&&Oc(t,o,r,!0),i&&i...
  function Nc (line 34) | function Nc(t,e){return e?t?function(){return Go(Zo(t)?t.call(this,this)...
  function Fc (line 34) | function Fc(t){if(Ho(t)){const e={};for(let r=0;r<t.length;r++)e[t[r]]=t...
  function Mc (line 34) | function Mc(t,e){return t?[...new Set([].concat(t,e))]:e}
  function jc (line 34) | function jc(t,e){return t?Go(Object.create(null),t,e):e}
  function Pc (line 34) | function Pc(t,e){return t?Ho(t)&&Ho(e)?[...new Set([...t,...e])]:Go(Obje...
  function Rc (line 34) | function Rc(){return{app:null,config:{isNativeTag:Ro,performance:!1,glob...
  function Qc (line 34) | function Qc(t,e){return function(r,n=null){Zo(r)||(r=Go({},r)),null==n||...
  function Uc (line 34) | function Uc(t,e,...r){if(t.isUnmounted)return;const n=t.vnode.props||Mo;...
  function Hc (line 34) | function Hc(t,e,r=!1){const n=r?Kc:e.emitsCache,i=n.get(t);if(void 0!==i...
  function Yc (line 34) | function Yc(t,e){return!(!t||!Lo(e))&&(e=e.slice(2).replace(/Once$/,""),...
  function Jc (line 34) | function Jc(t){const{type:e,vnode:r,proxy:n,withProxy:i,propsOptions:[o]...
  function Vc (line 34) | function Vc(t,e,r){const n=Object.keys(e);if(n.length!==Object.keys(t).l...
  function zc (line 34) | function zc(t,e,r){const n=t[r],i=e[r];return"style"===r&&Xo(n)&&Xo(i)?!...
  function Xc (line 34) | function Xc({vnode:t,parent:e},r){for(;e;){const n=e.subTree;if(n.suspen...
  function ru (line 34) | function ru(t,e,r,n=!1){const i={},o=tu();t.propsDefaults=Object.create(...
  function nu (line 34) | function nu(t,e,r,n){const[i,o]=t.propsOptions;let s,a=!1;if(e)for(let l...
  function iu (line 34) | function iu(t,e,r,n,i,o){const s=t[r];if(null!=s){const t=Ko(s,"default"...
  function su (line 34) | function su(t,e,r=!1){const n=r?ou:e.propsCache,i=n.get(t);if(i)return i...
  function au (line 34) | function au(t){return"$"!==t[0]&&!is(t)}
  function gu (line 34) | function gu(t,e){bs().__VUE__=!0;const{insert:r,remove:n,patchProp:i,cre...
  function fu (line 34) | function fu({type:t,props:e},r){return"svg"===r&&"foreignObject"===t||"m...
  function bu (line 34) | function bu({effect:t,job:e},r){r?(t.flags|=32,e.flags|=4):(t.flags&=-33...
  function Au (line 34) | function Au(t,e){return(!t||t&&!t.pendingBranch)&&e&&!e.persisted}
  function yu (line 34) | function yu(t,e,r=!1){const n=t.children,i=e.children;if(Ho(n)&&Ho(i))fo...
  function vu (line 34) | function vu(t){const e=t.subTree.component;if(e)return e.asyncDep&&!e.as...
  function xu (line 34) | function xu(t){if(t)for(let e=0;e<t.length;e++)t[e].flags|=8}
  function wu (line 34) | function wu(t){if(t.placeholder)return t.placeholder;const e=t.component...
  function ku (line 34) | function ku(t,e){e&&e.pendingBranch?Ho(t)?e.effects.push(...t):e.effects...
  function Ou (line 34) | function Ou(t=!1){Du.push(Bu=t?null:[])}
  function Tu (line 34) | function Tu(){Du.pop(),Bu=Du[Du.length-1]||null}
  function Fu (line 34) | function Fu(t,e=!1){Nu+=t,t<0&&Bu&&e&&(Bu.hasOnce=!0)}
  function Mu (line 34) | function Mu(t){return t.dynamicChildren=Nu>0?Bu||jo:null,Tu(),Nu>0&&Bu&&...
  function ju (line 34) | function ju(t,e,r,n,i,o){return Mu(Wu(t,e,r,n,i,o,!0))}
  function Pu (line 34) | function Pu(t,e,r,n,i){return Mu(Uu(t,e,r,n,i,!0))}
  function Ru (line 34) | function Ru(t){return!!t&&!0===t.__v_isVNode}
  function Lu (line 34) | function Lu(t,e){return t.type===e.type&&t.key===e.key}
  function Wu (line 34) | function Wu(t,e=null,r=null,n=0,i=null,o=(t===Cu?0:1),s=!1,a=!1){const l...
  function Ku (line 34) | function Ku(t,e=null,r=null,n=0,i=null,o=!1){if(t&&t!==bc||(t=Su),Ru(t))...
  function Hu (line 34) | function Hu(t,e,r=!1,n=!1){const{props:i,ref:o,patchFlag:s,children:a,tr...
  function Yu (line 34) | function Yu(t=" ",e=0){return Uu(Iu,null,t,e)}
  function Ju (line 34) | function Ju(t,e){const r=Uu(Eu,null,t);return r.staticCount=e,r}
  function qu (line 34) | function qu(t="",e=!1){return e?(Ou(),Pu(Su,null,t)):Uu(Su,null,t)}
  function Zu (line 34) | function Zu(t){return null==t||"boolean"==typeof t?Uu(Su):Ho(t)?Uu(Cu,nu...
  function Vu (line 34) | function Vu(t){return null===t.el&&-1!==t.patchFlag||t.memo?t:Hu(t)}
  function zu (line 34) | function zu(t,e){let r=0;const{shapeFlag:n}=t;if(null==e)e=null;else if(...
  function Xu (line 34) | function Xu(t,e,r,n=null){cl(t,e,7,[r,n])}
  function ed (line 34) | function ed(t,e,r){const n=t.type,i=(e?e.appContext:t.appContext)||$u,o=...
  function ld (line 34) | function ld(t){return 4&t.vnode.shapeFlag}
  function pd (line 34) | function pd(t,e=!1,r=!1){e&&od(e);const{props:n,children:i}=t.vnode,o=ld...
  function md (line 34) | function md(t,e,r){Zo(e)?t.type.__ssrInlineRender?t.ssrRender=e:t.render...
  function hd (line 34) | function hd(t,e,r){const n=t.type;if(!t.render){if(!e&&cd&&!n.render){co...
  function fd (line 34) | function fd(t){const e=e=>{t.exposed=e||{}};return{attrs:new Proxy(t.att...
  function bd (line 34) | function bd(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(...
  function Ad (line 34) | function Ad(t,e=!0){return Zo(t)?t.displayName||t.name:t.name||e&&t.__name}
  function yd (line 34) | function yd(t){return Zo(t)&&"__vccOpts"in t}
  method setScopeId (line 40) | setScopeId(t,e){t.setAttribute(e,"")}
  method insertStaticContent (line 40) | insertStaticContent(t,e,r,n,i,o){const s=r?r.previousSibling:e.lastChild...
  method beforeMount (line 40) | beforeMount(t,{value:e},{transition:r}){t[Dd]="none"===t.style.display?"...
  method mounted (line 40) | mounted(t,{value:e},{transition:r}){r&&e&&r.enter(t)}
  method updated (line 40) | updated(t,{value:e,oldValue:r},{transition:n}){!e!=!r&&(n?e?(n.beforeEnt...
  method beforeUnmount (line 40) | beforeUnmount(t,{value:e}){Td(t,e)}
  function Td (line 40) | function Td(t,e){t.style.display=e?t[Dd]:"none",t[Bd]=!e}
  function jd (line 40) | function jd(t,e,r){if(Ho(r))r.forEach(r=>jd(t,e,r));else if(null==r&&(r=...
  function Qd (line 40) | function Qd(t,e,r,n,i,o=Cs(e)){n&&e.startsWith("xlink:")?null==r?t.remov...
  function Gd (line 40) | function Gd(t,e,r,n,i){if("innerHTML"===e||"textContent"===e)return void...
  function Wd (line 40) | function Wd(t,e,r,n){t.addEventListener(e,r,n)}
  function Kd (line 40) | function Kd(t,e,r,n,i=null){const o=t[Ud]||(t[Ud]={}),s=o[e];if(n&&s)s.v...
  function Xd (line 40) | function Xd(){return zd||(zd=function(t){return gu(t)}(Vd))}
  function tp (line 40) | function tp(t){return t instanceof SVGElement?"svg":"function"==typeof M...
  function ep (line 40) | function ep(t){if(Vo(t)){return document.querySelector(t)}return t}
  function Sp (line 49) | function Sp(t,e,r,n){t.addEventListener?t.addEventListener(e,r,n):t.atta...
  function Ep (line 49) | function Ep(t,e,r,n){t&&(t.removeEventListener?t.removeEventListener(e,r...
  function Dp (line 49) | function Dp(t,e){const r=e.slice(0,e.length-1),n=[];for(let e=0;e<r.leng...
  function Bp (line 49) | function Bp(t){"string"!=typeof t&&(t="");const e=(t=t.replace(/\s/g,"")...
  function Op (line 49) | function Op(t){let e=t.keyCode||t.which||t.charCode;return t.code&&/^Key...
  function qp (line 49) | function qp(t,e,r,n){if(e.element!==n)return;let i;if(e.scope===r||"all"...
  function Zp (line 49) | function Zp(t,e){const r=jp["*"];let n=Op(t);if(t.key&&"capslock"===t.ke...
  function zp (line 49) | function zp(t){const e=Object.values(jp).flat();if(e.findIndex(({element...
  method mounted (line 49) | mounted(){fetch("api/4/help",{method:"GET"}).then(t=>t.json()).then(t=>t...
  method setLimits (line 49) | setLimits(t){this.limits=t}
  method getLimit (line 49) | getLimit(t,e){return null!=this.limits[t]&&null!=this.limits[t][e]?this....
  method getAlert (line 49) | getAlert(t,e,r,n,i){var o=(i=i||!1)?"_log":"",s=100*(r=r||0)/(n=n||100);...
  method getAlertLog (line 49) | getAlertLog(t,e,r,n){return this.getAlert(t,e,r,n,!0)}
  method init (line 49) | init(t=60){let e;const r=()=>(ym.status="PENDING",Promise.all([fetch("ap...
  method getData (line 49) | getData(){return this.data}
  method constructor (line 49) | constructor(){this.favico=new(Am())({animation:"none"})}
  method badge (line 49) | badge(t){this.favico.badge(t)}
  method reset (line 49) | reset(){this.favico.reset()}
  method stats (line 49) | stats(){return this.data.stats.alert}
  method alerts (line 49) | alerts(){return(this.stats||[]).map(t=>{const e={};if(e.state=t.state,e....
  method hasAlerts (line 49) | hasAlerts(){return this.countAlerts>0}
  method countAlerts (line 49) | countAlerts(){return this.alerts.length}
  method hasOngoingAlerts (line 49) | hasOngoingAlerts(){return this.countOngoingAlerts>0}
  method countOngoingAlerts (line 49) | countOngoingAlerts(){return this.alerts.filter(({ongoing:t})=>t).length}
  method countOngoingAlerts (line 49) | countOngoingAlerts(){this.countOngoingAlerts?wm.badge(this.countOngoingA...
  method formatDate (line 49) | formatDate(t){const e=(new Date).getTimezoneOffset(),r=Math.trunc(Math.a...
  method clear (line 49) | clear(){fetch("api/4/events/clear/all",{method:"POST",headers:{"Content-...
  method stats (line 49) | stats(){return this.data.stats.cloud}
  method provider (line 49) | provider(){return void 0!==this.stats.id?`${stats.platform}`:null}
  method instance (line 49) | instance(){const{stats:t}=this;return void 0!==this.stats.id?`${t.type} ...
  method stats (line 49) | stats(){return this.data.stats.connections}
  method view (line 49) | view(){return this.data.views.connections}
  method listen (line 49) | listen(){return this.stats.LISTEN}
  method initiated (line 49) | initiated(){return this.stats.initiated}
  method established (line 49) | established(){return this.stats.ESTABLISHED}
  method terminated (line 49) | terminated(){return this.stats.terminated}
  method tracked (line 49) | tracked(){return{count:this.stats.nf_conntrack_count,max:this.stats.nf_c...
  method getDecoration (line 49) | getDecoration(t){if(void 0!==this.view[t])return this.view[t].decoration...
  method args (line 49) | args(){return this.store.args||{}}
  method sortProcessesKey (line 49) | sortProcessesKey(){return this.args.sort_processes_key}
  method stats (line 49) | stats(){return this.data.stats.containers}
  method views (line 49) | views(){return this.data.views.containers}
  method containers (line 49) | containers(){const{sorter:t}=this,e=(this.stats||[]).map(t=>{let e;retur...
  method showEngine (line 49) | showEngine(){return this.views.show_engine_name}
  method showPod (line 49) | showPod(){return this.views.show_pod_name}
  method handler (line 49) | handler(t){t&&!["cpu_percent","memory_percent","name"].includes(t)||(thi...
  method getStatusClass (line 49) | getStatusClass(t){const e=t.toLowerCase();return["running","healthy"].in...
  method stats (line 49) | stats(){return this.data.stats.cpu}
  method view (line 49) | view(){return this.data.views.cpu}
  method isLinux (line 49) | isLinux(){return this.data.isLinux}
  method isSunOS (line 49) | isSunOS(){return this.data.isSunOS}
  method isWindows (line 49) | isWindows(){return this.data.isWindows}
  method total (line 49) | total(){return this.stats.total}
  method user (line 49) | user(){return this.stats.user}
  method system (line 49) | system(){return this.stats.system}
  method idle (line 49) | idle(){return this.stats.idle}
  method nice (line 49) | nice(){return this.stats.nice}
  method irq (line 49) | irq(){return this.stats.irq}
  method iowait (line 49) | iowait(){return this.stats.iowait}
  method dpc (line 49) | dpc(){return this.stats.dpc}
  method steal (line 49) | steal(){return this.stats.steal}
  method guest (line 49) | guest(){return this.stats.guest}
  method ctx_switches (line 49) | ctx_switches(){const{stats:t}=this;return t.ctx_switches?Math.floor(t.ct...
  method interrupts (line 49) | interrupts(){const{stats:t}=this;return t.interrupts?Math.floor(t.interr...
  method soft_interrupts (line 49) | soft_interrupts(){const{stats:t}=this;return t.soft_interrupts?Math.floo...
  method syscalls (line 49) | syscalls(){const{stats:t}=this;return t.syscalls?Math.floor(t.syscalls/t...
  method getDecoration (line 49) | getDecoration(t){if(void 0!==this.view[t])return this.view[t].decoration...
  function Kh (line 49) | function Kh(t,e){return Hh(t=8*Math.round(t),e)+"b"}
  function Hh (line 49) | function Hh(t,e){if(e=e||!1,isNaN(parseFloat(t))||!isFinite(t)||0==t)ret...
  function Yh (line 49) | function Yh(t){return void 0===t||""===t?"?":t}
  function Jh (line 49) | function Jh(t,e,r){return e=e||0,r=r||" ",String(t).padStart(e,r)}
  function qh (line 49) | function qh(t,e){return"function"!=typeof t.slice&&(t=String(t)),t.slice...
  function Zh (line 49) | function Zh(t,e,r=!0){return e=e||8,t.length>e?r?t.substring(0,e-1)+"_":...
  function Vh (line 49) | function Vh(t){if(void 0===t)return t;var e=function(t){var e=document.c...
  function zh (line 49) | function zh(t,e){return void 0===t||isNaN(t)?"-":new Intl.NumberFormat("...
  function Xh (line 49) | function Xh(t){for(var e=0,r=0;r<t.length;r++)e+=1e3*t[r];return e}
  function $h (line 49) | function $h(t){var e=Xh(t),r=new Date(e),n=Math.floor((r-new Date(r.getU...
  function tg (line 49) | function tg(t){return Object.entries(t).map(([t,e])=>`${t}: ${e}`).join(...
  method args (line 49) | args(){return this.store.args||{}}
  method stats (line 49) | stats(){return this.data.stats.diskio}
  method view (line 49) | view(){return this.data.views.diskio}
  method disks (line 49) | disks(){const t=this.stats.map(t=>({name:t.disk_name,alias:void 0!==t.al...
  method hasDisks (line 49) | hasDisks(){return this.disks.length>0}
  method getDecoration (line 49) | getDecoration(t,e){return null==this.view[t][e]?null==this.view[e]?void ...
  method stats (line 49) | stats(){return this.data.stats.folders}
  method folders (line 49) | folders(){return this.stats.map(t=>({path:t.path,size:t.size,errno:t.err...
  method hasFolders (line 49) | hasFolders(){return this.folders.length>0}
  method args (line 49) | args(){return this.store.args||{}}
  method stats (line 49) | stats(){return this.data.stats.fs}
  method view (line 49) | view(){return this.data.views.fs}
  method fileSystems (line 49) | fileSystems(){const t=this.stats.map(t=>({name:t.device_name,mountPoint:...
  method hasFs (line 49) | hasFs(){return this.fileSystems.length>0}
  method getDecoration (line 49) | getDecoration(t,e){if(null!=this.view[t][e])return this.view[t][e].decor...
  method args (line 49) | args(){return this.store.args||{}}
  method stats (line 49) | stats(){return this.data.stats.npu}
  method view (line 49) | view(){return this.data.views.npu}
  method npus (line 49) | npus(){return this.stats}
  method getDecoration (line 49) | getDecoration(t,e){if(void 0!==this.view[t][e])return this.view[t][e].de...
  method args (line 49) | args(){return this.store.args||{}}
  method stats (line 49) | stats(){return this.data.stats.gpu}
  method view (line 49) | view(){return this.data.views.gpu}
  method gpus (line 49) | gpus(){return this.stats}
  method name (line 49) | name(){let t="GPU";const{stats:e}=this;return 1===e.length?t=e[0].name:e...
  method mean (line 49) | mean(){const t={proc:null,mem:null,temperature:null},{stats:e}=this;if(!...
  method getDecoration (line 49) | getDecoration(t,e){if(void 0!==this.view[t][e])return this.view[t][e].de...
  method stats (line 49) | stats(){return this.data.stats.system}
  method hostname (line 49) | hostname(){return this.stats.hostname}
  method isDisconnected (line 49) | isDisconnected(){return"FAILURE"===this.store.status}
  method ipStats (line 49) | ipStats(){return this.data.stats.ip}
  method address (line 49) | address(){return this.ipStats.address}
  method gateway (line 49) | gateway(){return this.ipStats.gateway}
  method maskCdir (line 49) | maskCdir(){return this.ipStats.mask_cidr}
  method publicAddress (line 49) | publicAddress(){return this.ipStats.public_address}
  method publicInfo (line 49) | publicInfo(){return this.ipStats.public_info_human}
  method stats (line 49) | stats(){return this.data.stats.irq}
  method irqs (line 49) | irqs(){return this.stats.map(t=>({irq_line:t.irq_line,irq_rate:t.irq_rat...
  method stats (line 49) | stats(){return this.data.stats.load}
  method view (line 49) | view(){return this.data.views.load}
  method cpucore (line 49) | cpucore(){return this.stats.cpucore}
  method min1 (line 49) | min1(){return this.stats.min1}
  method min5 (line 49) | min5(){return this.stats.min5}
  method min15 (line 49) | min15(){return this.stats.min15}
  method getDecoration (line 49) | getDecoration(t){if(void 0!==this.view[t])return this.view[t].decoration...
  method config (line 49) | config(){return this.store.config||{}}
  method available_args (line 49) | available_args(){return void 0!==this.config&&void 0!==this.config.mem&&...
  method stats (line 49) | stats(){return this.data.stats.mem}
  method view (line 49) | view(){return this.data.views.mem}
  method percent (line 49) | percent(){return this.stats.percent.toFixed(1)}
  method total (line 49) | total(){return this.stats.total}
  method used (line 49) | used(){return this.stats.used}
  method available (line 49) | available(){return this.stats.available}
  method free (line 49) | free(){return this.stats.free}
  method active (line 49) | active(){return this.stats.active}
  method inactive (line 49) | inactive(){return this.stats.inactive}
  method buffers (line 49) | buffers(){return this.stats.buffers}
  method cached (line 49) | cached(){return this.stats.cached}
  method getDecoration (line 49) | getDecoration(t){if(void 0!==this.view[t])return this.view[t].decoration...
  method stats (line 49) | stats(){return this.data.stats.memswap}
  method view (line 49) | view(){return this.data.views.memswap}
  method percent (line 49) | percent(){return this.stats.percent}
  method total (line 49) | total(){return this.stats.total}
  method used (line 49) | used(){return this.stats.used}
  method free (line 49) | free(){return this.stats.free}
  method getDecoration (line 49) | getDecoration(t){if(void 0!==this.view[t])return this.view[t].decoration...
  method args (line 49) | args(){return this.store.args||{}}
  method stats (line 49) | stats(){return this.data.stats.network}
  method view (line 49) | view(){return this.data.views.network}
  method networks (line 49) | networks(){const t=this.stats.map(t=>{const e=void 0!==t.alias?t.alias:n...
  method hasNetworks (line 49) | hasNetworks(){return this.networks.length>0}
  method getDecoration (line 49) | getDecoration(t,e){if(null!=this.view[t][e])return this.view[t][e].decor...
  method date_custom (line 49) | date_custom(){return this.data.stats.now.custom}
  method args (line 49) | args(){return this.store.args||{}}
  method config (line 49) | config(){return this.store.config||{}}
  method percpuStats (line 49) | percpuStats(){return this.data.stats.percpu}
  method stats (line 49) | stats(){return this.data.stats.ports}
  method ports (line 49) | ports(){return this.stats}
  method hasPorts (line 49) | hasPorts(){return this.ports.length>0}
  method stats (line 49) | stats(){return this.data.stats.amps}
  method processes (line 49) | processes(){return this.stats.filter(t=>null!==t.result)}
  method hasAmps (line 49) | hasAmps(){return this.processes.length>0}
  method getNameDecoration (line 49) | getNameDecoration(t){const e=t.count,r=t.countmin,n=t.countmax;let i="ok...
  method args (line 49) | args(){return this.store.args||{}}
  method stats (line 49) | stats(){return this.data.stats.processcount}
  method total (line 49) | total(){return this.stats.total||0}
  method running (line 49) | running(){return this.stats.running||0}
  method sleeping (line 49) | sleeping(){return this.stats.sleeping||0}
  method stopped (line 49) | stopped(){return this.stats.stopped||0}
  method thread (line 49) | thread(){return this.stats.thread||0}
  method args (line 49) | args(){return this.store.args||{}}
  method config (line 49) | config(){return this.store.config||{}}
  method stats_processlist (line 49) | stats_processlist(){return this.data.stats.processlist}
  method stats_core (line 49) | stats_core(){return this.data.stats.core}
  method cpucore (line 49) | cpucore(){return 0!==this.stats_core.log?this.stats_core.log:1}
  method extended_stats (line 49) | extended_stats(){return this.stats_processlist.find(t=>!0===t.extended_s...
  method processes (line 49) | processes(){const{sorter:t}=this,e=(this.stats_processlist||[]).map(t=>t...
  method ioReadWritePresentProcesses (line 49) | ioReadWritePresentProcesses(){return(this.stats_processlist||[]).some(({...
  method stats_programlist (line 49) | stats_programlist(){return this.data.stats.programlist}
  method programs (line 49) | programs(){const{sorter:t}=this,e=this.data.stats.isWindows,r=(this.stat...
  method ioReadWritePresentPrograms (line 49) | ioReadWritePresentPrograms(){return(this.stats_programlist||[]).some(({i...
  method limit (line 49) | limit(){return void 0!==this.config.outputs?this.config.outputs.max_proc...
  method focus (line 49) | focus(){return void 0!==this.args&&void 0!==this.args.process_focus&&nul...
  method is_focus (line 49) | is_focus(){return this.focus.length>0}
  method setExtendedStats (line 49) | setExtendedStats(t){fetch("api/4/processes/extended/"+t.toString(),{meth...
  method disableExtendedStats (line 49) | disableExtendedStats(){fetch("api/4/processes/extended/disable",{method:...
  method args (line 49) | args(){return this.store.args||{}}
  method sortProcessesKey (line 49) | sortProcessesKey(){return this.args.sort_processes_key}
  method handler (line 49) | handler(t){t&&!["cpu_percent","memory_percent","username","timemillis","...
  method args (line 49) | args(){return this.store.args||{}}
  method config (line 49) | config(){return this.store.config||{}}
  method stats (line 49) | stats(){return this.data.stats.quicklook}
  method view (line 49) | view(){return this.data.views.quicklook}
  method cpu (line 49) | cpu(){return this.stats.cpu}
  method cpu_name (line 49) | cpu_name(){return this.stats.cpu_name}
  method cpu_hz_current (line 49) | cpu_hz_current(){return(this.stats.cpu_hz_current/1e9).toFixed(2)}
  method cpu_hz (line 49) | cpu_hz(){return(this.stats.cpu_hz/1e9).toFixed(2)}
  method percpus (line 49) | percpus(){const t=this.stats.percpu.map(({cpu_number:t,total:e})=>({numb...
  method stats_list_after_cpu (line 49) | stats_list_after_cpu(){return this.view.list.filter(t=>!t.includes("cpu"))}
  method getDecoration (line 49) | getDecoration(t){if(void 0!==this.view[t])return this.view[t].decoration...
  method stats (line 49) | stats(){return this.data.stats.raid}
  method disks (line 49) | disks(){const t=Object.entries(this.stats).map(([t,e])=>{const r=Object....
  method hasDisks (line 49) | hasDisks(){return this.disks.length>0}
  method args (line 49) | args(){return this.store.args||{}}
  method stats (line 49) | stats(){return this.data.stats.sensors}
  method view (line 49) | view(){return this.data.views.sensors}
  method sensors (line 49) | sensors(){return this.stats.map(t=>this.args.fahrenheit&&"battery"!=t.ty...
  method hasSensors (line 49) | hasSensors(){return this.sensors.length>0}
  method getDecoration (line 49) | getDecoration(t){if(void 0!==this.view[t].value.decoration)return this.v...
  method stats (line 49) | stats(){return this.data.stats.smart}
  method drives (line 49) | drives(){return(Array.isArray(this.stats)?this.stats:[]).map(t=>({name:t...
  method hasDrives (line 49) | hasDrives(){return this.drives.length>0}
  method formatted (line 49) | formatted(t){return void 0===t.key?t.raw:this.requiresFormatting(t.key)?...
  method stats (line 49) | stats(){return this.data.stats.system}
  method hostname (line 49) | hostname(){return this.stats.hostname}
  method humanReadableName (line 49) | humanReadableName(){return this.stats.hr_name}
  method isDisconnected (line 49) | isDisconnected(){return"FAILURE"===this.store.status}
  method value (line 49) | value(){return this.data.stats.uptime}
  method args (line 49) | args(){return this.store.args||{}}
  method sortProcessesKey (line 49) | sortProcessesKey(){return this.args.sort_processes_key}
  method stats (line 49) | stats(){return this.data.stats.vms}
  method views (line 49) | views(){return this.data.views.vms}
  method vms (line 49) | vms(){const{sorter:t}=this,e=(this.stats||[]).map(t=>({id:t.id,name:t.na...
  method showEngine (line 49) | showEngine(){return this.views.show_engine_name}
  method handler (line 49) | handler(t){t&&!["load_1min","cpu_time","memory_usage","name"].includes(t...
  method stats (line 49) | stats(){return this.data.stats.wifi}
  method view (line 49) | view(){return this.data.views.wifi}
  method hotspots (line 49) | hotspots(){const t=this.stats.map(t=>{if(""!==t.ssid)return{ssid:t.ssid,...
  method hasHotpots (line 49) | hasHotpots(){return this.hotspots.length>0}
  method getDecoration (line 49) | getDecoration(t,e){if(void 0!==this.view[t.ssid][e])return this.view[t.s...
  method args (line 49) | args(){return this.store.args||{}}
  method config (line 49) | config(){return this.store.config||{}}
  method data (line 49) | data(){return this.store.data||{}}
  method dataLoaded (line 49) | dataLoaded(){return void 0!==this.store.data}
  method hasNpu (line 49) | hasNpu(){return this.store.data.stats.npu.length>0}
  method hasGpu (line 49) | hasGpu(){return this.store.data.stats.gpu.length
Condensed preview — 434 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,841K chars).
[
  {
    "path": ".cgcignore",
    "chars": 93,
    "preview": "/.git/\n/.venv/\n/.venv-uv/\n/docker-compose/\n/docker-files/\n/docs/\n/snap/\n/tests/\n/tests-data/\n"
  },
  {
    "path": ".claude/settings.json",
    "chars": 987,
    "preview": "{\n  \"skills\": {\n    \"test\": {\n      \"description\": \"Run the appropriate test suite based on changed files\",\n      \"path\""
  },
  {
    "path": ".claude/skills/debug.md",
    "chars": 1720,
    "preview": "# Skill: Debug a Glances Issue\n\nHelp diagnose and fix a bug in Glances.\n\n## Instructions\n\n1. **Understand the issue**: A"
  },
  {
    "path": ".claude/skills/docker.md",
    "chars": 1662,
    "preview": "# Skill: Build and Run Docker Images\n\nBuild, run, and troubleshoot Glances Docker images locally.\n\n## Instructions\n\n### "
  },
  {
    "path": ".claude/skills/lint.md",
    "chars": 791,
    "preview": "# Skill: Lint and Format\n\nRun code formatting and linting on the Glances codebase.\n\n## Instructions\n\n1. Run formatting f"
  },
  {
    "path": ".claude/skills/new-export.md",
    "chars": 3444,
    "preview": "# Skill: Create a New Export Module\n\nScaffold a new Glances export module following project conventions.\n\n## Instruction"
  },
  {
    "path": ".claude/skills/new-plugin.md",
    "chars": 2499,
    "preview": "# Skill: Create a New Plugin\n\nScaffold a new Glances monitoring plugin following project conventions.\n\n## Instructions\n\n"
  },
  {
    "path": ".claude/skills/review.md",
    "chars": 1800,
    "preview": "# Skill: Review Code Changes\n\nReview the current changes (staged or unstaged) against Glances project guidelines.\n\n## In"
  },
  {
    "path": ".claude/skills/test.md",
    "chars": 1727,
    "preview": "# Skill: Run Tests\n\nRun the appropriate Glances test suite based on the current changes or user request.\n\n## Instruction"
  },
  {
    "path": ".claude/skills/webui.md",
    "chars": 1287,
    "preview": "# Skill: Build and Work with the WebUI\n\nBuild, update, or troubleshoot the Glances Vue.js WebUI.\n\n## Instructions\n\n### B"
  },
  {
    "path": ".coveragerc",
    "chars": 542,
    "preview": "[report]\n\ninclude =\n    *glances*\n\nomit =\n    glances/outputs/*\n    glances/exports/*\n    glances/compat.py\n    glances/"
  },
  {
    "path": ".dockerignore",
    "chars": 404,
    "preview": "# Ignore everything\n*\n\n# Include only code files\n!/glances/**/*.py\n\n# Include WebUI files (remove when webui moved to se"
  },
  {
    "path": ".gitattributes",
    "chars": 56,
    "preview": "glances/outputs/static/public/* -diff linguist-vendored\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 65,
    "preview": "# These are supported funding model platforms\n\ngithub: nicolargo\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1347,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n**Check the bug**"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 595,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 1143,
    "preview": "Before filling this issue, please read the manual (https://glances.readthedocs.io/en/latest/) and search if the bug do n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 334,
    "preview": "#### Description\n\nPlease describe the goal of this pull request.\n\nFor any questions concerning installation or use, plea"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 345,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n  "
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 2518,
    "preview": "# This pipeline aims at building Glances Pypi packages\n\nname: build\n\non:\n  workflow_call:\n\njobs:\n\n  build:\n    name: Bui"
  },
  {
    "path": ".github/workflows/build_docker.yml",
    "chars": 4143,
    "preview": "# This pipeline aims at building Glances Docker images\n\nname: build_docker\n\nenv:\n  DEFAULT_DOCKER_IMAGE: nicolargo/glanc"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1543,
    "preview": "name: ci\n\non:\n    pull_request:\n      branches: [ develop ]\n    push:\n      branches: [ master, develop ]\n      tags:\n  "
  },
  {
    "path": ".github/workflows/cyber.yml",
    "chars": 872,
    "preview": "name: cyber\n\non:\n    workflow_call:\n\njobs:\n  trivy:\n    name: Trivy scan\n    continue-on-error: true\n    timeout-minutes"
  },
  {
    "path": ".github/workflows/inactive_issues.yml",
    "chars": 793,
    "preview": "name: Label inactive issues\non:\n  schedule:\n    - cron: \"30 1 * * *\"\n\npermissions: {}\n\njobs:\n  close-issues:\n    runs-on"
  },
  {
    "path": ".github/workflows/needs_contributor.yml",
    "chars": 742,
    "preview": "name: Add a message when needs contributor tag is used\non:\n  issues:\n    types:\n      - labeled\n\npermissions: {}\n\njobs:\n"
  },
  {
    "path": ".github/workflows/quality.yml",
    "chars": 2033,
    "preview": "name: quality\n\non:\n  workflow_call:\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n    timeout-minutes: "
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 5069,
    "preview": "# Run unitary test\n\nname: test\n\non:\n  workflow_call:\n\njobs:\n\n  source-code-checks:\n    runs-on: ubuntu-24.04\n    timeout"
  },
  {
    "path": ".github/workflows/webui.yml",
    "chars": 1313,
    "preview": "name: webui\n\non:\n  workflow_call:\n\njobs:\n  build:\n    # continue-on-error: true\n    timeout-minutes: 10\n\n    runs-on: ub"
  },
  {
    "path": ".gitignore",
    "chars": 892,
    "preview": "*~\r\n*.py[co]\r\n\r\n# Packages\r\n*.egg\r\n*.egg-info\r\ndist\r\nbuild\r\n\r\n# Eclipse and other IDE\r\n.idea\r\n*.pydevproject\r\n.project\r\n"
  },
  {
    "path": ".mailmap",
    "chars": 1006,
    "preview": "Nicolas Hennion <nicolashennion@gmail.com> Nicolargo <nicolas@nicolargo.com>\nNicolas Hennion <nicolashennion@gmail.com> "
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 3587,
    "preview": "repos:\n  - repo: https://github.com/gitleaks/gitleaks\n    rev: v8.24.2\n    hooks:\n      - id: gitleaks\n        name: \"🔒 "
  },
  {
    "path": ".readthedocs.yaml",
    "chars": 951,
    "preview": "# Read the Docs configuration file for Glances projects\n\n# Required\nversion: 2\n\n# Set the OS, Python version and other t"
  },
  {
    "path": ".reuse/dep5",
    "chars": 308,
    "preview": "Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\nUpstream-Name: Glances\nUpstream-Contact: Nico"
  },
  {
    "path": "AUTHORS",
    "chars": 2052,
    "preview": "==========\nDevelopers\n==========\n\nNicolas Hennion (aka) Nicolargo\nhttp://blog.nicolargo.com\nhttps://twitter.com/nicolarg"
  },
  {
    "path": "CLAUDE.md",
    "chars": 12439,
    "preview": "# CLAUDE.md — Glances Maintainer Context\n\n> Auto-loaded by Claude Code at the start of every session.\n> Describes my rol"
  },
  {
    "path": "CODE-OF-CONDUCT.md",
    "chars": 3231,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 6144,
    "preview": "# Contributing to Glances\n\nLooking to contribute something to Glances ? **Here's how you can help.**\n\nPlease take a mome"
  },
  {
    "path": "COPYING",
    "chars": 41933,
    "preview": "GNU LESSER GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n\nCopyright (C) 2007 Free Software Foundation, Inc. <http://fsf"
  },
  {
    "path": "LICENSES/LGPL-3.0-only.txt",
    "chars": 41933,
    "preview": "GNU LESSER GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n\nCopyright (C) 2007 Free Software Foundation, Inc. <http://fsf"
  },
  {
    "path": "MANIFEST.in",
    "chars": 352,
    "preview": "include AUTHORS\ninclude CONTRIBUTING.md\ninclude COPYING\ninclude NEWS.rst\ninclude README.rst\ninclude README-pypi.rst\nincl"
  },
  {
    "path": "Makefile",
    "chars": 16089,
    "preview": "PORT     \t  ?= 8008\nCONF     \t  := conf/glances.conf\nLASTTAG  \t   = $(shell git describe --tags --abbrev=0)\n\nIMAGES_TYPE"
  },
  {
    "path": "NEWS.rst",
    "chars": 97055,
    "preview": "==============================================================================\n                                Glances C"
  },
  {
    "path": "README-pypi.rst",
    "chars": 12898,
    "preview": "Glances 🌟\n==========\n\n**Glances** is an open-source system cross-platform monitoring tool.\nIt allows real-time monitorin"
  },
  {
    "path": "README.rst",
    "chars": 22229,
    "preview": ".. raw:: html\n\n   <div align=\"center\">\n\n.. image:: ./docs/_static/glances-responsive-webdesign.png\n\n.. raw:: html\n\n   <h"
  },
  {
    "path": "SECURITY.md",
    "chars": 1391,
    "preview": "# Security Policy\n\n## Supported Versions\n\n| Version | Support security updates |\n| ------- | ------------------------ |\n"
  },
  {
    "path": "all-requirements.txt",
    "chars": 6175,
    "preview": "# This file was autogenerated by uv via the following command:\n#    uv export --no-emit-workspace --no-hashes --all-extr"
  },
  {
    "path": "appveyor.yml",
    "chars": 469,
    "preview": "image: Visual Studio 2022\n\nenvironment:\n  matrix:\n    - PYTHON: \"C:\\\\Python310-x64\"\n    - PYTHON: \"C:\\\\Python311-x64\"\n  "
  },
  {
    "path": "conf/empty.conf",
    "chars": 28,
    "preview": "# Empty conf, only for test\n"
  },
  {
    "path": "conf/fetch-templates/short.jinja",
    "chars": 1021,
    "preview": "✨ {{ gl.system['hostname'] }}{{ ' - ' + gl.ip['address'] if gl.ip['address'] else '' }}\n⚙️  {{ gl.system['hr_name'] }} |"
  },
  {
    "path": "conf/fetch-templates/with-logo.jinja",
    "chars": 2034,
    "preview": "                      _____ _\n                     / ____| |\n                    | |  __| | __ _ _ __   ___ ___  ___\n   "
  },
  {
    "path": "conf/glances-grafana-flux.json",
    "chars": 50947,
    "preview": "{\n\t\"__inputs\": [\n\t\t{\n\t\t\t\"name\": \"DS_GLANCES\",\n\t\t\t\"label\": \"glances\",\n\t\t\t\"description\": \"\",\n\t\t\t\"type\": \"datasource\",\n\t\t\t\""
  },
  {
    "path": "conf/glances-grafana-influxql.json",
    "chars": 51019,
    "preview": "{\n\t\"__inputs\": [\n\t\t{\n\t\t\t\"name\": \"DS_GLANCES\",\n\t\t\t\"label\": \"glances\",\n\t\t\t\"description\": \"\",\n\t\t\t\"type\": \"datasource\",\n\t\t\t\""
  },
  {
    "path": "conf/glances.conf",
    "chars": 32164,
    "preview": "##############################################################################\n# Globals Glances parameters\n############"
  },
  {
    "path": "dev-requirements.txt",
    "chars": 8912,
    "preview": "# This file was autogenerated by uv via the following command:\n#    uv export --no-hashes --only-dev --output-file dev-r"
  },
  {
    "path": "docker-bin.sh",
    "chars": 45,
    "preview": "#!/bin/sh\n\n/venv/bin/python3 -m glances \"$@\"\n"
  },
  {
    "path": "docker-compose/docker-compose.yml",
    "chars": 2176,
    "preview": "services:\n  glances:\n    # See all images tags here: https://hub.docker.com/r/nicolargo/glances/tags\n    image: nicolarg"
  },
  {
    "path": "docker-compose/glances.conf",
    "chars": 32166,
    "preview": "##############################################################################\n# Globals Glances parameters\n############"
  },
  {
    "path": "docker-files/README.md",
    "chars": 106,
    "preview": "# Dockerfiles\n\n```bash\nmake docker\n```\n\nThen test the image with:\n\n```bash\nmake run-docker-alpine-dev\n```\n"
  },
  {
    "path": "docker-files/alpine.Dockerfile",
    "chars": 4362,
    "preview": "#\n# Glances Dockerfile (based on Alpine)\n#\n# https://github.com/nicolargo/glances\n#\n\n# Note: ENV is for future running c"
  },
  {
    "path": "docker-files/docker-logger.json",
    "chars": 896,
    "preview": "{\n\t\"version\": 1,\n\t\"disable_existing_loggers\": \"False\",\n\t\"root\": { \"level\": \"INFO\", \"handlers\": [\"console\"] },\n\t\"formatte"
  },
  {
    "path": "docker-files/ubuntu.Dockerfile",
    "chars": 4121,
    "preview": "#\n# Glances Dockerfile (based on Ubuntu)\n#\n# https://github.com/nicolargo/glances\n#\n\n# WARNING: the versions should be s"
  },
  {
    "path": "docker-requirements.txt",
    "chars": 3406,
    "preview": "# This file was autogenerated by uv via the following command:\n#    uv export --no-emit-workspace --no-hashes --no-group"
  },
  {
    "path": "docs/Makefile",
    "chars": 7766,
    "preview": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD "
  },
  {
    "path": "docs/README.txt",
    "chars": 281,
    "preview": "Building the docs\n=================\n\nFirst install Sphinx and the RTD theme:\n\n    make venv\n\nor update it if already ins"
  },
  {
    "path": "docs/_static/glances-architecture.excalidraw",
    "chars": 56273,
    "preview": "{\n  \"type\": \"excalidraw\",\n  \"version\": 2,\n  \"source\": \"https://excalidraw.com\",\n  \"elements\": [\n    {\n      \"type\": \"rec"
  },
  {
    "path": "docs/_static/glances-pyinstrument.html",
    "chars": 2658860,
    "preview": "<!DOCTYPE html>\n            <html>\n            <head>\n                <meta charset=\"utf-8\">\n            </head>\n       "
  },
  {
    "path": "docs/_templates/links.html",
    "chars": 357,
    "preview": "<h3>Useful Links</h3>\n<ul>\n  <li><a href=\"https://pypi.python.org/pypi/Glances\">Glances @ PyPI</a></li>\n  <li><a href=\"h"
  },
  {
    "path": "docs/aoa/actions.rst",
    "chars": 3538,
    "preview": ".. _actions:\n\nActions\n=======\n\nGlances can trigger actions on events for warning and critical thresholds.\n\nBy ``action``"
  },
  {
    "path": "docs/aoa/amps.rst",
    "chars": 3754,
    "preview": ".. _amps:\n\nApplications Monitoring Process\n===============================\n\nThanks to Glances and its AMP module, you ca"
  },
  {
    "path": "docs/aoa/cloud.rst",
    "chars": 408,
    "preview": ".. _cloud:\n\nCLOUD\n=====\n\nThis plugin displays information about the cloud provider if your host is running on OpenStack."
  },
  {
    "path": "docs/aoa/connections.rst",
    "chars": 1059,
    "preview": ".. _connections:\n\nConnections\n===========\n\n.. image:: ../_static/connections.png\n\nThis plugin display extended informati"
  },
  {
    "path": "docs/aoa/containers.rst",
    "chars": 2916,
    "preview": ".. _containers:\n\nContainers\n==========\n\nIf you use ``containers``, Glances can help you to monitor your Docker, Podman,\n"
  },
  {
    "path": "docs/aoa/cpu.rst",
    "chars": 3653,
    "preview": ".. _cpu:\n\nCPU\n===\n\nThe CPU stats are shown as a percentage or values and for the configured\nrefresh time.\n\nThe total CPU"
  },
  {
    "path": "docs/aoa/diskio.rst",
    "chars": 2032,
    "preview": ".. _disk:\n\nDisk I/O\n========\n\n.. image:: ../_static/diskio.png\n\nGlances displays the disk I/O throughput, count and mean"
  },
  {
    "path": "docs/aoa/events.rst",
    "chars": 1034,
    "preview": ".. _events:\n\nevents\n======\n\n.. image:: ../_static/events.png\n\nEvents list is displayed in the bottom of the screen if an"
  },
  {
    "path": "docs/aoa/folders.rst",
    "chars": 1144,
    "preview": ".. _folders:\n\nFolders\n=======\n\nThe folders plugin allows user, through the configuration file, to\nmonitor size of a pred"
  },
  {
    "path": "docs/aoa/fs.rst",
    "chars": 1839,
    "preview": ".. _fs:\n\nFile System\n===========\n\n.. image:: ../_static/fs.png\n\nGlances displays the used and total file system disk spa"
  },
  {
    "path": "docs/aoa/gpu.rst",
    "chars": 1388,
    "preview": ".. _gpu:\n\nGPU\n===\n\nFor the moment, following GPU are supported:\n- NVidia (thanks to the `nvidia-ml-py`_ library)\n- AMD ("
  },
  {
    "path": "docs/aoa/hddtemp.rst",
    "chars": 923,
    "preview": ".. _sensors:\n\nHDD temperature sensor\n======================\n\n*Availability: Linux*\n\nThis plugin will add HDD temperature"
  },
  {
    "path": "docs/aoa/header.rst",
    "chars": 2826,
    "preview": ".. _header:\n\nHeader\n======\n\n.. image:: ../_static/header.png\n\nThe header shows the hostname, OS name, release version, p"
  },
  {
    "path": "docs/aoa/index.rst",
    "chars": 643,
    "preview": ".. _aoa:\n\nAnatomy Of The Application\n==========================\n\nThis document is meant to give an overview of the Glanc"
  },
  {
    "path": "docs/aoa/irq.rst",
    "chars": 556,
    "preview": ".. _irq:\n\nIRQ\n===\n\n*Availability: Linux*\n\nThis plugin is disable by default, please use the --enable irq option\nto enabl"
  },
  {
    "path": "docs/aoa/load.rst",
    "chars": 2844,
    "preview": ".. _load:\n\nLoad\n====\n\n*Availability: Unix and Windows with a PsUtil version >= 5.6.2*\n\n.. image:: ../_static/load.png\n\nO"
  },
  {
    "path": "docs/aoa/memory.rst",
    "chars": 2979,
    "preview": ".. _memory:\n\nMemory\n======\n\nGlances uses two columns: one for the ``RAM`` and one for the ``SWAP``.\n\n.. image:: ../_stat"
  },
  {
    "path": "docs/aoa/network.rst",
    "chars": 2644,
    "preview": ".. _network:\n\nNetwork\n=======\n\n.. image:: ../_static/network.png\n\nGlances displays the network interface bit rate. The u"
  },
  {
    "path": "docs/aoa/npu.rst",
    "chars": 518,
    "preview": ".. _npu:\n\nNPU\n===\n\nNote: this plugin is disable by default in glances.conf file.\n\nFor the moment, only following NPU are"
  },
  {
    "path": "docs/aoa/ports.rst",
    "chars": 1991,
    "preview": ".. _ports:\n\nPorts\n=====\n\n*Availability: All*\n\n.. image:: ../_static/ports.png\n\nThis plugin aims at providing a list of h"
  },
  {
    "path": "docs/aoa/ps.rst",
    "chars": 11226,
    "preview": ".. _ps:\n\nProcesses List\n==============\n\nCompact view:\n\n.. image:: ../_static/processlist.png\n\nFull view:\n\n.. image:: ../"
  },
  {
    "path": "docs/aoa/quicklook.rst",
    "chars": 1266,
    "preview": ".. _quicklook:\n\nQuick Look\n==========\n\nThe ``quicklook`` plugin is only displayed on wide screen and proposes a\nbar view"
  },
  {
    "path": "docs/aoa/raid.rst",
    "chars": 550,
    "preview": ".. _raid:\n\nRAID\n====\n\n*Availability: Linux*\n\n*Dependency: this plugin uses the optional pymdstat Python lib*\n\nThis plugi"
  },
  {
    "path": "docs/aoa/sensors.rst",
    "chars": 1955,
    "preview": ".. _sensors:\n\nSensors\n=======\n\n*Availability: Linux*\n\n.. image:: ../_static/sensors.png\n\nGlances can display the sensors"
  },
  {
    "path": "docs/aoa/smart.rst",
    "chars": 1327,
    "preview": ".. _smart:\n\nSMART\n=====\n\n*Availability: all but Mac OS*\n\n*Dependency: this plugin uses the optional pySMART Python lib*\n"
  },
  {
    "path": "docs/aoa/vms.rst",
    "chars": 1204,
    "preview": ".. _vms:\n\nVMs\n===\n\nGlances ``vms`` plugin is designed to display stats about VMs ran on the host.\n\nIt's actually support"
  },
  {
    "path": "docs/aoa/wifi.rst",
    "chars": 623,
    "preview": ".. _wifi:\n\nWi-Fi\n=====\n\n*Availability: Linux (with an /proc/net/wireless file) only*\n\n.. image:: ../_static/wifi.png\n\nIn"
  },
  {
    "path": "docs/api/mcp.rst",
    "chars": 6907,
    "preview": ".. _api_mcp:\n\nMCP (Model Context Protocol) server\n=====================================\n\nGlances can expose its system m"
  },
  {
    "path": "docs/api/openapi.json",
    "chars": 22826,
    "preview": "{\"openapi\": \"3.0.2\", \"info\": {\"title\": \"FastAPI\", \"version\": \"0.1.0\"}, \"paths\": {\"/api/4/status\": {\"get\": {\"summary\": \" "
  },
  {
    "path": "docs/api/python.rst",
    "chars": 53318,
    "preview": ".. _api:\n\nPython API documentation\n========================\n\nThis documentation describes the Glances Python API.\n\nNote:"
  },
  {
    "path": "docs/api/restful.rst",
    "chars": 78454,
    "preview": ".. _api_restful:\n\nRestful/JSON API documentation\n==============================\n\nThis documentation describes the Glance"
  },
  {
    "path": "docs/build.sh",
    "chars": 50,
    "preview": "#!/bin/sh\n\nmake clean\nmake html\nLC_ALL=C make man\n"
  },
  {
    "path": "docs/cmds.rst",
    "chars": 8453,
    "preview": ".. _cmds:\n\nCommand Reference\n=================\n\nCommand-Line Options\n--------------------\n\n.. option:: -h, --help\n\n    s"
  },
  {
    "path": "docs/conf.py",
    "chars": 9762,
    "preview": "#\n# Glances documentation build configuration file, created by\n# sphinx-quickstart on Tue Mar  1 10:53:59 2016.\n#\n# This"
  },
  {
    "path": "docs/config.rst",
    "chars": 7964,
    "preview": ".. _config:\n\nConfiguration\n=============\n\nNo configuration file is mandatory to use Glances.\n\nFurthermore, a configurati"
  },
  {
    "path": "docs/dev/README.txt",
    "chars": 457,
    "preview": "Glances profiling\n=================\n\nFirst install Sphinx and the RTD theme:\n\n    apt install graphviz\n    pip install g"
  },
  {
    "path": "docs/docker.rst",
    "chars": 8375,
    "preview": ".. _docker:\n\nDocker\n======\n\nGlances can be installed through Docker, allowing you to run it without\ninstalling all the P"
  },
  {
    "path": "docs/faq.rst",
    "chars": 1668,
    "preview": ".. _faq:\n\nF.A.Q\n=====\n\nAny encoding issue ?\n--------------------\n\nTry to run Glances with the following command line:\n\n "
  },
  {
    "path": "docs/fetch.rst",
    "chars": 2827,
    "preview": ".. _fetch:\n\nFetch\n=====\n\nThe fetch mode is used to get and share a quick look of a machine using the\n``fetch`` option. I"
  },
  {
    "path": "docs/glances.rst",
    "chars": 2029,
    "preview": ":orphan:\n\nglances\n=======\n\nSYNOPSIS\n--------\n\n**glances** [OPTIONS]\n\nDESCRIPTION\n-----------\n\n**glances** is a cross-pla"
  },
  {
    "path": "docs/gw/cassandra.rst",
    "chars": 756,
    "preview": ".. _cassandra:\n\nCassandra\n=========\n\nYou can export statistics to a ``Cassandra`` or ``Scylla`` server.\nThe connection s"
  },
  {
    "path": "docs/gw/couchdb.rst",
    "chars": 1094,
    "preview": ".. _couchdb:\n\nCouchDB\n=======\n\nYou can export statistics to a ``CouchDB`` server.\nThe connection should be defined in th"
  },
  {
    "path": "docs/gw/csv.rst",
    "chars": 843,
    "preview": ".. _csv:\n\nCSV\n===\n\nIt's possible to export stats to a CSV file.\n\n.. code-block:: console\n\n    $ glances --export csv --e"
  },
  {
    "path": "docs/gw/duckdb.rst",
    "chars": 13120,
    "preview": ".. _duckdb:\n\nDuckDB\n===========\n\nWarning: For the moment the DuckDB lib is not configure as a dependency of Glances beca"
  },
  {
    "path": "docs/gw/elastic.rst",
    "chars": 500,
    "preview": ".. _elastic:\n\nElasticsearch\n=============\n.. note::\n    You need to install the `elasticsearch`_ library on your system."
  },
  {
    "path": "docs/gw/graph.rst",
    "chars": 1141,
    "preview": ".. _graph:\n\nGraph\n======\n\nYou can generate dynamic graphs (SVG format) in a target folder. The generation\nstarts every t"
  },
  {
    "path": "docs/gw/graphite.rst",
    "chars": 836,
    "preview": ".. _graphite:\n\nGraphite\n========\n\nYou can export statistics to a ``Graphite`` server (time series server).\n\nThe connecti"
  },
  {
    "path": "docs/gw/index.rst",
    "chars": 905,
    "preview": ".. _gw:\n\nGateway To Other Services\n=========================\n\nGlances can exports stats in files or to other services li"
  },
  {
    "path": "docs/gw/influxdb.rst",
    "chars": 5844,
    "preview": ".. _influxdb:\n\nInfluxDB\n========\n\nYou can export statistics to an ``InfluxDB`` server (time series server).\n\nIn Glances "
  },
  {
    "path": "docs/gw/json.rst",
    "chars": 159,
    "preview": ".. _json:\n\nJSON\n====\n\nIt's possible to export stats to a JSON file.\n\n.. code-block:: console\n\n    $ glances --export jso"
  },
  {
    "path": "docs/gw/kafka.rst",
    "chars": 1460,
    "preview": ".. _kafka:\n\nKafka\n=====\n\nYou can export statistics to a ``Kafka`` server.\nThe connection should be defined in the Glance"
  },
  {
    "path": "docs/gw/mongodb.rst",
    "chars": 851,
    "preview": ".. _couchdb:\n\nMongoDB\n=======\n\nYou can export statistics to a ``MongoDB`` server.\nThe connection should be defined in th"
  },
  {
    "path": "docs/gw/mqtt.rst",
    "chars": 700,
    "preview": ".. _mqtt:\n\nMQTT\n========\n\nYou can export statistics to an ``MQTT`` server. The\nconnection should be defined in the Glanc"
  },
  {
    "path": "docs/gw/nats.rst",
    "chars": 1264,
    "preview": ".. _nats:\n\nNATS\n====\n\nNATS is a message broker.\n\nYou can export statistics to a ``NATS`` server.\n\nThe connection should "
  },
  {
    "path": "docs/gw/opentsdb.rst",
    "chars": 386,
    "preview": ".. _opentsdb:\n\nOpenTSDB\n========\n\nYou can export statistics to an ``OpenTSDB`` server (time series server).\nThe connecti"
  },
  {
    "path": "docs/gw/prometheus.rst",
    "chars": 1196,
    "preview": ".. _prometheus:\n\nPrometheus\n==========\n\nYou can export statistics to a ``Prometheus`` server through an exporter.\nWhen t"
  },
  {
    "path": "docs/gw/rabbitmq.rst",
    "chars": 415,
    "preview": ".. _rabbitmq:\n\nRabbitMQ\n========\n\nYou can export statistics to an ``RabbitMQ`` server (AMQP Broker). The\nconnection shou"
  },
  {
    "path": "docs/gw/restful.rst",
    "chars": 845,
    "preview": ".. _restful:\n\nRESTful\n=======\n\nYou can export statistics to a ``RESTful`` JSON server. All the available stats\nwill be e"
  },
  {
    "path": "docs/gw/riemann.rst",
    "chars": 333,
    "preview": ".. _riemann:\n\nRiemann\n=======\n\nYou can export statistics to a ``Riemann`` server (using TCP protocol).\nThe connection sh"
  },
  {
    "path": "docs/gw/statsd.rst",
    "chars": 580,
    "preview": ".. _statsd:\n\nStatsD\n======\n\nYou can export statistics to a ``StatsD`` server (welcome to Graphite!).\nThe connection shou"
  },
  {
    "path": "docs/gw/timescaledb.rst",
    "chars": 1242,
    "preview": ".. _timescale:\n\nTimeScaleDB\n===========\n\nTimescaleDB is a time-series database built on top of PostgreSQL.\n\nYou can expo"
  },
  {
    "path": "docs/gw/zeromq.rst",
    "chars": 1196,
    "preview": ".. _zeromq:\n\nZeroMQ\n======\n\nYou can export statistics to a ``ZeroMQ`` server.\n\nThe connection should be defined in the G"
  },
  {
    "path": "docs/index.rst",
    "chars": 1046,
    "preview": "Glances\n=======\n\n.. image:: _static/screenshot-wide.png\n\nGlances is a cross-platform monitoring tool that aims to presen"
  },
  {
    "path": "docs/install.rst",
    "chars": 1473,
    "preview": ".. _install:\n\nInstall\n=======\n\nGlances is available on ``PyPI``. By using PyPI, you are sure to have the\nlatest stable v"
  },
  {
    "path": "docs/make.bat",
    "chars": 7251,
    "preview": "@ECHO OFF\r\n\r\nREM Command file for Sphinx documentation\r\n\r\nif \"%SPHINXBUILD%\" == \"\" (\r\n\tset SPHINXBUILD=sphinx-build\r\n)\r\n"
  },
  {
    "path": "docs/man/glances.1",
    "chars": 21181,
    "preview": "'\\\" t\n.\\\" Man page generated from reStructuredText\n.\\\" by the Docutils 0.22.4 manpage writer.\n.\n.\n.nr rst2man-indent-lev"
  },
  {
    "path": "docs/quickstart.rst",
    "chars": 7182,
    "preview": ".. _quickstart:\n\nQuickstart\n==========\n\nThis page gives a good introduction to how to get started with Glances.\nGlances "
  },
  {
    "path": "docs/support.rst",
    "chars": 326,
    "preview": ".. _support:\n\nSupport\n=======\n\nTo post a question about Glances use cases, please post it to the\nofficial Q&A `forum\n<ht"
  },
  {
    "path": "generate_openapi.py",
    "chars": 1032,
    "preview": "import json\nfrom unittest.mock import patch\n\nfrom fastapi.openapi.utils import get_openapi\n\nfrom glances.main import Gla"
  },
  {
    "path": "generate_webui_conf.py",
    "chars": 273,
    "preview": "import json\n\nfrom glances.outputs.glances_curses import _GlancesCurses\n\nprint(\n    json.dumps(\n        {\n            \"to"
  },
  {
    "path": "glances/README.txt",
    "chars": 189,
    "preview": "You are in the main Glances source folder. This page is **ONLY** for developers.\n\nIf you are looking for the user manual"
  },
  {
    "path": "glances/__init__.py",
    "chars": 5858,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/__main__.py",
    "chars": 309,
    "preview": "#\n# Glances - An eye on your system\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Li"
  },
  {
    "path": "glances/actions.py",
    "chars": 3967,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/amps/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "glances/amps/amp.py",
    "chars": 6255,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/amps/default/__init__.py",
    "chars": 2022,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/amps/nginx/__init__.py",
    "chars": 2575,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/amps/systemd/__init__.py",
    "chars": 2517,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/amps/systemv/__init__.py",
    "chars": 2371,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/amps_list.py",
    "chars": 5180,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/api.py",
    "chars": 5238,
    "preview": "#\n# Glances - An eye on your system\n#\n# SPDX-FileCopyrightText: 2025 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Li"
  },
  {
    "path": "glances/attribute.py",
    "chars": 3513,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/client.py",
    "chars": 10269,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/client_browser.py",
    "chars": 5642,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/config.py",
    "chars": 14040,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/cpu_percent.py",
    "chars": 10909,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/event.py",
    "chars": 2844,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/events_list.py",
    "chars": 15762,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/README.rst",
    "chars": 717,
    "preview": "===============\nGlances experts\n===============\n\nThis is the Glances exporters folder.\n\nA Glances exporter is a Python m"
  },
  {
    "path": "glances/exports/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "glances/exports/export.py",
    "chars": 12841,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2026 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/export_asyncio.py",
    "chars": 5856,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2026 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_cassandra/__init__.py",
    "chars": 4291,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_couchdb/__init__.py",
    "chars": 2645,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_csv/__init__.py",
    "chars": 4084,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_duckdb/__init__.py",
    "chars": 7831,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2025 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_elasticsearch/__init__.py",
    "chars": 2779,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_graph/__init__.py",
    "chars": 4387,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_graphite/__init__.py",
    "chars": 3195,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_influxdb/__init__.py",
    "chars": 3353,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_influxdb2/__init__.py",
    "chars": 4108,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_influxdb3/__init__.py",
    "chars": 3067,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2025 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_json/__init__.py",
    "chars": 1936,
    "preview": "\"\"\"JSON interface class.\"\"\"\n\nimport sys\n\nfrom glances.exports.export import GlancesExport\nfrom glances.globals import js"
  },
  {
    "path": "glances/exports/glances_kafka/__init__.py",
    "chars": 2748,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_mongodb/__init__.py",
    "chars": 2204,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_mqtt/__init__.py",
    "chars": 5826,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_nats/__init__.py",
    "chars": 4714,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2026 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_opentsdb/__init__.py",
    "chars": 2395,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_prometheus/__init__.py",
    "chars": 3531,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_rabbitmq/__init__.py",
    "chars": 2749,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_restful/__init__.py",
    "chars": 2101,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_riemann/__init__.py",
    "chars": 1925,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_statsd/__init__.py",
    "chars": 2182,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_timescaledb/__init__.py",
    "chars": 10430,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2025 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/exports/glances_zeromq/__init__.py",
    "chars": 2764,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/filter.py",
    "chars": 5779,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/folder_list.py",
    "chars": 5884,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/globals.py",
    "chars": 24672,
    "preview": "# ruff: noqa: F401\n#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo"
  },
  {
    "path": "glances/history.py",
    "chars": 1376,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/jwt_utils.py",
    "chars": 3150,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2026 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/logger.py",
    "chars": 3231,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/main.py",
    "chars": 33825,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/outdated.py",
    "chars": 5795,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/outputs/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "glances/outputs/glances_bars.py",
    "chars": 3690,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/outputs/glances_colors.py",
    "chars": 6169,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/outputs/glances_curses.py",
    "chars": 47804,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/outputs/glances_curses_browser.py",
    "chars": 13812,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/outputs/glances_json_serializer.py",
    "chars": 5952,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/outputs/glances_mcp.py",
    "chars": 16684,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/outputs/glances_restful_api.py",
    "chars": 53688,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  },
  {
    "path": "glances/outputs/glances_sparklines.py",
    "chars": 2568,
    "preview": "#\n# This file is part of Glances.\n#\n# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>\n#\n# SPDX-Lice"
  }
]

// ... and 234 more files (download for full content)

About this extraction

This page contains the full source code of the nicolargo/glances GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 434 files (6.1 MB), approximately 1.6M tokens, and a symbol index with 3995 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!