From 214e714c03042ca1b86a5942a759bb2219825974 Mon Sep 17 00:00:00 2001 From: Christian Kellner Date: Tue, 17 Dec 2024 12:38:28 +0100 Subject: [PATCH] Puppeteer rewrite (#119) * Moving to puppeteer | removing scrapingAnt --- README.md | 9 +- conf/config.json | 2 +- lib/FredyRuntime.js | 234 ++- lib/api/routes/jobRouter.js | 23 +- lib/defaultConfig.js | 1 - lib/provider/einsAImmobilien.js | 14 +- lib/provider/immobilienDe.js | 10 +- lib/provider/immonet.js | 26 +- lib/provider/immoscout.js | 2 +- lib/provider/immoswp.js | 2 +- lib/provider/immowelt.js | 6 +- lib/provider/kleinanzeigen.js | 9 +- lib/provider/neubauKompass.js | 16 +- lib/provider/wgGesucht.js | 1 + lib/services/extractor/extractor.js | 45 + lib/services/extractor/parser/parser.js | 94 + lib/services/extractor/puppeteerExtractor.js | 48 + lib/services/extractor/utils.js | 35 + lib/services/requestDriver.js | 77 - lib/services/scraper.js | 36 - lib/services/scrapingAnt.js | 30 - package.json | 23 +- test/provider/immonet.test.js | 8 - test/provider/immoscout.test.js | 77 +- test/provider/neubauKompass.test.js | 8 - test/provider/testProvider.json | 2 +- .../views/generalSettings/GeneralSettings.jsx | 74 +- ui/src/views/jobs/ProcessingTimes.jsx | 60 +- .../components/provider/ProviderMutator.jsx | 8 +- yarn.lock | 1577 ++++++++++------- 30 files changed, 1367 insertions(+), 1190 deletions(-) create mode 100644 lib/services/extractor/extractor.js create mode 100644 lib/services/extractor/parser/parser.js create mode 100644 lib/services/extractor/puppeteerExtractor.js create mode 100644 lib/services/extractor/utils.js delete mode 100644 lib/services/requestDriver.js delete mode 100755 lib/services/scraper.js delete mode 100644 lib/services/scrapingAnt.js diff --git a/README.md b/README.md index 4700d26..2fd829c 100755 --- a/README.md +++ b/README.md @@ -81,13 +81,8 @@ yarn run test # Architecture ![Architecture](/doc/architecture.jpg "Architecture") -### Immoscout / Immonet / NeubauKompass -I have added **experimental** support for Immoscout, Immonet and NeubauKompass. They all are somewhat special, because they have decided to secure their service from bots using Re-Capture. Finding a way around this is barely possible. For _Fredy_ to be able to bypass this check, I'm using a service called [ScrapingAnt](https://scrapingant.com/). The trick is to use a headless browser, rotating proxies and (once successfully validated) to re-send the cookies each time. - -To be able to use Immoscout / Immonet, you need to create an account at ScrapingAnt. Configure the API key in the "General Settings" tab (visible when logged in as administrator). -The rest will be handled by _Fredy_. Keep in mind, the support is experimental. There might be bugs and you might not always pass the re-capture check, but most of the time it works rather well :) - -If you need more than the 1000 API calls allowed per month, I'd suggest opting for a paid account... ScrapingAnt loves OpenSource, therefore they have decided to give all _Fredy_ users a 10% discount by using the code **FREDY10** (Disclaimer: I do not earn any money for recommending their service). +### Immoscout +Immoscout has implemented advanced bot detection. I’m actively working on bypassing these measures, but until then, selecting Immoscout as a provider will not return any results. I apologize for the inconvenience. 😉 # Analytics Fredy is completely free (and will always remain free). However, it would be a huge help if you’d allow me to collect some analytical data. diff --git a/conf/config.json b/conf/config.json index f732cbe..e8c9521 100755 --- a/conf/config.json +++ b/conf/config.json @@ -1 +1 @@ -{"interval":"60","port":9998,"scrapingAnt":{"apiKey":"","proxy":"datacenter"},"workingHours":{"from":"","to":""},"demoMode":false,"analyticsEnabled":null} +{"interval":"60","port":9998,"workingHours":{"from":"","to":""},"demoMode":false,"analyticsEnabled":null} \ No newline at end of file diff --git a/lib/FredyRuntime.js b/lib/FredyRuntime.js index 4735333..949c700 100755 --- a/lib/FredyRuntime.js +++ b/lib/FredyRuntime.js @@ -1,134 +1,118 @@ -import { NoNewListingsWarning } from './errors.js'; -import { setKnownListings, getKnownListings } from './services/storage/listingsStorage.js'; +import {NoNewListingsWarning} from './errors.js'; +import {setKnownListings, getKnownListings} from './services/storage/listingsStorage.js'; import * as notify from './notification/notify.js'; -import xray from './services/scraper.js'; -import * as scrapingAnt from './services/scrapingAnt.js'; +import Extractor from './services/extractor/extractor.js'; import urlModifier from './services/queryStringMutator.js'; + class FredyRuntime { - /** - * - * @param providerConfig the config for the specific provider, we're going to query at the moment - * @param notificationConfig the config for all notifications - * @param providerId the id of the provider currently in use - * @param jobKey key of the job that is currently running (from within the config) - * @param similarityCache cache instance holding values to check for similarity of entries - */ - constructor(providerConfig, notificationConfig, providerId, jobKey, similarityCache) { - this._providerConfig = providerConfig; - this._notificationConfig = notificationConfig; - this._providerId = providerId; - this._jobKey = jobKey; - this._similarityCache = similarityCache; - } - execute() { - return ( - //modify the url to make sure search order is correctly set - Promise.resolve(urlModifier(this._providerConfig.url, this._providerConfig.sortByDateParam)) - //scraping the site and try finding new listings - .then(this._getListings.bind(this)) - //bring them in a proper form (dictated by the provider) - .then(this._normalize.bind(this)) - //filter listings with stuff tagged by the blacklist of the provider - .then(this._filter.bind(this)) - //check if new listings available. if so proceed - .then(this._findNew.bind(this)) - //store everything in db - .then(this._save.bind(this)) - //check for similar listings. if found, remove them before notifying - .then(this._filterBySimilarListings.bind(this)) - //notify the user using the configured notification adapter - .then(this._notify.bind(this)) - //if an error occurred on the way, handle it here. - .catch(this._handleError.bind(this)) - ); - } - _getListings(url) { - return new Promise((resolve, reject) => { - const id = this._providerId; - if (scrapingAnt.needScrapingAnt(id) && !scrapingAnt.isScrapingAntApiKeySet()) { - const error = 'Immoscout or Immonet can only be used with if you have set an apikey for scrapingAnt.'; - /* eslint-disable no-console */ - console.log(error); - /* eslint-enable no-console */ - reject(error); - return; - } - const u = scrapingAnt.needScrapingAnt(id) ? scrapingAnt.transformUrlForScrapingAnt(url, id) : url; - try { - if (this._providerConfig.paginate != null) { - xray(u, this._providerConfig.crawlContainer, [this._providerConfig.crawlFields]) - //the first 2 pages should be enough here - .limit(2) - .paginate(this._providerConfig.paginate) - .then((listings) => { - resolve(listings == null ? [] : listings); - }) - .catch((err) => { - reject(err); - console.error(err); - }); - } else { - xray(u, this._providerConfig.crawlContainer, [this._providerConfig.crawlFields]) - .then((listings) => { - resolve(listings == null ? [] : listings); - }) - .catch((err) => { - reject(err); - console.error(err); + /** + * + * @param providerConfig the config for the specific provider, we're going to query at the moment + * @param notificationConfig the config for all notifications + * @param providerId the id of the provider currently in use + * @param jobKey key of the job that is currently running (from within the config) + * @param similarityCache cache instance holding values to check for similarity of entries + */ + constructor(providerConfig, notificationConfig, providerId, jobKey, similarityCache) { + this._providerConfig = providerConfig; + this._notificationConfig = notificationConfig; + this._providerId = providerId; + this._jobKey = jobKey; + this._similarityCache = similarityCache; + } + + execute() { + return ( + //modify the url to make sure search order is correctly set + Promise.resolve(urlModifier(this._providerConfig.url, this._providerConfig.sortByDateParam)) + //scraping the site and try finding new listings + .then(this._getListings.bind(this)) + //bring them in a proper form (dictated by the provider) + .then(this._normalize.bind(this)) + //filter listings with stuff tagged by the blacklist of the provider + .then(this._filter.bind(this)) + //check if new listings available. if so proceed + .then(this._findNew.bind(this)) + //store everything in db + .then(this._save.bind(this)) + //check for similar listings. if found, remove them before notifying + .then(this._filterBySimilarListings.bind(this)) + //notify the user using the configured notification adapter + .then(this._notify.bind(this)) + //if an error occurred on the way, handle it here. + .catch(this._handleError.bind(this)) + ); + } + + _getListings(url) { + const extractor = new Extractor(); + return new Promise((resolve, reject) => { + extractor.execute(url,this._providerConfig.waitForSelector) + .then(() => { + const listings = extractor.parseResponseText(this._providerConfig.crawlContainer, this._providerConfig.crawlFields); + resolve(listings == null ? [] : listings); + }).catch(err => { + reject(err); + /* eslint-disable no-console */ + console.error(err); + /* eslint-enable no-console */ }); + }); + } + + _normalize(listings) { + return listings.map(this._providerConfig.normalize); + } + + _filter(listings) { + //only return those where all the fields have been found + const keys = Object.keys(this._providerConfig.crawlFields); + const filteredListings = listings.filter((item) => keys.every((key) => key in item)); + return filteredListings.filter(this._providerConfig.filter); + } + + _findNew(listings) { + const newListings = listings.filter((o) => getKnownListings(this._jobKey, this._providerId)[o.id] == null); + if (newListings.length === 0) { + throw new NoNewListingsWarning(); + } + return newListings; + } + + _notify(newListings) { + if (newListings.length === 0) { + throw new NoNewListingsWarning(); } - } catch (error) { - reject(error); - console.error(error); - } - }); - } - _normalize(listings) { - return listings.map(this._providerConfig.normalize); - } - _filter(listings) { - //only return those where all the fields have been found - const keys = Object.keys(this._providerConfig.crawlFields); - const filteredListings = listings.filter((item) => keys.every((key) => key in item)); - return filteredListings.filter(this._providerConfig.filter); - } - _findNew(listings) { - const newListings = listings.filter((o) => getKnownListings(this._jobKey, this._providerId)[o.id] == null); - if (newListings.length === 0) { - throw new NoNewListingsWarning(); + const sendNotifications = notify.send(this._providerId, newListings, this._notificationConfig, this._jobKey); + return Promise.all(sendNotifications).then(() => newListings); + } + + _save(newListings) { + const currentListings = getKnownListings(this._jobKey, this._providerId) || {}; + newListings.forEach((listing) => { + currentListings[listing.id] = Date.now(); + }); + setKnownListings(this._jobKey, this._providerId, currentListings); + return newListings; + } + + _filterBySimilarListings(listings) { + const filteredList = listings.filter((listing) => { + const similar = this._similarityCache.hasSimilarEntries(this._jobKey, listing.title); + if (similar) { + /* eslint-disable no-console */ + console.debug(`Filtering similar entry for job with id ${this._jobKey} with title: `, listing.title); + /* eslint-enable no-console */ + } + return !similar; + }); + filteredList.forEach((filter) => this._similarityCache.addCacheEntry(this._jobKey, filter.title)); + return filteredList; } - return newListings; - } - _notify(newListings) { - if (newListings.length === 0) { - throw new NoNewListingsWarning(); + + _handleError(err) { + if (err.name !== 'NoNewListingsWarning') console.error(err); } - const sendNotifications = notify.send(this._providerId, newListings, this._notificationConfig, this._jobKey); - return Promise.all(sendNotifications).then(() => newListings); - } - _save(newListings) { - const currentListings = getKnownListings(this._jobKey, this._providerId) || {}; - newListings.forEach((listing) => { - currentListings[listing.id] = Date.now(); - }); - setKnownListings(this._jobKey, this._providerId, currentListings); - return newListings; - } - _filterBySimilarListings(listings) { - const filteredList = listings.filter((listing) => { - const similar = this._similarityCache.hasSimilarEntries(this._jobKey, listing.title); - if (similar) { - /* eslint-disable no-console */ - console.debug(`Filtering similar entry for job with id ${this._jobKey} with title: `, listing.title); - /* eslint-enable no-console */ - } - return !similar; - }); - filteredList.forEach((filter) => this._similarityCache.addCacheEntry(this._jobKey, filter.title)); - return filteredList; - } - _handleError(err) { - if (err.name !== 'NoNewListingsWarning') console.error(err); - } } + export default FredyRuntime; diff --git a/lib/api/routes/jobRouter.js b/lib/api/routes/jobRouter.js index 35f3aac..d2c9f21 100644 --- a/lib/api/routes/jobRouter.js +++ b/lib/api/routes/jobRouter.js @@ -5,7 +5,6 @@ import * as userStorage from '../../services/storage/userStorage.js'; import * as immoscoutProvider from '../../provider/immoscout.js'; import { config } from '../../utils.js'; import { isAdmin } from '../security.js'; -import {isScrapingAntApiKeySet} from '../../services/scrapingAnt.js'; import {trackDemoJobCreated} from '../../services/tracking/Tracker.js'; const service = restana(); const jobRouter = service.newRouter(); @@ -27,34 +26,14 @@ jobRouter.get('/', async (req, res) => { res.send(); }); jobRouter.get('/processingTimes', async (req, res) => { - let scrapingAntData = {}; - if (isScrapingAntApiKeySet()) { - try { - const response = await fetch(`https://api.scrapingant.com/v2/usage?x-api-key=${config.scrapingAnt.apiKey}`); - scrapingAntData = await response.json(); - } catch (Exception) { - console.error('Could not query plan data from scraping ant.', Exception); - } - } res.body = { interval: config.interval, - lastRun: config.lastRun || null, - scrapingAntData, - error: scrapingAntData?.detail == null ? null : scrapingAntData?.detail + lastRun: config.lastRun || null }; res.send(); }); jobRouter.post('/', async (req, res) => { const { provider, notificationAdapter, name, blacklist = [], jobId, enabled } = req.body; - if ( - provider.find((p) => p.id === immoscoutProvider.metaInformation.id) != null && - (config.scrapingAnt.apiKey == null || config.scrapingAnt.apiKey.length === 0) - ) { - res.send( - new Error('To use Immoscout as provider, you need to configure ScrapingAnt first. Please check the readme.') - ); - return; - } try { jobStorage.upsertJob({ userId: req.session.currentUser, diff --git a/lib/defaultConfig.js b/lib/defaultConfig.js index b2545d5..0f2dcb8 100644 --- a/lib/defaultConfig.js +++ b/lib/defaultConfig.js @@ -1,7 +1,6 @@ export const DEFAULT_CONFIG = { 'interval': '60', 'port': 9998, - 'scrapingAnt': {'apiKey': '', 'proxy': 'datacenter'}, 'workingHours': {'from': '', 'to': ''}, 'demoMode': false, 'analyticsEnabled': null diff --git a/lib/provider/einsAImmobilien.js b/lib/provider/einsAImmobilien.js index 07a8b06..30c558e 100755 --- a/lib/provider/einsAImmobilien.js +++ b/lib/provider/einsAImmobilien.js @@ -2,14 +2,10 @@ import utils, { buildHash } from '../utils.js'; let appliedBlackList = []; function normalize(o) { - let size = `${o.size.replace(' Wohnfläche ', '').trim()}`; - if (o.rooms != null) { - size += ` / / ${o.rooms.trim()}`; - } const link = `https://www.1a-immobilienmarkt.de/expose/${o.id}.html`; const price = normalizePrice(o.price); const id = buildHash(o.id, price); - return Object.assign(o, { id, price, size, link }); + return Object.assign(o, { id, price, link }); } /** @@ -39,12 +35,12 @@ const config = { url: null, crawlContainer: '.tabelle', sortByDateParam: 'sort_type=newest', + waitForSelector: 'body', crawlFields: { id: '.inner_object_data input[name="marker_objekt_id"]@value | int', - price: '.tabelle .inner_object_data .single_data_price | removeNewline | trim', - size: '.tabelle .inner_object_data .data_boxes div:nth-child(1)', - rooms: '.tabelle .inner_object_data .data_boxes div:nth-child(2)', - title: '.tabelle .inner_object_data .tabelle_inhalt_titel_black | removeNewline | trim', + price: '.inner_object_data .single_data_price | removeNewline | trim', + size: '.tabelle .tabelle_inhalt_infos .single_data_box | removeNewline | trim', + title: '.inner_object_data .tabelle_inhalt_titel_black | removeNewline | trim', }, normalize: normalize, filter: applyBlacklist, diff --git a/lib/provider/immobilienDe.js b/lib/provider/immobilienDe.js index e5b27db..13e520f 100644 --- a/lib/provider/immobilienDe.js +++ b/lib/provider/immobilienDe.js @@ -11,8 +11,9 @@ function normalize(o) { const price = o.price || 'N/A €'; const title = o.title || 'No title available'; const address = o.address || 'No address available'; - const link = shortenLink(o.link); - const id = buildHash(parseId(shortenLink(o.link)), o.price); + const shortLink = shortenLink(o.link); + const link = `https://www.immobilien.de/${shortLink}`; + const id = buildHash(parseId(shortLink), o.price); return Object.assign(o, { id, price, size, title, address, link }); } function applyBlacklist(o) { @@ -22,9 +23,11 @@ function applyBlacklist(o) { } const config = { url: null, - crawlContainer: '.estates_list .list_immo a._ref', + crawlContainer: '._ref', sortByDateParam: 'sort_col=*created_ts&sort_dir=desc', + waitForSelector: 'body', crawlFields: { + id: '@href', //will be transformed later price: '.list_entry .immo_preis .label_info', size: '.list_entry .flaeche .label_info | removeNewline | trim', title: '.list_entry .part_text h3 span', @@ -32,7 +35,6 @@ const config = { link: '@href', address: '.list_entry .place', }, - paginate: '.list_immo .blocknav .blocknav_list li.next a@href', normalize: normalize, filter: applyBlacklist, }; diff --git a/lib/provider/immonet.js b/lib/provider/immonet.js index 1660753..cb53ee5 100755 --- a/lib/provider/immonet.js +++ b/lib/provider/immonet.js @@ -1,12 +1,20 @@ import utils, {buildHash} from '../utils.js'; let appliedBlackList = []; + +/** + * Note, Immonet is rly a piece of sh*t. It is using a weird combination of React and some buttons (instead of links), + * so that if somebody clicks the listing, a new page will open with the actual link to the listing. Of course, a scraper + * cannot do this (which is why I always just return the link to the whole list of listings). + * This is not only bad for us, but also bad for ppl with disabilities... + */ + function normalize(o) { const size = o.size != null ? o.size.replace('Wohnfläche ', '') : 'N/A m²'; const price = o.price.replace('Kaufpreis ', ''); const address = o.address.split(' • ')[o.address.split(' • ').length - 1]; const title = o.title || 'No title available'; - const link = o.id; - const id = buildHash(o.id.substring(o.id.lastIndexOf('/') + 1, o.id.length), price); + const link = config.url; + const id = buildHash(title, price); return Object.assign(o, { id, address, price, size, title, link }); } function applyBlacklist(o) { @@ -16,16 +24,16 @@ function applyBlacklist(o) { } const config = { url: null, - crawlContainer: '.content-wrapper-tiles .ng-star-inserted', + crawlContainer: 'div[data-testid="serp-core-classified-card-testid"]', sortByDateParam: 'sortby=19', + waitForSelector: 'div[data-testid="serp-core-classified-card-testid"]', crawlFields: { - id: '.card a@href', - title: '.card h3 |trim', - price: '.card .has-font-300 .is-bold | trim', - size: '.card .has-font-300 .ml-100 | trim', - address: '.card span:nth-child(2) | trim', + id: 'button@title |trim', // immonet is a piece of sh*t. See comment above + title: 'button@title |trim', + price: 'div[data-testid="cardmfe-price-testid"] | trim', + size: 'div[data-testid="cardmfe-keyfacts-testid"] | trim', + address: 'div[data-testid="cardmfe-description-box-address"] | trim', }, - paginate: '#idResultList .margin-bottom-6.margin-bottom-sm-12 .panel a.pull-right@href', normalize: normalize, filter: applyBlacklist, }; diff --git a/lib/provider/immoscout.js b/lib/provider/immoscout.js index 7174227..9d3dee7 100644 --- a/lib/provider/immoscout.js +++ b/lib/provider/immoscout.js @@ -17,6 +17,7 @@ const config = { url: null, crawlContainer: '#resultListItems li.result-list__listing', sortByDateParam: 'sorting=2', + waitForSelector: 'body', crawlFields: { id: '.result-list-entry@data-obid | int', price: '.result-list-entry .result-list-entry__criteria .grid-item:first-child dd | removeNewline | trim', @@ -25,7 +26,6 @@ const config = { link: '.result-list-entry .result-list-entry__brand-title-container@href', address: '.result-list-entry .result-list-entry__map-link', }, - paginate: '#pager .align-right a@href', normalize: normalize, filter: applyBlacklist, }; diff --git a/lib/provider/immoswp.js b/lib/provider/immoswp.js index 1fb3c02..de7f10d 100755 --- a/lib/provider/immoswp.js +++ b/lib/provider/immoswp.js @@ -23,6 +23,7 @@ const config = { url: null, crawlContainer: '.js-serp-item', sortByDateParam: 's=most_recently_updated_first', + waitForSelector: 'body', crawlFields: { id: '.js-bookmark-btn@data-id', price: 'div.align-items-start div:first-child | trim', @@ -31,7 +32,6 @@ const config = { link: '.ci-search-result__link@href', description: '.js-show-more-item-sm | removeNewline | trim', }, - paginate: 'li.page-item.pagination__item a.page-link@href', normalize: normalize, filter: applyBlacklist, }; diff --git a/lib/provider/immowelt.js b/lib/provider/immowelt.js index 3cb0356..393ddbd 100755 --- a/lib/provider/immowelt.js +++ b/lib/provider/immowelt.js @@ -16,17 +16,17 @@ function applyBlacklist(o) { const config = { url: null, crawlContainer: - 'div[data-testid="serp-core-scrollablelistview-testid"]:not(div[data-testid="serp-enlargementlist-testid"] div[data-testid="serp-card-testid"])', + 'div[data-testid="serp-core-scrollablelistview-testid"]:not(div[data-testid="serp-enlargementlist-testid"] div[data-testid="serp-card-testid"]) div[data-testid="serp-core-classified-card-testid"]', sortByDateParam: 'order=DateDesc', + waitForSelector: 'div[data-testid="cardmfe-price-testid"]', crawlFields: { - id: 'a@id', + id: 'a@href', price: 'div[data-testid="cardmfe-price-testid"] | removeNewline | trim', size: 'div[data-testid="cardmfe-keyfacts-testid"] | removeNewline | trim', title: '.css-1cbj9xw', link: 'a@href', address: 'div[data-testid="cardmfe-description-box-address"] | removeNewline | trim', }, - paginate: '#pnlPaging #nlbPlus@href', normalize: normalize, filter: applyBlacklist, }; diff --git a/lib/provider/kleinanzeigen.js b/lib/provider/kleinanzeigen.js index 36fe56d..dc5a2c8 100755 --- a/lib/provider/kleinanzeigen.js +++ b/lib/provider/kleinanzeigen.js @@ -6,7 +6,8 @@ let appliedBlacklistedDistricts = []; function normalize(o) { const size = o.size || '--- m²'; const id = buildHash(o.id, o.price); - return Object.assign(o, {id, size}); + const link = `https://www.kleinanzeigen.de${o.link}`; + return Object.assign(o, {id, size, link}); } function applyBlacklist(o) { @@ -22,16 +23,16 @@ const config = { crawlContainer: '#srchrslt-adtable .ad-listitem ', //sort by date is standard oO sortByDateParam: null, + waitForSelector: 'body', crawlFields: { id: '.aditem@data-adid | int', price: '.aditem-main--middle--price-shipping--price | removeNewline | trim', - size: '.aditem-main .text-module-end span:nth-child(2) | removeNewline | trim', + size: '.aditem-main .text-module-end | removeNewline | trim', title: '.aditem-main .text-module-begin a | removeNewline | trim', link: '.aditem-main .text-module-begin a@href | removeNewline | trim', - description: '.aditem-main p:not(.text-module-end) | removeNewline | trim', + description: '.aditem-main .aditem-main--middle--description | removeNewline | trim', address: '.aditem-main--top--left | trim | removeNewline', }, - paginate: '#srchrslt-pagination .pagination-next@href', normalize: normalize, filter: applyBlacklist, }; diff --git a/lib/provider/neubauKompass.js b/lib/provider/neubauKompass.js index b48a6f6..41ba49f 100755 --- a/lib/provider/neubauKompass.js +++ b/lib/provider/neubauKompass.js @@ -8,7 +8,7 @@ function nullOrEmpty(val) { function normalize(o) { const link = nullOrEmpty(o.link) ? 'NO LINK' : `https://www.neubaukompass.de${o.link.substring(o.link.indexOf('/neubau'))}`; - const id = buildHash(o.id, o.price); + const id = buildHash(o.link, o.price); return Object.assign(o, {id, link}); } @@ -18,16 +18,16 @@ function applyBlacklist(o) { const config = { url: null, - crawlContainer: '.nbk-container >div article', + crawlContainer: '.col-12.mb-4', sortByDateParam: 'Sortierung=Id&Richtung=DESC', + waitForSelector: '.nbk-section', crawlFields: { - id: '@id', - title: 'a.nbk-truncate@title | removeNewline | trim', - link: 'a.nbk-truncate@href', - address: 'p.nbk-truncate | removeNewline | trim', - price: 'p.nbk-mb-0 | removeNewline | trim', + id: 'a@href', + title: 'a@title | removeNewline | trim', + link: 'a@href', + address: '.nbk-project-card__description | removeNewline | trim', + price: '.nbk-project-card__spec-item .nbk-project-card__spec-value | removeNewline | trim', }, - paginate: '.numbered-pager__bottom .numbered-pager--info li:nth-child(2) a@href', normalize: normalize, filter: applyBlacklist, }; diff --git a/lib/provider/wgGesucht.js b/lib/provider/wgGesucht.js index 8558968..f9a758d 100755 --- a/lib/provider/wgGesucht.js +++ b/lib/provider/wgGesucht.js @@ -17,6 +17,7 @@ const config = { url: null, crawlContainer: '#main_column .wgg_card', sortByDateParam: 'sort_column=0&sort_order=0', + waitForSelector: 'body', crawlFields: { id: '@data-id', details: '.row .noprint .col-xs-11 |removeNewline |trim', diff --git a/lib/services/extractor/extractor.js b/lib/services/extractor/extractor.js new file mode 100644 index 0000000..a17d193 --- /dev/null +++ b/lib/services/extractor/extractor.js @@ -0,0 +1,45 @@ +import {setDebug} from './utils.js'; +import puppeteerExtractor from './puppeteerExtractor.js'; +import {loadParser, parse} from './parser/parser.js'; + +const DEFAULT_OPTIONS = { + debug: false, + puppeteerTimeout: 20_000, + puppeteerHeadless: true + +}; + +export default class Extractor { + constructor(options) { + this.options = { + ...DEFAULT_OPTIONS, + ...options + }; + this.responseText = null; + setDebug(this.options); + } + + /** + * if you are extracting data from a SPA, you must provide a selector, otherwise + * your response will never contain what you are really looking for + * @param url + * @param waitForSelector + */ + execute = async (url, waitForSelector = null) => { + this.responseText = null; + try { + this.responseText = await puppeteerExtractor(url, waitForSelector, this.options); + if(this.responseText != null) { + loadParser(this.responseText); + } + } catch (error) { + console.error('Error trying to load page.', error); + } + return this; + }; + + + parseResponseText = (crawlContainer, crawlFields) => { + return parse(crawlContainer, crawlFields, this.responseText); + }; +} diff --git a/lib/services/extractor/parser/parser.js b/lib/services/extractor/parser/parser.js new file mode 100644 index 0000000..456fe5a --- /dev/null +++ b/lib/services/extractor/parser/parser.js @@ -0,0 +1,94 @@ +import * as cheerio from 'cheerio'; + +let $ = null; + +export function loadParser(text) { + $ = cheerio.load(text); +} + +export function parse(crawlContainer, crawlFields, text) { + if (!text) { + console.warn('Cannot parse, text was empty.'); + return null; + } + + if (!crawlContainer || !crawlFields) { + console.warn('Cannot parse, selector was empty.'); + return null; + } + + const result = []; + + if ($(crawlContainer).length === 0) { + console.error('No elements in crawl container found!'); + } + + $(crawlContainer).each((_, element) => { + const container = $(element); + const parsedObject = {}; + + // Parse fields based on crawlFields + for (const [key, fieldSelector] of Object.entries(crawlFields)) { + let value; + + try { + + const selector = fieldSelector.includes('|') ? fieldSelector.substring(0, fieldSelector.indexOf('|')).trim() : fieldSelector; + + if (selector.includes('@')) { + const [sel, attr] = selector.split('@'); + if (sel.length === 0) { + value = container.attr(attr.trim()); + } else { + value = container.find(sel.trim()).attr(attr.trim()); + } + } else { + value = container.find(selector.trim()).text(); + } + + // Apply modifiers if specified + if (fieldSelector.includes('|')) { + const [_, ...modifiers] = fieldSelector.split('|').map(s => s.trim()); + value = applyModifiers(value, modifiers); + } + + parsedObject[key] = value || null; + } catch (error) { + console.error(`Error parsing field '${key}' with selector '${fieldSelector}':`, error); + parsedObject[key] = null; + } + } + + if (parsedObject.id != null) { + result.push(parsedObject); + } else { + console.warn('ID not found. Not relaying object.'); + } + }); + + return result; +} + +// Helper function to apply modifiers +function applyModifiers(value, modifiers) { + if (!value) return value; + + modifiers.forEach(modifier => { + switch (modifier) { + case 'int': + value = parseInt(value, 10); + break; + case 'trim': + value = value.replace(/\s+/g, ' ').trim(); + break; + case 'removeNewline': + value = value.replace(/\n/g, ' '); + break; + default: + console.warn(`Unknown modifier: ${modifier}`); + } + }); + + return value; +} + diff --git a/lib/services/extractor/puppeteerExtractor.js b/lib/services/extractor/puppeteerExtractor.js new file mode 100644 index 0000000..8a3200d --- /dev/null +++ b/lib/services/extractor/puppeteerExtractor.js @@ -0,0 +1,48 @@ +import puppeteer from 'puppeteer-extra'; +import StealthPlugin from 'puppeteer-extra-plugin-stealth'; +import {debug, DEFAULT_HEADER, botDetected} from './utils.js'; + +puppeteer.use(StealthPlugin()); + +export default async function execute(url, waitForSelector, options) { + let browser; + try { + debug(`Sending request to ${url} using Puppeteer.`); + + browser = await puppeteer.launch({ + headless: options.puppeteerHeadless ?? true, + args: ['--no-sandbox', '--disable-gpu', '--disable-setuid-sandbox'] + }); + let page = await browser.newPage(); + await page.setExtraHTTPHeaders(DEFAULT_HEADER); + const response = await page.goto(url, { + waitUntil: 'domcontentloaded' + }); + let pageSource; + //if we're extracting data from a spa, we must wait for the selector + if (waitForSelector != null) { + await page.waitForSelector(waitForSelector); + pageSource = await page.evaluate(selector => { + return document.querySelector(selector).innerHTML; + }, waitForSelector); + } else { + pageSource = await page.content(); + } + + const statusCode = response.status(); + + if (botDetected(pageSource, statusCode)) { + console.warn('We have been detected as a bot :-/ Tried url: => ', url); + return null; + } + + return await page.content(); + } catch (error) { + console.error('Error executing with puppeteer executor', error); + return null; + } finally { + if (browser != null) { + await browser.close(); + } + } +} \ No newline at end of file diff --git a/lib/services/extractor/utils.js b/lib/services/extractor/utils.js new file mode 100644 index 0000000..b28cb05 --- /dev/null +++ b/lib/services/extractor/utils.js @@ -0,0 +1,35 @@ +let debuggingOn = false; + +export const DEFAULT_HEADER = { + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.5', + 'Connection': 'keep-alive', + 'Upgrade-Insecure-Requests': '1', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' +}; + +export const setDebug = options => { + debuggingOn = !!options?.debug; +}; + +export const debug = (message) => { + if(debuggingOn) { + console.debug(message); + } +}; + +export const botDetected = (pageSource, statusCode) => { + const suspiciousStatusCodes = [ + 403, 429 + ]; + const botDetectionPatterns = [ + /verify you are human/i, + /access denied/i, + /x-amz-cf-id/i, + ]; + + const detectedInSource = botDetectionPatterns.some(pattern => pattern.test(pageSource)); + const detectedByStatus = suspiciousStatusCodes.includes(statusCode); + + return detectedInSource || detectedByStatus; +}; \ No newline at end of file diff --git a/lib/services/requestDriver.js b/lib/services/requestDriver.js deleted file mode 100644 index 4a91eac..0000000 --- a/lib/services/requestDriver.js +++ /dev/null @@ -1,77 +0,0 @@ -import fetch from 'node-fetch'; -import { config } from '../utils.js'; -import { makeUrlResidential } from './scrapingAnt.js'; -import https from 'https'; -//if ScrapingAnt got blocked, this http status is returned -const BLOCKED_HTTP_STATUS = 423; -const NOT_FOUND_HTTP_STATUS = 404; -const MAX_RETRIES_SCRAPING_ANT = 10; -const EXPECTED_STATUS_CODES = [BLOCKED_HTTP_STATUS, NOT_FOUND_HTTP_STATUS]; -const agent = new https.Agent({ - rejectUnauthorized: false, -}); - -function makeDriver(headers = {}) { - let cookies = ''; - async function scrapingAntDriver(context, callback, retryCounter = 0) { - const proxyType = config.scrapingAnt?.proxy || 'datacenter'; - try { - const url = proxyType === 'residential' ? makeUrlResidential(context.url) : context.url; - const response = await fetch(url, { - headers: { - ...headers, - cookie: cookies, - }, - }); - const result = await response.text(); - if (EXPECTED_STATUS_CODES.includes(response.status)) { - throw new Error(`${response.status}`); - } - if (cookies.length === 0) { - cookies = response.headers.raw()['set-cookie'] || []; - } - callback(null, result); - } catch (exception) { - /* eslint-disable no-console */ - if (!EXPECTED_STATUS_CODES.includes(exception.response?.status) && !EXPECTED_STATUS_CODES.includes(Number(exception.message))) { - console.error(`Error while trying to scrape data from scraping ant. Received error: ${exception.message}`); - callback(null, []); - return; - } - if (retryCounter <= MAX_RETRIES_SCRAPING_ANT) { - retryCounter++; - console.debug(`ScrapingAnt got blocked. Retrying ${retryCounter} / ${MAX_RETRIES_SCRAPING_ANT}`); - await scrapingAntDriver(context, callback, retryCounter); - } else { - console.error(`Error while trying to scrape data from scraping ant. Received error: ${exception.message}`); - callback(null, []); - } - /* eslint-enable no-console */ - } - } - - /** - * The regular request driver is taking care of everyting, that doesn't need to be scraped by ScrapingAnt (which is - * everything != Immoscout & Immonet as of writing this) - */ - return async function driver(context, callback) { - if (context.url.toLowerCase().indexOf('scrapingant') !== -1) { - return scrapingAntDriver(context, callback); - } - try { - const response = await fetch(context.url, { - headers: { - ...headers, - Cookie: cookies, - }, - agent, - }); - const result = await response.text(); - callback(null, result); - } catch (exception) { - console.error(`Error while trying to scrape data. Received error: ${exception.message}`); - callback(null, []); - } - }; -} -export default makeDriver; diff --git a/lib/services/scraper.js b/lib/services/scraper.js deleted file mode 100755 index c968659..0000000 --- a/lib/services/scraper.js +++ /dev/null @@ -1,36 +0,0 @@ -import { config } from '../utils.js'; -import makeDriver from './requestDriver.js'; -import Xray from 'x-ray'; -class Scraper { - constructor() { - const filters = { - removeNewline: this._removeNewline, - trim: this._trim, - int: this._int, - }; - const headers = { - 'User-Agent': - 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.85 Safari/537.36', - }; - if (config.scrapingAnt != null && config.scrapingAnt.apiKey != null) { - headers['x-api-key'] = config.scrapingAnt.apiKey; - } - const driver = makeDriver(headers); - const xray = Xray({ filters }); - xray.driver(driver); - this.xray = xray; - } - get x() { - return this.xray; - } - _removeNewline(value) { - return typeof value === 'string' ? value.replace(/\\n/g, '') : value; - } - _trim(value) { - return typeof value === 'string' ? value.replace(/\s+/g, ' ').trim() : value; - } - _int(value) { - return typeof value === 'string' ? parseInt(value, 10) : value; - } -} -export default new Scraper().x; diff --git a/lib/services/scrapingAnt.js b/lib/services/scrapingAnt.js deleted file mode 100644 index cd2d9dd..0000000 --- a/lib/services/scrapingAnt.js +++ /dev/null @@ -1,30 +0,0 @@ -import { metaInformation as immoScoutInfo } from '../provider/immoscout.js'; -import { metaInformation as immoNetInfo } from '../provider/immonet.js'; -import { metaInformation as neuBauCompassInfo } from '../provider/neubauKompass.js'; -import { config } from '../utils.js'; - -const additionalImmonetUrlParams = `&wait_for_selector=.content-wrapper-tiles&js_snippet=${Buffer.from( - 'window.scrollTo(0,document.body.scrollHeight);' -).toString('base64')}`; - -const needScrapingAnt = (id) => { - return id.toLowerCase() === immoScoutInfo.id || id.toLowerCase() === immoNetInfo.id || id.toLowerCase() === neuBauCompassInfo.id.toLowerCase(); -}; -export const transformUrlForScrapingAnt = (url, id) => { - let urlParams = ''; - if (needScrapingAnt(id)) { - if (id.toLowerCase() === immoNetInfo.id) { - urlParams = additionalImmonetUrlParams; - } - //only do calls to scrapingAnt when dealing with Immoscout/Immonet - url = `https://api.scrapingant.com/v2/general?url=${encodeURIComponent(url)}&proxy_type=datacenter${urlParams}`; - } - return url; -}; -export const isScrapingAntApiKeySet = () => { - return config.scrapingAnt != null && config.scrapingAnt.apiKey != null && config.scrapingAnt.apiKey.length > 8; -}; -export const makeUrlResidential = (url) => { - return url.replace('datacenter', 'residential'); -}; -export { needScrapingAnt }; diff --git a/package.json b/package.json index 1ad6451..a6b9717 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fredy", - "version": "10.4.4", + "version": "11.0.0", "description": "[F]ind [R]eal [E]states [d]amn eas[y].", "scripts": { "start": "node prod.js", @@ -50,16 +50,17 @@ "Firefox ESR" ], "dependencies": { - "@douyinfe/semi-ui": "2.70.1", + "@douyinfe/semi-ui": "2.71.3", "@rematch/core": "2.2.0", "@rematch/loading": "2.1.2", "@sendgrid/mail": "8.1.4", "@vitejs/plugin-react": "4.3.4", - "better-sqlite3": "^11.6.0", + "better-sqlite3": "^11.7.0", "body-parser": "1.20.3", + "cheerio": "^1.0.0", "cookie-session": "2.1.0", "handlebars": "4.7.8", - "highcharts": "12.0.1", + "highcharts": "12.1.0", "highcharts-react-official": "3.2.1", "lodash": "4.17.21", "lowdb": "6.0.1", @@ -68,10 +69,13 @@ "nanoid": "5.0.9", "node-fetch": "3.3.2", "node-mailjet": "6.0.6", + "puppeteer": "^23.10.4", + "puppeteer-extra": "^3.3.6", + "puppeteer-extra-plugin-stealth": "^2.11.2", "query-string": "9.1.1", "react": "18.3.1", "react-dom": "18.3.1", - "react-redux": "9.1.2", + "react-redux": "9.2.0", "react-router": "5.2.1", "react-router-dom": "5.3.0", "redux": "5.0.1", @@ -80,14 +84,13 @@ "serve-static": "1.16.2", "slack": "11.0.2", "string-similarity": "^4.0.4", - "vite": "5.4.11", - "x-ray": "2.3.4" + "vite": "5.4.11" }, "devDependencies": { "@babel/core": "7.26.0", "@babel/eslint-parser": "7.25.9", "@babel/preset-env": "7.26.0", - "@babel/preset-react": "7.25.9", + "@babel/preset-react": "7.26.3", "chai": "5.1.2", "eslint": "8.56.0", "eslint-config-prettier": "8.8.0", @@ -96,9 +99,9 @@ "history": "5.3.0", "husky": "9.1.7", "less": "4.2.1", - "lint-staged": "15.2.10", + "lint-staged": "15.2.11", "mocha": "10.8.2", - "prettier": "3.3.3", + "prettier": "3.4.2", "redux-logger": "3.0.6" } } diff --git a/test/provider/immonet.test.js b/test/provider/immonet.test.js index b10b447..4950f78 100644 --- a/test/provider/immonet.test.js +++ b/test/provider/immonet.test.js @@ -3,7 +3,6 @@ import { get } from '../mocks/mockNotification.js'; import { mockFredy, providerConfig } from '../utils.js'; import { expect } from 'chai'; import * as provider from '../../lib/provider/immonet.js'; -import * as scrapingAnt from '../../lib/services/scrapingAnt.js'; describe('#immonet testsuite()', () => { after(() => { @@ -13,13 +12,6 @@ describe('#immonet testsuite()', () => { it('should test immonet provider', async () => { const Fredy = await mockFredy(); return await new Promise((resolve) => { - if (!scrapingAnt.isScrapingAntApiKeySet()) { - /* eslint-disable no-console */ - console.info('Skipping Immonet test as ScrapingAnt Api Key is not set.'); - /* eslint-enable no-console */ - resolve(); - return; - } const fredy = new Fredy(provider.config, null, provider.metaInformation.id, 'immonet', similarityCache); fredy.execute().then((listing) => { expect(listing).to.be.a('array'); diff --git a/test/provider/immoscout.test.js b/test/provider/immoscout.test.js index 14aed38..df29fe4 100644 --- a/test/provider/immoscout.test.js +++ b/test/provider/immoscout.test.js @@ -1,48 +1,43 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; -import { get } from '../mocks/mockNotification.js'; -import { mockFredy, providerConfig } from '../utils.js'; -import { expect } from 'chai'; +//import {get} from '../mocks/mockNotification.js'; +import {/*mockFredy, */providerConfig} from '../utils.js'; +//import {expect} from 'chai'; import * as provider from '../../lib/provider/immoscout.js'; -import * as scrapingAnt from '../../lib/services/scrapingAnt.js'; describe('#immoscout testsuite()', () => { - after(() => { - similarityCache.stopCacheCleanup(); - }); - provider.init(providerConfig.immoscout, [], []); - it('should test immoscout provider', async () => { - const Fredy = await mockFredy(); - return await new Promise((resolve) => { - if (!scrapingAnt.isScrapingAntApiKeySet()) { - /* eslint-disable no-console */ - console.info('Skipping Immoscout test as ScrapingAnt Api Key is not set.'); - /* eslint-enable no-console */ - resolve(); - return; - } - const fredy = new Fredy(provider.config, null, provider.metaInformation.id, 'immoscout', similarityCache); - fredy.execute().then((listing) => { - expect(listing).to.be.a('array'); - const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('immoscout'); - notificationObj.payload.forEach((notify) => { - /** check the actual structure **/ - expect(notify.id).to.be.a('number'); - expect(notify.price).to.be.a('string'); - expect(notify.size).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); - /** check the values if possible **/ - expect(notify.price).that.does.include('€'); - expect(notify.size).that.does.include('m²'); - expect(notify.title).to.be.not.empty; - expect(notify.link).that.does.include('https://www.immobilienscout24.de'); - expect(notify.address).to.be.not.empty; + after(() => { + similarityCache.stopCacheCleanup(); + }); + provider.init(providerConfig.immoscout, [], []); + it('should test immoscout provider', async () => { + //const Fredy = await mockFredy(); + return await new Promise((resolve) => { + /* eslint-disable no-console */ + console.info('Skipping Immoscout test for now until we figured out how to surpass bot detection.'); + /* eslint-enable no-console */ + resolve(); + /* + const fredy = new Fredy(provider.config, null, provider.metaInformation.id, 'immoscout', similarityCache); + fredy.execute().then((listing) => { + expect(listing).to.be.a('array'); + const notificationObj = get(); + expect(notificationObj).to.be.a('object'); + expect(notificationObj.serviceName).to.equal('immoscout'); + notificationObj.payload.forEach((notify) => { + expect(notify.id).to.be.a('number'); + expect(notify.price).to.be.a('string'); + expect(notify.size).to.be.a('string'); + expect(notify.title).to.be.a('string'); + expect(notify.link).to.be.a('string'); + expect(notify.address).to.be.a('string'); + expect(notify.price).that.does.include('€'); + expect(notify.size).that.does.include('m²'); + expect(notify.title).to.be.not.empty; + expect(notify.link).that.does.include('https://www.immobilienscout24.de'); + expect(notify.address).to.be.not.empty; + }); + resolve(); + });*/ }); - resolve(); - }); }); - }); }); diff --git a/test/provider/neubauKompass.test.js b/test/provider/neubauKompass.test.js index 7993387..09dce30 100644 --- a/test/provider/neubauKompass.test.js +++ b/test/provider/neubauKompass.test.js @@ -3,7 +3,6 @@ import {get} from '../mocks/mockNotification.js'; import {mockFredy, providerConfig} from '../utils.js'; import {expect} from 'chai'; import * as provider from '../../lib/provider/neubauKompass.js'; -import * as scrapingAnt from '../../lib/services/scrapingAnt.js'; describe('#neubauKompass testsuite()', () => { after(() => { @@ -13,13 +12,6 @@ describe('#neubauKompass testsuite()', () => { it('should test neubauKompass provider', async () => { const Fredy = await mockFredy(); return await new Promise((resolve) => { - if (!scrapingAnt.isScrapingAntApiKeySet()) { - /* eslint-disable no-console */ - console.info('Skipping Neubaukompass test as ScrapingAnt Api Key is not set.'); - /* eslint-enable no-console */ - resolve(); - return; - } const fredy = new Fredy(provider.config, null, provider.metaInformation.id, 'neubauKompass', similarityCache); fredy.execute().then((listing) => { expect(listing).to.be.a('array'); diff --git a/test/provider/testProvider.json b/test/provider/testProvider.json index 6ff13bb..5c9ff42 100644 --- a/test/provider/testProvider.json +++ b/test/provider/testProvider.json @@ -9,7 +9,7 @@ "enabled": true }, "immonet": { - "url": "https://www.immonet.de/immobiliensuche/beta?pageoffset=1&listsize=100&objecttype=1&locationname=D%C3%BCsseldorf&acid=&actype=&district=8717&district=8718&district=8719&district=8720&district=8721&district=8723&district=8724&district=8725&district=8727&district=8728&district=8729&district=8730&district=8731&district=8732&district=8733&district=8737&district=8738&district=8741&district=8745&district=8747&district=8750&district=8752&district=8754&district=8755&district=8756&district=8759&district=8760&district=8761&district=8763&district=8764&district=8765&ajaxIsRadiusActive=false&sortby=19&suchart=1&radius=0&pcatmtypes=1_1&pCatMTypeStoragefield=&parentcat=1&marketingtype=1&fromprice=&toprice=420000&fromarea=90&toarea=&fromplotarea=&toplotarea=&fromrooms=3&torooms=&objectcat=225&objectcat=18&objectcat=17&objectcat=12&objectcat=16&objectcat=181&objectcat=14&objectcat=15&objectcat=226&objectcat=13&wbs=-1&fromyear=&toyear=", + "url": "https://www.immonet.de/classified-search?distributionTypes=Buy,Buy_Auction,Compulsory_Auction&estateTypes=House,Apartment&locations=AD08DE2112&order=Default&m=homepage_new_search_classified_search_result", "enabled": true }, "immowelt": { diff --git a/ui/src/views/generalSettings/GeneralSettings.jsx b/ui/src/views/generalSettings/GeneralSettings.jsx index 7659159..29c8fbb 100644 --- a/ui/src/views/generalSettings/GeneralSettings.jsx +++ b/ui/src/views/generalSettings/GeneralSettings.jsx @@ -2,13 +2,13 @@ import React from 'react'; import {useDispatch, useSelector} from 'react-redux'; -import {Divider, Input, Radio, TimePicker, Button, RadioGroup, Checkbox} from '@douyinfe/semi-ui'; +import {Divider, TimePicker, Button, Checkbox} from '@douyinfe/semi-ui'; import {InputNumber} from '@douyinfe/semi-ui'; import Headline from '../../components/headline/Headline'; import {xhrPost} from '../../services/xhr'; import {SegmentPart} from '../../components/segment/SegmentPart'; import {Banner, Toast} from '@douyinfe/semi-ui'; -import {IconSave, IconCalendar, IconKey, IconRefresh, IconSignal, IconLineChartStroked, IconSearch} from '@douyinfe/semi-icons'; +import {IconSave, IconCalendar, IconRefresh, IconSignal, IconLineChartStroked, IconSearch} from '@douyinfe/semi-icons'; import './GeneralSettings.less'; function formatFromTimestamp(ts) { @@ -35,8 +35,6 @@ const GeneralSettings = function GeneralSettings() { const [interval, setInterval] = React.useState(''); const [port, setPort] = React.useState(''); - const [scrapingAntApiKey, setScrapingAntApiKey] = React.useState(''); - const [scrapingAntProxy, setScrapingAntProxy] = React.useState(''); const [workingHourFrom, setWorkingHourFrom] = React.useState(null); const [workingHourTo, setWorkingHourTo] = React.useState(null); const [demoMode, setDemoMode] = React.useState(null); @@ -55,10 +53,8 @@ const GeneralSettings = function GeneralSettings() { async function init() { setInterval(settings?.interval); setPort(settings?.port); - setScrapingAntApiKey(settings?.scrapingAnt?.apiKey); setWorkingHourFrom(settings?.workingHours?.from); setWorkingHourTo(settings?.workingHours?.to); - setScrapingAntProxy(settings?.scrapingAnt?.proxy || 'datacenter'); setAnalyticsEnabled(settings?.analyticsEnabled || false); setDemoMode(settings?.demoMode || false); } @@ -96,10 +92,6 @@ const GeneralSettings = function GeneralSettings() { await xhrPost('/api/admin/generalSettings', { interval, port, - scrapingAnt: { - apiKey: scrapingAntApiKey, - proxy: scrapingAntProxy, - }, workingHours: { from: workingHourFrom, to: workingHourTo, @@ -155,68 +147,6 @@ const GeneralSettings = function GeneralSettings() { /> - - setScrapingAntApiKey(val)} - /> - - - - - ScrapingAnt is needed to scrape Immoscout. ScrapingAnt itself is using 2 - different types of proxies - - } - style={{marginBottom: '1rem'}} - description={ -
-

Datacenter-Proxy

- Proxy server located in one of the datacenters across the world. Datacenter - proxies are slower and - more likely to fail, but they are cheaper. A call with a datacenter proxy cost - 10 credits. -

Residential-Proxy

- High-quality proxy server located in one of the real people houses across the - world. Datacenter - proxies are faster and more likely to success, but they are more expensive. -
-
- - On the free tier, you have 10.000 credits, so chose your option wisely. Keep - in mind, only - successful calls will be charged. - -
- } - /> - - setScrapingAntProxy(e.target.value)}> - - Datacenter proxy - - - Residential proxy - - -
- - Scraping Ant Error - - } - style={{marginBottom: '1rem'}} - description={ -
- {processingTimes.error} -
- } - />; - } return ( <> )} - - {(processingTimes.scrapingAntData != null && Object.keys(processingTimes.scrapingAntData).length > 0) &&( - <> - - } - /> - } - > -

