From 7f58876680c4163d7d27e6960062ccc69593f470 Mon Sep 17 00:00:00 2001 From: Milan Date: Tue, 18 Mar 2025 21:21:33 +0000 Subject: [PATCH] Initial implementation of the Date Range Expander plugin for Obsidian. --- .editorconfig | 10 + LICENSE | 2 +- README.md | 106 + esbuild.config.mjs | 49 + jest.config.js | 11 + main.js | 642 ++++ manifest.json | 14 + package-lock.json | 5772 +++++++++++++++++++++++++++++++ package.json | 29 + src/dateInputModal.ts | 325 ++ src/dateRangeExpander.ts | 123 + src/dateUtils.ts | 148 + src/main.ts | 71 + src/settingsTab.ts | 106 + src/types.ts | 31 + styles.css | 8 + tests/__mocks__/obsidian.ts | 18 + tests/dateRangeExpander.test.ts | 134 + tests/dateUtils.test.ts | 575 +++ tsconfig.json | 25 + 20 files changed, 8198 insertions(+), 1 deletion(-) create mode 100644 .editorconfig create mode 100644 README.md create mode 100644 esbuild.config.mjs create mode 100644 jest.config.js create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/dateInputModal.ts create mode 100644 src/dateRangeExpander.ts create mode 100644 src/dateUtils.ts create mode 100644 src/main.ts create mode 100644 src/settingsTab.ts create mode 100644 src/types.ts create mode 100644 styles.css create mode 100644 tests/__mocks__/obsidian.ts create mode 100644 tests/dateRangeExpander.test.ts create mode 100644 tests/dateUtils.test.ts create mode 100644 tsconfig.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..81f3ec3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# top-most EditorConfig file +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = tab +indent_size = 4 +tab_width = 4 diff --git a/LICENSE b/LICENSE index fbd7783..f4693c0 100644 --- a/LICENSE +++ b/LICENSE @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..559d32e --- /dev/null +++ b/README.md @@ -0,0 +1,106 @@ +# Date Range Expander + +A plugin for Obsidian that allows you to quickly insert a range of dates into your notes. Perfect for planning, journaling, or creating date-based content. + +## Features + +- Insert a sequence of dates using either an end date or duration +- Format dates according to your preferences +- Create wiki-linked dates automatically +- Optional callout formatting for date ranges +- Flexible file creation options for wiki-linked dates + +## How to Use + +1. Open the command palette (Ctrl/Cmd + P) +2. Search for "Date Range Expander" +3. Enter your date range details in the modal: + - Start date (format: YYYYMMDD) + - Choose either: + - End date (format: YYYYMMDD), or + - Duration (1-100 Days/Weeks/Months) + - Toggle whether to wrap dates in a callout + +The plugin will then insert your date range using your configured format settings. + +## Settings + +### Date Formatting + +- **Output date format**: Format for the inserted dates + - Default: YYYY.MM.DD + - Example: 2024.03.15 + +- **Friendly date format**: Format for displaying dates in a more readable way in certains locations like the callout and alert boxes. + - Default: DDD D MMM YYYY + - Supports: D, DD, DDD, DDDD, M, MM, MMM, MMMM, Y, YY, YYY, YYYY + - Example: Fri 15 Mar 2024 + +- **Date separator**: Character(s) used to separate dates in the sequence + - Default: ", " + - Example: 2024.03.15, 2024.03.16, 2024.03.17 + +### Wiki Links + +- **Create wiki links**: Toggle whether dates should be inserted as wiki links + - When enabled: [[2024.03.15]] + - When disabled: 2024.03.15 + +### File Creation Options + +When wiki links are enabled, you can choose how to handle non-existent date files: + +- **Do not create**: Only create the wiki links, don't create actual files +- **Create in same folder**: Automatically create date files in the same folder as the current note +- **Create in custom folder**: Create date files in a specified folder + - If selected, you can set a custom folder path (e.g., "Daily Notes") + +## Modal Options + +### Start Date +- Enter the beginning date in YYYYMMDD format +- Example: 20240315 for March 15, 2024 + +### Range Type +Choose between two ways to specify your date range: + +1. **End Date** + - Enter the final date in YYYYMMDD format + - The plugin will create a sequence from start to end date (inclusive of both dates) + +2. **Duration** + - Specify a number (1-100) + - Choose the unit: Days, Weeks, or Months + - The plugin will create a sequence starting from the start date for the specified duration + +### Callout Option +- Toggle "Add to callout" to wrap your date sequence in a collapsible callout +- Useful for organizing long date sequences + +## Examples + +1. Simple date range: +``` +2024.03.15, 2024.03.16, 2024.03.17 +``` + +2. Wiki-linked dates: +``` +[[2024.03.15]], [[2024.03.16]], [[2024.03.17]] +``` + +3. Dates in a callout: +``` +> [!SUMMARY]- Date range: Fri 15 Mar 2024 to Sun 17 Mar 2024 +> [[2024.03.15]], [[2024.03.16]], [[2024.03.17]] +``` + +## Say Thanks šŸ™ + +If you find this plugin helpful, then maybe... toss a coin to your ~~witcher~~ developer: + +[![Ko-Fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/mildeveloper) + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/mildeveloper) + +Your support helps maintain and improve the plugin! 😊 diff --git a/esbuild.config.mjs b/esbuild.config.mjs new file mode 100644 index 0000000..f9b8f78 --- /dev/null +++ b/esbuild.config.mjs @@ -0,0 +1,49 @@ +import esbuild from "esbuild"; +import process from "process"; +import builtins from "builtin-modules"; + +const banner = + `/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ +`; + +const prod = (process.argv[2] === "production"); + +const context = await esbuild.context({ + banner: { + js: banner, + }, + entryPoints: ["src/main.ts"], + bundle: true, + external: [ + "obsidian", + "electron", + "@codemirror/autocomplete", + "@codemirror/collab", + "@codemirror/commands", + "@codemirror/language", + "@codemirror/lint", + "@codemirror/search", + "@codemirror/state", + "@codemirror/view", + "@lezer/common", + "@lezer/highlight", + "@lezer/lr", + ...builtins], + format: "cjs", + target: "es2018", + logLevel: "info", + sourcemap: prod ? false : "inline", + treeShaking: true, + outfile: "main.js", + minify: prod, +}); + +if (prod) { + await context.rebuild(); + process.exit(0); +} else { + await context.watch(); +} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..0b06d4f --- /dev/null +++ b/jest.config.js @@ -0,0 +1,11 @@ +module.exports = { + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + moduleNameMapper: { + '^obsidian$': '/tests/__mocks__/obsidian.ts' + }, + testEnvironment: 'node' +}; \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..232518b --- /dev/null +++ b/main.js @@ -0,0 +1,642 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => DateRangeExpanderPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian4 = require("obsidian"); + +// src/dateInputModal.ts +var import_obsidian = require("obsidian"); + +// src/dateUtils.ts +var DateUtils = class { + getStartAndEndDates(modalResponse) { + let startDate = modalResponse.startDate; + let endDate; + if (modalResponse.rangeType === "EndDate") { + endDate = modalResponse.endDate; + } else { + endDate = new Date(startDate); + const duration = modalResponse.duration; + const unit = modalResponse.durationUnit; + switch (unit) { + case "Days": + endDate.setDate(startDate.getDate() + duration - 1); + break; + case "Weeks": + endDate.setDate(startDate.getDate() + duration * 7 - 1); + break; + case "Months": + endDate = this.addMonthsToDate(startDate, duration); + break; + } + } + if (startDate > endDate) { + return null; + } + const dateStartAndEnd = { + startDate, + endDate + }; + return dateStartAndEnd; + } + // Assuming string date is in format: YYYYMMDD + parseDateFromString(dateString) { + if (!this.isValidNumericDate(dateString)) { + return null; + } + const year = parseInt(dateString.substring(0, 4)); + const month = parseInt(dateString.substring(4, 6)) - 1; + const day = parseInt(dateString.substring(6, 8)); + const date = new Date(Date.UTC(year, month, day)); + return date; + } + // Returns true if string date is in format: YYYYMMDD + isValidNumericDate(dateString) { + if (!/^\d{8}$/.test(dateString)) + return false; + const year = parseInt(dateString.substring(0, 4)); + const month = parseInt(dateString.substring(4, 6)) - 1; + const day = parseInt(dateString.substring(6, 8)); + if (year < 1900) + return false; + if (month < 0 || month > 11) + return false; + if (day < 1 || day > 31) + return false; + const dateObj = new Date(year, month, day); + return dateObj.getFullYear() === year && dateObj.getMonth() === month && dateObj.getDate() === day; + } + formatDateToString(date, settingsFormat, defaultFormat) { + const year = date.getFullYear(); + const month = date.getMonth(); + const day = date.getDate(); + const weekday = date.getDay(); + const dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; + const monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + const dayAbbreviations = dayNames.map((day2) => day2.slice(0, 3)); + const monthAbbreviations = monthNames.map((month2) => month2.slice(0, 3)); + const formatDate = (format) => { + return format.replace(/YYYY|YYY|YY|Y|MMMM|MMM|MM|M|DDDD|DDD|DD|D/g, (match) => { + switch (match) { + case "YYYY": + return year.toString(); + case "YYY": + return year.toString().slice(-3); + case "YY": + return year.toString().slice(-2); + case "Y": + return year.toString().slice(-1); + case "MMMM": + return monthNames[month]; + case "MMM": + return monthAbbreviations[month]; + case "MM": + return (month + 1).toString().padStart(2, "0"); + case "M": + return (month + 1).toString(); + case "DDDD": + return dayNames[weekday]; + case "DDD": + return dayAbbreviations[weekday]; + case "DD": + return day.toString().padStart(2, "0"); + case "D": + return day.toString(); + default: + return match; + } + }); + }; + try { + return formatDate(settingsFormat); + } catch (error) { + return formatDate(defaultFormat); + } + } + addMonthsToDate(date, months) { + if (months === 0) { + return date; + } + const newDate = new Date(date); + const currentDay = date.getDate(); + newDate.setMonth(newDate.getMonth() + months); + newDate.setDate(newDate.getDate() - 1); + if (newDate.getMonth() !== date.getMonth() && newDate.getDate() !== currentDay - 1) { + newDate.setDate(0); + } + return newDate; + } + calculateDaysInRange(startDate, endDate) { + const millisecondsInDay = 1e3 * 60 * 60 * 24; + const differenceMilliseconds = endDate.getTime() - startDate.getTime(); + const differenceDays = Math.floor(differenceMilliseconds / millisecondsInDay) + 1; + return Math.max(0, differenceDays); + } +}; + +// src/dateInputModal.ts +var DateInputModal = class extends import_obsidian.Modal { + constructor(app, onSubmit) { + super(app); + this.startDateValue = ""; + this.endDateValue = ""; + this.durationValue = ""; + this.durationTypeValue = "Days"; + this.useCalloutValue = true; + this.rangeTypeValue = "EndDate"; + this.submitButton = null; + this.onSubmit = onSubmit; + this.dateUtils = new DateUtils(); + this.setTitle("Enter date range"); + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + this.addStyles(); + this.setupKeyboardListener(); + this.createStartDateInput(); + this.createRangeOptions(); + this.createCalloutToggle(); + this.createSubmitButton(); + } + onClose() { + const { contentEl } = this; + if (this.keyboardListener) { + contentEl.removeEventListener("keydown", this.keyboardListener); + } + contentEl.empty(); + } + validateInput() { + const startDateObj = this.dateUtils.parseDateFromString(this.startDateValue); + if (!startDateObj) { + return false; + } + if (this.rangeTypeValue === "EndDate") { + const endDateObj = this.dateUtils.parseDateFromString(this.endDateValue); + return !!endDateObj && this.dateUtils.isValidNumericDate(this.endDateValue) && endDateObj >= startDateObj; + } else { + return this.durationValue !== "" && parseInt(this.durationValue) > 0 && ["Days", "Weeks", "Months"].includes(this.durationTypeValue); + } + } + calculateDateCount() { + const startDate = this.dateUtils.parseDateFromString(this.startDateValue); + if (!startDate) { + return 0; + } + let endDate; + if (this.rangeTypeValue === "EndDate") { + endDate = this.dateUtils.parseDateFromString(this.endDateValue) || startDate; + } else { + endDate = new Date(startDate); + const duration = parseInt(this.durationValue) || 0; + if (this.durationTypeValue === "Days") { + endDate.setDate(endDate.getDate() + duration - 1); + } else if (this.durationTypeValue === "Weeks") { + endDate.setDate(endDate.getDate() + duration * 7 - 1); + } else if (this.durationTypeValue === "Months") { + endDate = this.dateUtils.addMonthsToDate(startDate, duration); + } + } + const dateCount = this.dateUtils.calculateDaysInRange(startDate, endDate); + return dateCount; + } + addStyles() { + const styleEl = document.createElement("style"); + styleEl.textContent = ` + .date-option-container { + margin-bottom: 15px; + } + .date-input-row { + display: flex; + align-items: center; + margin-bottom: 10px; + } + .date-input-row input[type="radio"] { + margin-right: 8px; + } + .date-input-row input[type="text"], + .date-input-row input[type="number"] { + margin-left: 5px; + } + .date-input-row select { + margin-left: 5px; + } + `; + this.contentEl.appendChild(styleEl); + } + setupKeyboardListener() { + this.keyboardListener = (event) => { + if (event.key === "Enter" && this.validateInput()) { + this.submit(); + } + }; + this.contentEl.addEventListener("keydown", this.keyboardListener); + } + createStartDateInput() { + new import_obsidian.Setting(this.contentEl).setName("Start date").addText((text) => { + text.setPlaceholder("YYYYMMDD").setValue(this.startDateValue); + text.inputEl.setAttribute("pattern", "[0-9]*"); + text.inputEl.setAttribute("maxlength", "8"); + text.inputEl.addEventListener("input", (e) => { + const input = e.target; + input.value = input.value.replace(/\D/g, "").slice(0, 8); + this.startDateValue = input.value; + this.updateSubmitButton(); + }); + }); + } + createRangeOptions() { + const optionContainer = this.contentEl.createEl("div", { cls: "date-option-container" }); + this.createEndDateOption(optionContainer); + this.createDurationOption(optionContainer); + this.updateInputStates(); + } + createEndDateOption(container) { + const endDateRow = container.createEl("div", { cls: "date-input-row" }); + const endDateLabel = endDateRow.createEl("label"); + endDateLabel.appendText("End date"); + const endDateRadio = endDateLabel.createEl("input", { + type: "radio", + attr: { name: "dateOption" } + }); + endDateRadio.checked = this.rangeTypeValue === "EndDate"; + this.endDateInput = endDateRow.createEl("input", { + type: "text", + placeholder: "YYYYMMDD", + value: this.endDateValue, + attr: { + pattern: "[0-9]*", + maxlength: "8" + } + }); + this.endDateInput.addEventListener("input", (e) => { + const input = e.target; + input.value = input.value.replace(/\D/g, "").slice(0, 8); + this.endDateValue = input.value; + this.updateSubmitButton(); + }); + endDateRadio.addEventListener("change", () => { + this.rangeTypeValue = "EndDate"; + this.updateInputStates(); + this.updateSubmitButton(); + }); + } + createDurationOption(container) { + const durationRow = container.createEl("div", { cls: "date-input-row" }); + const durationLabel = durationRow.createEl("label"); + durationLabel.appendText("Duration"); + const durationRadio = durationLabel.createEl("input", { + type: "radio", + attr: { name: "dateOption" } + }); + durationRadio.checked = this.rangeTypeValue === "Duration"; + this.durationInput = durationRow.createEl("input", { + type: "number", + attr: { + min: "1", + max: "100" + }, + placeholder: "1-100", + value: this.durationValue + }); + this.durationTypeSelect = durationRow.createEl("select"); + this.populateDurationTypes(); + durationRadio.addEventListener("change", () => { + this.rangeTypeValue = "Duration"; + this.updateInputStates(); + this.updateSubmitButton(); + }); + this.durationInput.addEventListener("input", (e) => { + const input = e.target; + let value = parseInt(input.value); + if (value > 100) { + value = 100; + input.value = "100"; + } + this.durationValue = value.toString(); + this.updateSubmitButton(); + }); + this.durationTypeSelect.addEventListener("change", (e) => { + this.durationTypeValue = e.target.value; + this.updateSubmitButton(); + }); + } + populateDurationTypes() { + ["Days", "Weeks", "Months"].forEach((type) => { + const option = this.durationTypeSelect.createEl("option", { + value: type, + text: type + }); + option.selected = type === this.durationTypeValue; + }); + } + updateInputStates() { + const isEndDateMode = this.rangeTypeValue === "EndDate"; + this.endDateInput.disabled = !isEndDateMode; + this.durationInput.disabled = isEndDateMode; + this.durationTypeSelect.disabled = isEndDateMode; + } + createCalloutToggle() { + new import_obsidian.Setting(this.contentEl).setName("Add to callout").setDesc("Insert dates inside a collapsed callout").addToggle( + (toggle) => toggle.setValue(this.useCalloutValue).onChange((value) => { + this.useCalloutValue = value; + }) + ); + } + createSubmitButton() { + this.submitButton = new import_obsidian.Setting(this.contentEl).addButton( + (btn) => btn.setButtonText("Insert").setCta().onClick(() => this.submit()) + ).settingEl.querySelector("button"); + if (this.submitButton) { + this.submitButton.disabled = true; + } + } + updateSubmitButton() { + if (this.submitButton) { + const validInput = this.validateInput(); + this.submitButton.disabled = !validInput; + if (validInput) { + const dateCount = this.calculateDateCount(); + this.submitButton.textContent = `Insert ${dateCount} Date${dateCount !== 1 ? "s" : ""}`; + } else { + this.submitButton.textContent = "Insert"; + } + } + } + submit() { + if (!this.validateInput()) { + return; + } + const startDateObj = this.dateUtils.parseDateFromString(this.startDateValue); + if (!startDateObj) { + return; + } + const dateRangeValues = { + startDate: startDateObj, + rangeType: this.rangeTypeValue, + useCallout: this.useCalloutValue + }; + if (this.rangeTypeValue === "EndDate") { + const endDateObj = this.dateUtils.parseDateFromString(this.endDateValue); + if (endDateObj) + dateRangeValues.endDate = endDateObj; + } else { + dateRangeValues.duration = parseInt(this.durationValue); + dateRangeValues.durationUnit = this.durationTypeValue; + } + this.close(); + if (this.onSubmit) { + this.onSubmit(dateRangeValues); + } + } +}; + +// src/types.ts +var DEFAULT_SETTINGS = { + outputDateFormat: "YYYY.MM.DD", + friendlyDateFormat: "DDD D MMM YYYY", + dateSeparator: ", ", + createWikiLinks: true, + createNonExistentFiles: "same-folder", + customFolderPath: "" +}; + +// src/settingsTab.ts +var import_obsidian2 = require("obsidian"); +var DateRangeExpanderSettingTab = class extends import_obsidian2.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + this.createDateFormatSettings(); + this.createWikiLinkSettings(); + } + createDateFormatSettings() { + new import_obsidian2.Setting(this.containerEl).setName("Output date format").setDesc(`Format for output dates (e.g., ${DEFAULT_SETTINGS.outputDateFormat})`).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.outputDateFormat).setValue(this.plugin.settings.outputDateFormat).onChange(async (value) => { + this.plugin.settings.outputDateFormat = value; + await this.plugin.saveSettings(); + })); + new import_obsidian2.Setting(this.containerEl).setName("Friendly date format").setDesc(`Format for friendly date display (e.g., ${DEFAULT_SETTINGS.friendlyDateFormat}). Supports D, DD, DDD, DDDD, M, MM, MMM, MMMM, Y, YY, YYY, YYYYM.`).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.friendlyDateFormat).setValue(this.plugin.settings.friendlyDateFormat).onChange(async (value) => { + this.plugin.settings.friendlyDateFormat = value; + await this.plugin.saveSettings(); + })); + new import_obsidian2.Setting(this.containerEl).setName("Date separator").setDesc(`Separator between dates (e.g., "${DEFAULT_SETTINGS.dateSeparator}")`).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.dateSeparator).setValue(this.plugin.settings.dateSeparator).onChange(async (value) => { + this.plugin.settings.dateSeparator = value; + await this.plugin.saveSettings(); + })); + } + createWikiLinkSettings() { + new import_obsidian2.Setting(this.containerEl).setName("Create wiki links").setDesc("Create wiki links for inserted dates").addToggle((toggle) => toggle.setValue(this.plugin.settings.createWikiLinks).onChange(async (value) => { + this.plugin.settings.createWikiLinks = value; + await this.plugin.saveSettings(); + this.display(); + })); + if (this.plugin.settings.createWikiLinks) { + this.createNonExistentFilesSettings(); + } + } + createNonExistentFilesSettings() { + new import_obsidian2.Setting(this.containerEl).setName("Create non-existent files").setDesc("What to do if a wiki linked file does not exist").addDropdown((dropdown) => dropdown.addOption("do-not-create", "Do not create").addOption("same-folder", "Create in same folder").addOption("custom-folder", "Create in custom folder").setValue(this.plugin.settings.createNonExistentFiles).onChange(async (value) => { + this.plugin.settings.createNonExistentFiles = value; + await this.plugin.saveSettings(); + this.display(); + })); + if (this.plugin.settings.createNonExistentFiles === "custom-folder") { + this.createCustomFolderPathSetting(); + } + } + createCustomFolderPathSetting() { + new import_obsidian2.Setting(this.containerEl).setName("Custom folder path").setDesc('Path to the folder where new files should be created (e.g., "Daily Notes/2025")').addText((text) => { + text.setPlaceholder("Enter folder path").setValue(this.plugin.settings.customFolderPath || "").onChange(async (value) => { + this.plugin.settings.customFolderPath = value; + await this.plugin.saveSettings(); + }); + }); + } +}; + +// src/dateRangeExpander.ts +var import_obsidian3 = require("obsidian"); +var DateRangeExpander = class { + constructor(app, settings, dateUtils) { + this.app = app; + this.settings = settings; + this.dateUtils = dateUtils; + } + wrapInCallout(dateStartAndEnd, insertedDateRange) { + const [startDateFormat, endDateFormat] = this.getFormatedStartAndEndDates(dateStartAndEnd); + return ` +> [!SUMMARY]- Date range: ${startDateFormat} to ${endDateFormat} +> ${insertedDateRange} +`; + } + expandDateRange(dateStartAndEnd) { + let totalDates = 0; + let createdFiles = 0; + let existingFiles = 0; + let customFolderExists = true; + let dates = []; + let current = new Date(dateStartAndEnd.startDate); + const customFolder = this.app.vault.getAbstractFileByPath(this.settings.customFolderPath); + if (this.settings.createNonExistentFiles === "custom-folder" && !(customFolder instanceof import_obsidian3.TFolder)) { + customFolderExists = false; + } + while (current <= dateStartAndEnd.endDate) { + let formattedDate = this.dateUtils.formatDateToString(current, this.settings.outputDateFormat, DEFAULT_SETTINGS.outputDateFormat); + if (this.settings.createWikiLinks) { + dates.push(`[[${formattedDate}]]`); + const fileCreationResult = this.createFileIfNeeded(formattedDate, customFolderExists); + if (fileCreationResult === "created") + createdFiles++; + else if (fileCreationResult === "exists") + existingFiles++; + } else { + dates.push(formattedDate); + } + totalDates++; + current.setDate(current.getDate() + 1); + } + if (createdFiles > 0 && !customFolderExists) { + new import_obsidian3.Notice(`Folder "${this.settings.customFolderPath}" does not exist. Using parent folder to current note instead.`); + } + const [startDateFormat, endDateFormat] = this.getFormatedStartAndEndDates(dateStartAndEnd); + const commonNoticeText = `Inserted ${totalDates} dates from ${startDateFormat} to ${endDateFormat}`; + if (this.settings.createNonExistentFiles !== "do-not-create") { + new import_obsidian3.Notice(`${commonNoticeText} + +\u2022 Files created: ${createdFiles} +\u2022 Files skipped: ${existingFiles}`, 8e3); + } else { + new import_obsidian3.Notice(commonNoticeText, 8e3); + } + return dates.join(this.settings.dateSeparator); + } + createFileIfNeeded(formattedDate, customFolderExists) { + const currentFile = this.app.workspace.getActiveFile(); + if (!currentFile || !currentFile.parent) { + return "failed"; + } + const fileName = `${formattedDate}.md`; + const fileExists = this.fileExistsInVault(formattedDate); + if (!fileExists) { + let filePath = ""; + switch (this.settings.createNonExistentFiles) { + case "same-folder": + const currentDir = currentFile.parent.path; + filePath = currentDir ? `${currentDir}/${fileName}` : fileName; + break; + case "custom-folder": + if (customFolderExists) { + filePath = `${this.settings.customFolderPath}/${fileName}`; + } else { + const currentDir2 = currentFile.parent.path; + filePath = currentDir2 ? `${currentDir2}/${fileName}` : fileName; + } + break; + case "do-not-create": + return "failed"; + default: + return "failed"; + } + if (filePath) { + this.app.vault.create(filePath, ""); + return "created"; + } + return "failed"; + } else { + return "exists"; + } + } + fileExistsInVault(formattedDate) { + return this.app.metadataCache.getFirstLinkpathDest(formattedDate, "") !== null; + } + getFormatedStartAndEndDates(dateStartAndEnd) { + const startDateFormat = this.dateUtils.formatDateToString(dateStartAndEnd.startDate, this.settings.friendlyDateFormat, DEFAULT_SETTINGS.friendlyDateFormat); + const endDateFormat = this.dateUtils.formatDateToString(dateStartAndEnd.endDate, this.settings.friendlyDateFormat, DEFAULT_SETTINGS.friendlyDateFormat); + return [startDateFormat, endDateFormat]; + } +}; + +// src/main.ts +var DateRangeExpanderPlugin = class extends import_obsidian4.Plugin { + async onload() { + console.log("DateRangeExpander loaded"); + await this.loadSettings(); + this.dateUtils = new DateUtils(); + this.dateRangeExpander = new DateRangeExpander(this.app, this.settings, this.dateUtils); + this.addSettingTab(new DateRangeExpanderSettingTab(this.app, this)); + this.addCommand({ + id: "insert-expanded-date-range", + name: "Insert", + checkCallback: (checking) => { + const markdownView = this.app.workspace.getActiveViewOfType(import_obsidian4.MarkdownView); + if (markdownView) { + if (!checking) { + new DateInputModal(this.app, (rangeInput) => { + const dateStartAndEnd = this.dateUtils.getStartAndEndDates(rangeInput); + if (dateStartAndEnd) { + const editor = this.getActiveEditor(); + if (editor) { + const cursor = editor.getCursor(); + let insertedDateRange = this.dateRangeExpander.expandDateRange(dateStartAndEnd) + " "; + if (rangeInput.useCallout) { + insertedDateRange = this.dateRangeExpander.wrapInCallout(dateStartAndEnd, insertedDateRange); + } + editor.replaceRange(insertedDateRange, { line: cursor.line, ch: cursor.ch }, cursor); + const endPos = { line: cursor.line, ch: cursor.ch + insertedDateRange.length }; + editor.setCursor(endPos); + } + } + }).open(); + } + return true; + } + } + }); + } + async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + } + async saveSettings() { + await this.saveData(this.settings); + } + onunload() { + console.log("DateRangeExpander unloaded"); + } + getActiveEditor() { + const activeLeaf = this.app.workspace.getActiveViewOfType(import_obsidian4.MarkdownView); + if (activeLeaf) { + return activeLeaf.editor; + } + return null; + } +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL2RhdGVJbnB1dE1vZGFsLnRzIiwgInNyYy9kYXRlVXRpbHMudHMiLCAic3JjL3R5cGVzLnRzIiwgInNyYy9zZXR0aW5nc1RhYi50cyIsICJzcmMvZGF0ZVJhbmdlRXhwYW5kZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IE1hcmtkb3duVmlldywgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBEYXRlSW5wdXRNb2RhbCB9IGZyb20gJy4vZGF0ZUlucHV0TW9kYWwnO1xyXG5pbXBvcnQgeyBERUZBVUxUX1NFVFRJTkdTLCBQbHVnaW5TZXR0aW5ncyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBEYXRlUmFuZ2VFeHBhbmRlclNldHRpbmdUYWIgfSBmcm9tICcuL3NldHRpbmdzVGFiJztcclxuaW1wb3J0IHsgRGF0ZVV0aWxzIH0gZnJvbSAnLi9kYXRlVXRpbHMnO1xyXG5pbXBvcnQgeyBEYXRlUmFuZ2VFeHBhbmRlciB9IGZyb20gJy4vZGF0ZVJhbmdlRXhwYW5kZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0ZVJhbmdlRXhwYW5kZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncztcclxuXHRkYXRlUmFuZ2VFeHBhbmRlcjogRGF0ZVJhbmdlRXhwYW5kZXI7XHJcblx0ZGF0ZVV0aWxzOiBEYXRlVXRpbHM7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGNvbnNvbGUubG9nKCdEYXRlUmFuZ2VFeHBhbmRlciBsb2FkZWQnKTtcclxuXHRcdFxyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHR0aGlzLmRhdGVVdGlscyA9IG5ldyBEYXRlVXRpbHMoKTtcclxuXHRcdHRoaXMuZGF0ZVJhbmdlRXhwYW5kZXIgPSBuZXcgRGF0ZVJhbmdlRXhwYW5kZXIodGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MsIHRoaXMuZGF0ZVV0aWxzKTtcclxuXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IERhdGVSYW5nZUV4cGFuZGVyU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAnaW5zZXJ0LWV4cGFuZGVkLWRhdGUtcmFuZ2UnLFxyXG5cdFx0XHRuYW1lOiAnSW5zZXJ0JyxcclxuXHRcdFx0Y2hlY2tDYWxsYmFjazogKGNoZWNraW5nOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgbWFya2Rvd25WaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuXHRcdFx0XHRpZiAobWFya2Rvd25WaWV3KSB7XHJcblx0XHRcdFx0XHRpZiAoIWNoZWNraW5nKSB7XHJcblx0XHRcdFx0XHRcdG5ldyBEYXRlSW5wdXRNb2RhbCh0aGlzLmFwcCwgKHJhbmdlSW5wdXQpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBkYXRlU3RhcnRBbmRFbmQgPSB0aGlzLmRhdGVVdGlscy5nZXRTdGFydEFuZEVuZERhdGVzKHJhbmdlSW5wdXQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0ZVN0YXJ0QW5kRW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBlZGl0b3IgPSB0aGlzLmdldEFjdGl2ZUVkaXRvcigpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGVkaXRvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBpbnNlcnRlZERhdGVSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlRXhwYW5kZXIuZXhwYW5kRGF0ZVJhbmdlKGRhdGVTdGFydEFuZEVuZCkgKyAnICc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChyYW5nZUlucHV0LnVzZUNhbGxvdXQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpbnNlcnRlZERhdGVSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlRXhwYW5kZXIud3JhcEluQ2FsbG91dChkYXRlU3RhcnRBbmRFbmQsIGluc2VydGVkRGF0ZVJhbmdlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKGluc2VydGVkRGF0ZVJhbmdlLCB7IGxpbmU6IGN1cnNvci5saW5lLCBjaDogY3Vyc29yLmNoIH0sIGN1cnNvcik7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBlbmRQb3MgPSB7IGxpbmU6IGN1cnNvci5saW5lLCBjaDogY3Vyc29yLmNoICsgaW5zZXJ0ZWREYXRlUmFuZ2UubGVuZ3RoIH07XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoZW5kUG9zKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0pLm9wZW4oKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkgeyB0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTsgfVxyXG5cclxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7IGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7IH1cclxuXHJcblx0b251bmxvYWQoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0RhdGVSYW5nZUV4cGFuZGVyIHVubG9hZGVkJyk7XHJcbiAgICB9XHJcblxyXG5cdGdldEFjdGl2ZUVkaXRvcigpIHtcclxuXHRcdGNvbnN0IGFjdGl2ZUxlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xyXG5cdFx0aWYgKGFjdGl2ZUxlYWYpIHtcclxuXHRcdFx0cmV0dXJuIGFjdGl2ZUxlYWYuZWRpdG9yO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG59IiwgImltcG9ydCB7IEFwcCwgTW9kYWwsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IERhdGVJbnB1dE1vZGFsUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgRGF0ZVV0aWxzIH0gZnJvbSAnLi9kYXRlVXRpbHMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIERhdGVJbnB1dE1vZGFsIGV4dGVuZHMgTW9kYWwge1xyXG4gICAgcHJpdmF0ZSBzdGFydERhdGVWYWx1ZTogc3RyaW5nID0gJyc7XHJcbiAgICBwcml2YXRlIGVuZERhdGVWYWx1ZTogc3RyaW5nID0gJyc7XHJcbiAgICBwcml2YXRlIGR1cmF0aW9uVmFsdWU6IHN0cmluZyA9ICcnO1xyXG4gICAgcHJpdmF0ZSBkdXJhdGlvblR5cGVWYWx1ZTogJ0RheXMnIHwgJ1dlZWtzJyB8ICdNb250aHMnID0gJ0RheXMnO1xyXG4gICAgcHJpdmF0ZSB1c2VDYWxsb3V0VmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSByYW5nZVR5cGVWYWx1ZTogJ0VuZERhdGUnIHwgJ0R1cmF0aW9uJyA9ICdFbmREYXRlJztcclxuXHJcbiAgICBwcml2YXRlIG9uU3VibWl0OiAoZGF0ZVJhbmdlVmFsdWVzOiBEYXRlSW5wdXRNb2RhbFJlc3BvbnNlKSA9PiB2b2lkO1xyXG4gICAgcHJpdmF0ZSBzdWJtaXRCdXR0b246IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIGVuZERhdGVJbnB1dDogSFRNTElucHV0RWxlbWVudDtcclxuICAgIHByaXZhdGUgZHVyYXRpb25JbnB1dDogSFRNTElucHV0RWxlbWVudDtcclxuICAgIHByaXZhdGUgZHVyYXRpb25UeXBlU2VsZWN0OiBIVE1MU2VsZWN0RWxlbWVudDtcclxuICAgIHByaXZhdGUgZGF0ZVV0aWxzOiBEYXRlVXRpbHM7XHJcbiAgICBwcml2YXRlIGtleWJvYXJkTGlzdGVuZXI6IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgb25TdWJtaXQ6IChkYXRlUmFuZ2VWYWx1ZXM6IERhdGVJbnB1dE1vZGFsUmVzcG9uc2UpID0+IHZvaWQpIHtcclxuICAgICAgICBzdXBlcihhcHApO1xyXG4gICAgICAgIHRoaXMub25TdWJtaXQgPSBvblN1Ym1pdDtcclxuICAgICAgICB0aGlzLmRhdGVVdGlscyA9IG5ldyBEYXRlVXRpbHMoKTtcclxuICAgICAgICB0aGlzLnNldFRpdGxlKCdFbnRlciBkYXRlIHJhbmdlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25PcGVuKCkge1xyXG4gICAgICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG4gICAgICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZFN0eWxlcygpO1xyXG4gICAgICAgIHRoaXMuc2V0dXBLZXlib2FyZExpc3RlbmVyKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdGFydERhdGVJbnB1dCgpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlUmFuZ2VPcHRpb25zKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVDYWxsb3V0VG9nZ2xlKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdWJtaXRCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsb3NlKCkge1xyXG4gICAgICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG4gICAgICAgIC8vIENsZWFuIHVwIHRoZSBrZXlib2FyZCBldmVudCBsaXN0ZW5lclxyXG4gICAgICAgIGlmICh0aGlzLmtleWJvYXJkTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgY29udGVudEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWJvYXJkTGlzdGVuZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDbGVhciB0aGUgY29udGVudFxyXG4gICAgICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdmFsaWRhdGVJbnB1dCgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzdGFydERhdGVPYmogPSB0aGlzLmRhdGVVdGlscy5wYXJzZURhdGVGcm9tU3RyaW5nKHRoaXMuc3RhcnREYXRlVmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoIXN0YXJ0RGF0ZU9iail7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJhbmdlVHlwZVZhbHVlID09PSAnRW5kRGF0ZScpIHtcclxuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZU9iaiA9IHRoaXMuZGF0ZVV0aWxzLnBhcnNlRGF0ZUZyb21TdHJpbmcodGhpcy5lbmREYXRlVmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gISFlbmREYXRlT2JqICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVVdGlscy5pc1ZhbGlkTnVtZXJpY0RhdGUodGhpcy5lbmREYXRlVmFsdWUpICYmXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlT2JqID49IHN0YXJ0RGF0ZU9iajtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kdXJhdGlvblZhbHVlICE9PSAnJyAmJlxyXG4gICAgICAgICAgICAgICAgcGFyc2VJbnQodGhpcy5kdXJhdGlvblZhbHVlKSA+IDAgJiZcclxuICAgICAgICAgICAgICAgIFsnRGF5cycsICdXZWVrcycsICdNb250aHMnXS5pbmNsdWRlcyh0aGlzLmR1cmF0aW9uVHlwZVZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVEYXRlQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLmRhdGVVdGlscy5wYXJzZURhdGVGcm9tU3RyaW5nKHRoaXMuc3RhcnREYXRlVmFsdWUpO1xyXG4gICAgICAgIGlmICghc3RhcnREYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVuZERhdGU6IERhdGU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJhbmdlVHlwZVZhbHVlID09PSAnRW5kRGF0ZScpIHtcclxuICAgICAgICAgICAgZW5kRGF0ZSA9IHRoaXMuZGF0ZVV0aWxzLnBhcnNlRGF0ZUZyb21TdHJpbmcodGhpcy5lbmREYXRlVmFsdWUpIHx8IHN0YXJ0RGF0ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBlbmREYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcclxuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSBwYXJzZUludCh0aGlzLmR1cmF0aW9uVmFsdWUpIHx8IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5kdXJhdGlvblR5cGVWYWx1ZSA9PT0gJ0RheXMnKSB7XHJcbiAgICAgICAgICAgICAgICBlbmREYXRlLnNldERhdGUoZW5kRGF0ZS5nZXREYXRlKCkgKyBkdXJhdGlvbiAtIDEpOyAvLyAtMSBiZWNhdXNlIHdlIGluY2x1ZGUgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmR1cmF0aW9uVHlwZVZhbHVlID09PSAnV2Vla3MnKSB7XHJcbiAgICAgICAgICAgICAgICBlbmREYXRlLnNldERhdGUoZW5kRGF0ZS5nZXREYXRlKCkgKyAoZHVyYXRpb24gKiA3KSAtIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHVyYXRpb25UeXBlVmFsdWUgPT09ICdNb250aHMnKSB7XHJcbiAgICAgICAgICAgICAgICBlbmREYXRlID0gdGhpcy5kYXRlVXRpbHMuYWRkTW9udGhzVG9EYXRlKHN0YXJ0RGF0ZSwgZHVyYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkYXRlQ291bnQgPSB0aGlzLmRhdGVVdGlscy5jYWxjdWxhdGVEYXlzSW5SYW5nZShzdGFydERhdGUsIGVuZERhdGUpO1xyXG4gICAgICAgIHJldHVybiBkYXRlQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRTdHlsZXMoKSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcbiAgICAgICAgc3R5bGVFbC50ZXh0Q29udGVudCA9IGBcclxuXHRcdFx0LmRhdGUtb3B0aW9uLWNvbnRhaW5lciB7XHJcblx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMTVweDtcclxuXHRcdFx0fVxyXG5cdFx0XHQuZGF0ZS1pbnB1dC1yb3cge1xyXG5cdFx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcclxuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG5cdFx0XHR9XHJcblx0XHRcdC5kYXRlLWlucHV0LXJvdyBpbnB1dFt0eXBlPVwicmFkaW9cIl0ge1xyXG5cdFx0XHRcdG1hcmdpbi1yaWdodDogOHB4O1xyXG5cdFx0XHR9XHJcblx0XHRcdC5kYXRlLWlucHV0LXJvdyBpbnB1dFt0eXBlPVwidGV4dFwiXSxcclxuXHRcdFx0LmRhdGUtaW5wdXQtcm93IGlucHV0W3R5cGU9XCJudW1iZXJcIl0ge1xyXG5cdFx0XHRcdG1hcmdpbi1sZWZ0OiA1cHg7XHJcblx0XHRcdH1cclxuXHRcdFx0LmRhdGUtaW5wdXQtcm93IHNlbGVjdCB7XHJcblx0XHRcdFx0bWFyZ2luLWxlZnQ6IDVweDtcclxuXHRcdFx0fVxyXG5cdFx0YDtcclxuXHJcbiAgICAgICAgdGhpcy5jb250ZW50RWwuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXR1cEtleWJvYXJkTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgdGhpcy5rZXlib2FyZExpc3RlbmVyID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgdGhpcy52YWxpZGF0ZUlucHV0KCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY29udGVudEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWJvYXJkTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3RhcnREYXRlSW5wdXQoKSB7XHJcbiAgICAgICAgbmV3IFNldHRpbmcodGhpcy5jb250ZW50RWwpXHJcbiAgICAgICAgICAgIC5zZXROYW1lKCdTdGFydCBkYXRlJylcclxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0LnNldFBsYWNlaG9sZGVyKCdZWVlZTU1ERCcpXHJcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMuc3RhcnREYXRlVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0ZXh0LmlucHV0RWwuc2V0QXR0cmlidXRlKCdwYXR0ZXJuJywgJ1swLTldKicpO1xyXG4gICAgICAgICAgICAgICAgdGV4dC5pbnB1dEVsLnNldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJywgJzgnKTtcclxuICAgICAgICAgICAgICAgIHRleHQuaW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlOiBJbnB1dEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gaW5wdXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKS5zbGljZSgwLCA4KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZVZhbHVlID0gaW5wdXQudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdWJtaXRCdXR0b24oKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVJhbmdlT3B0aW9ucygpIHtcclxuICAgICAgICBjb25zdCBvcHRpb25Db250YWluZXIgPSB0aGlzLmNvbnRlbnRFbC5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdkYXRlLW9wdGlvbi1jb250YWluZXInIH0pO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRW5kRGF0ZU9wdGlvbihvcHRpb25Db250YWluZXIpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRHVyYXRpb25PcHRpb24ob3B0aW9uQ29udGFpbmVyKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0U3RhdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVFbmREYXRlT3B0aW9uKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBlbmREYXRlUm93ID0gY29udGFpbmVyLmNyZWF0ZUVsKCdkaXYnLCB7IGNsczogJ2RhdGUtaW5wdXQtcm93JyB9KTtcclxuICAgICAgICBjb25zdCBlbmREYXRlTGFiZWwgPSBlbmREYXRlUm93LmNyZWF0ZUVsKCdsYWJlbCcpO1xyXG4gICAgICAgIGVuZERhdGVMYWJlbC5hcHBlbmRUZXh0KCdFbmQgZGF0ZScpO1xyXG5cclxuICAgICAgICBjb25zdCBlbmREYXRlUmFkaW8gPSBlbmREYXRlTGFiZWwuY3JlYXRlRWwoJ2lucHV0Jywge1xyXG4gICAgICAgICAgICB0eXBlOiAncmFkaW8nLFxyXG4gICAgICAgICAgICBhdHRyOiB7IG5hbWU6ICdkYXRlT3B0aW9uJyB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZW5kRGF0ZVJhZGlvLmNoZWNrZWQgPSB0aGlzLnJhbmdlVHlwZVZhbHVlID09PSAnRW5kRGF0ZSc7XHJcblxyXG4gICAgICAgIHRoaXMuZW5kRGF0ZUlucHV0ID0gZW5kRGF0ZVJvdy5jcmVhdGVFbCgnaW5wdXQnLCB7XHJcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdZWVlZTU1ERCcsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVuZERhdGVWYWx1ZSxcclxuICAgICAgICAgICAgYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgcGF0dGVybjogJ1swLTldKicsXHJcbiAgICAgICAgICAgICAgICBtYXhsZW5ndGg6ICc4J1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZW5kRGF0ZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICBpbnB1dC52YWx1ZSA9IGlucHV0LnZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJykuc2xpY2UoMCwgOCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kRGF0ZVZhbHVlID0gaW5wdXQudmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VibWl0QnV0dG9uKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGVuZERhdGVSYWRpby5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2VUeXBlVmFsdWUgPSAnRW5kRGF0ZSc7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5wdXRTdGF0ZXMoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdWJtaXRCdXR0b24oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUR1cmF0aW9uT3B0aW9uKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBkdXJhdGlvblJvdyA9IGNvbnRhaW5lci5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdkYXRlLWlucHV0LXJvdycgfSk7XHJcbiAgICAgICAgY29uc3QgZHVyYXRpb25MYWJlbCA9IGR1cmF0aW9uUm93LmNyZWF0ZUVsKCdsYWJlbCcpO1xyXG4gICAgICAgIGR1cmF0aW9uTGFiZWwuYXBwZW5kVGV4dCgnRHVyYXRpb24nKTtcclxuXHJcbiAgICAgICAgY29uc3QgZHVyYXRpb25SYWRpbyA9IGR1cmF0aW9uTGFiZWwuY3JlYXRlRWwoJ2lucHV0Jywge1xyXG4gICAgICAgICAgICB0eXBlOiAncmFkaW8nLFxyXG4gICAgICAgICAgICBhdHRyOiB7IG5hbWU6ICdkYXRlT3B0aW9uJyB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZHVyYXRpb25SYWRpby5jaGVja2VkID0gdGhpcy5yYW5nZVR5cGVWYWx1ZSA9PT0gJ0R1cmF0aW9uJztcclxuXHJcbiAgICAgICAgdGhpcy5kdXJhdGlvbklucHV0ID0gZHVyYXRpb25Sb3cuY3JlYXRlRWwoJ2lucHV0Jywge1xyXG4gICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcclxuICAgICAgICAgICAgYXR0cjogeyBcclxuICAgICAgICAgICAgICAgIG1pbjogJzEnLFxyXG4gICAgICAgICAgICAgICAgbWF4OiAnMTAwJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogJzEtMTAwJyxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZHVyYXRpb25WYWx1ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmR1cmF0aW9uVHlwZVNlbGVjdCA9IGR1cmF0aW9uUm93LmNyZWF0ZUVsKCdzZWxlY3QnKTtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlRHVyYXRpb25UeXBlcygpO1xyXG5cclxuICAgICAgICBkdXJhdGlvblJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yYW5nZVR5cGVWYWx1ZSA9ICdEdXJhdGlvbic7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5wdXRTdGF0ZXMoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdWJtaXRCdXR0b24oKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kdXJhdGlvbklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUludChpbnB1dC52YWx1ZSk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSAxMDA7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcxMDAnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZHVyYXRpb25WYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VibWl0QnV0dG9uKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZHVyYXRpb25UeXBlU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZHVyYXRpb25UeXBlVmFsdWUgPSAoZS50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlIGFzICdEYXlzJyB8ICdXZWVrcycgfCAnTW9udGhzJztcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdWJtaXRCdXR0b24oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBvcHVsYXRlRHVyYXRpb25UeXBlcygpIHtcclxuICAgICAgICBbJ0RheXMnLCAnV2Vla3MnLCAnTW9udGhzJ10uZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5kdXJhdGlvblR5cGVTZWxlY3QuY3JlYXRlRWwoJ29wdGlvbicsIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogdHlwZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHlwZSA9PT0gdGhpcy5kdXJhdGlvblR5cGVWYWx1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUlucHV0U3RhdGVzKCkge1xyXG4gICAgICAgIGNvbnN0IGlzRW5kRGF0ZU1vZGUgPSB0aGlzLnJhbmdlVHlwZVZhbHVlID09PSAnRW5kRGF0ZSc7XHJcbiAgICAgICAgdGhpcy5lbmREYXRlSW5wdXQuZGlzYWJsZWQgPSAhaXNFbmREYXRlTW9kZTtcclxuICAgICAgICB0aGlzLmR1cmF0aW9uSW5wdXQuZGlzYWJsZWQgPSBpc0VuZERhdGVNb2RlO1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb25UeXBlU2VsZWN0LmRpc2FibGVkID0gaXNFbmREYXRlTW9kZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNhbGxvdXRUb2dnbGUoKSB7XHJcbiAgICAgICAgbmV3IFNldHRpbmcodGhpcy5jb250ZW50RWwpXHJcbiAgICAgICAgICAgIC5zZXROYW1lKCdBZGQgdG8gY2FsbG91dCcpXHJcbiAgICAgICAgICAgIC5zZXREZXNjKCdJbnNlcnQgZGF0ZXMgaW5zaWRlIGEgY29sbGFwc2VkIGNhbGxvdXQnKVxyXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGVcclxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnVzZUNhbGxvdXRWYWx1ZSlcclxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VDYWxsb3V0VmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdWJtaXRCdXR0b24oKSB7XHJcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24gPSBuZXcgU2V0dGluZyh0aGlzLmNvbnRlbnRFbClcclxuICAgICAgICAgICAgLmFkZEJ1dHRvbihidG4gPT4gYnRuXHJcbiAgICAgICAgICAgICAgICAuc2V0QnV0dG9uVGV4dCgnSW5zZXJ0JylcclxuICAgICAgICAgICAgICAgIC5zZXRDdGEoKVxyXG4gICAgICAgICAgICAgICAgLm9uQ2xpY2soKCkgPT4gdGhpcy5zdWJtaXQoKSlcclxuICAgICAgICAgICAgKS5zZXR0aW5nRWwucXVlcnlTZWxlY3RvcignYnV0dG9uJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnN1Ym1pdEJ1dHRvbikge1xyXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlU3VibWl0QnV0dG9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnN1Ym1pdEJ1dHRvbikge1xyXG4gICAgICAgICAgICBjb25zdCB2YWxpZElucHV0ID0gdGhpcy52YWxpZGF0ZUlucHV0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLmRpc2FibGVkID0gIXZhbGlkSW5wdXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodmFsaWRJbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZUNvdW50ID0gdGhpcy5jYWxjdWxhdGVEYXRlQ291bnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnRleHRDb250ZW50ID0gYEluc2VydCAke2RhdGVDb3VudH0gRGF0ZSR7ZGF0ZUNvdW50ICE9PSAxID8gJ3MnIDogJyd9YDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnRleHRDb250ZW50ID0gJ0luc2VydCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdWJtaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlSW5wdXQoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdGFydERhdGVPYmogPSB0aGlzLmRhdGVVdGlscy5wYXJzZURhdGVGcm9tU3RyaW5nKHRoaXMuc3RhcnREYXRlVmFsdWUpO1xyXG4gICAgICAgIGlmICghc3RhcnREYXRlT2JqKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZVZhbHVlczogRGF0ZUlucHV0TW9kYWxSZXNwb25zZSA9IHtcclxuICAgICAgICAgICAgc3RhcnREYXRlOiBzdGFydERhdGVPYmosXHJcbiAgICAgICAgICAgIHJhbmdlVHlwZTogdGhpcy5yYW5nZVR5cGVWYWx1ZSxcclxuICAgICAgICAgICAgdXNlQ2FsbG91dDogdGhpcy51c2VDYWxsb3V0VmFsdWVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yYW5nZVR5cGVWYWx1ZSA9PT0gJ0VuZERhdGUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZERhdGVPYmogPSB0aGlzLmRhdGVVdGlscy5wYXJzZURhdGVGcm9tU3RyaW5nKHRoaXMuZW5kRGF0ZVZhbHVlKTtcclxuICAgICAgICAgICAgaWYgKGVuZERhdGVPYmopXHJcbiAgICAgICAgICAgICAgICBkYXRlUmFuZ2VWYWx1ZXMuZW5kRGF0ZSA9IGVuZERhdGVPYmo7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0ZVJhbmdlVmFsdWVzLmR1cmF0aW9uID0gcGFyc2VJbnQodGhpcy5kdXJhdGlvblZhbHVlKTtcclxuICAgICAgICAgICAgZGF0ZVJhbmdlVmFsdWVzLmR1cmF0aW9uVW5pdCA9IHRoaXMuZHVyYXRpb25UeXBlVmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNsb3NlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB7XHJcbiAgICAgICAgICAgIHRoaXMub25TdWJtaXQoZGF0ZVJhbmdlVmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCAiaW1wb3J0IHsgRGF0ZUlucHV0TW9kYWxSZXNwb25zZSwgRGF0ZVJhbmdlIH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZVV0aWxzIHtcclxuICAgIGdldFN0YXJ0QW5kRW5kRGF0ZXMobW9kYWxSZXNwb25zZTogRGF0ZUlucHV0TW9kYWxSZXNwb25zZSk6IERhdGVSYW5nZSB8IG51bGwge1xyXG4gICAgICAgIGxldCBzdGFydERhdGU6IERhdGUgPSBtb2RhbFJlc3BvbnNlLnN0YXJ0RGF0ZTtcclxuICAgICAgICBsZXQgZW5kRGF0ZTogRGF0ZTtcclxuXHJcbiAgICAgICAgaWYgKG1vZGFsUmVzcG9uc2UucmFuZ2VUeXBlID09PSAnRW5kRGF0ZScpIHtcclxuICAgICAgICAgICAgZW5kRGF0ZSA9IG1vZGFsUmVzcG9uc2UuZW5kRGF0ZSE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gbW9kYWxSZXNwb25zZS5kdXJhdGlvbiE7XHJcbiAgICAgICAgICAgIGNvbnN0IHVuaXQgPSBtb2RhbFJlc3BvbnNlLmR1cmF0aW9uVW5pdCE7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0RheXMnOlxyXG4gICAgICAgICAgICAgICAgICAgIGVuZERhdGUuc2V0RGF0ZShzdGFydERhdGUuZ2V0RGF0ZSgpICsgZHVyYXRpb24gLSAxKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1dlZWtzJzpcclxuICAgICAgICAgICAgICAgICAgICBlbmREYXRlLnNldERhdGUoc3RhcnREYXRlLmdldERhdGUoKSArIChkdXJhdGlvbiAqIDcpIC0gMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdNb250aHMnOlxyXG4gICAgICAgICAgICAgICAgICAgIGVuZERhdGUgPSB0aGlzLmFkZE1vbnRoc1RvRGF0ZShzdGFydERhdGUsIGR1cmF0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN0YXJ0RGF0ZSA+IGVuZERhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkYXRlU3RhcnRBbmRFbmQ6IERhdGVSYW5nZSA9IHtcclxuICAgICAgICAgICAgc3RhcnREYXRlOiBzdGFydERhdGUsXHJcbiAgICAgICAgICAgIGVuZERhdGU6IGVuZERhdGVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0ZVN0YXJ0QW5kRW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFzc3VtaW5nIHN0cmluZyBkYXRlIGlzIGluIGZvcm1hdDogWVlZWU1NRERcclxuICAgIHBhcnNlRGF0ZUZyb21TdHJpbmcoZGF0ZVN0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkTnVtZXJpY0RhdGUoZGF0ZVN0cmluZykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQoZGF0ZVN0cmluZy5zdWJzdHJpbmcoMCwgNCkpO1xyXG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZGF0ZVN0cmluZy5zdWJzdHJpbmcoNCwgNikpIC0gMTtcclxuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChkYXRlU3RyaW5nLnN1YnN0cmluZyg2LCA4KSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5KSk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJucyB0cnVlIGlmIHN0cmluZyBkYXRlIGlzIGluIGZvcm1hdDogWVlZWU1NRERcclxuICAgIGlzVmFsaWROdW1lcmljRGF0ZShkYXRlU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIS9eXFxkezh9JC8udGVzdChkYXRlU3RyaW5nKSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQoZGF0ZVN0cmluZy5zdWJzdHJpbmcoMCwgNCkpO1xyXG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZGF0ZVN0cmluZy5zdWJzdHJpbmcoNCwgNikpIC0gMTsgLy8gSmF2YVNjcmlwdCBtb250aHMgYXJlIDAtaW5kZXhlZFxyXG4gICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KGRhdGVTdHJpbmcuc3Vic3RyaW5nKDYsIDgpKTtcclxuXHJcbiAgICAgICAgLy8gQWRkaXRpb25hbCB2YWxpZGF0aW9uXHJcbiAgICAgICAgaWYgKHllYXIgPCAxOTAwKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKG1vbnRoIDwgMCB8fCBtb250aCA+IDExKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKGRheSA8IDEgfHwgZGF5ID4gMzEpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgZGF0ZU9iaiA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0ZU9iai5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmXHJcbiAgICAgICAgICAgIGRhdGVPYmouZ2V0TW9udGgoKSA9PT0gbW9udGggJiZcclxuICAgICAgICAgICAgZGF0ZU9iai5nZXREYXRlKCkgPT09IGRheTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtYXREYXRlVG9TdHJpbmcoZGF0ZTogRGF0ZSwgc2V0dGluZ3NGb3JtYXQ6IHN0cmluZywgZGVmYXVsdEZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xyXG4gICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IHdlZWtkYXkgPSBkYXRlLmdldERheSgpO1xyXG5cclxuICAgICAgICBjb25zdCBkYXlOYW1lcyA9IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXTtcclxuICAgICAgICBjb25zdCBtb250aE5hbWVzID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XHJcblxyXG4gICAgICAgIGNvbnN0IGRheUFiYnJldmlhdGlvbnMgPSBkYXlOYW1lcy5tYXAoZGF5ID0+IGRheS5zbGljZSgwLCAzKSk7XHJcbiAgICAgICAgY29uc3QgbW9udGhBYmJyZXZpYXRpb25zID0gbW9udGhOYW1lcy5tYXAobW9udGggPT4gbW9udGguc2xpY2UoMCwgMykpO1xyXG5cclxuICAgICAgICBjb25zdCBmb3JtYXREYXRlID0gKGZvcm1hdDogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9ZWVlZfFlZWXxZWXxZfE1NTU18TU1NfE1NfE18RERERHxERER8RER8RC9nLCAobWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdZWVlZJzogcmV0dXJuIHllYXIudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdZWVknOiByZXR1cm4geWVhci50b1N0cmluZygpLnNsaWNlKC0zKTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdZWSc6IHJldHVybiB5ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1knOiByZXR1cm4geWVhci50b1N0cmluZygpLnNsaWNlKC0xKTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdNTU1NJzogcmV0dXJuIG1vbnRoTmFtZXNbbW9udGhdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ01NTSc6IHJldHVybiBtb250aEFiYnJldmlhdGlvbnNbbW9udGhdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ01NJzogcmV0dXJuIChtb250aCArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzogcmV0dXJuIChtb250aCArIDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRERERCc6IHJldHVybiBkYXlOYW1lc1t3ZWVrZGF5XTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdEREQnOiByZXR1cm4gZGF5QWJicmV2aWF0aW9uc1t3ZWVrZGF5XTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdERCc6IHJldHVybiBkYXkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOiByZXR1cm4gZGF5LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG1hdGNoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZShzZXR0aW5nc0Zvcm1hdCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGVmYXVsdCBmb3JtYXQgaWYgYW55dGhpbmcgZ29lcyB3cm9uZ1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZShkZWZhdWx0Rm9ybWF0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkTW9udGhzVG9EYXRlKGRhdGU6IERhdGUsIG1vbnRoczogbnVtYmVyKTogRGF0ZSB7XHJcbiAgICAgICAgaWYgKG1vbnRocyA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICB9ICAgXHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudERheSA9IGRhdGUuZ2V0RGF0ZSgpO1xyXG5cclxuICAgICAgICBuZXdEYXRlLnNldE1vbnRoKG5ld0RhdGUuZ2V0TW9udGgoKSArIG1vbnRocyk7XHJcbiAgICAgICAgbmV3RGF0ZS5zZXREYXRlKG5ld0RhdGUuZ2V0RGF0ZSgpIC0gMSk7XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBkYXkgY2hhbmdlZCAod2hpY2ggbWVhbnMgd2Ugd2VudCBpbnRvIHRoZSBuZXh0IG1vbnRoKVxyXG4gICAgICAgIGlmIChuZXdEYXRlLmdldE1vbnRoKCkgIT09IGRhdGUuZ2V0TW9udGgoKSAmJiBuZXdEYXRlLmdldERhdGUoKSAhPT0gKGN1cnJlbnREYXkgLSAxKSkge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgZGF5IGNoYW5nZWQsIGl0IG1lYW5zIHdlIGxhbmRlZCBvbiB0aGUgd3JvbmcgZGF5XHJcbiAgICAgICAgICAgIC8vIFNldCB0byB0aGUgbGFzdCBkYXkgb2YgdGhlIHByZXZpb3VzIG1vbnRoXHJcbiAgICAgICAgICAgIG5ld0RhdGUuc2V0RGF0ZSgwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXdEYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbGN1bGF0ZURheXNJblJhbmdlKHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzSW5EYXkgPSAxMDAwICogNjAgKiA2MCAqIDI0O1xyXG5cclxuICAgICAgICBjb25zdCBkaWZmZXJlbmNlTWlsbGlzZWNvbmRzID0gZW5kRGF0ZS5nZXRUaW1lKCkgLSBzdGFydERhdGUuZ2V0VGltZSgpO1xyXG4gICAgICAgIGNvbnN0IGRpZmZlcmVuY2VEYXlzID0gTWF0aC5mbG9vcihkaWZmZXJlbmNlTWlsbGlzZWNvbmRzIC8gbWlsbGlzZWNvbmRzSW5EYXkpICsgMTsgLy8gKzEgdG8gaW5jbHVkZSBib3RoIHN0YXJ0IGFuZCBlbmQgZGF0ZXNcclxuXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGRpZmZlcmVuY2VEYXlzKTtcclxuICAgIH1cclxufSIsICJleHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzIHtcbiAgICBvdXRwdXREYXRlRm9ybWF0OiBzdHJpbmc7XG4gICAgZnJpZW5kbHlEYXRlRm9ybWF0OiBzdHJpbmc7XG4gICAgZGF0ZVNlcGFyYXRvcjogc3RyaW5nO1xuICAgIGNyZWF0ZVdpa2lMaW5rczogYm9vbGVhbjtcbiAgICBjcmVhdGVOb25FeGlzdGVudEZpbGVzOiAnZG8tbm90LWNyZWF0ZScgfCAnc2FtZS1mb2xkZXInIHwgJ2N1c3RvbS1mb2xkZXInO1xuICAgIGN1c3RvbUZvbGRlclBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFBsdWdpblNldHRpbmdzID0ge1xuICAgIG91dHB1dERhdGVGb3JtYXQ6ICdZWVlZLk1NLkREJyxcbiAgICBmcmllbmRseURhdGVGb3JtYXQ6ICdEREQgRCBNTU0gWVlZWScsXG4gICAgZGF0ZVNlcGFyYXRvcjogJywgJyxcbiAgICBjcmVhdGVXaWtpTGlua3M6IHRydWUsXG4gICAgY3JlYXRlTm9uRXhpc3RlbnRGaWxlczogJ3NhbWUtZm9sZGVyJyxcbiAgICBjdXN0b21Gb2xkZXJQYXRoOiAnJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVSYW5nZSB7XG4gICAgc3RhcnREYXRlOiBEYXRlO1xuICAgIGVuZERhdGU6IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZUlucHV0TW9kYWxSZXNwb25zZSB7XG4gICAgc3RhcnREYXRlOiBEYXRlO1xuICAgIHJhbmdlVHlwZTogJ0VuZERhdGUnIHwgJ0R1cmF0aW9uJztcbiAgICBlbmREYXRlPzogRGF0ZTtcbiAgICBkdXJhdGlvbj86IG51bWJlcjtcbiAgICBkdXJhdGlvblVuaXQ/OiAnRGF5cycgfCAnV2Vla3MnIHwgJ01vbnRocyc7XG4gICAgdXNlQ2FsbG91dDogYm9vbGVhbjtcbn0iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgRGF0ZVJhbmdlRXhwYW5kZXJQbHVnaW4gZnJvbSAnLi9tYWluJztcclxuaW1wb3J0IHsgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIERhdGVSYW5nZUV4cGFuZGVyU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG4gICAgcGx1Z2luOiBEYXRlUmFuZ2VFeHBhbmRlclBsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBEYXRlUmFuZ2VFeHBhbmRlclBsdWdpbikge1xyXG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIH1cclxuXHJcbiAgICBkaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcbiAgICAgICAgY29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVEYXRlRm9ybWF0U2V0dGluZ3MoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZVdpa2lMaW5rU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZURhdGVGb3JtYXRTZXR0aW5ncygpIHtcclxuICAgICAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxyXG4gICAgICAgICAgICAuc2V0TmFtZSgnT3V0cHV0IGRhdGUgZm9ybWF0JylcclxuICAgICAgICAgICAgLnNldERlc2MoYEZvcm1hdCBmb3Igb3V0cHV0IGRhdGVzIChlLmcuLCAke0RFRkFVTFRfU0VUVElOR1Mub3V0cHV0RGF0ZUZvcm1hdH0pYClcclxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB0ZXh0XHJcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoREVGQVVMVF9TRVRUSU5HUy5vdXRwdXREYXRlRm9ybWF0KVxyXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm91dHB1dERhdGVGb3JtYXQpXHJcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Mub3V0cHV0RGF0ZUZvcm1hdCA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxyXG4gICAgICAgICAgICAuc2V0TmFtZSgnRnJpZW5kbHkgZGF0ZSBmb3JtYXQnKVxyXG4gICAgICAgICAgICAuc2V0RGVzYyhgRm9ybWF0IGZvciBmcmllbmRseSBkYXRlIGRpc3BsYXkgKGUuZy4sICR7REVGQVVMVF9TRVRUSU5HUy5mcmllbmRseURhdGVGb3JtYXR9KS4gU3VwcG9ydHMgRCwgREQsIERERCwgRERERCwgTSwgTU0sIE1NTSwgTU1NTSwgWSwgWVksIFlZWSwgWVlZWU0uYClcclxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB0ZXh0XHJcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoREVGQVVMVF9TRVRUSU5HUy5mcmllbmRseURhdGVGb3JtYXQpXHJcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZnJpZW5kbHlEYXRlRm9ybWF0KVxyXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZyaWVuZGx5RGF0ZUZvcm1hdCA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxyXG4gICAgICAgICAgICAuc2V0TmFtZSgnRGF0ZSBzZXBhcmF0b3InKVxyXG4gICAgICAgICAgICAuc2V0RGVzYyhgU2VwYXJhdG9yIGJldHdlZW4gZGF0ZXMgKGUuZy4sIFwiJHtERUZBVUxUX1NFVFRJTkdTLmRhdGVTZXBhcmF0b3J9XCIpYClcclxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB0ZXh0XHJcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoREVGQVVMVF9TRVRUSU5HUy5kYXRlU2VwYXJhdG9yKVxyXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRhdGVTZXBhcmF0b3IpXHJcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGF0ZVNlcGFyYXRvciA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlV2lraUxpbmtTZXR0aW5ncygpIHtcclxuICAgICAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxyXG4gICAgICAgICAgICAuc2V0TmFtZSgnQ3JlYXRlIHdpa2kgbGlua3MnKVxyXG4gICAgICAgICAgICAuc2V0RGVzYygnQ3JlYXRlIHdpa2kgbGlua3MgZm9yIGluc2VydGVkIGRhdGVzJylcclxuICAgICAgICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT4gdG9nZ2xlXHJcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuY3JlYXRlV2lraUxpbmtzKVxyXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNyZWF0ZVdpa2lMaW5rcyA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuY3JlYXRlV2lraUxpbmtzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTm9uRXhpc3RlbnRGaWxlc1NldHRpbmdzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlTm9uRXhpc3RlbnRGaWxlc1NldHRpbmdzKCkge1xyXG4gICAgICAgIG5ldyBTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwpXHJcbiAgICAgICAgICAgIC5zZXROYW1lKCdDcmVhdGUgbm9uLWV4aXN0ZW50IGZpbGVzJylcclxuICAgICAgICAgICAgLnNldERlc2MoJ1doYXQgdG8gZG8gaWYgYSB3aWtpIGxpbmtlZCBmaWxlIGRvZXMgbm90IGV4aXN0JylcclxuICAgICAgICAgICAgLmFkZERyb3Bkb3duKGRyb3Bkb3duID0+IGRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAuYWRkT3B0aW9uKCdkby1ub3QtY3JlYXRlJywgJ0RvIG5vdCBjcmVhdGUnKVxyXG4gICAgICAgICAgICAgICAgLmFkZE9wdGlvbignc2FtZS1mb2xkZXInLCAnQ3JlYXRlIGluIHNhbWUgZm9sZGVyJylcclxuICAgICAgICAgICAgICAgIC5hZGRPcHRpb24oJ2N1c3RvbS1mb2xkZXInLCAnQ3JlYXRlIGluIGN1c3RvbSBmb2xkZXInKVxyXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmNyZWF0ZU5vbkV4aXN0ZW50RmlsZXMpXHJcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiAnZG8tbm90LWNyZWF0ZScgfCAnc2FtZS1mb2xkZXInIHwgJ2N1c3RvbS1mb2xkZXInKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuY3JlYXRlTm9uRXhpc3RlbnRGaWxlcyA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuY3JlYXRlTm9uRXhpc3RlbnRGaWxlcyA9PT0gJ2N1c3RvbS1mb2xkZXInKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ3VzdG9tRm9sZGVyUGF0aFNldHRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVDdXN0b21Gb2xkZXJQYXRoU2V0dGluZygpIHtcclxuICAgICAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxyXG4gICAgICAgICAgICAuc2V0TmFtZSgnQ3VzdG9tIGZvbGRlciBwYXRoJylcclxuICAgICAgICAgICAgLnNldERlc2MoJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSBuZXcgZmlsZXMgc2hvdWxkIGJlIGNyZWF0ZWQgKGUuZy4sIFwiRGFpbHkgTm90ZXMvMjAyNVwiKScpXHJcbiAgICAgICAgICAgIC5hZGRUZXh0KHRleHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGV4dC5zZXRQbGFjZWhvbGRlcignRW50ZXIgZm9sZGVyIHBhdGgnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoIHx8ICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuY3VzdG9tRm9sZGVyUGF0aCA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCAiaW1wb3J0IHsgQXBwLCBOb3RpY2UsIFRGb2xkZXIgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IFBsdWdpblNldHRpbmdzLCBEYXRlUmFuZ2UsIERFRkFVTFRfU0VUVElOR1MgfSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgRGF0ZVV0aWxzIH0gZnJvbSAnLi9kYXRlVXRpbHMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIERhdGVSYW5nZUV4cGFuZGVyIHtcclxuICAgIGFwcDogQXBwO1xyXG4gICAgc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzO1xyXG4gICAgZGF0ZVV0aWxzOiBEYXRlVXRpbHM7XHJcblxyXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncywgZGF0ZVV0aWxzOiBEYXRlVXRpbHMpIHtcclxuICAgICAgICB0aGlzLmFwcCA9IGFwcDtcclxuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XHJcbiAgICAgICAgdGhpcy5kYXRlVXRpbHMgPSBkYXRlVXRpbHM7XHJcbiAgICB9XHJcblxyXG4gICAgd3JhcEluQ2FsbG91dChkYXRlU3RhcnRBbmRFbmQ6IERhdGVSYW5nZSwgaW5zZXJ0ZWREYXRlUmFuZ2U6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgW3N0YXJ0RGF0ZUZvcm1hdCwgZW5kRGF0ZUZvcm1hdF0gPSB0aGlzLmdldEZvcm1hdGVkU3RhcnRBbmRFbmREYXRlcyhkYXRlU3RhcnRBbmRFbmQpO1xyXG4gICAgICAgIHJldHVybiBgXFxuPiBbIVNVTU1BUlldLSBEYXRlIHJhbmdlOiAke3N0YXJ0RGF0ZUZvcm1hdH0gdG8gJHtlbmREYXRlRm9ybWF0fVxcbj4gJHtpbnNlcnRlZERhdGVSYW5nZX1cXG5gO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cGFuZERhdGVSYW5nZShkYXRlU3RhcnRBbmRFbmQ6IERhdGVSYW5nZSk6IHN0cmluZyB8IG51bGx7XHJcbiAgICAgICAgbGV0IHRvdGFsRGF0ZXMgPSAwO1xyXG4gICAgICAgIGxldCBjcmVhdGVkRmlsZXMgPSAwO1xyXG4gICAgICAgIGxldCBleGlzdGluZ0ZpbGVzID0gMDtcclxuICAgICAgICBsZXQgY3VzdG9tRm9sZGVyRXhpc3RzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGVzID0gW107XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBuZXcgRGF0ZShkYXRlU3RhcnRBbmRFbmQuc3RhcnREYXRlKTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRm9sZGVyID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRoaXMuc2V0dGluZ3MuY3VzdG9tRm9sZGVyUGF0aCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuY3JlYXRlTm9uRXhpc3RlbnRGaWxlcyA9PT0gJ2N1c3RvbS1mb2xkZXInICYmICEoY3VzdG9tRm9sZGVyIGluc3RhbmNlb2YgVEZvbGRlcikpIHtcclxuICAgICAgICAgICAgY3VzdG9tRm9sZGVyRXhpc3RzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudCA8PSBkYXRlU3RhcnRBbmRFbmQuZW5kRGF0ZSkge1xyXG4gICAgICAgICAgICBsZXQgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuZGF0ZVV0aWxzLmZvcm1hdERhdGVUb1N0cmluZyhjdXJyZW50LCB0aGlzLnNldHRpbmdzLm91dHB1dERhdGVGb3JtYXQsIERFRkFVTFRfU0VUVElOR1Mub3V0cHV0RGF0ZUZvcm1hdCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5jcmVhdGVXaWtpTGlua3MpIHtcclxuICAgICAgICAgICAgICAgIGRhdGVzLnB1c2goYFtbJHtmb3JtYXR0ZWREYXRlfV1dYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZUNyZWF0aW9uUmVzdWx0ID0gdGhpcy5jcmVhdGVGaWxlSWZOZWVkZWQoZm9ybWF0dGVkRGF0ZSwgY3VzdG9tRm9sZGVyRXhpc3RzKTtcclxuICAgICAgICAgICAgICAgIGlmIChmaWxlQ3JlYXRpb25SZXN1bHQgPT09ICdjcmVhdGVkJylcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRmlsZXMrKztcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpbGVDcmVhdGlvblJlc3VsdCA9PT0gJ2V4aXN0cycpXHJcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdGaWxlcysrO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGF0ZXMucHVzaChmb3JtYXR0ZWREYXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0b3RhbERhdGVzKys7XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50LnNldERhdGUoY3VycmVudC5nZXREYXRlKCkgKyAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjcmVhdGVkRmlsZXMgPiAwICYmICFjdXN0b21Gb2xkZXJFeGlzdHMpIHtcclxuICAgICAgICAgICAgbmV3IE5vdGljZShgRm9sZGVyIFwiJHt0aGlzLnNldHRpbmdzLmN1c3RvbUZvbGRlclBhdGh9XCIgZG9lcyBub3QgZXhpc3QuIFVzaW5nIHBhcmVudCBmb2xkZXIgdG8gY3VycmVudCBub3RlIGluc3RlYWQuYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBbc3RhcnREYXRlRm9ybWF0LCBlbmREYXRlRm9ybWF0XSA9IHRoaXMuZ2V0Rm9ybWF0ZWRTdGFydEFuZEVuZERhdGVzKGRhdGVTdGFydEFuZEVuZCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbW1vbk5vdGljZVRleHQgPSBgSW5zZXJ0ZWQgJHt0b3RhbERhdGVzfSBkYXRlcyBmcm9tICR7c3RhcnREYXRlRm9ybWF0fSB0byAke2VuZERhdGVGb3JtYXR9YDtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5jcmVhdGVOb25FeGlzdGVudEZpbGVzICE9PSAnZG8tbm90LWNyZWF0ZScpIHtcclxuICAgICAgICAgICAgbmV3IE5vdGljZShgJHtjb21tb25Ob3RpY2VUZXh0fVxcblxcblx1MjAyMiBGaWxlcyBjcmVhdGVkOiAke2NyZWF0ZWRGaWxlc31cXG5cdTIwMjIgRmlsZXMgc2tpcHBlZDogJHtleGlzdGluZ0ZpbGVzfWAsIDgwMDApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5ldyBOb3RpY2UoY29tbW9uTm90aWNlVGV4dCwgODAwMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0ZXMuam9pbih0aGlzLnNldHRpbmdzLmRhdGVTZXBhcmF0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUZpbGVJZk5lZWRlZChmb3JtYXR0ZWREYXRlOiBzdHJpbmcsIGN1c3RvbUZvbGRlckV4aXN0czogYm9vbGVhbik6ICdjcmVhdGVkJyB8ICdleGlzdHMnIHwgJ2ZhaWxlZCcge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcclxuICAgICAgICBpZiAoIWN1cnJlbnRGaWxlIHx8ICFjdXJyZW50RmlsZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgJHtmb3JtYXR0ZWREYXRlfS5tZGA7XHJcbiAgICAgICAgY29uc3QgZmlsZUV4aXN0cyA9IHRoaXMuZmlsZUV4aXN0c0luVmF1bHQoZm9ybWF0dGVkRGF0ZSk7XHJcblxyXG4gICAgICAgIGlmICghZmlsZUV4aXN0cykge1xyXG4gICAgICAgICAgICBsZXQgZmlsZVBhdGggPSAnJztcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zZXR0aW5ncy5jcmVhdGVOb25FeGlzdGVudEZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdzYW1lLWZvbGRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudERpciA9IGN1cnJlbnRGaWxlLnBhcmVudC5wYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gY3VycmVudERpciA/IGAke2N1cnJlbnREaXJ9LyR7ZmlsZU5hbWV9YCA6IGZpbGVOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnY3VzdG9tLWZvbGRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbUZvbGRlckV4aXN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IGAke3RoaXMuc2V0dGluZ3MuY3VzdG9tRm9sZGVyUGF0aH0vJHtmaWxlTmFtZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHNhbWUgZm9sZGVyIGlmIGN1c3RvbSBwYXRoIGlzIGVtcHR5IG9yIG5vdCBmb3VuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RGlyID0gY3VycmVudEZpbGUucGFyZW50LnBhdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gY3VycmVudERpciA/IGAke2N1cnJlbnREaXJ9LyR7ZmlsZU5hbWV9YCA6IGZpbGVOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2RvLW5vdC1jcmVhdGUnOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbGVkJztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZmlsZVBhdGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwLnZhdWx0LmNyZWF0ZShmaWxlUGF0aCwgXCJcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NyZWF0ZWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnZmFpbGVkJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2V4aXN0cyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZpbGVFeGlzdHNJblZhdWx0KGZvcm1hdHRlZERhdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGZvcm1hdHRlZERhdGUsICcnKSAhPT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEZvcm1hdGVkU3RhcnRBbmRFbmREYXRlcyhkYXRlU3RhcnRBbmRFbmQ6IERhdGVSYW5nZSk6IFtzdHJpbmcsIHN0cmluZ10ge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZUZvcm1hdCA9IHRoaXMuZGF0ZVV0aWxzLmZvcm1hdERhdGVUb1N0cmluZyhkYXRlU3RhcnRBbmRFbmQuc3RhcnREYXRlLCB0aGlzLnNldHRpbmdzLmZyaWVuZGx5RGF0ZUZvcm1hdCwgREVGQVVMVF9TRVRUSU5HUy5mcmllbmRseURhdGVGb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IGVuZERhdGVGb3JtYXQgPSB0aGlzLmRhdGVVdGlscy5mb3JtYXREYXRlVG9TdHJpbmcoZGF0ZVN0YXJ0QW5kRW5kLmVuZERhdGUsIHRoaXMuc2V0dGluZ3MuZnJpZW5kbHlEYXRlRm9ybWF0LCBERUZBVUxUX1NFVFRJTkdTLmZyaWVuZGx5RGF0ZUZvcm1hdCk7XHJcblxyXG4gICAgICAgIHJldHVybiBbc3RhcnREYXRlRm9ybWF0LCBlbmREYXRlRm9ybWF0XTtcclxuICAgIH1cclxufSJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQSxtQkFBcUM7OztBQ0FyQyxzQkFBb0M7OztBQ0U3QixJQUFNLFlBQU4sTUFBZ0I7QUFBQSxFQUNuQixvQkFBb0IsZUFBeUQ7QUFDekUsUUFBSSxZQUFrQixjQUFjO0FBQ3BDLFFBQUk7QUFFSixRQUFJLGNBQWMsY0FBYyxXQUFXO0FBQ3ZDLGdCQUFVLGNBQWM7QUFBQSxJQUM1QixPQUFPO0FBQ0gsZ0JBQVUsSUFBSSxLQUFLLFNBQVM7QUFDNUIsWUFBTSxXQUFXLGNBQWM7QUFDL0IsWUFBTSxPQUFPLGNBQWM7QUFFM0IsY0FBUSxNQUFNO0FBQUEsUUFDVixLQUFLO0FBQ0Qsa0JBQVEsUUFBUSxVQUFVLFFBQVEsSUFBSSxXQUFXLENBQUM7QUFDbEQ7QUFBQSxRQUNKLEtBQUs7QUFDRCxrQkFBUSxRQUFRLFVBQVUsUUFBUSxJQUFLLFdBQVcsSUFBSyxDQUFDO0FBQ3hEO0FBQUEsUUFDSixLQUFLO0FBQ0Qsb0JBQVUsS0FBSyxnQkFBZ0IsV0FBVyxRQUFRO0FBQ2xEO0FBQUEsTUFDUjtBQUFBLElBQ0o7QUFFQSxRQUFJLFlBQVksU0FBUztBQUNyQixhQUFPO0FBQUEsSUFDWDtBQUVBLFVBQU0sa0JBQTZCO0FBQUEsTUFDL0I7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQSxFQUdBLG9CQUFvQixZQUFpQztBQUNqRCxRQUFJLENBQUMsS0FBSyxtQkFBbUIsVUFBVSxHQUFHO0FBQ3RDLGFBQU87QUFBQSxJQUNY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 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..9a76f72 --- /dev/null +++ b/manifest.json @@ -0,0 +1,14 @@ +{ + "id": "date-range-expander", + "name": "Date Range Expander", + "version": "0.9.0", + "minAppVersion": "1.5.8", + "description": "Quickly add a range of day references given a date duration.", + "author": "Mil", + "authorUrl": "https://github.com/mildeveloper", + "fundingUrl": { + "Ko-fi": "https://ko-fi.com/mildeveloper", + "Buy Me a Coffee": "https://buymeacoffee.com/mildeveloper" + }, + "isDesktopOnly": false +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a0996c7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5772 @@ +{ + "name": "obsidian-date-range-expander", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "obsidian-date-range-expander", + "version": "0.1.0", + "license": "MIT", + "devDependencies": { + "@types/jest": "^29.5.14", + "@types/node": "^16.11.6", + "@typescript-eslint/eslint-plugin": "5.29.0", + "@typescript-eslint/parser": "5.29.0", + "builtin-modules": "3.3.0", + "esbuild": "^0.25.0", + "jest": "^29.7.0", + "obsidian": "latest", + "ts-jest": "^29.2.6", + "tslib": "2.4.0", + "typescript": "4.7.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.10" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@codemirror/state": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", + "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.36.4", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.4.tgz", + "integrity": "sha512-ZQ0V5ovw/miKEXTvjgzRyjnrk9TwriUB1k4R5p7uNnHR9Hus+D1SXHGdJshijEzPFjU25xea/7nhIeSqYFKdbA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/state": "^6.5.0", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/codemirror": { + "version": "5.60.8", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", + "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tern": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", + "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/type-utils": "5.29.0", + "@typescript-eslint/utils": "5.29.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", + "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/typescript-estree": "5.29.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", + "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/visitor-keys": "5.29.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", + "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.29.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", + "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", + "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/visitor-keys": "5.29.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", + "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/typescript-estree": "5.29.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", + "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0", + "peer": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001706", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz", + "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.120", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.120.tgz", + "integrity": "sha512-oTUp3gfX1gZI+xfD2djr2rzQdHCwHzPQrrK0CD7WpTdF0nPdQ/INcRVjWgLdCT4a9W3jFObR9DAfsuyFQnI8CQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.1", + "@esbuild/android-arm": "0.25.1", + "@esbuild/android-arm64": "0.25.1", + "@esbuild/android-x64": "0.25.1", + "@esbuild/darwin-arm64": "0.25.1", + "@esbuild/darwin-x64": "0.25.1", + "@esbuild/freebsd-arm64": "0.25.1", + "@esbuild/freebsd-x64": "0.25.1", + "@esbuild/linux-arm": "0.25.1", + "@esbuild/linux-arm64": "0.25.1", + "@esbuild/linux-ia32": "0.25.1", + "@esbuild/linux-loong64": "0.25.1", + "@esbuild/linux-mips64el": "0.25.1", + "@esbuild/linux-ppc64": "0.25.1", + "@esbuild/linux-riscv64": "0.25.1", + "@esbuild/linux-s390x": "0.25.1", + "@esbuild/linux-x64": "0.25.1", + "@esbuild/netbsd-arm64": "0.25.1", + "@esbuild/netbsd-x64": "0.25.1", + "@esbuild/openbsd-arm64": "0.25.1", + "@esbuild/openbsd-x64": "0.25.1", + "@esbuild/sunos-x64": "0.25.1", + "@esbuild/win32-arm64": "0.25.1", + "@esbuild/win32-ia32": "0.25.1", + "@esbuild/win32-x64": "0.25.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/obsidian": { + "version": "1.8.7", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.8.7.tgz", + "integrity": "sha512-h4bWwNFAGRXlMlMAzdEiIM2ppTGlrh7uGOJS6w4gClrsjc+ei/3YAtU2VdFUlCiPuTHpY4aBpFJJW75S1Tl/JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/codemirror": "5.60.8", + "moment": "2.29.4" + }, + "peerDependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-mod": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.2.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.6.tgz", + "integrity": "sha512-yTNZVZqc8lSixm+QGVFcPe6+yj7+TWZwIesuOWvfcn4B9bz5x4NDzVCQQjOs7Hfouu36aEqfEbo9Qpo+gq8dDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.1", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..dda122b --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "obsidian-date-range-expander", + "version": "0.9.0", + "description": "Quickly add a range of day references given a date duration.", + "main": "main.js", + "scripts": { + "dev": "node esbuild.config.mjs", + "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "version": "node version-bump.mjs && git add manifest.json versions.json", + "test": "jest", + "test:watch": "jest --watch" + }, + "keywords": [], + "author": "Mil", + "license": "MIT", + "devDependencies": { + "@types/jest": "^29.5.14", + "@types/node": "^16.11.6", + "@typescript-eslint/eslint-plugin": "5.29.0", + "@typescript-eslint/parser": "5.29.0", + "builtin-modules": "3.3.0", + "esbuild": "^0.25.0", + "jest": "^29.7.0", + "obsidian": "latest", + "ts-jest": "^29.2.6", + "tslib": "2.4.0", + "typescript": "4.7.4" + } +} \ No newline at end of file diff --git a/src/dateInputModal.ts b/src/dateInputModal.ts new file mode 100644 index 0000000..d4814db --- /dev/null +++ b/src/dateInputModal.ts @@ -0,0 +1,325 @@ +import { App, Modal, Setting } from 'obsidian'; +import { DateInputModalResponse } from './types'; +import { DateUtils } from './dateUtils'; + +export class DateInputModal extends Modal { + private startDateValue: string = ''; + private endDateValue: string = ''; + private durationValue: string = ''; + private durationTypeValue: 'Days' | 'Weeks' | 'Months' = 'Days'; + private useCalloutValue: boolean = true; + private rangeTypeValue: 'EndDate' | 'Duration' = 'EndDate'; + + private onSubmit: (dateRangeValues: DateInputModalResponse) => void; + private submitButton: HTMLButtonElement | null = null; + private endDateInput: HTMLInputElement; + private durationInput: HTMLInputElement; + private durationTypeSelect: HTMLSelectElement; + private dateUtils: DateUtils; + private keyboardListener: (event: KeyboardEvent) => void; + + constructor(app: App, onSubmit: (dateRangeValues: DateInputModalResponse) => void) { + super(app); + this.onSubmit = onSubmit; + this.dateUtils = new DateUtils(); + this.setTitle('Enter date range'); + } + + onOpen() { + const { contentEl } = this; + contentEl.empty(); + + this.addStyles(); + this.setupKeyboardListener(); + this.createStartDateInput(); + this.createRangeOptions(); + this.createCalloutToggle(); + this.createSubmitButton(); + } + + onClose() { + const { contentEl } = this; + // Clean up the keyboard event listener + if (this.keyboardListener) { + contentEl.removeEventListener('keydown', this.keyboardListener); + } + // Clear the content + contentEl.empty(); + } + + private validateInput(): boolean { + const startDateObj = this.dateUtils.parseDateFromString(this.startDateValue); + + if (!startDateObj){ + return false; + } + + if (this.rangeTypeValue === 'EndDate') { + const endDateObj = this.dateUtils.parseDateFromString(this.endDateValue); + return !!endDateObj && + this.dateUtils.isValidNumericDate(this.endDateValue) && + endDateObj >= startDateObj; + } else { + return this.durationValue !== '' && + parseInt(this.durationValue) > 0 && + ['Days', 'Weeks', 'Months'].includes(this.durationTypeValue); + } + } + + private calculateDateCount(): number { + const startDate = this.dateUtils.parseDateFromString(this.startDateValue); + if (!startDate) { + return 0; + } + + let endDate: Date; + + if (this.rangeTypeValue === 'EndDate') { + endDate = this.dateUtils.parseDateFromString(this.endDateValue) || startDate; + } else { + endDate = new Date(startDate); + const duration = parseInt(this.durationValue) || 0; + + if (this.durationTypeValue === 'Days') { + endDate.setDate(endDate.getDate() + duration - 1); // -1 because we include the start date + } else if (this.durationTypeValue === 'Weeks') { + endDate.setDate(endDate.getDate() + (duration * 7) - 1); + } else if (this.durationTypeValue === 'Months') { + endDate = this.dateUtils.addMonthsToDate(startDate, duration); + } + } + + const dateCount = this.dateUtils.calculateDaysInRange(startDate, endDate); + return dateCount; + } + + private addStyles() { + const styleEl = document.createElement('style'); + styleEl.textContent = ` + .date-option-container { + margin-bottom: 15px; + } + .date-input-row { + display: flex; + align-items: center; + margin-bottom: 10px; + } + .date-input-row input[type="radio"] { + margin-right: 8px; + } + .date-input-row input[type="text"], + .date-input-row input[type="number"] { + margin-left: 5px; + } + .date-input-row select { + margin-left: 5px; + } + `; + + this.contentEl.appendChild(styleEl); + } + + private setupKeyboardListener() { + this.keyboardListener = (event: KeyboardEvent) => { + if (event.key === 'Enter' && this.validateInput()) { + this.submit(); + } + }; + this.contentEl.addEventListener('keydown', this.keyboardListener); + } + + private createStartDateInput() { + new Setting(this.contentEl) + .setName('Start date') + .addText(text => { + text.setPlaceholder('YYYYMMDD') + .setValue(this.startDateValue); + + text.inputEl.setAttribute('pattern', '[0-9]*'); + text.inputEl.setAttribute('maxlength', '8'); + text.inputEl.addEventListener('input', (e: InputEvent) => { + const input = e.target as HTMLInputElement; + input.value = input.value.replace(/\D/g, '').slice(0, 8); + this.startDateValue = input.value; + this.updateSubmitButton(); + }); + }); + } + + private createRangeOptions() { + const optionContainer = this.contentEl.createEl('div', { cls: 'date-option-container' }); + this.createEndDateOption(optionContainer); + this.createDurationOption(optionContainer); + this.updateInputStates(); + } + + private createEndDateOption(container: HTMLElement) { + const endDateRow = container.createEl('div', { cls: 'date-input-row' }); + const endDateLabel = endDateRow.createEl('label'); + endDateLabel.appendText('End date'); + + const endDateRadio = endDateLabel.createEl('input', { + type: 'radio', + attr: { name: 'dateOption' } + }); + endDateRadio.checked = this.rangeTypeValue === 'EndDate'; + + this.endDateInput = endDateRow.createEl('input', { + type: 'text', + placeholder: 'YYYYMMDD', + value: this.endDateValue, + attr: { + pattern: '[0-9]*', + maxlength: '8' + } + }); + + this.endDateInput.addEventListener('input', (e) => { + const input = e.target as HTMLInputElement; + input.value = input.value.replace(/\D/g, '').slice(0, 8); + this.endDateValue = input.value; + this.updateSubmitButton(); + }); + + endDateRadio.addEventListener('change', () => { + this.rangeTypeValue = 'EndDate'; + this.updateInputStates(); + this.updateSubmitButton(); + }); + } + + private createDurationOption(container: HTMLElement) { + const durationRow = container.createEl('div', { cls: 'date-input-row' }); + const durationLabel = durationRow.createEl('label'); + durationLabel.appendText('Duration'); + + const durationRadio = durationLabel.createEl('input', { + type: 'radio', + attr: { name: 'dateOption' } + }); + durationRadio.checked = this.rangeTypeValue === 'Duration'; + + this.durationInput = durationRow.createEl('input', { + type: 'number', + attr: { + min: '1', + max: '100' + }, + placeholder: '1-100', + value: this.durationValue + }); + + this.durationTypeSelect = durationRow.createEl('select'); + this.populateDurationTypes(); + + durationRadio.addEventListener('change', () => { + this.rangeTypeValue = 'Duration'; + this.updateInputStates(); + this.updateSubmitButton(); + }); + + this.durationInput.addEventListener('input', (e) => { + const input = e.target as HTMLInputElement; + let value = parseInt(input.value); + if (value > 100) { + value = 100; + input.value = '100'; + } + this.durationValue = value.toString(); + this.updateSubmitButton(); + }); + + this.durationTypeSelect.addEventListener('change', (e) => { + this.durationTypeValue = (e.target as HTMLSelectElement).value as 'Days' | 'Weeks' | 'Months'; + this.updateSubmitButton(); + }); + } + + private populateDurationTypes() { + ['Days', 'Weeks', 'Months'].forEach(type => { + const option = this.durationTypeSelect.createEl('option', { + value: type, + text: type + }); + option.selected = type === this.durationTypeValue; + }); + } + + private updateInputStates() { + const isEndDateMode = this.rangeTypeValue === 'EndDate'; + this.endDateInput.disabled = !isEndDateMode; + this.durationInput.disabled = isEndDateMode; + this.durationTypeSelect.disabled = isEndDateMode; + } + + private createCalloutToggle() { + new Setting(this.contentEl) + .setName('Add to callout') + .setDesc('Insert dates inside a collapsed callout') + .addToggle(toggle => toggle + .setValue(this.useCalloutValue) + .onChange(value => { + this.useCalloutValue = value; + }) + ); + } + + private createSubmitButton() { + this.submitButton = new Setting(this.contentEl) + .addButton(btn => btn + .setButtonText('Insert') + .setCta() + .onClick(() => this.submit()) + ).settingEl.querySelector('button'); + + if (this.submitButton) { + this.submitButton.disabled = true; + } + } + + private updateSubmitButton() { + if (this.submitButton) { + const validInput = this.validateInput(); + this.submitButton.disabled = !validInput; + + if (validInput) { + const dateCount = this.calculateDateCount(); + this.submitButton.textContent = `Insert ${dateCount} Date${dateCount !== 1 ? 's' : ''}`; + } else { + this.submitButton.textContent = 'Insert'; + } + } + } + + private submit() { + if (!this.validateInput()) { + return; + } + + const startDateObj = this.dateUtils.parseDateFromString(this.startDateValue); + if (!startDateObj) { + return; + } + + const dateRangeValues: DateInputModalResponse = { + startDate: startDateObj, + rangeType: this.rangeTypeValue, + useCallout: this.useCalloutValue + }; + + if (this.rangeTypeValue === 'EndDate') { + const endDateObj = this.dateUtils.parseDateFromString(this.endDateValue); + if (endDateObj) + dateRangeValues.endDate = endDateObj; + } else { + dateRangeValues.duration = parseInt(this.durationValue); + dateRangeValues.durationUnit = this.durationTypeValue; + } + + this.close(); + + if (this.onSubmit) { + this.onSubmit(dateRangeValues); + } + } +} \ No newline at end of file diff --git a/src/dateRangeExpander.ts b/src/dateRangeExpander.ts new file mode 100644 index 0000000..ad6541f --- /dev/null +++ b/src/dateRangeExpander.ts @@ -0,0 +1,123 @@ +import { App, Notice, TFolder } from 'obsidian'; +import { PluginSettings, DateRange, DEFAULT_SETTINGS } from './types'; +import { DateUtils } from './dateUtils'; + +export class DateRangeExpander { + app: App; + settings: PluginSettings; + dateUtils: DateUtils; + + constructor(app: App, settings: PluginSettings, dateUtils: DateUtils) { + this.app = app; + this.settings = settings; + this.dateUtils = dateUtils; + } + + wrapInCallout(dateStartAndEnd: DateRange, insertedDateRange: string): string { + const [startDateFormat, endDateFormat] = this.getFormatedStartAndEndDates(dateStartAndEnd); + return `\n> [!SUMMARY]- Date range: ${startDateFormat} to ${endDateFormat}\n> ${insertedDateRange}\n`; + } + + expandDateRange(dateStartAndEnd: DateRange): string | null{ + let totalDates = 0; + let createdFiles = 0; + let existingFiles = 0; + let customFolderExists = true; + + let dates = []; + let current = new Date(dateStartAndEnd.startDate); + + const customFolder = this.app.vault.getAbstractFileByPath(this.settings.customFolderPath); + + if (this.settings.createNonExistentFiles === 'custom-folder' && !(customFolder instanceof TFolder)) { + customFolderExists = false; + } + + while (current <= dateStartAndEnd.endDate) { + let formattedDate = this.dateUtils.formatDateToString(current, this.settings.outputDateFormat, DEFAULT_SETTINGS.outputDateFormat); + + if (this.settings.createWikiLinks) { + dates.push(`[[${formattedDate}]]`); + + const fileCreationResult = this.createFileIfNeeded(formattedDate, customFolderExists); + if (fileCreationResult === 'created') + createdFiles++; + else if (fileCreationResult === 'exists') + existingFiles++; + } else { + dates.push(formattedDate); + } + totalDates++; + + current.setDate(current.getDate() + 1); + } + + if (createdFiles > 0 && !customFolderExists) { + new Notice(`Folder "${this.settings.customFolderPath}" does not exist. Using parent folder to current note instead.`); + } + + const [startDateFormat, endDateFormat] = this.getFormatedStartAndEndDates(dateStartAndEnd); + + const commonNoticeText = `Inserted ${totalDates} dates from ${startDateFormat} to ${endDateFormat}`; + if (this.settings.createNonExistentFiles !== 'do-not-create') { + new Notice(`${commonNoticeText}\n\n• Files created: ${createdFiles}\n• Files skipped: ${existingFiles}`, 8000); + } else { + new Notice(commonNoticeText, 8000); + } + + return dates.join(this.settings.dateSeparator); + } + + createFileIfNeeded(formattedDate: string, customFolderExists: boolean): 'created' | 'exists' | 'failed' { + const currentFile = this.app.workspace.getActiveFile(); + if (!currentFile || !currentFile.parent) { + return 'failed'; + } + + const fileName = `${formattedDate}.md`; + const fileExists = this.fileExistsInVault(formattedDate); + + if (!fileExists) { + let filePath = ''; + + switch (this.settings.createNonExistentFiles) { + case 'same-folder': + const currentDir = currentFile.parent.path; + filePath = currentDir ? `${currentDir}/${fileName}` : fileName; + break; + case 'custom-folder': + if (customFolderExists) { + filePath = `${this.settings.customFolderPath}/${fileName}`; + } else { + // Fallback to same folder if custom path is empty or not found + const currentDir = currentFile.parent.path; + filePath = currentDir ? `${currentDir}/${fileName}` : fileName; + } + break; + case 'do-not-create': + return 'failed'; + default: + return 'failed'; + } + + if (filePath) { + this.app.vault.create(filePath, ""); + return 'created'; + } + return 'failed'; + } else { + return 'exists'; + } + } + + fileExistsInVault(formattedDate: string): boolean { + return this.app.metadataCache.getFirstLinkpathDest(formattedDate, '') !== null; + } + + private getFormatedStartAndEndDates(dateStartAndEnd: DateRange): [string, string] { + const startDateFormat = this.dateUtils.formatDateToString(dateStartAndEnd.startDate, this.settings.friendlyDateFormat, DEFAULT_SETTINGS.friendlyDateFormat); + const endDateFormat = this.dateUtils.formatDateToString(dateStartAndEnd.endDate, this.settings.friendlyDateFormat, DEFAULT_SETTINGS.friendlyDateFormat); + + return [startDateFormat, endDateFormat]; + } +} \ No newline at end of file diff --git a/src/dateUtils.ts b/src/dateUtils.ts new file mode 100644 index 0000000..9eeae60 --- /dev/null +++ b/src/dateUtils.ts @@ -0,0 +1,148 @@ +import { DateInputModalResponse, DateRange } from './types'; + +export class DateUtils { + getStartAndEndDates(modalResponse: DateInputModalResponse): DateRange | null { + let startDate: Date = modalResponse.startDate; + let endDate: Date; + + if (modalResponse.rangeType === 'EndDate') { + endDate = modalResponse.endDate!; + } else { + endDate = new Date(startDate); + const duration = modalResponse.duration!; + const unit = modalResponse.durationUnit!; + + switch (unit) { + case 'Days': + endDate.setDate(startDate.getDate() + duration - 1); + break; + case 'Weeks': + endDate.setDate(startDate.getDate() + (duration * 7) - 1); + break; + case 'Months': + endDate = this.addMonthsToDate(startDate, duration); + break; + } + } + + if (startDate > endDate) { + return null; + } + + const dateStartAndEnd: DateRange = { + startDate: startDate, + endDate: endDate + }; + + return dateStartAndEnd; + } + + // Assuming string date is in format: YYYYMMDD + parseDateFromString(dateString: string): Date | null { + if (!this.isValidNumericDate(dateString)) { + return null; + } + + const year = parseInt(dateString.substring(0, 4)); + const month = parseInt(dateString.substring(4, 6)) - 1; + const day = parseInt(dateString.substring(6, 8)); + + const date = new Date(Date.UTC(year, month, day)); + return date; + } + + // Returns true if string date is in format: YYYYMMDD + isValidNumericDate(dateString: string): boolean { + if (!/^\d{8}$/.test(dateString)) + return false; + + const year = parseInt(dateString.substring(0, 4)); + const month = parseInt(dateString.substring(4, 6)) - 1; // JavaScript months are 0-indexed + const day = parseInt(dateString.substring(6, 8)); + + // Additional validation + if (year < 1900) + return false; + if (month < 0 || month > 11) + return false; + if (day < 1 || day > 31) + return false; + + const dateObj = new Date(year, month, day); + + return dateObj.getFullYear() === year && + dateObj.getMonth() === month && + dateObj.getDate() === day; + } + + formatDateToString(date: Date, settingsFormat: string, defaultFormat: string): string { + const year = date.getFullYear(); + const month = date.getMonth(); + const day = date.getDate(); + const weekday = date.getDay(); + + const dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + const monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + + const dayAbbreviations = dayNames.map(day => day.slice(0, 3)); + const monthAbbreviations = monthNames.map(month => month.slice(0, 3)); + + const formatDate = (format: string): string => { + return format.replace(/YYYY|YYY|YY|Y|MMMM|MMM|MM|M|DDDD|DDD|DD|D/g, (match) => { + switch (match) { + case 'YYYY': return year.toString(); + case 'YYY': return year.toString().slice(-3); + case 'YY': return year.toString().slice(-2); + case 'Y': return year.toString().slice(-1); + case 'MMMM': return monthNames[month]; + case 'MMM': return monthAbbreviations[month]; + case 'MM': return (month + 1).toString().padStart(2, '0'); + case 'M': return (month + 1).toString(); + case 'DDDD': return dayNames[weekday]; + case 'DDD': return dayAbbreviations[weekday]; + case 'DD': return day.toString().padStart(2, '0'); + case 'D': return day.toString(); + default: return match; + } + }); + }; + + try { + return formatDate(settingsFormat); + } catch (error) { + // Fallback to default format if anything goes wrong + return formatDate(defaultFormat); + } + } + + addMonthsToDate(date: Date, months: number): Date { + if (months === 0) { + return date; + } + + const newDate = new Date(date); + + const currentDay = date.getDate(); + + newDate.setMonth(newDate.getMonth() + months); + newDate.setDate(newDate.getDate() - 1); + + // Check if the day changed (which means we went into the next month) + if (newDate.getMonth() !== date.getMonth() && newDate.getDate() !== (currentDay - 1)) { + // If the day changed, it means we landed on the wrong day + // Set to the last day of the previous month + newDate.setDate(0); + } + + return newDate; + } + + calculateDaysInRange(startDate: Date, endDate: Date): number { + const millisecondsInDay = 1000 * 60 * 60 * 24; + + const differenceMilliseconds = endDate.getTime() - startDate.getTime(); + const differenceDays = Math.floor(differenceMilliseconds / millisecondsInDay) + 1; // +1 to include both start and end dates + + return Math.max(0, differenceDays); + } +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..32e65b0 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,71 @@ +import { MarkdownView, Plugin } from 'obsidian'; +import { DateInputModal } from './dateInputModal'; +import { DEFAULT_SETTINGS, PluginSettings } from './types'; +import { DateRangeExpanderSettingTab } from './settingsTab'; +import { DateUtils } from './dateUtils'; +import { DateRangeExpander } from './dateRangeExpander'; + +export default class DateRangeExpanderPlugin extends Plugin { + settings: PluginSettings; + dateRangeExpander: DateRangeExpander; + dateUtils: DateUtils; + + async onload() { + console.log('DateRangeExpander loaded'); + + await this.loadSettings(); + + this.dateUtils = new DateUtils(); + this.dateRangeExpander = new DateRangeExpander(this.app, this.settings, this.dateUtils); + + this.addSettingTab(new DateRangeExpanderSettingTab(this.app, this)); + + this.addCommand({ + id: 'insert-expanded-date-range', + name: 'Insert', + checkCallback: (checking: boolean) => { + const markdownView = this.app.workspace.getActiveViewOfType(MarkdownView); + if (markdownView) { + if (!checking) { + new DateInputModal(this.app, (rangeInput) => { + const dateStartAndEnd = this.dateUtils.getStartAndEndDates(rangeInput); + + if (dateStartAndEnd) { + const editor = this.getActiveEditor(); + if (editor) { + const cursor = editor.getCursor(); + let insertedDateRange = this.dateRangeExpander.expandDateRange(dateStartAndEnd) + ' '; + if (rangeInput.useCallout) { + insertedDateRange = this.dateRangeExpander.wrapInCallout(dateStartAndEnd, insertedDateRange); + } + editor.replaceRange(insertedDateRange, { line: cursor.line, ch: cursor.ch }, cursor); + + const endPos = { line: cursor.line, ch: cursor.ch + insertedDateRange.length }; + editor.setCursor(endPos); + } + } + }).open(); + } + + return true; + } + } + }); + } + + async loadSettings() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); } + + async saveSettings() { await this.saveData(this.settings); } + + onunload() { + console.log('DateRangeExpander unloaded'); + } + + getActiveEditor() { + const activeLeaf = this.app.workspace.getActiveViewOfType(MarkdownView); + if (activeLeaf) { + return activeLeaf.editor; + } + return null; + } +} \ No newline at end of file diff --git a/src/settingsTab.ts b/src/settingsTab.ts new file mode 100644 index 0000000..6b2b011 --- /dev/null +++ b/src/settingsTab.ts @@ -0,0 +1,106 @@ +import { App, PluginSettingTab, Setting } from 'obsidian'; +import DateRangeExpanderPlugin from './main'; +import { DEFAULT_SETTINGS } from './types'; + +export class DateRangeExpanderSettingTab extends PluginSettingTab { + plugin: DateRangeExpanderPlugin; + + constructor(app: App, plugin: DateRangeExpanderPlugin) { + super(app, plugin); + this.plugin = plugin; + } + + display(): void { + const { containerEl } = this; + containerEl.empty(); + + this.createDateFormatSettings(); + this.createWikiLinkSettings(); + } + + private createDateFormatSettings() { + new Setting(this.containerEl) + .setName('Output date format') + .setDesc(`Format for output dates (e.g., ${DEFAULT_SETTINGS.outputDateFormat})`) + .addText(text => text + .setPlaceholder(DEFAULT_SETTINGS.outputDateFormat) + .setValue(this.plugin.settings.outputDateFormat) + .onChange(async (value) => { + this.plugin.settings.outputDateFormat = value; + await this.plugin.saveSettings(); + })); + + new Setting(this.containerEl) + .setName('Friendly date format') + .setDesc(`Format for friendly date display (e.g., ${DEFAULT_SETTINGS.friendlyDateFormat}). Supports D, DD, DDD, DDDD, M, MM, MMM, MMMM, Y, YY, YYY, YYYYM.`) + .addText(text => text + .setPlaceholder(DEFAULT_SETTINGS.friendlyDateFormat) + .setValue(this.plugin.settings.friendlyDateFormat) + .onChange(async (value) => { + this.plugin.settings.friendlyDateFormat = value; + await this.plugin.saveSettings(); + })); + + new Setting(this.containerEl) + .setName('Date separator') + .setDesc(`Separator between dates (e.g., "${DEFAULT_SETTINGS.dateSeparator}")`) + .addText(text => text + .setPlaceholder(DEFAULT_SETTINGS.dateSeparator) + .setValue(this.plugin.settings.dateSeparator) + .onChange(async (value) => { + this.plugin.settings.dateSeparator = value; + await this.plugin.saveSettings(); + })); + } + + private createWikiLinkSettings() { + new Setting(this.containerEl) + .setName('Create wiki links') + .setDesc('Create wiki links for inserted dates') + .addToggle(toggle => toggle + .setValue(this.plugin.settings.createWikiLinks) + .onChange(async (value) => { + this.plugin.settings.createWikiLinks = value; + await this.plugin.saveSettings(); + this.display(); + })); + + if (this.plugin.settings.createWikiLinks) { + this.createNonExistentFilesSettings(); + } + } + + private createNonExistentFilesSettings() { + new Setting(this.containerEl) + .setName('Create non-existent files') + .setDesc('What to do if a wiki linked file does not exist') + .addDropdown(dropdown => dropdown + .addOption('do-not-create', 'Do not create') + .addOption('same-folder', 'Create in same folder') + .addOption('custom-folder', 'Create in custom folder') + .setValue(this.plugin.settings.createNonExistentFiles) + .onChange(async (value: 'do-not-create' | 'same-folder' | 'custom-folder') => { + this.plugin.settings.createNonExistentFiles = value; + await this.plugin.saveSettings(); + this.display(); + })); + + if (this.plugin.settings.createNonExistentFiles === 'custom-folder') { + this.createCustomFolderPathSetting(); + } + } + + private createCustomFolderPathSetting() { + new Setting(this.containerEl) + .setName('Custom folder path') + .setDesc('Path to the folder where new files should be created (e.g., "Daily Notes/2025")') + .addText(text => { + text.setPlaceholder('Enter folder path') + .setValue(this.plugin.settings.customFolderPath || '') + .onChange(async (value) => { + this.plugin.settings.customFolderPath = value; + await this.plugin.saveSettings(); + }); + }); + } +} \ No newline at end of file diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..aa366d8 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,31 @@ +export interface PluginSettings { + outputDateFormat: string; + friendlyDateFormat: string; + dateSeparator: string; + createWikiLinks: boolean; + createNonExistentFiles: 'do-not-create' | 'same-folder' | 'custom-folder'; + customFolderPath: string; +} + +export const DEFAULT_SETTINGS: PluginSettings = { + outputDateFormat: 'YYYY.MM.DD', + friendlyDateFormat: 'DDD D MMM YYYY', + dateSeparator: ', ', + createWikiLinks: true, + createNonExistentFiles: 'same-folder', + customFolderPath: '' +} + +export interface DateRange { + startDate: Date; + endDate: Date; +} + +export interface DateInputModalResponse { + startDate: Date; + rangeType: 'EndDate' | 'Duration'; + endDate?: Date; + duration?: number; + durationUnit?: 'Days' | 'Weeks' | 'Months'; + useCallout: boolean; +} \ No newline at end of file diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..71cc60f --- /dev/null +++ b/styles.css @@ -0,0 +1,8 @@ +/* + +This CSS file will be included with your plugin, and +available in the app when your plugin is enabled. + +If your plugin does not need CSS, delete this file. + +*/ diff --git a/tests/__mocks__/obsidian.ts b/tests/__mocks__/obsidian.ts new file mode 100644 index 0000000..4ddbc83 --- /dev/null +++ b/tests/__mocks__/obsidian.ts @@ -0,0 +1,18 @@ +export class App { + vault: any; + workspace: any; + metadataCache: any; +} + +export class Notice { + constructor(message: string, timeout?: number) {} +} + +export class TFolder { + path: string; + constructor() { + this.path = ''; + } +} + +// Add any other Obsidian classes/types you need to mock \ No newline at end of file diff --git a/tests/dateRangeExpander.test.ts b/tests/dateRangeExpander.test.ts new file mode 100644 index 0000000..6dda32b --- /dev/null +++ b/tests/dateRangeExpander.test.ts @@ -0,0 +1,134 @@ +import { App, Notice, TFolder } from 'obsidian'; +import { DateRangeExpander } from '../src/dateRangeExpander'; +import { DateUtils } from '../src/dateUtils'; +import { PluginSettings, DEFAULT_SETTINGS, DateRange } from '../src/types'; + +// Mock App +const mockApp = { + vault: { + getAbstractFileByPath: jest.fn(), + create: jest.fn() + }, + metadataCache: { + getFirstLinkpathDest: jest.fn() + }, + workspace: { + getActiveFile: jest.fn() + } +} as unknown as App; + +// Mock settings with default values +const mockSettings: PluginSettings = { + ...DEFAULT_SETTINGS, + outputDateFormat: 'YYYY-MM-DD', + dateSeparator: ', ', + createWikiLinks: true, + createNonExistentFiles: 'do-not-create', + customFolderPath: 'test-folder' +}; + +describe('DateRangeExpander', () => { + describe('wrapInCallout', () => { + let dateRangeExpander: DateRangeExpander; + let dateUtils: DateUtils; + + beforeEach(() => { + dateUtils = new DateUtils(); + dateRangeExpander = new DateRangeExpander(mockApp, mockSettings, dateUtils); + }); + + test('should handle single-day date ranges', () => { + const dateRange: DateRange = { + startDate: new Date('2024-03-15'), + endDate: new Date('2024-03-15') + }; + const insertedDates = '[[2024-03-15]]'; + + const result = dateRangeExpander.wrapInCallout(dateRange, insertedDates); + + expect(result).toBe( + '\n> [!SUMMARY]- Date range: Fri 15 Mar 2024 to Fri 15 Mar 2024\n> [[2024-03-15]]\n' + ); + }); + + test('should wrap a simple date range in a callout', () => { + const dateRange: DateRange = { + startDate: new Date('2024-03-15'), + endDate: new Date('2024-03-17') + }; + const insertedDates = '[[2024-03-15]], [[2024-03-16]], [[2024-03-17]]'; + + const result = dateRangeExpander.wrapInCallout(dateRange, insertedDates); + + expect(result).toBe( + '\n> [!SUMMARY]- Date range: Fri 15 Mar 2024 to Sun 17 Mar 2024\n> [[2024-03-15]], [[2024-03-16]], [[2024-03-17]]\n' + ); + }); + }); + + describe('expandDateRange', () => { + let dateRangeExpander: DateRangeExpander; + let dateUtils: DateUtils; + + beforeEach(() => { + dateUtils = new DateUtils(); + dateRangeExpander = new DateRangeExpander(mockApp, mockSettings, dateUtils); + }); + + test('should handle single-day date range', () => { + const dateRange: DateRange = { + startDate: new Date('2024-03-15'), + endDate: new Date('2024-03-15') + }; + + const result = dateRangeExpander.expandDateRange(dateRange); + + expect(result).toBe('[[2024-03-15]]'); + }); + + test('should expand a simple date range', () => { + const dateRange: DateRange = { + startDate: new Date('2024-03-15'), + endDate: new Date('2024-03-17') + }; + + const result = dateRangeExpander.expandDateRange(dateRange); + + expect(result).toBe('[[2024-03-15]], [[2024-03-16]], [[2024-03-17]]'); + }); + + test('should use custom date separator', () => { + const settingsWithCustomSeparator: PluginSettings = { + ...mockSettings, + dateSeparator: ' | ' + }; + dateRangeExpander = new DateRangeExpander(mockApp, settingsWithCustomSeparator, dateUtils); + + const dateRange: DateRange = { + startDate: new Date('2024-03-15'), + endDate: new Date('2024-03-16') + }; + + const result = dateRangeExpander.expandDateRange(dateRange); + + expect(result).toBe('[[2024-03-15]] | [[2024-03-16]]'); + }); + + test('should use output date format', () => { + const settingsWithCustomSeparator: PluginSettings = { + ...mockSettings, + outputDateFormat: 'DDDD D MMMM YYYY' + }; + dateRangeExpander = new DateRangeExpander(mockApp, settingsWithCustomSeparator, dateUtils); + + const dateRange: DateRange = { + startDate: new Date('2024-03-9'), + endDate: new Date('2024-03-10') + }; + + const result = dateRangeExpander.expandDateRange(dateRange); + + expect(result).toBe('[[Saturday 9 March 2024]], [[Sunday 10 March 2024]]'); + }); + }); +}); \ No newline at end of file diff --git a/tests/dateUtils.test.ts b/tests/dateUtils.test.ts new file mode 100644 index 0000000..0491cc7 --- /dev/null +++ b/tests/dateUtils.test.ts @@ -0,0 +1,575 @@ +import { DateUtils } from '../src/dateUtils'; +import { DateInputModalResponse } from '../src/types'; + +describe('DateUtils', () => { + let dateUtils: DateUtils; + + beforeEach(() => { + dateUtils = new DateUtils(); + }); + + describe('getStartAndEndDates', () => { + describe('EndDate range type', () => { + test('should return correct date range when end date is after start date', () => { + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2023, 0, 1)), // Jan 1, 2023 + rangeType: 'EndDate', + endDate: new Date(Date.UTC(2023, 0, 5)), // Jan 5, 2023 + useCallout: true + }; + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(new Date(Date.UTC(2023, 0, 1))); + expect(result?.endDate).toEqual(new Date(Date.UTC(2023, 0, 5))); + }); + + test('should return null when end date is before start date', () => { + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2023, 0, 5)), // Jan 5, 2023 + rangeType: 'EndDate', + endDate: new Date(Date.UTC(2023, 0, 1)), // Jan 1, 2023 + useCallout: false + }; + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).toBeNull(); + }); + + test('should return correct date range when start and end dates are the same', () => { + const sameDate = new Date(Date.UTC(2023, 0, 1)); // Jan 1, 2023 + const modalResponse: DateInputModalResponse = { + startDate: sameDate, + rangeType: 'EndDate', + endDate: new Date(Date.UTC(2023, 0, 1)), // Create a new Date object with the same values + useCallout: true + }; + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(sameDate); + expect(result?.endDate).toEqual(new Date(Date.UTC(2023, 0, 1))); + }); + }); + + describe('Duration range type with Days unit', () => { + test('should calculate correct end date for 1 day duration', () => { + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2023, 0, 1)), // Jan 1, 2023 + rangeType: 'Duration', + duration: 1, + durationUnit: 'Days', + useCallout: true + }; + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(new Date(Date.UTC(2023, 0, 1))); + expect(result?.endDate).toEqual(new Date(Date.UTC(2023, 0, 1))); // Same day (1 day duration - 1) + }); + + test('should calculate correct end date for 7 days duration', () => { + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2023, 0, 1)), // Jan 1, 2023 + rangeType: 'Duration', + duration: 7, + durationUnit: 'Days', + useCallout: false + }; + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(new Date(Date.UTC(2023, 0, 1))); + expect(result?.endDate).toEqual(new Date(Date.UTC(2023, 0, 7))); // Jan 7, 2023 (7 days duration - 1) + }); + + test('should handle month boundary correctly with days duration', () => { + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2023, 0, 30)), // Jan 30, 2023 + rangeType: 'Duration', + duration: 5, + durationUnit: 'Days', + useCallout: true + }; + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(new Date(Date.UTC(2023, 0, 30))); + expect(result?.endDate).toEqual(new Date(Date.UTC(2023, 1, 3))); // Feb 3, 2023 (5 days duration - 1) + }); + }); + + describe('Duration range type with Weeks unit', () => { + test('should calculate correct end date for 1 week duration', () => { + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2023, 0, 1)), // Jan 1, 2023 + rangeType: 'Duration', + duration: 1, + durationUnit: 'Weeks', + useCallout: true + }; + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(new Date(Date.UTC(2023, 0, 1))); + expect(result?.endDate).toEqual(new Date(Date.UTC(2023, 0, 7))); // Jan 7, 2023 (7 days) + }); + + test('should calculate correct end date for 2 weeks duration', () => { + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2023, 0, 1)), // Jan 1, 2023 + rangeType: 'Duration', + duration: 2, + durationUnit: 'Weeks', + useCallout: false + }; + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(new Date(Date.UTC(2023, 0, 1))); + expect(result?.endDate).toEqual(new Date(Date.UTC(2023, 0, 14))); // Jan 14, 2023 (14 days) + }); + + test('should handle month and year boundaries with weeks duration', () => { + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2023, 11, 26)), // Dec 26, 2023 + rangeType: 'Duration', + duration: 2, + durationUnit: 'Weeks', + useCallout: true + }; + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(new Date(Date.UTC(2023, 11, 26))); + expect(result?.endDate).toEqual(new Date(Date.UTC(2024, 0, 8))); // Jan 8, 2024 (14 days later - 1) + }); + }); + + describe('Duration range type with Months unit', () => { + test('should calculate correct end date for 1 month duration', () => { + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2023, 0, 15)), // Jan 15, 2023 + rangeType: 'Duration', + duration: 1, + durationUnit: 'Months', + useCallout: true + }; + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(new Date(Date.UTC(2023, 0, 15))); + expect(result?.endDate.getFullYear()).toBe(2023); + expect(result?.endDate.getMonth()).toBe(1); // February (0-indexed) + expect(result?.endDate.getDate()).toBe(14); + }); + + test('should handle month with different days correctly', () => { + // Testing with Jan 31 + 1 month should result in Feb 28 (in 2023, non-leap year) + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2023, 0, 31)), // Jan 31, 2023 + rangeType: 'Duration', + duration: 1, + durationUnit: 'Months', + useCallout: false + }; + + const expectedResult = new Date(2023, 1, 28); // Feb 28, 2023 + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(new Date(Date.UTC(2023, 0, 31))); + expect(result?.endDate).toEqual(expectedResult); + }); + + test('should handle leap year edge case correctly', () => { + // Testing Feb 29, 2024 (leap year) + 1 month + const modalResponse: DateInputModalResponse = { + startDate: new Date(Date.UTC(2024, 1, 29)), // Feb 29, 2024 + rangeType: 'Duration', + duration: 1, + durationUnit: 'Months', + useCallout: true + }; + + // Assuming addMonthsToDate handles this correctly + const expectedResult = new Date(2024, 2, 28); // Mar 28, 2024 + + const result = dateUtils.getStartAndEndDates(modalResponse); + + expect(result).not.toBeNull(); + expect(result?.startDate).toEqual(new Date(Date.UTC(2024, 1, 29))); + expect(result?.endDate).toEqual(expectedResult); + }); + }); + }); + + describe('parseDateFromString', () => { + test.each([ + // [description, input, expected] + ['parses a standard date', '20240101', new Date(Date.UTC(2024, 0, 1))], + ['parses a date with single-digit month and day', '20240501', new Date(Date.UTC(2024, 4, 1))], + ['parses a date at month boundary', '20241231', new Date(Date.UTC(2024, 11, 31))], + ['parses a leap year date', '20240229', new Date(Date.UTC(2024, 1, 29))], + ])('%s', (_, input, expected) => { + const result = dateUtils.parseDateFromString(input); + expect(result).toEqual(expected); + }); + + test.each([ + // Edge cases where isValidNumericDate would return true but we want to test parsing logic + ['handles January correctly (month 1 → index 0)', '20240101', 0], + ['handles December correctly (month 12 → index 11)', '20241201', 11], + ])('%s', (_, input, expectedMonth) => { + const result = dateUtils.parseDateFromString(input); + expect(result?.getMonth()).toBe(expectedMonth); + }); + + // Test that years, months, and days are parsed correctly + test('parses the date components correctly', () => { + const result = dateUtils.parseDateFromString('20241015'); + + expect(result?.getFullYear()).toBe(2024); + expect(result?.getMonth()).toBe(9); // October is month 9 in JS + expect(result?.getDate()).toBe(15); + }); + }); + + describe('isValidNumericDate', () => { + // Valid dates tests + test.each([ + ['20240307', 'Current date'], + ['19991231', 'Last day of 1999'], + ['20000101', 'First day of 2000'], + ['20240229', 'Leap year day in 2024'], + ['19000101', 'Year 1900'], + ['49991231', 'Far future date'] + ])('should return true for valid date %s (%s)', (input, _description) => { + expect(dateUtils.isValidNumericDate(input)).toBe(true); + }); + + // Invalid format tests + test.each([ + ['', 'Empty string'], + ['2024-03-07', 'ISO format with hyphens'], + ['03/07/2024', 'MM/DD/YYYY format'], + ['202403', 'Too few digits'], + ['202403071', 'Too many digits'], + ['2024030', 'Incomplete date'], + ['YYYYMMDD', 'Non-numeric characters'], + ['2024/03/07', 'With slashes'], + ['20240a07', 'With letter'], + [' 20240307', 'With leading space'], + ['20240307 ', 'With trailing space'] + ])('should return false for invalid format %s (%s)', (input, _description) => { + expect(dateUtils.isValidNumericDate(input)).toBe(false); + }); + + // Invalid year tests + test.each([ + ['18991231', 'Year < 1900'], + ])('should return false for invalid year in %s (%s)', (input, _description) => { + expect(dateUtils.isValidNumericDate(input)).toBe(false); + }); + + // Invalid month tests + test.each([ + ['20240001', 'Month = 00'], + ['20241301', 'Month = 13'], + ['20249901', 'Month = 99'] + ])('should return false for invalid month in %s (%s)', (input, _description) => { + expect(dateUtils.isValidNumericDate(input)).toBe(false); + }); + + // Invalid day tests + test.each([ + ['20240100', 'Day = 00'], + ['20240132', 'Day = 32'], + ['20240199', 'Day = 99'], + ['20240230', 'February 30 in leap year'], + ['20230229', 'February 29 in non-leap year'], + ['20240431', 'Day 31 in 30-day month (April)'], + ['20240631', 'Day 31 in 30-day month (June)'], + ['20240931', 'Day 31 in 30-day month (September)'], + ['20241131', 'Day 31 in 30-day month (November)'], + ['21000229', 'February 29 in centuary leap year but not quad-centuary (2100'], + ['22000229', 'February 29 in centuary leap year but not quad-centuary (2200'], + ['23000229', 'February 29 in centuary leap year but not quad-centuary (2300'] + ])('should return false for invalid day in %s (%s)', (input, _description) => { + expect(dateUtils.isValidNumericDate(input)).toBe(false); + }); + + // Edge cases + test.each([ + ['19000101', 'Minimum valid year'], + ['50001231', 'Maximum valid year'], + ['20240101', 'First day of month'], + ['20240131', 'Last day of 31-day month'], + ['20240229', 'Last day of February in leap year 2024'], + ['20250228', 'Last day of February in non-leap year 2025'], + ['20000229', 'Last day of February in century leap year 2000'] + ])('should properly validate edge case %s (%s)', (input, _description) => { + expect(dateUtils.isValidNumericDate(input)).toBe(true); + }); + + // Specific edge case for year 1900 (not a leap year despite being divisible by 4) + test('should correctly handle century year 1900 (not a leap year)', () => { + expect(dateUtils.isValidNumericDate('19000229')).toBe(false); + }); + }); + + describe('formatDateToString', () => { + // Standard use cases + describe('standard formats', () => { + test('should format date using YYYY-MM-DD pattern', () => { + const date = new Date(Date.UTC(2023, 0, 15)); // January 15, 2023 + const result = dateUtils.formatDateToString(date, 'YYYY-MM-DD', 'M/D/YYYY'); + expect(result).toBe('2023-01-15'); + }); + + test('should format date using MMM D, YYYY pattern', () => { + const date = new Date(Date.UTC(2023, 2, 10)); // March 10, 2023 + const result = dateUtils.formatDateToString(date, 'MMM D, YYYY', 'M/D/YYYY'); + expect(result).toBe('Mar 10, 2023'); + }); + + test('should format date with full month and day names', () => { + const date = new Date(Date.UTC(2023, 6, 4)); // July 4, 2023 + const result = dateUtils.formatDateToString(date, 'DDDD, MMMM D, YYYY', 'M/D/YYYY'); + expect(result).toBe('Tuesday, July 4, 2023'); + }); + }); + + // Testing individual format tokens + describe('format tokens', () => { + const testDate = new Date(Date.UTC(2023, 11, 5)); // December 5, 2023 (Tuesday) + + test.each([ + ['YYYY', '2023'], + ['YYY', '023'], + ['YY', '23'], + ['Y', '3'], + ['MMMM', 'December'], + ['MMM', 'Dec'], + ['MM', '12'], + ['M', '12'], + ['DDDD', 'Tuesday'], + ['DDD', 'Tue'], + ['DD', '05'], + ['D', '5'] + ])('should correctly format %s token', (format, expected) => { + const result = dateUtils.formatDateToString(testDate, format, 'M/D/YYYY'); + expect(result).toBe(expected); + }); + }); + + // Edge cases + describe('edge cases', () => { + test('should handle single-digit day and month', () => { + const date = new Date(Date.UTC(2023, 0, 1)); // January 1, 2023 + const result = dateUtils.formatDateToString(date, 'M/D/YYYY', 'MM/DD/YYYY'); + expect(result).toBe('1/1/2023'); + }); + + test('should handle last day of the year', () => { + const date = new Date(Date.UTC(2023, 11, 31)); // December 31, 2023 + const result = dateUtils.formatDateToString(date, 'YYYY-MM-DD', 'M/D/YYYY'); + expect(result).toBe('2023-12-31'); + }); + + test('should handle February 29 on leap year', () => { + const date = new Date(Date.UTC(2024, 1, 29)); // February 29, 2024 (leap year) + const result = dateUtils.formatDateToString(date, 'MMMM D, YYYY', 'M/D/YYYY'); + expect(result).toBe('February 29, 2024'); + }); + + test('should handle pattern with repeated tokens', () => { + const date = new Date(Date.UTC(2023, 4, 15)); // May 15, 2023 + const result = dateUtils.formatDateToString(date, 'YYYY-MM-DD (DDDD)', 'M/D/YYYY'); + expect(result).toBe('2023-05-15 (Monday)'); + }); + }); + + // Date boundary tests + describe('date boundaries', () => { + test('should handle dates at year boundaries', () => { + // New Year's Eve + let date = new Date(Date.UTC(2023, 11, 31, 23, 59, 59)); + let result = dateUtils.formatDateToString(date, 'YYYY-MM-DD', 'M/D/YYYY'); + expect(result).toBe('2023-12-31'); + + // New Year's Day + date = new Date(Date.UTC(2024, 0, 1, 0, 0, 1)); + result = dateUtils.formatDateToString(date, 'YYYY-MM-DD', 'M/D/YYYY'); + expect(result).toBe('2024-01-01'); + }); + + test('should handle historical dates', () => { + const date = new Date(Date.UTC(1900, 0, 1)); // January 1, 1900 + const result = dateUtils.formatDateToString(date, 'MMMM D, YYYY', 'M/D/YYYY'); + expect(result).toBe('January 1, 1900'); + }); + + test('should handle future dates', () => { + const date = new Date(Date.UTC(2123, 5, 15)); // June 15, 2123 + const result = dateUtils.formatDateToString(date, 'MMMM D, YYYY', 'M/D/YYYY'); + expect(result).toBe('June 15, 2123'); + }); + }); + + // Patterns with non-token text + describe('patterns with mixed content', () => { + test('should preserve non-token text in format', () => { + const date = new Date(Date.UTC(2023, 6, 4)); // July 4, 2023 + const result = dateUtils.formatDateToString(date, 'Created on MMMM D, YYYY at noon', 'M/D/YYYY'); + expect(result).toBe('Created on July 4, 2023 at noon'); + }); + + test('should handle formats with special characters', () => { + const date = new Date(Date.UTC(2023, 8, 15)); // September 15, 2023 + const result = dateUtils.formatDateToString(date, 'YYYY.MM.DD - (DDD)', 'M/D/YYYY'); + expect(result).toBe('2023.09.15 - (Fri)'); + }); + }); + + describe('day of week calculations', () => { + test('should correctly determine weekday names', () => { + // Test all days of a week + const weekdays = [ + new Date(Date.UTC(2023, 9, 1)), // Sunday, October 1, 2023 + new Date(Date.UTC(2023, 9, 2)), // Monday, October 2, 2023 + new Date(Date.UTC(2023, 9, 3)), // Tuesday, October 3, 2023 + new Date(Date.UTC(2023, 9, 4)), // Wednesday, October 4, 2023 + new Date(Date.UTC(2023, 9, 5)), // Thursday, October 5, 2023 + new Date(Date.UTC(2023, 9, 6)), // Friday, October 6, 2023 + new Date(Date.UTC(2023, 9, 7)) // Saturday, October 7, 2023 + ]; + + const expectedNames = [ + 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' + ]; + + weekdays.forEach((date, index) => { + const result = dateUtils.formatDateToString(date, 'DDDD', 'M/D/YYYY'); + expect(result).toBe(expectedNames[index]); + }); + }); + }); + }); + + describe('addMonthsToDate', () => { + // Format: [startDate, monthsToAdd, expectedDate] + // Using strings in ISO format: 'YYYY-MM-DD' + const testCases = [ + // Basic cases + ['2024-01-15', 1, '2024-02-14'], // Regular month addition + ['2024-07-02', 1, '2024-08-01'], // Regular month addition + ['2024-04-10', 3, '2024-07-09'], // Multiple months + ['2024-03-05', 12, '2025-03-04'], // Year boundary + + // In same month + ['2024-07-01', 1, '2024-07-31'], // In same month + ['2024-06-01', 1, '2024-06-30'], // In same month + ['2024-02-01', 1, '2024-02-29'], // In same month + ['2025-02-01', 1, '2025-02-28'], // In same month + + // Month-end cases + ['2024-01-31', 1, '2024-02-29'], // To leap day + ['2024-01-30', 1, '2024-02-29'], // To leap day + ['2023-01-31', 1, '2023-02-28'], // To non-leap Feb + ['2023-01-30', 1, '2023-02-28'], // To non-leap Feb + ['2023-01-29', 1, '2023-02-28'], // To non-leap Feb + ['2024-02-29', 1, '2024-03-28'], // From leap day + ['2024-01-31', 2, '2024-03-30'], // 31 month to 31 month + ['2024-01-31', 3, '2024-04-30'], // 31 month to 30 month (January to April) + ['2024-03-31', 1, '2024-04-30'], // 31 month to 30 month (March to April) + + // Other scenarios + ['2024-12-15', 1, '2025-01-14'], // Year crossover + ['2024-07-04', 24, '2026-07-03'], // Multi-year + ['2024-08-15', 0, '2024-08-15'], // Zero months + ['2024-02-29', 12, '2025-02-28'], // Leap to non-leap year + ['2023-02-28', 12, '2024-02-27'], // Non-leap to leap year + ['2020-02-29', 48, '2024-02-28'], // Leap year to leap year + ['2021-02-28', 48, '2025-02-27'], // Non-leap year to non-leap year + ['2024-01-30', 1, '2024-02-29'] // Day preservation in leap + ]; + + testCases.forEach(([startStr, months, expectedStr]) => { + it(`should add ${months} month(s) to ${startStr} and get ${expectedStr}`, () => { + // Arrange + const startDate = new Date(startStr); + const expectedDate = new Date(expectedStr); + + // Act + const resultDate = dateUtils.addMonthsToDate(startDate, months as number); + + // Assert + expect(resultDate.getFullYear()).toBe(expectedDate.getFullYear()); + expect(resultDate.getMonth()).toBe(expectedDate.getMonth()); + expect(resultDate.getDate()).toBe(expectedDate.getDate()); + }); + }); + }); + + describe('calculateDaysInRange', () => { + // Normal cases + test('returns correct number of days for same date', () => { + const date = new Date('2023-05-15'); + expect(dateUtils.calculateDaysInRange(date, date)).toBe(1); + }); + + test('returns correct number of days for consecutive dates', () => { + const startDate = new Date('2023-05-15'); + const endDate = new Date('2023-05-16'); + expect(dateUtils.calculateDaysInRange(startDate, endDate)).toBe(2); + }); + + test('returns correct number of days for a week period', () => { + const startDate = new Date('2023-05-15'); + const endDate = new Date('2023-05-21'); + expect(dateUtils.calculateDaysInRange(startDate, endDate)).toBe(7); + }); + + test('returns correct number of days for a month period', () => { + const startDate = new Date('2023-05-01'); + const endDate = new Date('2023-05-31'); + expect(dateUtils.calculateDaysInRange(startDate, endDate)).toBe(31); + }); + + test('handles leap year correctly', () => { + const startDate = new Date('2024-02-28'); + const endDate = new Date('2024-03-01'); + expect(dateUtils.calculateDaysInRange(startDate, endDate)).toBe(3); // Feb 28, 29, Mar 1 + }); + + test('handles month boundaries correctly', () => { + const startDate = new Date('2023-05-31'); + const endDate = new Date('2023-06-02'); + expect(dateUtils.calculateDaysInRange(startDate, endDate)).toBe(3); + }); + + test('handles year boundaries correctly', () => { + const startDate = new Date('2023-12-30'); + const endDate = new Date('2024-01-02'); + expect(dateUtils.calculateDaysInRange(startDate, endDate)).toBe(4); + }); + + test('handles dates far apart', () => { + const startDate = new Date('2000-01-01'); + const endDate = new Date('2023-12-31'); + // 8766 days including both start and end dates + expect(dateUtils.calculateDaysInRange(startDate, endDate)).toBe(8766); + }); + }); +}); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..29d45d9 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "inlineSourceMap": true, + "inlineSources": true, + "module": "ESNext", + "target": "ES6", + "allowJs": true, + "noImplicitAny": true, + "moduleResolution": "node", + "importHelpers": true, + "isolatedModules": true, + "strictNullChecks": true, + "esModuleInterop": true, + "lib": [ + "DOM", + "ES5", + "ES6", + "ES7" + ] + }, + "include": [ + "**/*.ts" + ] +}