diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 6aca5569..8a1dd896 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -43,8 +43,6 @@ binaries across the Windows, Linux, and macOS targets. First-party modules | `@floating-ui/dom` | 1.7.6 | MIT | | `@floating-ui/react-dom` | 2.1.8 | MIT | | `@floating-ui/utils` | 0.2.11 | MIT | -| `@napi-rs/canvas` | 0.1.99 | MIT | -| `@napi-rs/canvas-darwin-arm64` | 0.1.99 | MIT | | `@noble/hashes` | 2.2.0 | MIT | | `@nvidia/foundations-react-core` | 1.0.0 | Apache-2.0 | | `@radix-ui/number` | 1.1.1 | MIT | @@ -115,41 +113,29 @@ binaries across the Windows, Linux, and macOS targets. First-party modules | `@shikijs/types` | 4.0.2 | MIT | | `@shikijs/vscode-textmate` | 10.0.2 | MIT | | `@tabby_ai/hijri-converter` | 1.0.5 | MIT | -| `@types/debug` | 4.1.13 | MIT | -| `@types/estree` | 1.0.8 | MIT | -| `@types/estree-jsx` | 1.0.5 | MIT | | `@types/hast` | 3.0.4 | MIT | | `@types/mdast` | 4.0.4 | MIT | -| `@types/ms` | 2.1.0 | MIT | | `@types/node` | 24.13.2 | MIT | | `@types/react` | 19.2.14 | MIT | | `@types/react-dom` | 19.2.3 | MIT | | `@types/trusted-types` | 2.0.7 | MIT | -| `@types/unist` | 2.0.11 | MIT | | `@types/unist` | 3.0.3 | MIT | | `@ungap/structured-clone` | 1.3.0 | ISC | -| `@xmldom/xmldom` | 0.8.13 | MIT | -| `argparse` | 1.0.10 | MIT | +| `agent-base` | 6.0.2 | MIT | | `argparse` | 2.0.1 | Python-2.0 | | `aria-hidden` | 1.2.6 | MIT | | `asynckit` | 0.4.0 | MIT | -| `axios` | 1.16.0 | MIT | -| `bail` | 2.0.2 | MIT | -| `base64-js` | 1.5.1 | MIT | +| `axios` | 1.18.0 | MIT | | `bidi-js` | 1.0.3 | MIT | -| `bluebird` | 3.4.7 | MIT | | `builder-util-runtime` | 9.7.0 | MIT | | `call-bind-apply-helpers` | 1.0.2 | MIT | | `ccount` | 2.0.1 | MIT | -| `character-entities` | 2.0.2 | MIT | | `character-entities-html4` | 2.1.0 | MIT | | `character-entities-legacy` | 3.0.0 | MIT | -| `character-reference-invalid` | 2.0.1 | MIT | | `class-variance-authority` | 0.7.1 | Apache-2.0 | | `clsx` | 2.1.1 | MIT | | `combined-stream` | 1.0.8 | MIT | | `comma-separated-tokens` | 2.0.3 | MIT | -| `core-util-is` | 1.0.2 | MIT | | `css-tree` | 3.2.1 | MIT | | `csstype` | 3.2.3 | MIT | | `data-urls` | 7.0.0 | MIT | @@ -157,27 +143,21 @@ binaries across the Windows, Linux, and macOS targets. First-party modules | `date-fns-jalali` | 4.1.0-0 | MIT | | `debug` | 4.4.3 | MIT | | `decimal.js` | 10.6.0 | MIT | -| `decode-named-character-reference` | 1.3.0 | MIT | | `delayed-stream` | 1.0.0 | MIT | | `dequal` | 2.0.3 | MIT | | `detect-node-es` | 1.1.0 | MIT | | `devlop` | 1.1.0 | MIT | -| `dingbat-to-unicode` | 1.0.1 | BSD-2-Clause | -| `dompurify` | 3.4.11 | (MPL-2.0 OR Apache-2.0) | -| `duck` | 0.1.12 | BSD* | +| `dompurify` | 3.4.13 | (MPL-2.0 OR Apache-2.0) | | `dunder-proto` | 1.0.1 | MIT | -| `electron` | 42.5.0 | MIT | +| `electron` | 42.10.0 | MIT | | `electron-log` | 5.4.4 | MIT | | `electron-updater` | 6.8.9 | MIT | -| `entities` | 6.0.1 | BSD-2-Clause | | `entities` | 8.0.0 | BSD-2-Clause | | `env-paths` | 3.0.0 | MIT | | `es-define-property` | 1.0.1 | MIT | | `es-errors` | 1.3.0 | MIT | | `es-object-atoms` | 1.1.1 | MIT | | `es-set-tostringtag` | 2.1.0 | MIT | -| `estree-util-is-identifier-name` | 3.0.0 | MIT | -| `extend` | 3.0.2 | MIT | | `flip-toolkit` | 7.2.4 | MIT | | `follow-redirects` | 1.16.0 | MIT | | `form-data` | 4.0.6 | MIT | @@ -188,7 +168,6 @@ binaries across the Windows, Linux, and macOS targets. First-party modules | `get-proto` | 1.0.1 | MIT | | `github.com/atotto/clipboard` | v0.1.4 | BSD-3-Clause | | `github.com/aymanbagabas/go-osc52/v2` | v2.0.1 | MIT | -| `github.com/cenkalti/backoff` | v2.2.1+incompatible | MIT | | `github.com/charmbracelet/bubbles` | v1.0.0 | MIT | | `github.com/charmbracelet/bubbletea` | v1.3.10 | MIT | | `github.com/charmbracelet/colorprofile` | v0.4.1 | MIT | @@ -199,9 +178,9 @@ binaries across the Windows, Linux, and macOS targets. First-party modules | `github.com/clipperhouse/displaywidth` | v0.9.0 | MIT | | `github.com/clipperhouse/stringish` | v0.1.1 | MIT | | `github.com/clipperhouse/uax29/v2` | v2.5.0 | MIT | +| `github.com/ebitengine/purego` | v0.10.2 | Apache-2.0 | | `github.com/erikgeiser/coninput` | v0.0.0-20211004153227-1c3628e74d0f | MIT | | `github.com/go-ole/go-ole` | v1.2.6 | MIT | -| `github.com/grandcat/zeroconf` | v1.0.0 | MIT | | `github.com/jaypipes/ghw` | v0.24.0 | Apache-2.0 | | `github.com/jaypipes/pcidb` | v1.1.1 | Apache-2.0 | | `github.com/lucasb-eyer/go-colorful` | v1.3.0 | MIT | @@ -215,6 +194,8 @@ binaries across the Windows, Linux, and macOS targets. First-party modules | `github.com/muesli/cancelreader` | v0.2.2 | MIT | | `github.com/muesli/termenv` | v0.16.0 | MIT | | `github.com/rivo/uniseg` | v0.4.7 | MIT | +| `github.com/shirou/gopsutil/v4` | v4.26.7 | BSD-3-Clause | +| `github.com/tklauser/go-sysconf` | v0.3.16 | BSD-3-Clause | | `github.com/xo/terminfo` | v0.0.0-20220910002029-abceb7e1c41e | MIT | | `github.com/yusufpapurcu/wmi` | v1.2.4 | MIT | | `golang.org/x/net` | v0.58.0 | BSD-3-Clause | @@ -226,93 +207,41 @@ binaries across the Windows, Linux, and macOS targets. First-party modules | `has-symbols` | 1.1.0 | MIT | | `has-tostringtag` | 1.0.2 | MIT | | `hasown` | 2.0.4 | MIT | -| `hast-util-from-parse5` | 8.0.3 | MIT | -| `hast-util-parse-selector` | 4.0.0 | MIT | -| `hast-util-raw` | 9.1.0 | MIT | -| `hast-util-sanitize` | 5.0.2 | MIT | | `hast-util-to-html` | 9.0.5 | MIT | -| `hast-util-to-jsx-runtime` | 2.3.6 | MIT | -| `hast-util-to-parse5` | 8.0.1 | MIT | | `hast-util-whitespace` | 3.0.0 | MIT | -| `hastscript` | 9.0.1 | MIT | | `howett.net/plist` | v1.0.2-0.20250314012144-ee69052608d9 | BSD-2-Clause AND BSD-3-Clause | | `html-encoding-sniffer` | 6.0.0 | MIT | -| `html-url-attributes` | 3.0.1 | MIT | | `html-void-elements` | 3.0.0 | MIT | -| `immediate` | 3.0.6 | MIT | -| `inherits` | 2.0.4 | ISC | -| `inline-style-parser` | 0.2.7 | MIT | -| `is-alphabetical` | 2.0.1 | MIT | -| `is-alphanumerical` | 2.0.1 | MIT | -| `is-decimal` | 2.0.1 | MIT | -| `is-hexadecimal` | 2.0.1 | MIT | -| `is-plain-obj` | 4.1.0 | MIT | +| `https-proxy-agent` | 5.0.1 | MIT | | `is-potential-custom-element-name` | 1.0.1 | MIT | -| `isarray` | 1.0.0 | MIT | | `isomorphic-dompurify` | 3.13.0 | MIT | | `js-tokens` | 4.0.0 | MIT | | `js-yaml` | 4.2.0 | MIT | | `jsdom` | 29.1.1 | MIT | | `jsonfile` | 6.2.1 | MIT | -| `jszip` | 3.10.1 | (MIT OR GPL-3.0-or-later) | | `lazy-val` | 1.0.5 | MIT | -| `lie` | 3.3.0 | MIT | | `lodash.escaperegexp` | 4.1.2 | MIT | | `lodash.isequal` | 4.5.0 | MIT | -| `longest-streak` | 3.1.0 | MIT | | `loose-envify` | 1.4.0 | MIT | -| `lop` | 0.4.2 | BSD-2-Clause | | `lru-cache` | 11.3.6 | BlueOak-1.0.0 | | `lucide-react` | 1.16.0 | ISC | -| `mammoth` | 1.12.0 | BSD-2-Clause | | `math-intrinsics` | 1.1.0 | MIT | -| `mdast-util-from-markdown` | 2.0.3 | MIT | -| `mdast-util-mdx-expression` | 2.0.1 | MIT | -| `mdast-util-mdx-jsx` | 3.2.0 | MIT | -| `mdast-util-mdxjs-esm` | 2.0.1 | MIT | -| `mdast-util-phrasing` | 4.1.0 | MIT | | `mdast-util-to-hast` | 13.2.1 | MIT | -| `mdast-util-to-markdown` | 2.1.2 | MIT | -| `mdast-util-to-string` | 4.0.0 | MIT | | `mdn-data` | 2.27.1 | CC0-1.0 | -| `micromark` | 4.0.2 | MIT | -| `micromark-core-commonmark` | 2.0.3 | MIT | -| `micromark-factory-destination` | 2.0.1 | MIT | -| `micromark-factory-label` | 2.0.1 | MIT | -| `micromark-factory-space` | 2.0.1 | MIT | -| `micromark-factory-title` | 2.0.1 | MIT | -| `micromark-factory-whitespace` | 2.0.1 | MIT | | `micromark-util-character` | 2.1.1 | MIT | -| `micromark-util-chunked` | 2.0.1 | MIT | -| `micromark-util-classify-character` | 2.0.1 | MIT | -| `micromark-util-combine-extensions` | 2.0.1 | MIT | -| `micromark-util-decode-numeric-character-reference` | 2.0.2 | MIT | -| `micromark-util-decode-string` | 2.0.1 | MIT | | `micromark-util-encode` | 2.0.1 | MIT | -| `micromark-util-html-tag-name` | 2.0.1 | MIT | -| `micromark-util-normalize-identifier` | 2.0.1 | MIT | -| `micromark-util-resolve-all` | 2.0.1 | MIT | | `micromark-util-sanitize-uri` | 2.0.1 | MIT | -| `micromark-util-subtokenize` | 2.1.0 | MIT | | `micromark-util-symbol` | 2.0.1 | MIT | | `micromark-util-types` | 2.0.2 | MIT | | `mime-db` | 1.52.0 | MIT | | `mime-types` | 2.1.35 | MIT | | `ms` | 2.1.3 | MIT | -| `node-readable-to-web-readable-stream` | 0.4.2 | MIT | | `object-assign` | 4.1.1 | MIT | | `oniguruma-parser` | 0.12.2 | MIT | | `oniguruma-to-es` | 4.3.6 | MIT | -| `option` | 0.2.4 | BSD-2-Clause | | `overlayscrollbars` | 2.15.1 | MIT | | `overlayscrollbars-react` | 0.5.6 | MIT | -| `pako` | 1.0.11 | (MIT AND Zlib) | -| `parse-entities` | 4.0.2 | MIT | -| `parse5` | 7.3.0 | MIT | | `parse5` | 8.0.1 | MIT | -| `path-is-absolute` | 1.0.1 | MIT | -| `pdfjs-dist` | 5.6.205 | Apache-2.0 | -| `process-nextick-args` | 2.0.1 | MIT | | `progress` | 2.0.3 | MIT | | `prop-types` | 15.8.1 | MIT | | `property-information` | 7.1.0 | MIT | @@ -325,34 +254,22 @@ binaries across the Windows, Linux, and macOS targets. First-party modules | `react-dom` | 19.2.5 | MIT | | `react-flip-toolkit` | 7.2.4 | MIT | | `react-is` | 16.13.1 | MIT | -| `react-markdown` | 10.1.0 | MIT | | `react-remove-scroll` | 2.7.2 | MIT | | `react-remove-scroll-bar` | 2.3.8 | MIT | | `react-style-singleton` | 2.2.3 | MIT | -| `readable-stream` | 2.3.8 | MIT | | `regex` | 6.1.0 | MIT | | `regex-recursion` | 6.0.2 | MIT | | `regex-utilities` | 2.3.0 | MIT | -| `rehype-raw` | 7.0.0 | MIT | -| `rehype-sanitize` | 6.0.0 | MIT | -| `remark-parse` | 11.0.0 | MIT | -| `remark-rehype` | 11.1.2 | MIT | | `rematrix` | 0.2.2 | MIT | | `require-from-string` | 2.0.2 | MIT | -| `safe-buffer` | 5.1.2 | MIT | | `sax` | 1.6.0 | BlueOak-1.0.0 | | `saxes` | 6.0.0 | ISC | | `scheduler` | 0.27.0 | MIT | | `semver` | 7.7.4 | ISC | | `semver` | 7.8.5 | ISC | -| `setimmediate` | 1.0.5 | MIT | | `source-map-js` | 1.2.1 | BSD-3-Clause | | `space-separated-tokens` | 2.0.2 | MIT | -| `sprintf-js` | 1.0.3 | BSD-3-Clause | -| `string_decoder` | 1.1.1 | MIT | | `stringify-entities` | 4.0.4 | MIT | -| `style-to-js` | 1.1.21 | MIT | -| `style-to-object` | 1.0.14 | MIT | | `sumchecker` | 3.0.1 | Apache-2.0 | | `symbol-tree` | 3.2.4 | MIT | | `tiny-typed-emitter` | 2.1.0 | MIT | @@ -361,12 +278,9 @@ binaries across the Windows, Linux, and macOS targets. First-party modules | `tough-cookie` | 6.0.1 | BSD-3-Clause | | `tr46` | 6.0.0 | MIT | | `trim-lines` | 3.0.1 | MIT | -| `trough` | 2.2.0 | MIT | | `tslib` | 2.8.1 | 0BSD | -| `underscore` | 1.13.8 | MIT | | `undici` | 7.28.0 | MIT | | `undici-types` | 7.18.2 | MIT | -| `unified` | 11.0.5 | MIT | | `unist-util-is` | 6.0.1 | MIT | | `unist-util-position` | 5.0.0 | MIT | | `unist-util-stringify-position` | 4.0.0 | MIT | @@ -376,17 +290,13 @@ binaries across the Windows, Linux, and macOS targets. First-party modules | `use-callback-ref` | 1.3.3 | MIT | | `use-sidecar` | 1.1.3 | MIT | | `use-sync-external-store` | 1.6.0 | MIT | -| `util-deprecate` | 1.0.2 | MIT | | `vfile` | 6.0.3 | MIT | -| `vfile-location` | 5.0.3 | MIT | | `vfile-message` | 4.0.3 | MIT | | `w3c-xmlserializer` | 5.0.0 | MIT | -| `web-namespaces` | 2.0.1 | MIT | | `webidl-conversions` | 8.0.1 | BSD-2-Clause | | `whatwg-mimetype` | 5.0.0 | MIT | | `whatwg-url` | 16.0.1 | MIT | | `xml-name-validator` | 5.0.0 | Apache-2.0 | -| `xmlbuilder` | 10.1.1 | MIT | | `xmlchars` | 2.2.0 | MIT | | `zustand` | 5.0.12 | MIT | | `zwitch` | 2.0.4 | MIT | @@ -1041,48 +951,6 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### @napi-rs/canvas 0.1.99 - -License: MIT - -Repository: https://github.com/Brooooooklyn/canvas - -```text -MIT License - -Copyright (c) 2020 lynweklm@gmail.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -### @napi-rs/canvas-darwin-arm64 0.1.99 - -License: MIT - -Repository: https://github.com/Brooooooklyn/canvas - -```text -# `@napi-rs/canvas-darwin-arm64` - -This is the **aarch64-apple-darwin** binary for `@napi-rs/canvas` -``` - ### @noble/hashes 2.2.0 License: MIT @@ -3269,7 +3137,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### @types/debug 4.1.13 +### @types/hast 3.0.4 License: MIT @@ -3299,7 +3167,7 @@ MIT License SOFTWARE ``` -### @types/estree 1.0.8 +### @types/mdast 4.0.4 License: MIT @@ -3329,7 +3197,7 @@ MIT License SOFTWARE ``` -### @types/estree-jsx 1.0.5 +### @types/node 24.13.2 License: MIT @@ -3359,7 +3227,7 @@ MIT License SOFTWARE ``` -### @types/hast 3.0.4 +### @types/react 19.2.14 License: MIT @@ -3389,7 +3257,7 @@ MIT License SOFTWARE ``` -### @types/mdast 4.0.4 +### @types/react-dom 19.2.3 License: MIT @@ -3419,7 +3287,7 @@ MIT License SOFTWARE ``` -### @types/ms 2.1.0 +### @types/trusted-types 2.0.7 License: MIT @@ -3449,7 +3317,7 @@ MIT License SOFTWARE ``` -### @types/node 24.13.2 +### @types/unist 3.0.3 License: MIT @@ -3479,225 +3347,182 @@ MIT License SOFTWARE ``` -### @types/react 19.2.14 +### @ungap/structured-clone 1.3.0 -License: MIT +License: ISC -Repository: https://github.com/DefinitelyTyped/DefinitelyTyped +Repository: https://github.com/ungap/structured-clone ```text -MIT License - - Copyright (c) Microsoft Corporation. +ISC License - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Copyright (c) 2021, Andrea Giammarchi, @WebReflection - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. ``` -### @types/react-dom 19.2.3 +### agent-base 6.0.2 License: MIT -Repository: https://github.com/DefinitelyTyped/DefinitelyTyped +Repository: https://github.com/TooTallNate/node-agent-base ```text -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +agent-base +========== +### Turn a function into an [`http.Agent`][http.Agent] instance +[![Build Status](https://github.com/TooTallNate/node-agent-base/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-agent-base/actions?workflow=Node+CI) - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE -``` +This module provides an `http.Agent` generator. That is, you pass it an async +callback function, and it returns a new `http.Agent` instance that will invoke the +given callback function when sending outbound HTTP requests. -### @types/trusted-types 2.0.7 - -License: MIT +#### Some subclasses: -Repository: https://github.com/DefinitelyTyped/DefinitelyTyped +Here's some more interesting uses of `agent-base`. +Send a pull request to list yours! -```text -MIT License + * [`http-proxy-agent`][http-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTP endpoints + * [`https-proxy-agent`][https-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTPS endpoints + * [`pac-proxy-agent`][pac-proxy-agent]: A PAC file proxy `http.Agent` implementation for HTTP and HTTPS + * [`socks-proxy-agent`][socks-proxy-agent]: A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS - Copyright (c) Microsoft Corporation. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Installation +------------ - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +Install with `npm`: - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +``` bash +$ npm install agent-base ``` -### @types/unist 2.0.11 - -License: MIT - -Repository: https://github.com/DefinitelyTyped/DefinitelyTyped - -```text -MIT License - Copyright (c) Microsoft Corporation. +Example +------- - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Here's a minimal example that creates a new `net.Socket` connection to the server +for every HTTP request (i.e. the equivalent of `agent: false` option): - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +```js +var net = require('net'); +var tls = require('tls'); +var url = require('url'); +var http = require('http'); +var agent = require('agent-base'); + +var endpoint = 'http://nodejs.org/api/'; +var parsed = url.parse(endpoint); + +// This is the important part! +parsed.agent = agent(function (req, opts) { + var socket; + // `secureEndpoint` is true when using the https module + if (opts.secureEndpoint) { + socket = tls.connect(opts); + } else { + socket = net.connect(opts); + } + return socket; +}); - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +// Everything else works just like normal... +http.get(parsed, function (res) { + console.log('"response" event!', res.headers); + res.pipe(process.stdout); +}); ``` -### @types/unist 3.0.3 - -License: MIT - -Repository: https://github.com/DefinitelyTyped/DefinitelyTyped - -```text -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +Returning a Promise or using an `async` function is also supported: - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +```js +agent(async function (req, opts) { + await sleep(1000); + // etc… +}); ``` -### @ungap/structured-clone 1.3.0 - -License: ISC - -Repository: https://github.com/ungap/structured-clone - -```text -ISC License +Return another `http.Agent` instance to "pass through" the responsibility +for that HTTP request to that agent: -Copyright (c) 2021, Andrea Giammarchi, @WebReflection +```js +agent(function (req, opts) { + return opts.secureEndpoint ? https.globalAgent : http.globalAgent; +}); +``` -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -``` +API +--- -### @xmldom/xmldom 0.8.13 +## Agent(Function callback[, Object options]) → [http.Agent][] -License: MIT +Creates a base `http.Agent` that will execute the callback function `callback` +for every HTTP request that it is used as the `agent` for. The callback function +is responsible for creating a `stream.Duplex` instance of some kind that will be +used as the underlying socket in the HTTP request. -Repository: https://github.com/xmldom/xmldom +The `options` object accepts the following properties: -```text -Copyright 2019 - present Christopher J. Brody and other contributors, as listed in: https://github.com/xmldom/xmldom/graphs/contributors -Copyright 2012 - 2017 @jindw and other contributors, as listed in: https://github.com/jindw/xmldom/graphs/contributors + * `timeout` - Number - Timeout for the `callback()` function in milliseconds. Defaults to Infinity (optional). -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The callback function should have the following signature: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +### callback(http.ClientRequest req, Object options, Function cb) → undefined -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` +The ClientRequest `req` can be accessed to read request headers and +and the path, etc. The `options` object contains the options passed +to the `http.request()`/`https.request()` function call, and is formatted +to be directly passed to `net.connect()`/`tls.connect()`, or however +else you want a Socket to be created. Pass the created socket to +the callback function `cb` once created, and the HTTP request will +continue to proceed. -### argparse 1.0.10 +If the `https` module is used to invoke the HTTP request, then the +`secureEndpoint` property on `options` _will be set to `true`_. -License: MIT -Repository: https://github.com/nodeca/argparse +License +------- -```text (The MIT License) -Copyright (C) 2012 by Vitaly Puzrin +Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net> -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +[http-proxy-agent]: https://github.com/TooTallNate/node-http-proxy-agent +[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent +[pac-proxy-agent]: https://github.com/TooTallNate/node-pac-proxy-agent +[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent +[http.Agent]: https://nodejs.org/api/http.html#http_class_http_agent ``` ### argparse 2.0.1 @@ -4023,7 +3848,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### axios 1.16.0 +### axios 1.18.0 License: MIT @@ -4039,81 +3864,20 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### bail 2.0.2 +### bidi-js 1.0.3 License: MIT -Repository: https://github.com/wooorm/bail +Repository: https://github.com/lojjic/bidi-js ```text -(The MIT License) +Copyright (c) 2021 Jason Johnston -Copyright (c) 2015 Titus Wormer +MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### base64-js 1.5.1 - -License: MIT - -Repository: https://github.com/beatgammit/base64-js - -```text -The MIT License (MIT) - -Copyright (c) 2014 Jameson Little - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - -### bidi-js 1.0.3 - -License: MIT - -Repository: https://github.com/lojjic/bidi-js - -```text -Copyright (c) 2021 Jason Johnston - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including +"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to @@ -4131,36 +3895,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### bluebird 3.4.7 - -License: MIT - -Repository: https://github.com/petkaantonov/bluebird - -```text -The MIT License (MIT) - -Copyright (c) 2013-2015 Petka Antonov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - ### builder-util-runtime 9.7.0 License: MIT @@ -4252,37 +3986,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### character-entities 2.0.2 - -License: MIT - -Repository: https://github.com/wooorm/character-entities - -```text -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - ### character-entities-html4 2.1.0 License: MIT @@ -4345,37 +4048,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### character-reference-invalid 2.0.1 - -License: MIT - -Repository: https://github.com/wooorm/character-reference-invalid - -```text -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - ### class-variance-authority 0.7.1 License: Apache-2.0 @@ -4652,34 +4324,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### core-util-is 1.0.2 - -License: MIT - -Repository: https://github.com/isaacs/core-util-is - -```text -Copyright Node.js contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -``` - ### css-tree 3.2.1 License: MIT @@ -4871,37 +4515,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### decode-named-character-reference 1.3.0 - -License: MIT - -Repository: https://github.com/wooorm/decode-named-character-reference - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - ### delayed-stream 1.0.0 License: MIT @@ -5021,95 +4634,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### dingbat-to-unicode 1.0.1 - -License: BSD-2-Clause - -Repository: https://github.com/mwilliamson/dingbat-to-unicode - -```text -# dingbat-to-unicode - -Mapping from Dingbat fonts, such as Symbol, Webdings and Wingdings, to Unicode code points. - -The following fonts are supported: - -* Symbol -* Webdings -* Wingdings 1 -* Wingdings 2 -* Wingdings 3 - -Note that in some cases, such as docx files, -the dingbat code point may have 0xF000 added to it to shift the code point into the Unicode private use area. -You should subtract 0xF000 from the code point before passing it into this library. - -## Installation - - npm install dingbat-to-unicode - -## Usage - -Import using `require` or `import`: - -```javascript -const dingbatToUnicode = require("dingbat-to-unicode"); -// or -import * as dingbatToUnicode from "dingbat-to-unicode"; -``` - -You can then call one of the following functions, depending on the representation you have the dingbat code point in: - -* `dingbatToUnicode.codePoint(typeface: string, codePoint: number): UnicodeScalarValue | undefined` - -* `dingbatToUnicode.dec(typeface: string, dec: string): UnicodeScalarValue | undefined` - -* `dingbatToUnicode.hex(typeface: string, hex: string): UnicodeScalarValue | undefined` - -`UnicodeScalarValue` is an object with two properties: - -* `codePoint`: a `number` representing the Unicode code point -* `string`: a `string` representing the code point as a string - -## Examples - -```javascript -const result = dingbatToUnicode.codePoint("Wingdings", 41)!!; -assert.strictEqual(result.codePoint, 0x2706); -``` - -```javascript -const result = dingbatToUnicode.dec("Wingdings", "41")!!; -assert.strictEqual(result.codePoint, 0x2706); -``` - -```javascript -const result = dingbatToUnicode.hex("Wingdings", "29")!!; -assert.strictEqual(result.codePoint, 0x2706); -``` - -```javascript -const result = dingbatToUnicode.hex("Wingdings", "3E")!!; -assert.strictEqual(result.codePoint, 0x2707); -``` - -```javascript -const result = dingbatToUnicode.hex("Wingdings", "3e")!!; -assert.strictEqual(result.codePoint, 0x2707); -``` - -```javascript -const result = dingbatToUnicode.hex("Wingdings", "29")!!; -assert.strictEqual(result.string, "\u2706"); -``` - -```javascript -const result = dingbatToUnicode.hex("Wingdings", "28")!!; -assert.strictEqual(result.string, "🕿"); -``` -``` - -### dompurify 3.4.11 +### dompurify 3.4.13 License: (MPL-2.0 OR Apache-2.0) @@ -5319,54 +4844,23 @@ Apache License limitations under the License. ``` -### duck 0.1.12 +### dunder-proto 1.0.1 -License: BSD* +License: MIT -Repository: https://github.com/mwilliamson/duck.js +Repository: https://github.com/es-shims/dunder-proto ```text -Copyright (c) 2013, Michael Williamson -All rights reserved. +MIT License -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Copyright (c) 2024 ECMAScript Shims -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` - -### dunder-proto 1.0.1 - -License: MIT - -Repository: https://github.com/es-shims/dunder-proto - -```text -MIT License - -Copyright (c) 2024 ECMAScript Shims - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -5380,7 +4874,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### electron 42.5.0 +### electron 42.10.0 License: MIT @@ -5470,26 +4964,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### entities 6.0.1 - -License: BSD-2-Clause - -Repository: https://github.com/fb55/entities - -```text -Copyright (c) Felix Böhm -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` - ### entities 8.0.0 License: BSD-2-Clause @@ -5648,68 +5122,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### estree-util-is-identifier-name 3.0.0 - -License: MIT - -Repository: https://github.com/syntax-tree/estree-util-is-identifier-name - -```text -(The MIT License) - -Copyright (c) 2020 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### extend 3.0.2 - -License: MIT - -Repository: https://github.com/justmoon/node-extend - -```text -The MIT License (MIT) - -Copyright (c) 2014 Stefan Thomas - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - ### flip-toolkit 7.2.4 License: MIT @@ -6063,35 +5475,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### github.com/cenkalti/backoff v2.2.1+incompatible - -License: MIT - -Repository: https://github.com/cenkalti/backoff - -```text -The MIT License (MIT) - -Copyright (c) 2014 Cenk Altı - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - ### github.com/charmbracelet/bubbles v1.0.0 License: MIT @@ -6392,106 +5775,11 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f - -License: MIT - -Repository: https://github.com/erikgeiser/coninput - -```text -MIT License - -Copyright (c) 2021 Erik G. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -### github.com/go-ole/go-ole v1.2.6 - -License: MIT - -Repository: https://github.com/go-ole/go-ole - -```text -The MIT License (MIT) - -Copyright © 2013-2017 Yasuhiro Matsumoto, - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the “Software”), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -### github.com/grandcat/zeroconf v1.0.0 - -License: MIT - -Repository: https://github.com/grandcat/zeroconf - -```text -The MIT License (MIT) - -Copyright (c) 2016 Stefan Smarzly -Copyright (c) 2014 Oleksandr Lobunets - -Note: Copyright for portions of project zeroconf.sd are held by Oleksandr - Lobunets, 2014, as part of project bonjour. All other copyright for - project zeroconf.sd are held by Stefan Smarzly, 2016. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -### github.com/jaypipes/ghw v0.24.0 +### github.com/ebitengine/purego v0.10.2 License: Apache-2.0 -Repository: https://github.com/jaypipes/ghw +Repository: https://github.com/ebitengine/purego ```text Apache License @@ -6668,32 +5956,119 @@ Apache License defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. -``` -### github.com/jaypipes/pcidb v1.1.1 + END OF TERMS AND CONDITIONS -License: Apache-2.0 + APPENDIX: How to apply the Apache License to your work. -Repository: https://github.com/jaypipes/pcidb + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -```text -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ + Copyright {yyyy} {name of copyright owner} - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - 1. Definitions. + http://www.apache.org/licenses/LICENSE-2.0 - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +### github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, +License: MIT + +Repository: https://github.com/erikgeiser/coninput + +```text +MIT License + +Copyright (c) 2021 Erik G. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### github.com/go-ole/go-ole v1.2.6 + +License: MIT + +Repository: https://github.com/go-ole/go-ole + +```text +The MIT License (MIT) + +Copyright © 2013-2017 Yasuhiro Matsumoto, + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### github.com/jaypipes/ghw v0.24.0 + +License: Apache-2.0 + +Repository: https://github.com/jaypipes/ghw + +```text +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the @@ -6853,85 +6228,268 @@ Apache License of your accepting any such warranty or additional liability. ``` -### github.com/lucasb-eyer/go-colorful v1.3.0 +### github.com/jaypipes/pcidb v1.1.1 -License: MIT +License: Apache-2.0 -Repository: https://github.com/lucasb-eyer/go-colorful +Repository: https://github.com/jaypipes/pcidb ```text -Copyright (c) 2013 Lucas Beyer - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -### github.com/mattn/go-isatty v0.0.20 + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -License: MIT + 1. Definitions. -Repository: https://github.com/mattn/go-isatty + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -```text -Copyright (c) Yasuhiro MATSUMOTO + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -MIT License (Expat) + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -### github.com/mattn/go-localereader v0.0.1 + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -License: Unknown + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -Repository: https://github.com/mattn/go-localereader + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -```text -(no license file found in module) -``` + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -### github.com/mattn/go-runewidth v0.0.19 + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -License: MIT + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -Repository: https://github.com/mattn/go-runewidth + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -```text -The MIT License (MIT) + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -Copyright (c) 2016 Yasuhiro Matsumoto + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -### github.com/Microsoft/go-winio v0.6.2 + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -License: MIT + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -Repository: https://github.com/Microsoft/go-winio + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. +``` + +### github.com/lucasb-eyer/go-colorful v1.3.0 + +License: MIT + +Repository: https://github.com/lucasb-eyer/go-colorful + +```text +Copyright (c) 2013 Lucas Beyer + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +### github.com/mattn/go-isatty v0.0.20 + +License: MIT + +Repository: https://github.com/mattn/go-isatty + +```text +Copyright (c) Yasuhiro MATSUMOTO + +MIT License (Expat) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +### github.com/mattn/go-localereader v0.0.1 + +License: Unknown + +Repository: https://github.com/mattn/go-localereader + +```text +(no license file found in module) +``` + +### github.com/mattn/go-runewidth v0.0.19 + +License: MIT + +Repository: https://github.com/mattn/go-runewidth + +```text +The MIT License (MIT) + +Copyright (c) 2016 Yasuhiro Matsumoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### github.com/Microsoft/go-winio v0.6.2 + +License: MIT + +Repository: https://github.com/Microsoft/go-winio ```text The MIT License (MIT) @@ -7153,6 +6711,114 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` +### github.com/shirou/gopsutil/v4 v4.26.7 + +License: BSD-3-Clause + +Repository: https://github.com/shirou/gopsutil/v4 + +```text +gopsutil is distributed under BSD license reproduced below. + +Copyright (c) 2014, WAKAYAMA Shirou +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the gopsutil authors nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +------- +internal/common/binary.go in the gopsutil is copied and modified from golang/encoding/binary.go. + + + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +### github.com/tklauser/go-sysconf v0.3.16 + +License: BSD-3-Clause + +Repository: https://github.com/tklauser/go-sysconf + +```text +BSD 3-Clause License + +Copyright (c) 2018-2022, Tobias Klauser +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + ### github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e License: MIT @@ -7522,11 +7188,11 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### hast-util-from-parse5 8.0.3 +### hast-util-to-html 9.0.5 License: MIT -Repository: https://github.com/syntax-tree/hast-util-from-parse5 +Repository: https://github.com/syntax-tree/hast-util-to-html ```text (The MIT License) @@ -7553,11 +7219,11 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### hast-util-parse-selector 4.0.0 +### hast-util-whitespace 3.0.0 License: MIT -Repository: https://github.com/syntax-tree/hast-util-parse-selector +Repository: https://github.com/syntax-tree/hast-util-whitespace ```text (The MIT License) @@ -7584,78 +7250,99 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### hast-util-raw 9.1.0 +### howett.net/plist v1.0.2-0.20250314012144-ee69052608d9 -License: MIT +License: BSD-2-Clause AND BSD-3-Clause -Repository: https://github.com/syntax-tree/hast-util-raw +Repository: https://howett.net/plist ```text -(The MIT License) - -Copyright (c) Titus Wormer +Copyright (c) 2013, Dustin L. Howett. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -### hast-util-sanitize 5.0.2 +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. -License: MIT +-------------------------------------------------------------------------------- +Parts of this package were made available under the license covering +the Go language and all attended core libraries. That license follows. +-------------------------------------------------------------------------------- -Repository: https://github.com/syntax-tree/hast-util-sanitize +Copyright (c) 2012 The Go Authors. All rights reserved. -```text -(The MIT License) +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -Copyright (c) Titus Wormer + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +### html-encoding-sniffer 6.0.0 -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +License: MIT + +Repository: https://github.com/jsdom/html-encoding-sniffer + +```text +Copyright © Domenic Denicola + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### hast-util-to-html 9.0.5 +### html-void-elements 3.0.0 License: MIT -Repository: https://github.com/syntax-tree/hast-util-to-html +Repository: https://github.com/wooorm/html-void-elements ```text (The MIT License) -Copyright (c) Titus Wormer +Copyright (c) 2016 Titus Wormer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -7677,78 +7364,129 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### hast-util-to-jsx-runtime 2.3.6 +### https-proxy-agent 5.0.1 License: MIT -Repository: https://github.com/syntax-tree/hast-util-to-jsx-runtime +Repository: https://github.com/TooTallNate/node-https-proxy-agent ```text -(The MIT License) +https-proxy-agent +================ +### An HTTP(s) proxy `http.Agent` implementation for HTTPS +[![Build Status](https://github.com/TooTallNate/node-https-proxy-agent/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-https-proxy-agent/actions?workflow=Node+CI) -Copyright (c) Titus Wormer +This module provides an `http.Agent` implementation that connects to a specified +HTTP or HTTPS proxy server, and can be used with the built-in `https` module. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Specifically, this `Agent` implementation connects to an intermediary "proxy" +server and issues the [CONNECT HTTP method][CONNECT], which tells the proxy to +open a direct TCP connection to the destination server. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Since this agent implements the CONNECT HTTP method, it also works with other +protocols that use this method when connecting over proxies (i.e. WebSockets). +See the "Examples" section below for more. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install https-proxy-agent ``` -### hast-util-to-parse5 8.0.1 -License: MIT +Examples +-------- -Repository: https://github.com/syntax-tree/hast-util-to-parse5 +#### `https` module example -```text -(The MIT License) +``` js +var url = require('url'); +var https = require('https'); +var HttpsProxyAgent = require('https-proxy-agent'); -Copyright (c) Titus Wormer +// HTTP/HTTPS proxy to connect to +var proxy = process.env.http_proxy || 'http://168.63.76.32:3128'; +console.log('using proxy server %j', proxy); -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +// HTTPS endpoint for the proxy to connect to +var endpoint = process.argv[2] || 'https://graph.facebook.com/tootallnate'; +console.log('attempting to GET %j', endpoint); +var options = url.parse(endpoint); -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +// create an instance of the `HttpsProxyAgent` class with the proxy server information +var agent = new HttpsProxyAgent(proxy); +options.agent = agent; -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +https.get(options, function (res) { + console.log('"response" event!', res.headers); + res.pipe(process.stdout); +}); ``` -### hast-util-whitespace 3.0.0 +#### `ws` WebSocket connection example -License: MIT +``` js +var url = require('url'); +var WebSocket = require('ws'); +var HttpsProxyAgent = require('https-proxy-agent'); -Repository: https://github.com/syntax-tree/hast-util-whitespace +// HTTP/HTTPS proxy to connect to +var proxy = process.env.http_proxy || 'http://168.63.76.32:3128'; +console.log('using proxy server %j', proxy); + +// WebSocket endpoint for the proxy to connect to +var endpoint = process.argv[2] || 'ws://echo.websocket.org'; +var parsed = url.parse(endpoint); +console.log('attempting to connect to WebSocket %j', endpoint); + +// create an instance of the `HttpsProxyAgent` class with the proxy server information +var options = url.parse(proxy); + +var agent = new HttpsProxyAgent(options); + +// finally, initiate the WebSocket connection +var socket = new WebSocket(endpoint, { agent: agent }); + +socket.on('open', function () { + console.log('"open" event!'); + socket.send('hello world'); +}); + +socket.on('message', function (data, flags) { + console.log('"message" event! %j %j', data, flags); + socket.close(); +}); +``` + +API +--- + +### new HttpsProxyAgent(Object options) + +The `HttpsProxyAgent` class implements an `http.Agent` subclass that connects +to the specified "HTTP(s) proxy server" in order to proxy HTTPS and/or WebSocket +requests. This is achieved by using the [HTTP `CONNECT` method][CONNECT]. + +The `options` argument may either be a string URI of the proxy server to use, or an +"options" object with more specific properties: + + * `host` - String - Proxy host to connect to (may use `hostname` as well). Required. + * `port` - Number - Proxy port to connect to. Required. + * `protocol` - String - If `https:`, then use TLS to connect to the proxy. + * `headers` - Object - Additional HTTP headers to be sent on the HTTP CONNECT method. + * Any other options given are passed to the `net.connect()`/`tls.connect()` functions. + + +License +------- -```text (The MIT License) -Copyright (c) 2016 Titus Wormer +Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -7768,22 +7506,22 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +[CONNECT]: http://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_Tunneling ``` -### hastscript 9.0.1 +### is-potential-custom-element-name 1.0.1 License: MIT -Repository: https://github.com/syntax-tree/hastscript +Repository: https://github.com/mathiasbynens/is-potential-custom-element-name ```text -(The MIT License) - -Copyright (c) Titus Wormer +Copyright Mathias Bynens Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including +"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to @@ -7792,108 +7530,85 @@ the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### howett.net/plist v1.0.2-0.20250314012144-ee69052608d9 +### isomorphic-dompurify 3.13.0 -License: BSD-2-Clause AND BSD-3-Clause +License: MIT -Repository: https://howett.net/plist +Repository: https://github.com/kkomelin/isomorphic-dompurify ```text -Copyright (c) 2013, Dustin L. Howett. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of the FreeBSD Project. - --------------------------------------------------------------------------------- -Parts of this package were made available under the license covering -the Go language and all attended core libraries. That license follows. --------------------------------------------------------------------------------- +MIT License -Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2020 Konstantin Komelin -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` -### html-encoding-sniffer 6.0.0 +### js-tokens 4.0.0 License: MIT -Repository: https://github.com/jsdom/html-encoding-sniffer +Repository: https://github.com/lydell/js-tokens ```text -Copyright © Domenic Denicola +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Copyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` -### html-url-attributes 3.0.1 +### js-yaml 4.2.0 License: MIT -Repository: https://github.com/rehypejs/rehype-minify.git#main +Repository: https://github.com/nodeca/js-yaml ```text (The MIT License) -Copyright (c) Titus Wormer +Copyright (C) 2011-2015 by Vitaly Puzrin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7914,184 +7629,105 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### html-void-elements 3.0.0 +### jsdom 29.1.1 License: MIT -Repository: https://github.com/wooorm/html-void-elements +Repository: https://github.com/jsdom/jsdom ```text -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### immediate 3.0.6 - -License: MIT - -Repository: https://github.com/calvinmetcalf/immediate - -```text -Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, Domenic Denicola, Brian Cavalier +Copyright (c) 2010 Elijah Insua -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### inherits 2.0.4 - -License: ISC - -Repository: https://github.com/isaacs/inherits - -```text -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. ``` -### inline-style-parser 0.2.7 +### jsonfile 6.2.1 License: MIT -Repository: https://github.com/remarkablemark/inline-style-parser +Repository: https://github.com/jprichardson/node-jsonfile ```text (The MIT License) -Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2012-2015, JP Richardson -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### is-alphabetical 2.0.1 +### lazy-val 1.0.5 License: MIT -Repository: https://github.com/wooorm/is-alphabetical +Repository: https://github.com/develar/lazy-val ```text -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +## lazy-val -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Lazy value. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +```typescript +class Lazy { + constructor(creator: () => Promise) + readonly hasValue: boolean + value: Promise +} +``` ``` -### is-alphanumerical 2.0.1 +### lodash.escaperegexp 4.1.2 License: MIT -Repository: https://github.com/wooorm/is-alphanumerical +Repository: https://github.com/lodash/lodash ```text -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### is-decimal 2.0.1 +Copyright jQuery Foundation and other contributors -License: MIT +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors -Repository: https://github.com/wooorm/is-decimal +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash -```text -(The MIT License) +The following license applies to all parts of this software except as +documented below: -Copyright (c) 2016 Titus Wormer +==== Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including +"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to @@ -8100,72 +7736,50 @@ the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### is-hexadecimal 2.0.1 - -License: MIT - -Repository: https://github.com/wooorm/is-hexadecimal +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -```text -(The MIT License) +==== -Copyright (c) 2016 Titus Wormer +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +CC0: http://creativecommons.org/publicdomain/zero/1.0/ -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +==== -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. ``` -### is-plain-obj 4.1.0 +### lodash.isequal 4.5.0 License: MIT -Repository: https://github.com/sindresorhus/is-plain-obj +Repository: https://github.com/lodash/lodash ```text -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` +Copyright JS Foundation and other contributors -### is-potential-custom-element-name 1.0.1 +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors -License: MIT +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash -Repository: https://github.com/mathiasbynens/is-potential-custom-element-name +The following license applies to all parts of this software except as +documented below: -```text -Copyright Mathias Bynens +==== Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -8185,86 +7799,33 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### isarray 1.0.0 -License: MIT - -Repository: https://github.com/juliangruber/isarray +==== -```text -# isarray +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. -`Array#isArray` for older browsers. +CC0: http://creativecommons.org/publicdomain/zero/1.0/ -[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray) -[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray) +==== -[![browser support](https://ci.testling.com/juliangruber/isarray.png) -](https://ci.testling.com/juliangruber/isarray) +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +``` -## Usage +### loose-envify 1.4.0 -```js -var isArray = require('isarray'); +License: MIT -console.log(isArray([])); // => true -console.log(isArray({})); // => false -``` +Repository: https://github.com/zertosh/loose-envify -## Installation +```text +The MIT License (MIT) -With [npm](http://npmjs.org) do - -```bash -$ npm install isarray -``` - -Then bundle for the browser with -[browserify](https://github.com/substack/browserify). - -With [component](http://component.io) do - -```bash -$ component install juliangruber/isarray -``` - -## License - -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -### isomorphic-dompurify 3.13.0 - -License: MIT - -Repository: https://github.com/kkomelin/isomorphic-dompurify - -```text -MIT License - -Copyright (c) 2020 Konstantin Komelin +Copyright (c) 2015 Andres Suarez Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -8273,147 +7834,114 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` -### js-tokens 4.0.0 +### lru-cache 11.3.6 -License: MIT +License: BlueOak-1.0.0 -Repository: https://github.com/lydell/js-tokens +Repository: https://github.com/isaacs/node-lru-cache ```text -The MIT License (MIT) - -Copyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +# Blue Oak Model License -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +Version 1.0.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` +## Purpose -### js-yaml 4.2.0 +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. -License: MIT +## Acceptance -Repository: https://github.com/nodeca/js-yaml +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. -```text -(The MIT License) +## Copyright -Copyright (C) 2011-2015 by Vitaly Puzrin +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +## Notices -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` +## Excuse -### jsdom 29.1.1 +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. -License: MIT +## Patent -Repository: https://github.com/jsdom/jsdom +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. -```text -Copyright (c) 2010 Elijah Insua +## Reliability -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: +No contributor can revoke this license. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +## No Liability -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.*** ``` -### jsonfile 6.2.1 +### lucide-react 1.16.0 -License: MIT +License: ISC -Repository: https://github.com/jprichardson/node-jsonfile +Repository: https://github.com/lucide-icons/lucide ```text -(The MIT License) - -Copyright (c) 2012-2015, JP Richardson - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, - merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +ISC License -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +Copyright (c) 2026 Lucide Icons and Contributors -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -### jszip 3.10.1 +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -License: (MIT OR GPL-3.0-or-later) +--- -Repository: https://github.com/Stuk/jszip +The following Lucide icons are derived from the Feather project: -```text -JSZip is dual licensed. At your choice you may use it under the MIT license *or* the GPLv3 -license. +airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out -The MIT License -=============== +The MIT License (MIT) (for the icons listed above) -Copyright (c) 2009-2016 Stuart Knightley, David Duponchel, Franz Buchinger, António Afonso +Copyright (c) 2013-present Cole Bemis Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -8422,1848 +7950,58 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -GPL version 3 -============= - - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - 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 -``` - -### lazy-val 1.0.5 - -License: MIT - -Repository: https://github.com/develar/lazy-val - -```text -## lazy-val - -Lazy value. - -```typescript -class Lazy { - constructor(creator: () => Promise) - readonly hasValue: boolean - value: Promise -} -``` -``` - -### lie 3.3.0 - -License: MIT - -Repository: https://github.com/calvinmetcalf/lie - -```text -#Copyright (c) 2014-2018 Calvin Metcalf, Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** -``` - -### lodash.escaperegexp 4.1.2 - -License: MIT - -Repository: https://github.com/lodash/lodash - -```text -Copyright jQuery Foundation and other contributors - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. - -CC0: http://creativecommons.org/publicdomain/zero/1.0/ - -==== - -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above. -``` - -### lodash.isequal 4.5.0 - -License: MIT - -Repository: https://github.com/lodash/lodash - -```text -Copyright JS Foundation and other contributors - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. - -CC0: http://creativecommons.org/publicdomain/zero/1.0/ - -==== - -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above. -``` - -### longest-streak 3.1.0 - -License: MIT - -Repository: https://github.com/wooorm/longest-streak - -```text -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### loose-envify 1.4.0 - -License: MIT - -Repository: https://github.com/zertosh/loose-envify - -```text -The MIT License (MIT) - -Copyright (c) 2015 Andres Suarez - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - -### lop 0.4.2 - -License: BSD-2-Clause - -Repository: https://github.com/mwilliamson/lop - -```text -Copyright (c) 2013, Michael Williamson -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` - -### lru-cache 11.3.6 - -License: BlueOak-1.0.0 - -Repository: https://github.com/isaacs/node-lru-cache - -```text -# Blue Oak Model License - -Version 1.0.0 - -## Purpose - -This license gives everyone as much permission to work with -this software as possible, while protecting contributors -from liability. - -## Acceptance - -In order to receive this license, you must agree to its -rules. The rules of this license are both obligations -under that agreement and conditions to your license. -You must not do anything with this software that triggers -a rule that you cannot or will not follow. - -## Copyright - -Each contributor licenses you to do everything with this -software that would otherwise infringe that contributor's -copyright in it. - -## Notices - -You must ensure that everyone who gets a copy of -any part of this software from you, with or without -changes, also gets the text of this license or a link to -. - -## Excuse - -If anyone notifies you in writing that you have not -complied with [Notices](#notices), you can keep your -license by taking all practical steps to comply within 30 -days after the notice. If you do not do so, your license -ends immediately. - -## Patent - -Each contributor licenses you to do everything with this -software that would otherwise infringe any patent claims -they can license or become able to license. - -## Reliability - -No contributor can revoke this license. - -## No Liability - -***As far as the law allows, this software comes as is, -without any warranty or condition, and no contributor -will be liable to anyone for any damages related to this -software or this license, under any kind of legal claim.*** -``` - -### lucide-react 1.16.0 - -License: ISC - -Repository: https://github.com/lucide-icons/lucide - -```text -ISC License - -Copyright (c) 2026 Lucide Icons and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ---- - -The following Lucide icons are derived from the Feather project: - -airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out - -The MIT License (MIT) (for the icons listed above) - -Copyright (c) 2013-present Cole Bemis - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -### mammoth 1.12.0 - -License: BSD-2-Clause - -Repository: https://github.com/mwilliamson/mammoth.js - -```text -Copyright (c) 2013, Michael Williamson -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` - -### math-intrinsics 1.1.0 - -License: MIT - -Repository: https://github.com/es-shims/math-intrinsics - -```text -MIT License - -Copyright (c) 2024 ECMAScript Shims - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -### mdast-util-from-markdown 2.0.3 - -License: MIT - -Repository: https://github.com/syntax-tree/mdast-util-from-markdown - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### mdast-util-mdx-expression 2.0.1 - -License: MIT - -Repository: https://github.com/syntax-tree/mdast-util-mdx-expression - -```text -(The MIT License) - -Copyright (c) 2020 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### mdast-util-mdx-jsx 3.2.0 - -License: MIT - -Repository: https://github.com/syntax-tree/mdast-util-mdx-jsx - -```text -(The MIT License) - -Copyright (c) 2020 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### mdast-util-mdxjs-esm 2.0.1 - -License: MIT - -Repository: https://github.com/syntax-tree/mdast-util-mdxjs-esm - -```text -(The MIT License) - -Copyright (c) 2020 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### mdast-util-phrasing 4.1.0 - -License: MIT - -Repository: https://github.com/syntax-tree/mdast-util-phrasing - -```text -(The MIT License) - -Copyright (c) 2017 Titus Wormer -Copyright (c) 2017 Victor Felder - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### mdast-util-to-hast 13.2.1 - -License: MIT - -Repository: https://github.com/syntax-tree/mdast-util-to-hast - -```text -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### mdast-util-to-markdown 2.1.2 - -License: MIT - -Repository: https://github.com/syntax-tree/mdast-util-to-markdown - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### mdast-util-to-string 4.0.0 - -License: MIT - -Repository: https://github.com/syntax-tree/mdast-util-to-string - -```text -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### mdn-data 2.27.1 - -License: CC0-1.0 - -Repository: https://github.com/mdn/data - -```text -CC0 1.0 Universal - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator and -subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for the -purpose of contributing to a commons of creative, cultural and scientific -works ("Commons") that the public can reliably and without fear of later -claims of infringement build upon, modify, incorporate in other works, reuse -and redistribute as freely as possible in any form whatsoever and for any -purposes, including without limitation commercial purposes. These owners may -contribute to the Commons to promote the ideal of a free culture and the -further production of creative, cultural and scientific works, or to gain -reputation or greater distribution for their Work in part through the use and -efforts of others. - -For these and/or other purposes and motivations, and without any expectation -of additional consideration or compensation, the person associating CC0 with a -Work (the "Affirmer"), to the extent that he or she is an owner of Copyright -and Related Rights in the Work, voluntarily elects to apply CC0 to the Work -and publicly distribute the Work under its terms, with knowledge of his or her -Copyright and Related Rights in the Work and the meaning and intended legal -effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not limited -to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, communicate, - and translate a Work; - - ii. moral rights retained by the original author(s) and/or performer(s); - - iii. publicity and privacy rights pertaining to a person's image or likeness - depicted in a Work; - - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - - v. rights protecting the extraction, dissemination, use and reuse of data in - a Work; - - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation thereof, - including any amended or successor version of such directive); and - - vii. other similar, equivalent or corresponding rights throughout the world - based on applicable law or treaty, and any national implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention of, -applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and -unconditionally waives, abandons, and surrenders all of Affirmer's Copyright -and Related Rights and associated claims and causes of action, whether now -known or unknown (including existing as well as future claims and causes of -action), in the Work (i) in all territories worldwide, (ii) for the maximum -duration provided by applicable law or treaty (including future time -extensions), (iii) in any current or future medium and for any number of -copies, and (iv) for any purpose whatsoever, including without limitation -commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes -the Waiver for the benefit of each member of the public at large and to the -detriment of Affirmer's heirs and successors, fully intending that such Waiver -shall not be subject to revocation, rescission, cancellation, termination, or -any other legal or equitable action to disrupt the quiet enjoyment of the Work -by the public as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason be -judged legally invalid or ineffective under applicable law, then the Waiver -shall be preserved to the maximum extent permitted taking into account -Affirmer's express Statement of Purpose. In addition, to the extent the Waiver -is so judged Affirmer hereby grants to each affected person a royalty-free, -non transferable, non sublicensable, non exclusive, irrevocable and -unconditional license to exercise Affirmer's Copyright and Related Rights in -the Work (i) in all territories worldwide, (ii) for the maximum duration -provided by applicable law or treaty (including future time extensions), (iii) -in any current or future medium and for any number of copies, and (iv) for any -purpose whatsoever, including without limitation commercial, advertising or -promotional purposes (the "License"). The License shall be deemed effective as -of the date CC0 was applied by Affirmer to the Work. Should any part of the -License for any reason be judged legally invalid or ineffective under -applicable law, such partial invalidity or ineffectiveness shall not -invalidate the remainder of the License, and in such case Affirmer hereby -affirms that he or she will not (i) exercise any of his or her remaining -Copyright and Related Rights in the Work or (ii) assert any associated claims -and causes of action with respect to the Work, in either case contrary to -Affirmer's express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - - b. Affirmer offers the Work as-is and makes no representations or warranties - of any kind concerning the Work, express, implied, statutory or otherwise, - including without limitation warranties of title, merchantability, fitness - for a particular purpose, non infringement, or the absence of latent or - other defects, accuracy, or the present or absence of errors, whether or not - discoverable, all to the greatest extent permissible under applicable law. - - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without limitation - any person's Copyright and Related Rights in the Work. Further, Affirmer - disclaims responsibility for obtaining any necessary consents, permissions - or other rights required for any use of the Work. - - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to this - CC0 or use of the Work. - -For more information, please see - -``` - -### micromark 4.0.2 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-core-commonmark 2.0.3 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-factory-destination 2.0.1 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-factory-label 2.0.1 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-factory-space 2.0.1 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-factory-title 2.0.1 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-factory-whitespace 2.0.1 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-util-character 2.1.1 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-util-chunked 2.0.1 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-util-classify-character 2.0.1 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-util-combine-extensions 2.0.1 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### micromark-util-decode-numeric-character-reference 2.0.2 - -License: MIT - -Repository: https://github.com/micromark/micromark.git#main - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` -### micromark-util-decode-string 2.0.1 +### math-intrinsics 1.1.0 License: MIT -Repository: https://github.com/micromark/micromark.git#main +Repository: https://github.com/es-shims/math-intrinsics ```text -(The MIT License) +MIT License -Copyright (c) Titus Wormer +Copyright (c) 2024 ECMAScript Shims -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` -### micromark-util-encode 2.0.1 +### mdast-util-to-hast 13.2.1 License: MIT -Repository: https://github.com/micromark/micromark.git#main +Repository: https://github.com/syntax-tree/mdast-util-to-hast ```text (The MIT License) -Copyright (c) Titus Wormer +Copyright (c) 2016 Titus Wormer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -10285,69 +8023,132 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### micromark-util-html-tag-name 2.0.1 +### mdn-data 2.27.1 -License: MIT +License: CC0-1.0 -Repository: https://github.com/micromark/micromark.git#main +Repository: https://github.com/mdn/data ```text -(The MIT License) +CC0 1.0 Universal -Copyright (c) Titus Wormer +Statement of Purpose -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. -### micromark-util-normalize-identifier 2.0.1 +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: -License: MIT + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; -Repository: https://github.com/micromark/micromark.git#main + ii. moral rights retained by the original author(s) and/or performer(s); -```text -(The MIT License) + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; -Copyright (c) Titus Wormer + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see + ``` -### micromark-util-resolve-all 2.0.1 +### micromark-util-character 2.1.1 License: MIT @@ -10378,7 +8179,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### micromark-util-sanitize-uri 2.0.1 +### micromark-util-encode 2.0.1 License: MIT @@ -10409,7 +8210,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### micromark-util-subtokenize 2.1.0 +### micromark-util-sanitize-uri 2.0.1 License: MIT @@ -10596,36 +8397,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### node-readable-to-web-readable-stream 0.4.2 - -License: MIT - -Repository: https://github.com/Borewit/node-readable-to-web-readable-stream - -```text -MIT License - -Copyright (c) 2025 Borewit - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - ### object-assign 4.1.1 License: MIT @@ -10704,47 +8475,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -### option 0.2.4 - -License: BSD-2-Clause - -Repository: https://github.com/mwilliamson/node-options - -```text -Copyright (c) 2013, Michael Williamson -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` ### overlayscrollbars 2.15.1 @@ -12358,401 +10098,69 @@ Additionally it has custom optional properties: /> ``` -### Ref - -The `ref` of the `OverlayScrollbarsComponent` will give you an object with which you can access the OverlayScrollbars `instance` and the root `element` of the component. -The ref object has two properties: - -- `osInstance`: a function which returns the OverlayScrollbars instance. -- `getElement`: a function which returns the root element. - -## Hook - -In case the `OverlayScrollbarsComponent` is not enough, you can also use the `useOverlayScrollbars` hook: - -```jsx -import { useOverlayScrollbars } from "overlayscrollbars-react"; - -// example usage -const Component = () => { - const ref = useRef(); - const [initialize, instance] = useOverlayScrollbars({ options, events, defer }); - - useEffect(() => { - initialize(ref.current); - }, [initialize]); - - return
-} -``` - -The hook is for advanced usage and lets you control the whole initialization process. This is useful if you want to integrate it with other plugins such as `react-window` or `react-virtualized`. - -The hook will destroy the instance automatically if the component unmounts. - -### Parameters - -Parameters are optional and similar to the `OverlayScrollbarsComponent`. -Its an `object` with optional properties: - -- `options`: accepts an `object` which represents the OverlayScrollbars options. -- `events`: accepts an `object` which represents the OverlayScrollbars events. -- `defer`: accepts an `boolean` or `object`. Defers the initialization to a point in time when the browser is idle. - -### Return - -The `useOverlayScrollbars` hook returns a `tuple` with two values: - -- The first value is the `initialization` function, it takes one argument which is the `InitializationTarget`. -- The second value is a function which returns the current OverlayScrollbars instance or `null` if not initialized. - -> __Note__: The identity of both functions is stable and won't change, thus they can safely be used in any dependency array. - -## License - -MIT -``` - -### pako 1.0.11 - -License: (MIT AND Zlib) - -Repository: https://github.com/nodeca/pako - -```text -(The MIT License) - -Copyright (C) 2014-2017 by Vitaly Puzrin and Andrei Tuputcyn - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - -### parse-entities 4.0.2 - -License: MIT - -Repository: https://github.com/wooorm/parse-entities - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### parse5 7.3.0 - -License: MIT - -Repository: https://github.com/inikulin/parse5 - -```text -Copyright (c) 2013-2019 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - -### parse5 8.0.1 - -License: MIT - -Repository: https://github.com/inikulin/parse5 - -```text -Copyright (c) 2013-2019 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - -### path-is-absolute 1.0.1 - -License: MIT - -Repository: https://github.com/sindresorhus/path-is-absolute - -```text -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - -### pdfjs-dist 5.6.205 - -License: Apache-2.0 - -Repository: https://github.com/mozilla/pdf.js - -```text -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +### Ref - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +The `ref` of the `OverlayScrollbarsComponent` will give you an object with which you can access the OverlayScrollbars `instance` and the root `element` of the component. +The ref object has two properties: - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +- `osInstance`: a function which returns the OverlayScrollbars instance. +- `getElement`: a function which returns the root element. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +## Hook - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +In case the `OverlayScrollbarsComponent` is not enough, you can also use the `useOverlayScrollbars` hook: - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +```jsx +import { useOverlayScrollbars } from "overlayscrollbars-react"; - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +// example usage +const Component = () => { + const ref = useRef(); + const [initialize, instance] = useOverlayScrollbars({ options, events, defer }); + + useEffect(() => { + initialize(ref.current); + }, [initialize]); + + return
+} +``` - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +The hook is for advanced usage and lets you control the whole initialization process. This is useful if you want to integrate it with other plugins such as `react-window` or `react-virtualized`. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +The hook will destroy the instance automatically if the component unmounts. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +### Parameters - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +Parameters are optional and similar to the `OverlayScrollbarsComponent`. +Its an `object` with optional properties: - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +- `options`: accepts an `object` which represents the OverlayScrollbars options. +- `events`: accepts an `object` which represents the OverlayScrollbars events. +- `defer`: accepts an `boolean` or `object`. Defers the initialization to a point in time when the browser is idle. - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +### Return - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +The `useOverlayScrollbars` hook returns a `tuple` with two values: - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +- The first value is the `initialization` function, it takes one argument which is the `InitializationTarget`. +- The second value is a function which returns the current OverlayScrollbars instance or `null` if not initialized. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +> __Note__: The identity of both functions is stable and won't change, thus they can safely be used in any dependency array. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +## License - END OF TERMS AND CONDITIONS +MIT ``` -### process-nextick-args 2.0.1 +### parse5 8.0.1 License: MIT -Repository: https://github.com/calvinmetcalf/process-nextick-args +Repository: https://github.com/inikulin/parse5 ```text -# Copyright (c) 2015 Calvin Metcalf +Copyright (c) 2013-2019 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -12761,16 +10169,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.** +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` ### progress 2.0.3 @@ -13633,36 +11041,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### react-markdown 10.1.0 - -License: MIT - -Repository: https://github.com/remarkjs/react-markdown - -```text -The MIT License (MIT) - -Copyright (c) Espen Hovlandsdal - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - ### react-remove-scroll 2.7.2 License: MIT @@ -13754,102 +11132,16 @@ There is a medium article about preventing the body scroll - [How to fight the < MIT ``` -### react-style-singleton 2.2.3 - -License: MIT - -Repository: https://github.com/theKashey/react-style-singleton - -```text -MIT License - -Copyright (c) 2017 Anton Korzunov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -### readable-stream 2.3.8 - -License: MIT - -Repository: https://github.com/nodejs/readable-stream - -```text -Node.js is licensed for use as follows: - -""" -Copyright Node.js contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - -This license applies to parts of Node.js originating from the -https://github.com/joyent/node repository: - -""" -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" -``` - -### regex 6.1.0 +### react-style-singleton 2.2.3 License: MIT -Repository: https://github.com/slevithan/regex +Repository: https://github.com/theKashey/react-style-singleton ```text MIT License -Copyright (c) 2025 Steven Levithan +Copyright (c) 2017 Anton Korzunov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -13870,11 +11162,11 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### regex-recursion 6.0.2 +### regex 6.1.0 License: MIT -Repository: https://github.com/slevithan/regex-recursion +Repository: https://github.com/slevithan/regex ```text MIT License @@ -13900,16 +11192,16 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### regex-utilities 2.3.0 +### regex-recursion 6.0.2 License: MIT -Repository: https://github.com/slevithan/regex-utilities +Repository: https://github.com/slevithan/regex-recursion ```text MIT License -Copyright (c) 2024 Steven Levithan +Copyright (c) 2025 Steven Levithan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -13930,78 +11222,16 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### rehype-raw 7.0.0 - -License: MIT - -Repository: https://github.com/rehypejs/rehype-raw - -```text -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### rehype-sanitize 6.0.0 - -License: MIT - -Repository: https://github.com/rehypejs/rehype-sanitize - -```text -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### remark-parse 11.0.0 +### regex-utilities 2.3.0 License: MIT -Repository: https://github.com/remarkjs/remark.git#main +Repository: https://github.com/slevithan/regex-utilities ```text -(The MIT License) +MIT License -Copyright (c) 2014 Titus Wormer +Copyright (c) 2024 Steven Levithan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -14010,47 +11240,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - -### remark-rehype 11.1.2 - -License: MIT - -Repository: https://github.com/remarkjs/remark-rehype - -```text -(The MIT License) - -Copyright (c) Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` ### rematrix 0.2.2 @@ -14113,36 +11312,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### safe-buffer 5.1.2 - -License: MIT - -Repository: https://github.com/feross/safe-buffer - -```text -The MIT License (MIT) - -Copyright (c) Feross Aboukhadijeh - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - ### sax 1.6.0 License: BlueOak-1.0.0 @@ -14617,35 +11786,6 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` -### setimmediate 1.0.5 - -License: MIT - -Repository: https://github.com/YuzuJS/setImmediate - -```text -Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - ### source-map-js 1.2.1 License: BSD-3-Clause @@ -14676,142 +11816,22 @@ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` - -### space-separated-tokens 2.0.2 - -License: MIT - -Repository: https://github.com/wooorm/space-separated-tokens - -```text -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### sprintf-js 1.0.3 - -License: BSD-3-Clause - -Repository: https://github.com/alexei/sprintf.js - -```text -Copyright (c) 2007-2014, Alexandru Marasteanu -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of this software nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` - -### string_decoder 1.1.1 - -License: MIT - -Repository: https://github.com/nodejs/string_decoder - -```text -Node.js is licensed for use as follows: - -""" -Copyright Node.js contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - -This license applies to parts of Node.js originating from the -https://github.com/joyent/node repository: - -""" -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -### stringify-entities 4.0.4 +### space-separated-tokens 2.0.2 License: MIT -Repository: https://github.com/wooorm/stringify-entities +Repository: https://github.com/wooorm/space-separated-tokens ```text (The MIT License) -Copyright (c) 2015 Titus Wormer +Copyright (c) 2016 Titus Wormer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -14833,51 +11853,20 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### style-to-js 1.1.21 - -License: MIT - -Repository: https://github.com/remarkablemark/style-to-js - -```text -The MIT License (MIT) - -Copyright (c) 2020 Menglin "Mark" Xu - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### style-to-object 1.0.14 +### stringify-entities 4.0.4 License: MIT -Repository: https://github.com/remarkablemark/style-to-object +Repository: https://github.com/wooorm/stringify-entities ```text -The MIT License (MIT) +(The MIT License) -Copyright (c) 2017 Menglin "Mark" Xu +Copyright (c) 2015 Titus Wormer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including +'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to @@ -14886,13 +11875,13 @@ the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` ### sumchecker 3.0.1 @@ -15291,36 +12280,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### trough 2.2.0 - -License: MIT - -Repository: https://github.com/wooorm/trough - -```text -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - ### tslib 2.8.1 License: 0BSD @@ -15342,37 +12301,6 @@ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` -### underscore 1.13.8 - -License: MIT - -Repository: https://github.com/jashkenas/underscore - -```text -Copyright (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. -``` - ### undici 7.28.0 License: MIT @@ -15433,36 +12361,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### unified 11.0.5 - -License: MIT - -Repository: https://github.com/unifiedjs/unified - -```text -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - ### unist-util-is 6.0.1 License: MIT @@ -15737,39 +12635,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### util-deprecate 1.0.2 - -License: MIT - -Repository: https://github.com/TooTallNate/util-deprecate - -```text -(The MIT License) - -Copyright (c) 2014 Nathan Rajlich - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. -``` - ### vfile 6.0.3 License: MIT @@ -15800,37 +12665,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### vfile-location 5.0.3 - -License: MIT - -Repository: https://github.com/vfile/vfile-location - -```text -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - ### vfile-message 4.0.3 License: MIT @@ -15896,37 +12730,6 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -### web-namespaces 2.0.1 - -License: MIT - -Repository: https://github.com/wooorm/web-namespaces - -```text -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - ### webidl-conversions 8.0.1 License: BSD-2-Clause @@ -16179,36 +12982,6 @@ Apache License END OF TERMS AND CONDITIONS ``` -### xmlbuilder 10.1.1 - -License: MIT - -Repository: https://github.com/oozcitak/xmlbuilder-js - -```text -The MIT License (MIT) - -Copyright (c) 2013 Ozgur Ozcitak - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - ### xmlchars 2.2.0 License: MIT diff --git a/desktop/package-lock.json b/desktop/package-lock.json index d6191db3..7c6bf631 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "nvpair", - "version": "0.1.1", + "version": "0.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "nvpair", - "version": "0.1.1", + "version": "0.1.2", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { diff --git a/desktop/package.json b/desktop/package.json index 0b0b1b2d..5362b233 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,6 +1,6 @@ { "name": "nvpair", - "version": "0.1.1", + "version": "0.1.2", "description": "Personal AI Router", "engines": { "node": ">=25.5.0" diff --git a/docs/architecture.mdx b/docs/architecture.mdx index f7e7ffed..4f4771b7 100644 --- a/docs/architecture.mdx +++ b/docs/architecture.mdx @@ -591,9 +591,11 @@ Windows ships none. That responder must coexist with whatever else is on the port, including Bonjour, Avahi, and PAIR's own sibling processes. It therefore sets `SO_REUSEADDR` on the socket to share UDP 5353. -It deliberately does **not** set `SO_REUSEPORT`. On Linux that load-balances +On Linux it deliberately does **not** set `SO_REUSEPORT`: there that load-balances incoming unicast datagrams across every socket sharing the port, which would let -one process swallow mDNS replies meant for another. +one process swallow mDNS replies meant for another. On macOS it sets **both** +`SO_REUSEADDR` and `SO_REUSEPORT`, because the system `mDNSResponder` already +holds the port and a bare `SO_REUSEADDR` bind races with it. ### Node Enrichment diff --git a/services/THIRD_PARTY_NOTICES.md b/services/THIRD_PARTY_NOTICES.md index 8f65d07d..1dc1541c 100644 --- a/services/THIRD_PARTY_NOTICES.md +++ b/services/THIRD_PARTY_NOTICES.md @@ -24,7 +24,6 @@ Scope: dependencies linked into the thirteen shipped binaries (`ollama-proxy`, ` | `github.com/clipperhouse/uax29/v2` | v2.5.0 | MIT | | `github.com/erikgeiser/coninput` | v0.0.0-20211004153227-1c3628e74d0f | MIT | | `github.com/go-ole/go-ole` | v1.2.6 | MIT | -| `github.com/grandcat/zeroconf` | v1.0.0 | MIT | | `github.com/jaypipes/ghw` | v0.24.0 | Apache-2.0 | | `github.com/jaypipes/pcidb` | v1.1.1 | Apache-2.0 | | `github.com/lucasb-eyer/go-colorful` | v1.3.0 | MIT | @@ -515,40 +514,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## github.com/grandcat/zeroconf - -- Version: `v1.0.0` -- License: MIT - -``` -The MIT License (MIT) - -Copyright (c) 2016 Stefan Smarzly -Copyright (c) 2014 Oleksandr Lobunets - -Note: Copyright for portions of project zeroconf.sd are held by Oleksandr - Lobunets, 2014, as part of project bonjour. All other copyright for - project zeroconf.sd are held by Stefan Smarzly, 2016. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - ## github.com/jaypipes/ghw - Version: `v0.24.0` diff --git a/services/bom.md b/services/bom.md index 63497a36..ac24ee83 100644 --- a/services/bom.md +++ b/services/bom.md @@ -15,7 +15,7 @@ The workers are pure Go services with no GUI/native-webview dependencies, so the `nvpair-engine-manager` links no third-party library that the other binaries don't already (only `go-winio` for its Windows named-pipe IPC, plus `golang.org/x/sys`, which it uses directly on Windows to resolve the PID owning a listening port when reclaiming an orphaned managed engine). -As of the mDNS dedup, `grandcat/zeroconf`, `miekg/dns`, and `golang.org/x/net` are linked into the mDNS services **through the first-party `nvpair-shared/mdns` (responder) and `nvpair-shared/discovery` (browser) packages** rather than imported directly by each binary; the Used-By lists below reflect the binaries they end up linked into. Advertising uses only `miekg/dns` + `x/net` (a custom responder); browsing additionally uses `zeroconf`. +As of the mDNS dedup, `miekg/dns` and `golang.org/x/net` are linked into the mDNS services **through the first-party `nvpair-shared/mdns` (responder) and `nvpair-shared/discovery` (browser) packages** rather than imported directly by each binary; the Used-By lists below reflect the binaries they end up linked into. ## Direct Dependencies @@ -25,7 +25,6 @@ As of the mDNS dedup, `grandcat/zeroconf`, `miekg/dns`, and `golang.org/x/net` a | `github.com/charmbracelet/bubbles` | v1.0.0 | nvpair-tui | MIT | [LICENSE](https://github.com/charmbracelet/bubbles/blob/master/LICENSE) | | `github.com/charmbracelet/bubbletea` | v1.3.10 | nvpair-tui | MIT | [LICENSE](https://github.com/charmbracelet/bubbletea/blob/master/LICENSE) | | `github.com/charmbracelet/lipgloss` | v1.1.0 | nvpair-tui | MIT | [LICENSE](https://github.com/charmbracelet/lipgloss/blob/master/LICENSE) | -| `github.com/grandcat/zeroconf` | v1.0.0 | ollama-proxy, lmstudio-proxy, nvpair-node-scanner, nvpair-errors, nvpair-cluster-manager | MIT | [LICENSE](https://github.com/grandcat/zeroconf/blob/master/LICENSE) | | `github.com/jaypipes/ghw` | v0.24.0 | nvpair-node-info | Apache-2.0 | [COPYING](https://github.com/jaypipes/ghw/blob/main/COPYING) | | `github.com/miekg/dns` | v1.1.55 / v1.1.72 | ollama-proxy, lmstudio-proxy, nvpair-node-scanner, nvpair-errors, nvpair-cluster-manager | BSD-3-Clause | [LICENSE](https://github.com/miekg/dns/blob/master/LICENSE) | | `github.com/shirou/gopsutil/v4` | v4.26.7 | nvpair-node-info (macOS) | BSD-3-Clause | [LICENSE](https://github.com/shirou/gopsutil/blob/master/LICENSE) | @@ -39,7 +38,6 @@ As of the mDNS dedup, `grandcat/zeroconf`, `miekg/dns`, and `golang.org/x/net` a |---------|-----------|--------------|---------|-------------| | `github.com/atotto/clipboard` | v0.1.4 | bubbletea (textinput) | BSD-3-Clause | [LICENSE](https://github.com/atotto/clipboard/blob/master/LICENSE) | | `github.com/aymanbagabas/go-osc52/v2` | v2.0.1 | termenv | MIT | [LICENSE](https://github.com/aymanbagabas/go-osc52/blob/main/LICENSE) | -| `github.com/cenkalti/backoff` | v2.2.1+incompatible | zeroconf | MIT | [LICENSE](https://github.com/cenkalti/backoff/blob/v2/LICENSE) | | `github.com/charmbracelet/colorprofile` | v0.4.1 | bubbletea | MIT | [LICENSE](https://github.com/charmbracelet/colorprofile/blob/main/LICENSE) | | `github.com/charmbracelet/x/ansi` | v0.11.6 | lipgloss, bubbletea | MIT | [LICENSE](https://github.com/charmbracelet/x/blob/main/LICENSE) | | `github.com/charmbracelet/x/cellbuf` | v0.0.15 | bubbletea | MIT | [LICENSE](https://github.com/charmbracelet/x/blob/main/LICENSE) | @@ -62,9 +60,9 @@ As of the mDNS dedup, `grandcat/zeroconf`, `miekg/dns`, and `golang.org/x/net` a | `github.com/tklauser/go-sysconf` | v0.3.16 | gopsutil (macOS) | BSD-3-Clause | [LICENSE](https://github.com/tklauser/go-sysconf/blob/master/LICENSE) | | `github.com/xo/terminfo` | v0.0.0-20220910002029 | colorprofile | MIT | [LICENSE](https://github.com/xo/terminfo/blob/master/LICENSE) | | `github.com/yusufpapurcu/wmi` | v1.2.4 | ghw | MIT | [LICENSE](https://github.com/yusufpapurcu/wmi/blob/master/LICENSE) | -| `golang.org/x/mod` | v0.12.0 / v0.17.0 / v0.31.0 | zeroconf (via miekg/dns) | BSD-3-Clause | [LICENSE](https://cs.opensource.google/go/x/mod/+/master:LICENSE) | -| `golang.org/x/sync` | v0.10.0 / v0.19.0 | zeroconf (via miekg/dns) | BSD-3-Clause | [LICENSE](https://cs.opensource.google/go/x/sync/+/master:LICENSE) | -| `golang.org/x/sys` | v0.47.0 | go-winio, zeroconf, ghw, charmbracelet/x/term | BSD-3-Clause | [LICENSE](https://cs.opensource.google/go/x/sys/+/master:LICENSE) | +| `golang.org/x/mod` | v0.12.0 / v0.17.0 / v0.31.0 | miekg/dns | BSD-3-Clause | [LICENSE](https://cs.opensource.google/go/x/mod/+/master:LICENSE) | +| `golang.org/x/sync` | v0.10.0 / v0.19.0 | miekg/dns | BSD-3-Clause | [LICENSE](https://cs.opensource.google/go/x/sync/+/master:LICENSE) | +| `golang.org/x/sys` | v0.47.0 | go-winio, ghw, charmbracelet/x/term | BSD-3-Clause | [LICENSE](https://cs.opensource.google/go/x/sys/+/master:LICENSE) | | `golang.org/x/text` | v0.3.8 | charmbracelet/x/ansi | BSD-3-Clause | [LICENSE](https://cs.opensource.google/go/x/text/+/master:LICENSE) | -| `golang.org/x/tools` | v0.11.0 / v0.21.1-0.20240508 / v0.40.0 | zeroconf (via miekg/dns) | BSD-3-Clause | [LICENSE](https://cs.opensource.google/go/x/tools/+/master:LICENSE) | +| `golang.org/x/tools` | v0.11.0 / v0.21.1-0.20240508 / v0.40.0 | miekg/dns | BSD-3-Clause | [LICENSE](https://cs.opensource.google/go/x/tools/+/master:LICENSE) | | `gopkg.in/yaml.v3` | v3.0.1 | ghw | MIT + Apache-2.0 | [LICENSE](https://github.com/go-yaml/yaml/blob/v3/LICENSE) | diff --git a/services/installer/linux/INSTALL.md b/services/installer/linux/INSTALL.md index 7e50420f..a961f956 100644 --- a/services/installer/linux/INSTALL.md +++ b/services/installer/linux/INSTALL.md @@ -69,8 +69,8 @@ that directory too if you want a fully clean slate. - 64-bit Linux on `x86_64`. ARM builds are not produced yet. - mDNS on UDP 5353. The workers run their own — a custom per-interface responder - (`nvpair-shared/mdns`) plus a `grandcat/zeroconf` browser (`nvpair-shared/discovery`), - bound with `SO_REUSEADDR` — and coexist fine with a system responder like + (`nvpair-shared/mdns`) plus a browser (`nvpair-shared/discovery`), bound with + `SO_REUSEADDR` — and coexist fine with a system responder like `avahi-daemon`; no configuration needed. ## Troubleshooting diff --git a/services/lmstudio-proxy/go.mod b/services/lmstudio-proxy/go.mod index ccc82a1e..6c4f767c 100644 --- a/services/lmstudio-proxy/go.mod +++ b/services/lmstudio-proxy/go.mod @@ -8,8 +8,6 @@ replace nvpair-shared => ../shared require ( github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/grandcat/zeroconf v1.0.0 // indirect github.com/miekg/dns v1.1.55 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.58.0 // indirect diff --git a/services/lmstudio-proxy/go.sum b/services/lmstudio-proxy/go.sum index fe333ffe..a567988b 100644 --- a/services/lmstudio-proxy/go.sum +++ b/services/lmstudio-proxy/go.sum @@ -1,35 +1,14 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= -github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= -github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/services/nvpair-cluster-manager/go.mod b/services/nvpair-cluster-manager/go.mod index 713e7658..5e667751 100644 --- a/services/nvpair-cluster-manager/go.mod +++ b/services/nvpair-cluster-manager/go.mod @@ -9,8 +9,6 @@ require ( require ( github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/grandcat/zeroconf v1.0.0 // indirect github.com/miekg/dns v1.1.72 // indirect golang.org/x/mod v0.31.0 // indirect golang.org/x/net v0.58.0 // indirect diff --git a/services/nvpair-cluster-manager/go.sum b/services/nvpair-cluster-manager/go.sum index 0b805de1..d0447461 100644 --- a/services/nvpair-cluster-manager/go.sum +++ b/services/nvpair-cluster-manager/go.sum @@ -1,37 +1,16 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= -github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= -github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI= github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/services/nvpair-errors/go.mod b/services/nvpair-errors/go.mod index 06533f0f..5fc6503c 100644 --- a/services/nvpair-errors/go.mod +++ b/services/nvpair-errors/go.mod @@ -8,8 +8,6 @@ replace nvpair-shared => ../shared require ( github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/grandcat/zeroconf v1.0.0 // indirect github.com/miekg/dns v1.1.55 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.58.0 // indirect diff --git a/services/nvpair-errors/go.sum b/services/nvpair-errors/go.sum index c65e0832..82e83231 100644 --- a/services/nvpair-errors/go.sum +++ b/services/nvpair-errors/go.sum @@ -1,35 +1,14 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= -github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= -github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/services/nvpair-node-scanner/go.mod b/services/nvpair-node-scanner/go.mod index f0dcc726..e4ae81d4 100644 --- a/services/nvpair-node-scanner/go.mod +++ b/services/nvpair-node-scanner/go.mod @@ -8,8 +8,6 @@ replace nvpair-shared => ../shared require ( github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/grandcat/zeroconf v1.0.0 // indirect github.com/miekg/dns v1.1.55 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.58.0 // indirect diff --git a/services/nvpair-node-scanner/go.sum b/services/nvpair-node-scanner/go.sum index c65e0832..82e83231 100644 --- a/services/nvpair-node-scanner/go.sum +++ b/services/nvpair-node-scanner/go.sum @@ -1,35 +1,14 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= -github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= -github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/services/nvpair-ui-broker/ollamahost_test.go b/services/nvpair-ui-broker/ollamahost_test.go index c9a732a8..9350ec6a 100644 --- a/services/nvpair-ui-broker/ollamahost_test.go +++ b/services/nvpair-ui-broker/ollamahost_test.go @@ -214,6 +214,7 @@ func isolateOllamaHostTestConfig(t *testing.T) { dir := t.TempDir() t.Setenv("LOCALAPPDATA", dir) t.Setenv("XDG_CONFIG_HOME", dir) + t.Setenv("HOME", dir) } func TestAliasWarningReplaysAfterErrorsProcessRecovery(t *testing.T) { diff --git a/services/nvpair-workload-manager/relaysource.go b/services/nvpair-workload-manager/relaysource.go index c1510990..51ff41a9 100644 --- a/services/nvpair-workload-manager/relaysource.go +++ b/services/nvpair-workload-manager/relaysource.go @@ -21,11 +21,10 @@ import ( // relayPeerSource maintains the peer set pushed down by the broker relay, keyed // by the directory hostUuid. It drops our own _nvpair-node record from the peer // set — the relay directory includes the local node (the client node list wants -// it), but a broadcast target set must not, mirroring the mDNS browser's -// WithSelfFilter. selfUUID is this node's stable per-host UUID; the self-filter -// keys on it, so a peer that merely shares our hostname is NOT dropped. -// A relay DirectoryNode always carries a hostUuid (the scanner -// guarantees it), so there is no hostname fallback. +// it), but a broadcast target set must not. selfUUID is this node's stable +// per-host UUID; the self-filter keys on it, so a peer that merely shares our +// hostname is NOT dropped. A relay DirectoryNode always carries a hostUuid (the +// scanner guarantees it), so there is no hostname fallback. type relayPeerSource struct { selfUUID string diff --git a/services/ollama-proxy/go.mod b/services/ollama-proxy/go.mod index 73e423ea..f9675cc2 100644 --- a/services/ollama-proxy/go.mod +++ b/services/ollama-proxy/go.mod @@ -8,8 +8,6 @@ replace nvpair-shared => ../shared require ( github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/grandcat/zeroconf v1.0.0 // indirect github.com/miekg/dns v1.1.55 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.58.0 // indirect diff --git a/services/ollama-proxy/go.sum b/services/ollama-proxy/go.sum index fe333ffe..a567988b 100644 --- a/services/ollama-proxy/go.sum +++ b/services/ollama-proxy/go.sum @@ -1,35 +1,14 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= -github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= -github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/services/readme.md b/services/readme.md index ee3523d5..d61140ea 100644 --- a/services/readme.md +++ b/services/readme.md @@ -55,7 +55,7 @@ This tree builds thirteen Go binaries. `nvpair-ui-broker` is the parent service Shared code lives in the local `shared/` Go module (imported as `nvpair-shared/…`, replaced via `replace nvpair-shared => ../shared`). It provides logging, wire types, JSON-RPC and IPC, discovery records, mDNS, network monitoring, stable node identity, application data paths, and cluster trust helpers. -The mDNS responder is our own rather than the host's, because Windows ships none. It sets `SO_REUSEADDR` so it shares UDP 5353 with sibling PAIR processes and with a system responder — `avahi-daemon` on Linux, Bonjour where present — needing no configuration on either platform. +The mDNS responder is our own rather than the host's, because Windows ships none. It sets `SO_REUSEADDR` so it shares UDP 5353 with sibling PAIR processes and with a system responder — `avahi-daemon` on Linux, Bonjour where present — needing no configuration on either platform. On macOS it also sets `SO_REUSEPORT`, because the system `mDNSResponder` holds the port and a bare `SO_REUSEADDR` bind races with it. The broker feeds every accepted local or peer workload transition plus compact GPU telemetry to the scheduler. Queued and running work is counted by destination diff --git a/services/shared/discovery/discovery.go b/services/shared/discovery/discovery.go index 973ac4b2..a368ac01 100644 --- a/services/shared/discovery/discovery.go +++ b/services/shared/discovery/discovery.go @@ -1,38 +1,41 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -// Package discovery provides a single mDNS service browser that six services -// (nvpair-node-scanner, nvpair-errors, ollama-proxy, lmstudio-proxy, -// nvpair-workload-manager, nvpair-cluster-manager) each carried a near-identical copy -// of (the mDNS dedup). +// Package discovery provides the mDNS service browser the nvpair-node-scanner +// daemon runs for its single _nvpair-node record. It was lifted from the +// near-identical copies six services (nvpair-node-scanner, nvpair-errors, +// ollama-proxy, lmstudio-proxy, nvpair-workload-manager, nvpair-cluster-manager) +// each carried; after the broker's discovery relay consolidated the other five, +// the scanner's daemon is the only live consumer. The other services import this +// package for its shapes (Node, Event) and identity helpers (UUIDFromTXT, +// SameStringSet), feeding the browser with the relay's discovery:nodes snapshots +// instead of browsing mDNS themselves. // -// The core is a scan-and-diff state machine: each scan browses a service type -// over grandcat/zeroconf, re-sends the PTR query from a per-interface unicast -// socket (the Windows send workaround — zeroconf sends from a multicast-bound -// socket Windows refuses to transmit on), and reconciles the result against the -// known-node map. Address/TXT comparison is order-insensitive so a multi-homed -// node whose records come back reordered doesn't churn a spurious "updated". +// The core is a scan-and-diff state machine: each scan transmits the PTR query +// from a long-lived per-interface send-socket pool (one unicast-bound socket per +// interface, reused every scan — this replaces the per-scan send socket, and the +// pool is the cross-platform stand-in for the grandcat/zeroconf resolver it +// supersedes) and reconciles the responses a single long-lived receive socket has +// gathered, against the known-node map. Both sockets open once for the life of the +// run and are reused every scan rather than opened fresh each time, which is what +// degraded the macOS network stack over time. Address/TXT comparison is +// order-insensitive so a multi-homed node whose records come back reordered doesn't +// churn a spurious "updated". // // The per-service variations are expressed as functional options rather than // forks: -// - WithInterval / WithScanTimeout — cluster-manager browses at 30s. -// - WithMissThreshold — consecutive misses before eviction (default -// missThresholdDefault). -// - WithNoEviction — accumulate-only, never evict (cluster-manager). +// - WithInterval / WithScanTimeout / WithMissThreshold — tune the scan cadence, +// the per-scan response window, and the consecutive-miss eviction threshold. // - WithLivenessProbe — TCP-probe a threshold-missed node before evicting it; -// if it still answers, keep it (the proxies' anti-flap guard). -// - WithSelfFilter — drop our own advertisement from results (workload-manager). +// if it still answers, keep it (the scanner daemon's anti-flap guard). // - WithKeyFunc — key the node map by something other than the instance name -// (cluster-manager keys by uuid= so two hosts sharing an instance name but +// (the scanner keys by uuid= so two hosts sharing an instance name but // distinct UUIDs don't collide). // -// Two consumption shapes are supported over the same core: -// - Run(ctx, events) — push: a background loop that emits Discovered/Updated/ -// Removed events (scanner, errors, proxies). events may be nil for a -// consumer that only wants the map maintained and queries it via Nodes() -// (cluster-manager). -// - Poll(ctx) — pull: one scan+reconcile that returns the current snapshot -// (workload-manager's on-demand PeerSource). +// The one consumption shape is: +// - Run(ctx, events) — a background loop that emits Discovered/Updated/Removed +// events. events may be nil for a consumer that only wants the map maintained +// and queries it via Nodes(). package discovery import ( @@ -44,9 +47,9 @@ import ( "sync" "time" - "github.com/grandcat/zeroconf" + "nvpair-shared/mcast" + "github.com/miekg/dns" - "golang.org/x/net/ipv4" ) // Event types emitted by Run. @@ -153,9 +156,7 @@ type options struct { interval time.Duration scanTimeout time.Duration missThreshold int - noEvict bool liveness func(Node) bool - selfInstance string keyFunc func(Node) string warnCollision bool } @@ -173,27 +174,17 @@ func WithScanTimeout(d time.Duration) Option { return func(o *options) { o.scanT // before it is eligible for eviction (default missThresholdDefault). func WithMissThreshold(n int) Option { return func(o *options) { o.missThreshold = n } } -// WithNoEviction makes the browser accumulate-only: a node is never removed once -// seen. For a consumer that wants a departed peer to keep resolving (e.g. an -// invite flow) rather than being evicted at the miss threshold. -func WithNoEviction() Option { return func(o *options) { o.noEvict = true } } - // WithLivenessProbe supplies a reachability check run against a threshold-missed // node before it is evicted; returning true keeps the node (its miss counter is -// reset). This is the proxies' TCP-probe-before-evict guard: an mDNS miss is not -// proof a node is gone. Probes run outside the browser lock and up to +// reset). This is the node-scanner daemon's TCP-probe-before-evict guard: an mDNS +// miss is not proof a node is gone. Probes run outside the browser lock and up to // probeConcurrency at a time, so fn must be safe for concurrent use. func WithLivenessProbe(fn func(Node) bool) Option { return func(o *options) { o.liveness = fn } } -// WithSelfFilter excludes entries whose instance name matches selfInstance — -// our own advertisement looping back (workload-manager). -func WithSelfFilter(selfInstance string) Option { - return func(o *options) { o.selfInstance = selfInstance } -} - // WithKeyFunc keys the node map by fn(node) instead of the instance name. Return -// "" to fall back to the instance name for that node. cluster-manager keys by -// uuid= so two hosts sharing an instance name but distinct UUIDs don't collide. +// "" to fall back to the instance name for that node. The node-scanner daemon +// keys by uuid= so two hosts sharing an instance name but distinct UUIDs don't +// collide. func WithKeyFunc(fn func(Node) string) Option { return func(o *options) { o.keyFunc = fn } } // Browser maintains a reconciled set of discovered nodes for one service type. @@ -216,9 +207,23 @@ type Browser struct { // selection move a host's canonical address for no reason. sendMisses map[string]int + // sender is the long-lived per-interface send-socket pool the browse query is + // transmitted from (see sendQuery). It holds one socket per interface + // and reuses it for every transmission, so a host whose packet filter + // inspects each new flow keeps a stable set of flows rather than a fresh one + // per scan. It is created lazily on the first scan and refreshed only when + // the host's interface set changes. Guarded by mu alongside the map it feeds. + sender *mcast.Sender + + // recv is the long-lived receive socket (see receiver.go) that browses draw + // their responses from, shared across all scans instead of a fresh socket per + // scan. It is set up in Run and closed on shutdown; nil in tests that override + // browseFunc. Guarded by mu. + recv *receiver + // browseFunc performs one browse cycle and returns the seen set keyed the - // same way as the node map. Defaults to the real zeroconf browse; overridden - // in tests to exercise reconciliation deterministically. + // same way as the node map. Defaults to the real browse; overridden in tests + // to exercise reconciliation deterministically. browseFunc func(context.Context) map[string]Node } @@ -343,10 +348,16 @@ func (b *Browser) Nodes() []Node { // Run performs periodic scans until ctx is cancelled. When events is non-nil it // receives Discovered/Updated/Removed events and is closed on return; pass nil // to only maintain the map (query it via Nodes()). +// +// It opens the shared mDNS receive socket once for the lifetime of the run. That +// socket — not a fresh resolver per scan — is what the scans draw their responses +// from, which is what keeps a host whose kernel reaps socket state slowly from +// degrading over time. func (b *Browser) Run(ctx context.Context, events chan<- Event) { if events != nil { defer close(events) } + b.startReceive(ctx) b.scanEmit(ctx, events) ticker := time.NewTicker(b.opt.interval) @@ -361,13 +372,45 @@ func (b *Browser) Run(ctx context.Context, events chan<- Event) { } } -// Poll performs one scan+reconcile and returns the current snapshot. It's the -// pull-model entry point (workload-manager's PeerSource), an alternative to Run. -func (b *Browser) Poll(ctx context.Context) []Node { - if ctx.Err() == nil { - b.reconcile(b.browseFunc(ctx)) +// startReceive opens the browser's long-lived receive socket for the life of this +// run and starts the goroutines that feed it (the read loop that decodes arriving +// records, and the interface monitor that keeps the multicast memberships current). +// It is called once from Run — the only production consumer — and is idempotent. +// A test that overrides browseFunc and never calls Run leaves recv nil, so no +// real socket is opened there. +// +// The socket is created outside the lock (a bind + group joins is a few system +// calls), then stored under it; a concurrent caller that got there first wins and +// the redundant socket is closed. If the socket cannot be bound (port in use, no +// multicast interface) it logs and leaves recv nil: browse then reports an empty +// scan, and the responder side is unaffected. On ctx cancellation the socket is +// closed and its multicast memberships left. +func (b *Browser) startReceive(ctx context.Context) { + if ctx.Err() != nil { + return } - return b.Nodes() + ifaces, _ := enumerateIfaces() + recv, err := NewReceiver(ctx, b.service, b.domain, ifaces) + if err != nil { + slog.Warn("mDNS browser could not open its receive socket; discovery will be empty", + "service", b.service, "err", err) + return + } + b.mu.Lock() + if b.recv != nil { + b.mu.Unlock() + recv.Stop() + return + } + b.recv = recv + b.mu.Unlock() + + go recv.readLoop(ctx) + go recv.monitorIfaces(ctx) + go func() { + <-ctx.Done() + recv.Stop() + }() } // scanEmit runs one browse+reconcile and, when events is non-nil, forwards the @@ -415,11 +458,6 @@ func (b *Browser) reconcile(seen map[string]Node) []Event { delete(b.misses, k) } - if b.opt.noEvict { - b.mu.Unlock() - return pending - } - // Losing several independent nodes in one scan is treated as a failure of this // browser before it is treated as news about the fleet — see emptyScanGrace. // Bounded, so a fleet that really has gone still ages out. @@ -526,102 +564,56 @@ func (b *Browser) probeLiveness(nodes []Node) []verdict { return verdicts } -// browse performs one real mDNS browse cycle over zeroconf plus the -// per-interface unicast query re-send, returning the seen set keyed like the -// node map. +// browse performs one real mDNS browse cycle: it transmits the PTR query from the +// long-lived per-interface send pool and collects the responses the shared receive +// socket has gathered since the previous scan, returning the seen set keyed like +// the node map. +// +// It draws on the same two stable sockets for the whole run rather than opening a +// fresh grandcat/zeroconf resolver per scan — two UDP sockets and a JoinGroup on +// every interface each time — which is what degraded the macOS network stack over +// time. The receive socket is started in Run; a browser that never ran (or whose +// socket could not be bound) reports an empty scan. func (b *Browser) browse(ctx context.Context) map[string]Node { seen := make(map[string]Node) - resolver, err := zeroconf.NewResolver(nil) - if err != nil { - slog.Warn("failed to create mDNS resolver", "err", err) + b.mu.Lock() + recv := b.recv + b.mu.Unlock() + if recv == nil { return seen } - entries := make(chan *zeroconf.ServiceEntry) - done := make(chan struct{}) - go func() { - defer close(done) - for entry := range entries { - if b.opt.selfInstance != "" && entry.Instance == b.opt.selfInstance { - continue // our own advertisement - } - addrs := make([]string, 0, len(entry.AddrIPv4)+len(entry.AddrIPv6)) - for _, ip := range entry.AddrIPv4 { - addrs = append(addrs, ip.String()) - } - for _, ip := range entry.AddrIPv6 { - if !isLinkLocal(ip) { - addrs = append(addrs, ip.String()) - } - } - node := Node{ - ID: entry.Instance, - Host: entry.HostName, - Port: entry.Port, - Addresses: addrs, - TXT: entry.Text, - } - seen[b.key(node)] = node - } - }() + // Transmit the query from the per-interface send pool. This is the canonical + // (and only) copy on every platform: the shared receive socket above collects + // the responses. A send that fails at the socket is also the cheapest evidence + // that the kernel has no usable route out of that interface, which address + // selection consumes via recordSendOutcomes / SendFailures. + b.recordSendOutcomes(b.sendQuery()) scanCtx, cancel := context.WithTimeout(ctx, b.opt.scanTimeout) defer cancel() - - if err := resolver.Browse(scanCtx, b.service, b.domain, entries); err != nil { - slog.Warn("mDNS browse error", "service", b.service, "err", err) - } - // grandcat/zeroconf binds its single send/receive socket to the multicast - // wildcard 224.0.0.0:5353. Windows refuses to send from a socket whose local - // address is a multicast group, so the library's outgoing PTR query is - // silently dropped there (the WriteTo error is swallowed inside zeroconf). - // We re-send the query from a per-interface unicast-bound socket, which - // Windows delivers; receive works fine on Windows (joined sockets receive - // multicast regardless of local binding), so we keep zeroconf for that. - b.recordSendOutcomes(sendMulticastQuery(b.service, b.domain)) <-scanCtx.Done() - <-done - return seen -} - -// sendMulticastQuery emits a single mDNS PTR query for `..` on -// every up, multicast-capable, non-loopback IPv4 interface. Per-interface -// failures are logged at DEBUG and ignored for the query's purpose — one -// successful send is enough to discover the LAN. -// -// It returns each attempted interface's outcome keyed by name, because a send -// that fails at the socket is also the cheapest evidence available that the -// kernel has no usable route out of that interface. Address selection consumes -// it (see Browser.SendFailures) rather than paying for a probe of its own. -func sendMulticastQuery(service, domain string) map[string]bool { - outcomes := make(map[string]bool) - msg := new(dns.Msg) - qname := fmt.Sprintf("%s.%s.", strings.Trim(service, "."), strings.Trim(domain, ".")) - msg.SetQuestion(qname, dns.TypePTR) - msg.RecursionDesired = false - buf, err := msg.Pack() - if err != nil { - slog.Warn("mdns send: pack query failed", "service", service, "err", err) - return outcomes + for _, n := range recv.drain() { + seen[b.key(n)] = n } - target := &net.UDPAddr{IP: net.IPv4(224, 0, 0, 251), Port: 5353} + return seen +} +// enumerateIfaces returns the host's up, multicast-capable, non-loopback IPv4 +// interfaces as an index->addresses map (the set mcast.Sender draws its pool +// from) alongside an index->name map (for reporting outcomes by the name that +// SendFailures and address selection key on). An interface the kernel reports no +// usable address for is omitted, exactly as the per-send path this replaces did. +func enumerateIfaces() (map[int][]net.IP, map[int]string) { + v4 := make(map[int][]net.IP) + names := make(map[int]string) ifaces, err := net.Interfaces() if err != nil { - slog.Warn("mdns send: enumerate interfaces failed", "err", err) - return outcomes + return v4, names } - - var sent int - // Why each interface could not carry the query, for the warning below. The - // count on its own cannot separate a host with no usable interface from one - // whose sockets are being refused, and the errors that draw that distinction - // were DEBUG only — below the level the app ships with, so every field report - // of this warning has arrived without the one fact that explains it. - var failures []string for _, ifi := range ifaces { if ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 || ifi.Flags&net.FlagLoopback != 0 { continue @@ -630,55 +622,90 @@ func sendMulticastQuery(service, domain string) map[string]bool { if err != nil { continue } - var src net.IP + var ips []net.IP for _, a := range addrs { ipnet, ok := a.(*net.IPNet) if !ok { continue } - if ip4 := ipnet.IP.To4(); ip4 != nil { - src = ip4 - break + if ip4 := ipnet.IP.To4(); ip4 != nil && !ip4.IsLoopback() { + ips = append(ips, ip4) } } - if src == nil { + if len(ips) == 0 { continue } + v4[ifi.Index] = ips + names[ifi.Index] = ifi.Name + } + return v4, names +} - ifi := ifi - conn, err := net.ListenUDP("udp4", &net.UDPAddr{IP: src, Port: 0}) - if err != nil { - slog.Debug("mdns send: bind failed", "iface", ifi.Name, "ip", src.String(), "err", err) - outcomes[ifi.Name] = false - failures = append(failures, fmt.Sprintf("%s bind: %v", ifi.Name, err)) +// sendQuery transmits the browse PTR query from the browser's long-lived +// per-interface send-socket pool on every interface (see browse). It runs on every +// platform: the pool holds one unicast-bound socket per interface and reuses it, +// so an OS packet filter that inspects each new flow (the macOS Application +// Firewall, where this matters most) keeps a stable set of flows rather than a +// fresh one per scan, and the query is the single canonical copy — the receive +// socket collects the responses. It is created on first use and refreshed only +// when the host's interface set changes, so a steady-state scan causes no socket +// churn. +// +// It returns each attempted interface's outcome keyed by name for +// recordSendOutcomes / SendFailures. A send that fails at the socket is also the +// cheapest evidence available that the kernel has no usable route out of that +// interface, which is why address selection consumes it. +func (b *Browser) sendQuery() map[string]bool { + v4, names := enumerateIfaces() + + b.mu.Lock() + if b.sender == nil { + b.sender = mcast.New(v4) + } else { + b.sender.Refresh(v4) + } + sender := b.sender + b.mu.Unlock() + + msg := new(dns.Msg) + qname := fmt.Sprintf("%s.%s.", strings.Trim(b.service, "."), strings.Trim(b.domain, ".")) + msg.SetQuestion(qname, dns.TypePTR) + msg.RecursionDesired = false + buf, err := msg.Pack() + if err != nil { + slog.Warn("mdns send: pack query failed", "service", b.service, "err", err) + return nil + } + + target := &net.UDPAddr{IP: net.IPv4(224, 0, 0, 251), Port: 5353} + outcomes := sender.SendMulticast(buf, target, sender.Ifaces()) + + named := make(map[string]bool, len(outcomes)) + var sent int + var dark []string + for idx, ok := range outcomes { + name, known := names[idx] + if !known { continue } - pc := ipv4.NewPacketConn(conn) - if err := pc.SetMulticastInterface(&ifi); err != nil { - slog.Debug("mdns send: SetMulticastInterface failed", "iface", ifi.Name, "err", err) - } - _ = pc.SetMulticastTTL(255) - if _, err := conn.WriteToUDP(buf, target); err != nil { - slog.Debug("mdns send: write failed", "iface", ifi.Name, "ip", src.String(), "err", err) - outcomes[ifi.Name] = false - failures = append(failures, fmt.Sprintf("%s write: %v", ifi.Name, err)) - } else { - slog.Debug("mdns send: query sent", "service", service, "iface", ifi.Name, "ip", src.String()) - outcomes[ifi.Name] = true + named[name] = ok + if ok { sent++ + } else { + dark = append(dark, name) } - _ = conn.Close() } if sent == 0 { - // A zero `failed` here means no interface even qualified to be asked, - // which is a different fault from one whose sockets were refused. + // `attempted` 0 means no interface even qualified to be asked, which is a + // different fault from interfaces present but whose sockets were refused; + // `dark` lists the latter by name. slog.Warn("mdns send: query did not leave any interface", - "service", service, - "failed", len(failures), - "errors", strings.Join(failures, "; ")) + "service", b.service, + "attempted", len(outcomes), + "dark", strings.Join(dark, ",")) } - return outcomes + return named } // UUIDFromTXT returns the value of the "uuid=" TXT record, or "" if absent. It's diff --git a/services/shared/discovery/discovery_test.go b/services/shared/discovery/discovery_test.go index 2aaa683e..81daf099 100644 --- a/services/shared/discovery/discovery_test.go +++ b/services/shared/discovery/discovery_test.go @@ -290,19 +290,6 @@ func TestReconcileOrderInsensitive(t *testing.T) { } } -func TestNoEviction(t *testing.T) { - b := New("_nvpair-test._tcp", "local", WithNoEviction(), WithMissThreshold(1)) - b.reconcile(seenSet(node("a"))) - for i := 0; i < 5; i++ { - if evs := b.reconcile(seenSet()); len(evs) != 0 { - t.Fatalf("no-evict browser emitted %v on miss %d", evs, i+1) - } - } - if len(b.Nodes()) != 1 { - t.Fatalf("no-evict browser dropped the node: %v", b.Nodes()) - } -} - func TestLivenessProbeRetainsReachable(t *testing.T) { b := New("_nvpair-test._tcp", "local", WithMissThreshold(2), WithLivenessProbe(func(Node) bool { return true })) b.reconcile(seenSet(node("a"))) @@ -399,15 +386,6 @@ func TestSeed(t *testing.T) { } } -func TestPollReturnsSnapshot(t *testing.T) { - b := New("_nvpair-test._tcp", "local") - b.browseFunc = func(context.Context) map[string]Node { return seenSet(node("a"), node("b")) } - got := b.Poll(context.Background()) - if len(got) != 2 { - t.Fatalf("Poll returned %d nodes, want 2", len(got)) - } -} - func TestRunEmitsAndCloses(t *testing.T) { b := New("_nvpair-test._tcp", "local", WithInterval(5*time.Millisecond), WithMissThreshold(1)) // First scan sees "a"; every subsequent scan is empty so it's removed. diff --git a/services/shared/discovery/receiver.go b/services/shared/discovery/receiver.go new file mode 100644 index 00000000..848c9354 --- /dev/null +++ b/services/shared/discovery/receiver.go @@ -0,0 +1,342 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package discovery + +import ( + "context" + "fmt" + "net" + "strings" + "sync" + "time" + + "nvpair-shared/netmon" + + "github.com/miekg/dns" + "golang.org/x/net/ipv4" +) + +const ( + // mdnsPort is the mDNS UDP port. + mdnsPort = 5353 + // readDeadline bounds one receive read so the loop can observe shutdown + // between packets; it matches the responder's read cadence. + readDeadline = 500 * time.Millisecond +) + +// mdnsGroupV4 is the mDNS IPv4 multicast group the browser joins to receive. +var mdnsGroupV4 = net.IPv4(224, 0, 0, 251) + +// receiver is a single long-lived mDNS receive socket: bound to the multicast +// wildcard on 5353, joined to the mDNS group on every multicast interface, and +// continuously decoding incoming DNS-SD records into Node values that the browser +// drains on each scan. +// +// It exists because the browser previously built a fresh grandcat/zeroconf +// resolver — two UDP sockets plus a JoinGroup on every interface — on every scan +// for the life of the process. That create/join/teardown churn degrades the macOS +// network stack over time. One stable socket, joined once per interface and +// re-joined only when the interface set changes, removes the churn while +// receiving exactly the packets the per-scan socket did. +// +// Sharing 5353 is explicit: the socket is bound through the setReuseAddr hook +// (SO_REUSEADDR on every platform, plus SO_REUSEPORT on macOS), so it coexists +// with the PAIR responder and the system mDNS responder on the same host. The +// net package sets the same options itself for a multicast listen address, but +// the hook makes that dependency visible here rather than incidental; joining +// the group on each interface is what actually receives. +// +// It is deliberately IPv4-only. The PAIR responder (shared/mdns) is IPv4-only, +// so every node it advertises is reachable over IPv4; the grandcat/zeroconf +// resolver it replaced opened a second IPv6 socket that only ever carried +// non-PAIR traffic. One IPv4 socket therefore receives exactly the PAIR records +// the two-socket resolver did, at half the socket churn. +type receiver struct { + service string + domain string + + mu sync.Mutex + conn *net.UDPConn + pconn *ipv4.PacketConn + joined map[int]bool + buf []Node + stop chan struct{} +} + +// mdnsWildcardV4 is the address the receive socket binds to: the multicast +// wildcard 224.0.0.0 (not 0.0.0.0) — exactly the bind the grandcat/zeroconf +// resolver it replaced used, which is why the per-scan socket received the +// responses it did. The net package normalizes a multicast listen address to +// the unicast wildcard (0.0.0.0) before binding, so the address records intent +// while the socket coexists on 5353 with the PAIR responder and the system +// mDNS responder the same way it does without this constant. +var mdnsWildcardV4 = net.IPv4(224, 0, 0, 0) + +// NewReceiver binds the long-lived receive socket — through the setReuseAddr +// hook, per the type's sharing note — and joins the mDNS group on every +// interface in ifaces. It returns an error only if the socket cannot be bound; +// interfaces that fail to join are skipped (a wedged adapter must not darken +// the rest). +func NewReceiver(ctx context.Context, service, domain string, ifaces map[int][]net.IP) (*receiver, error) { + lc := net.ListenConfig{Control: setReuseAddr} + pktConn, err := lc.ListenPacket(ctx, "udp4", mdnsWildcardV4.String()+":"+fmt.Sprint(mdnsPort)) + if err != nil { + return nil, err + } + conn := pktConn.(*net.UDPConn) + r := &receiver{ + service: service, + domain: domain, + conn: conn, + pconn: ipv4.NewPacketConn(conn), + joined: make(map[int]bool), + stop: make(chan struct{}), + } + r.joinedOn(ifaces) + return r, nil +} + +// serviceName returns the fully-qualified service type (e.g. "_nvpair-node._tcp.local."). +func (r *receiver) serviceName() string { + domain := r.domain + if domain == "" { + domain = "local" + } + return strings.Trim(r.service, ".") + "." + strings.Trim(domain, ".") + "." +} + +// joinedOn reconciles the set of interfaces the socket is a member of the mDNS +// group on with ifaces: it joins each new one and leaves each gone one, without +// recreating the socket. JoinGroup/LeaveGroup are quick syscalls; holding mu for +// the refresh only briefly delays a concurrent drain, which is acceptable. +func (r *receiver) joinedOn(ifaces map[int][]net.IP) { + group := &net.UDPAddr{IP: mdnsGroupV4} + r.mu.Lock() + defer r.mu.Unlock() + for idx := range r.joined { + if _, ok := ifaces[idx]; !ok { + leaveGroup(r.pconn, idx, group) + delete(r.joined, idx) + } + } + for idx := range ifaces { + if r.joined[idx] { + continue + } + if joinGroup(r.pconn, idx, group) { + r.joined[idx] = true + } + } +} + +// refresh reconciles the set of joined interfaces with ifaces, joining new ones +// and leaving gone ones, without recreating the socket. +func (r *receiver) refresh(ifaces map[int][]net.IP) { + r.joinedOn(ifaces) +} + +// drain returns and clears the nodes decoded since the last drain. +func (r *receiver) drain() []Node { + r.mu.Lock() + out := r.buf + r.buf = nil + r.mu.Unlock() + return out +} + +// readLoop decodes received DNS-SD messages into Node values and accumulates them +// until drained. It runs until Stop. +func (r *receiver) readLoop(ctx context.Context) { + // Capture the socket handles under the lock, once. Stop() writes r.conn under + // the same lock, so this read is synchronized with it; holding locals keeps the + // loop reading a stable handle, and a closed socket surfaces as a read error + // (observed below) rather than a nil dereference if the deadline and the close + // land on the same read. + r.mu.Lock() + conn := r.conn + pc := r.pconn + r.mu.Unlock() + buf := make([]byte, 65536) + for { + _ = conn.SetReadDeadline(time.Now().Add(readDeadline)) + n, _, _, err := pc.ReadFrom(buf) + if err != nil { + if ne, ok := err.(net.Error); ok && ne.Timeout() { + // Idle: no packet within the deadline; loop back and re-read. The + // deadline is what keeps this loop able to observe shutdown. + continue + } + // A non-timeout read error means the socket closed (Stop) or faulted. + // Stop closes r.stop before the socket, so a closed socket means + // shutdown; any other fault is tolerated and retried rather than + // darkening the whole browser. + select { + case <-r.stop: + return + case <-ctx.Done(): + return + default: + continue + } + } + if n <= 0 { + continue + } + var msg dns.Msg + if err := msg.Unpack(buf[:n]); err != nil { + continue + } + nodes := r.decode(&msg) + if len(nodes) == 0 { + continue + } + r.mu.Lock() + r.buf = append(r.buf, nodes...) + r.mu.Unlock() + } +} + +// Stop closes the socket (unblocking the read loop) and leaves every group. It is +// safe to call more than once. +func (r *receiver) Stop() { + r.mu.Lock() + select { + case <-r.stop: + r.mu.Unlock() + return + default: + close(r.stop) + } + conn := r.conn + r.conn = nil + idxs := make([]int, 0, len(r.joined)) + for idx := range r.joined { + idxs = append(idxs, idx) + } + r.joined = make(map[int]bool) + r.mu.Unlock() + group := &net.UDPAddr{IP: mdnsGroupV4} + for _, idx := range idxs { + leaveGroup(r.pconn, idx, group) + } + if conn != nil { + _ = conn.Close() + } +} + +// joinGroup joins the mDNS group on the interface idx and reports success. A +// missing or wedged interface is skipped rather than failing the whole refresh. +func joinGroup(pc *ipv4.PacketConn, idx int, group *net.UDPAddr) bool { + ifi, err := net.InterfaceByIndex(idx) + if err != nil { + return false + } + return pc.JoinGroup(ifi, group) == nil +} + +// leaveGroup leaves the mDNS group on the interface idx; a missing interface is a +// no-op. +func leaveGroup(pc *ipv4.PacketConn, idx int, group *net.UDPAddr) { + ifi, err := net.InterfaceByIndex(idx) + if err != nil { + return + } + _ = pc.LeaveGroup(ifi, group) +} + +// decode turns a single DNS-SD message into the Node values it describes for this +// browser's service type, following the same association rules as the +// grandcat/zeroconf client it replaces: a PTR names the instance, an SRV gives the +// instance's host and port, a TXT gives its records, and A/AAAA (keyed by the +// instance's host) give its addresses. A record with a TTL of 0 is a goodbye and +// is dropped. A node is emitted once it has both an SRV and at least one address. +func (r *receiver) decode(msg *dns.Msg) []Node { + type inst struct { + host string + port int + txt []string + addrs []string + ttl uint32 + hasSRV bool + } + byName := make(map[string]*inst) + get := func(name string) *inst { + if v, ok := byName[name]; ok { + return v + } + v := &inst{} + byName[name] = v + return v + } + service := r.serviceName() + for _, rr := range append(append(msg.Answer, msg.Ns...), msg.Extra...) { + switch v := rr.(type) { + case *dns.PTR: + if v.Hdr.Name == service { + get(v.Ptr) + } + case *dns.SRV: + if strings.HasSuffix(v.Hdr.Name, service) { + i := get(v.Hdr.Name) + i.host = v.Target + i.port = int(v.Port) + i.ttl = v.Hdr.Ttl + i.hasSRV = true + } + case *dns.TXT: + if strings.HasSuffix(v.Hdr.Name, service) { + i := get(v.Hdr.Name) + i.txt = v.Txt + i.ttl = v.Hdr.Ttl + } + case *dns.A: + for _, i := range byName { + if i.host != "" && i.host == v.Hdr.Name { + i.addrs = append(i.addrs, v.A.String()) + } + } + case *dns.AAAA: + if isLinkLocal(v.AAAA) { + continue + } + for _, i := range byName { + if i.host != "" && i.host == v.Hdr.Name { + i.addrs = append(i.addrs, v.AAAA.String()) + } + } + } + } + + var out []Node + for name, i := range byName { + if !i.hasSRV || i.ttl == 0 || len(i.addrs) == 0 { + continue + } + instance := strings.TrimSuffix(name, service) + node := Node{ + ID: strings.Trim(instance, "."), + Host: i.host, + Port: i.port, + Addresses: i.addrs, + TXT: i.txt, + } + out = append(out, node) + } + return out +} + +// monitorIfaces refreshes the receiver's joined interface set whenever the host's +// addressing changes, driven by netmon. It returns on ctx cancellation. +func (r *receiver) monitorIfaces(ctx context.Context) { + mon, err := netmon.Watch(ctx) + if err != nil { + // Without a live monitor the set is static; the socket still receives on + // whatever it joined at startup. + <-ctx.Done() + return + } + for range mon.Subscribe() { + r.refresh(mon.Snapshot().IfaceV4) + } +} diff --git a/services/shared/discovery/receiver_test.go b/services/shared/discovery/receiver_test.go new file mode 100644 index 00000000..d296f682 --- /dev/null +++ b/services/shared/discovery/receiver_test.go @@ -0,0 +1,108 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package discovery + +import ( + "net" + "testing" + + "github.com/miekg/dns" +) + +// testReceiver is a receiver with no socket, just the service identity decode needs. +func testReceiver() *receiver { + return &receiver{service: "_nvpair-node._tcp", domain: "local"} +} + +// browseResponse builds a canned mDNS browse response for one instance, shaped like +// the responder's appendBrowseRRs: a PTR in the answer, SRV/TXT (when non-empty) and +// the A records in extra. A ttl of 0 models a goodbye. +func browseResponse(instance, host string, port int, ttl uint32, txt []string, addrs ...string) *dns.Msg { + svc := "_nvpair-node._tcp.local." + m := new(dns.Msg) + m.MsgHdr.Response = true + m.Compress = true + m.Answer = append(m.Answer, &dns.PTR{ + Hdr: dns.RR_Header{Name: svc, Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: ttl}, + Ptr: instance + svc, + }) + m.Extra = append(m.Extra, &dns.SRV{ + Hdr: dns.RR_Header{Name: instance + svc, Rrtype: dns.TypeSRV, Class: dns.ClassINET, Ttl: ttl}, + Target: host, + Port: uint16(port), + }) + if len(txt) > 0 { + m.Extra = append(m.Extra, &dns.TXT{ + Hdr: dns.RR_Header{Name: instance + svc, Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: ttl}, + Txt: txt, + }) + } + for _, a := range addrs { + m.Extra = append(m.Extra, &dns.A{ + Hdr: dns.RR_Header{Name: host, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: ttl}, + A: net.ParseIP(a), + }) + } + return m +} + +func TestDecodeBuildsNode(t *testing.T) { + got := testReceiver().decode(browseResponse("mynode", "mynode.local.", 14318, 120, []string{"uuid=abc"}, "192.168.1.10")) + if len(got) != 1 { + t.Fatalf("decode returned %d nodes, want 1: %+v", len(got), got) + } + n := got[0] + if n.ID != "mynode" { + t.Errorf("ID = %q, want mynode", n.ID) + } + if n.Host != "mynode.local." { + t.Errorf("Host = %q, want mynode.local.", n.Host) + } + if n.Port != 14318 { + t.Errorf("Port = %d, want 14318", n.Port) + } + if len(n.Addresses) != 1 || n.Addresses[0] != "192.168.1.10" { + t.Errorf("Addresses = %v, want [192.168.1.10]", n.Addresses) + } + if len(n.TXT) != 1 || n.TXT[0] != "uuid=abc" { + t.Errorf("TXT = %v, want [uuid=abc]", n.TXT) + } +} + +func TestDecodeCollectsMultipleAddresses(t *testing.T) { + got := testReceiver().decode(browseResponse("mynode", "mynode.local.", 14318, 120, nil, "192.168.1.10", "10.0.0.5")) + if len(got) != 1 { + t.Fatalf("decode returned %d nodes, want 1: %+v", len(got), got) + } + if len(got[0].Addresses) != 2 { + t.Fatalf("Addresses = %v, want 2 entries", got[0].Addresses) + } +} + +func TestDecodeDropsGoodbye(t *testing.T) { + got := testReceiver().decode(browseResponse("mynode", "mynode.local.", 14318, 0, nil, "192.168.1.10")) + if len(got) != 0 { + t.Fatalf("decode of a TTL=0 goodbye returned %d nodes, want 0: %+v", len(got), got) + } +} + +func TestDecodeDropsUnresolved(t *testing.T) { + got := testReceiver().decode(browseResponse("mynode", "mynode.local.", 14318, 120, []string{"uuid=abc"})) + if len(got) != 0 { + t.Fatalf("decode without an address returned %d nodes, want 0: %+v", len(got), got) + } +} + +func TestDecodeIgnoresForeignService(t *testing.T) { + m := new(dns.Msg) + m.MsgHdr.Response = true + m.Answer = append(m.Answer, &dns.PTR{ + Hdr: dns.RR_Header{Name: "_nvpair-ollama._tcp.local.", Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: 120}, + Ptr: "other._nvpair-ollama._tcp.local.", + }) + got := testReceiver().decode(m) + if len(got) != 0 { + t.Fatalf("decode of a foreign service returned %d nodes, want 0: %+v", len(got), got) + } +} diff --git a/services/shared/discovery/socketreuse_darwin.go b/services/shared/discovery/socketreuse_darwin.go new file mode 100644 index 00000000..fb0ebcc0 --- /dev/null +++ b/services/shared/discovery/socketreuse_darwin.go @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//go:build darwin + +package discovery + +import "syscall" + +// setReuseAddr is the macOS counterpart of the Unix build. Besides SO_REUSEADDR +// it also sets SO_REUSEPORT before bind. macOS's system mDNSResponder already +// holds UDP 5353; without SO_REUSEPORT our bind races with it and +// intermittently fails with "address already in use". SO_REUSEADDR is still set +// so multicast-group sharing with the PAIR responder and sibling processes works +// as on other platforms. The net package happens to set the same options itself +// for a multicast listen address, but the hook makes that dependency explicit +// here rather than incidental. +func setReuseAddr(network, address string, c syscall.RawConn) error { + var sockErr error + if err := c.Control(func(fd uintptr) { + sockErr = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) + if sockErr == nil { + sockErr = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEPORT, 1) + } + }); err != nil { + return err + } + return sockErr +} diff --git a/services/shared/discovery/socketreuse_unix.go b/services/shared/discovery/socketreuse_unix.go new file mode 100644 index 00000000..abc61de9 --- /dev/null +++ b/services/shared/discovery/socketreuse_unix.go @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//go:build !windows && !darwin + +package discovery + +import "syscall" + +// setReuseAddr is a net.ListenConfig.Control hook that sets SO_REUSEADDR on +// the socket before bind. mDNS requires multiple processes on one host to +// share UDP 5353; SO_REUSEADDR (the same option Go's ListenMulticastUDP uses) +// lets the browser's receive socket coexist with the PAIR responder and any +// system mDNS responder (Avahi on Linux). We intentionally do not set +// SO_REUSEPORT — on Linux it load-balances unicast datagrams across the +// sharing sockets, which would steal unicast mDNS replies. See the mdns +// package's hook of the same name, which the responder uses. +func setReuseAddr(network, address string, c syscall.RawConn) error { + var sockErr error + if err := c.Control(func(fd uintptr) { + sockErr = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) + }); err != nil { + return err + } + return sockErr +} diff --git a/services/shared/discovery/socketreuse_unix_test.go b/services/shared/discovery/socketreuse_unix_test.go new file mode 100644 index 00000000..39d08588 --- /dev/null +++ b/services/shared/discovery/socketreuse_unix_test.go @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//go:build !windows + +package discovery + +import ( + "context" + "net" + "runtime" + "testing" + + "golang.org/x/sys/unix" +) + +// TestSetReuseAddrOptions runs the setReuseAddr Control hook against a real +// socket on an ephemeral port (never 5353, so it cannot contend with a system +// mDNS responder) and asserts the socket options it leaves behind: SO_REUSEADDR +// on every platform, and SO_REUSEPORT only on macOS. +// +// The options are read through golang.org/x/sys/unix rather than syscall +// because the syscall package does not define SO_REUSEPORT on Linux; unix +// defines it portably. macOS reports the option constant (SO_REUSEADDR = 4 on +// darwin) rather than the value we set, so "set" is any nonzero value. +func TestSetReuseAddrOptions(t *testing.T) { + lc := net.ListenConfig{Control: setReuseAddr} + pktConn, err := lc.ListenPacket(context.Background(), "udp4", "0.0.0.0:0") + if err != nil { + t.Fatalf("listen: %v", err) + } + defer pktConn.Close() + + udpConn, ok := pktConn.(*net.UDPConn) + if !ok { + t.Fatalf("ListenPacket returned %T, want *net.UDPConn", pktConn) + } + rawConn, err := udpConn.SyscallConn() + if err != nil { + t.Fatalf("syscall conn: %v", err) + } + + var reuseAddr, reusePort int + if err := rawConn.Control(func(fd uintptr) { + reuseAddr, _ = unix.GetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR) + reusePort, _ = unix.GetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT) + }); err != nil { + t.Fatalf("control: %v", err) + } + + if reuseAddr == 0 { + t.Errorf("SO_REUSEADDR = %d, want set (nonzero)", reuseAddr) + } + wantPortSet := runtime.GOOS == "darwin" + if (reusePort != 0) != wantPortSet { + t.Errorf("SO_REUSEPORT = %d (set=%v), want set=%v on %s", reusePort, reusePort != 0, wantPortSet, runtime.GOOS) + } +} diff --git a/services/shared/discovery/socketreuse_windows.go b/services/shared/discovery/socketreuse_windows.go new file mode 100644 index 00000000..0a140c7a --- /dev/null +++ b/services/shared/discovery/socketreuse_windows.go @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//go:build windows + +package discovery + +import "syscall" + +// setReuseAddr is the Windows counterpart of the Unix build. The only +// difference is the socket handle type (syscall.Handle vs int). See the Unix +// file for the rationale; SO_REUSEADDR on Windows gives the shared-bind +// behavior we need and there is no SO_REUSEPORT to worry about. +func setReuseAddr(network, address string, c syscall.RawConn) error { + var sockErr error + if err := c.Control(func(fd uintptr) { + sockErr = syscall.SetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) + }); err != nil { + return err + } + return sockErr +} diff --git a/services/shared/go.mod b/services/shared/go.mod index 746bb7dd..d010ea19 100644 --- a/services/shared/go.mod +++ b/services/shared/go.mod @@ -4,14 +4,12 @@ go 1.25.0 require ( github.com/Microsoft/go-winio v0.6.2 - github.com/grandcat/zeroconf v1.0.0 github.com/miekg/dns v1.1.55 golang.org/x/net v0.58.0 golang.org/x/sys v0.47.0 ) require ( - github.com/cenkalti/backoff v2.2.1+incompatible // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/tools v0.11.0 // indirect ) diff --git a/services/shared/go.sum b/services/shared/go.sum index c65e0832..82e83231 100644 --- a/services/shared/go.sum +++ b/services/shared/go.sum @@ -1,35 +1,14 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= -github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= -github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/services/shared/mcast/mcast.go b/services/shared/mcast/mcast.go new file mode 100644 index 00000000..8dc19599 --- /dev/null +++ b/services/shared/mcast/mcast.go @@ -0,0 +1,188 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +// Package mcast provides a long-lived per-interface UDP send-socket pool for +// mDNS traffic, shared by the mDNS responder (all platforms) and the discovery +// browser's Windows workaround re-send. +// +// It exists because the pre-consolidation code opened a fresh unicast-bound UDP +// socket for every single transmission — one per interface per send — and closed +// it again. On a host whose packet filter inspects each new flow (the macOS +// Application Firewall), that pattern makes the filter re-evaluate and log a brand- +// new flow for every mDNS packet instead of passing a small set of stable flows. +// A pool holds one socket per interface and reuses it, so the filter sees each +// interface once and then just forwards. +// +// The pool keys sockets by interface index and reports send outcomes by interface +// index. The discovery browser maps those indices to names for its SendFailures +// telemetry (which the netpick address ranker consumes); the mDNS responder uses +// the indices directly. It is a leaf: it depends only on the standard library and +// the ipv4 helpers, and takes its interface set from the caller (typically +// netmon.Enumerate) rather than enumerating on its own. It skips the AirDrop and +// internal low-latency links (see excludedIface), which never reach the LAN. +package mcast + +import ( + "fmt" + "net" + "strings" + "sync" + + "golang.org/x/net/ipv4" +) + +// ttl is the multicast time-to-live every send socket is configured with. It +// matches the value the per-send code this replaces used, so a routed-VLAN or +// multi-hop-LAN deployment sees the same on-link range as before. +const ttl = 255 + +// excludedIface reports whether an interface is one we never send mDNS on: an +// Apple AirDrop / P2P link (awdl*) or an internal low-latency link (llw*). These +// never reach the LAN or a VPN, so a socket and a per-send flow for them is pure +// waste — and on a host whose packet filter inspects each new flow it is part of +// the very churn this pool exists to remove. They usually carry no routable +// address (so the caller's non-loopback-IPv4 filter already drops them), but a +// host that assigns one a link-local IPv4 would otherwise advertise and transmit +// on it. Real NICs (en*) and LAN/VPN interfaces (bridge*, utun*) are kept. +func excludedIface(name string) bool { + n := strings.ToLower(name) + return strings.HasPrefix(n, "awdl") || strings.HasPrefix(n, "llw") +} + +// sendSocket is one interface's long-lived send socket plus the facts the pool +// needs to decide whether to reuse or rebuild it on a refresh. +type sendSocket struct { + src net.IP // the address the socket is bound to, for reuse comparison + conn *net.UDPConn +} + +// Sender owns the per-interface send-socket pool. Its methods are safe for +// concurrent use; the pool is rebuilt under a lock on Refresh. +type Sender struct { + mu sync.Mutex + conns map[int]*sendSocket +} + +// New builds a Sender whose pool spans ifaces (interface index -> its +// non-loopback IPv4 addresses, as netmon.Enumerate reports). An interface whose +// socket cannot be bound is skipped rather than aborting the whole pool, so one +// wedged adapter never darkens the rest. +func New(ifaces map[int][]net.IP) *Sender { + s := &Sender{conns: make(map[int]*sendSocket, len(ifaces))} + s.refresh(ifaces) + return s +} + +// Refresh replaces the pool with one spanning ifaces, reusing a socket whenever +// its interface's source address is unchanged and rebinding only what moved (a +// DHCP re-lease, an interface that appeared or went away). The responder drives +// this from its network monitor; the browser from its scan loop. +func (s *Sender) Refresh(ifaces map[int][]net.IP) { + s.mu.Lock() + defer s.mu.Unlock() + s.refresh(ifaces) +} + +// refresh is Refresh with the lock already held. +func (s *Sender) refresh(ifaces map[int][]net.IP) { + next := make(map[int]*sendSocket, len(ifaces)) + for idx, addrs := range ifaces { + if len(addrs) == 0 { + continue + } + src := addrs[0] + if old, ok := s.conns[idx]; ok && old.src.Equal(src) { + next[idx] = old // reuse; validated (non-excluded) when first bound + continue + } + ifi, err := net.InterfaceByIndex(idx) + if err != nil || excludedIface(ifi.Name) { + continue // gone, or an AirDrop/internal link we never send mDNS on + } + if old, ok := s.conns[idx]; ok { + _ = old.conn.Close() + } + ss, err := dial(src, ifi) + if err != nil { + continue + } + next[idx] = ss + } + for idx, old := range s.conns { + if _, ok := next[idx]; !ok { + _ = old.conn.Close() + } + } + s.conns = next +} + +// dial opens a send socket bound to src on an ephemeral port with the multicast +// egress interface and TTL set — the same socket the per-send code used to open +// on every transmission, now held for reuse. +func dial(src net.IP, ifi *net.Interface) (*sendSocket, error) { + conn, err := net.ListenUDP("udp4", &net.UDPAddr{IP: src, Port: 0}) + if err != nil { + return nil, fmt.Errorf("mcast: bind %s: %w", src, err) + } + ss := &sendSocket{src: src, conn: conn} + pc := ipv4.NewPacketConn(conn) + _ = pc.SetMulticastInterface(ifi) + _ = pc.SetMulticastTTL(ttl) + return ss, nil +} + +// Ifaces returns the interface indices the pool currently holds a socket for. +func (s *Sender) Ifaces() []int { + s.mu.Lock() + defer s.mu.Unlock() + out := make([]int, 0, len(s.conns)) + for idx := range s.conns { + out = append(out, idx) + } + return out +} + +// SendMulticast writes buf to target from each of the given interfaces' pooled +// sockets and returns the per-interface outcome keyed by interface index (true = +// the write was accepted by the socket). An interface with no pooled socket is +// omitted, so a missing key means the send was skipped rather than failed. The +// value reflects only the socket write, not delivery. +func (s *Sender) SendMulticast(buf []byte, target *net.UDPAddr, ifaces []int) map[int]bool { + s.mu.Lock() + defer s.mu.Unlock() + outcomes := make(map[int]bool, len(ifaces)) + for _, idx := range ifaces { + ss, ok := s.conns[idx] + if !ok { + continue + } + _, err := ss.conn.WriteToUDP(buf, target) + outcomes[idx] = err == nil + } + return outcomes +} + +// SendUnicast writes buf to target from the one interface's pooled socket, for a +// reply to a specific querier. It returns an error when the interface has no +// pooled socket so a caller bug surfaces instead of silently dropping the reply. +func (s *Sender) SendUnicast(buf []byte, target *net.UDPAddr, ifIndex int) error { + s.mu.Lock() + defer s.mu.Unlock() + ss, ok := s.conns[ifIndex] + if !ok { + return fmt.Errorf("mcast: no send socket for interface %d", ifIndex) + } + _, err := ss.conn.WriteToUDP(buf, target) + return err +} + +// Close closes every pooled socket and empties the pool. It is safe to call more +// than once. +func (s *Sender) Close() { + s.mu.Lock() + defer s.mu.Unlock() + for idx, ss := range s.conns { + _ = ss.conn.Close() + delete(s.conns, idx) + } +} diff --git a/services/shared/mcast/mcast_test.go b/services/shared/mcast/mcast_test.go new file mode 100644 index 00000000..cd981a57 --- /dev/null +++ b/services/shared/mcast/mcast_test.go @@ -0,0 +1,140 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package mcast + +import ( + "net" + "testing" +) + +// realIfaceV4 builds the same up, multicast, non-loopback IPv4 interface set that +// netmon.Enumerate reports. A Sender can only bind to an address the host actually +// holds, so the socket tests need a real interface and skip where there is none +// (e.g. a locked-down CI sandbox). +func realIfaceV4() (map[int][]net.IP, bool) { + out := map[int][]net.IP{} + ifaces, err := net.Interfaces() + if err != nil { + return nil, false + } + for _, ifi := range ifaces { + if ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 || ifi.Flags&net.FlagLoopback != 0 { + continue + } + addrs, err := ifi.Addrs() + if err != nil { + continue + } + var v4 []net.IP + for _, a := range addrs { + if ipnet, ok := a.(*net.IPNet); ok { + if ip4 := ipnet.IP.To4(); ip4 != nil && !ip4.IsLoopback() { + v4 = append(v4, ip4) + } + } + } + if len(v4) > 0 { + out[ifi.Index] = v4 + } + } + if len(out) == 0 { + return nil, false + } + return out, true +} + +func TestSenderBuildsOneSocketPerInterface(t *testing.T) { + ifaces, ok := realIfaceV4() + if !ok { + t.Skip("no up, multicast, non-loopback IPv4 interface in this environment") + } + s := New(ifaces) + defer s.Close() + held := map[int]bool{} + for _, idx := range s.Ifaces() { + held[idx] = true + } + // At most one socket per enumerated interface; the AirDrop/internal-link + // filter and any bind failure can only shrink the pool, never grow it. + if len(held) > len(ifaces) { + t.Fatalf("Sender holds %d sockets for %d interfaces; want at most one each", len(held), len(ifaces)) + } + // No socket for an excluded (AirDrop/internal) interface, even when the caller + // reported an address for it. + for idx := range ifaces { + ifi, err := net.InterfaceByIndex(idx) + if err != nil { + continue + } + if excludedIface(ifi.Name) && held[idx] { + t.Errorf("Sender holds a socket for excluded interface %s (%d)", ifi.Name, idx) + } + } +} + +// TestSenderRefreshKeepsAStablePool pins the core of the fix: refreshing over an +// unchanged interface set must not churn the socket count, so the OS firewall +// keeps its flow instead of re-evaluating a fresh one. +func TestSenderRefreshKeepsAStablePool(t *testing.T) { + ifaces, ok := realIfaceV4() + if !ok { + t.Skip("no up, multicast, non-loopback IPv4 interface in this environment") + } + s := New(ifaces) + defer s.Close() + before := len(s.Ifaces()) + s.Refresh(ifaces) + if got := len(s.Ifaces()); got != before { + t.Fatalf("Refresh over an unchanged set changed the pool from %d to %d sockets", before, got) + } +} + +// TestSenderSendMulticastReturnsPerIfaceOutcomes: one outcome per requested +// interface, and the result is whatever the socket reported. The value is not +// asserted — a host whose firewall drops multicast (the very case under fix) must +// not fail the send bookkeeping, only record the outcome. +func TestSenderSendMulticastReturnsPerIfaceOutcomes(t *testing.T) { + ifaces, ok := realIfaceV4() + if !ok { + t.Skip("no up, multicast, non-loopback IPv4 interface in this environment") + } + s := New(ifaces) + defer s.Close() + target := &net.UDPAddr{IP: net.IPv4(224, 0, 0, 251), Port: 5353} + if got := s.SendMulticast([]byte{0}, target, s.Ifaces()); len(got) != len(s.Ifaces()) { + t.Fatalf("SendMulticast returned %d outcomes, want %d (one per pooled interface)", len(got), len(s.Ifaces())) + } +} + +// TestExcludedIfaceKeepsLanAndVpn pins the pruning policy: AirDrop (awdl*) and +// internal low-latency (llw*) links are dropped, while real NICs and the LAN/VPN +// interfaces the cluster transport depends on (en*, bridge*, utun*) are kept. +func TestExcludedIfaceKeepsLanAndVpn(t *testing.T) { + cases := map[string]bool{ + "awdl0": true, "awdl1": true, // AirDrop P2P + "llw0": true, "llw1": true, // internal low-latency link + "en0": false, "en5": false, // real NICs + "bridge0": false, + "utun0": false, "utun3": false, // VPN must survive (LAN+VPN constraint) + } + for name, want := range cases { + if got := excludedIface(name); got != want { + t.Errorf("excludedIface(%q) = %v, want %v", name, got, want) + } + } +} + +// TestSenderSendUnicastUnknownIfaceErrors: replying on an interface with no pooled +// socket is a caller bug and must surface, not silently drop the reply. +func TestSenderSendUnicastUnknownIfaceErrors(t *testing.T) { + ifaces, ok := realIfaceV4() + if !ok { + t.Skip("no up, multicast, non-loopback IPv4 interface in this environment") + } + s := New(ifaces) + defer s.Close() + if err := s.SendUnicast([]byte{0}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 1}, 49999); err == nil { + t.Fatal("SendUnicast on an interface with no pooled socket returned nil, want an error") + } +} diff --git a/services/shared/mdns/responder.go b/services/shared/mdns/responder.go index 880b98f1..e97e321a 100644 --- a/services/shared/mdns/responder.go +++ b/services/shared/mdns/responder.go @@ -41,6 +41,7 @@ import ( "sync" "time" + "nvpair-shared/mcast" "nvpair-shared/netmon" "github.com/miekg/dns" @@ -49,11 +50,9 @@ import ( const ( mdnsPort = 5353 - // recordTTL matches what zeroconf advertises for non-A records (3200s) - // for service-level records, but RFC 6762 §10 says A records SHOULD use - // a TTL of 120s to account for IP address changes. We use the shorter - // value uniformly — the cost of a slightly more chatty re-announce is - // minimal and it keeps caches fresh. + // RFC 6762 §10 says A records SHOULD use a TTL of 120s to account for IP + // address changes. We use the shorter value uniformly — the cost of a + // slightly more chatty re-announce is minimal and it keeps caches fresh. recordTTL = 120 // reannounceEvery is how often we send unsolicited announcements after // the initial pair. RFC 6762 doesn't strictly require periodic @@ -97,6 +96,13 @@ type Responder struct { addrMu sync.RWMutex // ifaceAddrs maps interface index to its IPv4 unicast addresses. ifaceAddrs map[int][]net.IP + + // sender is the long-lived per-interface send-socket pool (one socket per + // interface, reused for every transmission instead of one per send), kept in + // sync with ifaceAddrs: built in NewResponder and refreshed alongside it in + // watchAddrs. It owns its own lock, so it is safe to use from the announce, + // query-reply, and UpdateTXT paths concurrently. + sender *mcast.Sender } // NewResponder builds a Responder for the given service instance. domain @@ -145,6 +151,7 @@ func NewResponder(instance, service, domain string, port int, txt []string) (*Re if len(r.ifaceAddrs) == 0 { return nil, errors.New("no multicast-capable IPv4 interfaces with non-loopback addresses") } + r.sender = mcast.New(r.ifaceAddrs) return r, nil } @@ -199,6 +206,9 @@ func (r *Responder) watchAddrs(ctx context.Context) { } r.addrMu.Unlock() if changed { + // Reuse sockets whose source address did not move; rebind only what + // changed, so the firewall keeps its stable flows. + r.sender.Refresh(next) slog.Debug("mdns: interface addresses changed, re-announcing") r.sendAnnouncement() } @@ -236,9 +246,12 @@ func ifaceAddrsEqual(a, b map[int][]net.IP) bool { // re-announces the service, and on context cancellation sends a "goodbye" // (TTL=0) before returning. // -// The receive socket binds the real mDNS group 224.0.0.251:5353 with -// SO_REUSEADDR (see setReuseAddr) so multiple responders — and the browser's -// zeroconf socket — coexist on 5353 on the same host. +// The receive socket is bound through the setReuseAddr hook (SO_REUSEADDR on +// every platform, plus SO_REUSEPORT on macOS) so multiple responders — and the +// discovery browser's receive socket in shared/discovery — coexist on 5353 on +// the same host. The net package sets the same options itself for a multicast +// listen address; the hook makes the dependency explicit rather than +// incidental. func (r *Responder) Run(ctx context.Context) error { lc := net.ListenConfig{Control: setReuseAddr} pktConn, err := lc.ListenPacket(ctx, "udp4", mdnsGroupV4.String()+":"+fmt.Sprint(mdnsPort)) @@ -247,6 +260,7 @@ func (r *Responder) Run(ctx context.Context) error { } udpConn := pktConn.(*net.UDPConn) defer udpConn.Close() + defer r.sender.Close() pc := ipv4.NewPacketConn(udpConn) // SetControlMessage is "not implemented" on Windows in golang.org/x/net. @@ -570,34 +584,21 @@ func (r *Responder) sendUnicast(buf []byte, ifIndex int, to net.Addr) { } } -// sendOnInterface is the core of the Windows send workaround: it transmits buf -// from a fresh unicast-bound socket on the given interface (setting the -// multicast interface + TTL for group targets), never from the multicast-bound -// receive socket that Windows refuses to send from. +// sendOnInterface is the core of the Windows send workaround and the macOS +// firewall-flow fix: it transmits buf from the interface's long-lived pooled send +// socket (mcast.Sender) — a unicast-bound socket with the multicast interface and +// TTL set — never from the multicast-bound receive socket that Windows refuses to +// send from. The socket is opened once per interface and reused for every +// transmission, so an OS packet filter that inspects each new flow (the macOS +// Application Firewall) sees a small set of stable flows instead of a fresh one +// per packet. An interface whose socket is not in the pool (a bind that failed at +// refresh time) is reported as a failed send rather than re-opening a socket here. func (r *Responder) sendOnInterface(buf []byte, ifIndex int, target *net.UDPAddr) error { - addrs, ok := r.ifaces()[ifIndex] - if !ok || len(addrs) == 0 { - return errors.New("no addresses on interface") - } - src := addrs[0] - ifi, err := net.InterfaceByIndex(ifIndex) - if err != nil { - return err - } - conn, err := net.ListenUDP("udp4", &net.UDPAddr{IP: src, Port: 0}) - if err != nil { - slog.Debug("mdns: bind failed", "iface", ifi.Name, "ip", src.String(), "err", err) - return err - } - defer conn.Close() if target.IP.IsMulticast() { - pc := ipv4.NewPacketConn(conn) - _ = pc.SetMulticastInterface(ifi) - _ = pc.SetMulticastTTL(255) - } - if _, err := conn.WriteToUDP(buf, target); err != nil { - slog.Debug("mdns: write failed", "iface", ifi.Name, "ip", src.String(), "target", target.String(), "err", err) - return err + if !r.sender.SendMulticast(buf, target, []int{ifIndex})[ifIndex] { + return errors.New("mdns: no send socket on interface") + } + return nil } - return nil + return r.sender.SendUnicast(buf, target, ifIndex) } diff --git a/services/shared/mdns/socketreuse_darwin.go b/services/shared/mdns/socketreuse_darwin.go new file mode 100644 index 00000000..d6c8be05 --- /dev/null +++ b/services/shared/mdns/socketreuse_darwin.go @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//go:build darwin + +package mdns + +import "syscall" + +// setReuseAddr is the macOS counterpart of the Unix build. Besides SO_REUSEADDR +// it also sets SO_REUSEPORT before bind. macOS's system mDNSResponder already +// holds UDP 5353; without SO_REUSEPORT our bind races with it and +// intermittently fails with "address already in use". SO_REUSEPORT lets our +// responder claim shared access and bind reliably. SO_REUSEADDR is still set so +// multicast-group sharing with sibling PAIR processes and with Bonjour works as +// on other platforms. +func setReuseAddr(network, address string, c syscall.RawConn) error { + var sockErr error + if err := c.Control(func(fd uintptr) { + sockErr = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) + if sockErr == nil { + sockErr = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEPORT, 1) + } + }); err != nil { + return err + } + return sockErr +} diff --git a/services/shared/mdns/socketreuse_unix.go b/services/shared/mdns/socketreuse_unix.go index 88d9d56b..360e1a1d 100644 --- a/services/shared/mdns/socketreuse_unix.go +++ b/services/shared/mdns/socketreuse_unix.go @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -//go:build !windows +//go:build !windows && !darwin package mdns @@ -9,11 +9,13 @@ import "syscall" // setReuseAddr is a net.ListenConfig.Control hook that sets SO_REUSEADDR on // the socket before bind. mDNS requires multiple processes on one host to -// share UDP 5353; SO_REUSEADDR (the same option Go's ListenMulticastUDP and -// grandcat/zeroconf use) lets our responder coexist with the scanner, -// node-info, and any system mDNS responder (Bonjour/Avahi). We intentionally +// share UDP 5353; SO_REUSEADDR (the same option Go's ListenMulticastUDP uses) +// lets our responder coexist with the scanner, +// node-info, and any system mDNS responder (Avahi on Linux). We intentionally // do not set SO_REUSEPORT — on Linux it load-balances unicast datagrams -// across the sharing sockets, which would steal unicast mDNS replies. +// across the sharing sockets, which would steal unicast mDNS replies. The +// macOS build (socketreuse_darwin.go) sets SO_REUSEPORT as well to win the +// bind race against the system mDNSResponder. func setReuseAddr(network, address string, c syscall.RawConn) error { var sockErr error if err := c.Control(func(fd uintptr) { diff --git a/services/shared/mdns/socketreuse_unix_test.go b/services/shared/mdns/socketreuse_unix_test.go new file mode 100644 index 00000000..8286a957 --- /dev/null +++ b/services/shared/mdns/socketreuse_unix_test.go @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//go:build !windows + +package mdns + +import ( + "context" + "net" + "runtime" + "testing" + + "golang.org/x/sys/unix" +) + +// TestSetReuseAddrOptions runs the setReuseAddr Control hook against a real +// socket on an ephemeral port (never 5353, so it cannot contend with a system +// mDNS responder) and asserts the socket options it leaves behind: SO_REUSEADDR +// on every platform, and SO_REUSEPORT only on macOS. +// +// The options are read through golang.org/x/sys/unix rather than syscall +// because the syscall package does not define SO_REUSEPORT on Linux; unix +// defines it portably. macOS reports the option constant (SO_REUSEADDR = 4 on +// darwin) rather than the value we set, so "set" is any nonzero value. +func TestSetReuseAddrOptions(t *testing.T) { + lc := net.ListenConfig{Control: setReuseAddr} + pktConn, err := lc.ListenPacket(context.Background(), "udp4", "0.0.0.0:0") + if err != nil { + t.Fatalf("listen: %v", err) + } + defer pktConn.Close() + + udpConn, ok := pktConn.(*net.UDPConn) + if !ok { + t.Fatalf("ListenPacket returned %T, want *net.UDPConn", pktConn) + } + rawConn, err := udpConn.SyscallConn() + if err != nil { + t.Fatalf("syscall conn: %v", err) + } + + var reuseAddr, reusePort int + if err := rawConn.Control(func(fd uintptr) { + reuseAddr, _ = unix.GetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR) + reusePort, _ = unix.GetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT) + }); err != nil { + t.Fatalf("control: %v", err) + } + + if reuseAddr == 0 { + t.Errorf("SO_REUSEADDR = %d, want set (nonzero)", reuseAddr) + } + wantPortSet := runtime.GOOS == "darwin" + if (reusePort != 0) != wantPortSet { + t.Errorf("SO_REUSEPORT = %d (set=%v), want set=%v on %s", reusePort, reusePort != 0, wantPortSet, runtime.GOOS) + } +} diff --git a/services/shared/netpick/netpick_test.go b/services/shared/netpick/netpick_test.go index 23380385..a06c8c6e 100644 --- a/services/shared/netpick/netpick_test.go +++ b/services/shared/netpick/netpick_test.go @@ -369,6 +369,20 @@ func TestRankLocal_SendFailureDisqualifies(t *testing.T) { } } +// TestRankLocal_NoSendFailedSignalStillRanks: on platforms where the mDNS query +// is not the per-interface workaround re-send, SendFailed is never populated, so +// the ranking must hold on the route/physical/score tiers alone. A host with a +// default route still picks the right canonical address with zero send evidence. +func TestRankLocal_NoSendFailedSignalStillRanks(t *testing.T) { + ifaces := []localIface{ + {name: "en0", addrs: []localAddr{{ip: "10.0.0.5", prefixLen: 24}}}, + {name: "en1", addrs: []localAddr{{ip: "10.9.9.1", prefixLen: 24}}}, + } + if got := rankLocal(ifaces, Evidence{}, "10.9.9.1"); got[0] != "10.9.9.1" { + t.Fatalf("canonical = %q, want 10.9.9.1 (route source) with no SendFailed evidence", got[0]) + } +} + // TestRankLocal_EvidencePrecedence pins the tier order: proof from a peer beats a // peer merely being on-link, which beats the kernel's default route, which beats // every name or address heuristic. diff --git a/services/tests/broker_test.go b/services/tests/broker_test.go index 22944f5b..a5c75161 100644 --- a/services/tests/broker_test.go +++ b/services/tests/broker_test.go @@ -7,7 +7,7 @@ // The broker spawns nvpair-node-scanner, whose promoted daemon browses // _nvpair-node._tcp and folds each node into the broker's discovery store even // when the /v1/node-info enrichment fetch fails. So we drive real discovery by -// registering a bare _nvpair-node record via zeroconf (ni= in TXT, no HTTP +// registering a bare _nvpair-node record via mDNS (ni= in TXT, no HTTP // node-info server required) and assert on the broker's stdout JSON-RPC frames: // // - while unsubscribed: the node is reachable via discovery:get-nodes @@ -23,6 +23,7 @@ package tests import ( + "context" "encoding/json" "fmt" "io" @@ -32,8 +33,7 @@ import ( "time" "nvpair-shared/jsonrpc" - - "github.com/grandcat/zeroconf" + "nvpair-shared/mdns" ) // availableNode mirrors the broker's external camelCase wire shape (see @@ -98,20 +98,22 @@ func sendReq(t *testing.T, w io.Writer, id int, method string) { } } -func registerNodeInfo(t *testing.T, instance string, port int) *zeroconf.Server { +func registerNodeInfo(t *testing.T, instance string, port int) *mdns.Responder { t.Helper() // One consolidated _nvpair-node record carrying ni= (the node-info // service). A distinct uuid keeps each stub from colliding with this node's // own record or the others. The daemon browses this, folds it into its // directory, and pushes it to the broker store. txt := []string{"v=1", "uuid=" + instance + "-uuid", fmt.Sprintf("ni=%d", port)} - srv, err := zeroconf.Register(instance, nodeRecordService, testDomain, port, txt, nil) + resp, err := mdns.NewResponder(instance, nodeRecordService, testDomain, port, txt) if err != nil { t.Fatalf("register %s: %v", instance, err) } - t.Cleanup(srv.Shutdown) + respCtx, cancelResp := context.WithCancel(context.Background()) + t.Cleanup(cancelResp) + go resp.Run(respCtx) t.Logf("advertising %s @ %s (ni=%d)", instance, nodeRecordService, port) - return srv + return resp } func containsNode(nodes []availableNode, id string) bool { diff --git a/services/tests/cluster_data_plane_test.go b/services/tests/cluster_data_plane_test.go index 901e6900..dbb95b32 100644 --- a/services/tests/cluster_data_plane_test.go +++ b/services/tests/cluster_data_plane_test.go @@ -15,6 +15,7 @@ package tests import ( + "context" "crypto/tls" "encoding/json" "fmt" @@ -29,9 +30,8 @@ import ( "nvpair-shared/clustertrust" "nvpair-shared/jsonrpc" + "nvpair-shared/mdns" "nvpair-shared/netpick" - - "github.com/grandcat/zeroconf" ) const ( @@ -111,7 +111,7 @@ func (c *interNodeCluster) startStubClusterPeer(t *testing.T, instance, hostUUID w.WriteHeader(http.StatusOK) }) - // Listen on all interfaces: zeroconf advertises the host's real interface + // Listen on all interfaces: mDNS advertises the host's real interface // IP(s), so the manager dials the peer there, not at 127.0.0.1. ln, err := net.Listen("tcp", ":0") if err != nil { @@ -124,11 +124,13 @@ func (c *interNodeCluster) startStubClusterPeer(t *testing.T, instance, hostUUID txt := []string{"v=1", "uuid=" + hostUUID, fmt.Sprintf("wl=%d", port), clustertrust.ClusterUUIDTXTKey + "=" + c.peerUUID} - adv, err := zeroconf.Register(instance, nodeRecordService, testDomain, port, txt, nil) + resp, err := mdns.NewResponder(instance, nodeRecordService, testDomain, port, txt) if err != nil { t.Fatalf("register stub peer: %v", err) } - t.Cleanup(adv.Shutdown) + respCtx, cancelResp := context.WithCancel(context.Background()) + t.Cleanup(cancelResp) + go resp.Run(respCtx) t.Logf("stub cluster peer advertising %s (wl=%d, cluster-uuid=%s)", nodeRecordService, port, c.peerUUID) return received } diff --git a/services/tests/discovery_relay_test.go b/services/tests/discovery_relay_test.go index 7ac1510a..cdabd914 100644 --- a/services/tests/discovery_relay_test.go +++ b/services/tests/discovery_relay_test.go @@ -4,10 +4,13 @@ package tests import ( + "context" "os" "strings" "testing" "time" + + "nvpair-shared/discovery" ) // TestBrokerAdvertisesNodeRecord exercises the register->advertise path @@ -38,29 +41,39 @@ func TestBrokerAdvertisesNodeRecord(t *testing.T) { // The scanner first announces the base node record, then re-announces after // node-info registers ni=. Startup ordering can therefore expose a valid - // base record for a moment; wait for the enriched update instead of treating - // the first packet as final. - var entryText []string + // base record for a moment; poll the browser's current view until the + // enriched update (with ni=14318) has folded in, rather than treating the + // first packet as final. + browser := discovery.New(nodeRecordService, testDomain, + discovery.WithInterval(time.Second), + discovery.WithScanTimeout(500*time.Millisecond)) + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + go browser.Run(ctx, nil) + deadline := time.Now().Add(20 * time.Second) + var entry *discovery.Node for time.Now().Before(deadline) { - entry := browseForInstance(t, "_nvpair-node._tcp", instance, 2*time.Second) - if entry != nil { - entryText = entry.Text - if strings.Contains(strings.Join(entry.Text, ";"), "ni=14318") { - break + nodes := browser.Nodes() + for i := range nodes { + if nodes[i].ID == instance { + nn := nodes[i] + entry = &nn } } - time.Sleep(100 * time.Millisecond) + if entry != nil && strings.Contains(strings.Join(entry.TXT, ";"), "ni=14318") { + break + } + time.Sleep(200 * time.Millisecond) } - entry := entryText if entry == nil { t.Fatal("did not discover this node's _nvpair-node record within timeout") } - txt := strings.Join(entry, ";") + txt := strings.Join(entry.TXT, ";") if !strings.Contains(txt, "ni=14318") { - t.Errorf("_nvpair-node TXT missing ni=14318 (register->advertise path): %v", entry) + t.Errorf("_nvpair-node TXT missing ni=14318 (register->advertise path): %v", entry.TXT) } if !strings.Contains(txt, "v=1") { - t.Errorf("_nvpair-node TXT missing schema v=1: %v", entry) + t.Errorf("_nvpair-node TXT missing schema v=1: %v", entry.TXT) } } diff --git a/services/tests/discovery_test.go b/services/tests/discovery_test.go index cd9a6c05..88a046e7 100644 --- a/services/tests/discovery_test.go +++ b/services/tests/discovery_test.go @@ -9,11 +9,66 @@ import ( "testing" "time" - "github.com/grandcat/zeroconf" + "nvpair-shared/discovery" + "nvpair-shared/mdns" ) const testDomain = "local." +// These tests exercise the first-party mDNS stack end to end inside the test +// process: a shared/mdns.Responder advertises on 5353 and a shared/discovery. +// Browser listens on the same local multicast group, so the two deliver to each +// other over loopback without a second host. + +// startInProcessResponder advertises a single service instance in-process and +// starts the responder's run loop. It registers a cleanup that cancels the run +// (a TTL=0 goodbye plus stopping the periodic announcements) and returns the +// cancel so a test can withdraw the instance mid-flight. +func startInProcessResponder(t *testing.T, instance, service, domain string, port int, txt []string) context.CancelFunc { + t.Helper() + resp, err := mdns.NewResponder(instance, service, domain, port, txt) + if err != nil { + t.Fatalf("mdns responder %s: %v", instance, err) + } + respCtx, cancelResp := context.WithCancel(context.Background()) + t.Cleanup(cancelResp) + go resp.Run(respCtx) + return cancelResp +} + +// startInProcessBrowser runs a discovery.Browser in-process (a shared receive +// socket on 5353 plus periodic query scans) and returns its event stream. The +// browser is bound to the same local multicast group the responder uses. +func startInProcessBrowser(t *testing.T, service, domain string, opts ...discovery.Option) <-chan discovery.Event { + t.Helper() + browser := discovery.New(service, domain, opts...) + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + events := make(chan discovery.Event, 64) + go browser.Run(ctx, events) + return events +} + +// waitNodeEvent blocks until an event of the given type for the given instance +// arrives on events, or until timeout elapses (which fails the test). +func waitNodeEvent(t *testing.T, events <-chan discovery.Event, wantType, instance string, timeout time.Duration) discovery.Node { + t.Helper() + deadline := time.After(timeout) + for { + select { + case ev, ok := <-events: + if !ok { + t.Fatalf("browser event stream closed before a %q for %q", wantType, instance) + } + if ev.Type == wantType && ev.Node.ID == instance { + return ev.Node + } + case <-deadline: + t.Fatalf("timed out (%s) waiting for %q %q", timeout, wantType, instance) + } + } +} + func TestInProcessDiscovery(t *testing.T) { const ( service = "_test-disc._tcp" @@ -21,103 +76,59 @@ func TestInProcessDiscovery(t *testing.T) { port = 55555 ) - server, err := zeroconf.Register(instance, service, testDomain, port, []string{"env=test"}, nil) - if err != nil { - t.Fatalf("register: %v", err) - } - defer server.Shutdown() - time.Sleep(500 * time.Millisecond) + startInProcessResponder(t, instance, service, testDomain, port, []string{"env=test"}) + events := startInProcessBrowser(t, service, testDomain, + discovery.WithInterval(200*time.Millisecond), + discovery.WithScanTimeout(100*time.Millisecond)) - resolver, err := zeroconf.NewResolver(nil) - if err != nil { - t.Fatalf("resolver: %v", err) - } - - entries := make(chan *zeroconf.ServiceEntry) - found := make(chan *zeroconf.ServiceEntry, 1) - go func() { - for e := range entries { - if e.Instance == instance { - select { - case found <- e: - default: - } - } - } - }() + got := waitNodeEvent(t, events, discovery.Discovered, instance, 10*time.Second) - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - if err := resolver.Browse(ctx, service, testDomain, entries); err != nil { - t.Fatalf("browse: %v", err) + if got.Port != port { + t.Errorf("port = %d, want %d", got.Port, port) } - - select { - case entry := <-found: - if entry.Port != port { - t.Errorf("port = %d, want %d", entry.Port, port) - } - if len(entry.Text) == 0 || entry.Text[0] != "env=test" { - t.Errorf("txt = %v, want [env=test]", entry.Text) - } - if !hasAddress(entry) { - t.Error("no addresses resolved") - } - t.Logf("OK: %s @ %s:%d addrs=%v txt=%v", - entry.Instance, entry.HostName, entry.Port, entry.AddrIPv4, entry.Text) - case <-ctx.Done(): - t.Fatal("timed out waiting for discovery") + if len(got.TXT) == 0 || got.TXT[0] != "env=test" { + t.Errorf("txt = %v, want [env=test]", got.TXT) + } + if !hasAddress(got) { + t.Error("no addresses resolved") } + t.Logf("OK: %s @ %s:%d addrs=%v txt=%v", got.ID, got.Host, got.Port, got.Addresses, got.TXT) } func TestInProcessMultipleInstances(t *testing.T) { const service = "_test-multi._tcp" instances := []string{"node-alpha", "node-beta", "node-gamma"} - var servers []*zeroconf.Server for i, inst := range instances { - s, err := zeroconf.Register(inst, service, testDomain, 50000+i, nil, nil) - if err != nil { - t.Fatalf("register %s: %v", inst, err) - } - servers = append(servers, s) - defer s.Shutdown() - } - time.Sleep(500 * time.Millisecond) - - resolver, err := zeroconf.NewResolver(nil) - if err != nil { - t.Fatalf("resolver: %v", err) - } - - entries := make(chan *zeroconf.ServiceEntry) - foundSet := make(map[string]bool) - done := make(chan struct{}) - go func() { - defer close(done) - for e := range entries { + startInProcessResponder(t, inst, service, testDomain, 50000+i, nil) + } + events := startInProcessBrowser(t, service, testDomain, + discovery.WithInterval(200*time.Millisecond), + discovery.WithScanTimeout(100*time.Millisecond)) + + found := make(map[string]bool) + deadline := time.After(10 * time.Second) + for len(found) < len(instances) { + select { + case ev, ok := <-events: + if !ok { + t.Fatalf("browser event stream closed; found %d/%d instances", len(found), len(instances)) + } for _, inst := range instances { - if e.Instance == inst { - foundSet[inst] = true + if ev.Type == discovery.Discovered && ev.Node.ID == inst { + found[inst] = true } } + case <-deadline: + t.Fatalf("timed out; discovered %d/%d instances", len(found), len(instances)) } - }() - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - if err := resolver.Browse(ctx, service, testDomain, entries); err != nil { - t.Fatalf("browse: %v", err) } - <-ctx.Done() - <-done - for _, inst := range instances { - if !foundSet[inst] { + if !found[inst] { t.Errorf("instance %q not discovered", inst) } } - t.Logf("OK: discovered %d/%d instances", len(foundSet), len(instances)) + t.Logf("OK: discovered %d/%d instances", len(found), len(instances)) } func TestInProcessRemoval(t *testing.T) { @@ -127,75 +138,36 @@ func TestInProcessRemoval(t *testing.T) { port = 55556 ) - server, err := zeroconf.Register(instance, service, testDomain, port, nil, nil) - if err != nil { - t.Fatalf("register: %v", err) - } + cancelResp := startInProcessResponder(t, instance, service, testDomain, port, nil) + events := startInProcessBrowser(t, service, testDomain, + discovery.WithInterval(200*time.Millisecond), + discovery.WithScanTimeout(100*time.Millisecond), + discovery.WithMissThreshold(2)) - // Phase 1: verify discoverable - entry := browseForInstance(t, service, instance, 5*time.Second) - if entry == nil { - t.Fatal("service not found before removal") - } + // Phase 1: the instance must be discoverable while it is advertised. + waitNodeEvent(t, events, discovery.Discovered, instance, 10*time.Second) t.Log("phase 1: service discovered") - // Shut down the service - server.Shutdown() - time.Sleep(time.Second) - - // Phase 2: verify no longer discoverable - entry = browseForInstance(t, service, instance, 5*time.Second) - if entry != nil { - t.Error("service still discoverable after shutdown") - } else { - t.Log("phase 2: service correctly absent after removal") - } + // Phase 2: withdraw it. The responder sends a TTL=0 goodbye (dropped by the + // receiver) and stops announcing and answering queries, so the node then ages + // out via the miss threshold and the browser emits a removal. + cancelResp() + waitNodeEvent(t, events, discovery.Removed, instance, 15*time.Second) + t.Log("phase 2: service correctly evicted after withdrawal") } -// --- helpers --- - -func browseForInstance(t *testing.T, service, instance string, timeout time.Duration) *zeroconf.ServiceEntry { - t.Helper() - resolver, err := zeroconf.NewResolver(nil) - if err != nil { - t.Fatalf("resolver: %v", err) - } - - entries := make(chan *zeroconf.ServiceEntry) - found := make(chan *zeroconf.ServiceEntry, 1) - go func() { - for e := range entries { - if e.Instance == instance { - select { - case found <- e: - default: - } - } +// hasAddress reports whether the node resolved at least one usable address: an +// IPv4 that is not 0.0.0.0, or an IPv6 that is not a link-local address. +func hasAddress(n discovery.Node) bool { + for _, s := range n.Addresses { + ip := net.ParseIP(s) + if ip == nil { + continue } - }() - - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - if err := resolver.Browse(ctx, service, testDomain, entries); err != nil { - t.Fatalf("browse: %v", err) - } - - select { - case e := <-found: - return e - case <-ctx.Done(): - return nil - } -} - -func hasAddress(e *zeroconf.ServiceEntry) bool { - for _, ip := range e.AddrIPv4 { - if ip != nil && !ip.IsUnspecified() { + if ip4 := ip.To4(); ip4 != nil && !ip4.IsUnspecified() { return true } - } - for _, ip := range e.AddrIPv6 { - if ip != nil && !net.IP(ip).IsLinkLocalUnicast() { + if !ip.IsLinkLocalUnicast() { return true } } diff --git a/services/tests/ghost_node_test.go b/services/tests/ghost_node_test.go index 1cff4d68..65f55d4f 100644 --- a/services/tests/ghost_node_test.go +++ b/services/tests/ghost_node_test.go @@ -4,6 +4,7 @@ package tests import ( + "context" "encoding/json" "fmt" "net" @@ -17,9 +18,8 @@ import ( "testing" "time" - "github.com/grandcat/zeroconf" - "nvpair-shared/jsonrpc" + "nvpair-shared/mdns" "nvpair-shared/noderec" ) @@ -34,7 +34,7 @@ import ( // this exercises the whole chain in one process tree: mDNS browse -> miss // threshold -> liveness probe -> node-info identity mismatch -> node-removed. // -// The peer is simulated rather than a second PAIR install: a zeroconf +// The peer is simulated rather than a second PAIR install: an mDNS // responder publishes the record, and a local HTTP server plays its node-info. // Flipping that server's reported hostUuid is exactly the signal a wipe // produces, and is what the probe must notice. @@ -81,16 +81,13 @@ func TestScannerEvictsRecordSupersededAtItsAddress(t *testing.T) { "ip=127.0.0.1", fmt.Sprintf("%s=%d", noderec.ServiceNodeInfo, niPort), } - responder, err := zeroconf.Register(peerInstance, noderec.ServiceType, testDomain, noderec.SRVPort, txt, nil) + responder, err := mdns.NewResponder(peerInstance, noderec.ServiceType, testDomain, noderec.SRVPort, txt) if err != nil { t.Fatalf("register peer: %v", err) } - responderDown := false - defer func() { - if !responderDown { - responder.Shutdown() - } - }() + responderCtx, cancelResponder := context.WithCancel(context.Background()) + t.Cleanup(cancelResponder) + go responder.Run(responderCtx) events := startScannerForGhostTest(t) @@ -102,8 +99,7 @@ func TestScannerEvictsRecordSupersededAtItsAddress(t *testing.T) { // The wipe: the record stops being advertised under the old identity, and // the machine now answers as someone else at the same address and port. - responder.Shutdown() - responderDown = true + cancelResponder() reported.Store(wipedUUID) // Eviction waits on the browser's full miss threshold (12 scans at 5s, a full diff --git a/services/tests/go.mod b/services/tests/go.mod index 388dde09..679eaf9f 100644 --- a/services/tests/go.mod +++ b/services/tests/go.mod @@ -2,15 +2,11 @@ module tests go 1.25.0 -require ( - github.com/grandcat/zeroconf v1.0.0 - nvpair-shared v0.0.0-00010101000000-000000000000 -) +require nvpair-shared v0.0.0-00010101000000-000000000000 replace nvpair-shared => ../shared require ( - github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/miekg/dns v1.1.55 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.58.0 // indirect diff --git a/services/tests/go.sum b/services/tests/go.sum index 649acc6c..f13b720b 100644 --- a/services/tests/go.sum +++ b/services/tests/go.sum @@ -1,33 +1,12 @@ -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= -github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= -github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/services/tests/models_http_test.go b/services/tests/models_http_test.go index baf5601d..cdf88d3e 100644 --- a/services/tests/models_http_test.go +++ b/services/tests/models_http_test.go @@ -11,6 +11,7 @@ package tests import ( + "context" "encoding/json" "fmt" "net/http" @@ -20,7 +21,7 @@ import ( "testing" "time" - "github.com/grandcat/zeroconf" + "nvpair-shared/mdns" ) func TestModelsHTTPEnrichment(t *testing.T) { @@ -59,11 +60,13 @@ func TestModelsHTTPEnrichment(t *testing.T) { // fetches the model list from the stub over loopback (ip= wins over the mDNS // address in the daemon's enrichment target selection). txt := []string{"v=1", "uuid=" + instance + "-uuid", "ip=127.0.0.1", fmt.Sprintf("em=%d", emPort)} - zsrv, err := zeroconf.Register(instance, nodeRecordService, testDomain, emPort, txt, nil) + resp, err := mdns.NewResponder(instance, nodeRecordService, testDomain, emPort, txt) if err != nil { t.Fatalf("register %s: %v", instance, err) } - t.Cleanup(zsrv.Shutdown) + respCtx, cancelResp := context.WithCancel(context.Background()) + t.Cleanup(cancelResp) + go resp.Run(respCtx) t.Logf("advertising %s @ %s (em=%d)", instance, nodeRecordService, emPort) stdin, msgs, cleanup := startBroker(t) diff --git a/services/tests/models_refresh_test.go b/services/tests/models_refresh_test.go index 60878798..68005f6f 100644 --- a/services/tests/models_refresh_test.go +++ b/services/tests/models_refresh_test.go @@ -11,6 +11,7 @@ package tests import ( + "context" "encoding/json" "fmt" "io" @@ -22,9 +23,8 @@ import ( "testing" "time" - "github.com/grandcat/zeroconf" - "nvpair-shared/jsonrpc" + "nvpair-shared/mdns" ) // swapModels is a /v1/models stub whose body can be swapped at runtime, standing @@ -73,11 +73,13 @@ func TestModelsPeriodicRefreshConvergesWithoutMDNSChange(t *testing.T) { // Advertise em= + ip=127.0.0.1 once and never touch the record again, // so the only thing that changes during the test is the /v1/models body. txt := []string{"v=1", "uuid=" + instance + "-uuid", "ip=127.0.0.1", fmt.Sprintf("em=%d", emPort)} - zsrv, err := zeroconf.Register(instance, nodeRecordService, testDomain, emPort, txt, nil) + resp, err := mdns.NewResponder(instance, nodeRecordService, testDomain, emPort, txt) if err != nil { t.Fatalf("register %s: %v", instance, err) } - t.Cleanup(zsrv.Shutdown) + respCtx, cancelResp := context.WithCancel(context.Background()) + t.Cleanup(cancelResp) + go resp.Run(respCtx) t.Logf("advertising %s @ %s (em=%d), models initially empty", instance, nodeRecordService, emPort) stdin, msgs, cleanup := startBroker(t) diff --git a/services/tests/workload_identity_interop_test.go b/services/tests/workload_identity_interop_test.go index f3879a74..3fa86dbd 100644 --- a/services/tests/workload_identity_interop_test.go +++ b/services/tests/workload_identity_interop_test.go @@ -15,7 +15,7 @@ // workload again from the restarted process. // // Both drive the real binaries TestMain builds. Test B needs mDNS (it -// advertises a stub peer over zeroconf), so it runs outside the network +// advertises a stub peer over mDNS), so it runs outside the network // sandbox. package tests diff --git a/services/tests/workload_interop_test.go b/services/tests/workload_interop_test.go index b1593d56..c9b8d1d6 100644 --- a/services/tests/workload_interop_test.go +++ b/services/tests/workload_interop_test.go @@ -21,6 +21,7 @@ package tests import ( + "context" "encoding/json" "fmt" "io" @@ -36,8 +37,7 @@ import ( "time" "nvpair-shared/jsonrpc" - - "github.com/grandcat/zeroconf" + "nvpair-shared/mdns" ) const workloadMgrService = "_nvpair-workload-manager._tcp" @@ -288,17 +288,13 @@ func TestWorkloadFailedOnNodeLoss(t *testing.T) { // probe has nothing to dial and evicts it cleanly. A distinct uuid keeps // it from colliding with this host's own record. peerTXT := []string{"v=1", "uuid=" + peerUUID, "ip=127.0.0.1"} - peerAdv, err := zeroconf.Register(peerNode, nodeRecordService, testDomain, 14999, peerTXT, nil) + peerResp, err := mdns.NewResponder(peerNode, nodeRecordService, testDomain, 14999, peerTXT) if err != nil { t.Fatalf("register peer node: %v", err) } - stopAdv := func() { - if peerAdv != nil { - peerAdv.Shutdown() - peerAdv = nil - } - } + peerRespCtx, stopAdv := context.WithCancel(context.Background()) t.Cleanup(stopAdv) + go peerResp.Run(peerRespCtx) t.Logf("advertising peer %q as %s", peerNode, nodeRecordService) // The peer must be in the broker's directory before its removal can diff --git a/services/versions.json b/services/versions.json index 29d8c230..6ea89689 100644 --- a/services/versions.json +++ b/services/versions.json @@ -1,19 +1,19 @@ { "$comment": "Single source of truth for all version numbers. See VERSIONING.md for bump rules.", - "product": "0.91.7", - "installer": "0.91.7", + "product": "0.91.9", + "installer": "0.91.9", "components": { - "ollama-proxy": "0.26.2", - "lmstudio-proxy": "0.16.2", + "ollama-proxy": "0.26.4", + "lmstudio-proxy": "0.16.4", "nvpair-node-info": "0.13.3", - "nvpair-node-scanner": "0.20.3", + "nvpair-node-scanner": "0.20.5", "nvpair-manual-nodes": "0.11.1", "nvpair-workload-manager": "0.13.3", - "nvpair-errors": "0.7.4", + "nvpair-errors": "0.7.6", "nvpair-node-settings": "1.0.4", "nvpair-ui-broker": "0.40.2", "nvpair-engine-manager": "0.17.4", - "nvpair-cluster-manager": "1.1.4", + "nvpair-cluster-manager": "1.1.6", "nvpair-job-scheduler": "0.4.1", "nvpair-tui": "0.7.2" }