Plan: {processingTimes.scrapingAntData.plan_name}

-

- Duration: {format(new Date(processingTimes.scrapingAntData.start_date))} -{' '} - {format(new Date(processingTimes.scrapingAntData.end_date))} -
- Credits: {processingTimes.scrapingAntData.remained_credits}/ - {processingTimes.scrapingAntData.plan_total_credits} -

- If you want to scrape Immoscout or Immonet more often, you have to purchase a premium account - of{' '} - - ScrapingAnt - - . You can use the code FREDY10 to get 10% off. (No affiliation, we are not getting - paid by ScrapingAnt.) -
- - )} ); } - -/* - - - - */ diff --git a/ui/src/views/jobs/mutation/components/provider/ProviderMutator.jsx b/ui/src/views/jobs/mutation/components/provider/ProviderMutator.jsx index 3afd88f..a94747e 100644 --- a/ui/src/views/jobs/mutation/components/provider/ProviderMutator.jsx +++ b/ui/src/views/jobs/mutation/components/provider/ProviderMutator.jsx @@ -96,17 +96,15 @@ export default function ProviderMutator({ onVisibilityChanged, visible = false, fullMode={false} type="warning" closeIcon={null} - title={
ScrapingAnt
} + title={
Warning
} style={{ marginBottom: '1rem' }} description={

- If you chose Immoscout, Immonet or NeubauKompass as a provider, make sure to also add the scrapingAnt apiKey to the config.json. - (See readme) + Immoscout will not work at the moment due to advanced bot detection. I'm currently working on a fix.

- Do not forget to sort the results by date before copying the url to Fredy, so that Fredy always captures - the latest search results. + Until a fix has been released, Immoscout won't yield any results.

} diff --git a/yarn.lock b/yarn.lock index cd351dd..a835350 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,7 +24,7 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -902,10 +902,10 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.9.tgz#5f473035dc2094bcfdbc7392d0766bd42dce173e" - integrity sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw== +"@babel/preset-react@7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.26.3.tgz#7c5e028d623b4683c1f83a0bd4713b9100560caa" + integrity sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw== dependencies: "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-validator-option" "^7.25.9" @@ -991,33 +991,34 @@ dependencies: tslib "^2.0.0" -"@douyinfe/semi-animation-react@2.70.1": - version "2.70.1" - resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation-react/-/semi-animation-react-2.70.1.tgz#1fe840336a3a49b3d2ed0bac3479135fe6af1a31" - integrity sha512-xiryCQGhjGUZ4/j5WIfjtn9s8fZsTlSxmebbmZK576qm05020YCc92r52g8z1SgXDBluOqs+OLrrWJw9pq6IHg== +"@douyinfe/semi-animation-react@2.71.3": + version "2.71.3" + resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation-react/-/semi-animation-react-2.71.3.tgz#d3c86e51e6457d5f35cf69af9d839b205d65ff61" + integrity sha512-hseAJ7yx9L/bqlAiFb2U9eAcHTrOVEYQp+HX3XtFXsvIfGayNPQMY+nteKqGgY/8Rym4X1VM8WegBBG+3uXxnQ== dependencies: - "@douyinfe/semi-animation" "2.70.1" - "@douyinfe/semi-animation-styled" "2.70.1" + "@douyinfe/semi-animation" "2.71.3" + "@douyinfe/semi-animation-styled" "2.71.3" classnames "^2.2.6" -"@douyinfe/semi-animation-styled@2.70.1": - version "2.70.1" - resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation-styled/-/semi-animation-styled-2.70.1.tgz#4f094a90bad134b97c4ebdb7b611a6a7f956f6d7" - integrity sha512-6ESi+RruTF6U+PzBKT+5DcK1MCwryu1B9nvZiwXflXRRRzi37OzvDy68g3uo/btcpeUvWN8Oi0G+Lg2t8z3xQQ== +"@douyinfe/semi-animation-styled@2.71.3": + version "2.71.3" + resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation-styled/-/semi-animation-styled-2.71.3.tgz#195a85197ff567aa46647a5a4bc813ec5313046a" + integrity sha512-/uV7Y8cfvop4hfs/C1teJrIZGlFT4EgKYVTCz+0Sl1yepCSHRTYaVt61jEbh/oewoW9xpk1VboR8se0UiQmHCg== -"@douyinfe/semi-animation@2.70.1": - version "2.70.1" - resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation/-/semi-animation-2.70.1.tgz#f200e65d9f234ddc2124bb9b09d99a602dc4280f" - integrity sha512-CZBuMsVETxgau3j3jCr6pur3vZk3Sk1BZx4CBaD4EzWx4mXNY3aNRwaNwcuR3TWl0zxLX2HTpLgMPe4X+aW+/g== +"@douyinfe/semi-animation@2.71.3": + version "2.71.3" + resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation/-/semi-animation-2.71.3.tgz#a5d07affc6268abf3b24d10d05e3119d7186321c" + integrity sha512-6Q9CqlEKRcYFvOHN5tOT3TpB+hO7V8cyI2dyHHwZNukqVfMJ9/olIkAeKPPpbWcf33JEV6+O7ZNwBgZUVYZsEw== dependencies: bezier-easing "^2.1.0" -"@douyinfe/semi-foundation@2.70.1": - version "2.70.1" - resolved "https://registry.yarnpkg.com/@douyinfe/semi-foundation/-/semi-foundation-2.70.1.tgz#de5b8ec06ddc94c8e1ba747a3ca14fe9c9ff8e41" - integrity sha512-+A6LU5Jqqqgn1BG4n5r8TDKbfT8eSW5XKhGw9eekfnbQkfu5EEgsyZQGo2KKwh7TKUlIc6ntrAH4skviPMqJ6Q== +"@douyinfe/semi-foundation@2.71.3": + version "2.71.3" + resolved "https://registry.yarnpkg.com/@douyinfe/semi-foundation/-/semi-foundation-2.71.3.tgz#063578b3afe773a475b23fc5e3fd866ffb440d6b" + integrity sha512-eOkRQriI8QDVWI+EuQ3MVD5i490B876a2xHAmgNf3FkFZ1OUcRPURIfLVo6/6WXx57lXEVCgY2nbduO9zGGHZw== dependencies: - "@douyinfe/semi-animation" "2.70.1" + "@douyinfe/semi-animation" "2.71.3" + "@douyinfe/semi-json-viewer-core" "2.71.3" "@mdx-js/mdx" "^3.0.1" async-validator "^3.5.0" classnames "^2.2.6" @@ -1031,43 +1032,51 @@ remark-gfm "^4.0.0" scroll-into-view-if-needed "^2.2.24" -"@douyinfe/semi-icons@2.70.1": - version "2.70.1" - resolved "https://registry.yarnpkg.com/@douyinfe/semi-icons/-/semi-icons-2.70.1.tgz#382ce7c498deeeb08ed16088cf21b8a319bda20b" - integrity sha512-5So+o2nHp468lyRihwzAbRvo0/PQi0rZdKdepyD8tQEEl6ou00bgie/p9/ZShdrWHrG2a3oyFX77pTsGTbEnNQ== +"@douyinfe/semi-icons@2.71.3": + version "2.71.3" + resolved "https://registry.yarnpkg.com/@douyinfe/semi-icons/-/semi-icons-2.71.3.tgz#736a5b2c946dab0fb8d1fb9d41251279f6755d00" + integrity sha512-J9VayluoAYkJME1H0f5BzlzmGUAfGWdQpis5tDmZnw7MrEGM04UQpjatF7MXRMqqazmdXp1pV/rjgLdFQmz44A== dependencies: classnames "^2.2.6" -"@douyinfe/semi-illustrations@2.70.1": - version "2.70.1" - resolved "https://registry.yarnpkg.com/@douyinfe/semi-illustrations/-/semi-illustrations-2.70.1.tgz#2c6d870960fa609936c4d560434279b2bb439209" - integrity sha512-kk87Uf4kPUWe816ywK8OwFafXqL4HWJQgFYE/Tb+LAw4uuGpDQKE0aELlSzR2/QpfUIAsPExqOKNeWvDVSHDZg== +"@douyinfe/semi-illustrations@2.71.3": + version "2.71.3" + resolved "https://registry.yarnpkg.com/@douyinfe/semi-illustrations/-/semi-illustrations-2.71.3.tgz#4ceedc6f0ccff8cfab12a997f06a475465ba786b" + integrity sha512-mMC7KcIjE52FbuqNcVhMHjgvYR17VDm28vYZcXI/zPLhfPRpGM23MatJdPs0yLWP5SA11AgrbPHy64WfZZXlow== + +"@douyinfe/semi-json-viewer-core@2.71.3": + version "2.71.3" + resolved "https://registry.yarnpkg.com/@douyinfe/semi-json-viewer-core/-/semi-json-viewer-core-2.71.3.tgz#605c58bdd62066f72c0197b65b5290bb123f940a" + integrity sha512-Poopkfc5n+FIN8UZbB8VNLS5k067mYxrtqsC/F37beTrSkAtsBzh1wlXOEIarDi+BzCSLyErNBp1Xfp0OvehXQ== + dependencies: + jsonc-parser "^3.3.1" -"@douyinfe/semi-theme-default@2.70.1": - version "2.70.1" - resolved "https://registry.yarnpkg.com/@douyinfe/semi-theme-default/-/semi-theme-default-2.70.1.tgz#fcb844849ae70b6a16155ea0a9bbf0f0f63aed21" - integrity sha512-urIcebhGXVeVslf26ujSiQ4YQcqUxyvWimP9AM2IXkt6MtsYlVDpdyiIoOyO4IMxHxfMhFAphh2UXIbdlkTPOA== +"@douyinfe/semi-theme-default@2.71.3": + version "2.71.3" + resolved "https://registry.yarnpkg.com/@douyinfe/semi-theme-default/-/semi-theme-default-2.71.3.tgz#f4a8160934191cc03ee40dc4fbaf01425587ddc8" + integrity sha512-N6j+mSqcxN2/N+/QP2UbvH38Ht52n5JrKkDsYjdA6xiYBKRLIU1VjcAdFTkzQyKjOXrtkaiarMcypi2fwoS3ww== -"@douyinfe/semi-ui@2.70.1": - version "2.70.1" - resolved "https://registry.yarnpkg.com/@douyinfe/semi-ui/-/semi-ui-2.70.1.tgz#6a863663add0d8b31f048e5a63f99820bc087f72" - integrity sha512-irXuCCDr6oUzzv0usqWqSo11LeqNEi+yPaKTAujv8OnugfDG4e084cCXTa5/E6xSFS3UXJEWD7hUe7NB0+FNHA== +"@douyinfe/semi-ui@2.71.3": + version "2.71.3" + resolved "https://registry.yarnpkg.com/@douyinfe/semi-ui/-/semi-ui-2.71.3.tgz#35180839565f732d7601f18699ba18e45b029bcf" + integrity sha512-i4gD8hfOyowklSXBJPWW7NcPIx3QPYa1l0MyJPOjfw5LgUmotN36vaTg9bpo2g8/pRrGE9NdQn+iVYnSHxNSLw== dependencies: "@dnd-kit/core" "^6.0.8" "@dnd-kit/sortable" "^7.0.2" "@dnd-kit/utilities" "^3.2.1" - "@douyinfe/semi-animation" "2.70.1" - "@douyinfe/semi-animation-react" "2.70.1" - "@douyinfe/semi-foundation" "2.70.1" - "@douyinfe/semi-icons" "2.70.1" - "@douyinfe/semi-illustrations" "2.70.1" - "@douyinfe/semi-theme-default" "2.70.1" + "@douyinfe/semi-animation" "2.71.3" + "@douyinfe/semi-animation-react" "2.71.3" + "@douyinfe/semi-foundation" "2.71.3" + "@douyinfe/semi-icons" "2.71.3" + "@douyinfe/semi-illustrations" "2.71.3" + "@douyinfe/semi-theme-default" "2.71.3" async-validator "^3.5.0" classnames "^2.2.6" copy-text-to-clipboard "^2.1.1" date-fns "^2.29.3" date-fns-tz "^1.3.8" fast-copy "^3.0.1 " + jsonc-parser "^3.3.1" lodash "^4.17.21" prop-types "^15.7.2" react-resizable "^3.0.5" @@ -1366,6 +1375,20 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@puppeteer/browsers@2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.6.1.tgz#d75aec5010cae377c5e4742bf5e4f62a79c21315" + integrity sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg== + dependencies: + debug "^4.4.0" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.5.0" + semver "^7.6.3" + tar-fs "^3.0.6" + unbzip2-stream "^1.4.3" + yargs "^17.7.2" + "@rematch/core@2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@rematch/core/-/core-2.2.0.tgz" @@ -1479,6 +1502,11 @@ "@sendgrid/client" "^8.1.4" "@sendgrid/helpers" "^8.0.0" +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + "@types/acorn@^4.0.0": version "4.0.6" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" @@ -1524,7 +1552,7 @@ resolved "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/debug@^4.0.0": +"@types/debug@^4.0.0", "@types/debug@^4.1.0": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== @@ -1567,6 +1595,13 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== +"@types/node@*": + version "22.10.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" + integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== + dependencies: + undici-types "~6.20.0" + "@types/unist@*", "@types/unist@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" @@ -1577,10 +1612,17 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== -"@types/use-sync-external-store@^0.0.3": - version "0.0.3" - resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" - integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== +"@types/use-sync-external-store@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz#60be8d21baab8c305132eb9cb912ed497852aadc" + integrity sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg== + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" "@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": version "1.2.0" @@ -1603,14 +1645,6 @@ abbrev@1: resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@^1.2.5: - version "1.3.7" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -1633,6 +1667,11 @@ agent-base@6: dependencies: debug "4" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + ajv@^6.12.4: version "6.12.4" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz" @@ -1670,13 +1709,6 @@ ansi-regex@^6.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz" @@ -1708,6 +1740,11 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + array-buffer-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" @@ -1805,19 +1842,18 @@ arraybuffer.prototype.slice@^1.0.3: is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" -assert@^1.3.0: - version "1.5.0" - resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - assertion-error@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + astring@^1.8.0: version "1.8.6" resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" @@ -1863,6 +1899,11 @@ axios@^1.7.4: form-data "^4.0.0" proxy-from-env "^1.1.0" +b4a@^1.6.4: + version "1.6.7" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== + babel-plugin-polyfill-corejs2@^0.4.10: version "0.4.11" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" @@ -1897,20 +1938,53 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +bare-events@^2.0.0, bare-events@^2.2.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.0.tgz#305b511e262ffd8b9d5616b056464f8e1b3329cc" + integrity sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A== + +bare-fs@^2.1.1: + version "2.3.5" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.5.tgz#05daa8e8206aeb46d13c2fe25a2cd3797b0d284a" + integrity sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw== + dependencies: + bare-events "^2.0.0" + bare-path "^2.0.0" + bare-stream "^2.0.0" + +bare-os@^2.1.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.4.tgz#01243392eb0a6e947177bb7c8a45123d45c9b1a9" + integrity sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ== + +bare-path@^2.0.0, bare-path@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.3.tgz#594104c829ef660e43b5589ec8daef7df6cedb3e" + integrity sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA== + dependencies: + bare-os "^2.1.0" + +bare-stream@^2.0.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.1.tgz#b3b9874fab05b662c9aea2706a12fb0698c46836" + integrity sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g== + dependencies: + streamx "^2.21.0" + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -batch@~0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= +basic-ftp@^5.0.2: + version "5.0.5" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" + integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== -better-sqlite3@^11.6.0: - version "11.6.0" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.6.0.tgz#e50736956e6fe1c30dc94f1bc94a9c15d63b7b6b" - integrity sha512-2J6k/eVxcFYY2SsTxsXrj6XylzHWPxveCn4fKPKZFv/Vqn/Cd7lOuX4d7rGQXT5zL+97MkNL3nSbCrIoe3LkgA== +better-sqlite3@^11.7.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.7.0.tgz#3eaa0f54f9e57d0a100d980e42320f8b9a4cd676" + integrity sha512-mXpa5jnIKKHeoGzBrUJrc65cXFKcILGZpU3FXR0pradUEm9MA7UZz02qfEejaMcm9iXrSOCenwwYMJ/tZ1y5Ig== dependencies: bindings "^1.5.0" prebuild-install "^7.1.1" @@ -1946,11 +2020,6 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@^3.4.7: - version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - body-parser@1.20.3: version "1.20.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" @@ -1969,10 +2038,10 @@ body-parser@1.20.3: type-is "~1.6.18" unpipe "1.0.0" -boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== brace-expansion@^1.1.7: version "1.1.11" @@ -2038,7 +2107,12 @@ browserslist@^4.24.0, browserslist@^4.24.2: node-releases "^2.0.18" update-browserslist-db "^1.1.1" -buffer@^5.5.0: +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2127,15 +2201,6 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@~2.4.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" @@ -2166,27 +2231,34 @@ check-error@^2.1.1: resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== -cheerio@^0.22.0, cheerio@~0.22.0: - version "0.22.0" - resolved "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz" - integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash.assignin "^4.0.9" - lodash.bind "^4.1.4" - lodash.defaults "^4.0.1" - lodash.filter "^4.4.0" - lodash.flatten "^4.2.0" - lodash.foreach "^4.3.0" - lodash.map "^4.4.0" - lodash.merge "^4.4.0" - lodash.pick "^4.2.1" - lodash.reduce "^4.4.0" - lodash.reject "^4.4.0" - lodash.some "^4.4.0" +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0.tgz#1ede4895a82f26e8af71009f961a9b8cb60d6a81" + integrity sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.1.0" + encoding-sniffer "^0.2.0" + htmlparser2 "^9.1.0" + parse5 "^7.1.2" + parse5-htmlparser2-tree-adapter "^7.0.0" + parse5-parser-stream "^7.1.2" + undici "^6.19.5" + whatwg-mimetype "^4.0.0" chokidar@^3.5.3: version "3.6.0" @@ -2208,6 +2280,15 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chromium-bidi@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.8.0.tgz#ffd79dad7db1fcc874f1c55fcf46ded05a884269" + integrity sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug== + dependencies: + mitt "3.0.1" + urlpattern-polyfill "10.0.0" + zod "3.23.8" + classnames@^2.2.6: version "2.3.2" resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" @@ -2237,28 +2318,36 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" + integrity sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg== + dependencies: + for-own "^0.1.3" + is-plain-object "^2.0.1" + kind-of "^3.0.2" + lazy-cache "^1.0.3" + shallow-clone "^0.1.2" + clsx@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== -co@3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/co/-/co-3.1.0.tgz" - integrity sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g= - collapse-white-space@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" @@ -2266,11 +2355,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" @@ -2281,7 +2365,7 @@ colorette@^2.0.20: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.6, combined-stream@^1.0.8: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -2298,11 +2382,6 @@ commander@~12.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== -component-emitter@^1.2.0: - version "1.3.0" - resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - compute-scroll-into-view@^1.0.20: version "1.0.20" resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz" @@ -2313,18 +2392,6 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -content-disposition@^0.5.0: - version "0.5.3" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - content-type@~1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" @@ -2345,11 +2412,6 @@ cookie-session@2.1.0: on-headers "~1.0.2" safe-buffer "5.2.1" -cookiejar@^2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== - cookies@0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.9.1.tgz#3ffed6f60bb4fb5f146feeedba50acc418af67e3" @@ -2384,10 +2446,15 @@ core-js-compat@^3.38.1: dependencies: browserslist "^4.24.2" -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" cross-spawn@^7.0.2: version "7.0.2" @@ -2407,26 +2474,32 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" -css-what@2.1: - version "2.1.3" - resolved "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== data-uri-to-buffer@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + data-view-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" @@ -2466,7 +2539,7 @@ date-fns@^2.29.3: dependencies: "@babel/runtime" "^7.21.0" -debug@2.6.9, debug@^2.1.3: +debug@2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2480,20 +2553,13 @@ debug@3.2.7, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@~4.3.6: +debug@4: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: ms "^2.1.3" -debug@^3.1.0: - version "3.2.6" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - debug@^4.0.0, debug@^4.3.5: version "4.3.5" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" @@ -2501,7 +2567,7 @@ debug@^4.0.0, debug@^4.3.5: dependencies: ms "2.1.2" -debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: +debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -2522,6 +2588,13 @@ debug@^4.3.2: dependencies: ms "2.1.2" +debug@^4.3.4, debug@^4.4.0, debug@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + decamelize@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" @@ -2612,16 +2685,20 @@ define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegates@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz" - integrity sha1-tLV74RoWU1F6BLJ/CUm9wyff45A= - depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" @@ -2637,11 +2714,6 @@ destroy@1.2.0: resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -destroy@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - detect-libc@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" @@ -2654,6 +2726,11 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" +devtools-protocol@0.0.1367902: + version "0.0.1367902" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz#7333bfc4466c5a54a4c6de48a9dfbcb4b811660c" + integrity sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg== + diff@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" @@ -2673,54 +2750,35 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@~0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" -domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: - domelementtype "1" + domelementtype "^2.3.0" -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== +domutils@^3.0.1, domutils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: - dom-serializer "0" - domelementtype "1" + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" ee-first@1.1.1: version "1.1.1" @@ -2742,11 +2800,6 @@ electron-to-chromium@^1.5.41: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz#d9ba818da7b2b5ef1f3dd32bce7046feb7e93234" integrity sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw== -emitter-component@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz" - integrity sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY= - emoji-regex@^10.3.0: version "10.4.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" @@ -2767,6 +2820,14 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== +encoding-sniffer@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz#799569d66d443babe82af18c9f403498365ef1d5" + integrity sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg== + dependencies: + iconv-lite "^0.6.3" + whatwg-encoding "^3.1.1" + end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -2774,29 +2835,15 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enqueue@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/enqueue/-/enqueue-1.0.2.tgz" - integrity sha1-kBTpvOVw7pPKlubI5jrVTBkra8g= - dependencies: - sliced "0.0.5" - -enstore@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/enstore/-/enstore-1.0.1.tgz" - integrity sha1-og/nHq696KOBOgoSQEdfVYVKgas= - dependencies: - monotonic-timestamp "0.0.8" - -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +entities@^4.2.0, entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -entities@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== environment@^1.0.0: version "1.1.0" @@ -2810,10 +2857,12 @@ errno@^0.1.1: dependencies: prr "~1.0.1" -error-inject@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz" - integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" es-abstract@^1.17.0, es-abstract@^1.17.5: version "1.17.6" @@ -3128,16 +3177,11 @@ escalade@^3.2.0: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-html@^1.0.1, escape-html@~1.0.3: +escape-html@~1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" @@ -3148,6 +3192,17 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@8.8.0: version "8.8.0" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" @@ -3271,6 +3326,11 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.4.2: version "1.5.0" resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" @@ -3391,6 +3451,17 @@ extend@^3.0.0: resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + "fast-copy@^3.0.1 ": version "3.0.2" resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.2.tgz#59c68f59ccbcac82050ba992e0d5c389097c9d35" @@ -3406,6 +3477,11 @@ fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" @@ -3423,6 +3499,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" @@ -3500,14 +3583,22 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -form-data@^2.3.1: - version "2.5.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g== + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +for-own@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" + for-in "^1.0.1" form-data@^4.0.0: version "4.0.0" @@ -3518,11 +3609,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -format-parser@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/format-parser/-/format-parser-0.0.2.tgz" - integrity sha1-QxiCKoqfGimgE3JTuQhxnE+SIqI= - formdata-polyfill@^4.0.10: version "4.0.10" resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" @@ -3530,11 +3616,6 @@ formdata-polyfill@^4.0.10: dependencies: fetch-blob "^3.1.2" -formidable@^1.2.0: - version "1.2.2" - resolved "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz" - integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== - fresh@0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" @@ -3545,6 +3626,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" @@ -3649,6 +3739,13 @@ get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" @@ -3671,6 +3768,15 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" +get-uri@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.4.tgz#6daaee9e12f9759e19e55ba313956883ef50e0a7" + integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" + github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" @@ -3752,6 +3858,11 @@ graceful-fs@^4.1.2: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graphemer@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" @@ -3779,11 +3890,6 @@ has-bigints@^1.0.2: resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" @@ -3923,10 +4029,10 @@ highcharts-react-official@3.2.1: resolved "https://registry.npmjs.org/highcharts-react-official/-/highcharts-react-official-3.2.1.tgz" integrity sha512-hyQTX7ezCxl7JqumaWiGsroGWalzh24GedQIgO3vJbkGOZ6ySRAltIYjfxhrq4HszJOySZegotEF7v+haQ75UA== -highcharts@12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/highcharts/-/highcharts-12.0.1.tgz#a8c45938a510fc23ca5380dbfec5f82cd0eee5c9" - integrity sha512-86pku0cZnHfEu6uqbbEpU50XKHcAFFXeD4pYvxlVBRDLRDlxpT0WuClgJBuBJZof1ZjFUh1D7IxUxFgt9Epb7Q== +highcharts@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/highcharts/-/highcharts-12.1.0.tgz#5839985e190b15f9475533f2e1a2d8bb3a0bcdb1" + integrity sha512-MIFBU5KMQhNPlceP/8j8YH2I9P3C9j19WDA0HafWWeCK1MJwIQPjcyOfF0byWpbp2i3OBQNKhajejg53NK5oqQ== history@5.3.0: version "5.3.0" @@ -3954,41 +4060,15 @@ hoist-non-react-statics@^3.1.0: dependencies: react-is "^16.7.0" -htmlparser2@^3.9.1: - version "3.10.1" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - -http-context@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/http-context/-/http-context-1.1.1.tgz" - integrity sha1-pAFxs4nbpjBCqcSHIinHrQ78pRA= - dependencies: - accepts "^1.2.5" - assert "^1.3.0" - content-disposition "^0.5.0" - content-type "^1.0.1" - delegates "^0.1.0" - destroy "^1.0.3" - error-inject "^1.0.0" - escape-html "^1.0.1" - http-incoming "^0.12.0" - http-outgoing "^0.12.0" - koa-is-json "^1.0.0" - mime-types "^2.0.10" - on-finished "^2.2.0" - parseurl "^1.3.0" - querystring "^0.2.0" - statuses "^1.2.1" - type-is "^1.6.1" - vary "^1.0.0" +htmlparser2@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-9.1.0.tgz#cdb498d8a75a51f739b61d3f718136c369bc8c23" + integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.1.0" + entities "^4.5.0" http-errors@2.0.0: version "2.0.0" @@ -4001,15 +4081,13 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-incoming@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/http-incoming/-/http-incoming-0.12.0.tgz" - integrity sha1-EHg80rXeuMqSqz/yrRcTFdYbT/Y= - -http-outgoing@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/http-outgoing/-/http-outgoing-0.12.0.tgz" - integrity sha1-Zi86J8ek0UySS19TFJCe+r3hgw0= +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" https-proxy-agent@5.0.0: version "5.0.0" @@ -4019,6 +4097,14 @@ https-proxy-agent@5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + human-signals@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" @@ -4036,7 +4122,7 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.3: +iconv-lite@0.6.3, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -4066,6 +4152,14 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" @@ -4079,16 +4173,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -4131,6 +4220,14 @@ internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + is-alphabetical@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" @@ -4161,6 +4258,11 @@ is-array-buffer@^3.0.4: call-bind "^1.0.2" get-intrinsic "^1.2.1" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-async-function@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" @@ -4187,10 +4289,10 @@ is-boolean-object@^1.1.0: dependencies: call-bind "^1.0.0" -is-browser@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/is-browser/-/is-browser-2.0.1.tgz" - integrity sha1-i/C695mpxi/Z3lvO5M8zl8PnUpo= +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" @@ -4248,6 +4350,11 @@ is-decimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" @@ -4353,6 +4460,13 @@ is-plain-obj@^4.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== +is-plain-object@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + is-reference@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" @@ -4449,11 +4563,6 @@ is-unicode-supported@^0.1.0: resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-url@~1.2.0: - version "1.2.4" - resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - is-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" @@ -4496,20 +4605,15 @@ isarray@^2.0.5: resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@~4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== iterator.prototype@^1.1.3: version "1.1.3" @@ -4534,6 +4638,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsesc@^3.0.2, jsesc@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" @@ -4551,6 +4660,11 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -4566,6 +4680,20 @@ json5@^2.2.3: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonc-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.1.0" resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz" @@ -4581,10 +4709,29 @@ keygrip@~1.1.0: dependencies: tsscmp "1.0.6" -koa-is-json@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz" - integrity sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ= +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg== + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + integrity sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ== + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== less@4.2.1: version "4.2.1" @@ -4611,28 +4758,33 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lilconfig@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" - integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== +lilconfig@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@15.2.10: - version "15.2.10" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.10.tgz#92ac222f802ba911897dcf23671da5bb80643cd2" - integrity sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg== +lint-staged@15.2.11: + version "15.2.11" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.11.tgz#e88440982f4a4c1d55a9a7a839259ec3806bd81b" + integrity sha512-Ev6ivCTYRTGs9ychvpVw35m/bcNDuBN+mnTeObCL5h+boS5WzBEC6LHI4I9F/++sZm1m+J2LEiy0gxL/R9TBqQ== dependencies: chalk "~5.3.0" commander "~12.1.0" - debug "~4.3.6" + debug "~4.4.0" execa "~8.0.1" - lilconfig "~3.1.2" - listr2 "~8.2.4" + lilconfig "~3.1.3" + listr2 "~8.2.5" micromatch "~4.0.8" pidtree "~0.6.0" string-argv "~0.3.2" - yaml "~2.5.0" + yaml "~2.6.1" -listr2@~8.2.4: +listr2@~8.2.5: version "8.2.5" resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.5.tgz#5c9db996e1afeb05db0448196d3d5f64fec2593d" integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== @@ -4651,71 +4803,16 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.assignin@^4.0.9: - version "4.2.0" - resolved "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz" - integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= - -lodash.bind@^4.1.4: - version "4.2.1" - resolved "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz" - integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.defaults@^4.0.1: - version "4.2.0" - resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - -lodash.filter@^4.4.0: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz" - integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= - -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - -lodash.foreach@^4.3.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz" - integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= - -lodash.map@^4.4.0: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz" - integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= - -lodash.merge@^4.4.0, lodash.merge@^4.6.2: +lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - -lodash.reduce@^4.4.0: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz" - integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= - -lodash.reject@^4.4.0: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz" - integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= - -lodash.some@^4.4.0: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz" - integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= - lodash@4.17.21, lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" @@ -4790,6 +4887,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" @@ -5016,16 +5118,20 @@ media-typer@0.3.0: resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +merge-deep@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" + integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== + dependencies: + arr-union "^3.1.0" + clone-deep "^0.2.4" + kind-of "^3.0.2" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -methods@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - micromark-core-commonmark@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz#9a45510557d068605c6e9a80f282b2bb8581e43d" @@ -5406,7 +5512,7 @@ mime-db@1.43.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz" integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== -mime-types@^2.0.10, mime-types@^2.1.12, mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@~2.1.24: version "2.1.26" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz" integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== @@ -5472,6 +5578,19 @@ minimist@^1.2.5: resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +mitt@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA== + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + mixpanel@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/mixpanel/-/mixpanel-0.18.0.tgz#f010f2622902d0d4b434de238446ec8e5966ee32" @@ -5510,17 +5629,12 @@ mocha@10.8.2: yargs-parser "^20.2.9" yargs-unparser "^2.0.0" -monotonic-timestamp@0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/monotonic-timestamp/-/monotonic-timestamp-0.0.8.tgz" - integrity sha1-Z5h9AqQcFfVotsCgWIWYndJAK6A= - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.2, ms@^2.0.0, ms@^2.1.1: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -5559,16 +5673,16 @@ needle@^3.1.0: iconv-lite "^0.6.3" sax "^1.2.4" -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + node-abi@^3.3.0: version "3.52.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.52.0.tgz#ffba0a85f54e552547e5849015f40f9514d5ba7c" @@ -5628,14 +5742,14 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" -nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: - boolbase "~1.0.0" + boolbase "^1.0.0" -object-assign@^4.1.1, object-assign@~4.1.0: +object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -5765,13 +5879,6 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -on-finished@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" @@ -5829,6 +5936,28 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pac-proxy-agent@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz#da7c3b5c4cccc6655aaafb701ae140fb23f15df2" + integrity sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.1.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" + +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -5850,12 +5979,44 @@ parse-entities@^4.0.0: is-decimal "^2.0.0" is-hexadecimal "^2.0.0" +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-node-version@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz" integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== -parseurl@^1.3.0, parseurl@~1.3.3: +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b" + integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== + dependencies: + domhandler "^5.0.3" + parse5 "^7.0.0" + +parse5-parser-stream@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz#d7c20eadc37968d272e2c02660fff92dd27e60e1" + integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow== + dependencies: + parse5 "^7.0.0" + +parse5@^7.0.0, parse5@^7.1.2: + version "7.2.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" + integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== + dependencies: + entities "^4.5.0" + +parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -5897,6 +6058,11 @@ pathval@^2.0.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + periscopic@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" @@ -5983,25 +6149,20 @@ prelude-ls@^1.2.1: resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== +prettier@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== prismjs@^1.29.0: version "1.29.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise-polyfill@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-1.1.6.tgz" - integrity sha1-zQTv9G9clcOn0EVZHXm14+AfEtc= +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== prop-types@15.x, prop-types@^15.8.1: version "15.8.1" @@ -6026,6 +6187,20 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== +proxy-agent@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.6" + lru-cache "^7.14.1" + pac-proxy-agent "^7.1.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.5" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -6049,6 +6224,77 @@ punycode@^2.1.0: resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +puppeteer-core@23.10.4: + version "23.10.4" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.10.4.tgz#f0a70a0df6a0afd43e787b658064ddb062c07b5a" + integrity sha512-pQAY7+IFAndWDkDodsQGguW1/ifV5OMlGXJDspwtK49Asb7poJZ/V5rXJxVSpq57bWrJasjQBZ1X27z1oWVq4Q== + dependencies: + "@puppeteer/browsers" "2.6.1" + chromium-bidi "0.8.0" + debug "^4.4.0" + devtools-protocol "0.0.1367902" + typed-query-selector "^2.12.0" + ws "^8.18.0" + +puppeteer-extra-plugin-stealth@^2.11.2: + version "2.11.2" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-stealth/-/puppeteer-extra-plugin-stealth-2.11.2.tgz#bd3f5a1781cac8a98c983d148086585a84fcc8f1" + integrity sha512-bUemM5XmTj9i2ZerBzsk2AN5is0wHMNE6K0hXBzBXOzP5m5G3Wl0RHhiqKeHToe/uIH8AoZiGhc1tCkLZQPKTQ== + dependencies: + debug "^4.1.1" + puppeteer-extra-plugin "^3.2.3" + puppeteer-extra-plugin-user-preferences "^2.4.1" + +puppeteer-extra-plugin-user-data-dir@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-user-data-dir/-/puppeteer-extra-plugin-user-data-dir-2.4.1.tgz#4ea9d56d20455672a54fe086309a102a5126411c" + integrity sha512-kH1GnCcqEDoBXO7epAse4TBPJh9tEpVEK/vkedKfjOVOhZAvLkHGc9swMs5ChrJbRnf8Hdpug6TJlEuimXNQ+g== + dependencies: + debug "^4.1.1" + fs-extra "^10.0.0" + puppeteer-extra-plugin "^3.2.3" + rimraf "^3.0.2" + +puppeteer-extra-plugin-user-preferences@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-user-preferences/-/puppeteer-extra-plugin-user-preferences-2.4.1.tgz#db8ec63c04a6a10a8f8997e15fdffdf13272161d" + integrity sha512-i1oAZxRbc1bk8MZufKCruCEC3CCafO9RKMkkodZltI4OqibLFXF3tj6HZ4LZ9C5vCXZjYcDWazgtY69mnmrQ9A== + dependencies: + debug "^4.1.1" + deepmerge "^4.2.2" + puppeteer-extra-plugin "^3.2.3" + puppeteer-extra-plugin-user-data-dir "^2.4.1" + +puppeteer-extra-plugin@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin/-/puppeteer-extra-plugin-3.2.3.tgz#50c9f0749c005bbc7b8b208bcd00a9d46a15b585" + integrity sha512-6RNy0e6pH8vaS3akPIKGg28xcryKscczt4wIl0ePciZENGE2yoaQJNd17UiEbdmh5/6WW6dPcfRWT9lxBwCi2Q== + dependencies: + "@types/debug" "^4.1.0" + debug "^4.1.1" + merge-deep "^3.0.1" + +puppeteer-extra@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/puppeteer-extra/-/puppeteer-extra-3.3.6.tgz#fc16ff396aae52664842da9a557ea8fa51eaa8b7" + integrity sha512-rsLBE/6mMxAjlLd06LuGacrukP2bqbzKCLzV1vrhHFavqQE/taQ2UXv3H5P0Ls7nsrASa+6x3bDbXHpqMwq+7A== + dependencies: + "@types/debug" "^4.1.0" + debug "^4.1.1" + deepmerge "^4.2.2" + +puppeteer@^23.10.4: + version "23.10.4" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.10.4.tgz#398ff9f04924c05334514d73b61a03a7a36ad101" + integrity sha512-i0sYIAIjdO9MoRfFqbkoWFnQYZVmNp8msbztTgG46KbOdoYAv4f56MFzdFwtC0lyZHtkP+yl0H7tP0dNg3RQYA== + dependencies: + "@puppeteer/browsers" "2.6.1" + chromium-bidi "0.8.0" + cosmiconfig "^9.0.0" + devtools-protocol "0.0.1367902" + puppeteer-core "23.10.4" + typed-query-selector "^2.12.0" + qs@6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" @@ -6056,11 +6302,6 @@ qs@6.13.0: dependencies: side-channel "^1.0.6" -qs@^6.5.1: - version "6.9.1" - resolved "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz" - integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== - query-string@9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-9.1.1.tgz#dbfebb4196aeb2919915f2b2b81b91b965cf03a0" @@ -6070,10 +6311,10 @@ query-string@9.1.1: filter-obj "^5.1.0" split-on-first "^3.0.0" -querystring@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +queue-tick@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== randombytes@^2.1.0: version "2.1.0" @@ -6128,13 +6369,13 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-redux@9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" - integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== +react-redux@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.2.0.tgz#96c3ab23fb9a3af2cb4654be4b51c989e32366f5" + integrity sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g== dependencies: - "@types/use-sync-external-store" "^0.0.3" - use-sync-external-store "^1.0.0" + "@types/use-sync-external-store" "^0.0.6" + use-sync-external-store "^1.4.0" react-refresh@^0.14.2: version "0.14.2" @@ -6193,19 +6434,6 @@ react@18.3.1: dependencies: loose-envify "^1.1.0" -readable-stream@^2.3.5: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - readable-stream@^3.1.1: version "3.6.0" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" @@ -6543,11 +6771,6 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -6600,11 +6823,6 @@ scroll-into-view-if-needed@^2.2.24: dependencies: compute-scroll-into-view "^1.0.20" -selectn@^0.9.6: - version "0.9.6" - resolved "https://registry.npmjs.org/selectn/-/selectn-0.9.6.tgz" - integrity sha1-vYc6VW0Y+W2FFfyRUD7G/zmP+aI= - semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" @@ -6622,6 +6840,11 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + send@0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" @@ -6685,6 +6908,16 @@ setprototypeof@1.2.0: resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + integrity sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw== + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -6758,17 +6991,34 @@ slice-ansi@^7.1.0: ansi-styles "^6.2.1" is-fullwidth-code-point "^5.0.0" -sliced@0.0.5: - version "0.0.5" - resolved "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz" - integrity sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8= +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== -source-map@^0.6.1, source-map@~0.6.0: +source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6788,27 +7038,31 @@ split-on-first@^3.0.0: resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz" integrity sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -statuses@^1.2.1: - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - steno@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/steno/-/steno-3.0.0.tgz" integrity sha512-uZtn7Ht9yXLiYgOsmo8btj4+f7VxyYheMt8g6F1ANjyqByQXEE2Gygjgenp3otHH1TlHsS4JAaRGv5wJ1wvMNw== -stream-to-string@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/stream-to-string/-/stream-to-string-1.2.0.tgz" - integrity sha512-8drZlFIKBHSMdX9GCWv8V9AAWnQcTqw0iAI6/GC7UJ0H0SwKeFKjOoZfGY1tOU00GGU7FYZQoJ/ZCUEoXhD7yQ== +streamx@^2.15.0, streamx@^2.21.0: + version "2.21.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.21.1.tgz#f02979d8395b6b637d08a589fb514498bed55845" + integrity sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw== dependencies: - promise-polyfill "^1.1.6" + fast-fifo "^1.3.2" + queue-tick "^1.0.1" + text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" string-argv@~0.3.2: version "0.3.2" @@ -6829,6 +7083,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" @@ -6958,13 +7221,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - stringify-entities@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" @@ -7023,29 +7279,6 @@ style-to-object@^1.0.0: dependencies: inline-style-parser "0.2.3" -superagent@^3.6.0: - version "3.8.3" - resolved "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz" - integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== - dependencies: - component-emitter "^1.2.0" - cookiejar "^2.1.0" - debug "^3.1.0" - extend "^3.0.0" - form-data "^2.3.1" - formidable "^1.2.0" - methods "^1.1.1" - mime "^1.4.1" - qs "^6.5.1" - readable-stream "^2.3.5" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.1.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz" @@ -7075,6 +7308,17 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" +tar-fs@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" + integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^2.1.1" + bare-path "^2.1.0" + tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -7086,11 +7330,32 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" +tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + tiny-invariant@^1.0.2: version "1.3.1" resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" @@ -7145,6 +7410,11 @@ tslib@^2.0.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.0.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tslib@^2.3.0: version "2.3.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" @@ -7174,7 +7444,7 @@ type-fest@^0.20.2: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-is@^1.6.1, type-is@~1.6.18: +type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -7265,6 +7535,11 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" +typed-query-selector@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.0.tgz#92b65dbc0a42655fccf4aeb1a08b1dddce8af5f2" + integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== + uglify-js@^3.1.4: version "3.10.1" resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.1.tgz" @@ -7290,6 +7565,24 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unbzip2-stream@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +undici@^6.19.5: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4" + integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" @@ -7379,6 +7672,11 @@ unist-util-visit@^5.0.0: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" @@ -7420,23 +7718,21 @@ url-join@^4.0.0: resolved "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== -use-sync-external-store@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz" - integrity sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ== +urlpattern-polyfill@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +use-sync-external-store@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" + integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== + +util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util@0.10.3: - version "0.10.3" - resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - utility-types@^3.10.0: version "3.10.0" resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz" @@ -7447,11 +7743,6 @@ value-equal@^1.0.1: resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== -vary@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - vfile-message@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" @@ -7485,6 +7776,18 @@ web-streams-polyfill@^3.0.3: resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz" integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== +whatwg-encoding@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" + integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" @@ -7581,61 +7884,15 @@ wrap-ansi@^9.0.0: string-width "^7.0.0" strip-ansi "^7.1.0" -wrap-fn@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz" - integrity sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU= - dependencies: - co "3.1.0" - wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -x-ray-crawler@~2.0.1: - version "2.0.4" - resolved "https://registry.npmjs.org/x-ray-crawler/-/x-ray-crawler-2.0.4.tgz" - integrity sha512-+xMF/MPZHjEqvJzmK8K8HztmJQgPQZk6ZaVNWjxVx7VUDdjkWah2crWvJoCtLBHr1Nw2qs/MjSQxDV/nk9POHA== - dependencies: - cheerio "^0.22.0" - debug "^2.1.3" - delegates "^0.1.0" - emitter-component "^1.1.1" - enqueue "^1.0.2" - http-context "^1.1.0" - ms "^2.0.0" - selectn "^0.9.6" - sliced "0.0.5" - superagent "^3.6.0" - wrap-fn "^0.1.4" - x-ray-parse "^1.0.0" - yieldly "0.0.1" - -x-ray-parse@^1.0.0, x-ray-parse@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/x-ray-parse/-/x-ray-parse-1.0.1.tgz" - integrity sha1-CND/xeOtE5wRBQr5rqR2CUnylpQ= - dependencies: - format-parser "0.0.2" - -x-ray@2.3.4: - version "2.3.4" - resolved "https://registry.npmjs.org/x-ray/-/x-ray-2.3.4.tgz" - integrity sha512-QyprpnQb70ySaJ9LttmcS2R0e5d8oMiyDZ3bQ3bH/+dk5yUjt4obB9BUHz8/iGi+e7AZMxZOK60k/7x2/QiEJg== - dependencies: - batch "~0.6.0" - bluebird "^3.4.7" - chalk "~2.4.0" - cheerio "~0.22.0" - debug "~4.1.0" - enstore "~1.0.1" - is-url "~1.2.0" - isobject "~4.0.0" - object-assign "~4.1.0" - stream-to-string "^1.1.0" - x-ray-crawler "~2.0.1" - x-ray-parse "~1.0.1" +ws@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== y18n@^5.0.5: version "5.0.5" @@ -7652,10 +7909,10 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@~2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" - integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== +yaml@~2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" + integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== yargs-parser@^20.2.2: version "20.2.7" @@ -7667,6 +7924,11 @@ yargs-parser@^20.2.9: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs-unparser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -7690,12 +7952,31 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yieldly@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/yieldly/-/yieldly-0.0.1.tgz" - integrity sha1-fWTIVuTxzTw1p4+G4KKWDmp9BHQ= +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: - is-browser "2.0.1" + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +zod@3.23.8: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== zwitch@^2.0.0: version "2.0.4"